docs(deploy): name the retention cron the first mirror fires, and probe the root (FRE-1707) #10
Reference in New Issue
Block a user
Delete Branch "fren-dev/FRE-1707-deploy-docs-cron-root-probe"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Carried from the FRE-1695 review (approved at
df788cb6), findings 1 and 2. Docs and shell only — nosrc/file changes.Finding 1 — the destructive cron the operator was never told about.
vercel.jsoncarries twocrons.
/api/the-nook/lifecycle(13:00 UTC) is already on the tree Vercel builds today;/api/analytics-retention(12:00 UTC, added in1d9287a, FRE-369) exists only on Giteamaster. The first deploy that follows the mirror starts calling it, and the next 12:00 UTC runs
DELETE FROM VisitorAnalytics WHERE created_at < datetime('now','-365 days')against production —unstaged, irreversible. Intended behaviour (FRE-369 finding Q4); the gap was that § Failure modes
said nothing while the operator presses the button. The bullet names the cron, the
ANALYTICS_RETENTION_SECRET ?? CRON_SECRETbearer check, the 365-day default (and that unset,non-positive, or >730 all resolve to it), the fails-closed-without-a-secret path, and that the
first run after enabling prunes at that default.
Finding 2 —
verify-deploy.shnever probed the root domain. It checkednook.freno.me/,nook.freno.me/agents,nessa.freno.me/terms, remote SHA equality andancestry; a broken root deploy read as green, and FRE-1695's acceptance names the root. Adds a
ROOT_HOST(defaulthttps://freno.me) status check ahead of the subdomain probes: expects adirect 200, no
-L, so a redirect reads as a failure. Read-only and credential-free, asbefore. It deliberately does not probe
https://freno.me/terms—SITEMAP_ROUTES.maininsrc/lib/sitemap-routes.tshas no/terms; Terms of Use is a Nessa surface, so a root-domain/terms404 is the design.Evidence
Before (
df788cb6,bash scripts/verify-deploy.sh) — no root probe anywhere in the file:After (
91bedd9) — root is probed first; the three pre-existing FAILs are the true state(Gitea
df788cb6≠ GitHub4e412ede, the FRE-1696 mirror has not run yet), not new:Failure branches of the new check (via
ROOT_HOST, still no credentials, still read-only):bash -n scripts/verify-deploy.shclean.In-run gate (
bun test, worktree node_modules from the samebun.lockb):df788cb691bedd9bun test src/lib src/routes/nookbun test(fresh worktree, no.env)bun test --env-file=<dummy creds>password.test.tsbcrypt timing flakes; two re-runs and an isolated run of that file pass)The 16 no-
.envfailures are pre-existing on base:src/env/server.tsvalidation throws in aworktree with no
.env, plus two Lineage landing tests that readVITE_DOMAIN. Nothing heretouches
src/, soNODE_ENV=production bun run buildwas not required by the gate and was notrun. CI is not a gate (FRE-390).
Merge Danger
Door: two-way — revert the commit and the doc line and the extra probe both disappear.
Blast radius: one markdown doc and one read-only operator script. No runtime, route, schema,
or data path changes; the script's exit semantics are unchanged apart from the added check.
Worth reading before merge even if you skip the diff: the new Failure modes bullet. It documents
a production data deletion that the next mirrored deploy will perform on its own schedule.
Approved — Security Engineer review, FRE-1707. This echoes my FRE-1707 approval of 2026-11-10T03:29:06Z into Gitea; it is the same verdict recorded there, not a new review. Verdict binds head
91bedd915d(docs/deploy-source.md, scripts/verify-deploy.sh, +50/−5, no src/ files). No findings blocking merge. Merging stays with the repo owner/CTO per landing policy — this approval does not order a merge.