Skip to content

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

@objectstack-fleet

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 of domain:spec seat 2, which the ruling names as filer and which is vacant (#18549). The maintainer asked the triage seat directly, verbatim: 「#20051 的子卡 你为什么不能立」. ⛔ Not a claim.

What the ruling orders (item 1, stage iii, verbatim)

Sub-card 「ADR-0005 appendix (c) amendment」: governed (docs/adr/**), Tier H, the maintainer's APPROVED review; the appendix says the persisted document is the parsed body once every round-trip key is declared, with a dated note pointing at the spec symbols.

The text it amends

docs/adr/0005-metadata-customization-overlay.md, appendix (c): 「The persisted document is the original request.item, NOT parsed.data. Studio attaches auxiliary fields (isPinned, isDefault, sortOrder, objectName, …) that aren't in the canonical schema; storing parsed.data would 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 on main.

Acceptance

Part of #20051

Activity

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock: pm:blocked → pm:queue. Stage (ii)'s spec symbols are on main, so the appendix can now be written truthfully

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T18:09Z. ⛔ Not a claim, ⛔ not a dispatch. documentation · p2 · domain:skills unchanged.

  2. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01KTZmMfzVzjNvyaLyQ8mHvg
    Account: os-warren (the seat's linked user as GET /user answers 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 under scripts/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 at CONTRACT_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 touches docs/adr/0005-* (all ten open PRs' file lists read at the round-open marker 5903866929); this lane has no other pm:dispatched card on this path; no same-day churn (last touch of the file 67add130); #20051 (the parent, pm:blocked) holds stage (iv) and is not in flight.

    Readings at 2026-09-30T04:15Z on origin/main c9c182ed: appendix (c) at :337 still reads 「The persisted document is the original request.item, NOT parsed.data」; export const VIEW_CONSOLE_ROUND_TRIP_KEYS is at packages/spec/src/ui/view.zod.ts:6242; the two pins that guard the verbatim save are still on main (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 stores request.item. Blocker #20456 closed completed (PR #20474). The ruling 5856781584 was retrieved in this pass.


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  4. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — 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 line Fixes #20457, a separate Part of #20051 with no closing keyword beside #20051; Clause-②: no at 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, no scripts/adr-anchors/**, no content/docs/releases/**.
    • Changeset: skip-changeset label present, Check Changeset success — 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/main c9c182ed: export const VIEW_CONSOLE_ROUND_TRIP_KEYS at packages/spec/src/ui/view.zod.ts:6242, VIEW_METADATA_MEMBERS at :6193, viewSwitcherRowStateFields at :5199; saveMetaItem still grafts and stores request.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, 24 success, 11 path-filtered skipped, 0 failure; Lint & Repo Gates and TypeScript Type Check both success.
    • ## Contract review PASS on this head: 5904271563 (rendered at CONTRACT_REVIEW_TIER by an isolated subagent — this seat is below tier — and adopted by the seat; its transcript served claude-fable-5-1 throughout). 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 declare isDefault / columnState; "writes" would be the tighter verb.
    • Report: mcp_calls 0; api_writes 3 (relay pr_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 notes and a one-comment pointer goes on #20051 so the stage (iv) dispatch reads them; none is a card (none is a defect of main today: 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-decision goes on the PR and review is requested from os-zhuang and hotlong in this same act; the final 维护者速读 is posted on the PR. On approval this seat lands it through the queue.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Closed 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/main 085ca6bc: docs/adr/0005-metadata-customization-overlay.md appendix (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 review PASS 5904271563 on c8ee5833 (the landing head), ACCEPT 5904291220, authorized approval by os-zhuang (5361718094, a GOVERNED_APPROVERS account), readied and queued by the approver.
    • The PR body's first line Fixes #20457 did not close this card at merge (no link event on the timeline), so the seat closes it here; pm:dispatched comes 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.KIND with 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

  6. added a commit that references this issue on Oct 7, 2026
    085ca6b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions