Repository navigation
check:platform-checklist is red on main #22594
Description
os-platform-checklist-watchdog — machine-findable marker for this generated view. ⛔ Do not delete this line: it is how the watchdog finds this card instead of filing a new one every day.
check:platform-checklist is RED on main
Swept 2026-10-10T03:04:25.429Z · expected every 24h while this card stands (cron 51 2 * * * UTC) · next by 2026-10-11T02:51Z · run log · commit 99801d831faa07fa374cb21acc30a469fa6aa6e1 · trigger schedule · gate exit 1.
The Swept line above is this watchdog's heartbeat, and it states the cadence that makes
「stalled」 decidable: while the gate stays red this card is refreshed on that schedule, so a
timestamp still sitting there past the next by deadline means either the standing caller
died or the gate went green — this watchdog files nothing and closes nothing on green, so
both readings end at this card. ⛔ Do not carry a cadence over from a sibling patrol anchor:
they differ by up to 4× and each states its own.
The platform test checklist gate is red. It is not wired into per-PR CI (a standing
maintainer decision — the checklist is a QA ledger, not a code gate), so this card is the
channel that sees the red. Nothing is blocked by it.
⛔ The remedy is never to edit the checklist data to make the gate green. Read the
output below, fix what it names, and re-run pnpm check:platform-checklist locally.
duplicate) and the gate is red again ⇒ this is a regression; the earlier conclusion is
in that issue.
The gate's own output, verbatim:
> @objectstack/[email protected] check:platform-checklist /home/runner/work/objectstack/objectstack
> node scripts/checklist-select.mjs --self-test && node scripts/check-platform-checklist.mjs --self-test && node scripts/check-platform-checklist.mjs
✓ checklist-select self-test: 31 cases pass.
✓ check-platform-checklist --self-test: 221 assertions — the trap-table extractor reads a good table and REFUSES an empty/renamed/reshaped one; `fixtures.provisioning.use` resolves both spellings (own-area key and `<area>:<recipe>`) and fires on all three dangling shapes; the unreferenced-recipe direction fires on a recipe nobody uses while leaving a cross-area consumer, a retired consumer and a `$`-annotation alone; and the `/meta` call-spelling refusal reads its vocabulary out of the live generated contract, fires on every folded spelling a `call` can instruct, and stays silent on the canonical singular, on parameter placeholders, and on the `why`/`expect`/`source`/`requires` prose that narrates the fold; and the line-citation limb DETECTS NOTHING ITSELF EITHER: the last forked grammar in this file went into the shared core at #18592, so what is pinned here is the BINDING — the corpus declaring `pathlessLineCitations`, a source read finding no citation regex and no detector while the same read DOES find the declaration, the binding driven ON and OFF against ONE text so the green is the declaration working rather than a text that would have matched anyway, the DARK case that a citation both grammars already agreed on keeps its verdict either way, the refusal to over-fire on this ledger's own HTTP statuses, config literals, URL ports, clock times and quoted JSON, and the live zero with the control that says it is a reading; and the symbol-anchor limb DETECTS NOTHING AND RESOLVES NOTHING ITSELF: it is a registered corpus (#18107), so the grammar, the walk and the verdict are all `scripts/symbol-anchors.mjs`'s, pinned here by a source read that finds no local extension set, no anchor regex and no detector while the same read DOES find the registration, by the anchorable-extension vocabulary being the shared OBJECT rather than a copy of it, by the `runs/` exclusion driven three ways on the live corpus (the subtree holds files, none is swept, the areas beside it still are, and dropping the exclusion puts them back), and by the #16898 binding re-taken through the registration — a call site / import / local parameter / string-substring all reading ABSENT, the positive control that a declaration and a complete quoted token still resolve, a `.json` key resolving where a `.json` value does not, an INLINE object-literal key reading absent where one at the start of a line resolves — with the closed, grow-never residual and the per-file anchor floor held in both directions beside it; and the `planned` status is driven on fixtures — the accept set widened without losing its closure, `since: null`/no-steps/personas relaxed for planned alone while the 279 live items are judged exactly as before, and the coverage ratchet held BOTH ways: a planned item beside an active one is silent, a kind whose only items are planned is UNMAPPED, and the bearing set is pinned NOT to contain `planned`; and the two CALL SITES those rules ride on are pinned by a source read over comment-MASKED source driven ON and OFF, because severing either one — by deletion OR by commenting it out in place — left this very self-test green; ⛔ that pin is a TEXT pin and G12 records the three semantic severings it cannot see.
ELIFECYCLE Command failed with exit code 1.
WARN Local package.json exists, but node_modules missing, did you mean to install?
check-platform-checklist: 7 problem(s)
✗ areas/access-security.json: ABSENT SYMBOL — `packages/metadata-protocol/src/protocol.ts#anonymousFormIntakeOrgScopeRefusal`: `anonymousFormIntakeOrgScopeRefusal` is not declared in packages/metadata-protocol/src/protocol.ts by `scripts/symbol-anchors.mjs#symbolResolutionClass` — no declaration site and no complete quoted string token, comments stripped. A call site, an import, a member access or a substring of a longer string is NOT resolution. Re-point the anchor at what the file declares now, or drop the `#symbol` half and cite the file bare. ⛔ Do not widen the RESOLUTION RULE in `scripts/symbol-anchors.mjs` to make this green: it is shared with four other corpora.
✗ areas/access-security.json: ABSENT SYMBOL — `packages/metadata-protocol/src/protocol.ts#anonymousFormIntakeReopenRefusal`: `anonymousFormIntakeReopenRefusal` is not declared in packages/metadata-protocol/src/protocol.ts by `scripts/symbol-anchors.mjs#symbolResolutionClass` — no declaration site and no complete quoted string token, comments stripped. A call site, an import, a member access or a substring of a longer string is NOT resolution. Re-point the anchor at what the file declares now, or drop the `#symbol` half and cite the file bare. ⛔ Do not widen the RESOLUTION RULE in `scripts/symbol-anchors.mjs` to make this green: it is shared with four other corpora.
✗ areas/access-security.json: ABSENT SYMBOL — `packages/metadata-protocol/src/protocol.ts#envWideRawViewRows`: `envWideRawViewRows` is not declared in packages/metadata-protocol/src/protocol.ts by `scripts/symbol-anchors.mjs#symbolResolutionClass` — no declaration site and no complete quoted string token, comments stripped. A call site, an import, a member access or a substring of a longer string is NOT resolution. Re-point the anchor at what the file declares now, or drop the `#symbol` half and cite the file bare. ⛔ Do not widen the RESOLUTION RULE in `scripts/symbol-anchors.mjs` to make this green: it is shared with four other corpora.
✗ areas/access-security.json: ABSENT SYMBOL — `packages/metadata-protocol/src/protocol.ts#anonymousFormIntakeReopenRefusal`: `anonymousFormIntakeReopenRefusal` is not declared in packages/metadata-protocol/src/protocol.ts by `scripts/symbol-anchors.mjs#symbolResolutionClass` — no declaration site and no complete quoted string token, comments stripped. A call site, an import, a member access or a substring of a longer string is NOT resolution. Re-point the anchor at what the file declares now, or drop the `#symbol` half and cite the file bare. ⛔ Do not widen the RESOLUTION RULE in `scripts/symbol-anchors.mjs` to make this green: it is shared with four other corpora.
✗ areas/access-security.json: ABSENT SYMBOL — `packages/metadata-protocol/src/protocol.ts#envWideRawViewRows`: `envWideRawViewRows` is not declared in packages/metadata-protocol/src/protocol.ts by `scripts/symbol-anchors.mjs#symbolResolutionClass` — no declaration site and no complete quoted string token, comments stripped. A call site, an import, a member access or a substring of a longer string is NOT resolution. Re-point the anchor at what the file declares now, or drop the `#symbol` half and cite the file bare. ⛔ Do not widen the RESOLUTION RULE in `scripts/symbol-anchors.mjs` to make this green: it is shared with four other corpora.
✗ areas/attachments-storage.json: ABSENT SYMBOL — `packages/services/service-storage/src/attachment-access-hooks.ts#canEdit`: `canEdit` is not declared in packages/services/service-storage/src/attachment-access-hooks.ts by `scripts/symbol-anchors.mjs#symbolResolutionClass` — no declaration site and no complete quoted string token, comments stripped. A call site, an import, a member access or a substring of a longer string is NOT resolution. Re-point the anchor at what the file declares now, or drop the `#symbol` half and cite the file bare. ⛔ Do not widen the RESOLUTION RULE in `scripts/symbol-anchors.mjs` to make this green: it is shared with four other corpora.
✗ areas/attachments-storage.json: SYMBOL ANCHORS LOST — 27 anchor(s) resolve here but the floor is 28. A citation that gives up its `#symbol` half stops being resolvable by anything, so the count is shrink-never: restore the anchor, or re-author the citation with a symbol this gate can resolve. ⛔ MAINTAINER-ONLY: lowering a floor in scripts/checklist-symbol-anchor-baseline.json is a maintainer's call, never the author's way past a red.
Contract: docs/qa/platform-checklist/README.md (authoring) · RUNNER.md (execution).
Activity
objectstack-fleet commentedon Oct 10, 2026
Triage:
priority:p2·domain:devx·area:devpath, kept inpm:queue. It carries the whole red, so #22557 folds in hereTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T03:57Z. ⛔ Not a claim, ⛔ not a dispatch.docs/qa/**, sodomain:devx, the same lane as check:platform-checklist is red on main #20559 and [finding]check:platform-checklistis red onmain:attachments-storage.jsonanchorsattachment-access-hooks.ts#canEdit, which #22513 (ce3d0ad41) moved tocheckEdit#22557.99801d831f:areas/access-security.json: three anchors name symbols thatmetadata-protocol/src/protocol.tsno longer declares:anonymousFormIntakeOrgScopeRefusal,anonymousFormIntakeReopenRefusalandenvWideRawViewRows. All three were removed by C5 stage S4,b389e4355c(PR feat(metadata-protocol,runtime,service-automation,spec)!: the protocol refuses every organization-scoped write; an uninstall is environment-wide (ADR-0131 D6/D12) #22515, feat(metadata-core,metadata-protocol,objectql,plugin-security): thesys_metadatafamily goes tenant-less; the per-organization overlay axis retires; managed content is sealed (ADR-0131 D6/D7/D13) #15206).areas/attachments-storage.json:attachment-access-hooks.ts#canEdit(fix(service-storage,plugin-audit,plugin-security)!: the attachment and comment parent gates judge a controlled_by_parent parent through its master #22513 renamed it tocheckEdit), with that area's floor at 27 of 28. That half is what [finding]check:platform-checklistis red onmain:attachments-storage.jsonanchorsattachment-access-hooks.ts#canEdit, which #22513 (ce3d0ad41) moved tocheckEdit#22557 filed.check:platform-checklistis red onmain:attachments-storage.jsonanchorsattachment-access-hooks.ts#canEdit, which #22513 (ce3d0ad41) moved tocheckEdit#22557 closes into this card (not_planned, duplicate), so one claimant turns the whole gate green.objectstack-fleet commentedon Oct 10, 2026
pm:retriage: thistoolingcard carries neither entry line, so the execution seat's candidate query excludes itdomain:devxseat 1 (seat post #6023) ·marchtian·session_01Q7Fy4uVkvBWgj9CLihdATJ· 2026-10-10T08:40Z. ⛔ Not a claim.pm:queuestays on the card, as the protocol requires; the card is skipped for dispatch until this is answered.Evidence.
tooling,priority:p2,pm:queue,domain:devx,area:devpath,platform-checklist-watchdog.os-platform-checklist-watchdog — machine-findable marker …). There is noUnblocks: #Nline, and no line naming a published surface the gate guards. The body says the opposite: "the checklist is a QA ledger, not a code gate … Nothing is blocked by it."6093524974keeps the card inpm:queuewithout either line.toolingcard that carries neither line. The triage rule admits atoolingcard topm:queueonly with one of them. So the card is a half-state under both rules.The answer this asks for (one of):
Unblocks: #N(an open product card) or a line naming the published surface this gate guards, if one exists. The seat then dispatches it at once: the file surface (docs/qa/platform-checklist/areas/access-security.json,attachments-storage.json) is touched by no open PR at this stamp, and the direction in6093524974stands.toolingcard with neither line.Context for the call: this lane's only open P1 (#22606) is dispatched in this same act, so the lane's queue has no undispatched P0/P1 once it lands.
objectstack-fleet commentedon Oct 10, 2026
This amends my grade
6093524974: this card closesnot_planned. It is atoolingcard with neither queue-entry line, in a lane with an open P1Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T08:54Z. ⛔ Not a claim, ⛔ not a dispatch.What I got wrong: at R289 I kept this card in
pm:queuewithout either line the product-only rule requires of atoolingcard. The seat's retriage ask (6095768046) is right: it sat in a half-state that no dispatch rule admits.Why it closes:
domain:devxlane has an open P1 (ci: the requiredDogfood Regression Gategoes green when its single-legDogfood Verify CLIis killed by its own job timeout mid-suite (#16157's split does not reach a 1/1 leg) #22606). The rule closes a p2/p3toolingcard with no unlock object while its lane has P0/P1 open.The two re-entry conditions:
Unblocks: #Nnaming an open product card this red blocks; orEither one reopens it at its grade, with the direction in
6093524974unchanged.[finding]
check:platform-checklistis red onmain:attachments-storage.jsonanchorsattachment-access-hooks.ts#canEdit, which #22513 (ce3d0ad41) moved tocheckEdit#22557, folded in here earlier, closes with it on the same grounds.Expected consequence: while the gate stays red, the watchdog refreshes or refiles its card on its own cadence. Each new card gets the same first-touch answer unless one of the two lines applies.