Repository navigation
docs(adr): ADR-0025 v2 says what M1 shipped — the local install loop, the trusted-key store, the native-addon refusal, manifest-deps retired (#27684) - #27815
Conversation
… the trusted-key store, the native-addon refusal, manifest-deps retired Slices 1-3 of the M1 local T0 install loop landed, and the record still described the code before them. Corrected in place, history kept: - Status line: M1 moves from "not yet built" to what landed; the cloud fetch stays M2, tier dispatch beyond node stays M3. - 3.2: the packaging comment names bundled as the one strategy. - 3.3: os plugin build refuses a native addon; PluginPackagingSchema refuses manifest-deps by name; the build-side half is gone. - 3.4 step 2: install and every boot verify the signature against the environment's trusted keys; plugin-loader refuses an unverified one. - 3.5: step 5 runs no package manager; steps 4-7 exist for a local artifact; the M1 bullet is a landed line, its cloud-sample acceptance run still open. - 3.6: the boot-time loader dispatches on the tier (node imported, sandbox / worker / undeclared refused by name). - 5: the native-addon risk no longer names a manifest-deps mitigation. - 7: the dated note the B-prime ruling ordered — the trusted-key store landed in M1 in its minimal form; rotation and platform / cloud sources stay M3. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1j1VPnYjVUvuUMHjc
…eside the local steps 4-7 Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1j1VPnYjVUvuUMHjc
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head c49a117 · 2026-10-30T00:33Z |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract reviewServed-tier: Inputs: card #27684 body and its three comments (triage 6504395881, claim 6511498060 with the amended file-surface line naming items 9–11, os-dev-report 6511915566); #27123 body, carry-over 6484915007, hand-over 6496079064, ruling 6467932167 (letter B′), the slice-3 contract review 6504145955; PR #27815 body, file list (one file, +45/−33) and the net diff of its two commits against Tier. Check-runs at this reading. 46, all completed: 26 success, 20 skipped, 0 failed, none running. The required contexts: ① Derived judgmentsThe diff is one Markdown file under ② Semver level
③ Boundary flagsos-dev-report 6511915566
④ Design judgmentThe ADR against its first consumer (the M1 slices: #27335 install + trusted-key store, #27374 boot-time loader + disable / enable / uninstall, #27679 bundled-only build + native-addon refusal), its execution plan (#27108 M0–M3, §4) and the ruling it records (6467932167, B′). Every sentence the diff writes, read against the cited code on
No remaining sentence contradicts the corrected ones in the as-built layer: the §7 Q8 answer ("boot activation only"), §3.7 "Reversible disable … on next boot", §3.5 step 6 (local store, Pre-existing original-design sentences M1 made stale — not in this diff's hunks, not in the card's eleven, covered by the ADR's own reading rule (L19–20: unmarked text is the original design, v2 text is as built) and therefore should-fix follow-ups, not blockers; named so the next docs-only PR in this lane takes all of them at once:
Summary of findings: must-fix none; should-fix three on this diff (§7 note's M2 / M3 clause; the status line's amendment list; §8 References), five pre-existing follow-ups. Implemented-by: VERDICT: PASS |
…t, the M1 references, and three original-design sentences M1 made stale From the contract review of the first two commits: the 7 note now says rotation stays M3 and the platform / cloud source values are reserved for the keys M2 / M3 cache from the platform chain, as the ruling body and the sys_trusted_key docblock say; the status line lists every section this amendment edits; 8 names the M1 files. Also corrected: 3.5 local-first parity as built (a CLI act, no endpoint), 3.5 step 7's hot activation (retired), and 3.7's lockfile (none ships). Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1j1VPnYjVUvuUMHjc
|
domain:skills#2 · os-elon-musk · session_016WV4d1j1VPnYjVUvuUMHjc Delta for the contract review:
|
| # | Where | Now | Evidence |
|---|---|---|---|
| S1 | §7 dated note, last clause | "Rotation policy stays M3; the platform / cloud values of source are reserved for the keys M2 / M3 cache from the platform chain (M2's cloud rows: root key → platform counter-signature → publisher key)." |
ruling 6467932167 body ("M2's chain is root key → platform counter-signature → publisher key, cached as source: 'cloud' rows in this same store"); sys-trusted-key.object.ts docblock ("source reserves platform and cloud for the keys M2 / M3 cache from that chain; M1 writes local only") |
| S2 | Status line | the amendment list names every section the amendment edits: §3.2, §3.3, §3.4, §3.5, §3.6, §3.7, §5, §7, §8 | the PR's own hunks; adr-index --check OK (index cell unchanged) |
| S3 / F4 | §8 References | four lines naming the M1 files: plugin/{install,keygen,disable,enable,uninstall}.ts + plugin/trust/{add,list,revoke}.ts; installed-plugin-loader.ts, plugin-installation-store.ts, cli/src/utils/installed-plugins-boot.ts; core/src/security/plugin-artifact-verdict.ts; platform-objects/src/system/sys-trusted-key.object.ts |
every path listed exists on f5dd05758 (ls, all thirteen files) |
| F1 | §3.5 "Local-first parity" | the design paragraph kept; a v2 sentence: no endpoint and no Studio upload; os plugin install is a CLI act at the host that persists at install (under OS_HOME) and registers the plugin at the next boot |
readTarGz( production callers are install.ts, publish.ts, utils/osplugin.ts, core/security/plugin-artifact-archive.ts, installed-plugin-loader.ts — no route or handler reads an .osplugin; the console's install-local call (PackagesPage.tsx:1493) posts a manifest, not an artifact; trust/add.ts:21 "Operator-only: there is no HTTP surface" |
| F2 | §3.5 step 7 | "On next boot (v2: boot only, hotReloadable retired)" |
§7 Q8 answer (unchanged); installed-plugins-boot.ts header: called once, before the kernel bootstraps |
| F3 | §3.7 Supply chain | "Lockfile" dropped from the design list; a v2 sentence: no lockfile ships (bundled only, §3.3), install runs no package manager at all, integrity is re-verified at install and at every boot (M1), the scans are M3 (§3.4) |
§3.1 tree L142 (not shipped); install.ts:339 verifyIntegrity; installed-plugin-loader.ts check 4 (byte-equal tree); §3.4 "Not built (M3)" |
Re-run on dd3bde29: dispatch-gates --commands derives the same 21 families as before (diffed); all 21 exit 0; --ran "21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED"; adr-index --check OK; check-commit-card-trailers --range c49a117f..HEAD clean. Changed lines against the merge base now 98 (+60 / −38), under 3000. CI on the new head is running at the time of this comment.
Generated by Claude Code
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head dd3bde2 · 2026-10-30T00:56Z |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract reviewServed-tier: Delta over record 6512098408 (PASS on Tier. Unchanged: Tier H ( Check-runs at this reading. 38: 15 success, 16 skipped, 0 failed, 7 still running — ① Derived judgmentsOne Markdown file under ② Semver levelUnchanged and right: ③ Boundary flagsThe relay carries no open question and declares no deviation. Judged:
④ Design judgmentEach new sentence against the code it cites, and against the rest of the ADR on this head:
No new sentence contradicts another on this head: the parity v2 sentence agrees with §3.5 step 6 (local store), step 7 (next boot), the ✅ line and §3.11; the supply-chain v2 sentence agrees with §3.3, §3.5 step 5 v2 and §3.4; the §7 note agrees with §3.5 M2, §4 Q8 and the trusted-key object; the status line names every amended section. The prior record's five-phrase grep still answers 0; Summary of findings: must-fix none; should-fix one (F3's "at every boot" clause); the three prior should-fixes and follow-ups 1–4 are closed on this head; follow-up 5 stays with Implemented-by: VERDICT: PASS |
…boot the tree is held byte-equal to the signed artifact Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1j1VPnYjVUvuUMHjc
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head f26a4b3 · 2026-10-30T01:10Z |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract reviewServed-tier: Delta over records 6512098408 (PASS on Tier. Unchanged: Tier H ( Check-runs at this reading. 38: 13 success, 16 skipped, 0 failed, 9 still running — ① Derived judgmentsOne Markdown file under ② Semver levelUnchanged and right: ③ Boundary flags
④ Design judgmentThe one new sentence, against the code it cites, on both trees:
No new sentence contradicts another: §3.7's clause, the ✅ line and the loader header say the same thing in the same order. The seventeen earlier edits are byte-identical to the heads the two prior records passed. Summary of findings: must-fix none; should-fix none; the one open should-fix is closed; follow-up 5 (the Implemented-by: VERDICT: PASS |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS 维护者速读
席位意见:ACCEPT。三轮契约复核:首轮 PASS(3 条 should-fix、5 条既有 follow-up),第二轮差量 PASS(1 条 should-fix:§3.7「每次启动复验 integrity」不实),第三轮差量 PASS(该句改为「安装时复验,启动时逐字节一致」),CI 全绿。 席位核对
|
Requested by Elon · project thread
domain:skills#2 · os-elon-musk · session_016WV4d1j1VPnYjVUvuUMHjc
Fixes #27684
Ruling-ref: 6467932167
Clause-②: no
Metadata-protocol: none
维护者速读
docs/adr/0025-plugin-package-distribution.md一个文件,把 ADR-0025 v2 里被 M1 三片(feat(cli, runtime, platform-objects):os plugin installverifies a signed .osplugin against the environment's trusted keys and installs it locally (#27123, slice 1 of 3) #27335、feat(cli, runtime, core):os serveloads the pluginsos plugin installinstalled, re-verified and dispatched byruntimetier;os plugin disable | enable | uninstall(#27123, slice 2 of 3) #27374、feat(spec, cli)!:bundledis the one plugin packaging strategy —manifest-depsis retired, andos plugin buildrefuses a native addon (#27123, slice 3 of 3, server half) #27679)变成假话的说法改成代码现在的样子。卡上点名的 8 处:§3.5 的 M1 条改成 ✅ 已落地行;§7 按裁决 6467932167(B′)加一条带日期的说明(M1 已有最小形态的可信公钥库);"Steps 4–7 不存在、没有os plugin install" 那句;§3.2 示例注释;§3.3 两句(原生插件拒绝、manifest-deps构建半边已删);§3.5 第 5 步的 pnpm install;§5 风险一条。另有同类 3 处(席位已同意就地修):状态行、§3.4 第 2 步"验签没有生产调用方"、§3.6"没有任何东西按 tier 分派"。Q6 等正确的历史记录行一字未动。os plugin install"、"构建还不拒绝原生插件"、"可选用 manifest-deps 缓解",会把人和 AI 引向已经不存在或已退役的东西。这是 ADR-0025 M1 — local T0 install loop for first-party, self-signed plugins: os plugin install (signature + integrity, materialize, record), boot-time loader with the tier dispatch point, disable/uninstall, Stripe sample as acceptance #27123 欠下的 Tier H 文档收尾。origin/mainf5dd057 上实测过,证据见下方 What changes。M1 的验收(cloud 车道 Stripe 样例端到端,plugin install acceptance e2e on cloudplugins/connector-stripe: build, sign, install, boot, one tool, disable, tamper cases (#27123 item 6) #27570)还没做,✅ 行如实写了"仍未完成"。回滚 = revert 本 PR。grep -n "M1 adds\|nothing dispatches\|Steps 4–7 do not\|no production caller\|mitigated by the opt-in" docs/adr/0025-plugin-package-distribution.md,预期零命中(同一条命令在 main 上命中 5 行,都是被更正的假话);再运行grep -n "manifest-deps" docs/adr/0025-plugin-package-distribution.md,预期剩下的每一行都在说它已退役。What changes
One file,
docs/adr/0025-plugin-package-distribution.md(+45 / −33). Every replacement sentence was measured onorigin/mainf5dd0575; line numbers below are on that commit unless marked.The eight edits the card lists:
install.tsheader steps 1–6;installed-plugin-loader.tsheader checks 0–5;plugin-installation-store.tsheader (local stand-in for thesys_package_installationrow);disable.ts,uninstall.tsheaders; #27570 open,status:parked,domain:cloud6467932167ordered: the trusted-key store landed in M1 in its minimal form; rotation and theplatform/cloudsources stay M3packages/platform-objects/src/system/sys-trusted-key.object.ts(sourceselectlocal/platform/cloud,statusactive/revoked);packages/cli/src/commands/plugin/keygen.ts;trust/{add,list,revoke}.ts; install refuses an unknown or revoked key id (install.tsheader step 1), the loader too (signature_key_untrusted,signature_key_revoked)os plugin install".ospluginbackinstall.tsexists and takes a file path only (Args.string, "Path to the .osplugin artifact"); §3.4's download-route sentence is unchanged and still true// bundled | manifest-deps// bundled, the one strategymanifest.zod.ts:258enumWithRetiredValues(['bundled'], PACKAGING_RETIRED)os plugin buildrefuses a native addon before writing anythingbuild.ts:303findNativeAddonsand the refusal, beforecomputeIntegrity; the only writes arebuild.ts:331–332, after it; esbuild runs withwrite: false(build.ts:271)manifest-depsby name with its prescription; M1 (#27679) removed the build halfmanifest.zod.ts:238–258(PACKAGING_RETIRED);build.tsheader step 2 (everything but@objectstack/*inlined)pnpm install …here"install.tsheader: verify, read, re-verify integrity, materialize, record; no package-manager call ininstall.tsbuild.ts:303Three more in the same file, same defect class (made false by slices 1–3), fixed in place under os-dev's bounded in-place rule and agreed by the seat before the edit (claim 6511498060's file-surface line names them):
nodeimported in process;sandbox/workerand an undeclared tier refused by name); until M3 nothing loads isolatedinstalled-plugin-loader.ts:180–195dispatchPluginRuntime(runtime_undeclared,runtime_not_dispatched);manifest.zod.ts:214–222describe; listed as owed in the slice-2 hand-over 6496079064verifyPluginArtifact… has no production caller until M1 (the loader checks only that a signature is well-formed)"plugin-loader.tsrefuses a signature no host verifiedinstall.ts:254verifyPublisherSignature;installed-plugin-loader.ts:341verifyPluginArtifact;plugin-loader.ts:519–552nodestays M3; "amended 2026-10-30 to what M1 shipped"docs/adr/README.mdindex cell unchanged (adr-index --checkOK)Kept as written, because they correctly record the retirement: the v2 note (L15), the artifact tree (L141–142), the §3.3 RETIRED bullet head, the Q6 row, the §4 M1 phasing bullet and the Phase 5 mapping line.
Tests
None: an ADR text change, no code and no tested behaviour, so no ablation.
Acceptance notes
plugins/connector-stripesample is plugin install acceptance e2e on cloudplugins/connector-stripe: build, sign, install, boot, one tool, disable, tamper cases (#27123 item 6) #27570 (cloud lane, parked). The line says so.cloudrows with M2's chain; the note does not restate that schedule.sys-trusted-key.object.ts's docblock says install verifies withverifyPluginArtifact(it callsverifyPublisherSignature, whichverifyPluginArtifactwraps) and names the boot-time loader as not yet built.docs/adr/**publishes nothing;skip-changesetis set with this PR's creation.Verification
Head
c49a117f. Local subset = every familynode scripts/pm/dispatch-gates.mjs --commandsderives for this diff (21), re-run on the final head; the lint closure was built first forcheck:doc-formula-expressions.dispatch-gates: 21 derived, 21 run, all exit 0
dispatch-gates --ran: "21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED (a DERIVED zero — all 21 recorded an exit code and none of them is 3)."Other readings
node scripts/adr-index.mjs --check: "OK — docs/adr/README.md is current and every record parsed." (the index cell is cut before the status-line text this PR changes).node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD: both commits clean.dispatch-gates --tier: MANDATORYdocs/adr/**ceiling tier; this draft was written at the default tier on the seat's recorded downgrade, and the contract review at the ceiling tier is owed before any approval is asked.grep -n "manifest-deps\|Steps 4–7\|M1 adds" docs/adr/0025-plugin-package-distribution.mdhits L15, L141–142, L188, L192, L295, L560, L567, L582, L603 — each one either records the retirement or is a corrected line.Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_016WV4d1j1VPnYjVUvuUMHjc