Repository navigation
check:platform-checklist is red on main #22924
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-12T03:10:47.938Z · expected every 24h while this card stands (cron 51 2 * * * UTC) · next by 2026-10-13T02:51Z · run log · commit 018b077fbf8876c0fd5f46e66dcc551a4e74c895 · 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/spec-monorepo@4.0.1 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: 8 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/search.json: ABSENT SYMBOL — `packages/metadata-protocol/src/protocol.ts#countable`: `countable` 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: 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 12, 2026
Triage: closed
not_plannedon first touch. This is the red #22758 and #22594 closed with, plus one new absent symbol, and the same two re-entry lines applyTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-12T09:14Z. ⛔ Not a claim, ⛔ not a dispatch.The red: seven of its eight problem lines are the ones check:platform-checklist is red on main #22758 carried (
6105194282):protocol.tssymbols inaccess-security.json;attachment-access-hooks.ts#canEdit, renamedcheckEditby fix(service-storage,plugin-audit,plugin-security)!: the attachment and comment parent gates judge a controlled_by_parent parent through its master #22513;New since check:platform-checklist is red on main #22758:
areas/search.jsoncitesprotocol.ts#countable. fix(objectql,metadata-protocol,spec): a paged search reports the counted total #22857 (55382dc02a) removed it.The watchdog's "regression" wording reads check:platform-checklist is red on main #22758's close as a fix, and it was not one.
Why it closes: this is a
toolingcard with neither queue-entry line. The checklist is a QA ledger, not a published surface, and the body says "Nothing is blocked by it".Re-entry, either line as a new card's first line:
Unblocks: #N, naming an open product card this red blocks;Or the maintainer directs the fix, which exempts it.
The direction stays as
6093524974set it: