Skip to content

docs(agents): stored rows replay only what the installed release still carries - #29011

Merged
os-zhuang merged 2 commits into
mainfrom
claude/project-thread-y3f6j5
Nov 2, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/project-thread-y3f6j5

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Irene · project thread

Fixes #28924

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:三处文字(AGENTS.md 第 12 条首要原则的最后三行,以及 stored.ts、stored-migration.ts 两个文件头注释)不再说"存储的转换永远重放";代码和行为零改动。
  • 为什么改:18.3 起 ≤16.x 的退役转换已被删除,旧说法会让 AI 告诉用户 16 时代的存储行仍然安全,与 .changeset/25767-retire-16x-retirement-kits.md 的 Stored rows 条目矛盾。
  • 风险与回滚:纯文字,无运行时风险;回滚即 revert 这一个 commit。
  • 先看:① AGENTS.md 第 253-255 行(Tier H,行数保持 3 行不变);② packages/metadata-protocol/src/stored-migration.ts 头注释(含对 "Not load-bearing" 段的收窄);③ packages/spec/src/conversions/stored.ts 头注释。
  • 两分钟验证:git diff origin/main -- AGENTS.md,预期只见 3 行删、3 行增,第 12 条总行数不变。
  • 需要你做的:批准(APPROVE)本 PR —— 它触及 AGENTS.md,属 Tier H,批准后由席位落地。

What changes

Three texts that still stated the pre-18.3 policy, that every stored conversion replays forever, now say what ADR-0087 as amended (ruling 6434038284) says: rehydration replays the chain the installed release carries, retirement kits age out one major after their retirement, and the stored pass (os migrate meta --stored --apply) must run on a release that still carries a row's conversions, before the deployment moves to the release that drops them.

  1. AGENTS.md Prime Directive Add comprehensive test suite for Zod schema validation #12, lines 253-255. Governed Tier H text. The rewrite keeps the directive at exactly its line count (3 lines removed, 3 added; the directive still spans lines 245-255), every line stays at or under 116 characters, and the sentence keeps its shape: "Stored rows: [mechanism]; [limit], so [action]. Strengthens [WIP] Fix error in step four of the action run #5." The old consequence clause ("so a consumer never needs its own accommodation for a legacy stored shape either") was dropped because it is no longer unconditionally true, and the three facts the card requires could not fit beside it in three lines.
  2. packages/spec/src/conversions/stored.ts header, the first policy bullet. "D3 keeps every conversion forever precisely so any past major can replay forward" is replaced by the kit age-out rule and the stored-pass instruction; the bullet's heading now reads "The chain the installed release carries replays".
  3. packages/metadata-protocol/src/stored-migration.ts header. "a row written under any past protocol is served canonical forever" is replaced. The same header's Not load-bearing paragraph, two paragraphs below, said "the read path stays the guarantee and nothing gates on this having run"; left alone it would have contradicted the corrected sentence, so it is narrowed to the window in which the release still carries a row's conversions, matching the ADR's 2026-10-26 amendment ("for those rows it is the required one, not an optional one"). This stays inside the claimed file surface (header comment only).

The wording was cross-checked against skills/objectstack-upgrade/SKILL.md § Stored rows: rehydration replays what the release carries and the Stored rows bullet of .changeset/25767-retire-16x-retirement-kits.md.

Why

Agents read AGENTS.md as binding. After 18.3 a stored row still in a ≤16.x shape is not rewritten by any seam, so a rule saying every seam replays the full chain forever would lead an agent to tell a user their 16-era rows are safe.

Tests

No test was added or changed: the diff is comment and rules prose only, with no behaviour to pin and no ablation owed.

  • pnpm --filter @objectstack/spec build, exit 0 (os-verify-lock VERDICT command-exit 0).
  • pnpm --filter @objectstack/spec typecheck, exit 0 (os-verify-lock VERDICT command-exit 0).
  • @objectstack/metadata-protocol typecheck and tests were not run locally: the edit is inside a block comment and cannot change a type or a test result. CI's TypeScript Type Check and Test Core carry them.

Acceptance notes

  • Other comments still say the full chain replays, retired entries included, for example packages/metadata-core/src/artifact-forward-conversion.ts, packages/core/src/fallbacks/authored-translation-sync.ts and packages/metadata-protocol/src/protocol.ts. Those describe what replays (every entry the release carries, retired ones too), which is still true, and none says "forever". They were left alone as outside this card. Carrier: none.
  • No changeset: the diff changes only comments in published packages plus AGENTS.md, so nothing that ships changes in behaviour or API. The PR carries skip-changeset for that reason.

Verification

Gate derivation node scripts/pm/dispatch-gates.mjs --commands on head 6bb390a5f (objectstack-ai/objectstack): 73 commands. The reconciliation --ran reports 73 accounted for: 68 run with exit 0, 5 NOT MEASURED (exit 3, prerequisite not met), 0 unrun.

Local gate readings (head 6bb390a)
  • 68 derived commands exit 0, including check:pm-governed-prose, check:pm-skill-id-lint (106 files clean), check:pm-skill-ratchet, check:doc-authoring, check:issue-citations, check:nul-bytes, check:published-files, check-adr-0087-registration --base origin/main, and the spec gates check:api-surface (unchanged) and check:docs (235 generated files in sync).
  • check-plugin-teardown-shape --self-test first exited 3 on a shallow fixture commit; it passed (48 cases) after fetching that commit.
  • NOT MEASURED, reason: each needs a full workspace build, which a comment-only diff does not justify locally, and CI builds before running them: check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content, and @objectstack/lint check:doc-formula-expressions.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (No schema touched.)
  • 2. Every name I added uses the casing for its kind. (No names added.)
  • 3. No formatter ran; pnpm lint passes. (No formatter ran; pnpm lint was not run locally, CI owns that repo-wide run.)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (Nothing publishes; skip-changeset.)
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (check:docs and check:api-surface green; nothing to regenerate.)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.

Generated by Claude Code

Prime Directive #12 and the headers of stored.ts and stored-migration.ts
still said every stored conversion replays forever. Under ADR-0087 as
amended (ruling 6434038284) a retirement kit ages out one major after it
retires, so the chain replays what the installed release carries, and
`os migrate meta --stored --apply` must run on a release that still
carries a row's conversions, before moving to the release that drops
them. Comment and rules text only; no code or behaviour change.

Claude-Session: https://claude.ai/code/session_01J8VVAmLfc58Ea3cCpbSx7C
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 Nov 2, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

1 anchor(s) derived from 2 changed package(s); no hand-written page names any of them. ⚠️ 2 changed file(s) yielded no anchor (packages/metadata-protocol/src/stored-migration.ts, packages/spec/src/conversions/stored.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

What this run could not see
  • 2 changed file(s) yielded no anchor (packages/metadata-protocol/src/stored-migration.ts, packages/spec/src/conversions/stored.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 — 169 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 ab085a048241b0bf1fde06696fc6cbf659a6707f → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 11c7d86228e8bba20f3b9ccbe40e1282df0bd6a4 — the merge of head cbdd0231ac500647fbb014dda9f2c0aee3d4c746 into base ab085a048241b0bf1fde06696fc6cbf659a6707f, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 11c7d86228e8bba20f3b9ccbe40e1282df0bd6a4 && git checkout 11c7d86228e8bba20f3b9ccbe40e1282df0bd6a4
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin ab085a048241b0bf1fde06696fc6cbf659a6707f cbdd0231ac500647fbb014dda9f2c0aee3d4c746 && git checkout -B drift-repro ab085a048241b0bf1fde06696fc6cbf659a6707f && git merge --no-ff cbdd0231ac500647fbb014dda9f2c0aee3d4c746

node scripts/docs-audit/affected-docs.mjs --json ab085a048241b0bf1fde06696fc6cbf659a6707f

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract-review-claim: session_01J8VVAnMUWA9rufXzFaEh4J · head 6bb390a · 2026-11-02T06:10Z

The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent (the seat session is not at that tier).

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 6bb390a5f67791297b320ca0aa599eff67402c09
Local-runs: probe — node scripts/pm/check-governed-merges.mjs --pr 29011, the read-only governed-surface classifier the review order named; nothing built, tested or re-run
Scope: packages/spec/src/conversions/stored.ts, AGENTS.md + packages/metadata-protocol/src/stored-migration.ts, packages/spec/src/conversions/apply.ts, packages/spec/src/conversions/registry.ts, packages/metadata-protocol/src/protocol.ts, docs/adr/0087-metadata-protocol-upgrade-contract.md, .changeset/25767-retire-16x-retirement-kits.md, skills/objectstack-upgrade/SKILL.md

Reviewer: an isolated seat-side review at the governed rules face and the published-schema face, reading the card (#28924 body, triage 6569561415, claim 6570062681, dev report 6570394535 as input), the PR body, the net diff of head 6bb390a against origin/main ab085a0 (merge base 00d0668; no base drift on the three paths) and the cited code on main, with no write to GitHub.

① Derived judgments

  • AGENTS.md Prime Directive Add comprehensive test suite for Zod schema validation #12 (lines 253-255). Every new sentence is true on main. "rehydration replays the chain the installed release carries, retired entries included": applyConversionsToStoredItem (packages/spec/src/conversions/stored.ts) calls applyConversions with includeRetired: true pinned, and apply.ts line 157 skips a retiredFromLoadPath entry only when that flag is off, so every entry the installed registry carries replays and nothing more. "a kit ages out one major after it retires": ADR-0087 D2 window bullet as amended 2026-10-26 and the 2026-10-26 addendum ("lives through the protocol major after the one it retired in, and is removed when the next major is cut"), ruling 6434038284 part 1. The registry census on main confirms the consequence: 111 retiredAfter entries, lowest 17.0.0, no entry at or below 16.x. "run os migrate meta --stored --apply on a release that still converts the row, before leaving it": the ADR 2026-07-31 addendum as amended, the changeset's Stored rows bullet (18.2 or earlier, before 18.3) and skills/objectstack-upgrade/SKILL.md § Stored rows all say the same; the flag spelling matches packages/cli/src/commands/migrate/meta.ts. Correct.
  • AGENTS.md shape. File length 1050 lines on both trees; the directive still spans lines 245-255 and [WIP] Add Chinese version of the documentation #13 still starts at 256; the three new lines are 116, 112 and 115 characters. The rule intent is kept: no lenient alias or ?? fallback in a consumer, an alias tolerated only as an ADR-0087 conversion-layer entry (no executor shims) that is declared, loud, tested and removable on a schedule, Strengthens [WIP] Fix error in step four of the action run #5. The citation form ("ADR-0087 as amended, ruling 6434038284") is the provenance form the file's own preamble allows (an ADR or ruling record, never an issue number). What the hunk drops: the consequence clause (the PR body names and justifies it: no longer unconditionally true) and the primitive's name applyConversionsToStoredItem, which the PR body does not mention; the ADR addendum and both headers still name it, so nothing becomes unfindable. Correct, with one should-fix below.
  • packages/spec/src/conversions/stored.ts header, first policy bullet. True against the function below it and against ADR-0087's 2026-07-31 addendum as amended: the bullet now says the chain the installed release carries replays, retired entries included, a kit ages out one major after it retires and its conversion leaves with it, and a row still in that shape must be canonicalized by the stored pass on a release that still carries its conversions. The function docblock lower in the same file (lines 91 and 100 on the head) still says "the full ADR-0087 conversion chain (retired entries included)" and "the same full-chain policy"; that names what replays, not for how long, so it stays true and is outside the claimed surface (header only). Correct.
  • packages/metadata-protocol/src/stored-migration.ts header, first paragraph. True against migrateStoredMetadata (protocol.ts): the pass replays the same chain through applyConversionsToStoredItem, and a row no conversion recognises produces no notice, so the record closure counts it canonical and never itemises it. One loose phrase: "past that, no seam recognizes the row". The seams still read and serve the row; it is the row's shape that no conversion recognises, and the stored pass then counts the row canonical (the false-clean SKILL.md § 3.6 warns about). Should-fix wording, not a false statement of policy.
  • packages/metadata-protocol/src/stored-migration.ts header, the narrowed "Not load-bearing" paragraph. Inside the claimed surface: it is the same block comment, lines 26-32. True: within the window the release still carries a row's conversions the read path remains the guarantee and nothing gates on the pass having run (no sys_migration flag is written; SKILL.md § 3.6 says nothing gates on it); for a row whose conversions the next release drops the pass is the required step, which is the ADR's own amended sentence ("for those rows it is the required one, not an optional one"). Correct, and without it the header would have contradicted its own first paragraph.
  • No code or behaviour change: all three hunks lie inside a block comment or Markdown prose; no token outside a comment moved. Confirmed on the diff.

② Semver level

  • Clause-②: no. Correct. The packages/spec/src/** path hint is answered by content: stored.ts is a comment-only hunk in a .ts file that is not in @objectstack/spec files[] (src/**/*.zod.ts only); no export, type or accepted shape moves. Metadata-protocol: none. Correct: nothing an author can write changes.
  • No changeset, skip-changeset label. Correct under the repo's rules: AGENTS.md Post-Task Checklist step 3 reserves the label for a diff that publishes nothing from any released package, and review-checklist.md routes tests- or docs-only changes to the label, never to an empty changeset. Both packages are published (private unset), but a comment-only diff ships no behaviour, API or CHANGELOG-worthy change; Check Changeset is success on this head. Whether the header comment reaches the built .d.ts bytes was not measured (no dist in this checkout, nothing built) and does not move the level.
  • Tier: Tier H. check-governed-merges.mjs --pr 29011 reads 1 of 3 paths on the register (AGENTS.md), landing tier H, 40 changed lines under the size line. The PR lands only on an authorized APPROVED review by an account in GOVERNED_APPROVERS and then the owning seat; this record is the contract-tier review owed for the governed rules face and the schema face, not a substitute for that approval. The PR is draft, no auto-merge armed, nothing to disarm.

③ Boundary flags

  • Dev open_questions: none. Nothing to answer.
  • Dev out-of-scope finding (carrier none): spot-checked and confirmed. packages/metadata-core/src/artifact-forward-conversion.ts (lines 23-24, 49, 96), packages/core/src/fallbacks/authored-translation-sync.ts (46-47) and packages/metadata-protocol/src/protocol.ts (7024, 22362, 22374) say the full chain replays, retired entries included; that names what replays and none says forever, so they stay true. protocol.ts line 22338's "stays pending in os migrate meta --stored forever" is about a row never canonicalized, not the claim this card corrects.
  • One further text of the same class, outside the card's three and outside the dev's list: packages/spec/src/conversions/apply.ts lines 54-55, "The fixture CI sets it as well, so graduated transforms stay covered forever (ADR-0087 D3)". The 50 aged-out conversions left with their fixtures under spec: retire tombstones, conversions and migration entries older than one protocol major; a strict unknown-key refusal with an upgrade-guide link takes over (maintainer ruling D2 = A) #25767, so "forever" is drift there too. Not this PR's surface; a follow-up card for the seat, no carrier on this PR.
  • The five gates the dev did not measure are carried by CI on this head: check:dts-closure in lint.yml typecheck-debt (Type Check · debt ledger) and typecheck-consumers (Type Check · consumer gates) and in ci.yml Build Core; check:dual-build-cjs-loads, check:sourcemap-no-sources-content and check:lean-entry-closure in ci.yml Build Core (steps at lines 3036, 3045, 3060, after pnpm build); @objectstack/lint check:doc-formula-expressions in lint.yml typecheck-consumers (line 6307). All three jobs have check-runs on this head (state at record time below).
  • The prose gates the rewrite could trip run in lint.yml lint-repo-tooling (Lint · repo & tooling gates: check:pm-skill-id-lint, check:pm-governed-prose, check:doc-authoring) and lint-ci-engine (Lint · CI, release & engine gates: check:issue-citations); the dev reports them green locally on this head, and CI's verdict is read below.
  • Author: objectstack-fleet[bot] through the relay; no off-relay author to name. Dispatch form: mode:thread, Implemented-by is the thread's branch.

④ Design judgment

  • AGENTS.md: the directive now states the policy the code enforces. Pinned includeRetired: true replays every entry the registry carries; the registry on main carries no entry retired at or below 16.x; so "the chain the installed release carries" is the exact invariant, and the old "full chain, retired entries included, forever" would lead an agent to call a 16-era row safe on 18.3. The acceptance scenario holds: an agent reasoning from Add comprehensive test suite for Zod schema validation #12 now tells a user to run the stored pass on a release that still converts the row before moving. The rule loses no prohibition and gains the one action the amended ADR requires. Holds.
  • stored.ts: the header's first bullet is the policy the function immediately below implements and matches the ADR's amended 2026-07-31 addendum sentence for sentence. Holds.
  • stored-migration.ts: the first paragraph and the narrowed "Not load-bearing" paragraph are now consistent with each other and with migrateStoredMetadata; the one loose phrase (should-fix 1) does not misstate the rule. Holds.
  • Must-fixes: none.
  • Should-fixes: (1) stored-migration.ts header: replace "past that, no seam recognizes the row" with the precise statement, that no conversion recognises the shape, the seam serves the legacy bytes, and this pass then counts the row canonical, which is the false-clean an operator must not trust. (2) AGENTS.md: either keep applyConversionsToStoredItem by name in the directive or name its removal in the PR body beside the consequence clause. (3) Follow-up card, not this PR: apply.ts lines 54-55 "stay covered forever".

Check-runs at record time: read 2026-11-02T06:19Z on head 6bb390a, 66 check-runs: 25 success, 14 skipped, 27 in_progress, 0 failure. Green: Build Core (carries dual-build-cjs-loads, sourcemap-no-sources-content, lean-entry-closure, dts-closure), Lint & Repo Gates and all seven Lint lanes (repo & tooling gates, CI release & engine gates, docs & code guards, PM dispatch-gates, ESLint, three scoped), Governed Surface Queue Guard, Check Changeset, Type Check · debt ledger (dts-closure), Type Check · source gates, Spec property liveness, Dogfood Regression Gate, Build & E2E UI, Live E2E UI, Build UI Deps, PR-body guards. Still running: Test Core 1-8, Test UI 1-16, Type Check UI, Type Check · workspace, Type Check · consumer gates (carries the second dts-closure and doc-formula-expressions). Landing waits for every check to complete green and for the Tier H approval; this record does not claim the in_progress ones.

Implemented-by: claude/project-thread-y3f6j5
Reviewed-by: session_01J8VVAnMUWA9rufXzFaEh4J

VERDICT: PASS


Generated by Claude Code

…fix apply.ts "forever"

Review patch round on the stored-conversion prose fix:
- stored-migration.ts: past the release that drops a row's conversions,
  the seams still serve its legacy bytes; what no conversion recognizes is
  its shape, and the stored pass then counts it canonical (a false clean).
- AGENTS.md Prime Directive #12: name `applyConversionsToStoredItem`
  again, still 3 lines and within the file's existing widths.
- apply.ts: graduated transforms stay covered while the installed release
  carries them, not forever (ADR-0087 as amended, ruling 6434038284).
Comment and rules text only.

Claude-Session: https://claude.ai/code/session_01J8VVAmLfc58Ea3cCpbSx7C
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: cbdd0231ac500647fbb014dda9f2c0aee3d4c746
Local-runs: probe — node scripts/pm/check-governed-merges.mjs --pr 29011, the read-only governed-surface classifier re-run on the new head; nothing built, tested or re-run
Scope: packages/spec/src/conversions/stored.ts, packages/spec/src/conversions/apply.ts, AGENTS.md + packages/metadata-protocol/src/stored-migration.ts, packages/spec/src/conversions/registry.ts, packages/metadata-protocol/src/protocol.ts, docs/adr/0087-metadata-protocol-upgrade-contract.md, .changeset/25767-retire-16x-retirement-kits.md, skills/objectstack-upgrade/SKILL.md

Reviewer: the same isolated seat-side review that rendered the PASS record on 6bb390a (comment 6570567293), now a delta review of the one commit on top of it, reading the dev's delta report (#28924 comment 6570819759) as input, the seat's surface widening (card comment 6570576334), the PR body, and git diff 6bb390a5 cbdd0231 against the cited code on main, with no write to GitHub.

Delta over record 6570567293: head cbdd023 is one commit on 6bb390a with no force-push (6bb390a is its ancestor). The commit touches three files, all inside comments or rules prose: AGENTS.md (+3/-3), packages/metadata-protocol/src/stored-migration.ts (+3/-1) and packages/spec/src/conversions/apply.ts (+3/-1, the surface the seat widened to in comment 6570576334). It answers the three should-fixes of the PASS record and nothing else. The judgments of record 6570567293 on the stored.ts header and on the first stored-migration.ts rewrite stand unchanged; the whole PR against origin/main is now 4 files, +31/-15.

① Derived judgments

  • Should-fix 1, stored-migration.ts header lines 14-16. "Past that, the seams still read and serve the row's legacy bytes, but no conversion recognizes its shape, so this pass counts it canonical: a false clean, not evidence." True on main. applyConversionsToStoredItem never throws and never validates: a row whose shape no registered conversion recognizes comes back untouched, so every seam serves its stored bytes as they are. In migrateStoredMetadata (protocol.ts) a row that produces no notice and no TODO is recorded outcome: 'canonical', counted and never itemised, which is exactly the false clean skills/objectstack-upgrade/SKILL.md § 3.6 warns of ("one that dropped a row's conversions no longer recognises it and answers 0"). The sentence now says the precise thing. Fixed.
  • Should-fix 2, AGENTS.md Prime Directive Add comprehensive test suite for Zod schema validation #12 lines 253-255. applyConversionsToStoredItem is restored as the named mechanism. Three lines out, three in; the file is 1050 lines on main, on 6bb390a and on cbdd023; the directive still spans 245-255 and [WIP] Add Chinese version of the documentation #13 still starts at 256. New widths 118, 118 and 115 characters; the block's pre-existing maximum is 119 (main line 254), and the file's maximum line (768) is unchanged, so no new maximum is set. The three required facts stay in the sentence: the chain the installed release carries replays, retired entries included; kits age out one major after retiring (ADR-0087 as amended, ruling 6434038284); run os migrate meta --stored --apply before leaving a release that still converts the row. Rule intent unchanged, Strengthens [WIP] Fix error in step four of the action run #5 kept, no #NNN issue citation added. Fixed.
  • Should-fix 3, apply.ts lines 55-57, the includeRetired docblock. "graduated transforms stay covered while the installed release carries them; a retirement kit ages out one major after it retires (ADR-0087 as amended, ruling 6434038284), and its transform leaves coverage with it." True on main: the per-conversion test files set includeRetired: true (conversions.test.ts line 62 and the per-entry suites), and the 50 aged-out conversions left together with their fixture pairs under spec: retire tombstones, conversions and migration entries older than one protocol major; a strict unknown-key refusal with an upgrade-guide link takes over (maintainer ruling D2 = A) #25767 (the changeset's "What left" bullet, the ADR 2026-10-26 addendum). The hunk lies entirely inside the docblock of ApplyConversionsOptions.includeRetired; no token outside a comment moves. In step with ADR-0087 as amended and ruling 6434038284. Fixed.
  • Nothing else changed in the delta: git diff 6bb390a5 cbdd0231 lists exactly the three files above and every changed line is a comment or Markdown line. Confirmed.

② Semver level

  • Clause-②: no and Metadata-protocol: none still hold: apply.ts joins the diff as a comment-only hunk in a .ts file that is not in @objectstack/spec files[] (src/**/*.zod.ts only); no export, type, accepted shape or authorable key moves anywhere in the four files.
  • skip-changeset still correct: a comment-only diff publishes no behaviour or API change from either released package (AGENTS.md Post-Task Checklist step 3; review-checklist.md routes docs-only diffs to the label, never to an empty changeset). The label is on the PR and Check Changeset on cbdd023 is skipped, the fast path for a PR already carrying the label.
  • Tier: Tier H, unchanged. check-governed-merges.mjs --pr 29011 on the new file list reads 1 of 4 paths on the register (AGENTS.md), landing tier H, 46 changed lines under the size line, exit 3 (governed). The PR is draft, no auto-merge armed, nothing to disarm. This record is the contract-tier review owed for the governed rules face and the schema face; the landing still needs an authorized APPROVED review from GOVERNED_APPROVERS and then the owning seat.

③ Boundary flags

  • Dev open_questions: none. Out-of-scope findings unchanged from the first report; the three comments named there were confirmed true in record 6570567293 and nothing in this commit touches them.
  • PR body not edited this round (the dev writes it once and names the seat edits owed). It now trails the head in three places the Tier H approver will read: the 速读 and "What changes" still say three texts and omit apply.ts; item 1 still says every line stays at or under 116 characters (now 118/118/115, at or under the block's pre-existing 119); the Verification section still names head 6bb390a and 68 run / 5 NOT MEASURED (the delta report says 70 run / 3 NOT MEASURED on cbdd023). Should-fix for the seat, owed before the approval is requested, since the body is what the approver reads against the diff.
  • The cancelled shards on 6bb390a were superseded, not failed: the push of cbdd023 landed at 2026-11-02T06:23:47Z and its runs were created at 06:23:59Z; the CI run 41398065570 and the Lint & Type Check run 41398065580 on 6bb390a concluded cancelled at 06:25:38Z and 06:25:23Z, their 15 cancelled jobs (Test Core 1, 3-7, Test UI 4, 7, 8, 13-16, Type Check UI, Type Check · workspace) ending between 06:24:07Z and 06:25:16Z, after the new runs existed. No job on either head carries failure.
  • The five gates the first record traced to CI are green on cbdd023: Build Core (dual-build-cjs-loads, sourcemap-no-sources-content, lean-entry-closure, dts-closure), Type Check · debt ledger and Type Check · consumer gates (dts-closure, doc-formula-expressions) all success.
  • Author: objectstack-fleet[bot] through the relay; no off-relay author to name. Implemented-by is the thread's branch, as before.

④ Design judgment

  • AGENTS.md: naming applyConversionsToStoredItem restores the one lookup the first rewrite had dropped, so an agent reading Add comprehensive test suite for Zod schema validation #12 reaches the primitive and its header, which now carry the same policy in the same words. The rule still forbids the consumer-side shim and names the one action the amended ADR requires. Holds.
  • stored-migration.ts: the header now states what the pass actually does for a row whose conversions have aged out, which is the one fact an operator must not misread; it agrees with migrateStoredMetadata's canonical branch and with SKILL.md § 3.6. Holds.
  • apply.ts: the docblock's coverage claim is now scoped to what the tree carries, which is what the fixture suites measure. Holds.
  • Must-fixes: none.
  • Should-fixes: (1) the PR body, as in ③: add apply.ts as item 4 of "What changes", correct the 116-character claim to the measured 118/118/115 under the block's 119, and move the Verification section to head cbdd023. Seat-owned, before the approval request. No change to the diff is needed.

Check-runs at record time: read 2026-11-02T06:40Z on head cbdd023, 62 check-runs: 30 success, 10 skipped, 22 in_progress, 0 failure, 0 cancelled. Green: Build Core, Lint & Repo Gates and all seven Lint lanes, TypeScript Type Check with its four lanes (workspace, source gates, consumer gates, debt ledger), Governed Surface Queue Guard, Check Changeset (skipped on the label fast path), Check PR Size, Spec property liveness, Dogfood Regression Gate, Build UI Deps, Build & E2E UI, Live E2E UI, PR-body guards, Plan Test Core shards, Test Core 5/8, Test UI 2/16 and 11/16. Still running: Test Core 1-4 and 6-8, Test UI 1, 3-10 and 12-16, Type Check UI. Landing waits for every check to complete green and for the Tier H approval; this record does not claim the in_progress ones.

Implemented-by: claude/project-thread-y3f6j5
Reviewed-by: session_01J8VVAnMUWA9rufXzFaEh4J

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

维护者速读

  • 改了什么: 四处文字不再说「存储的转换永远重放」,改为 ADR-0087(修订后,裁决 6434038284)的说法:重放的是已安装版本携带的链,退役 kit 在退役后再过一个大版本即移除,存量 pass(os migrate meta --stored --apply)要在还携带该行转换的版本上先跑。四处是:AGENTS.md 第 12 条首要原则末三行、stored.ts 文件头、stored-migration.ts 文件头(含收窄 "Not load-bearing" 段)、apply.ts 的 includeRetired 注释。代码与行为零改动。
  • 为什么改: 18.3 起 ≤16.x 的退役转换已删;旧说法会让 AI 告诉用户 16 时代的存储行仍然安全,与 changeset 25767-retire-16x-retirement-kits 的 Stored rows 条目及已合入的升级技能(docs(skills): objectstack-upgrade teaches the stored pass before 18.3 drops the ≤16.x conversions #28918)矛盾。
  • 风险与回滚: 纯注释与规则文字,无运行时风险;AGENTS.md 行数不变(1050)。回滚即 revert。
  • 先看: ① AGENTS.md 第 253–255 行;② stored-migration.ts 头注释第 14–16 行与 "Not load-bearing" 段;③ apply.ts 第 55–57 行。
  • 两分钟验证: git diff origin/main -- AGENTS.md 只见 3 删 3 增;grep -n "forever" packages/spec/src/conversions/stored.ts packages/metadata-protocol/src/stored-migration.ts packages/spec/src/conversions/apply.ts 不再命中「永远重放」类说法。
  • 需要你做的: 审批(APPROVE)本 PR。触及 AGENTS.md,属 Tier H。达档契约复核 PASS 在案:评论 6570567293 与补丁轮 delta 6570890767,Head-sha: cbdd0231ac500647fbb014dda9f2c0aee3d4c746。批准后由本席落地。
  • 席位意见: ACCEPT。每句新话都对得上 main 上的代码(applyConversionsToStoredItem 固定 includeRetired: true;注册表里已无 ≤16.x 条目;migrateStoredMetadata 把无法识别的行记为 canonical)。

席位核对 — ACCEPT · domain:skills#1 · head cbdd0231ac500647fbb014dda9f2c0aee3d4c746

  1. 形态: draft → main,正文 Fixes #28924,无他卡关键词;作者 objectstack-fleet[bot](中继)。
  2. 前提实测: origin/main 上 AGENTS.md:253-255 仍写 "replays the full conversion chain — retired entries included … never needs its own accommodation";注册表 retiredAfter 最低 17.0.0(复核记录 6570567293)。
  3. 门禁 check-runs(钉 head cbdd0231): success 54 / skipped 10 / 无红无在跑。6bb390a5 上的 cancelled 是补丁轮推送顶替旧 run,非失败(delta 记录 ⑤)。check-governed-merges --pr 29011:Tier H(AGENTS.md ×1 / 4 路径),+31/−15。dev 未本地实测的 dts-closure、dual-build-cjs-loads、lean-entry-closure、sourcemap-no-sources-content、doc-formula-expressions 均由 CI(Build Core、Type Check · consumer gates / debt ledger)在本 head 跑绿。
  4. 接受的偏差: 本席把文件面扩到 apply.ts 一处同类旧注释(卡评论 6570576334),不另立卡;"Not load-bearing" 段收窄在头注释申报面内。PR 正文已过时,以此为准: 改动为 4 个文件(另加 packages/spec/src/conversions/apply.ts 第 55–57 行);AGENTS.md 三行宽 118/118/115(块内原最大 119),applyConversionsToStoredItem 已保留,仅去掉「consumer never needs its own accommodation」一句;Verification 所引 head 应为 cbdd0231,本地门禁 70 跑 / 3 未测(其余由 CI 承载,见第 3 条)。
  5. 范围外去向: dev 列出的 artifact-forward-conversion.ts、authored-translation-sync.ts、protocol.ts 等注释只说「重放全链含退役项」,未说「永远」,复核抽查仍为真,不立卡。Skills-docs: 不适用(Metadata-protocol: none)。
  6. 落地条款: Tier H。等 GOVERNED_APPROVERS 授权批准;批准后本席过落地前检、清 needs-user-decision、pr_ready + automerge_enable。

Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review November 2, 2026 07:35
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 2, 2026
Merged via the queue into main with commit c44c8ac Nov 2, 2026
70 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-y3f6j5 branch November 2, 2026 09:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation 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.

AGENTS.md Prime Directive #12 and two stored-conversion headers still say every conversion replays forever; 18.3 drops the ≤16.x ones

2 participants