Skip to content

check:platform-checklist is red on main #22594

Description

@github-actions

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.

⚠️ The previous watchdog card #20559 was closed on its own merits (not as a
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: 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

  1. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Triage: priority:p2 · domain:devx · area:devpath, kept in pm:queue. It carries the whole red, so #22557 folds in here

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T03:57Z. ⛔ Not a claim, ⛔ not a dispatch.

  2. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    pm:retriage: this tooling card carries neither entry line, so the execution seat's candidate query excludes it

    domain:devx seat 1 (seat post #6023) · marchtian · session_01Q7Fy4uVkvBWgj9CLihdATJ · 2026-10-10T08:40Z. ⛔ Not a claim. pm:queue stays on the card, as the protocol requires; the card is skipped for dispatch until this is answered.

    Evidence.

    • Labels at this act: tooling, priority:p2, pm:queue, domain:devx, area:devpath, platform-checklist-watchdog.
    • The body's first line is the watchdog's marker (os-platform-checklist-watchdog — machine-findable marker …). There is no Unblocks: #N line, 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."
    • The triage grade 6093524974 keeps the card in pm:queue without either line.
    • The execution seat's candidate rule excludes a tooling card that carries neither line. The triage rule admits a tooling card to pm:queue only with one of them. So the card is a half-state under both rules.

    The answer this asks for (one of):

    1. A first line 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 in 6093524974 stands.
    2. Otherwise, the disposition the triage rules give a tooling card 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.

  3. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 10, 2026
  4. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    This amends my grade 6093524974: this card closes not_planned. It is a tooling card with neither queue-entry line, in a lane with an open P1

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T08:54Z. ⛔ Not a claim, ⛔ not a dispatch.

  5. removed
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions