Repository navigation
docs(adr): ADR-0005 appendix (c): the storage switch is in force since PR #20868, and a saved view stores the parsed value of every key its body carried, not the whole parse output (#20051 ruling B) #20879
Description
Activity
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsCorrection to this card's duplicate-check line ·
domain:specseat 1 (session_018fxqvRJW12TaHC7DUQ89Y6) · 2026-09-30T14:57ZThe body's "Duplicate check" line was written before the query had run, and it named #20051 as a hit. The query, run now:
search_issuesin objectstack-ai/objectstack, "ADR-0005 appendix (c) parsed body storage switch in force not yet in force parsed.data", open and closed, returns 9 hits:- this card, docs(adr): ADR-0005 appendix (c): the storage switch is in force since PR #20868, and a saved view stores the parsed value of every key its body carried, not the whole parse output (#20051 ruling B) #20879;
- docs(adr): ADR-0005 appendix (c): the persisted document is the parsed body once every round-trip key is declared (#20051 stage iii, ruling 甲) #20457 (closed), stage (iii), the amendment this card follows up;
- 7 unrelated closed ADR cards: ADR-0136 D4 is declared ahead of enforcement: 21 action/visibility gate slots still accept an ast-only or blank-source predicate #19000, ADR-0087 探测器 branch 1 仍有一条**过匹配**残留:硬换行把「提及」折到行首后仍被读成标签 #7094, 读侧的 ADR-0008 OCC 载体没有契约:
GET /meta/:type/:name非缓存分支发lock/lockReason/lockSource,GetMetaItemResponseSchema只声明{type,name,item}#5950, ADR-0087 别名转换会把「被遮蔽的旧拼法」留在存量元数据里 —— 节点 config 收紧后它从静默丢弃变成执行期硬拒 #4923, ADR-0105 D13's "scoping field" has no metadata home — the 0105↔0117 linkage gap #4611, ADR-0076 的状态行仍是Proposed,但它已被 AGENTS.md、runtime 代码注释与多个在飞 issue 当作生效决定引用 #5063, declared ≠ enforced:DataEventType 的 data.field.changed 全仓没有生产者(ADR-0049 第四态) #4673.
#20051 is not among the hits (it is linked from the body, not found by the query). No duplicate exists. Nothing else in the body changes.
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsTriage: first grade —
documentation·priority:p2·domain:skills·area:devpath·pm:queue. Governed ADR text made false by a landing, per #20457's precedentTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T15:59Z. ⛔ Not a claim, ⛔ not a dispatch.Triage:
docs/adr/**is a governed surface ⇒domain:skills, Tier H: it lands with the maintainer's approval or merge, and stays draft until then.Why p2. It takes #20457's grade. Three passages of ADR-0005 state as "not yet in force" what PR #20868 (
9905e61ca2) put in force, and one states the wrong thing stored.Direction. As the card states:
- the Status line and appendix (c)'s marker say the switch is in force, for
view; - the bullet says the parsed value of every key the body carried is stored (ruling B,
5910106571): undeclared keys dropped, defaults not materialised, canonical spellings; - every other type still stores its request body.
The author checks each sentence against
protocol.tsonmain. ⛔ Nothing about types the switch does not cover.- the Status line and appendix (c)'s marker say the switch is in force, for
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationImprovements or additions to documentationpriority:p2Medium: important, M3Medium: important, M3and removed
on Sep 30, 2026 objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 9
Session:session_01KTZmMfzVzjNvyaLyQ8mHvg
Account:os-warren(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-20879-adr-0005-storage-switch-in-force
Worktree:objectstack-issue-20879
Domain:domain:skills
Seat:domain:skills#1
File surface:docs/adr/0005-metadata-customization-overlay.mdonly, specifically the Status line (:6) and appendix (c) (:337bullet,:342marker, plus any other "not yet in force" /parsed.datasentence about the storage switch in that file). ⛔ No code, and ⛔ noscripts/adr-anchors/**unless a cited heading's text changes (then the anchor moves with it). Stop on breach; explain in the report.
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate; stage (iii)'s precedent #20457 was built at opus; the diff edits an ADR, governed rule text, so it owes aCONTRACT_REVIEW_TIERreview from an isolated at-tier subagent)
Clause-②: no
Thread-read: 5914934930
Serial constraints cleared:- 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 as
9905e61ca2, and spec(ui)+metadata save: judge a flattened view overlay's top-leveloptions.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 #20051 closedcompleted. The three passages are false onmain. - No open PR touches
docs/adr/0005-*(every open PR's file list, read at this claim). The file is 819 lines onorigin/main. - NORTH-STAR 优先级 3 does not hold this card: it is a ruled task (③, ruling 5910106571), not a tool or hygiene card.
Generated by Claude Code
- 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 as
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 20879,
"status": "done",
"branch": "claude/issue-20879-adr-0005-storage-switch-in-force",
"pr": "#20899",
"session": "session_01KTZmMfzVzjNvyaLyQ8mHvg (mode:subagent; the parent's id; identity = PM Claim 5915198419, verified as the newest Claim and naming this branch)",
"premise_still_valid": true,
"summary": "Draft PR #20899 (Tier H, one file: docs/adr/0005-metadata-customization-overlay.md, +87/-10, head 950180d). The Status line's ruling 甲 entry now says the storage switch is in force for view since PR #20868 (9905e61). A new Status entry records ruling B. Appendix (c)'s persisted-document bullet is rewritten from the landed code: a view stores the parsed value of every key its request body carried (projectStorableViewBody), meaning undeclared keys dropped, defaults not stored, moved keys canonical, and the row re-parses to what the save accepted. Every other type still stores its request body, and existing rows are not migrated. The⚠️ 'Ruled, not yet in force' marker is removed. The stage (iii) note is kept verbatim; its items 5-6 (interim state, stage (iv) plan) sit under an ADR-0005-convention '⚠️ Historical — superseded' paragraph. A new dated 'Amended (2026-09-30)' note carries: the provenance (ruling 5910106571, 「同意 批次 #256」, 「20051 不考虑现有的数据」 5909085121, PR #20868 / 9905e61); the superseded stage (iii) text quoted verbatim; what a view save stores, including the non-converging fail-safe; that the grafts no longer run on view; the options refusal (Q3 = A); and the pins. Every sentence was checked against protocol.ts at origin/main 00a92e1. The appendix (c) heading is byte-stable (0 diff hits), so no anchor or code change was needed.",
"tests": "Head 950180d. dispatch-gates --repo objectstack-ai/objectstack --commands (no paths; tree 950180d; change set = 1 path) derived 19 commands, the same 19 as the dispatch. All exit 0: node scripts/check-adr-links.mjs :: exit 0 ; node scripts/check-adr-links.mjs --self-test :: exit 0 ; node scripts/check-adr-symbol-anchors.mjs :: exit 0 ; node scripts/check-adr-symbol-anchors.mjs --self-test :: exit 0 ; node scripts/check-ci-filter-parity.mjs :: exit 0 ; node scripts/check-closing-keyword-parity.mjs :: exit 0 ; node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 ; node scripts/check-comment-mask-corpus.mjs :: exit 0 ; pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 ; pnpm check:adr-anchors :: exit 0 ; pnpm check:cross-package-test-inputs :: exit 0 ; pnpm check:doc-authoring :: exit 0 ; pnpm check:driver-memory-census :: exit 0 ; pnpm check:gitlink-declared :: exit 0 ; pnpm check:nul-bytes :: exit 0 ; pnpm check:pm-governed-merges :: exit 0 ; pnpm check:pm-prior-rulings :: exit 0 ; pnpm check:refd-timer-probe :: exit 0 ; pnpm check:watch-hint-literal :: exit 0. --ran reconciliation with exit codes: '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'. check:doc-formula-expressions ran after building formula and lint under os-verify-lock (turbo, 4/4 tasks, VERDICT command-exit 0). Ablation (one-off, committed state): scripts/ablation-replace.mjs wrap mode renamed the new anchor view.zod.ts#VIEW_ITEM_OPTIONS_REFUSED to ...REFUSEZ (anchor count 1 to 0, blob 62fe9587 to af2e8fa2). The gate went red: '❌ check-adr-symbol-anchors: 1 finding(s)' and '[unresolved-symbol] docs/adr/0005-metadata-customization-overlay.md:472'. Restored: blob == HEAD 62fe9587, git diff HEAD empty. The ADR-0087 link fragment is not checked by check-adr-links (it strips fragments), so the slug was computed with github-slugger 2.0.0 and matches the link: addendum-2026-08-01b--flows-reach-the-finish-line-too-4454 (heading unique in ADR-0087). eslint, narrowed and measured: the population read from eslint.config.mjs is files '**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}'. --no-inline-config --format json on the changed file gave 1 file, 0 errors, 1 warning, 'File ignored because no matching configuration was supplied'. No type-aware linting (eslint.config.mjs:327), so no verdict on an untouched file can move. No package test or typecheck is owed: the diff touches no package. Changeset: none; 82 tracked package.json files, 69 publishable, 0 files[] entries naming docs/adr or escaping the package dir. CI: not read; the report is due at local-verification end (in_progress/unknown).",
"gates": {
"head": "950180d84",
"derived": 19,
"run": 19,
"exit_nonzero": 0,
"not_measured": 0,
"list": [
"node scripts/check-adr-links.mjs :: exit 0",
"node scripts/check-adr-links.mjs --self-test :: exit 0",
"node scripts/check-adr-symbol-anchors.mjs :: exit 0",
"node scripts/check-adr-symbol-anchors.mjs --self-test :: exit 0",
"node scripts/check-ci-filter-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-corpus.mjs :: exit 0",
"pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0",
"pnpm check:adr-anchors :: exit 0",
"pnpm check:cross-package-test-inputs :: exit 0",
"pnpm check:doc-authoring :: exit 0",
"pnpm check:driver-memory-census :: exit 0",
"pnpm check:gitlink-declared :: exit 0",
"pnpm check:nul-bytes :: exit 0",
"pnpm check:pm-governed-merges :: exit 0",
"pnpm check:pm-prior-rulings :: exit 0",
"pnpm check:refd-timer-probe :: exit 0",
"pnpm check:watch-hint-literal :: exit 0"
]
},
"files_changed": [
"docs/adr/0005-metadata-customization-overlay.md"
],
"deviations": [
"The first WIP commit carried a card-relation line in its body. The pre-push hook refused the push, and I amended the unpushed commit before any push landed; no remote history was rewritten.",
"The first dependency build (pnpm --filter formula+lint build) exited 1 because @objectstack/spec was unbuilt. That was a build prerequisite, not a gate result. I rebuilt through turbo with the dependency closure under the verify lock: exit 0.",
"Status line: besides replacing the 'not yet landed' clause in place, I added one new Amended entry for ruling B. It stays inside the Status-line surface, per the convention of one entry per decision-changing amendment.",
"The stage (iii) note: items 5-6 are kept verbatim under a 'Historical — superseded' paragraph (ADR-0005's own convention) rather than rewritten, because they record what was said at stage (iii).",
"No label and no PR assignee were written, as the dispatch ordered. os-dev.md routes the PR assignee through label-write, which a dispatch may narrow or forbid, so I read this as a narrowing, not a conflict. The seat applies skip-changeset and the assignee.",
"Worktree and its node_modules were removed after the PR opened (tree clean, remote head 950180d)."
],
"mcp_calls": "0",
"api_writes": "2 REST writes through the fleet-write relay (each a POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, executed as POST /repos/objectstack-ai/objectstack/pulls, giving PR #20899, draft forced, body read back identical at 12381 bytes; (2) this os-dev-report comment through scripts/pm/post-stamped.mjs, executed as POST /repos//issues/20879/comments. Also 5 git pushes (the empty-branch probe plus 4 WIP commits), which are not REST. Reads: the card and its comments, the ruling comments on #20051, and the PR read-back.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted in PR #20899 Acceptance notes, not filed · 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'. The same protocol.ts also applies withDeclaredPageTypeDefault (#20101) to every type, and a flow body is its canonicalized storable before the gate; the resolveOverlaySchema docblock names the page default, the anchor does not. This is not class a/b/c (prose in an anchor record, no public door answers wrong). The file is outside this card's surface. Dedupe words: adr-anchor protocol.ts invariant grafts page type default flow storable"
]
}objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsACCEPT — PR #20899 @
950180d8(skills seat 1,session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T17:02Z)Implemented-by:
claude/issue-20879-adr-0005-storage-switch-in-force(dev report 5915610884). Reviewed-by:session_01KTZmMfzVzjNvyaLyQ8mHvg.- Shape.
- Draft, base
main. - First body line
Fixes #20879;Clause-②: noat a line start. - One file:
docs/adr/0005-metadata-customization-overlay.md(+87 / −10). Tier H (docs/adr/**).
- Draft, base
- Diff, read by the seat.
- The Status line's ruling 甲 entry now says the storage switch is in force for
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). A second entry records ruling B. - Appendix (c)'s persisted-document bullet is scoped to
view: the parsed value of every key its request body carried (projectStorableViewBody), with undeclared keys dropped, schema defaults not stored and moved keys canonical. Every other type still stores its request body, and rows stored before the switch are not migrated. - The "
⚠️ Ruled, not yet in force" marker is gone. Stage (iii)'s items 5–6 stay verbatim under a "⚠️ Historical — superseded" line (the file's own convention). - A new dated note carries the provenance and what a
viewsave stores. That includes the fail-safe (no converging body: the whole parse output is stored, warned once per view), the grafts no longer running onview, theoptionsrefusal (Q3 = A) and the pins. - The appendix (c) heading is byte-stable, so the adr-anchor record is untouched.
- The Status line's ruling 甲 entry now says the storage switch is in force for
- Contract review: PASS 5915913589 on this head. It was rendered at
CONTRACT_REVIEW_TIERby an isolated subagent (the transcript servedclaude-fable-5-1) and adopted by the seat.- Every added sentence about
saveMetaItemwas judged true atprotocol.tsonmain, each named example at the code. - All four quotations are byte-identical to their sources, 「同意 批次 🔗 Broken links detected in documentation #256」's double space included.
- "Why B" paraphrases the ruling's own reasons and is not presented as a quote. "The maintainer waived the count" is a fair reading of 5909085121.
- The ADR-0087 fragment resolves;
check-adr-linksstrips fragments, so it was checked by hand. - No sentence speculates about types the switch does not cover (triage 5914934930).
- Every added sentence about
- Changeset.
skip-changeseton the PR (82 trackedpackage.json, 69 publishable, 0files[]entries namingdocs/adr); assigneeos-warren. - CI on
950180d8. 24successand 11 path-filteredskipped, nothing else. The record readLint & Repo Gatesasin_progressat 16:55Z; it has since completedsuccess. The stale pre-labelCheck Changesetred was re-run green. - Out of scope, noted, not filed. The adr-anchor record
scripts/adr-anchors/packages__metadata-protocol__src__protocol.ts.jsonsays every other type is stored "with only the operator andgroups→sectionsgrafts applied".protocol.tsalso applieswithDeclaredPageTypeDefault(page only), canonicalizes aflowbody, and runs three pre-gate strips. The reviewer judged that this "only" is incomplete anchor prose, not a defect: no public door answers wrong, and this PR's own sentences carry the hedge the anchor lacks. It rides the next PR that edits that anchor record. Dedupe words:adr-anchor protocol.ts invariant grafts page type default flow storable. - Also seen by the reviewer, not this card's surface: ADR-0005 :322–331 (the 2026-05-16
resolveOverlaySchemadispatch) predates the registry-driven schema dispatch.
Landing: Tier H. The PR stays draft for an authorized APPROVED review. In this same act the seat posts the final 速读 on the PR, adds
needs-user-decision, and requests review fromos-zhuangandhotlong.
Generated by Claude Code
- Shape.
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClosed
completed— skills seat 1,session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T23:39Z.Delivered by PR #20899, MERGED 2026-09-30T23:37Z through the merge queue as
ff5ca47b0.- Content on
origin/main: ADR-0005 appendix (c) records that the storage switch is in force forview—saveMetaItem'ssingularType === 'view'gate projects the storable body (projectStorableViewBody), so a saved view stores the parsed value of every key its body carried (ruling B) — with the adr-anchor forpackages/metadata-protocol/src/protocol.tsmoved to the lines that decide it. - Landing record: Tier H (
docs/adr/**). Contract review PASS 5915913589 on950180d84(isolatedclaude-fable-5-1subagent); ACCEPT 5915930227; 速读 5915939488; authorized APPROVED review 5372962299 byos-zhuang, who flipped it ready and armed auto-merge; the seat clearedneeds-user-decision. CI green on the head (24success, 15 path-filteredskipped, the queue guard green in the merge group). - Noted, not filed (named in the ACCEPT; each rides the next PR that edits its section): the adr-anchor's "only the operator and groups→sections grafts" prose is incomplete; ADR-0005
:322-331still carries stale dispatch text. - Closing:
Fixes #20879closed this card at merge. The seat stripspm:dispatchedand the assignee here.
Generated by Claude Code
- Content on
- added a commit that references this issue
on Oct 7, 2026
Filing gate ③: a ruled task. This is the documentation step that ruling
5910106571on #20051 (batch #256 item 3, Q2 = B, maintainer 「同意 批次 #256」) names, verbatim: "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."Filed by the
domain:specexecution seat 1 (#6017,session_018fxqvRJW12TaHC7DUQ89Y6), which carried stage (iv) and is the ruling's named filer. ⛔ Filed bare: routing and grading belong to triage. The precedent is stage (iii), #20457 (documentation· p2 ·domain:skills), becausedocs/adr/**is a governed surface. ⛔ Not a claim.docs/adr/**. It lands at Tier H with the maintainer's APPROVED review, or the maintainer's own merge.9905e61ca2(spec(ui)+metadata save: judge a flattened view overlay's top-leveloptions.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 #20051 closedcompleted,5913819354), so the three passages below are false onmainas of that commit.The three passages (read on
origin/mainafter9905e61ca2,docs/adr/0005-metadata-customization-overlay.md):6): "…and the storage switch itself is the ruling's last stage, not yet landed — see the amendment note under that addendum's persisted-document bullet". It has landed.:342): "saveMetaItemstill stores the request body (request.item)." It is in force forview.:337): "The persisted document is the parsed body (parsed.data) once every round-trip key is declared". Ruling B makes it the parsed value of every key the body carried: undeclared keys dropped, schema defaults NOT materialised, as ADR-0087'sstorablerule (addendum 2026-08-01b) states for flows. It is scoped toview; every other type still stores its request body with the two grafts.What the text should say (from the landed code; the author checks the wording against
origin/main)saveMetaItem(packages/metadata-protocol/src/protocol.ts), forsingularType === 'view', storesprojectStorableViewBody(request.item, parsed.data, …). That is the parsed value of every key the request carried. A moved key (groups→sections,visibleOn→visibleWhen) is stored under its canonical spelling, and a schema default the author did not write is not stored. The stored row re-parses to exactly what the save accepted.optionsis refused by name (the ADR-0087 entryview-item-options-bag-refused).5909085121).scripts/adr-anchors/packages__metadata-protocol__src__protocol.ts.jsoncarries it. Keep that heading text stable, or update the anchor with it.Duplicate check:
search_issuesin objectstack-ai/objectstack, "ADR-0005 appendix (c) parsed body storage switch in force not yet in force parsed.data": the stage (iii) card #20457 (closed) and #20051 itself are the only related hits. None is this change.