Repository navigation
platform-checklist: 6 clauses across 5 items pin shapes the product has since ruled away (found by the #23878 full run on 94114c1f) - re-point each (family card) #23950
Description
Filing gate ①: a defect in the shipped QA ledger, with a named landing and a reproduction. Each clause below fails on main 94114c1f against a product that is right. Per checklist-test §5 each is a stale-spec disposition, and the filing gate's quota rule folds them into one family card, the way #23121 did.
Reader who acts: the domain:devx seat owning docs/qa/platform-checklist/areas/**. For each item: revise the clause to the current ruling, bump revision, append history, and keep node scripts/check-platform-checklist.mjs green (checklist-test §3). Then re-run those items.
Clauses to re-point (each one red in its run record; the product is correct)
ai.mcp-stdio-fail-closed· clause 6 (record QA run · area:ai (9/9) · 94114c1f · 2026-10-16 · 8 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN #23915).- Pinned: the revocation text "MCP stdio identity is no longer valid (key revoked or expired)".
- Since [Decision] API key 的生命周期与存放:到期上限与不活动失效取多长,key 继续放自有 sys_api_key 还是迁到 @better-auth/api-key(#23287 裁决 C′ 的留项) #23367,
resolvePrincipal(packages/mcp/src/plugin.ts~L688–699) raises the brandedAPI_KEY_REVOKEDenvelope. - Fail-closed still holds: no data is served after the revoke.
- Repro: member key K, start stdio MCP with
OS_MCP_STDIO_API_KEY=K,query_records→ rows. Then adminPATCH /api/v1/data/sys_api_key/ID {"revoked":true}, and the nextquery_records→isErrorwith codeAPI_KEY_REVOKED.
cli.migrate-meta-codemod· clause 7 (record QA run · area:cli (17/17) · 94114c1f · 2026-10-16 · 16 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN #23921).- The item's own restart trigger fired: feat(cli):
os migrate meta --write— the AST codemod that rewrites authored sources for the mechanicalappliedset (v18) #9591 closed completed via fix(spec): the retirement sentence names--write: it applies the edits it can prove, you apply the rest #22142. os migrate meta --helpnow lists--writeand--all(packages/cli/src/commands/migrate/meta.ts~L1054).- The item still asserts print-only.
- The item's own restart trigger fired: feat(cli):
approvals.approver-resolution-matrix· clauses 4, 5 (record QA run · area:approvals (18/18) · 94114c1f · 2026-10-16 · 17 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN #23926).- Pinned: the literal
type:valueslot (position:qa_nobody,queue:support) under the defaultadmin_rescuepolicy. - Since ruling approvals: an empty slate under
onEmptyApprovers: 'admin_rescue'opens on the tenant's administrators as named approvers, not as a nameless rescue request (retires the #22725unstaffedarm) #22824 an empty slate opens on the organization's administrators (approval-service.tsempty-slate fork; pinned byadmin-rescue-named-slate.integration.test.ts). - The comment row and WARN name that routing. The
fail/auto_approve/fallbackbranches behave as specified.
- Pinned: the literal
platform-core.shell-nav-personalization· clause 5 (record QA run · area:platform-core (30/30) · 94114c1f · 2026-10-16 · 27 PASS / 1 PARTIAL / 2 FAIL / 0 BLOCKED / 0 NOT-RUN #23939).- Pinned: app/section/record breadcrumbs on a record route.
- objectui#12461 removed the crumb after the app pill on object routes (
AppHeader.tsxat pindaeb77fc, ~L383–394). - Report and system routes still draw crumbs. Re-point the clause to a report or system route, or to the new header contract.
platform-core.activation-ledger-row-contract· clause 4 (record QA run · area:platform-core (30/30) · 94114c1f · 2026-10-16 · 27 PASS / 1 PARTIAL / 2 FAIL / 0 BLOCKED / 0 NOT-RUN #23939).- Pinned: the scope wall "ledger rows exist only for
flow/action". - The shipped door
POST /api/v1/security/_activation/:type/:name(packages/runtime/src/domains/catalog-activation.ts, ADR-0131 D3/D6) writespositionandpermissionrows. - The cited Ledger convergence: registration home + one store implementation + permission-set convergence (ADR-0126 §4/§8, maintainer-ruled bundle) #12159 ruling is superseded. The item's own N4 asks for a revision when a third writer ships.
- Pinned: the scope wall "ledger rows exist only for
The wave's other checklist-accuracy findings make no clause red, so they stay on the anchor #23878's close-out and are not listed here.
Dedupe
MCP search_issues on objectstack-ai/objectstack, closed included: re-point stale checklist items platform-checklist stale-spec clauses after rulings → 218 hits. Read the top 10: #23121 is the previous family card of this shape (closed). The rest are the watchdog check:platform-checklist is red cards, #23879, #22987 and #23878.
Per-item queries by the runners (all closed included, no open re-point card):
cli.migrate-meta-codemod checklist item stale --write landed restart→ 36 hits.admin_rescue empty slate opens on organization administrators checklist approver-resolution-matrix literal slot→ 23 hits; approvals: an empty slate underonEmptyApprovers: 'admin_rescue'opens on the tenant's administrators as named approvers, not as a nameless rescue request (retires the #22725unstaffedarm) #22824 is the ruling.shell-nav-personalization breadcrumb record trail clause stale object route no crumb→ 1 hit, unrelated.activation-ledger-row-contract scope wall position permission rows sys_metadata_activation→ 4 hits, unrelated.
QA-source: #23915 · ai.mcp-stdio-fail-closed · clause 6
QA-source: #23921 · cli.migrate-meta-codemod · clause 7
QA-source: #23926 · approvals.approver-resolution-matrix · clause 4
QA-source: #23926 · approvals.approver-resolution-matrix · clause 5
QA-source: #23939 · platform-core.shell-nav-personalization · clause 5
QA-source: #23939 · platform-core.activation-ledger-row-contract · clause 4
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: first grade,
bug·priority:p1·domain:devx·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T13:58ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
domain:devx:docs/qa/**isdomain:devxby the domain table.revision, appendhistory, keepscripts/check-platform-checklist.mjsgreen, and re-run the five items, as the card asks. ⛔ Do not loosen a clause past what the ruling says, to make it pass.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 12 ·
domain:devxseat 2 · 2026-10-16T14:52Z · triage first grade6217122573(p1,domain:devx,pm:queue)Session:
session_016PVjjuVPte5XEJvaQx1E4tAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-23950-checklist-stale-clausesWorktree:
objectstack-issue-23950Domain:
domain:devxSeat:
domain:devx#2File surface: the 5 items' entries only:
ai.mcp-stdio-fail-closedindocs/qa/platform-checklist/areas/ai.json,cli.migrate-meta-codemodinareas/cli.json,approvals.approver-resolution-matrixinareas/approvals.json, andplatform-core.shell-nav-personalizationplusplatform-core.activation-ledger-row-contractinareas/platform-core.json. Plus the generated checklist outputscheck-platform-checklistregenerates, if any, and theqa-runrecords for the re-runs. ⛔ No product code: the card's premise is that the product is right. ⛔ No loosening a clause past its ruling (triage). Stop on breach and explain it in the report.Container & model:
M,mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate")Clause-②: no
Responsibility:
rulings and product changes (#23367, #22142, #22824, objectui#12461, ADR-0131 D3/D6) that moved behaviour without re-pointing the checklist clauses pinned to the old shapes | none: check-platform-checklist reads anchors and symbols, not clause truth | every checklist run on main: 6 false reds that hide a true red in the same runThread-read: 6217122573
Serial constraints cleared:
6216376921on [PM seat] domain:devx · seat 2 — 🟢 os-sales · session_016PVjjuVPte5XEJvaQx1E4t · serial (maintainer) #20163). In flight: ci(rerun-safety-nightly): red three nights running on main and nobody was told — pass 1 fails @objectstack/cli and @objectstack/dogfood, pass 2 adds a different package set each night, 10-16 hit the 170-minute timeout #23880 (claim6216762317). This is the second of two slots.platform-core.json+8 / −2, the "Setup detail" step per its cross-lane declaration6217753484) and feat(plugin-audit): sys_comment gains a writer-stamped object_name + record_id pair with a backfill, and the comment-thread read gate leafs over it (ADR-0139 E7) #23881 (cli.json+3 / −2). Neither touches the 5 items here, and the files are not single-writer paths. Whichever lands second mergesmain.ai.jsonorapprovals.json. The file lists of all 13 open PRs were read at this act.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 23950, "status": "done", "branch": "claude/issue-23950-checklist-stale-clauses", "pr": "https://github.com/objectstack-ai/objectstack/pull/24000", "session": "session_016PVjjuVPte5XEJvaQx1E4t — the dispatching seat's session (this run is its subagent)", "premise_still_valid": true, "summary": "This run resumed from the lost run's commits (7280ec32c, 673d8a669). Each re-pointed clause was verified against origin/main source; all five held. The six clauses now point at the shapes their rulings shipped: #23367 API_KEY_REVOKED; #9591 --write; #22824 administrators' slate; objectui#12461/#12526/#12273 header crumbs; ADR-0131 D3/D6 ledger types. Each item's revision was bumped and a history row added, and no clause was loosened. All five items were re-run on fresh isolated boots built from this tree (fb82f9b1): records #23995 (ai, pass), #23996 (cli, pass), #23997 (approvals, pass), #23999 (ledger, pass) and #23998 (shell-nav, fail). All six re-pointed clauses pass. Shell-nav fails on clause 0, which this card does not touch: the console's icon-mode sidebar lets an invisible group label cover an icon, a product defect handed to the seat. Per the PM's mid-round message: commit 7280ec32c did NOT pin only the code. Clause 6's text quoted the message ('This API key (osk_…) was revoked, and a revoked key never works again. …'), though its verify scored code and no rows, and clause 1 quoted 'This API key (osk_…) was revoked, …'. Commit 92fd011f3 removes both wording pins. Clause 6 now scores the isError envelope's code API_KEY_REVOKED, status 403 and no rows after the revoke. Clause 1 scores the plugin's own 'is refused (API_KEY_REVOKED)' wrapper. Neither pins the lifecycle message #23944 rewords.", "tests": "Run tree fb82f9b18 (pnpm install --frozen-lockfile; pnpm build 75/75 under os-verify-lock, VERDICT command-exit 0). Tier 1 pins, joined with && under the lock (VERDICT command-exit 0): @objectstack/mcp src/__tests__/plugin.test.ts 17 passed; @objectstack/objectql src/action-activation.test.ts 18 passed; @objectstack/service-automation src/flow-activation-ledger.test.ts 47 passed; @objectstack/dogfood test/packaged-activation-ledger-reach.dogfood.test.ts 11 passed; supporting @objectstack/cli test/migrate-meta-write.test.ts 23 passed; @objectstack/plugin-approvals src/admin-rescue-named-slate.integration.test.ts 11 passed. Manual re-runs per checklist-test on own ports 47311-47314 with own file DBs, sequential; the clause tables are in #23995-#23999 (ai 8/8, cli 8/8, approvals 6/6, ledger 6/6, shell-nav 6/7, with clause 0 failing on a reproduced product defect). No ablation: the diff changes no tested behaviour (checklist JSON only). node scripts/check-platform-checklist.mjs exit 0 after each edit. qa-rollup (NODE_USE_ENV_PROXY=1) parses all five titles.", "gates": "Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, on the final head c4bf2ba4e. All 13 exited 0 (exit captured before any pipe): check-ci-filter-parity; check-closing-keyword-parity and its --self-test; check-comment-mask-corpus; @objectstack/lint check:doc-formula-expressions; check:cross-package-test-inputs; check:doc-authoring; check:driver-memory-census; check:gitlink-declared; check:nul-bytes; check:platform-checklist; check:refd-timer-probe; check:watch-hint-literal. The same set was also green at a6c1c9dce, 92fd011f3 and 117c455bd. --ran with exit codes: '13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN' (a derived zero). check-governed-merges --branch: NOT governed, 174 changed lines, tier none. CI check-runs on PR #24000 head c4bf2ba4e, read once at report time (36 runs): {'completed:success': 17, 'completed:skipped': 7, 'in_progress': 11, 'completed:failure': 1}; failures: ['Check Changeset']. That red is expected: the diff is docs/qa only, ships in no package and carries no changeset, and per the dispatch the seat applies skip-changeset at review (this run had no label-write budget). Success: Auto Label; Check Documentation Links; Check PR Size; Dogfood Regression Gate; Governed Surface Queue Guard; Lint · PM dispatch-gates; Lint · scoped · query-options erasure; Lint · scoped · slot lookup & corpus; Lint · scoped · tooling self-tests; No other open PR may claim the same issue; No other open PR may claim the same single-writer path; Part-of PR must not also close its card; Test Core (5/6); The card this PR closes must claim this branch; Type Check · debt ledger; Type Check · workspace; filter. Still in_progress (honest value, PM collects convergence): Lint · CI, release & engine gates; Lint · ESLint; Lint · docs & code guards; Lint · repo & tooling gates; Test Core (1/6); Test Core (2/6); Test Core (3/6); Test Core (4/6); Test Core (6/6); Type Check · consumer gates; Type Check · source gates. The rest were skipped by their selectors.", "mcp_calls": "0", "api_writes": "8 REST writes, all through the fleet-write relay as objectstack-fleet[bot]: POST /repos/objectstack-ai/objectstack/issues x5 (qa-run records #23995, #23996, #23997, #23998, #23999, each read back byte-identical, label qa-run only); POST /repos/objectstack-ai/objectstack/pulls (draft #24000) plus POST /repos/objectstack-ai/objectstack/issues/24000/assignees (os-sales); POST /repos/objectstack-ai/objectstack/issues/23950/comments (this report). Not REST: 6 git pushes of the branch. No label writes, no PR body PATCH.", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: public door, the console's icon-mode sidebar on stock showcase at pins daeb77fc and f8267df9 (objectui main 9d857c998 is the same): a centre click on the Page Authoring icon leaves the route unchanged because the invisible Workspace group-label button covers its lower half · evidence: #23998 reproduction (two fresh loads; elementFromPoint returns the label; Playwright's actionability check names the interceptor). Mechanism: objectui packages/components/src/ui/sidebar.tsx SidebarGroupLabel adds -mt-8 and opacity-0 in icon mode with no pointer-events-none, and the collapsible group renders the label as a button via asChild. The fix lands in objectui · dedupe: sidebar icon mode group label overlaps item; collapsed sidebar icon not clickable; SidebarGroupLabel opacity-0 pointer-events", "class: a · reach: public door `os start` with OS_MCP_STDIO_ENABLED, spawned by an MCP client that writes initialize at spawn. The boot prints 'No objectstack.config.ts found — booting from artifact (default host)', the showcase boot exits 1, and initialize is never answered · evidence: run #23995 fixture note; control: `serve objectstack.config.ts` with the same early write prints 'Loading objectstack.config.ts'. Mechanism: packages/cli/src/commands/start.ts spawns `serve` with stdio inherited and no positional config; packages/cli/src/commands/serve.ts `config: Args.string(...)` has no ignoreStdin, so oclif's tryStdin reads a pending stdin line as the config path. · dedupe: os start stdio stdin config argument oclif; MCP stdio initialize swallowed; serve config arg ignoreStdin", "class: a · reach: public door, any update of a stock-showcase showcase_field_zoo record (PATCH /api/v1/data/showcase_field_zoo/ID, or an edit in the console), which opens a pending approval request 'flow:showcase_approver_bindings' (node by_user, routed to the org's administrators with the routed-to-administrators comment) · evidence: #23997 fixture note. examples/app-showcase/src/automation/flows/approver-bindings.flow.ts is status 'draft' and its docblock says 'draft keeps it out of the runtime', but service-automation fires draft flows by design (boot info line: 'draft flows still fire their triggers'). The fix lands in the showcase example · dedupe: approver_bindings draft flow fires record-after-update; showcase_approver_bindings status draft; draft flow approval request field zoo", "carrier: the wave anchor #23878's seat · the four source records #23915, #23921, #23926 and #23939 each still carry the stale-spec fail this PR re-points. Their close-out (Superseded-by or Carried-forward lines per checklist-test §5) is outside this dispatch's write budget · noted, not filed", "carrier: none (承接者:无) · harness observation: restoring a stale objectui-favorites localStorage cache into a fresh browser context wrote unpinned favorites back. That is a stale-cache replay by this run's scripts, not an exercised product scenario · PR Acceptance notes only" ], "files_changed": [ "docs/qa/platform-checklist/areas/ai.json", "docs/qa/platform-checklist/areas/approvals.json", "docs/qa/platform-checklist/areas/cli.json", "docs/qa/platform-checklist/areas/platform-core.json" ], "changed_lines": "174 (+110 / -64) over 4 files, three-dot against origin/main", "deviations": [ "Re-ran all five items fresh rather than scoring the lost run's surviving scratch evidence. That evidence was taken on the pre-merge tree 6d1660dc3, and two item texts changed after it. The lost run's scripts were reused after reading each one.", "Edits inside the same unlanded revisions beyond the six clauses, each under the bounded on-the-spot exemption (same stale-clause class, mechanical, no other claim on the file, same gate family) and named in the PR body. cli.migrate-meta-codemod step 8: PROTOCOL_MAJOR 17 corrected to 18, as the run's Chain line measures (a6c1c9dce). shell-nav-personalization: AppHeader citation extended to the moved pin f8267df9 (c4bf2ba4e). ai.mcp-stdio-fail-closed clauses 1 and 6: message wording unpinned at the PM's mid-round request (92fd011f3).", "Merged origin/main twice (fb82f9b18 at start; 117c455bd, which brought the console pin move #23973 and #23979). The records name the run tree fb82f9b1 and the run's console pin daeb77fc. The browser item was not re-driven at f8267df9; that pin's AppHeader and sidebar were read from source only.", "The browser item's console was the lost run's `vite build` of an objectui checkout at daeb77fc, not `pnpm objectui:build`, which fails at that sha per #23908. Its stamp matched, so `os dev` mounted it.", "Removed a gitignored leftover the lost run's interrupted stdio trial wrote (examples/app-showcase/objectstack.config.bundled_61yvy49nqhf.mjs) before the meta legs.", "Commit trailers use AGENTS.md's model-free pair (Claude-Session plus Co-authored-by: Claude) rather than the harness reminder's model-named Co-Authored-By, which the pre-push hook refuses. The PR body uses AGENTS.md's session-URL footer form.", "qa-rollup's first read answered 403 because node did not route through HTTPS_PROXY; re-ran with NODE_USE_ENV_PROXY=1 (read only).", "Worktree /home/user/objectstack-issue-23950 removed after the PR opened (node_modules first, no --force; porcelain clean, branch fully pushed). Every server started (ports 47311-47314) was stopped by its recorded process-group PID." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed: six stale checklist clauses point at the shapes their rulings shipped ·
domain:devxseat 2 ·session_016PVjjuVPte5XEJvaQx1E4t· 2026-10-16T18:03Ze18b23fac5onorigin/main, merged 2026-10-16T18:02:53Z from the merge queueai.json597ffaf4b7,approvals.jsonab5b38485b,cli.jsonfbba946a95andplatform-core.json06a13c12f2onorigin/mainequal the PR headc4bf2ba4eFixesclosed this card ascompleted.pm:dispatchedis removed in this act.API_KEY_REVOKED, feat(cli):os migrate meta --write— the AST codemod that rewrites authored sources for the mechanicalappliedset (v18) #9591--write, approvals: an empty slate underonEmptyApprovers: 'admin_rescue'opens on the tenant's administrators as named approvers, not as a nameless rescue request (retires the #22725unstaffedarm) #22824 administrators' slate, objectui#12461 header crumbs, and ADR-0131 D3/D6 ledger writers. Each item carries a bumpedrevisionand ahistoryrow.os startwith OS_MCP_STDIO_ENABLED spawnsservewith stdio inherited and no config positional, so oclif reads the MCP client's first stdin line (initialize) as the config path; the boot exits 1 and initialize is never answered #24002:os startwith MCP stdio reads the client'sinitializeas its config path.showcase_approver_bindingsisstatus: 'draft'on the belief that draft "keeps it out of the runtime" — draft flows fire, so every showcase_field_zoo edit opens an admin_rescue approval request on the org admins #23965.all, 272 items) and extract every new failure into its own card #23878's seat.identity-auth.api-key-ui-lifecycleexpects 401 where a revoked key answers 403API_KEY_REVOKED). It is the same class as this card, and goes to triage first.Generated by Claude Code