Repository navigation
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
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationpriority:p2Medium: important, M3Medium: important, M3
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsUnlock:
pm:blocked→pm:queue. Stage (ii)'s spec symbols are onmain, so the appendix can now be written truthfullyTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T18:09Z. ⛔ Not a claim, ⛔ not a dispatch.documentation· p2 ·domain:skillsunchanged.- The blocker is closed. spec(ui)+objectui: declare the console's round-trip keys on the stored view overlay (#20051 stage ii, ruling 甲) #20456 closed
completedwith PR feat(spec): declare the console's round-trip keys on the stored view wire (#20456) #20474, merged 2026-09-28T17:42Z ase967cbd24. - Read before release.
export const VIEW_CONSOLE_ROUND_TRIP_KEYSis inpackages/spec/src/ui/view.zod.tsonorigin/main3062e5001. That is the symbol the amendment's dated note names. - objectui's end (objectui#11013) is not a precondition here. The ruling words the appendix as "the persisted document is the parsed body once every round-trip key is declared", and declaring is the spec's end.
- Scope unchanged. Tier H, with the maintainer's APPROVED review. ⛔ No persistence code and no GUARD pins: those are stage (iv)'s, on spec(ui)+metadata save: judge a flattened view overlay's top-level
options.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 #20051.
- The blocker is closed. spec(ui)+objectui: declare the console's round-trip keys on the stored view overlay (#20051 stage ii, ruling 甲) #20456 closed
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01KTZmMfzVzjNvyaLyQ8mHvg
Account:os-warren(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-20457-adr-0005-appendix-c-parsed-body
Worktree:objectstack-issue-20457
Domain:domain:skills
Seat:domain:skills#1
File surface:docs/adr/0005-metadata-customization-overlay.md(appendix (c), the persisted-document bullet at:337–:341, plus a dated amendment note beside it); a new file underscripts/adr-anchors/only if the amendment adds a symbol anchor the gates require. ⛔ No persistence code, ⛔ no GUARD pins (stage iv, on #20051). Stop on breach; explain in the report.
Container & model:S, not mechanical ⇒ M treatment,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate, the default judgment tier; the compensating control is this seat's review atCONTRACT_REVIEW_TIER, rendered by an isolated at-tier subagent because this seat is below tier)
Clause-②: no
Ruling-ref: 5856781584
Thread-read: 5875792846
Serial constraints cleared: no open PR touchesdocs/adr/0005-*(all ten open PRs' file lists read at the round-open marker 5903866929); this lane has no otherpm:dispatchedcard on this path; no same-day churn (last touch of the file67add130); #20051 (the parent,pm:blocked) holds stage (iv) and is not in flight.Readings at 2026-09-30T04:15Z on
origin/mainc9c182ed: appendix (c) at:337still reads 「The persisted document is the originalrequest.item, NOTparsed.data」;export const VIEW_CONSOLE_ROUND_TRIP_KEYSis atpackages/spec/src/ui/view.zod.ts:6242; the two pins that guard the verbatim save are still onmain(packages/objectql/src/protocol-meta.test.ts:586「preserves Studio-only auxiliary fields verbatim (not stripped)」,packages/metadata-protocol/src/protocol.graft-folded-form-sections.test.ts:222「GUARD: Studio-only round-trip keys still survive the save」) ⇒ stage (iv) has not landed and the runtime still storesrequest.item. Blocker #20456 closedcompleted(PR #20474). The ruling 5856781584 was retrieved in this pass.
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 20457, "status": "done", "branch": "claude/issue-20457-adr-0005-appendix-c-parsed-body", "pr": "https://github.com/objectstack-ai/objectstack/pull/20777", "session": "session_01KTZmMfzVzjNvyaLyQ8mHvg", "premise_still_valid": true, "head": "c8ee5833", "files_changed": [ "docs/adr/0005-metadata-customization-overlay.md" ], "summary": "Appendix (c), the persisted-document bullet of ADR-0005 'Addendum 2026-05-16 (c)', now states the ruled end state: the persisted document is the parsed body (parsed.data) once every round-trip key is declared. The bullet itself says 'Ruled, not yet in force'. A dated note, 'Amended (2026-09-30)', follows directly under it, in ADR-0053's 2026-09-30 in-place style. It carries: the provenance (ruling 甲, #20051 comment 5856781584); the 2026-05-16 bullet quoted verbatim as superseded; the record VIEW_CONSOLE_ROUND_TRIP_KEYS and its closure test; the declaring symbol per key per member (ViewItemWireSchema and VIEW_METADATA_MEMBERS.listOverlay, via viewSwitcherRowStateFields, viewItemWireFields, listOverlayRoundTripFields, viewItemBaseShape and flattenedViewOverlayFields); where the census's other finds map (objectName to object, etc.); the interim state; and what stage (iv) does. The Zone-2 tension is resolved in text, as the PM assumed and as ADR-0053's 'Interim state' item does: on main the runtime still stores request.item (I verified this and read the pins), so the note says a key no member declares is still stored today, and that 'declared' does not yet mean 'the only keys stored'. The status line gains one Amended (2026-09-30) entry: PD #13 requires an amended status line for a reversed decision, and every earlier decision-changing amendment of this ADR is on that line. No code, no pins, nothing under packages/, no adr-anchors file (no gate asked for one). The worktree was removed after the PR opened.", "tests": "All 19 derived gates exit 0 on head c8ee5833. The list came from dispatch-gates --repo objectstack-ai/objectstack --commands with no paths; it is the same 19 as the dispatch. --ran reconcile: '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)'. Gates: check-adr-links (+--self-test), check-adr-symbol-anchors (+--self-test; '2156 anchors across 140 records resolve — 320 symbol (294 declaration, 26 literal), 1809 file-level, 27 cross-repo, 6 exempt, 9 continuation'), 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. check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET: formula and lint unbuilt in the fresh worktree), which measured nothing. I built both under os-verify-lock (VERDICT command-exit 0, turbo 4/4 cached) and reran it on the same head: exit 0. Ablation (one-off, no permanent test file), run from the committed state: scripts/ablation-replace.mjs renamed #listOverlayRoundTripFields to #listOverlayRoundTripFieldz (anchor 1->0, blob a893abb2->50270267). The gate then printed '❌ check-adr-symbol-anchors: 1 finding(s)' with [unresolved-symbol] at the note's line. I restored the file with git checkout HEAD --: hash-object was a893abb2 again, equal to the HEAD blob; git diff HEAD and git status were empty. PR body checked with check-closing-keyword-parity --body: only 'Fixes #20457' binds, and #20051 binds with no parser. The body read back from the API byte-identical to what was sent (8364 bytes). CI at report time, head c8ee5833: in_progress (Lint & Repo Gates, Test Core 1-6/6, Governed Surface Queue Guard running); 'Part-of PR must not also close its card' success; Check Changeset success. No package build or test is owed: the diff touches no package.", "gates": [ "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 3 then exit 0 (after building formula+lint)", "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" ], "deviations": [ "The status line of ADR-0005 was edited, which is outside the claim's literal surface (the bullet plus a note beside it). It is in the same file. The reason is PD #13: reversing a recorded decision needs an amended status line. The file's convention agrees: each decision-changing amendment is on it.", "Attribution: the harness reminder asked for a 'Co-Authored-By: Claude' trailer carrying a model name, and a robot-emoji PR footer. I followed AGENTS.md instead: the model-free trailer pair (Claude-Session + Co-authored-by: Claude) and the session-URL footer.", "Per the rule that bars HTML comments, the report comment uses the plain first-line os-dev-report marker." ], "mcp_calls": "0 — no MCP GitHub tool used; card, comments, ruling, PR and check-runs were read via single-item REST GETs (curl, GH_TOKEN).", "api_writes": "3 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches), executed by fleet-write as objectstack-fleet[bot]: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft #20777); (2) label-write -> POST /repos/objectstack-ai/objectstack/issues/20777/labels [skip-changeset] + POST /repos/objectstack-ai/objectstack/issues/20777/assignees [os-warren], read-back MATCHES; (3) this report -> POST /repos/objectstack-ai/objectstack/issues/20457/comments. Plus git push x2 (empty-branch probe, then c8ee5833) — not REST. The card assignee was not written.", "open_questions": [], "out_of_scope_findings": [ "carrier: stage (iv) on #20051 · noted, not filed — the verbatim-save pin population is wider than the two the ruling read. Three tests assert it by name: objectql protocol-meta.test.ts 'preserves Studio-only auxiliary fields verbatim (not stripped)'; metadata-protocol protocol.graft-folded-form-sections.test.ts 'GUARD: Studio-only round-trip keys still survive the save'; protocol.graft-normalized-operators.test.ts 'keeps Studio-only auxiliary fields a parsed.data swap would strip'. protocol.runtime-authoring-gate.test.ts also depends on it ('the door persists the authored body verbatim'). Two pins need re-judging, not only flipping. The graft-folded GUARD puts isPinned/isDefault/sortOrder on a FORM overlay, and VIEW_CONSOLE_ROUND_TRIP_KEYS says the console never writes them there. The protocol-meta pin writes objectName, which the census maps to object. Dedupe words: verbatim save pins, GUARD flip, parsed body stage iv, Studio-only auxiliary fields.", "carrier: stage (iv) on #20051 · noted, not filed — the per-type scope of the storage switch. resolveOverlaySchema validates every type with a registered schema, and each is stored as sent today. The ruling's end state names 'a saved view', and the round-trip census covered view only. The amended bullet states the rule with its condition and claims the condition is satisfied for view only. Whether stage (iv) also switches dashboard and the other validated types is stage (iv)'s judgment. Dedupe words: parsed body dashboard overlay, resolveOverlaySchema scope, round-trip census view only.", "carrier: stage (iv) on #20051 · noted, not filed — code comments cite this decision as 'ADR-0005 §Validation', a heading the ADR does not have: the resolveOverlaySchema docblock and saveMetaItem comment in metadata-protocol protocol.ts, and the pins. They describe today's behaviour, which stays true until stage (iv). No scripts/adr-anchors entry ties protocol.ts to ADR-0005; the stage that implements the decision in code is where that anchor belongs (PD #13). Dedupe words: ADR-0005 §Validation, adr-anchors protocol.ts ADR-0005, appendix (c) citation." ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsACCEPT — PR #20777 @
c8ee5833(skills seat 1,session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T04:51Z)Implemented-by:
claude/issue-20457-adr-0005-appendix-c-parsed-body(dev report 5904124008). Reviewed-by:session_01KTZmMfzVzjNvyaLyQ8mHvg.Review checklist, read on GitHub (not the report):
- Shape: draft, base
main, first body lineFixes #20457, a separatePart of #20051with no closing keyword beside#20051;Clause-②: noat a line start. One file,docs/adr/0005-metadata-customization-overlay.md, +71 / −7 (check-governed-merges --pr 20777: Tier H,docs/adr/**×1, 78 changed lines, under the 5000 threshold). - Scope: inside the claim's file surface; the status-line entry is the one deviation, accepted (Prime Directive [WIP] Add Chinese version of the documentation #13 asks for an amended status line on a reversed decision; every earlier amendment of this ADR is on it). No
packages/**, no pins, noscripts/adr-anchors/**, nocontent/docs/releases/**. - Changeset:
skip-changesetlabel present,Check Changesetsuccess —docs/adr/**publishes nothing. - Ruling fidelity: the bullet states ruling 甲 (iii)'s end state ("the persisted document is the parsed body once every round-trip key is declared") and marks it "Ruled, not yet in force"; the dated note names the stage (ii) symbols. Seat spot-checks on
origin/mainc9c182ed:export const VIEW_CONSOLE_ROUND_TRIP_KEYSatpackages/spec/src/ui/view.zod.ts:6242,VIEW_METADATA_MEMBERSat:6193,viewSwitcherRowStateFieldsat:5199;saveMetaItemstill grafts and storesrequest.item(packages/metadata-protocol/src/protocol.ts:16451); both verbatim-save pins present (protocol-meta.test.ts:586,protocol.graft-folded-form-sections.test.ts:222) — so the "not yet in force" hedge is true and required. - CI on
c8ee5833: 35 check-runs, 24success, 11 path-filteredskipped, 0 failure;Lint & Repo GatesandTypeScript Type Checkbothsuccess. ## Contract reviewPASS on this head: 5904271563 (rendered atCONTRACT_REVIEW_TIERby an isolated subagent — this seat is below tier — and adopted by the seat; its transcript servedclaude-fable-5-1throughout). One precision note from it, left to the maintainer as optional wording, ⛔ not a REWORK: note item 3's "No form-overlay row carries these keys" is true of console-written rows but the form member does declareisDefault/columnState; "writes" would be the tighter verb.- Report:
mcp_calls0;api_writes3 (relaypr_create,label-write, the report comment); gates 19 / 19 derived, 0 NOT-MEASURED (--ran), one-off ablation proved the symbol-anchor gate reads the note.
Out-of-scope findings (three, all
carrier: stage (iv) on #20051): Acceptance notes — each is in the PR's## Acceptance notesand a one-comment pointer goes on #20051 so the stage (iv) dispatch reads them; none is a card (none is a defect ofmaintoday: they describe what stage (iv) must re-judge).Landing: Tier H — the PR stays draft and awaits an authorized APPROVED review (
GOVERNED_APPROVERS);needs-user-decisiongoes on the PR and review is requested fromos-zhuangandhotlongin this same act; the final 维护者速读 is posted on the PR. On approval this seat lands it through the queue.
Generated by Claude Code
- Shape: draft, base
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClosed
completed— skills seat 1,session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T05:27Z.Delivered by PR #20777, MERGED 2026-09-30T05:25Z through the merge queue as
085ca6bc.- Content confirmed on
origin/main085ca6bc:docs/adr/0005-metadata-customization-overlay.mdappendix (c) states the ruled end state (the parsed body once every round-trip key is declared), marked "Ruled, not yet in force", with the 2026-09-30 amendment note naming the stage (ii) symbols; the status line carries the amendment. - Landing record:
## Contract reviewPASS 5904271563 onc8ee5833(the landing head), ACCEPT 5904291220, authorized approval byos-zhuang(5361718094, aGOVERNED_APPROVERSaccount), readied and queued by the approver. - The PR body's first line
Fixes #20457did not close this card at merge (no link event on the timeline), so the seat closes it here;pm:dispatchedcomes off and the assignee is cleared in this close-out. - Stage (iv) stays on spec(ui)+metadata save: judge a flattened view overlay's top-level
options.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 #20051; the pointer for it is 5904333057.
Generated by Claude Code
- Content confirmed on
- added a commit that references this issue
on Oct 7, 2026
Filing gate ③: a ruled task. Stage (iii) of ruling 甲 on #20051 (
5856781584, batch #227 item 2, maintainer 「开始总监决裁」).Blocked-by: #20456
Filed by the triage seat (seat post #6015,
session_01AavokzJ5DndAwitDXvKy4U) in place ofdomain:specseat 2, which the ruling names as filer and which is vacant (#18549). The maintainer asked the triage seat directly, verbatim: 「#20051 的子卡 你为什么不能立」. ⛔ Not a claim.domain:skillsseat, sincedocs/adr/**is a governed surface; it lands at Tier H with the maintainer's APPROVED review.options.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 #20051 (spec(ui): a flattenedviewKind: 'list'view overlay with nocolumnsis refused by the list overlay member, then ACCEPTED by the form overlay member, so its list keys are stripped unjudged and a wrong 200 stores it #20186, spec(ui): a flattened view overlay acceptsowner/hiddenat the save door and nothing reads either, sohidden: truesaves clean and the view stays listed #20230, metadata: a page saved withouttypeis stored and served without it, soPageSchema's declaredtypedefault (record) never reaches a consumer that reads the served body #20101), none of them this stage. No open duplicate.What the ruling orders (item 1, stage iii, verbatim)
The text it amends
docs/adr/0005-metadata-customization-overlay.md, appendix (c): 「The persisted document is the originalrequest.item, NOTparsed.data. Studio attaches auxiliary fields (isPinned,isDefault,sortOrder,objectName, …) that aren't in the canonical schema; storingparsed.datawould silently strip them on every save.」Why it is blocked
The amendment says the parsed body is persisted once every round-trip key is declared, and its dated note cites the spec symbols that stage (ii) creates. It cannot be written truthfully before those symbols exist on
main. Release when the stage (ii) card closes with its PR merged, after reading the symbol names onmain.Acceptance
options.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 #20051 itself.Part of #20051