Repository navigation
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
Conversation
…view (WIP) Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg Co-authored-by: Claude <noreply@anthropic.com>
…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>
Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Scope of this record. PR #20899 for card #20879, one file: Check-runs on the head (read 2026-09-30T16:55:40Z): 35 runs — 23 ① Derived judgmentsThe diff edits governed rule text (Tier H, Status line (:6).
Appendix (c) bullet (:337–351), each clause at the code.
The " New note's provenance (:421–433). 「同意 批次 #256」 is byte-identical to 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 Item 2, each named example at the code. Item 3. "The two grafts no longer run on a Item 4 (Q3 = A). The ruling: "Q1 = A and Q3 = A stand as the seat answered them (… a top-level Item 5 (the pins). All three exist on Heading stability. Out-of-scope stale text seen, not judged against this PR: :322–331 (the 2026-05-16 ② Semver level
③ Boundary flagsDev deviations in
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 Landing note: Tier H — this record is not the landing word. The PR lands only on the maintainer's APPROVED review ( Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)— PR #20899 · ADR-0005 附录 (c):视图的存储切换已生效(#20879)skills 席 1 · 改了什么:只改
为什么改:PR #20868 落地后,ADR 里三处「尚未生效」和「存 风险与代价(含回滚):只改 ADR 文本,不改代码,不发布任何包。锚点引用的标题一字未动。回滚方式是 revert。 席位意见:ACCEPT,建议批准。
你要做的:审阅后给 APPROVED,之后由本席位落地。 Generated by Claude Code |
Fixes #20879
Clause-②: no
This is the documentation step that ruling
5910106571on #20051 names (batch #256 item 3, Q2 = B, maintainer 「同意 批次 #256」): "ADR-0005 appendix (c)'sparsed.datawording 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:viewsince 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)". It points at "the amendment notes" (plural).**Amended** (2026-09-30, #20051 ruling B — …)entry: the parsed body aviewstores is the parsed value of every key its request body carried, not the whole parse output. Undeclared keys are dropped, schema defaults are not materialised, and a moved key is stored under its canonical spelling. Every other type still stores its request body.viewstores the parsed value of every key its request body carried (projectStorableViewBody).request.item).storablerule.5910106571with the maintainer's 「同意 批次 🔗 Broken links detected in documentation #256」. The maintainer's 「20051 不考虑现有的数据」 (5909085121), which waived the stored-row count. 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, merged as9905e61ca2.viewsave stores.viewsave, and every other type still stores its request body.optionsis refused by name (Q3 = A). This settles the judgement the first note's item 6 left open.The heading
Addendum — 2026-05-16 (c): spec validation on overlay saveis byte-stable: 0 hits in the diff and 1 in the file. Soscripts/adr-anchors/packages__metadata-protocol__src__protocol.ts.jsonand 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/main00a92e18d)saveMetaItem(packages/metadata-protocol/src/protocol.ts) storesprojectStorableViewBody(request.item, parsed.data, reparse)insideif (singularType === 'view'). Every other type goes to theelsebranch, which keepsgraftNormalizedOperators(graftFoldedFormSections(request.item, parsed.data), parsed.data).buildStorableViewNode's docblock and body:converged: trueonly whenstorableEqual(again.data, parsed). Otherwise it storesparsedwhole and warns once per view (storableViewFallbackWarned). Item 2 of the new note says both.saveMetaItemapplied to it before the switch" (item 3) covers what the other types already had, and nothing new:typedefault (withDeclaredPageTypeDefault, metadata: a page saved withouttypeis stored and served without it, soPageSchema's declaredtypedefault (record) never reaches a consumer that reads the served body #20101, which predates 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);optionsrefusal:VIEW_ITEM_OPTIONS_REFUSEDandoptions: z.never(…)inpackages/spec/src/ui/view.zod.ts, and the ADR-0087 entryview-item-options-bag-refusedinpackages/spec/src/migrations/registry.ts.protocol.project-storable-view-body.test.tscovers the converged arms and the fail-safe.protocol.graft-folded-form-sections.test.tshas the stage (iv) describe blocks: W1–W5 store notype, 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.tsre-judged "preserves Studio-only auxiliary fields verbatim" as "stores the console's declared round-trip keys, and drops theobjectNamealias".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:request.itemsave"viewrequest.item)"elsebranch)Evidence (head
950180d84)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, with no paths. The tree is950180d84and 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.--ranwithCOMMAND :: exit CODElines: "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/formulaand@objectstack/lintfirst, 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".check-adr-linksstrips#fragmentand 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)withgithub-slugger2.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.scripts/ablation-replace.mjsin wrap mode. It renamed the new anchorview.zod.ts#VIEW_ITEM_OPTIONS_REFUSEDto…REFUSEZ: anchor count 1 to 0, blob62fe9587toaf2e8fa2.62fe9587(the HEAD blob) andgit diff HEADis empty.const.eslint.config.mjs:files: ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}']. No config object matches.md.eslint --no-inline-config --format jsonon the changed file: 1 file, 0 errors, 1 warning, "File ignored because no matching configuration was supplied".:327). So a markdown-only diff moves no eslint verdict on any file.docs/adr/**publishes nothing. Measured: 82 trackedpackage.jsonfiles, 69 not private (the root is private). None has afiles[]entry that namesdocs/adror climbs out of its package directory. Soskip-changesetapplies, and the seat applies the label.Acceptance notes
These are observations, not filed.
scripts/adr-anchors/packages__metadata-protocol__src__protocol.ts.jsonsays every other type is stored "with only the operator andgroups→sectionsgrafts applied".withDeclaredPageTypeDefault(metadata: a page saved withouttypeis stored and served without it, soPageSchema's declaredtypedefault (record) never reaches a consumer that reads the served body #20101) to every type.storablebefore the gate.resolveOverlaySchemadocblock names the page default. The anchor text does not.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).维护者速读(草稿)
改了什么:只改了 ADR-0005 这一份文档,四处。
view生效"。另外新加一条"已修订",记录裁决 B。parsed.data,已裁定、尚未生效"。现在照已合并的代码写:视图保存时,只存请求体里带了的每个键的解析值。没声明的键丢掉,作者没写的 schema 默认值不落库,旧拼写的键按规范拼写存(groups→sections,visibleOn→visibleWhen)。其它类型仍然存请求体。存量行不迁移。options按名拒收,以及对应的测试。为什么改:裁决
5910106571点名要求这一步。第 (iv) 步(PR #20868,9905e61ca2)已经合并,所以这三处"尚未生效 / 存parsed.data"的文字在main上已经是错的。风险与代价(含回滚):
席位意见:
你要做的:审阅后在本 PR 上给 APPROVED。这是 Tier H 治理面
docs/adr/**,之后由席位落地。Generated by Claude Code