#2077
Block temporary email services on signup
#2027
Retire or rebuild /admin/nurture once the epic lands — it is a gate, and gates are single-use
#2012
feat(nurture): /admin/nurture — who would get what, and why
#2011
feat(nurture): the nurture_send ledger and the dry-run projector, with the cold-start seal
#2010
feat(nurture): batch cohort reads — account-grain identification that carries its evidence
#2009
feat(nurture): the flow catalog and the qualification contract (pure domain)
#2025
harness-marketing-funnel posts {batch:[...]} to /ingest, which is not a batch — every run silently measures zero
#2024
feat(cli): swamp inbox — read swamp-club notifications without leaving the terminal
#2023
feat(cli): tell operatives they have swamp-club notifications waiting
#2022
feat(api): a cheap unread-notification count for API-key clients
#2021
feat(nurture): deliver to the swamp-club inbox on the same dedupe decision as email
#2020
feat(nurture): arm needs-help-after-a-failed-run (NEEDS HELP)
#2019
feat(nurture): arm model-usage-without-workflows (BUILDING PRODUCT FEATURES)
#2018
feat(nurture): arm no-activation-after-30-days (ARRIVED, NEVER RAN)
#2017
feat(nurture): arm reactivation-after-7-days (DRIFTED)
#2016
feat(nurture): arm the first flow — extension published, email only, verified in prod
#2015
feat(nurture): the six nurture email templates, previewed before anything sends
#2014
feat(nurture): an outbound transport that reports its outcome, and per-channel send status
#2013
feat(nurture): suppression — opt-out, address-grain frequency caps, one-click unsubscribe
#2008
Epic: Product nurture — lifecycle identification, dedupe-safe delivery, and operator control (email, inbox, CLI)
#2001
SSO: SAML assertion attributes are never logged or persisted — cannot tell whether the IdP sent groups
#1819
IdP group memberships go stale indefinitely — user.idpGroups is only written by the SSO login hook
#1961
Extension version binaries never persisted — binaries security notice has never rendered
#1884
Genesis "New Blood" (recruit_first) only counts collective invites — a platform invite can never complete it
#1821
SCIM 2.0 provisioning endpoint for swamp-club (Users + Groups, deprovision)
#1820
SSO user profile fields are frozen at first login — overrideUserInfo is never set on any provider
#1805
@swamp/s3-datastore disables IMDS on plain EC2, so an attached instance profile cannot resolve
#1804
AWS credential handling is duplicated across five implementations — the #803 preflight and the #226/#228 SSO hints reached only one of them
#1813
A subscription stuck in incomplete has no path forward: it grants nothing, and the billing page offers no way to finish paying
#1812
Identifier lookups are exact-match and case-sensitive across username, email and slug
#1811
Invite failures emit no telemetry, so a rejected invitation leaves no trace anywhere
#1810
Collective invitations expire after 48h and the auto-claim is gated on that window, so a late signup is never bound
#1809
Invite typeahead searches username prefix only, so an operative cannot be found by name or email
#1806
Send the release headline from the release pipeline so New Release announcements say what shipped
#1572
Epic: /leaderboard and /u/{username} do not survive 10B events — measured audit + phased plan
#1255
Reconcile collective-token CLI activity to members (attribute → bonus → stamp → even-split)
#1800
deps-audit skips deno-runner and agent-runner lockfiles in ci.yml
#1665
Sync every signup to Attio, and backfill the existing population (#809 follow-up)
#1669
@swamp/issue-lifecycle probes /api/health, which swamp-club stopped serving when the Fresh scaffold stubs were removed
#1668
Lab lifecycle POST rejects any payload string that starts with a dollar sign, not just operator keys
#1497
Push down the two cheap leaderboard scans: ghost-gate dictionary and eventCounts owner filter
#967
$identify events are never consumed — anonymous web history never binds to the account
#1667
Finish the swamp_* attribute set on Attio users, and settle the two unprefixed ones (#809 follow-up)
#1666
aria-expanded is a raw boolean in 12 places — collapsed state is unannounced to screen readers
#1658
One standing read: every scalar score consumer reads board_totals, not the ledger
#1657
Profile Edit trigger is a fire-and-forget island: no aria-expanded, and a silent no-op if the editor island does not hydrate
#1654
Profile XP bar jumps ~25px on fill, and pays the full cumulative walk for two numbers board_totals already holds
#929
Incremental activity projector + swamp.events username bloom index (spun off #925, stages 5+7)
#1254
Telemetry stats consumer: insert_id dedup commits before the write it guards — any upsert failure is silently swallowed on retry
#1598
score-rollup projector runs N× per cadence — the run gate is per-replica memory, not shared state
#1579
Leaderboard board windows re-anchor on wall-clock while the rest of the view is frozen at asOf
#1663
swamp CLI: surface the audience and resolvedInVersion fields swamp-club now serves
#1662
ApiKeyManager's collapsed trigger points aria-controls at an element it never renders
#1661
A boolean aria-expanded renders as no aria-expanded: two disclosure widgets report no state to a screen reader
#1651
Ripple redaction rewrites HTTP status-code runs as phone numbers, silently corrupting evidence
#1503
Profile score section blocks the render on a ClickHouse read
#1204
Collective invite emailed-link return path is dropped: /accept-invite sends ?returnUrl= but /login reads ?redirect=
#1653
Tell the inviter when a collective invite mis-lands, instead of leaving it pending forever
#1504
Ghost profile bypasses the score-read seam and 500s on a slow ledger
#1589
A ledger read failure still renders as 'no activity': loadProfileScore swallows to an empty standing behind HTTP 200
#1620
Model lookup misreports EMFILE (too many open files) as a broken definition file and dumps a raw stacktrace
#1605
serve telemetry identity warnings are diagnostic but not actionable — say how to fix them
#1588
swamp quest: drop the heartbeat field the server no longer sends
#1604
Daemon telemetry flush: stop() can skip its final flush when a timer drain is already in flight
#1607
Guard the projector's full rewrites against the fail-open lease (ADV-6 from #1575/#1576)
#1606
Projector write amplification: board_totals/owner_devices full rewrites are owners × runs/day
#1576
Profile candidateIds prune costs a full ledger scan to build itself — 42.88M rows for one keyed read
#1575
Leaderboard phase 3: owner-grain board_totals so a cache miss is survivable at 10B
#1591
swamp serve is telemetry-dark: scheduled workflow runs never reach /ingest, and the daemon never flushes
#1603
CLI has never sent insert_id: retried telemetry batches are double-counted into cli_daily, inflating XP in an append-only ledger
#1581
Catalog backfill reconciles against the local cache, not the datastore
#1599
dailyHistory range pushdown — deferred from #1576, and the measurement says why
#1597
Docs: manual never mentions telemetry, and the serve/scheduling pages imply automated runs are visible when they are not
#1574
Leaderboard phase 2: take score_grants off the board read path — read today from score_daily
#1586
Profile day drill-down returns 0 entries at the 5s ClickHouse ceiling for every operative
#1582
reconcile_from_disk_bench.ts fails deno check (stale DenoRuntime stub)
#1573
Leaderboard phase 1: cache the board read and bust it on tier crossings (no schema change)
#1580
Catalog backfill deletes rows for any model whose data names are numeric
#1583
Docs: document catalog completeness check and --repair in doctor reference
#1577
Leaderboard phase 5: score-rollup-projector write cost at 10B — ~430M rows scanned per 60s tick
#1544
swamp auth whoami should report paid tier and trial status
#1545
Use whoami entitlement to explain private-extension push refusals
#1496
Split the score-read circuit breaker so leaderboard pressure can't blank profile scores
#1475
oauth_sign_in telemetry records provider as the literal ":id" for every event
#881
Council: set the scoring balance — command tiers, farm-decay parameters, cross-category ratio
#880
Scoring coverage gaps: instrument drop-off, score ripples/mentions, reward invite-converts
#1495
Materialize an active-days-by-id table for the streak board
#1494
score-rollup-projector: O(all-time ledger) closure + per-pod fan-out saturates prod ClickHouse CPU
#1486
swamp auth server-login ignores SWAMP_SERVE_URL
#1478
serve oauth: an unrecognized device-token error kills the whole serve process instead of the bootstrap
#1482
CLI reports 'HTTP/2 not supported by this client' when the server actually returned 401 — masks auth failures as a transport error
#1477
serve oauth: startDeviceGrant discards the OAuth error field, making device-code failures undiagnosable
#1476
serve oauth bootstrap: device flow rate-limited to a 45-second window by validateClient counter, shared globally across tenants
#1376
CLI: swamp invite <email> to drive the platform-invite API
#1337
Hide enterprise (SSO) operatives from announcements and leaderboard by default
#1294
Expose the swamp.club feed as an RSS feed
#1246
Docs: manual should state workflow unknown keys are rejected and placement is step-only (follow-up to #1240)
#1276
ExtensionInfo.latestVersion typed 'string' but registry returns null; harden pull/resolve for prerelease-only extensions
#1256
Profile stats: per-user daily rollup table + MV in ClickHouse
#1235
CLI telemetry: fold third-level verbs into subcommand + canonicalize aliases
#1229
Docs: swamp skill repo-structure reference still documents repo-local .swamp/telemetry/ as live
#1129
Docs: document user-global telemetry (telemetry.yaml opt-out, spool location, telemetry stats behavior)
#1082
score_daily rollup strands stale grains when a day-less grant re-stamps onto a later day
#1093
swamp-club: global rate limiter runs pre-auth and collapses all direct clients into one per-IP bucket — 429s authenticated CLI traffic
#958
feed_post_score_events queue grows unboundedly (no TTL, no delete-on-delivery)
#954
@-mention autocomplete for users when writing lab ripples
#959
Remove comments from /feed and redesign the page
#875
Score-refresh consumer: harden coalescing against a diverse backlog (bistability)
#844
Remove feed comments — consolidate discussion in Discord
#956
Relax the profanity filter
#736
Extension search returns edit-distance noise for short queries ("asdl" → "AWS DEADLINE")
#828
Telemetry recoverOrphaned startup race with multiple replicas (created_at-based)
#827
Telemetry retry/failed path has the same non-atomic claim as #820
#1205
Dead code: CollectivesSection island (pending-invite prompt) is never mounted; listPendingInvitationsByEmail has no production consumer
#1125
Telemetry silently dropped outside a swamp repo — lost events + undercounted scores
#1120
serve: create*Deps() factories leak file-based catalog stores (3 FDs) per API request
#1121
flaky test: manual_approval suspension test leaks 3 timers (OTel InMemorySpanExporter setTimeout)
#1123
flaky test: serve OAuth client tests leak unconsumed fetch response bodies (+ connection_test readDir leak)
#1118
serve leaks file descriptors (EMFILE) — runFileSink.unregister runs after yield, not in finally
#1092
swamp-club: /api/whoami 500s on fresh install — ensureIndexes {id:1} conflicts with migration 012 id_lookup index
#1091
data prune --json omits reclaimedModels[].modelName when a report entry is grouped first
#1083
One-time prod data checks: github:-authored lab issues blast radius + legacy uppercase extension names
#1058
Serve leaderboard locate ('find yourself') live, retiring its per-replica standings cache
#1055
Serve leaderboard live from the score_daily rollup — retire per-pod snapshot & campaign-blind board fallback
#1012
Docs: document swamp data prune (orphaned-data reclamation)
#1011
UAT: CLI coverage for swamp data prune (orphaned-data reclamation)
#978
Leaderboard search excludes ghosts — a visible ghost can't be found by its alias
#973
issue-lifecycle: plan lifecycle entry silently dropped when summary exceeds 1000 chars
#957
Make paid subscribers visually stand out (badge, profile popup summary)
#955
Giphy integration via /giphy command
#950
/lab shipped list is sorted by issue number, not ship date
#924
Collscan/index-gap pack: unindexed $or id branches (every registry request), computed-field sort kills extension browse indexes, $expr blocks pull counts, apikey.userId, workflow_runs, 1100-doc profile fetch
#926
Request-path external fetches with no timeout / no negative cache: profile GitHub/Discord resolution and landing-page total count (30s → 504 mechanism)
#921
Auth hot path: 7 serial Atlas round trips per API-key request; session cookie cache dies after 5 min; session/apikey lookups unindexed
#923
Leaderboard: window boards are unindexed full-collection aggregations ×4 per locate miss; locate fetches 4×10k rows to rank one user; search() has O(sum-of-ranks) lookup fan-out
#922
/lab loads every issue with full markdown bodies on every request (incl. detail pages) + ~12 serial DB waves — the 3.4s avg / 30s tail
#927
Activity projector runs on both telemetry replicas — same-day chunks can double-grant (grant_id collides but granted_at differs, ReplacingMergeTree never dedups)
#872
Activity heatmap clips the current UTC day — uses local browser time for "today" but snapshots are UTC-keyed
#854
Epic #847 · Unit 2: score_grants append-only ledger write-model in Mongo (shadow, no read flip)
#862
feat(clickhouse): tracked archive→CH backfill tooling (backfill.sql)
#861
feat(clickhouse): idempotent DDL migration path for running prod (#859 deliverable 2)
#860
chore(clickhouse): retire S3-backed v1 + s3 objects after #859 cutover
#859
Decouple prod ClickHouse from S3 (drop storage_policy=s3_main) + add a DDL migration path
#853
Epic #847 · Unit 1: Land the ClickHouse projection foundation (schema + init SQL + compose service)
#850
Extension publish score is non-monotonic: yanking versions lowers a user's score
#849
Live Swamp Club event console on /feed — scrolling stream of all non-sensitive events
#820
Telemetry watcher has no replica coordination: N replicas double-process the same batch (non-atomic find→updateMany claim)
#819
Telemetry drain still capped ~80-100/s in prod: per-username full-history re-aggregate is O(users) sequential per batch (deferred #817 fix #4)
#817
Telemetry ingest is consumer-bound: counter & stats dedup via O(N) sequential insertOne, throughput stuck ~20 events/s regardless of BATCH_SIZE
#804
Batch step 2 of enrichAuthorPlans (per-collective subscription reads)
#802
Add SWAMP CLUB wordmark logo next to sc-mark.png in TRADEMARKS.md
#719
Docs: document trigger.inputs for scheduled/webhook workflows in the manual
#729
serve --webhook usage string makes <header> look optional for generic scheme
#789
Leaderboard window baseline: 90-day cutoff zeroes returning-dormant users (latent, 0 impact today)
#737
Yank semantics inconsistent: all-versions-yanked acts as a free hidden/private extension; extension-level yank hard-blocks re-push
#728
serve: webhook scheme not surfaced in startup event, health endpoint, or log line
#726
Slack webhook pre-body gate only checks signature header, not timestamp
#725
Dead code: verifySignature in webhook.ts superseded by verifier abstraction
#723
Data-driven webhook signature verifiers (avoid a code change + release per provider)
#709
Replace third-party trademark symbol with Swamp Club (SC) mark in TRADEMARKS.md
#650
datastore setup migration relocates and deletes repo-root .swamp/secrets, breaking all local_encryption vault.get
#649
Registry content-type search filter can match versions absent from the displayed extension
#648
Docs: document reports.require failure semantics in the manual (unresolvable required report fails the run)
#645
Resource-leak test failures on main: extension_rubric_scorer_test and worker_gateway_test
#635
Tier-up announcements never fire for direct score contributions (badge awards, feed credits)
#507
Feed-post scoring is a direct domain write, not a consumer of feed_post_approved telemetry
#492
reindexByUsername re-strands pre-association history and wipes sign_in_dates
#573
extension search returns null repository fields that extension info populates
#509
Docs: TLS behind inspecting proxies / private CAs (system trust store, DENO_CERT, SSL_CERT_FILE)
#501
username_metrics projection backfill does not trigger re-scoring (stale UserScore for dormant users)
#491
Telemetry never retroactively credits a device's pre-association history
#448
Telemetry admin reindex endpoint is gated on a defunct @systeminit.com email domain — permanently 403
#445
extension update/pull deadlocks when the repo's datastore is the extension being updated
#447
CLI telemetry forwards non-personally-resolvable identity for collective auth; distinct_id is per-machine, not per-repo
#446
Telemetry ingest only resolves personal API keys — collective-token events are unattributed, identity_map under-claims
#430
--json output is polluted by non-JSON content, breaking machine parsing
#424
swamp serve: extension bundle failure at startup is silently pinned, breaking scheduled workflows with permanent 'Unknown model type'
#413
Harness detection invents env vars for kiro/opencode/codex
#393
Extension METHODS table truncates Method column; short names like apply/check wrap mid-word on /extensions/@swamp/ssh
#392
swamp extension rm leaves empty <kind>-bundles/<hash>/ dirs behind
#383
`swamp extension rm` leaves empty scaffold dirs behind
#384
identity_map row not updated when user renames
#362
Unified login input that detects email vs username by presence of '@'
#361
Introduce `swampd`: long-running local daemon for shared cache, secrets, and extensions
#338
Step key parsing in execution_service uses naive split(":") and silently truncates colon-containing step names
#337
Workflow-scope report artifacts unreachable via `swamp data get --workflow`
#312
telemetry: emit child entries for follow-up action method invocations
#301
Per-method telemetry events for workflow runs
#293
Award leaderboard points for referrals and collective invites
#292
Add agent harness detection and AiTool to telemetry
#280
Missing unique indexes on user.email and user.username allow duplicate users
#282
Local extension edits don't reliably trigger rebundle
#278
discord-bot double-sends sign_up notifications
#277
Discord bot sends duplicate signup notifications
#232
Extend DatastoreSyncService.markDirty() with optional relPath argument
#215
Adversarial UAT test: missing cached bundle with intact catalog should self-recover
#214
Port importBundleByPath ENOENT fallback to datastore/driver/vault/report loaders
#192
swamp-club extension card no longer exposes @ns/slug as contiguous text
#170
Docs: repository-configuration.md missing defaultDriver / defaultDriverConfig
#178
Better Auth rejects requests on hostnames not in hardcoded trustedOrigins (signup/signin broken on non-canonical hosts)
#96
Persist lab filter selection in localStorage
#169
Server-side parse query params on /lab/all so refresh preserves multi-filter URLs
#165
cleanup for repoDriver
#159
Add repo-level `defaultDriver` to `.swamp.yaml`
#143
First-class jsr: specifier support in extension bundler
#97
Inline editing: click-to-edit fields instead of pencil icons
#142
Cross-extension code sharing via manifest exports field
#122
Footer floats when page content is shorter than viewport
#110
Remove traffic lights in column 2 of /lab
#101
Flow modal: text rendering issues
#106
Bog flow: text rendering and layout issues
#109
Multi-select combo filtering on /lab
#112
Filter lab issues by author (opened by user)
#113
Usernames aren't linked to their profile pages
#114
Collapsible left rail and repositionable right rail in Lab
#115
'Assigned to me' overlaps 'Privacy policy' on short viewports
#84
Consolidate MethodReportContext construction — manual and workflow report paths build contexts divergently
#108
data gc skips version-count GC when no lifetime-expired data exists
#98
Description 'Show more' button appears even when text fits
#99
Normalize text sizing across issue list and detail views
#107
Content filter should identify the flagged word or phrase
#90
Audit: modelRegistry.get() without ensureTypeLoaded() in YAML repository save() paths
#91
Vault CEL expressions replaced with VaultSecretBag sentinels after model type upgrade
#86
issue-lifecycle models should support --assignee for swamp.club issues
#89
Cross-model expression validator fails on lazy-loaded types — modelRegistry.get() bypasses ensureTypeLoaded
#35
Consolidate method execution paths — workflow steps and manual runs build MethodContext divergently
#33