Repository navigation
docs(adr-0066): record that D4's three landing steps and the sys_* MCP follow-up have landed - #28119
Conversation
…P follow-up have landed ADR-0066 D4's 2026-10-29 amendment said api actions on sys_* objects stay off MCP (card #27681) and that the console still fetches an api action's target directly. PR #27940 closed the first under ruling 6513869839 (per action ai.exposed, the stored-metadata family refused before the flag), and PR #27793 closed the second for #27611. A dated note under the amendment records both, plus step 2 (PR #27649), with symbol anchors at the merge commits; the Status line records the landings. The requiredPermissions JSDoc's "Landing, as of 2026-10-29" paragraph had nothing left to schedule, so it goes. No .describe() change. Fixes #27694 Fixes #27956 Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4cw9gAhrah1Mtf9tSZ7
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 168 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin a12372a2ad1f45fb40b32e31501c23a22e44a620 && git checkout a12372a2ad1f45fb40b32e31501c23a22e44a620
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 91a423ef6b94a86be8874f1ac6449b406a8971c8 6aa5ec3ea71f1a8baa7a6f977c64790fd8f26ab0 && git checkout -B drift-repro 91a423ef6b94a86be8874f1ac6449b406a8971c8 && git merge --no-ff 6aa5ec3ea71f1a8baa7a6f977c64790fd8f26ab0
node scripts/docs-audit/affected-docs.mjs --json 91a423ef6b94a86be8874f1ac6449b406a8971c8 |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head 6aa5ec3 · 2026-10-30T13:12Z |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract reviewHead-sha: Inputs: ① Derived judgments
② Semver levelNo release. ③ Boundary flags
④ Design judgmentRules face,
Implemented-by: VERDICT: PASS Must-fix: none. Should-fix:
|
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS 维护者速读
席位意见:ACCEPT。契约复核 PASS,没有 must-fix。复核逐句对过代码:
dev 声明的偏差(整段删除,而不是只删两句)本席接受:删完两句后剩下的只是一条带日期、没有待办的落地状态,这件事现在已经连同日期记在 ADR 的 Status 行里。 should-fix 1 的载体是 #27900 的 PR:等 席位核对
|
Requested by Elon · project thread
Fixes #27694
Fixes #27956
Clause-②: no
Metadata-protocol: none
维护者速读
sys_*对象上的动作经 MCP 的缺口已由 fix(mcp): an action on a sys_* object whose author exposed it to AI is listed and run over MCP, behind every gate #27940 关闭(按动作逐条看ai.exposed: true,存储元数据表照旧在读开关前就拒绝,后面各闸不变);第 2 步 fix(runtime)!: a same-origintype: 'api'action is dispatched through the action doors, so its packaged-action switch holds (#27506) #27649 已落地;第 3 步 Console: send a same-origintype: 'api'action click throughPOST /actions/:object/:actioninstead of fetching itstargetdirectly (ruling on #27506, step 3 of 3) #27611(PR fix(console): a declared same-origintype: 'api'click goes through the action door #27793)已落地。原句不改,标为「按当日读,被本注记取代」。Status 行补一句落地记录。requiredPermissions文档注释里的「Landing, as of 2026-10-29」整段删掉。target」,两句在 main 上都已不成立;随@objectstack/spec的.d.ts发出的注释还在说控制台条款和「docs(adr): after the api-action door lands, rewrite ADR-0066 D4's isSameOriginApiTarget citation into a symbol anchor and drop the requiredPermissions docblock's "Landing" door clause #27694 会删掉本段」。治理文本说错,等于给作者和 agent 讲错规则。.describe()、不改代码、无生成物变化、不发布(skip-changeset)。回滚即 revert 这一个提交。docs/adr/0066-unified-authorization-model.mdD4 修订段下面新加的> **Note (2026-10-30, #27956, #27694)**那一段,再看第 3 行 Status 末尾新加的「Landed: …」一句。pnpm check:adr-symbol-anchors,预期 exit 0,符号锚 623 个(597 个声明锚),main 上是 614(588);多出的 9 个就是注记里引用的 9 个符号,以后改名或挪走会转红。What changes
Two files, +3 / −6, one commit on
origin/main6b125a7a.docs/adr/0066-unified-authorization-model.md, D4. A dated note,Note (2026-10-30, #27956, #27694), goes under the 2026-10-29 amendment paragraph, in the ADR's own note style (Prime Directive [WIP] Add Chinese version of the documentation #13: the recorded sentence stays and a note goes under it). It says the amendment reads as of its date, and that two of its clauses are superseded by the note, not deleted: the closing "Until step 2 lands …" sentence, and "stay off MCP … card mcp: run_action refuses every action on a sys_* object, so an agent cannot reach the identity actions (ban_user, impersonate_user, set_user_password) that REST POST /actions serves #27681 carries it". Then it records:sys_*MCP gap is closed by PR fix(mcp): an action on a sys_* object whose author exposed it to AI is listed and run over MCP, behind every gate #27940 (mcp: run_action refuses every action on a sys_* object, so an agent cannot reach the identity actions (ban_user, impersonate_user, set_user_password) that REST POST /actions serves #27681, ruling6513869839, letter B). The rule is per action: asys_*action is listed and run over MCP only when it declaresai.exposed: trueitself. One predicate (systemObjectActionExposureError) answers forrun_action, thelist_actionsfilter and theresume_runadmission, and the tool layer's filter yields only to the bridge's attestation (isListableAction). The stored-metadata family is refused before the flag is read (isStoredMetadataBodyObject). Every gate after admission is unchanged;type: 'api'action is dispatched through the action doors, so its packaged-action switch holds (#27506) #27649, 2026-10-29);type: 'api'click goes through the action door #27793 for Console: send a same-origintype: 'api'action click throughPOST /actions/:object/:actioninstead of fetching itstargetdirectly (ruling on #27506, step 3 of 3) #27611, 2026-10-30). The off-origin and undeclared/object-less clicks still fetchtargetdirectly.type: 'api'action is dispatched through the action doors, so its packaged-action switch holds (#27506) #27649 (2026-10-29), step 3 PR fix(console): a declared same-origintype: 'api'click goes through the action door #27793 for Console: send a same-origintype: 'api'action click throughPOST /actions/:object/:actioninstead of fetching itstargetdirectly (ruling on #27506, step 3 of 3) #27611 (2026-10-30), thesys_*follow-up PR fix(mcp): an action on a sys_* object whose author exposed it to AI is listed and run over MCP, behind every gate #27940 for mcp: run_action refuses every action on a sys_* object, so an agent cannot reach the identity actions (ban_user, impersonate_user, set_user_password) that REST POST /actions serves #27681 (2026-10-30, ruling6513869839). This is should-fix 1 of the first-pass review 6515866455.packages/spec/src/ui/action.zod.ts, therequiredPermissionsdocblock. The "Landing, as of 2026-10-29" paragraph is removed. Once the console clause and the self-removal sentence go, what is left ("ADR-0066 records the decision; the server half … is onmain") is a landing status with nothing pending. The paragraph above it already cites ADR-0066 D4 as amended 2026-10-29. No.describe()change.Why
The amendment's present-tense clauses are false on
main:invokeBusinessAction, thelist_actionsbridge (buildMcpBridge) andresumeAdmissionRefusalall callsystemObjectActionExposureError(bc496bf). It returnsnullfor asys_*action that declaresai.exposed: true. It refusessys_metadata/sys_metadata_historybefore reading the flag.isSystemObjectNameis still its first test, so the amendment's citation of it still resolves and stays true as the "which objects" test.useConsoleActionRuntimeandRecordDetailViewsend a declared same-origin api click toPOST /api/v1/actions/:object/:actionthroughui/packages/app-shell/src/utils/apiActionDoor.ts(b00e3f4). An off-origin target, an inline button that names no declared action, and an object-less action keep the direct fetch, as that module's header says.Verification
check:adr-symbol-anchors: exit 0. Head: 623 symbol anchors (597 declaration, 26 literal), 2163 file-level. Base6b125a7a: 614 (588, 26), 2163. The +9 declaration anchors are the nine new citations; every one resolves.node scripts/pm/dispatch-gates.mjs --commands: 74 families derived after the commit. All 74 exit 0.--ranreconcile: 74 run, 0 NOT-MEASURED, 0 UNRUN. That is after a whole-treeturbo run build(116/116), because 15 families exit 3 or miss generated inputs in a fresh worktree.pnpm --filter @objectstack/spec run typecheck: exit 0.pnpm --filter @objectstack/spec run test: 756 files, 22510 passed, 1 todo.check:docs,check:authorable-surfaceandcheck:api-surfaceexit 0, and the tree is clean after the build.git grep "Landing, as of 2026-10-29"on base hits only the source file, so no generated file carries this JSDoc.skip-changeset, as on the first pass (docs(adr): ADR-0066 D4 cites isSameOriginApiTarget by symbol anchor, and the requiredPermissions docblock drops its door clause #27965).Out of scope, as #27956 says: the action-invocation audit row (#27908) and the platform
aideclarations (#27900).Human Minimum
packages/specholds no runtime logic. (No schema change.)pnpm lintwas not run locally (no code changed; CI's ESLint job judges it).main, one pull request. (Two cards that edit the same ADR-0066 D4 note, by the seat's dispatch.)skip-changeset.)packages/spectouched: its generated artifacts are regenerated and committed. (None changes;check:docsexit 0 on a clean tree.)content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_016WV4cw9gAhrah1Mtf9tSZ7