Skip to content

docs(adr): ADR-0005 appendix (c) — the storage switch is in force for view, and a saved view stores the parsed value of every key its body carried (ruling B) - #20899

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-20879-adr-0005-storage-switch-in-force
Sep 30, 2026
Merged

os-zhuang merged 4 commits into
mainfrom
claude/issue-20879-adr-0005-storage-switch-in-force

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #20879
Clause-②: no

This is the documentation step that ruling 5910106571 on #20051 names (batch #256 item 3, Q2 = B, maintainer 「同意 批次 #256」): "ADR-0005 appendix (c)'s parsed.data wording and its two "not yet in force" markers change in a separate Tier H documentation PR for the maintainer's hand." Tier H (docs/adr/**): this PR stays draft until the maintainer's word.

What this changes

One file, docs/adr/0005-metadata-customization-overlay.md, four places:

  1. Status line.
  2. Appendix (c)'s persisted-document bullet is rewritten from the landed code:
  3. The stage (iii) note keeps its text. A "⚠️ Historical — superseded." paragraph now sits above its items 5 (the interim state) and 6 (the stage (iv) plan). Both items are kept verbatim. This is ADR-0005's own convention: its "Overlay-uniqueness index" block is left standing as written under the same marker, because an accepted record is not edited to make the past look like the present.
  4. A new dated note, "Amended (2026-09-30)", directly after the first one, in the stage (iii) form:

The heading Addendum — 2026-05-16 (c): spec validation on overlay save is byte-stable: 0 hits in the diff and 1 in the file. So scripts/adr-anchors/packages__metadata-protocol__src__protocol.ts.json and the code comments that cite that heading stay as they are, and nothing outside this file changes.

Per the triage direction (5914934930), the text says nothing about types the switch does not cover, beyond one fact: every other type still stores its request body, as the landed code does.

Each sentence against the landed code (origin/main 00a92e18d)

  • saveMetaItem (packages/metadata-protocol/src/protocol.ts) stores projectStorableViewBody(request.item, parsed.data, reparse) inside if (singularType === 'view'). Every other type goes to the else branch, which keeps graftNormalizedOperators(graftFoldedFormSections(request.item, parsed.data), parsed.data).
  • The rules come from buildStorableViewNode's docblock and body:
    • an authored key the parse kept is stored with its parsed value;
    • an authored key the parse did not keep is dropped;
    • a key the parse added is stored only when the re-parse does not reproduce it (a moved key), and is not stored when it does (a default).
  • The loop returns converged: true only when storableEqual(again.data, parsed). Otherwise it stores parsed whole and warns once per view (storableViewFallbackWarned). Item 2 of the new note says both.
  • "with the normalizations saveMetaItem applied to it before the switch" (item 3) covers what the other types already had, and nothing new:
  • The options refusal: VIEW_ITEM_OPTIONS_REFUSED and options: z.never(…) in packages/spec/src/ui/view.zod.ts, and the ADR-0087 entry view-item-options-bag-refused in packages/spec/src/migrations/registry.ts.
  • The pins: protocol.project-storable-view-body.test.ts covers the converged arms and the fail-safe. protocol.graft-folded-form-sections.test.ts has the stage (iv) describe blocks: W1–W5 store no type, an undeclared key is dropped, the persisted body parses to exactly what the save parsed, and a page is stored as sent.
  • protocol-meta.test.ts re-judged "preserves Studio-only auxiliary fields verbatim" as "stores the console's declared round-trip keys, and drops the objectName alias".

Census of the file after the change

not yet in force · not yet landed · has not landed · parsed.data · request.item. Each remaining hit is either true or a dated quote:

line text why it stays
6 ruling 甲 entry: "reversing the verbatim request.item save" true, since the same entry now says it is in force for view
349 bullet: "Every other type still stores its request body (request.item)" true (the else branch)
367–370 first note, item 1: the 2026-05-16 bullet quoted dated quote (stage (iii))
406 first note, item 5: "has not landed" under the new "Historical — superseded" marker, verbatim
436–443 new note, item 1: the stage (iii) bullet quoted dated quote, marked Superseded

Evidence (head 950180d84)

  • Gates. Derived with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, with no paths. The tree is 950180d84 and the change set is 1 path. It derived 19 commands, the same 19 as the dispatch. All 19 exit 0:
    • check-adr-links (+ --self-test);
    • check-adr-symbol-anchors (+ --self-test);
    • check-ci-filter-parity;
    • check-closing-keyword-parity (+ --self-test);
    • check-comment-mask-corpus;
    • check:doc-formula-expressions;
    • check:adr-anchors;
    • check:cross-package-test-inputs;
    • check:doc-authoring;
    • check:driver-memory-census;
    • check:gitlink-declared;
    • check:nul-bytes;
    • check:pm-governed-merges;
    • check:pm-prior-rulings;
    • check:refd-timer-probe;
    • check:watch-hint-literal.
  • Reconciliation. --ran with COMMAND :: exit CODE lines: "19 derived famil(ies) accounted for — 19 run, 0 NOT-MEASURED (a DERIVED zero — all 19 recorded an exit code and none of them is 3)".
  • check-adr-symbol-anchors: "2165 anchors across 140 records resolve — 325 symbol (299 declaration, 26 literal), 1813 file-level, 27 cross-repo, 6 exempt, 9 continuation".
  • check:adr-anchors: "OK (56 anchored file(s), every governing ADR still referenced; … 40272 citation(s) across 4997 file(s) resolve …)".
  • check:doc-formula-expressions. I built @objectstack/formula and @objectstack/lint first, through the verify lock (turbo run build, 4 of 4 tasks, exit 0). The gate then printed "22 record-scoped formula example(s) across 458 files / 1381 TS blocks judged clean".
  • The ADR-0087 link fragment. check-adr-links strips #fragment and never checks it (its own header says so). So I computed the slug of ## Addendum (2026-08-01b) — flows reach the finish line too (#4454) with github-slugger 2.0.0: addendum-2026-08-01b--flows-reach-the-finish-line-too-4454, which is what the link uses. That heading occurs once in ADR-0087.
  • Ablation (one-off, no permanent file).
    • Setup: with the change committed, I ran scripts/ablation-replace.mjs in wrap mode. It renamed the new anchor view.zod.ts#VIEW_ITEM_OPTIONS_REFUSED to …REFUSEZ: anchor count 1 to 0, blob 62fe9587 to af2e8fa2.
    • The gate printed "❌ check-adr-symbol-anchors: 1 finding(s)" and "[unresolved-symbol] docs/adr/0005-metadata-customization-overlay.md:472".
    • Restore: the blob is back to 62fe9587 (the HEAD blob) and git diff HEAD is empty.
    • So the gate judges the new anchors, including a non-exported const.
  • eslint (narrowed, measured).
    • The population is read from eslint.config.mjs: files: ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}']. No config object matches .md.
    • eslint --no-inline-config --format json on the changed file: 1 file, 0 errors, 1 warning, "File ignored because no matching configuration was supplied".
    • The config enables no type-aware linting (its own comment at :327). So a markdown-only diff moves no eslint verdict on any file.
  • No changeset. docs/adr/** publishes nothing. Measured: 82 tracked package.json files, 69 not private (the root is private). None has a files[] entry that names docs/adr or climbs out of its package directory. So skip-changeset applies, and the seat applies the label.

Acceptance notes

These are observations, not filed.

  1. The anchor's "only" is narrower than the code. The invariant in scripts/adr-anchors/packages__metadata-protocol__src__protocol.ts.json says every other type is stored "with only the operator and groups → sections grafts applied".
  2. The 2026-05-16 test list stays as written. The line "Tests added in packages/objectql/src/protocol-meta.test.ts … unknown extras preserved …" is the 2026-05-16 addendum's dated record of what was added then, so it stays. The new note's item 5 records that the case was re-judged at stage (iv).
  3. Two Status-line entries carry the same date, 2026-09-30. The ruling 甲 entry keeps its own provenance and gains the in-force clause. The ruling B entry records the refinement. The file's convention is one entry per decision-changing amendment.

维护者速读(草稿)

改了什么:只改了 ADR-0005 这一份文档,四处。

  • 状态行:裁决甲那一条原来写着"存储切换尚未落地",现在改成"自 PR fix(metadata-protocol,spec)!: a saved view stores the parsed value of every key its body carried, and a ViewItem record's top-level options is refused by name (stage iv of #20051) #20868 起对 view 生效"。另外新加一条"已修订",记录裁决 B。
  • 附录 (c) 的"持久化文档"条目:原来写的是"存解析结果 parsed.data,已裁定、尚未生效"。现在照已合并的代码写:视图保存时,只存请求体里带了的每个键的解析值。没声明的键丢掉,作者没写的 schema 默认值不落库,旧拼写的键按规范拼写存(groups → sections,visibleOn → visibleWhen)。其它类型仍然存请求体。存量行不迁移。
  • 第 (iii) 步那段注记的第 5、6 项(过渡状态、第 (iv) 步计划)原文保留,上方加了"⚠️ 历史——已被取代"标记。
  • 新加一段 2026-09-30 注记。它写了出处(裁决 B、维护者原话、PR 与合并 sha),并原文引用被取代的第 (iii) 步条目。它还写了视图保存具体存什么、options 按名拒收,以及对应的测试。

为什么改:裁决 5910106571 点名要求这一步。第 (iv) 步(PR #20868,9905e61ca2)已经合并,所以这三处"尚未生效 / 存 parsed.data"的文字在 main 上已经是错的。

风险与代价(含回滚):

  • 纯文档改动,不动代码、不动测试、不发布任何包。
  • 附录 (c) 的标题一字未改,所以代码注释和锚点文件都不用跟着动。
  • 回滚:revert 本 PR 的提交即可。

席位意见:

你要做的:审阅后在本 PR 上给 APPROVED。这是 Tier H 治理面 docs/adr/**,之后由席位落地。


Generated by Claude Code

…sed value of every key its body carried (WIP)

Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg
Co-authored-by: Claude <noreply@anthropic.com>
…e interim items historical (WIP)

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

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 950180d848371dfdf38b00023e1b614490c040d3
Local-runs: none

Scope of this record. PR #20899 for card #20879, one file: docs/adr/0005-metadata-customization-overlay.md (+87/−10, blob a893abb2778 → 62fe9587495). The head is 950180d84…, base main at 33b6e8bec, merge-base 00a92e18d; main moved three commits between the two and touched none of ADR-0005, ADR-0087, protocol.ts, view.zod.ts, registry.ts, the anchor record or the three pins, so the API diff and git diff origin/main...HEAD are the same hunks. The seat's pr.diff in scratch equals the API diff except the abbreviated blob-id width on the index line. Inputs: the card body and its four comments (including the dev report 5915610884), the PR body and file list, the check-runs on the head, ruling comments 5910106571 and 5909085121 with the #20051 thread around them (5856781584, 5909437934, 5909486308, 5909498682, 5913819354), and PR #20868 (merged 9905e61ca2, an ancestor of origin/main) read as landed code at origin/main. Quotations were compared byte-for-byte by a scratch text-comparison script; nothing was built, tested or re-gated.

Check-runs on the head (read 2026-09-30T16:55:40Z): 35 runs — 23 success, 11 skipped, 1 in_progress. Not green: Lint & Repo Gates — in_progress (a REQUIRED context; an honest reading, not a pass; the seat re-reads before adopting). Required contexts otherwise: TypeScript Type Check success; Test Core 1/6–6/6 and rollup success; Dogfood Regression Gate rollup success (shards skipped); Governed Surface Queue Guard success; Build Core and Temporal Conformance (live PG + MySQL) skipped by the paths filter (a docs-only diff). Check Changeset success; Check Documentation Links success. An earlier read (16:4xZ) had four in_progress (Lint & Repo Gates, Test Core (1/6), Type Check · consumer gates, Type Check · workspace); three have since completed success.

① Derived judgments

The diff edits governed rule text (Tier H, docs/adr/**). Every sentence it adds or changes about what saveMetaItem stores was judged against packages/metadata-protocol/src/protocol.ts on origin/main (33b6e8bec, identical to the dev's reading at 00a92e18d for this file).

Status line (:6).

Appendix (c) bullet (:337–351), each clause at the code.

  • projectStorableViewBody is exported at :1506 and called at :17062 as projectStorableViewBody(request.item, parsed.data, reparse).
  • "a key nothing declares is dropped": :1447–1449 (parsed[key] === undefined → dropped). "a declared key keeps its parsed, normalised value": :1451 (recursive, so a nested default is not stored either). "a moved key is stored under its canonical spelling (groups → sections, visibleOn → visibleWhen)": :1453–1463 plus the docblock; the spec folds both (foldFormGroupsIntoSections; FormSectionSchema.visibleOn "Normalized to visibleWhen at parse", view.zod.ts:3732). "a schema default the author did not write is not stored": :1456 (reproduced by the re-parse → skipped), in the converged arm; the fail-safe is stated in the note's item 2.
  • ADR-0087 link: the heading ## Addendum (2026-08-01b) — flows reach the finish line too (#4454) is at docs/adr/0087-metadata-protocol-upgrade-contract.md:506 on the head and is unique (the 2026-08-01 and 2026-08-01c siblings slug differently). GitHub slug computed: lowercase, strip (, ), —, #, spaces → hyphens ⇒ addendum-2026-08-01b--flows-reach-the-finish-line-too-4454, which is the fragment the link uses. check-adr-links.mjs strips fragments (target.split('#')[0], :268; header :100 says so), so this was checked by hand. The addendum's text carries the rule cited: "storable excludes schema defaults, and this is load-bearing".
  • "The stored row re-parses to exactly what the save accepted": the convergence invariant, :1515 storableEqual(again.data, parsed).
  • "A key a client writes onto a stored view row and reads back after a reload is declared … so the parse keeps it": VIEW_CONSOLE_ROUND_TRIP_KEYS (view.zod.ts:6331), viewItemWireFields docblock.
  • "Every other type still stores its request body (request.item)": the else branch stores request.item after the two grafts (:17098) and withDeclaredPageTypeDefault (:17109, a no-op for every type but page); a flow body is replaced by its canonicalized storable before the gate (:17002); three pre-gate strips run for every type (:16546, :16587, :16599). As a one-sentence summary it is the code's own wording (:17016 "every other type keeps its request body, with the grafts below") and the triage's permitted fact; the qualifier lives in the note's item 3. TRUE as qualified.
  • "In force since PR fix(metadata-protocol,spec)!: a saved view stores the parsed value of every key its body carried, and a ViewItem record's top-level options is refused by name (stage iv of #20051) #20868 (9905e61ca2); rows stored before it are not migrated": fix(metadata-protocol,spec)!: a saved view stores the parsed value of every key its body carried, and a ViewItem record's top-level options is refused by name (stage iv of #20051) #20868's changeset says "Stored rows are not migrated and not re-read differently"; the registry entry is semantic (no D2 conversion; entries/semantic/18.view-item-options-bag-refused.ts) and states "Nothing is rewritten on read". TRUE.

The "⚠️ Historical — superseded." paragraph (:399–403). Same form as the file's own marker at :545 (a blockquote line reading ⚠️ **Historical — superseded.** Everything in this subsection describes the …, main :468). Items 5 and 6 are pure context lines in the diff (no - line), so "retained verbatim" holds. "without the production count item 6 names, which the maintainer waived": item 6 (:412–419) makes "the count of stored view rows … measured against production sys_metadata" the landing precondition; 5909085121 records the maintainer's 「20051 不考虑现有的数据」 as waiving ruling 甲's item 4 measurement and the census bullet ("Stage (iv) lands without a count of stored rows"), and ruling 5910106571 restates it ("The stored-row census stays waived"). A fair reading.

New note's provenance (:421–433). 「同意 批次 #256」 is byte-identical to 5910106571 (double space included). The English quotation "a saved view stores the keys the author wrote, normalised by the parse: undeclared keys dropped, schema defaults NOT materialised" is byte-identical to the ruling's Ruled sentence. 「20051 不考虑现有的数据」 is byte-identical to 5909085121. "director batch #256 item 3, Q2 = B" matches the comment's header. "Stage (iv) of ruling 甲 landed under ruling B in PR #20868, merged as 9905e61ca2" is true. "Why B rather than the whole parse output: views and flows keep one rule, a stored row carries no schema default the author did not write, so it never pins the day's default or records a choice the author never made" is an unquoted paraphrase of the ruling's own text ("Views and flows share ADR-0087's rule that storable excludes schema defaults; a stored row never pins the day's default"; readings ① "one rule for views and flows" and ③ "A records unmade choices as made") — the ruling's reason, not the author's, and not presented as a quotation.

Item 1 (Superseded). The quoted bullet equals the deleted text at main :337–345 byte-for-byte (whitespace-normalised across the blockquote wrap); the quoted Status clause equals main :6's clause and is gone from the head's Status line. Deleted-sentence homes: every rule sentence of the old bullet is restated in the new bullet scoped to view; the generic "parsed body once every round-trip key is declared" principle survives in the ruling 甲 Status entry and the first note's title (:353–355). No rule is lost. Item 5's "the pins that hold that verbatim save stay green" and its protocol-meta.test.ts "preserves Studio-only auxiliary fields verbatim" are false today and sit under the Historical marker, with the new item 5 giving the present state.

Item 2, each named example at the code. operator normalisation: ViewFilterRuleSchema.operator preprocess (docblock :1219), stored as parsed (:1419–1422). Bare-array exportOptions → object form: docblock :1421, spec :6322–6323, pin protocol.project-storable-view-body.test.ts:105. objectName and a top-level id (undeclared, .strip()): pin protocol.graft-folded-form-sections.test.ts:583, protocol-meta.test.ts:586. sort[].id: VIEW_CONSOLE_ROW_DECORATIONS = ['id'] (:424), stripViewConsoleDecorations (:499), pin :577. groups → sections / visibleOn → visibleWhen: pin 1 :72, :85. Convergence loop and fail-safe: :1512–1520; the warning is deduped per view|name in storableViewFallbackWarned (:17070–17079), i.e. once per view per process; "nothing the author wrote is lost, only that row's defaults are pinned" is the code comment at :17067–17069; pin 2 :744 "warns once per view". All TRUE.

Item 3. "The two grafts no longer run on a view save": TRUE (they are in the else branch only; "special cases of the projection" is the docblock at :1482–1487). "Every other type still stores its request body, with the normalizations saveMetaItem applied to it before the switch": TRUE under the sentence's own reading — the ADR calls stage (iv) "the storage switch" throughout, so "before the switch" is temporal. Every request.item mutation a non-view type meets on main — stripReadDecorations, stripDerivedProvenance, stripServedObjectColumns (pre-gate), the flow canonicalization (#4542), the two grafts, withDeclaredPageTypeDefault (#20101), stampHtmlPageRequires, carryForwardRedactedCredentials — exists at 9905e61ca2^ (grep counts 2–8 each; projectStorableViewBody 0), so none is newer than the switch. The sentence does not enumerate, so it does not inherit the anchor record's "only" (see ③). Triage direction 5914934930 ("⛔ Nothing about types the switch does not cover"): the text states only the permitted fact and this factual qualifier; no sentence speculates about widening the switch or about any named non-view type.

Item 4 (Q3 = A). The ruling: "Q1 = A and Q3 = A stand as the seat answered them (… a top-level options on the ViewItem wire is refused by name with the prescription to write config.KIND)"; the seat's answer (5909486308) was A, "refuse it by name on both ViewItem wire arms". Code: options is z.never(…) with an error callback returning VIEW_ITEM_OPTIONS_REFUSED, .optional(), in viewItemWireFields() (view.zod.ts:5330), spread into BOTH arms of ViewItemWireSchema (:5359–5366); the message prescribes config.KIND (:5296–5299); a zod failure leaves saveMetaItem as 422 INVALID_METADATA with the issue path options (:17047–17054). The registry entry view-item-options-bag-refused (registry.ts:18426) is a semantic entry, as the note says. "the judgement the first note's item 6 left open": item 6 said only "is judged in the same step". "The flattened list overlay keeps its legacy options bag, judged key by key": ListViewOverlayWireSchema declares options: ListViewOverlayOptionsSchema.optional() (:6218), a strict object. All TRUE.

Item 5 (the pins). All three exist on main with the blocks described: protocol.project-storable-view-body.test.ts (the converged arms, the converged: false fail-safe); protocol.graft-folded-form-sections.test.ts stage (iv) describes (TOOLBAR_SAVES it.each "carries no type the author did not write", "an undeclared key is dropped", "the persisted body parses to exactly what the save parsed", "a page is stored as sent, not as parsed"); packages/objectql/src/protocol-meta.test.ts:586 "stores the console's declared round-trip keys, and drops the objectName alias". The 2026-05-16 test list at :494–497 still says "unknown extras preserved"; it is the dated record of what was added then, and item 5 names and corrects it — consistent with the file's convention of dated addenda plus notes. Observation only (a later edit could mark that line; not this card's surface).

Heading stability. Addendum — 2026-05-16 (c): spec validation on overlay save is byte-identical at head (:312), main and the merge-base (1 hit each). scripts/adr-anchors/packages__metadata-protocol__src__protocol.ts.json is blob ff850c05… at both head and main (untouched) and cites that heading, so check:adr-anchors has nothing to move.

Out-of-scope stale text seen, not judged against this PR: :322–331 (the 2026-05-16 resolveOverlaySchema dispatch by view/dashboard/other → null) pre-dates the registry-driven getMetadataTypeSchema dispatch; it is not about the storage switch and outside the card's surface.

② Semver level

skip-changeset is correct. The diff publishes nothing: on origin/main, 82 tracked package.json, 69 non-private, 0 files[] entries naming docs/adr or climbing out of their package (my own census; equals the dev's numbers). No .changeset/*.md in the diff; the skip-changeset label is on the PR and Check Changeset is success. Clause-②: no is on the PR body, the right arm for a docs-only diff that widens nothing and carries no breaking marker.

③ Boundary flags

Dev deviations in 5915610884, each answered:

  1. First WIP commit refused by the pre-push hook for a card-relation line, amended before any push — accepted; the four commits on the branch (89783bdb9, 934ff16ed, cb38cc02b, 950180d84) carry the model-free trailer pair and no model identifier; no remote history was rewritten.
  2. Dependency build exited 1 (spec unbuilt) then rebuilt under the verify lock — a dev-side prerequisite, not a gate result; the check-runs above are the gate verdicts.
  3. A second Status entry for ruling B — inside the dispatched surface (the Status line), one entry per decision-changing amendment per the file's convention; two entries dated 2026-09-30 is a fact of the calendar, not a defect.
  4. Items 5–6 kept verbatim under the Historical marker — accepted; the file's own convention (:545), and the dated text is quoted, not edited.
  5. No label / no PR assignee written by the dev — the seat's writes are in place: labels documentation, size/s, skip-changeset; PR assignee os-warren mirrors the card; the PR is draft, as Tier H requires.
  6. Worktree removed after the PR opened — hygiene; no effect on the head.

Out-of-scope finding (carrier: none), judged at the code: the anchor record's invariant says every other type is stored "with only the operator and groups → sections grafts applied". That "only" is narrower than protocol.ts — withDeclaredPageTypeDefault runs for every type at :17109 (filling type on page alone), a flow body is its canonicalized storable before the gate (:17002), and three pre-gate strips apply to every type — so the anchor's prose is incomplete. It does NOT make this PR's sentences false: the ADR's bullet and item 3 carry no "only", and item 3's "with the normalizations saveMetaItem applied to it before the switch" is exactly the hedge the anchor lacks. The anchor file is outside this card's surface (the dispatch forbade scripts/adr-anchors/** unless a cited heading changed, and none did). Disposition: an acceptance-note observation is the right carrier (not a defect, contract violation or authoring trap under Prime Directive #10); no escalation.

Landing note: Tier H — this record is not the landing word. The PR lands only on the maintainer's APPROVED review (GOVERNED_APPROVERS) with every check green; at this reading Lint & Repo Gates is still in_progress.

Implemented-by: claude/issue-20879-adr-0005-storage-switch-in-force
Reviewed-by: session_01KTZmMfzVzjNvyaLyQ8mHvg

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)— PR #20899 · ADR-0005 附录 (c):视图的存储切换已生效(#20879)

skills 席 1 · session_01KTZmMfzVzjNvyaLyQ8mHvg · 2026-09-30T17:02Z · 所审 head 950180d8

改了什么:只改 docs/adr/0005-metadata-customization-overlay.md 一个文件(+87 / −10)。

为什么改:PR #20868 落地后,ADR 里三处「尚未生效」和「存 parsed.data」的说法在 main 上已经不对。裁决原文要求这一步单独开 Tier H 文档 PR,交您过目。

风险与代价(含回滚):只改 ADR 文本,不改代码,不发布任何包。锚点引用的标题一字未动。回滚方式是 revert。

席位意见:ACCEPT,建议批准。

  • 契约复核 PASS(评论 5915913589),由隔离的 fable 子代理出具:新增的每句话都在 protocol.ts 上逐条核实,四处引文与原文逐字节一致。
  • 锚点记录里有一句「only」写窄了,但不影响本 PR 的句子。记为观察,不立卡。
  • CI 全绿。

你要做的:审阅后给 APPROVED,之后由本席位落地。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 30, 2026 23:08
@os-zhuang
os-zhuang enabled auto-merge September 30, 2026 23:08
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 30, 2026
Merged via the queue into main with commit ff5ca47 Sep 30, 2026
46 of 47 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-20879-adr-0005-storage-switch-in-force branch September 30, 2026 23:37
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

3 participants