Skip to content

ci(vercel): prune stale Preview deployments after PR closure #627

Open

Description

@qnbs

CURRENT RETENTION CHECKPOINT — 2026-10-06 — DEPENDENCY-TRAIN FINAL RETENTION TERMINAL

FINAL_MAIN = bf745090f7e980e167b1bbf01c7f6dea51fb451f
FINAL_MAIN_CI_CD = 37434052556 / SUCCESS
FINAL_MAIN_CODEQL = 37434052501 / SUCCESS
PRODUCTION = dpl_75HQcQhuYP6CxX43EjMov8Sjosdb / READY / exact FINAL_MAIN / canonical HTTP 200
ROLLBACK = dpl_7XTy9jGDikUauvgT8oPQUtq7YAmq / READY
DELETED_DEPLOYMENTS = 11
ALREADY_ABSENT = 2
ORPHAN_ALIASES_REMOVED = 79
FINAL_DEPLOYMENTS = 4
FINAL_ALIASES = 3 / exactly the protected Production/Main hosts
UNKNOWN = 0
OPEN_PULL_REQUESTS = 0
TRAIN_FINAL_RETENTION_COMPLETE = YES
RETENTION = TERMINAL

The two older retained target=production / PROMOTED deployments remain protected by current policy; changing that policy is a separate decision. This issue stays open as the standing retention-policy/automation owner. Routine cleanup is terminal for the current dependency train and no longer blocks R-15 read-only R4 admission.


HISTORICAL / SUPERSEDED RETENTION CHECKPOINT — 2026-10-04 — #957 CLEANUP WITH #958 OPEN-PR PROTECTION

CURRENT_MAIN = 8f1400c4bb6a84be8da940584b86b00233df1d4b
RESULTING_MAIN_CI_CD / CODEQL = SUCCESS
#957_RETENTION_COMPLETE = NO
#957_PREVIEW_CANDIDATES = 5

PR_958 = OPEN
PR_958_HEAD = 0eac3d4c10ddd854eee9027db038f55899b66caf
PR_958_PREVIEW = PROTECTED OPEN-PR PREVIEW
DELETE_PR_958_PREVIEW = NO

SEQUENCE_DRIFT = #958 opened before retention terminal
RETENTION_SCOPE = delete only revalidated #957 previews; preserve #958 and all other open-PR previews
NEXT = complete #957 retention → post-cleanup proof → release #958 freeze

Problem

The existing .github/workflows/prune-deployments.yml prunes GitHub Deployment records, but it does not remove the corresponding Vercel Preview deployment artifacts. A bounded live housekeeping pass confirmed that stale previews can accumulate after merged or closed pull requests.

Required policy

  • never delete Production deployments or Production/Main aliases;
  • retain the newest three Preview deployments for each open PR, including its active branch alias;
  • after a PR is merged/closed, remove its Preview deployments after a bounded grace period when no active alias or review evidence requires them;
  • remove stale failed/canceled previews only after confirming they are detached from active work;
  • classify unknown metadata conservatively and never delete it blindly;
  • perform a dry-run manifest, rate-limited authenticated API deletion, and post-cleanup verification;
  • redact creator emails and tokens from logs/reports.

Scope

Design the smallest authenticated Vercel API/CLI housekeeping integration or documented operator workflow. Preserve Production, domains, project settings, environment variables, rollback history, and active review previews. Do not change deployment creation or promotion semantics.

Activity

  1. qnbs commented on Sep 6, 2026

    @qnbs
    OwnerAuthor

    Vercel retention reconciliation after #628 resulting-main 872b6f4: project/team/repository scope matched, Production remained READY with its protected aliases, and no open PRs were present. Twelve non-Production Preview deployments were classified by closed/merged PR or branch lifecycle; each still carries a branch alias, so the merged policy's no-protected-alias gate did not prove deletion safe. No alias or deployment was deleted.

    Carry-forward for #627: future automation must explicitly reconcile orphaned closed-PR/branch aliases before any per-ID deletion, with the same current-main, target, terminal-state, project/team/repository, rollback/promotion, open-head, review-evidence, alias and post-delete revalidation gates. Preserve ambiguous alias state as UNKNOWN_REVIEW_REQUIRED; never use a broad fallback.

  2. qnbs commented on Sep 20, 2026

    @qnbs
    OwnerAuthor

    2026-09-20 live incident — Vercel Deployment Storage reached 100% of Free allowance

    Vercel reported that team qnbs-projects has reached 100% of the included 10 GB Deployment Storage allowance.

    Live reconciliation against project worldscript-studio / prj_XJDiKIlKNg5sbmw6xMHIlf6glXHy found:

    deployments total                = 25
    protected open-PR previews       = 11
    protected production deployments = 7
    stale closed/merged previews     = 7
    

    Current main:

    1451f88151fa68eafbf57cd020287b72a5268de3

    Exact-main gates:

    • CI/CD SUCCESS
    • CodeQL SUCCESS
    • current Production deployment READY and rollback-protected

    Verified stale Preview candidates

    All seven candidates are:

    • target = null
    • READY
    • not rollback candidates
    • scoped to the expected project/team/repository
    • tied only to merged/closed PRs
    • tied to branches that no longer exist on GitHub
    • unrelated to every currently open PR
    Deployment PR/lane Branch/ref
    dpl_GBAgfdXRHDG4KjwWD24o3exGtNVu #784 merged chore/dependabot-dev-tooling-minor-patch-20260920
    dpl_4iNPbk8myDZ9bM2dc2NK8QaS8L3J #782 merged chore/dependabot-vitest5-linear-20260920
    dpl_6VW14jvUnZZRnxRtpc7ojrFLAvqm #782 prior generation same branch
    dpl_HiwugtsjCC93TeEuE2Tuxed2ZnRM #782 prior generation same branch
    dpl_HGwub3FTHn4APaEbZopSZ7pDBX2c #749 closed unmerged dependabot/npm_and_yarn/dev-tooling-c9c26bdfd5
    dpl_AmzcJ4cA29hT7ERBXZFcYzgwmCjt #775 merged feat/553-d1-idb-canonical-authority-20260917
    dpl_8BjP9SYK7dH7tugLBPmratbL6RwV #775 prior generation same branch

    Each currently still carries only a branch-specific Preview alias. Those aliases are also orphaned because the owning branch/PR is gone.

    Per docs/VERCEL-PREVIEW-RETENTION-POLICY.md, remove the orphaned non-Production alias first, revalidate exact-main/open-PR protections, then delete the explicit deployment ID.

    Do not delete the seven Production deployments or any of the 11 current open-PR Preview deployments.

    Tooling limitation observed

    The connected Vercel MCP surface currently exposes deployment enumeration/details but no deployment/alias delete action. Vercel's supported authenticated write path is the CLI/REST API:

    • list aliases: GET /v4/aliases?projectId=<project>&teamId=<team>
    • delete orphan alias: DELETE /v2/aliases/{aliasId}?teamId=<team>
    • delete deployment: DELETE /v13/deployments/{id}?teamId=<team>
    • CLI API equivalent: vercel api /v13/deployments/<deployment-id> -X DELETE

    This incident should be used to finish #627 with a bounded authenticated cleanup/retention path so stale merged-PR Previews do not repeatedly exhaust Deployment Storage.

  3. qnbs commented on Sep 22, 2026

    @qnbs
    OwnerAuthor

    2026-09-22 housekeeping — prior deployment counts are historical; live lifecycle has moved

    The 2026-09-20 incident comment's exact deployment counts were a point-in-time snapshot and must not be read as current inventory.

    Current live reconciliation at this housekeeping checkpoint:

    No deployment or alias was deleted during this documentation pass.

    The durable policy remains unchanged:

    1. classify Production/open-PR/rollback/review-protected deployments first;
    2. identify closed/merged-PR previews only from live GitHub state;
    3. reconcile branch aliases before deletion;
    4. dry-run explicit IDs;
    5. delete only through authenticated supported API/CLI;
    6. re-fetch and verify after each bounded cleanup wave.

    #627 remains OPEN / P2 because the long-term authenticated retention/cleanup mechanism is still not terminal.

  4. qnbs commented on Sep 23, 2026

    @qnbs
    OwnerAuthor

    2026-09-23 live housekeeping reconciliation — retention pressure and alias semantics

    Fresh live state after PR #817:

    main = 2de980dbedf3ea5e2ada0ac8b6d449faf10a2a5e
    open GitHub PRs = 0
    Vercel deployments = 37
    Production = 9
    Preview = 28
    all observed deployments = READY
    

    Current Production is dpl_9TpNZYVzmRQzPhYrvXeab6Aa3spM from the current main SHA. The immediate predecessor dpl_3w8mCTRMeBE548cR534JteeTmG3h remains rollback-relevant. All 28 current Preview deployments map to terminally merged PR branches, including #817, #816 and merged Dependabot work.

    A bounded manual retention pass is being executed separately after local cleanup. That manual cleanup does not close #627; this issue remains the long-term authenticated automation/policy owner.

    Policy inconsistency now requiring explicit resolution

    The current repository policy treats an active branch alias as protected and, for stale orphan aliases, describes alias removal before deployment deletion. Current live/operator evidence for terminal merged-branch Preview aliases instead supports an alternative provider-safe flow: delete the explicitly revalidated unique Preview deployment, then re-list aliases and remove only an actually dangling terminal-branch alias if one remains.

    Do not let automation encode both orderings implicitly.

    Before #627 closes, choose and test one provider-truthful alias/deployment deletion contract using live Vercel semantics:

    A. alias-first → deployment delete
    or
    B. explicit deployment delete → post-delete dangling-alias reconciliation
    

    The admitted implementation must prove that Production/main aliases, rollback history, open-PR review evidence and unrelated aliases cannot be removed under either lifecycle race.

    Additional acceptance evidence from this incident

    • pagination must enumerate the full project, not only the first CLI page;
    • aggregate expected counts are informational, never deletion targets;
    • every delete candidate must be revalidated immediately before mutation;
    • deletion should remain in bounded batches with Production/alias verification between batches;
    • zero open PRs makes this inventory unusually simple but must not become an assumption in automation.

    #627 remains OPEN / P2 after the manual pass because prevention/automation is not yet terminal.

  5. qnbs commented on Sep 24, 2026

    @qnbs
    OwnerAuthor

    2026-09-24 post-#830 retention catch-up checkpoint

    PR #830 is merged and its exact resulting main is now terminal green:

    main = 0371a67fb97439a85ac6731b843d4937a56c63c3
    CI/CD run 36060688100 = SUCCESS
    CodeQL run 36060688074 = SUCCESS
    current Production deployment = dpl_5fyqAhcVhbzGFRWALgiEeWgvp52T = READY
    

    The mandatory lifecycle in docs/VERCEL-PREVIEW-RETENTION-POLICY.md therefore requires a retention reconciliation now. This was not completed before the next #553 worktree/PR was started, so perform it as a catch-up maintenance wave before further dependent source mutation. Existing CI/reviews for the already-open next PR may continue; do not use retention as a reason to cancel useful provider work.

    Current visible provider snapshot

    The connected Vercel listing exposes the newest page of 20 deployments only; 20 is not asserted as the full project inventory. Full pagination remains required.

    Protected current work visible on that page includes:

    Visible lifecycle candidates only — not pre-authorized deletes — include multiple non-Production READY previews from terminal PRs/branches, for example:

    Every such item must still pass the policy's live alias, branch/PR lifecycle, rollback/promotion, current-main/open-head, review-evidence and provider-scope gates immediately before deletion.

    Required catch-up execution

    1. Re-read live current main; if it moved from 0371a67f…, establish a new terminal-green main gate first.
    2. Enumerate all pages for this exact Vercel project/team only.
    3. Snapshot Production/main aliases, rollback/promotion-protected IDs and exact protected Preview sets for open PRs fix(persistence): make superseded lifecycle flushes observe their chain's real outcome (#553) #832 and feat(core): R-15 Gate 1a headless WSR1/AAD/AES-256-GCM primitive (#445) #829 (newest up to three per PR plus any additional active alias/review evidence).
    4. Produce the dry-run manifest from the repository policy.
    5. Resolve the alias/deployment ordering contract from live provider semantics; do not encode contradictory alias-first/deployment-first behavior implicitly.
    6. Revalidate each candidate immediately before mutation.
    7. Delete only explicit SAFE_TO_DELETE IDs through authenticated Vercel CLI/API in bounded batches.
    8. Re-enumerate after each batch and prove Production, rollback history, open-PR previews and aliases remain intact.
    9. Record the resulting counts/evidence here without secrets or creator emails.

    This manual catch-up does not close #627. The issue remains the long-term automation/least-privilege retention owner.

  6. qnbs commented on Sep 24, 2026

    @qnbs
    OwnerAuthor

    Vercel retention catch-up — post-#830 (2026-09-25)

    Gate anchor: current main = 0371a67fb97439a85ac6731b843d4937a56c63c3 (PR #830), with terminal-green CI/CD and CodeQL. The anchor was re-read immediately before every individual deletion and never moved.

    Scope: Vercel, team qnbs-projects, project worldscript-studio / prj_XJDiKIlKNg5sbmw6xMHIlf6glXHy, repository qnbs/WorldScript-Studio. Verified per deployment. Enumeration was fully paginated (single page, no next).

    Dry-run classification (43 deployments, all READY):

    Class Count
    Protected Production 15, incl. dpl_5fyqAh… holding the Production + main aliases
    Protected open-PR Previews #832 dpl_FsfW… (head 2f7f57ba), draft #829 dpl_HsYt… (head b05dbdb4)
    Protected active-branch-alias Previews #827 dpl_GnH3… (branch deliberately retained), #820 newest dpl_9RpT… (branch still exists)
    SAFE_TO_DELETE 24
    UNKNOWN / DEFERRED 0

    The 24 deletions:

    All 24 were readySubstate=STAGED (never promoted), not current main, and not an open-PR head.

    Execution: each explicit ID was revalidated immediately before deletion: main anchor, project identity, target, READY state, non-PROMOTED, not current-main or an open-PR head, PR MERGED/CLOSED, and alias set unchanged. Deletion used per-ID vercel alias rm <alias> and vercel remove <id> --safe --yes; there was no project-wide remove, promotion or rollback. 24/24 DELETE_CONFIRMED, 0 reclassified.

    • dpl_86WG8iN1cZavwfFHmhHDmE91sXJA - dpl_H69qcVSwMVa7aw8vSqYV7QPp8LeY - dpl_J2jXBgTqKBL4diUNsjKLHcJFkjCj - dpl_8WsSEQzFuUUEvxb8ZCSaHv7cKruo - dpl_9aHpHUuSh5wNH2fkEnkAkee6EimC - dpl_4BVTHxi9rgNgVWV4LcS9DDhKMjsX - dpl_BdEuJ2C1pxGE7s4prNkNERdxFizn - dpl_6a36YDM2a39jKbLzpjCsKYFiuqJ3 - dpl_5ySxAHPsS6dXnRu1ze3ckBq14Lb3 - dpl_EyrxRH3ArVPxNAteneVvBs9ZqBPQ - dpl_ANaUazewAiNnUqsxLiYsRHPXjcYx - dpl_Acw7k396eF2jiqL6qSgfBR3rWtGT - dpl_CqYoqDYo1QPTaktvstmH1PvABkd9 - dpl_9Xt6CU96VpBqF7bvVEeArZRFjfbY - dpl_6BPF7M2vUfWekhTp9QJzVzaPUA5e - dpl_83UVZnsHXR3Kkt2GLmfbWW7JH9vV - dpl_E27p4eqCjykHBrzTcbNVNzzekvA6 - dpl_EJjPrJQetVmSqPos18jFnJf4B5uL - dpl_53VScEG5rZGUUoGqAAo9sChd1yRM - dpl_Eb414YswbLxLbPYvmtfWKRozx5Ky - dpl_5FNsE4G9RXgh24r5dUv1vhqZYRx2 - dpl_F57W1gdzo8obMge1YYNByvwPZoxy - dpl_FF1daxqTFKHVJw4S91UybmaxYdQU - dpl_4fc2os68cV4rZQZGqTERC66ViQev

    Post-cleanup proof:

    • deployments 43 → 19, no pagination remainder;
    • 0/15 Production IDs missing and 0/4 protected Preview IDs missing;
    • 0/24 deleted IDs present, and no unexpected new IDs;
    • Production/main alias binding and all four protected branch-alias bindings unchanged;
    • https://worldscript-studio.vercel.app → 200, and fix(persistence): make superseded lifecycle flushes observe their chain's real outcome (#553) #832's Preview alias → 200;
    • no project, domain, env, promotion or rollback setting touched.

    Creator identity qnbs; no emails, tokens or secret values were recorded.

  7. qnbs commented on Sep 25, 2026

    @qnbs
    OwnerAuthor

    Retention after #832 merge (main 164f23fa, CI + CodeQL terminal green).

  8. qnbs commented on Sep 25, 2026

    @qnbs
    OwnerAuthor

    Retention after #833 merge (main 3244242e, CI/CD + CodeQL terminal green: 16 success, 4 skipped).

  9. qnbs commented on Sep 25, 2026

    @qnbs
    OwnerAuthor

    Retention after #835 merge (main 8b270ea7, CI/CD + CodeQL terminal green: 16 success, 4 skipped).

  10. qnbs commented on Sep 25, 2026

    @qnbs
    OwnerAuthor

    Retention after #837 merge (main 5adef443, CI/CD run 36123834671 success, CodeQL run 36123834736 success).

  11. qnbs commented on Sep 25, 2026

    @qnbs
    OwnerAuthor

    2026-09-25 post-#838 retention inventory — cleanup pending

    Gate anchor is now terminal green:

    main = 5999f2e0b65d90c449939ca7ff718d37827bc1e8
    CI/CD 36140075846 = SUCCESS
    CodeQL 36140075833 = SUCCESS
    current Production = dpl_63GbCknDULrPemkS5F4QFGwTRKAZ = READY
    

    The connected Vercel project was fully paginated at this checkpoint: 24 READY deployments total.

    Classification from current provider metadata:

    Both #838 previews are READY, target=preview, and expose the branch alias worldscript-studio-git-fix-553-snapshot-carrier-qnbs-projects.vercel.app. GitHub no longer has remote branch fix/553-snapshot-carrier.

    Before deleting anything, the operator must still revalidate immediately:

    1. main remains 5999f2e0… and terminal green;
    2. PR fix(project): keep snapshots as stored text and admit every snapshot restore (#553) #838 remains merged and the remote branch absent;
    3. neither preview is promoted/rollback-protected/current/open-PR evidence;
    4. branch alias ownership/current target is resolved live;
    5. remove the stale branch alias according to the established provider ordering contract;
    6. remove only the explicit safe Preview IDs with vercel remove --safe;
    7. re-enumerate and prove Production, rollback history, feat(core): R-15 Gate 1a headless WSR1/AAD/AES-256-GCM primitive (#445) #829 and the retained fix(reset): delete the DuckDB analytics OPFS file on Factory Reset (#716) #827/analytics(duckdb): requalify default-on DuckDB-WASM runtime, privacy, persistence and recovery semantics #716 preview are unchanged.

    This is a dry-run/provider inventory only. It does not claim the #838 retention cleanup is already complete and does not close #627.

  12. qnbs commented on Sep 25, 2026

    @qnbs
    OwnerAuthor

    Retention after #838 merge (main 5999f2e0, CI/CD run 36140075846 and CodeQL run 36140075833 success).

  13. qnbs commented on Sep 25, 2026

    @qnbs
    OwnerAuthor

    Retention after the #839 merge (main 94b68fc1; CI/CD and CodeQL on main success).

  14. qnbs commented on Sep 25, 2026

    @qnbs
    OwnerAuthor

    Retention after the #840 merge (main 4e65bd12; CI/CD and CodeQL on main success).

  15. 68 remaining items

  16. qnbs commented on Oct 14, 2026

    @qnbs
    OwnerAuthor

    Vercel platform retention, main epoch 0ef59028 (PR #1063, squash 0ef590280f44c7a13cd873e3b5beedce33167e72). Receipt, nothing replayed from the 53dee55c epoch.

    • Resulting main: CI / CD run 38653843213 and CodeQL SAST run 38653843438 completed success on the exact SHA; GitHub Pages deployment record 7079989837 success, site HTTP 200; Vercel Production record 7079703197 success.
    • Production dpl_2oxjyDMp697wgFJfq3q6MMfLFTp4 (worldscript-studio-43lp08nne-qnbs-projects.vercel.app): Ready, target production, aliases worldscript-studio.vercel.app, worldscript-studio-qnbs-projects.vercel.app, worldscript-studio-git-main-qnbs-projects.vercel.app bound; worldscript-studio.vercel.app HTTP 200 (the team-scoped alias answers 302, as a protected host).
    • Dry-run (read-only) then reconcile from the clean detached worktree at the exact SHA: 4 protected production, 2 rollback candidates, 22 protected previews, 7 SAFE, 0 UNKNOWN. The 7 SAFE are the superseded previews of PR feat(core): add the owner-bound inventory staging sweep behind test-support (#445) #1063 (no aliases, PR closed or merged): dpl_6ZTGELJenCCNA3jAWWfkNwic1JdQ, dpl_4QCtaJu5V41aZJBS4stQMwrEXWui, dpl_8iAZSXFR7JQmEAhJsB9TsM6Vy9V6, dpl_F4cWASAia9i75KfPuXS23wNR7aJf, dpl_BW9PxUcpyisveC3TRwkufMgv3Yjk, dpl_9EPt7VQE6tJnSpeB66xKs9yFAd2b, dpl_3cWn8jhTbLL7HnASrpBLYJ5a1gwQ. The newest preview of the branch (16f0f1f6) stays PROTECTED because it holds a branch alias; no alias was removed.
    • Post-proof: 7 writes, 7 deleted and absent, protected present 26/26, canonical and protected aliases bound, preview states held, production set stable and READY, HTTP 200. No stop, no reclassification.
  17. qnbs commented on Oct 15, 2026

    @qnbs
    OwnerAuthor

    Vercel platform retention, main epoch ce3504b9 (PR #1064, squash ce3504b9a4f7b598abb5cf35fa5e06f6ec846624). Receipt, nothing replayed from earlier epochs.

    • Resulting main: CI / CD run 38661357740 and CodeQL SAST run 38661357765 success on the exact SHA; GitHub Pages deployment record 7081101335 success, site HTTP 200; Vercel Production record 7080791973 success.
    • Production dpl_HjkvieT8RR5MR5usbkuXuZcdn2XH (worldscript-studio-dgq6jthvb-qnbs-projects.vercel.app): Ready, target production, aliases worldscript-studio.vercel.app, worldscript-studio-qnbs-projects.vercel.app, worldscript-studio-git-main-qnbs-projects.vercel.app bound; worldscript-studio.vercel.app HTTP 200.
    • Dry-run from the clean detached worktree at the exact SHA: 5 protected production, 2 rollback candidates, 23 protected previews, 0 SAFE, 0 UNKNOWN. The previews of PR feat(core): inherit the pages the stored predecessor names exactly (#445) #1064 are held by their branch alias; nothing to delete, no write, no alias touched.
  18. qnbs commented on Oct 15, 2026

    @qnbs
    OwnerAuthor

    Vercel platform retention, main epoch b9890f8e (PR #1065, squash b9890f8e07b5e32570be72795ec971cc403abb5a). Receipt, nothing replayed from earlier epochs.

    • Resulting main: CI / CD run 38680070934 and CodeQL SAST run 38680071081 success on the exact SHA; GitHub Pages deployment record 7083927159 success, site HTTP 200; Vercel Production record 7083638926 success.
    • Production dpl_6M9wFQgJrPCic13op6BL1M48Q2dS (worldscript-studio-80m5lifuu-qnbs-projects.vercel.app): Ready, target production, the three canonical aliases bound; worldscript-studio.vercel.app HTTP 200.
    • Dry-run then reconcile from the clean detached worktree at the exact SHA: 6 protected production, 2 rollback candidates, 24 protected previews, 1 SAFE, 0 UNKNOWN; deleted dpl_VsVUtRQqAhFGkS1K9z5ZJAp2uH8u (a superseded preview of PR feat(core): keep the unchanged pages of the stored predecessor in a streamed capture (#445) #1065, no alias).
    • Post-proof: 1 write, protected present 30/30, deleted absent, canonical and protected aliases bound, preview states held, production set stable and READY, HTTP 200. No stop, no reclassification.
  19. qnbs commented on Oct 15, 2026

    @qnbs
    OwnerAuthor

    Vercel platform retention, main epoch 5ccefffd (PR #1066, squash 5ccefffd063b2a9c6f309cfcb7cf19de16413582). Receipt, nothing replayed from earlier epochs.

    • Resulting main: CI / CD run 38692170730 and CodeQL SAST run 38692170345 success on the exact SHA; GitHub Pages deployment record 7085903505 success, site HTTP 200; Vercel Production record 7085517755 success.
    • Production dpl_CqJhX1f561RA8W3Wy3QXJMc2raaL (worldscript-studio-iecnfiv2s-qnbs-projects.vercel.app): Ready, target production, the three canonical aliases bound; worldscript-studio.vercel.app HTTP 200.
    • Dry-run then reconcile from the clean detached worktree at the exact SHA: 7 protected production, 2 rollback candidates, 25 protected previews, 2 SAFE, 0 UNKNOWN; deleted dpl_DniWosJsFdVAz84HMmoUbJDW3eE7 and dpl_6ZP2dvbeER7FjCgdqrHBJHxPCzvV (superseded previews of PR feat(core): judge a takeover against a trusted clock observation (#445) #1066, no alias).
    • Post-proof: 2 writes, protected present 32/32, deleted absent, canonical and protected aliases bound, preview states held, production set stable and READY, HTTP 200. No stop, no reclassification.
  20. qnbs commented on Oct 15, 2026

    @qnbs
    OwnerAuthor

    Retention receipt — main fac89b4f (PR #1067, Gate 4 slice H1a-1)

    Merge: squash fac89b4fab68c10c19effaa96a62c5fe0db020c8, one parent (5ccefffd), signature verified (GitHub valid), protected merge on exact head d1aae575 (--match-head-commit), 8 PR commits, 14 files.

    Resulting main: CI / CD run 38717507087 success, CodeQL SAST run 38717506830 success. GitHub Pages deployment record 7090040589 success, site HTTP 200. Production dpl_5msrGxdvbTmxnKoejmkvBaQMi5Mk READY, target=production, GitHub deployment record 7089627886 on the exact SHA success. Aliases bound: worldscript-studio.vercel.app (HTTP 200), worldscript-studio-qnbs-projects.vercel.app and worldscript-studio-git-main-qnbs-projects.vercel.app (both HTTP 302 to the Vercel SSO API: team-scoped, deployment-protected, not publicly served; bound, not a failure).

    Safe-only retention (clean detached worktree at the exact SHA, cli.mjs dry-run then reconcile): 7 SAFE (all pr-closed-or-merged, superseded previews of PR #1067: fee2e2a8, f2d3943c, eee49201, 15c3a48c, 55b32338, 026652fd, 44b50d8a), 0 UNKNOWN, 0 reclassified, 0 deferred, 7 write attempts, 7 deleted. Post-proof: protected present 37/37, deleted absent, canonical and protected aliases bound, preview states held, deletions still SAFE, production set stable, production READY, HTTP 200. The preview of the final PR head d1aae575 stays protected. Production deployments and the two rollback candidates untouched.

    Not touched: GH deployment-record metadata (#1042) and the Pages pruner (#1028) are separate and unchanged.

  21. qnbs commented on Oct 15, 2026

    @qnbs
    OwnerAuthor

    Retention receipt — main ecd6aa4f (PR #1068, Gate 4 slice H1a-2 part 1 of 4: API and isolation)

    Merge: squash ecd6aa4fd040360d97b8eb2d3117f94724f972cc, one parent (fac89b4f), signature verified, protected merge on exact head b60dc603 (--match-head-commit), 13 files.

    Resulting main: CI / CD run 38734159750 success, CodeQL SAST run 38734159726 success. GitHub Pages record 7092900986 success, site HTTP 200. Production dpl_261wnfkSehrYWmyZrRcRhh4Z3QbD READY on the exact SHA (GitHub deployment record 7092421659 success); aliases bound: worldscript-studio.vercel.app (HTTP 200), worldscript-studio-qnbs-projects.vercel.app and worldscript-studio-git-main-qnbs-projects.vercel.app (HTTP 302 to the Vercel SSO API: team-scoped, deployment-protected, bound).

    Safe-only retention (clean detached worktree at the exact SHA, dry-run then reconcile): 1 SAFE (pr-closed-or-merged, the superseded first-draft preview of PR #1068 at 03ad9acc), 0 UNKNOWN, 1 write attempt, 1 deleted. Post-proof: protected present 46/46, deleted absent, canonical and protected aliases bound, preview states held, deletions still SAFE, production set stable, production READY, HTTP 200. The previews of the open stacked PRs #1069 / #1070 / #1071 are protected. Production deployments and rollback candidates untouched; #1042 (GitHub deployment metadata) and #1028 (Pages pruner) unchanged.

  22. qnbs commented on Oct 15, 2026

    @qnbs
    OwnerAuthor

    Retention receipt — main 45ce3d0c (PR #1069, Gate 4 slice H1a-2 part 2 of 5: Unix file removal, test-support only)

    Merge: squash 45ce3d0c5265277c0d5d9ffaff9050ad714123ad, one parent (ecd6aa4f), signature verified, protected merge on exact head 586f6638 (--match-head-commit), 7 files / 1,109 meaningful lines. Codex was at its usage limit on this head (NO_SIGNAL, not a pass); it had reviewed the earlier heads of the same code (four waves, findings fixed or moved to #1072), CodeRabbit / CodeAnt / CodeScene and the hosted Windows / macOS / Linux evidence cover the head, 0 threads.

    Resulting main: CI / CD run 38747575127 success, CodeQL SAST run 38747574965 success. GitHub Pages record 7095304509 success, HTTP 200. Production dpl_5zFFfoq4RH4FeX7Lp2etRzC6SYpc READY on the exact SHA (GitHub deployment record 7094695880 success); aliases bound: worldscript-studio.vercel.app (HTTP 200), the two team aliases HTTP 302 (Vercel SSO, bound).

    Safe-only retention (clean detached worktree at the exact SHA): 6 SAFE (pr-closed-or-merged, superseded previews of PR #1069), 0 UNKNOWN, 6 write attempts, 6 deleted. Post-proof: protected present 50/50, deleted absent, canonical and protected aliases bound, preview states held, deletions still SAFE, production set stable, production READY, HTTP 200. Previews of the open stacked PRs protected; production and rollback candidates untouched; #1042 and #1028 unchanged.

  23. qnbs commented on Oct 15, 2026

    @qnbs
    OwnerAuthor

    Retention receipt — main 1f37cd83 (PR #1073, Gate 4 slice H1a-2 part 2b: Unix quarantine hardening, test-support only; supersedes #1072)

    Merge: squash 1f37cd8368e6f647a21cf9d77fbdf20f7748076f, one parent (45ce3d0c), signature verified, tree identical to the validated head 1602d79e. Protected merge pinned with --match-head-commit, no admin, 8 files / 1,014 meaningful lines, 3 commits in the PR (own budget). #1072 reached 15/15 commits with two valid P2 open and was closed as superseded, not merged; its branch is kept.

    Review on the exact head: 0 unresolved threads (the 2 raised by Codex on #1073 were answered and resolved: one fixed with a test, one stated as a documented limit); Codex review completed on 1602d79e with no unresolved finding; CodeRabbit "no actionable comments" on the full net diff and again on the final delta; CodeAnt Quality Gate passed (risk note Low); CodeScene approved; hosted Windows / macOS / Ubuntu Secure Store evidence, Quality Gate Node 22/24, E2E, CodeQL and ✅ CI Success green. DEPENDENT_OPEN_PRS=0, delete_branch_on_merge=false.

    Resulting main: CI / CD run 38821876379 success, CodeQL SAST run 38821876470 success. GitHub Pages record 7106972339 success, HTTP 200. Production dpl_7WmkbcuhchdeR8EFs9igbZBCr4L2 READY on the exact SHA (GitHub deployment record 7106617928 success); aliases bound: worldscript-studio.vercel.app (HTTP 200), the two team aliases HTTP 302 (Vercel SSO, bound).

    Safe-only retention (clean detached worktree at the exact SHA, writer: Claude Code CLI per the active mode): 7 SAFE (pr-closed-or-merged, previews of PR #1072 and of earlier heads of PR #1073), 0 UNKNOWN, 7 write attempts, 7 deleted. Post-proof: protected present 51/51, deleted absent, canonical and protected aliases bound, preview states held, deletions still SAFE, production set stable, production READY, HTTP 200. Production and rollback candidates untouched; the previews of the open PRs stayed protected (40 PROTECTED in the manifest).

  24. qnbs commented on Oct 16, 2026

    @qnbs
    OwnerAuthor

    Retention receipt — main 52eb9f6f (PR #1074, Gate 4 slice H1a-2 part 3: Unix directory removal on Linux and leftover recovery, test-support only; supersedes #1070)

    Merge: squash 52eb9f6f75f2390699772796b9ed4685967f0981, one parent (1f37cd83), signature verified, tree identical to the validated head 3a083508. Protected merge pinned with --match-head-commit, no admin, 9 files / 775 meaningful lines; 9 commits in the PR, two of them a temporary macOS probe and its correction that are squashed away (the measured answer is in the PR body and the evidence document). #1070 was closed as superseded, not merged; its branch is kept.

    Review on the exact head: 0 unresolved threads (6 on this PR, all answered: 4 fixed with a test and mutation check, 1 wording fixed, 1 about the temporary probe, obsolete; the 7 findings that were open on #1070 are accounted for in the body of #1074); Codex completed on ec7ba931 with no finding at all and on the exact head with none unresolved; CodeRabbit reviewed ec7ba931 (one Minor wording point, fixed) and was rate-limited on the docs-only head; CodeAnt Quality Gate passed (risk Low); CodeScene approved; hosted Windows / macOS / Ubuntu Secure Store evidence, Quality Gate Node 22/24, E2E, CodeQL and ✅ CI Success green. DEPENDENT_OPEN_PRS=0, delete_branch_on_merge=false.

    Resulting main: CI / CD run 38838765824 success, CodeQL SAST run 38838765751 success. GitHub Pages record 7109402070 success, HTTP 200. Production dpl_GLkEhBzm7LzSRptit2bo6GwpyvHZ READY on the exact SHA (GitHub deployment record 7109076954 success); aliases bound: worldscript-studio.vercel.app (HTTP 200), the two team aliases HTTP 302 (Vercel SSO, bound).

    Safe-only retention (clean detached worktree at the exact SHA, writer: Claude Code CLI per the active mode): 9 SAFE (pr-closed-or-merged: 8 previews of PR #1074, 1 of the closed PR #1070), 0 UNKNOWN, 9 write attempts, 9 deleted. Post-proof: protected present 52/52, deleted absent, canonical and protected aliases bound, preview states held, deletions still SAFE, production set stable, production READY, HTTP 200. Production and rollback candidates untouched; the previews of the other open PRs stayed protected (40 PROTECTED in the manifest).

  25. qnbs commented on Oct 16, 2026

    @qnbs
    OwnerAuthor

    Retention receipt — main 0ba4b94a (PR #1075, Gate 4 slice H1a-2 part 4: Windows removal through the authenticated handle, test-support only; supersedes #1071)

    Merge: squash 0ba4b94a4c70b36a74b2db25dd271626cafaf84d, one parent (52eb9f6f), signature verified, tree identical to the validated head d3d97562. Protected merge pinned with --match-head-commit, no admin, 8 files / 516 meaningful lines, 5 commits in the PR. #1071 was closed as superseded, not merged; its branch is kept. One new unsafe call (the disposition), no new package.

    Review on the exact head — stated without rounding up: 0 unresolved threads (2, both answered: the Codex P2 on the directory converted in place is fixed with a test that passes on the hosted Windows runner, the CodeRabbit wording point is fixed). CodeRabbit: "no actionable comments" on the full diff of the first head, and it reviewed the range that contains the revalidation fix (a57f8ad5..140e981a: one Minor wording point, fixed); it was rate-limited on the final docs-only head. CodeAnt: Quality Gate passed, risk Low on 140e981a; its earlier Medium note (a writable mapped view can change the bytes) is answered in writing as the same-user residual and led to the statement that the removal binds the object, not its bytes, on Unix and Windows. CodeScene approved. Codex: completed with no finding on the first head, completed with the one finding on 7c43e606, and then its review failed technically on 140e981a and d3d97562, including on one manual request; that is no signal and is not counted as a pass. Hosted Windows / macOS / Ubuntu Secure Store evidence (the Windows run executes all 12 remove_windows tests), Quality Gate Node 22/24, E2E, CodeQL and ✅ CI Success green. DEPENDENT_OPEN_PRS=0, delete_branch_on_merge=false.

    Resulting main: CI / CD run 38852100613 success, CodeQL SAST run 38852100651 success. GitHub Pages record 7111385430 success, HTTP 200. Production dpl_3hiSh3SVxEwKc4oCsY1esPfLitiT READY on the exact SHA (GitHub deployment record 7111125440 success); aliases bound: worldscript-studio.vercel.app (HTTP 200), the two team aliases HTTP 302 (Vercel SSO, bound).

    Safe-only retention (clean detached worktree at the exact SHA, writer: Claude Code CLI per the active mode): 5 SAFE (pr-closed-or-merged: 4 previews of PR #1075, 1 of the closed PR #1071), 0 UNKNOWN, 5 write attempts, 5 deleted. Post-proof: protected present 53/53, deleted absent, canonical and protected aliases bound, preview states held, deletions still SAFE, production set stable, production READY, HTTP 200. Production and rollback candidates untouched; the previews of the other open PRs stayed protected (40 PROTECTED in the manifest).

  26. qnbs commented on Oct 17, 2026

    @qnbs
    OwnerAuthor

    2026-10-17 — #1076 exact-main retention checkpoint

    Current protected main is a710b39bb2aeecee9a1e580cc367c930c45b58c1. CI / CD 38910695945 and CodeQL 38910695491 are terminal success on that SHA. Vercel Production dpl_iQYUJpYnG4rbP41UgMWsap7gjZTY is READY on the same SHA; its three canonical/Main aliases remain bound, the canonical site returned HTTP 200, and the previous Production dpl_3hiSh3SVxEwKc4oCsY1esPfLitiT remains present and READY as rollback evidence. GitHub Pages deployment 7121175822 also succeeded on this SHA; the site, manifest, and sampled JS/CSS assets returned HTTP 200.

    Retention is not terminal. The canonical read-only runner returned provider-read-failed with writeAttempts=0; it produced no complete SAFE/PROTECTED/UNKNOWN manifest. I am not recording NO_OP_RETENTION_PASS or a SAFE count. A separate authenticated read inventory returned 53 Vercel deployments and 55 aliases, but cannot replace the canonical runner's classification. No Vercel deployment or alias was changed.

    The active policy still names the local Claude Code CLI as the destructive writer. The valid bounded train declaration in #927 defers only Preview housekeeping; it does not waive Production gates. Full reconciliation remains due at train end, and non-train mutation remains gated on that terminal proof.

  27. qnbs commented on Oct 17, 2026

    @qnbs
    OwnerAuthor

    2026-10-17 — local provider-read diagnosis and canonical dry-run

    provider-read-failed was caused by the local Vercel CLI auth context: the first already-present CLI path returned whoami exit 1 with a redacted invalid-token error. The second already-present path (the same Vercel CLI 64.3.1 binary) returned exit 0. No login or credential change was made. Exact team/project-scoped GETs for /v9/projects/<project-id>, /v6/deployments?...projectId=<project-id>&teamId=<team-id>&limit=100, and /v4/aliases?...projectId=<project-id>&teamId=<team-id>&limit=100 succeeded; the source-equivalent Node execFileSync GET returned the same project response.

    On clean exact-main a710b39bb2aeecee9a1e580cc367c930c45b58c1, the unchanged canonical node scripts/vercel-retention/cli.mjs dry-run completed read-only: SAFE=2, PROTECTED_PRODUCTION=14, ROLLBACK_CANDIDATES=2, PROTECTED_PREVIEWS=37, UNKNOWN=0, writeAttempts=0, stop=null. This is read-only evidence, not the terminal/destructive postmerge retention receipt. No Vercel deployment or alias write was performed; the policy-named Claude Code CLI remains the platform writer.

    The earlier CLI/API list had 53 deployments; the later exact project/team /v6 response had 38 with next=null. Exact team-scoped GETs for each of the 15 IDs in the former set but not the latter returned semantic 404 at 07:56:51 UTC (15/15; no auth/permission failures). This confirms those deployments were absent by the later observation; what removed them and when remains unknown. The scoped alias inventory had 55 entries. Codex issued no Vercel write.

    The independent GH #1042 metadata cleanup is separate: its one Preview record's original host returned semantic 404, and that exact GitHub record was removed with a 204/404 receipt while Vercel state remained unchanged.

  28. qnbs commented on Oct 17, 2026

    @qnbs
    OwnerAuthor

    MAINTAINER EXECUTION-OWNER DECISION — 2026-10-17 — narrowly scoped temporary Codex Maintenance writer

    This is a new explicit maintainer direction, superseding the previous requirement to resume Claude for this maintenance task. Claude Code CLI remains PAUSED_BY_OWNER, including ALL R-15/Gate4–7 feature development. The maintainer now directs Codex CLI running locally in VS Code/Ubuntu to execute the entire maintenance-only lane itself: GitHub Deployment metadata reconciliation (#1042), policy-compliant Vercel Preview-platform retention (#627), tightly scoped ZIP/Rust-dependency security remediation, and a separately admitted Dependabot successor train (#927). The intent is an operator handoff, not a bypass or a request for Codex to impersonate/start Claude.

    Writer reassignment: For #627 ordinary SAFE-only Vercel Preview retention, while this owner decision remains active, ACTIVE_DESTRUCTIVE_WRITER = Codex CLI, local Ubuntu / VS Code, instead of the Claude Code CLI named in the dated 2026-10-13 active-mode policy paragraph. All other retention predicates, exact-team/project scope, clean runner/main, exact SHA + push CI/CD + CodeQL, Production/rollback/alias/active-PR protections, UNKNOWN fail-closed behavior, source equality, exact dpl_ IDs, --safe, no blind retries, full postproof and non-secret receipts are unchanged and mandatory. This supersession changes only the named operator in the maintenance lane; it does not authorize Cursor Cloud or any third party, multiple concurrent writers, Vercel Production writes, project-wide deletion, production/rollback/promotion/tag/release, a branch-protection bypass, release Storage authority switch, or arbitrary changes to protected evidence.

    Source-of-truth reconciliation before first Vercel write: The checked-in docs/VERCEL-PREVIEW-RETENTION-POLICY.md still names Claude; preserve that document as the technical rulebook and carry this newer maintainer authority decision as the explicit, dated writer-only supersession, mirrored in QNB-67. Codex must inspect AGENTS.md and every other higher-priority required approval and demonstrate that this temporary operator transfer is admissible; if any repo policy requires an on-main policy edit first, do not silently ignore it. Prepare the smallest maintenance-only signed policy update and obtain the required protected gates; where an upstream security-audit failure prevents even that, report a precise governance deadlock and continue independent non-destructive security diagnostics. No change to the actual deletion classification is authorized.

    Immediately repeat the canonical read-only dry-run from clean exact main and the already found authenticated Vercel CLI context, without exposing secrets; the last known result (SAFE=2, UNKNOWN=0) is not a current write authorization. Only when owner re-delegation, actual source contract, provider identity, all full preflight gates and protected states agree, perform the canonical node scripts/vercel-retention/cli.mjs reconcile (not ad hoc vercel remove <project>); record each exact SAFE deletion (or complete NO_OP), independently verify all protected IDs and aliases, then publish terminal #627/QNB-67 receipt.

    Separate source scope: Codex may research and implement narrowly necessary compatible dependency/security fixes in isolated protected PRs; keep declared Rust MSRV 1.77.2, do not elevate it without a separate owner decision, and never weaken OSV/CI/review checks. No ordinary R-15 feature coding or release activity. The old Dependabot epoch expired at 2026-10-17 14:14:30 UTC with one merge (#1076); a new epoch is not yet declared and must have a separate fresh immutable cohort + baseline retention + all gates.

    Revocation: owner may revoke this temporary Maintenance-writer delegation at any time; do not assume this modifies Claude's pause. The prior Claude writer receipts remain historical, not invalidated.

  29. qnbs commented on Oct 17, 2026

    @qnbs
    OwnerAuthor

    Codex local SAFE-only Vercel retention receipt — 2026-10-17T16:11:49Z

    Owner authority: the writer-only delegation in GH #627 designates local Codex; Claude remains PAUSED_BY_OWNER. The canonical main-based runner was unchanged. Project/team were verified by the runner as worldscript-studio / prj_XJDiKIlKNg5sbmw6xMHIlf6glXHy and qnbs-projects / team_Dx4T2J41LNqP8mDgrRraonWp.

    Main anchor: a710b39. Exact push CI/CD run 38910695945 and CodeQL run 38910695491 succeeded; the push run's Security Audit succeeded. A later scheduled OSV run 38998852956 on the same SHA failed and remains an unresolved security blocker for source changes and merges; it was not bypassed.

    The canonical reconcile classified one SAFE preview and zero UNKNOWN, then attempted one exact-ID removal:

    • dpl_FfCkLtaeCfL8rLcX2CRzLUsgy9QL — branch codex/deptrain-20261016, PR build(deps): update Tokio to 1.53.2 in Tauri lockfile #1076 closed/merged, READY preview, no alias.
    • Summary: deleted=[that ID], writeAttempts=1, stop=null; protectedPresent=38/38, deletedAbsent=true, canonicalAliasesBound=true, protectedAliasesBound=true, productionSetStable=true, productionReady=true, httpProduction=200.
    • Independent team-scoped deployment GET returned semantic Deployment not found / 404. No alias write was needed.
    • Pages returned HTTP 200. Current Production dpl_iQYUJpYnG4rbP41UgMWsap7gjZTY remains READY on the anchor SHA; all three canonical aliases remain bound.
    • A post-state canonical dry-run using repository-pinned Node 22.23.3 returned SAFE=0, UNKNOWN=0, writeAttempts=0, stop=null.

    Execution deviation disclosed: the initial dry-run and single reconcile were invoked under Node 24.18.0. package.json's engine range permits >=22.19.0, but the checked-in .nvmrc specifies Node 22 and AGENTS directs use of the repository-declared toolchain. After discovering this, no further writes were made; exact-ID GET and final dry-run were repeated with Node 22.23.3 and confirmed the result. Therefore the provider state is terminally verified, while this receipt records a toolchain-procedure deviation. No merge, release, tag, promotion, or Production/Pages write occurred.

  30. qnbs commented on Oct 17, 2026

    @qnbs
    OwnerAuthor

    Required permanent Node 22/24 retention-operator guard — 2026-10-17 maintenance follow-up

    Cause established on current main: .nvmrc = 22; package.json engines.node >=22.19.0 intentionally permits Node24 application use; .github/workflows/ci.yml intentionally tests Node 22 and Node 24. The scripts/vercel-retention/cli.mjs entrypoint does not currently check its own process.versions.node before provider calls, so #627's earlier reconcile could run with Node 24.18.0 despite AGENTS' local declared-toolchain rule. Its subsequent Node 22.23.3 read-only verification confirmed terminal safe provider state, not retrospective compliance.

    New actionable engineering requirement: Local Codex maintenance operator must implement smallest tested fail-closed retention-entrypoint runtime guard accepting Node 22 with repository minimum 22.19 (allow later 22.x security patches), rejecting Node24 and other versions before any external provider GET/DELETE, gh/vercel subprocess, lock acquisition, or write. Cover dry-run and reconcile; check actual runtime and child PATH/tool invocation context, never log credentials. A Node24 negative harness must prove zero external calls and nonzero terminal stop; Node22 positive tests must pass against mocked dependencies. Include provenance/source-equality with current-main runner, focused documentation, clean Node22.23.3 preflight. Keep the general package engines >=22.19 and intentional CI Node22+24 Quality matrix unchanged; this is an operator-only invariant, not a universal app runtime downgrade.

    Protected integration: Small signed maintenance-only PR and adequate regression tests. Main Security Audit is currently red due to unrelated ZIP RUSTSEC-2026-0367/368/369. Do not merge an otherwise correct Node-guard PR while required CI red, do not ignore OSV or admin-merge. A tested local patch/PR with exact-head BLOCKED_SECURITY is still concrete engineering progress; pursue separate ZIP security prototype simultaneously (sequential heavy shell). No claim that this guard has been implemented or merged.

    Links: GH #911 and #572 source/MSRV prototype; GH #927 Dependabot lane; owner-delegated local Codex writer authority earlier in this issue. R-15 remains paused, release NO_GO.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions