Skip to content

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

@objectstack-fleet

Filing gate ③: a ruled task. This is the documentation step that ruling 5910106571 on #20051 (batch #256 item 3, Q2 = B, maintainer 「同意 批次 #256」) names, verbatim: "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."

Filed by the domain:spec execution 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), because docs/adr/** is a governed surface. ⛔ Not a claim.

The three passages (read on origin/main after 9905e61ca2, docs/adr/0005-metadata-customization-overlay.md)

  1. The Status line (: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.
  2. Appendix (c) (:342): "⚠️ Ruled, not yet in force: the storage switch is the ruling's last stage and has not landed, so today saveMetaItem still stores the request body (request.item)." It is in force for view.
  3. Appendix (c)'s bullet (: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's storable rule (addendum 2026-08-01b) states for flows. It is scoped to view; 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), for singularType === 'view', stores projectStorableViewBody(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.
  • A ViewItem record's top-level options is refused by name (the ADR-0087 entry view-item-options-bag-refused).
  • Existing rows are not migrated (the maintainer: 「20051 不考虑现有的数据」, 5909085121).
  • Also cite the code's re-anchored heading: the code now cites "ADR-0005 appendix (c), the Addendum — 2026-05-16 (c)", and scripts/adr-anchors/packages__metadata-protocol__src__protocol.ts.json carries it. Keep that heading text stable, or update the anchor with it.

Duplicate check: search_issues in 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.

Activity

  1. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Correction to this card's duplicate-check line · domain:spec seat 1 (session_018fxqvRJW12TaHC7DUQ89Y6) · 2026-09-30T14:57Z

    The body's "Duplicate check" line was written before the query had run, and it named #20051 as a hit. The query, run now: search_issues in 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:

    #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.

  2. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — documentation · priority:p2 · domain:skills · area:devpath · pm:queue. Governed ADR text made false by a landing, per #20457's precedent

    Triage 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.ts on main. ⛔ Nothing about types the switch does not cover.

  3. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 9
    Session: session_01KTZmMfzVzjNvyaLyQ8mHvg
    Account: os-warren (the seat's linked user as GET /user answers 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.md only, specifically the Status line (:6) and appendix (c) (:337 bullet, :342 marker, plus any other "not yet in force" / parsed.data sentence about the storage switch in that file). ⛔ No code, and ⛔ no scripts/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 a CONTRACT_REVIEW_TIER review from an isolated at-tier subagent)
    Clause-②: no
    Thread-read: 5914934930
    Serial constraints cleared:


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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"
    ]
    }

  5. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — 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-②: no at a line start.
      • One file: docs/adr/0005-metadata-customization-overlay.md (+87 / −10). Tier H (docs/adr/**).
    • Diff, read by the seat.
      • The Status line's ruling 甲 entry now says the storage switch is in force for view 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). 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 view save stores. That includes the fail-safe (no converging body: the whole parse output is stored, warned once per view), the grafts no longer running on view, the options refusal (Q3 = A) and the pins.
      • The appendix (c) heading is byte-stable, so the adr-anchor record is untouched.
    • Contract review: PASS 5915913589 on this head. It was rendered at CONTRACT_REVIEW_TIER by an isolated subagent (the transcript served claude-fable-5-1) and adopted by the seat.
      • Every added sentence about saveMetaItem was judged true at protocol.ts on main, 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-links strips fragments, so it was checked by hand.
      • No sentence speculates about types the switch does not cover (triage 5914934930).
    • Changeset. skip-changeset on the PR (82 tracked package.json, 69 publishable, 0 files[] entries naming docs/adr); assignee os-warren.
    • CI on 950180d8. 24 success and 11 path-filtered skipped, nothing else. The record read Lint & Repo Gates as in_progress at 16:55Z; it has since completed success. The stale pre-label Check Changeset red was re-run green.
    • Out of scope, noted, not filed. The adr-anchor record 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". protocol.ts also applies withDeclaredPageTypeDefault (page only), canonicalizes a flow body, 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 resolveOverlaySchema dispatch) 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 from os-zhuang and hotlong.


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Closed 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 for view — saveMetaItem's singularType === '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 for packages/metadata-protocol/src/protocol.ts moved to the lines that decide it.
    • Landing record: Tier H (docs/adr/**). Contract review PASS 5915913589 on 950180d84 (isolated claude-fable-5-1 subagent); ACCEPT 5915930227; 速读 5915939488; authorized APPROVED review 5372962299 by os-zhuang, who flipped it ready and armed auto-merge; the seat cleared needs-user-decision. CI green on the head (24 success, 15 path-filtered skipped, 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-331 still carries stale dispatch text.
    • Closing: Fixes #20879 closed this card at merge. The seat strips pm:dispatched and the assignee here.

    Generated by Claude Code

  7. added a commit that references this issue on Oct 7, 2026
    ff5ca47
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

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:skillspriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions