Problem
station_signup_attempt grows without bound. Rows are retained 30 days for audit (they answer "who revealed the code?" and "what did the attack look like?"), then need deleting.
Desired end state
A jobs/station-signup-attempt-prune workspace deleting attempt rows older than 30 days, consuming pruneSignupAttempts from the lifecycle module.
This is not one file. jobs/* is an npm workspace (package.json:67-71). The nearest shape, jobs/flowsheet-ghost-row-sweep/, carries job.ts, package.json, tsconfig.json, tsup.config.ts, and a README, plus a root Dockerfile.flowsheet-ghost-row-sweep and deploy/cron wiring. Follow it.
Cron registration
Register in docs/ops-cron-scheduling.md under "Excluded / DB-only (verified — don't try to 'space' these)" (line 46), beside metadata-no-match-digest — not in the slot table. That table exists to space LML-hitting crons, and a pure-Postgres prune is not a scheduling constraint.
Acceptance criteria
Context
Plan: ~/Downloads/wxyc-station-passcode-signup-plan.md.
Related
Blocked by the lifecycle module. Split from the review job because the failure consequences differ: a failed prune means a larger table, a failed review means a silent queue and a security gap, and those want separate alerting.
Blocked by
Problem
station_signup_attemptgrows without bound. Rows are retained 30 days for audit (they answer "who revealed the code?" and "what did the attack look like?"), then need deleting.Desired end state
A
jobs/station-signup-attempt-pruneworkspace deleting attempt rows older than 30 days, consumingpruneSignupAttemptsfrom the lifecycle module.This is not one file.
jobs/*is an npm workspace (package.json:67-71). The nearest shape,jobs/flowsheet-ghost-row-sweep/, carriesjob.ts,package.json,tsconfig.json,tsup.config.ts, and a README, plus a rootDockerfile.flowsheet-ghost-row-sweepand deploy/cron wiring. Follow it.Cron registration
Register in
docs/ops-cron-scheduling.mdunder "Excluded / DB-only (verified — don't try to 'space' these)" (line 46), besidemetadata-no-match-digest— not in the slot table. That table exists to space LML-hitting crons, and a pure-Postgres prune is not a scheduling constraint.Acceptance criteria
jobs/*footprintdocs/ops-cron-scheduling.mdContext
Plan:
~/Downloads/wxyc-station-passcode-signup-plan.md.Related
Blocked by the lifecycle module. Split from the review job because the failure consequences differ: a failed prune means a larger table, a failed review means a silent queue and a security gap, and those want separate alerting.
Blocked by