Repository navigation
docs(qa): re-point six stale platform-checklist clauses across five items to the shapes their rulings shipped - #24000
Conversation
…he shapes their rulings shipped - ai.mcp-stdio-fail-closed r5: a revoked key's next stdio call answers the API_KEY_REVOKED lifecycle envelope (403), not the generic text; the up-front admission names both refusals. - cli.migrate-meta-codemod r5: the restart trigger fired (--write landed), so the write contract replaces the print-only flag-surface clause. - approvals.approver-resolution-matrix r3: an empty admin_rescue slate (and the queue dead slot) opens on the organization's administrators. - platform-core.shell-nav-personalization r3: header crumbs follow the route (report and system draw them, object routes draw none). - platform-core.activation-ledger-row-contract r3: the scope wall is the four types the shipped doors write (flow, action, position, permission). Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
… re-runs measured - cli.migrate-meta-codemod: the stock showcase is not canonical for the 17 -> 18 replay (three edge-branched decisions omit mode); the canonical source is the tree the write leg wrote, and the identical-run diff normalizes the elapsed-time stamp. - approvals.approver-resolution-matrix: the data API refuses sys_team / sys_team_member writes and sys_user.manager_id; the fixtures name the organization team doors and set-user-manager instead. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
…ecklist-stale-clauses
…ecklist-stale-clauses
…e runtime now implements The re-run printed `Chain: protocol 16 -> 18 (this runtime implements protocol 18)`: PROTOCOL_VERSION is 18 since #22215, so the --to default (meta.ts CHAIN_TERMINUS_MAJOR, the higher of PROTOCOL_MAJOR and the registries' highest step) is 18 on both counts, not ahead of a PROTOCOL_MAJOR 17. The measured --from 17 / --from 18 expectations are unchanged; the revision 5 history row records the correction. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
… code, not its wording
Clause 6 and clause 1 quoted the API_KEY_REVOKED message ("a revoked key
never works again"), which the lifecycle owner is rewording now that
restore_api_key can bring a revoked key back. The clauses keep everything
that makes them fail-closed: the post-revoke call is an isError envelope with
code API_KEY_REVOKED and status 403 and serves no row, and the up-front
admission refuses with `is refused (API_KEY_REVOKED)`. The message's wording
is no longer pinned.
Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t
Co-authored-by: Claude <noreply@anthropic.com>
…ecklist-stale-clauses
… moved console pin too The console pin moved from daeb77fc to f8267df9 while revision 3 was open. AppHeader at f8267df9 adds the product mark and a rule before the app pill (objectui#12605) and draws the same crumbs after the PREVIEW chip, so the re-pointed clause is unchanged; the source line and the revision 3 history row now say it was read at both pins. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
席位核对 · ACCEPT · PR #24000 (draft, head
|
Fixes #23950
Clause-②: no
Six platform-checklist clauses across five items pinned shapes that rulings and PRs have since moved. Each was red in a QA run against a product that is right. This PR re-points each clause to the shape that shipped. Each item's
revisionis bumped and ahistoryrow names #23950 and the ruling or PR that moved the shape. No clause is loosened past its ruling: each one still fails if the product broke the ruled behaviour. The diff isdocs/qa/platform-checklist/areas/{ai,cli,approvals,platform-core}.jsononly (+110 / −64, four files). No product code changes.All five items were re-run against a real showcase boot built from this tree's product sources (
fb82f9b1, whose product tree isorigin/main022c6e799). One record per item: #23995, #23996, #23997, #23998, #23999. The six re-pointed clauses all pass. One item,platform-core.shell-nav-personalization, fails on a different clause (0, icon-mode navigation) because of a console defect this run found. That clause is not one this card touches (see Acceptance notes).Per clause
1.
ai.mcp-stdio-fail-closedclause 6 (r4 → r5; from record #23915)MCP stdio identity is no longer valid (key revoked or expired), scored from a log line.API_KEY_REVOKEDand status 403. A pre-revoke read on the same session is the control. The oracle is the tool result (api). The message's wording is not pinned: the code is what a client branches on, and API key refusal API_KEY_REVOKED says "a revoked key never works again", but the declared restore_api_key action brings the same key back to 200 #23944 is rewording that text.packages/mcp/src/plugin.tsresolvePrincipal([Decision] API key 的生命周期与存放:到期上限与不活动失效取多长,key 继续放自有 sys_api_key 还是迁到 @better-auth/api-key(#23287 裁决 C′ 的留项) #23367; it raisesApiKeyLifecycleRefusalError),packages/core/src/security/api-key.ts#lifecycleRefusalOf, andpackages/mcp/src/mcp-http-tools.ts#errorResultWithCode.PATCH /api/v1/data/sys_api_key/KEY_ID {"revoked": true}(200), the nextquery_recordsreturns isError with{"error": {"code": "API_KEY_REVOKED", "status": 403, …}}and norecordskey.2.
cli.migrate-meta-codemodclause 7 (r4 → r5; from record #23921)--helplists exactly from/to/step/out/stored/database-url/apply/yes/force/type/json, with no in-place rewrite flag".os migrate meta --write— the AST codemod that rewrites authored sources for the mechanicalappliedset (v18) #9591 is done:--writelanded in PR feat(cli): os migrate meta --write — write the chain's mechanical edits into the authored sources #22108, and PR fix(spec): the retirement sentence names--write: it applies the edits it can prove, you apply the rest #22142 named it in the house sentence). As revision 3 prescribed, the rewrite assertions come back rather than the clause being deleted.--writerewrites in place exactly the mechanical edits it can trace to one literal in one project file. It lists every other edit with a closed-set refusal kind and writes no semantic advisory. Every byte outside a written site is unchanged. The write is held to a re-run of the chain (restored, exit 1, on disagreement). A second--writewrites nothing.packages/cli/src/commands/migrate/meta.ts#printWriteOutcomeandMigrateMeta.writeSources,packages/cli/src/utils/authored-source-codemod.ts#CodemodRefusalKind, and thepackages/cli/test/migrate-meta-write.test.tspin.Wrote 7 of 7 mechanical change(s) into 4 file(s).Re-ran the chain over the written sources: no mechanical change remains.diff -rtouches only the 7 listed sites. The second--writeprints the no-change line.--write --json:write.statuswritten. A helper-built plant was refused as[helper], which the item's knownGap names as the contract working.3.
approvals.approver-resolution-matrixclauses 4 and 5 (r2 → r3; from record #23926)admin_rescue, the request opened on the literaltype:valueslot (position:qa_nobody,queue:support) and waited for the Approval routed to an empty position permanently locks the record (no admin override, no recovery) #3424 override.onEmptyApprovers: 'admin_rescue'opens on the tenant's administrators as named approvers, not as a nameless rescue request (retires the #22725unstaffedarm) #22824 ruling (PR feat(plugin-approvals): an empty admin_rescue slate opens on the organization's administrators; retire the unstaffed arm #22850), an empty slate opens on the request organization's administrators as ordinary approvers. The abandoned literal and its reason are recorded innode_config_json.__resolvedFrom(admin_rescue:abandoned,admin_rescue:reason). A routed-to-administrators system comment lands on the request, a WARN names the routing, and the request stays pending. The queue clause keeps its 审批节点「处理人 Value」应改为记录 lookup(现查 metadata 端点→只能手填);附 approver value 语义核实 + queue 未实现 #3508 warn and its never-a-fake-approval property. The fail, auto_approve and fallback legs are unchanged. A new negative fails the retired nameless request.packages/plugins/plugin-approvals/src/approval-service.ts#organizationAdministratorsandemptySlateReason, and theadmin-rescue-named-slate.integration.test.tspin (11/11 green on this tree).organization_admin(_no_bypass): here, only the org owner. admin_rescue and queue requests open on [the owner], with the abandoned literal in__resolvedFromand the commentRouted to this organization's administrators because the approver slate named no one: …. auto_approve'sreview.autoApprovedreadstrueon the approve edge.4.
platform-core.shell-nav-personalizationclause 5 (r2 → r3; from record #23939)system/*route drawsSystemthen its section. An object route (list, view, record) draws no crumb after the PREVIEW chip. Crumbs are plain text and rebuild on reload. "Each crumb navigates" is withdrawn by that contract, not relaxed. The clause still fails if a crumb returns on an object route, if a report or system route loses its crumb, or if a type crumb comes back.packages/app-shell/src/layout/AppHeader.tsx(objectui#12461, objectui#12526, objectui#12273). It was read at the run's pindaeb77fcand again atf8267df9, the pinmainmoved to during this work (chore(objectui): move the console pin to f8267df93aba, past the spec deletion of checkPageComponentViewData #23973). objectui#12605 there only adds the product mark before the pill.Hours by Status (Summary).system/settings:System,Settings. Record: none, with the page headingFabrikam. 0 links after the chip. Identical after reload.5.
platform-core.activation-ledger-row-contractclause 4 (r2 → r3; from record #23939){flow, action}, and "a permission/position row is a FAIL" on the 2026-08-26 Ledger convergence: registration home + one store implementation + permission-set convergence (ADR-0126 §4/§8, maintainer-ruled bundle) #12159 ruling.:typeoutside the two (capability) and an audience anchor (everyone) answer 400 and leave no row. It still fails on a fifth type or an anchor row. The item's own knownGap asked for exactly this revision when a third writer shipped.packages/runtime/src/domains/catalog-activation.ts#handleCatalogActivationWriteandpackages/core/src/security/resolve-authz-context.ts#readDisabledCatalogNames.metadata_type{action, flow, permission, position}. The capability probe answers 400 (:type one of position, permission) and theeveryoneprobe answers 400 (audience anchor); the row count is unchanged after both.Other edits inside the same revisions, each re-measured on the re-run
ai.mcp-stdio-fail-closedclause 1: same ruling, same item. The up-front admission refuses a lifecycle-refused key with[MCP] OS_MCP_STDIO_API_KEY is refused (API_KEY_REVOKED): …, not the did-not-resolve text. The clause now names both refusals, and a new step restarts with the just-revoked key. Measured: exit 1 with that line. Neither clause pins the lifecycle message's wording.cli.migrate-meta-codemod: the title, fixtures, third knownGap, step 2 (the current house sentence), clause 1 (scoped to runs without--write) and the mutation negative follow feat(cli):os migrate meta --write— the AST codemod that rewrites authored sources for the mechanicalappliedset (v18) #9591. Measured on the re-run and corrected in the same revision:--from 17, but it lists 3flow-decision-mode-inclusive-explicitedits. The canonical source is now the tree the write leg wrote, and the identical-run diff normalizes the(Nms)stamp.Chain:line prints.approvals.approver-resolution-matrixfixtures: the data API refusessys_teamwrites (measured 405) andsys_user.manager_id(measured 403). The fixtures name the doors that work instead:POST /api/v1/auth/organization/create-teamandadd-team-member, andPOST /api/v1/auth/admin/set-user-manager.platform-core.activation-ledger-row-contract: steps 1 and 5 flip and re-enable all four switches (clause 3 follows). The variants, the knownGap's writer list, the title, a negative and the sources follow, and the Ledger convergence: registration home + one store implementation + permission-set convergence (ADR-0126 §4/§8, maintainer-ruled bundle) #12159 citation is marked superseded.Verification (final head
c4bf2ba4e)Gate list derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack. It reports 13 commands, and each exited 0 with its exit captured before any pipe:check-ci-filter-paritycheck-closing-keyword-parityand its--self-testcheck-comment-mask-corpus@objectstack/lint check:doc-formula-expressionscheck:cross-package-test-inputscheck:doc-authoringcheck:driver-memory-censuscheck:gitlink-declaredcheck:nul-bytescheck:platform-checklistcheck:refd-timer-probecheck:watch-hint-literal--ranwith exit codes:13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN.check-governed-merges --branch: NOT governed, 174 changed lines. Tier 1 pins on the run tree: mcpplugin.test.ts17/17, objectqlaction-activation.test.ts18/18, service-automationflow-activation-ledger.test.ts47/47, dogfoodpackaged-activation-ledger-reach11/11. Supporting suites: climigrate-meta-write.test.ts23/23 and plugin-approvalsadmin-rescue-named-slate11/11.docs/qa/**ships in no package, so no changeset.Acceptance notes
SidebarGroupLabel:-mt-8andopacity-0, with pointer events still on) covers the lower half of the item above it. On stock showcase the Page Authoring icon does not route on a centre click. This isplatform-core.shell-nav-personalizationclause 0's fail in QA run · platform-core.shell-nav-personalization (1/1) · fb82f9b1 · 2026-10-16 · 0 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN #23998, with a full reproduction there.os startused as an MCP stdio host: a client that writesinitializeat spawn has that line read asserve's positionalconfigargument. The boot falls back to the artifact on the default host, and theinitializegoes unanswered.showcase_approver_bindingsisstatus: 'draft'and its docblock says that keeps it out of the runtime, but draft flows fire their triggers. Everyshowcase_field_zooupdate opens an admin_rescue approval request.objectui-favoritescache brought an unpinned entry back. That is this harness replaying old state, noted in QA run · platform-core.shell-nav-personalization (1/1) · fb82f9b1 · 2026-10-16 · 0 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN #23998.examples/app-showcase/objectstack.config.bundled_*.mjs(gitignored) in the worktree. It was removed before the re-run.vite buildof an objectui checkout at the pin. It carries nosdui.manifest.json, which only the boot's page-source warning reads.Generated by Claude Code