Skip to content

docs(platform-objects): sys_trusted_key docblock names install's verifier and the shipped boot-time loader - #27905

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-27840-trusted-key-docblock
Oct 30, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-27840-trusted-key-docblock

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

domain:server#2 · os-sales · session_01L6bhgUCizoYWQVJWjhdR6F

Requested by Sales · project thread

Fixes #27840

Clause-②: no
Metadata-protocol: none
Skills-docs: none — a comment-only change in packages/platform-objects; no skills/** text names this docblock

维护者速读

  • 改了什么:只改 sys_trusted_key 对象文件顶部的注释两处,不动任何代码与对象定义。
  • 为什么改:注释把安装命令的验签函数写成了 verifyPluginArtifact,实际调用的是 verifyPublisherSignature;还说启动时的加载器"建好之后"才读这张表,其实它已经上线并在每次启动时复核密钥。
  • 风险与回滚:零运行时风险(只改注释);回滚即 revert 本 PR。
  • 先看:packages/platform-objects/src/system/sys-trusted-key.object.ts 第 10–14 行与第 40–48 行。
  • 两分钟验证:git grep -n "verifyPublisherSignature" packages/cli/src/commands/plugin/install.ts 应命中第 65 行与第 259 行;git grep -n "verifyPluginArtifact" packages/runtime/src/installed-plugin-loader.ts 应命中加载器的调用。
  • 需要你做的:无,席位落地。

What changes

packages/platform-objects/src/system/sys-trusted-key.object.ts, docblock only:

  1. The install verifier. os plugin install calls verifyPublisherSignature from @objectstack/core (packages/cli/src/commands/plugin/install.ts:65 import, :259 call). The docblock now names that function and says verifyPluginArtifact wraps it and adds the platform counter-signature chain (packages/core/src/security/plugin-artifact-signature.ts:264, which calls verifyPublisherSignature first).
  2. The boot-time loader. The docblock said it would be a reader "once it is built". It shipped (packages/runtime/src/installed-plugin-loader.ts; os serve runs it through packages/cli/src/utils/installed-plugins-boot.ts before the kernel bootstraps). The docblock now names it and states what it reads from this table: the row for the install's key id must be active and carry the fingerprint the install recorded, and its public_key must verify the kept bytes (verifyPluginArtifact with requirePlatform: false, so only the publisher chain). So a key revoked after install refuses that plugin at its next boot (loader check 3, refusals signature_key_untrusted / signature_key_revoked / trusted_key_invalid / trusted_key_changed / signature_invalid).

The object's description string does not repeat either sentence, and no translation bundle carries the docblock (git grep of verifyPluginArtifact / once it is built under packages/platform-objects hits only this file), so no generator run is needed.

Tests

No behaviour change, so no new test and no ablation.

  • pnpm --filter @objectstack/platform-objects typecheck && pnpm --filter @objectstack/platform-objects test under the verify lock: VERDICT command-exit 0, Test Files 99 passed (99), Tests 1400 passed (1400).
  • pnpm exec eslint --no-inline-config packages/platform-objects: exit 0.

Acceptance notes

  • Changeset: none, skip-changeset label. A comment-only edit is in os-dev's no-publish fast lane. Measured for the record: the docblock text does reach dist/system/index.d.ts (JSDoc in the emitted declarations), so the corrected wording ships with the next release of the package anyway, in a file nothing parses.

Verification

Local readings on head 41af415b (the branch merged with origin/main c91a004f once).

Derived gate families — 44 derived, 44 run, every exit 0

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 44 commands from the one changed path. Each ran with its exit code captured before any pipe: 44 of 44 exited 0. --ran reconciliation: 44 derived famil(ies) accounted for — 44 run, 0 NOT-MEASURED.

Three first answered exit 3 (PREREQUISITE NOT MET: check:i18n, check:lean-entry-closure, check:dual-build-cjs-loads), so they were read as NOT MEASURED, not as passes. After building their prerequisite closures under the verify lock, all three re-ran green: check-i18n-bundles: OK (10 package(s) — all bundles in sync, no undeclared authoring keys).

Package checks
  • pnpm --filter '@objectstack/platform-objects...' build: VERDICT command-exit 0.
  • pnpm --filter @objectstack/platform-objects typecheck && … test: VERDICT command-exit 0, 99/99 files, 1400/1400 tests.
  • pnpm exec eslint --no-inline-config packages/platform-objects: exit 0.
  • No open PR touches sys-trusted-key.object.ts (files of all 24 open PRs read).

CI-owned families (artifact rosters, wide-population families, Build Core, type-check lanes) are left to this PR's check-runs.


Generated by Claude Code

🤖 Generated with Claude Code

https://claude.ai/code/session_01L6bhgUCizoYWQVJWjhdR6F

…fier and the shipped boot-time loader

`os plugin install` verifies with `verifyPublisherSignature` (which
`verifyPluginArtifact` wraps), and ADR-0025 M1's boot-time loader is
built: name it and what it reads from the table. Comment only.

Claude-Session: https://claude.ai/code/session_01L6bhgUCizoYWQVJWjhdR6F
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 1 changed file(s) yielded no anchor (packages/platform-objects/src/system/sys-trusted-key.object.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/platform-objects/src/system/sys-trusted-key.object.ts) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 2 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json e320e366da668b65359bd48fff1923d227513faf → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#2 · os-sales · session_01L6bhgUCizoYWQVJWjhdR6F

维护者速读(席位终稿)

  • 改了什么:sys_trusted_key 对象的文件头注释改正两处:安装命令实际调用的校验函数是 verifyPublisherSignature(verifyPluginArtifact 包着它并多做平台副签校验);启动时的插件加载器已经上线(installed-plugin-loader.ts,由 os serve 经 installed-plugins-boot.ts 运行),注释写明它从这张表读什么。
  • 为什么改:旧注释指错函数、说加载器「尚未建成」,排查插件为何在启动时被拒的人会从错误的起点出发。
  • 风险与回滚:只改注释,不改行为。回滚 = revert 本 PR。
  • 先看:packages/platform-objects/src/system/sys-trusted-key.object.ts 文件头。
  • 两分钟验证:对照 packages/cli/src/commands/plugin/install.ts:65、:259。
  • 需要你做的:无。席位落地。

席位意见: ACCEPT。注释与代码一致,逐处有出处。

席位核对

ACCEPT · head 41af415bf696f8236f4930078e3e77c75cecd5ac · 2026-10-30T03:37Z

  • 形态: 1 file, +11/−5, docblock only. No packages/spec, no governed path; Tier S. skip-changeset (a comment-only edit; the text does reach the published .d.ts).
  • Clause-②: no, Metadata-protocol: none.
  • 前提实测: install.ts imports verifyPublisherSignature at :65 and calls it at :259; the boot-time loader is packages/runtime/src/installed-plugin-loader.ts, run by packages/cli/src/utils/installed-plugins-boot.ts, and needs an active row carrying the install's fingerprint whose public_key verifies the kept bytes through verifyPluginArtifact with requirePlatform: false.
  • 抽查读数: neither the object's description nor any translation bundle repeats the old sentences (no generator run needed).
  • 门禁 check-runs: 57 on this head: 36 success, 21 skipped, 0 other (read 2026-10-30T03:37Z); mergeable_state: clean. Derived gates 44/44 exit 0, 0 NOT-MEASURED; platform-objects 1400/1400.
  • 接受的偏差: no changeset (comment-only); the report signature line.
  • 范围外去向: none.
  • 散文面: the two sentences checked against the code by the seat.
  • 落地条款: relay pr_ready + automerge_enable through the merge queue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

platform-objects: the sys_trusted_key docblock names verifyPluginArtifact as install's verifier and calls the shipped boot-time loader unbuilt

1 participant