Awards exceed the 10,000,000 cap once campaign and streak multipliers apply
Award grants (showcase approval, admin award points) skip campaign/streak multipliers
Disable the inbox notification email ("You have received a notification in Swamp Club")
Add LinkedIn as a login provider
Showcase reward backfill can double-pay 5,000,000 points when replicas start together
Showcase editor: caption counter is not announced to screen readers
Profile showcase read: approved list sorts on review.reviewedAt in memory
Showcase countByStatus: $match live statuses before the $group
Showcase admin queues: index-serve the updatedAt sort on approved/rejected
Block temporary email services on signup
auth login leaves auth.json apiKey empty and stores the key only in ~/.config/swamp/api-key, which the auth gate never reads
swamp-club.com serves every response uncompressed
CLI companion to #3396: private-source collectives can score repository-verified 14/14 in extension quality
Replayable state fragments: Git-reviewable desired state for resources changed by model methods
Use whoami entitlement to explain private-extension push refusals
Top-level swamp init never earns repo-init quest or tier credit
Docs: telemetry reference — the envelope we send and our redaction policy
Telemetry opt-out scope: one user-level setting that disables telemetry everywhere
Telemetry: mark paths where errors are built so redaction needs no guessing
Combat log: batch the extension visibility lookup into one query
CLI telemetry redaction: user values still transmitted (errorMessage, workflowContext, init path, history args, private types) while command words are over-redacted
Maximum call stack size exceeded once a resource passes ~129k versions (Math.max(...versions) in the data repository)
worker connect --ca-cert is not applied to the data plane; dispatches fail with 'fetch failed' unless DENO_CERT is set
Ephemeral worker fleets accumulate worker records and token bindings that are never reaped
Expired enrollment token cannot be re-minted unless a worker was connected when it expired
Billing telemetry: surface scheduled cancellations (cancelAtPeriodEnd) and emit subscription_canceled reliably
access token mint: support --server so worker server tokens can be minted remotely
Workload identity (Kubernetes ServiceAccount / OIDC) for worker enrollment
Feed grant projection stamps a site route that does not exist
Retire or rebuild /admin/nurture once the epic lands — it is a gate, and gates are single-use
feat(nurture): /admin/nurture — who would get what, and why
feat(nurture): the nurture_send ledger and the dry-run projector, with the cold-start seal
feat(nurture): batch cohort reads — account-grain identification that carries its evidence
feat(nurture): the flow catalog and the qualification contract (pure domain)
harness-marketing-funnel posts {batch:[...]} to /ingest, which is not a batch — every run silently measures zero
feat(cli): swamp inbox — read swamp-club notifications without leaving the terminal
feat(cli): tell operatives they have swamp-club notifications waiting
feat(api): a cheap unread-notification count for API-key clients
feat(nurture): deliver to the swamp-club inbox on the same dedupe decision as email
feat(nurture): arm needs-help-after-a-failed-run (NEEDS HELP)
feat(nurture): arm model-usage-without-workflows (BUILDING PRODUCT FEATURES)
feat(nurture): arm no-activation-after-30-days (ARRIVED, NEVER RAN)
feat(nurture): arm reactivation-after-7-days (DRIFTED)
feat(nurture): arm the first flow — extension published, email only, verified in prod
feat(nurture): the six nurture email templates, previewed before anything sends
feat(nurture): an outbound transport that reports its outcome, and per-channel send status
feat(nurture): suppression — opt-out, address-grain frequency caps, one-click unsubscribe
Epic: Product nurture — lifecycle identification, dedupe-safe delivery, and operator control (email, inbox, CLI)
SSO: SAML assertion attributes are never logged or persisted — cannot tell whether the IdP sent groups
IdP group memberships go stale indefinitely — user.idpGroups is only written by the SSO login hook
Extension version binaries never persisted — binaries security notice has never rendered
Genesis "New Blood" (recruit_first) only counts collective invites — a platform invite can never complete it
SCIM 2.0 provisioning endpoint for swamp-club (Users + Groups, deprovision)
SSO user profile fields are frozen at first login — overrideUserInfo is never set on any provider
@swamp/s3-datastore disables IMDS on plain EC2, so an attached instance profile cannot resolve
AWS credential handling is duplicated across five implementations — the #803 preflight and the #226/#228 SSO hints reached only one of them
A subscription stuck in incomplete has no path forward: it grants nothing, and the billing page offers no way to finish paying
Identifier lookups are exact-match and case-sensitive across username, email and slug
Invite failures emit no telemetry, so a rejected invitation leaves no trace anywhere
Collective invitations expire after 48h and the auto-claim is gated on that window, so a late signup is never bound
Invite typeahead searches username prefix only, so an operative cannot be found by name or email
Send the release headline from the release pipeline so New Release announcements say what shipped
Epic: /leaderboard and /u/{username} do not survive 10B events — measured audit + phased plan
Reconcile collective-token CLI activity to members (attribute → bonus → stamp → even-split)
deps-audit skips deno-runner and agent-runner lockfiles in ci.yml
Sync every signup to Attio, and backfill the existing population (#809 follow-up)
@swamp/issue-lifecycle probes /api/health, which swamp-club stopped serving when the Fresh scaffold stubs were removed
Lab lifecycle POST rejects any payload string that starts with a dollar sign, not just operator keys
Push down the two cheap leaderboard scans: ghost-gate dictionary and eventCounts owner filter
$identify events are never consumed — anonymous web history never binds to the account
Finish the swamp_* attribute set on Attio users, and settle the two unprefixed ones (#809 follow-up)
aria-expanded is a raw boolean in 12 places — collapsed state is unannounced to screen readers
One standing read: every scalar score consumer reads board_totals, not the ledger
Profile Edit trigger is a fire-and-forget island: no aria-expanded, and a silent no-op if the editor island does not hydrate
Profile XP bar jumps ~25px on fill, and pays the full cumulative walk for two numbers board_totals already holds
Incremental activity projector + swamp.events username bloom index (spun off #925, stages 5+7)
Telemetry stats consumer: insert_id dedup commits before the write it guards — any upsert failure is silently swallowed on retry
score-rollup projector runs N× per cadence — the run gate is per-replica memory, not shared state
Leaderboard board windows re-anchor on wall-clock while the rest of the view is frozen at asOf
swamp CLI: surface the audience and resolvedInVersion fields swamp-club now serves
ApiKeyManager's collapsed trigger points aria-controls at an element it never renders
A boolean aria-expanded renders as no aria-expanded: two disclosure widgets report no state to a screen reader
Ripple redaction rewrites HTTP status-code runs as phone numbers, silently corrupting evidence
Profile score section blocks the render on a ClickHouse read
Collective invite emailed-link return path is dropped: /accept-invite sends ?returnUrl= but /login reads ?redirect=
Tell the inviter when a collective invite mis-lands, instead of leaving it pending forever
Ghost profile bypasses the score-read seam and 500s on a slow ledger
A ledger read failure still renders as 'no activity': loadProfileScore swallows to an empty standing behind HTTP 200
Model lookup misreports EMFILE (too many open files) as a broken definition file and dumps a raw stacktrace
serve telemetry identity warnings are diagnostic but not actionable — say how to fix them
swamp quest: drop the heartbeat field the server no longer sends
Daemon telemetry flush: stop() can skip its final flush when a timer drain is already in flight
Guard the projector's full rewrites against the fail-open lease (ADV-6 from #1575/#1576)
Projector write amplification: board_totals/owner_devices full rewrites are owners × runs/day
Profile candidateIds prune costs a full ledger scan to build itself — 42.88M rows for one keyed read
Leaderboard phase 3: owner-grain board_totals so a cache miss is survivable at 10B
swamp serve is telemetry-dark: scheduled workflow runs never reach /ingest, and the daemon never flushes
CLI has never sent insert_id: retried telemetry batches are double-counted into cli_daily, inflating XP in an append-only ledger
Catalog backfill reconciles against the local cache, not the datastore
dailyHistory range pushdown — deferred from #1576, and the measurement says why
Docs: manual never mentions telemetry, and the serve/scheduling pages imply automated runs are visible when they are not
Leaderboard phase 2: take score_grants off the board read path — read today from score_daily
Profile day drill-down returns 0 entries at the 5s ClickHouse ceiling for every operative
reconcile_from_disk_bench.ts fails deno check (stale DenoRuntime stub)
Leaderboard phase 1: cache the board read and bust it on tier crossings (no schema change)
Catalog backfill deletes rows for any model whose data names are numeric
Docs: document catalog completeness check and --repair in doctor reference
Leaderboard phase 5: score-rollup-projector write cost at 10B — ~430M rows scanned per 60s tick
swamp auth whoami should report paid tier and trial status
Split the score-read circuit breaker so leaderboard pressure can't blank profile scores
oauth_sign_in telemetry records provider as the literal ":id" for every event
Council: set the scoring balance — command tiers, farm-decay parameters, cross-category ratio
Scoring coverage gaps: instrument drop-off, score ripples/mentions, reward invite-converts
Materialize an active-days-by-id table for the streak board
score-rollup-projector: O(all-time ledger) closure + per-pod fan-out saturates prod ClickHouse CPU
swamp auth server-login ignores SWAMP_SERVE_URL
serve oauth: an unrecognized device-token error kills the whole serve process instead of the bootstrap
CLI reports 'HTTP/2 not supported by this client' when the server actually returned 401 — masks auth failures as a transport error
serve oauth: startDeviceGrant discards the OAuth error field, making device-code failures undiagnosable
serve oauth bootstrap: device flow rate-limited to a 45-second window by validateClient counter, shared globally across tenants
CLI: swamp invite <email> to drive the platform-invite API
Hide enterprise (SSO) operatives from announcements and leaderboard by default
Expose the swamp.club feed as an RSS feed
Docs: manual should state workflow unknown keys are rejected and placement is step-only (follow-up to #1240)
ExtensionInfo.latestVersion typed 'string' but registry returns null; harden pull/resolve for prerelease-only extensions
Profile stats: per-user daily rollup table + MV in ClickHouse
CLI telemetry: fold third-level verbs into subcommand + canonicalize aliases
Docs: swamp skill repo-structure reference still documents repo-local .swamp/telemetry/ as live
Docs: document user-global telemetry (telemetry.yaml opt-out, spool location, telemetry stats behavior)
score_daily rollup strands stale grains when a day-less grant re-stamps onto a later day
swamp-club: global rate limiter runs pre-auth and collapses all direct clients into one per-IP bucket — 429s authenticated CLI traffic
feed_post_score_events queue grows unboundedly (no TTL, no delete-on-delivery)
@-mention autocomplete for users when writing lab ripples
Remove comments from /feed and redesign the page
Score-refresh consumer: harden coalescing against a diverse backlog (bistability)
Remove feed comments — consolidate discussion in Discord
Relax the profanity filter
Extension search returns edit-distance noise for short queries ("asdl" → "AWS DEADLINE")
Telemetry recoverOrphaned startup race with multiple replicas (created_at-based)
Telemetry retry/failed path has the same non-atomic claim as #820
Dead code: CollectivesSection island (pending-invite prompt) is never mounted; listPendingInvitationsByEmail has no production consumer
Telemetry silently dropped outside a swamp repo — lost events + undercounted scores
serve: create*Deps() factories leak file-based catalog stores (3 FDs) per API request
flaky test: manual_approval suspension test leaks 3 timers (OTel InMemorySpanExporter setTimeout)
flaky test: serve OAuth client tests leak unconsumed fetch response bodies (+ connection_test readDir leak)
serve leaks file descriptors (EMFILE) — runFileSink.unregister runs after yield, not in finally
swamp-club: /api/whoami 500s on fresh install — ensureIndexes {id:1} conflicts with migration 012 id_lookup index
data prune --json omits reclaimedModels[].modelName when a report entry is grouped first
One-time prod data checks: github:-authored lab issues blast radius + legacy uppercase extension names
Serve leaderboard locate ('find yourself') live, retiring its per-replica standings cache
Serve leaderboard live from the score_daily rollup — retire per-pod snapshot & campaign-blind board fallback
Relationships
↔ sibling #2817#1235 CLI telemetry: fold third-level verbs into subcommand + canonicalize aliases
Opened by keeb · 7/18/2026
Problem
The scoring retier (step 2 of the command-tier work) is limited by what the CLI sends. Two gaps, both go-forward:
Third-level verbs are invisible.
extractCommandInforecords only two tokens —command+subcommand— and puts the third verb into the redactedargsarray, which never reaches the server's day rollup. Soworkflow runandworkflow run searcharrive as identical events, andmodel method run/describe/historyare indistinguishable. Tier values can only key on the 2-token pair, so reads/polling under a group inherit the tier of the work command (e.g. run-status polling scores like running a workflow).Aliases key as typed. Telemetry records the raw argv token, so
vault write-secretandvault putarrive as different subcommands and score differently unless every alias spelling gets its own tier entry.
Proposed solution
In extractCommandInfo (src/cli/telemetry_integration.ts):
- For known group commands (
model method,model output,model type,workflow run,workflow history,workflow schema,vault type,datastore type/namespace/catalog/lock/setup,extension trust/source,access token/grant/group,worker token/daemon,serve daemon,report type), fold the third token intosubcommand(space-joined, e.g.subcommand: "run search"). - Canonicalize alias tokens to the resolved command name before recording (
write-secret→put,status→whoami,comment→ripple,ls/remove→list/rm,summarize→summarise, hiddenlistaliases →search).
Go-forward only — no recovery. Old binaries keep emitting the 2-token/typed shape indefinitely and continue to score via the 2-token tier fallback; new binaries emit the compound/canonical shape and get the finer tiers. Both shapes coexist; no backfill, no restamping, nothing reprocessed. Server-side this is purely additive: new (command, subcommand) grains in cli_daily, new tier entries in the projector CTE.
Alternatives considered
- Server-side mapping: impossible — the distinction never arrives (third token is redacted client-side).
- Alias tier entries only: works for aliases (and is the interim mitigation) but does nothing for third-level verbs.
Open
No activity in this phase yet.