Skip to content

spec(ui): the view write door accepts a chart list view that names no dataset (type: 'chart' with no chart block, or options.chart with only chartType); once objectui stops reading the legacy axes, such a view saves green and renders only a refusal #22491

Description

@objectstack-fleet

Filing gate: ① a product defect with reach: (a finding awaiting its first grade). Filed by the domain:spec @ objectui seat (seat post objectstack-ai/objectui#10217), session session_01CijGnfWLxTLUFcJkY2ouUw, from objectstack-ai/objectui#6152 round 15 (dev report objectstack-ai/objectui#6152 comment 6081672623, its Q1 option C). ⛔ Not a claim.

Who acts on it: the objectstack domain:spec seat (seat post #6017). The fix lands in packages/spec's list-view chart slot and the view write door's list overlay. objectui's ListViewSchema mirrors it afterwards (that half is objectui's domain:spec seat's).

What happens

Expected

The door refuses a chart list view whose effective chart binding names no dataset, with a remedy that names chart.dataset / chart.values, so the author learns it at save time, not when the view renders.

Dedupe

MCP search_issues on objectstack (open and closed), 「chart list view with no dataset accepted by view write door listOverlay chart block requires dataset」: 5 hits, all closed (#20186, #20080, #20081, #7016, #2502). None is this gap.

Dedupe words: chart view no dataset accepted · listOverlay chart without block · viewType chart dataset required

Activity

  1. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · priority:p3 · target:v18 · domain:spec · area:reports · pm:queue (finding removed). Direction: the view write door refuses a chart view with no effective dataset

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-09T13:58Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: the fix is in packages/spec, the list-view chart slot and the view write door's list overlay. That puts it in domain:spec. objectui's ListViewSchema mirror follows in objectui's spec lane.

    • Why p3 and target:v18: declared ≠ enforced in the accept direction. The door saves a view whose only rendering, once objectui PR fix(qa): declare @objectstack/spec in http-conformance, retiring the ledger ceiling it inflated #12060 lands, is a refusal. It narrows a write door, so Clause-②: yes (narrowing), on the v18 line.
    • Direction:
      • Resolve the view's effective chart binding the way the renderers do: the chart block, else options.chart. When that binding names no dataset, refuse it at the write door.
      • The remedy names chart.dataset / chart.values, which the authoring slot already requires.
      • ⛔ Do not fabricate a default binding. That is the 'name' / 'value' floor objectui round 15 retires.
      • Stored rows: the door judges writes. Measure what a stored chart view with no dataset does on read, and record it in the changeset with the ADR-0087 disposition the narrowing needs.
    • Pins:
      • type: 'chart' with no block, and options.chart with only chartType, are each refused, with the remedy;
      • control: a chart view with dataset and values saves.
    • Mirror: when this lands, objectui's domain:spec seat files the ListViewSchema half (the objectui#6152 family).
  2. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-09T14:44Z
    Session: session_01KNKBCRDJCu5tGy3TEbvtrF
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-22491-chart-view-needs-dataset
    Worktree: objectstack-issue-22491
    Domain: domain:spec
    Seat: domain:spec#3 (seat post #18883)
    File surface (at origin/main 35ef501e13; stop on breach and explain in the report): packages/spec/src/ui/view.zod.ts (the view write door's list overlay member, ListViewOverlayWireSchema / ListViewOverlayOptionsSchema, and the list view's chart slot), plus packages/spec/src/ui/chart.zod.ts if the effective-binding reading belongs there; their tests; an ADR-0087 step-18 entry under packages/spec/src/migrations/ only if the stored-row measurement shows one is owed; the generated spec artifacts; .changeset/22491-*.md. ⛔ Not objectui's ListViewSchema mirror.
    Container & model: M, mode:subagent, model: default tier (dispatch-gates --tier: no path-derived mandate; clause-② suspect surface packages/spec/src/**). A narrowing: the contract review at CONTRACT_REVIEW_TIER is owed before enqueue.
    Clause-②: yes (narrowing)
    Clause-② correction: the line read no (narrowing) until the seat's review of PR #22528 corrected it. The fix also exports a new object-level refinement check, checkListViewChartBinding (the convention of 7936b29ce5, so objectui's mirrors attach the schema's own rule), which widens the published surface by one export. The accept set still narrows, so the arm stays (narrowing) and the level stays major.
    Responsibility: packages/spec's view write door admits a chart list view whose effective binding names no dataset | no platform path covers it: once objectui PR #12060 retires the fabricated binding, the view renders only a refusal | who reaches it: any author saving a type: 'chart' list view with no chart block, or with options.chart holding only chartType (measured through the overlay at 17.7.0, objectui#6152 round 15)
    Thread-read: 6082420385
    Serial constraints cleared: the 10 open PRs' file lists, read at 2026-10-09T14:27Z: none touches view.zod.ts or chart.zod.ts. migrations/registry.ts is written by PRs #22215, #22421 and #22469. If this card needs a step-18 entry, it re-syncs after PR #22215 lands, through scripts/pm/os-regen-merge.sh (seat post hot-file queue).

  3. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 22491,
     "status": "done",
     "branch": "claude/issue-22491-chart-view-needs-dataset",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/22528",
     "session": "session_01KNKBCRDJCu5tGy3TEbvtrF",
     "premise_still_valid": true,
     "summary": "Every list-view door now refuses a type 'chart' list view whose EFFECTIVE binding (the chart block, else the legacy options.chart bag, the block replacing the bag whole) names no dataset. The rule is checkListViewChartBinding in packages/spec/src/ui/view.zod.ts. It is exported and attached by identifier at the same three doors as the calendar check: ListViewSchema (which also covers views[].list/listViews, a view item config and defineView), ObjectListViewSchema, and the flattened list overlay member of PUT /api/v1/meta/view. No default binding is fabricated. It issues a custom issue at `chart` when there is no binding at all, and one issue per missing key at options.chart.dataset / options.chart.values when the only binding is an incomplete bag. A declared chart block stays with its own strict schema. Premise measured at e148ca98: the overlay accepted both shapes, and both authoring doors also accepted the block-less view, so this was the same gap at every door and one rule now judges them all. The renderer's precedence is confirmed in objectui packages/plugin-list/src/ListView.tsx resolveListChartBinding, `schema.chart || schema.options?.chart || {}`, at :207 at the .objectui-sha pin f0268ad7 and at :260 at objectui 2a48bd40 (read-only). Stored rows, measured through the real REST door over SQLite: applyConversionsToStoredItem touches no list-view chart block and the read door does not re-validate, so a stored row with no binding is served 200 as stored, carries _diagnostics.valid false with the same issue at `chart`, and is refused 422 on its next save. I registered the step-18 semantic entry view-chart-binding-dataset-required (the precedent is ui-report-joined-block-dataset-required), and the changeset is '@objectstack/spec': major with that marker and 'Clause-②: no (narrowing)'. Separately, the issue-22371 seat held the verify lock in runs of 25 to 35 minutes, so most of this run's wall time was spent in the queue.",
     "tests": "All at HEAD 7836b326 unless noted; exit codes captured before any pipe, verdicts read from the lock's VERDICT line. Spec: `pnpm --filter @objectstack/spec build` then check:generated (3 of 15 stale: api-surface, export-origins, docs), then --fix of those three only, then re-check 'All 15 generated artifacts are up to date'. @objectstack/spec vitest --project local in 4 shards: shard1 158/158 files 5261 tests (at 5413aed9); shard2 157/158, the one red being view-form-pagination 'type chart parses a pagination block', a fixture re-judged (it was missing a declaration), fixed in 7836b326; shard3 158/158 4012 tests (at 5413aed9); shard4 156 passed + 1 skipped, 5032 tests (at 7836b326). The 4 touched spec test files re-run at 7836b326: 4/4 files, 732 tests. Shards 1 and 3 ran at 5413aed9, and the only later commit edits a shard-2 test file. Spec typecheck exit 0, including 'check:test-typecheck: OK'. Build closure for rest, lint and metadata* through turbo --concurrency=2: 24/24 tasks. @objectstack/lint: 130/130 files, 5943 tests. @objectstack/rest --project local (full): 269/269 files, 4979 passed / 326 skipped, including the new meta-view-chart-binding.test.ts. Rest typecheck exit 0 (test layer 0 errors). metadata-core: 17/17 files, 387 tests. metadata-fs: 10/10 files, 70 tests. metadata (narrowed): 4/4 files, 51 tests. metadata-protocol (narrowed): 31/31 files, 1247 tests. Showcase: importing examples/app-showcase/src/ui/views against the built spec dist ran defineView at import; 26 list views (2 charts, both bound) parse. Filter direction: each consumer package was tested as itself, with its upstream closure ('PKG^...') built first. Ablation, once, in a second worktree at 7836b326 (fix committed first): scripts/ablation-replace.mjs turned the check's guard line into an unconditional return; anchor 1 to 0, blob 0915637f to d75f30ac, mutation landed. view-chart-binding.test.ts + object-refinement-check-exports.test.ts then gave '10 failed | 204 passed': every refusal pin red at all three doors and in the bag cases, plus the export parity/bijection legs; every control green. The direction was as predicted (turned red). Restore proven: blob == HEAD 0915637f and git diff HEAD empty. No dist rebuild was needed, because those tests import ./view.zod from source. The REST pin reads dist and was not ablated. eslint narrowing, measured: the population comes from eslint.config.mjs's own files globs (`**/*.{ts,...}`); `--no-inline-config --format json` over the 8 changed .ts files gives 8 files, 0 errors, 0 warnings; the config enables no type-aware linting (eslint.config.mjs:327), so untouched files cannot move. Repo-wide pnpm lint is CI's.",
     "mcp_calls": "0 — no MCP GitHub tool was called. GitHub reads went through gh api (REST); 2 SendMessage status notes went to the coordinator, which are not GitHub calls.",
     "api_writes": "3 — each a fleet-write relay stroke as objectstack-fleet[bot] (transport POST /repos/objectstack-ai/objectstack/dispatches, executed by the board workflow): (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls (draft #22528; read-back: 12746 bytes sent, 12746 stored, identical); (2) label-write --assign zhuangjianguo, POST /repos/objectstack-ai/objectstack/issues/22528/assignees (read back: assignee zhuangjianguo; no label written); (3) post-stamped os-dev-report, POST /repos/objectstack-ai/objectstack/issues/22491/comments. git push (6 pushes of the branch, the first an empty probe) is not a REST write.",
     "open_questions": [],
     "out_of_scope_findings": [
      "carrier: objectui domain:spec seat (it files the ListViewSchema mirror after this lands) · noted, not filed — read-only inference, not reproduced. objectui packages/app-shell/src/views/ObjectView.tsx:3162 (at 2a48bd40) reads only viewDef.chart for a type 'chart' view, never options.chart, while plugin-list ListView.tsx:260 reads chart || options.chart. So a stored view whose only binding is a complete options.chart bag would render the unbound refusal on the app-shell route and plot on ListView's: two precedences in one renderer repo. The spec judges the bag the way ListView does. · dedupe words: app-shell ObjectView chart options bag ignored · chart view options.chart precedence · ObjectView viewDef.chart only",
      "carrier: none (承接者:无) · noted in the PR Acceptance notes only — functional-completeness.test.ts still titles chart among the types 'with no binding block to demand'. That stays true of checkViewCompleteness, which is deliberately silent because the schema doors now refuse the block-less view and a completeness finding would double-report it. No change made."
     ],
     "gates": {
      "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, no paths, at HEAD 7836b326, after the last commit: 114 commands. node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (the seat addendum): 49 'Artifact rosters' commands. Union, de-duplicated: 161 commands, all run at 7836b326, each exit code captured before any pipe.",
      "exit_codes": "156 exit 0. Exit 3 (PREREQUISITE NOT MET): check:skill-examples (packages/client-react/dist had no .d.ts; re-run once it was present: exit 0, '262 prose examples type-check') and check:dual-build-cjs-loads (needs every package built: NOT MEASURED, reason: a full repo build is outside the local scope; CI runs it). Exit 2 NOT WIRED without a PR context: node scripts/check-closing-target-claim.mjs, node scripts/check-partof-closing-keyword.mjs, node scripts/check-single-claim-paths.mjs. All three were re-run with PR #22528's context: exit 0, exit 0 (on this PR body) and exit 0. The roster rows the seat flagged: spec check:error-code-provenance exit 0; check:meta-url-spelling, check:changeset-fixed, check:authz-resolver, check:error-code-casing and check:filter-alias-parity each exit 0. Changeset gates: check-adr-0087-registration exit 0 ('registered view-chart-binding-dataset-required (new here)'); check-changeset-no-major exit 0 (major notice; the level axis is not applicable locally); check-empty-changeset exit 0; check:nul-bytes exit 0; check:doc-authoring exit 0. Full per-command record: scratchpad issue-22491/gates-summary.txt.",
      "ran_verdict": "✓ dispatch-gates --ran: 114 derived famil(ies) accounted for — 113 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)."
     },
     "line_budget": "additions 654, deletions 28: 682 changed lines across 14 files, generated files included (registry.ts +53, content/docs/references 9/9, api-surface +1, export-origins +1), read back from the PR at head 7836b326. That is under the 3,000-line human-merge threshold.",
     "deviations": [
      "The file surface was widened by one test-only file outside packages/spec: packages/rest/src/meta-view-chart-binding.test.ts. It carries the ADR-0112 envelope pin (422 + INVALID_METADATA, empty store) at the real door that Zone 3 asks for, plus the stored-row read measurement. No rest source was touched. Two existing spec tests were re-judged under fixture triage, both in-surface: view.test.ts and view-form-pagination.test.ts.",
      "The rule refuses slightly more than Zone 3 named. When the bag is the effective binding, a bag that has a dataset but no values is also refused at options.chart.values. The block is replaced wholesale (not merged per key), so the bag IS the block and owes the block's required keys. A drift pin derives those keys from ListChartConfigSchema.",
      "metadata and metadata-protocol ran narrowed, as the coordinator approved at 18:55Z: their view-door test files only, with the full suites declared to CI. Evidence: a grep for ['\"]chart['\"] over metadata*, rest and objectql finds only a report container and a zod union member, and nothing iterates the list-view type enum. The control term viewKind|ListViewSchema|ViewMetadataSchema hits 4 + 29 files. The rest suite was not narrowed and ran in full.",
      "check:dual-build-cjs-loads is NOT MEASURED (exit 3; it needs every package built).",
      "My first full spec run was killed by my own `timeout 590` wrapper after it acquired the lock (334s wait, about 256s of run). I re-ran it as 4 shards. The lock was released and the next holder took it.",
      "A background script re-queued my lock attempts, at most twice per step, under the stable slot issue-22491, waiting with `tail --pid` in the foreground. A second slot, issue-22491-abl, carried the ablation and short side runs in a separate worktree, which is now removed.",
      "There is no STEP18_RATIONALE fragment. It is optional, and the closest view-door precedent (view-overlay-options-bag-judged) has none; leaving it out keeps the hand-written region of the hot registry.ts untouched, so only the generated region moved. Next free order was 91 if one is wanted.",
      "packages/spec/src/ui/chart.zod.ts was not touched: the effective-binding reading belongs on the list-view doors.",
      "The PR body footer and the commit trailers follow AGENTS.md: a session-URL footer, and the model-free Co-authored-by + Claude-Session pair. The harness reminder's footer and model-named trailer were not used."
     ],
     "files_changed": [
      ".changeset/22491-chart-list-view-binds-a-dataset.md",
      "content/docs/references/api/protocol.mdx",
      "content/docs/references/data/object.mdx",
      "content/docs/references/ui/view.mdx",
      "packages/rest/src/meta-view-chart-binding.test.ts",
      "packages/spec/api-surface/ui.json",
      "packages/spec/export-origins/ui.json",
      "packages/spec/src/migrations/entries/semantic/18.view-chart-binding-dataset-required.ts",
      "packages/spec/src/migrations/registry.ts",
      "packages/spec/src/ui/object-refinement-check-exports.test.ts",
      "packages/spec/src/ui/view-chart-binding.test.ts",
      "packages/spec/src/ui/view-form-pagination.test.ts",
      "packages/spec/src/ui/view.test.ts",
      "packages/spec/src/ui/view.zod.ts"
     ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat review of PR #22528 at 7836b32660: the build is accepted as built. One patch round: sync with protocol 18, and the corrected Clause-② line. Then the contract review, then landing

    domain:spec seat 3 (#18883) · zhuangjianguo · session session_01KNKBCRDJCu5tGy3TEbvtrF · 2026-10-09T19:48Z · holder of claim 6083229542. Report: os-dev-report 6087996555. Thread-read: 6087996555.

    Checked in the diff, not taken from the report (14 files, +654 / −28 = 682 changed lines, under the 3,000-line threshold):

    • The rule. checkListViewChartBinding in packages/spec/src/ui/view.zod.ts refuses a type: 'chart' list view whose effective binding (the chart block, else the options.chart bag) names no dataset. With no binding at all, the issue is at chart. With an incomplete bag, there is one issue per missing key at options.chart.dataset / options.chart.values.
      • It is attached by identifier at the three list-view doors the calendar check uses.
      • No default binding is fabricated.
      • The renderer precedence it mirrors is objectui ListView.tsx's schema.chart || schema.options?.chart, cited at the pin.
    • The declared deviations, accepted:
      • The bag that has a dataset but no values is refused too: the bag replaces the block whole, so it owes the block's required keys, and a drift pin derives them from ListChartConfigSchema.
      • A test-only file, packages/rest/src/meta-view-chart-binding.test.ts, carries the door's envelope pin and the stored-row read measurement.
    • Stored rows: a stored row with no binding is served 200, with _diagnostics.valid: false, and is refused 422 on its next save. That is stated in the changeset, with the D3 entry view-chart-binding-dataset-required registered.
    • The evidence shape:
      • an ablation of the guard line read 10 red / 204 green, restored blob-equal;
      • the consumer packages were each run as themselves with their upstream closure built, with metadata and metadata-protocol narrowed to their view-door files as approved, with evidence;
      • --ran 114 derived, 113 run, dual-build-cjs-loads NOT MEASURED;
      • the roster block was run.

    CI at 7836b32660: Type Check · source gates is red, "spec-changes.json is stale — the ADR-0087 registries changed without regenerating the manifest". PR #22215 (protocol 18, 4e9fe9ff6a) is not in this branch (control: e148ca9842 is), and at protocol 18 the new D3 entry projects into spec-changes.json and docs/protocol-upgrade-guide.md. 12 checks were still running at this stamp.

    Correction, owned by the seat: this seat's claim declared Clause-②: no (narrowing), and that line was wrong for this diff. The fix also adds a published export, checkListViewChartBinding. That is the object-level refinement-check export convention (7936b29ce5, graded minor as a widening there), and it widens the public surface by one name. The claim's line now reads Clause-②: yes (narrowing), with the correction stated in the claim itself. The arm stays (narrowing), the level stays major, and the ADR-0087 marker stays registered.

    Patch round:

    1. Merge origin/main with bash scripts/pm/os-regen-merge.sh, then regenerate packages/spec/spec-changes.json and docs/protocol-upgrade-guide.md with their own generators, in a commit of their own. ⛔ Never gen:schema in the MERGE state.
    2. In .changeset/22491-chart-list-view-binds-a-dataset.md, change the line to Clause-②: yes (narrowing), and name the new export in one sentence. Re-run the changeset gates.
    3. The seat applies the PR body's Clause-② line and the verification lines from the report's pr_body_delta.

    Carried, not filed: objectui app-shell ObjectView.tsx reads only viewDef.chart for a chart view, while plugin-list reads chart || options.chart. That is a read-only inference, not reproduced, and it belongs to objectui's domain:spec seat, which files the ListViewSchema mirror after this lands.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 22491,
     "status": "done",
     "branch": "claude/issue-22491-chart-view-needs-dataset",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/22528",
     "session": "session_01KNKBCRDJCu5tGy3TEbvtrF",
     "premise_still_valid": true,
     "summary": "Patch round on PR #22528, done per the seat review 6088117674 and the two PM orders; new head e295f361, pushed. (1) Sync: merged origin/main at ee8751d4, which carries PR #22215 protocol 18 (4e9fe9ff), with scripts/pm/os-regen-merge.sh, giving merge commit be6f3e23. The script's step-3 hand-off commit d3900905 regenerated content/docs/references/data/object.mdx from the merged tree, after a spec build run after the merge commit (MERGE_HEAD absent). 742960d6 contains only gen:spec-changes and gen:upgrade-guide output: at protocol 18 the D3 entry now projects into spec-changes.json (+14) and docs/protocol-upgrade-guide.md (+3). The merge dropped no step-18 id; the only id added is view-chart-binding-dataset-required. (2) Changeset (b83e8aaf): 'Clause-②: yes (narrowing)', plus one sentence naming the published export checkListViewChartBinding (the refinement check itself, which objectui's ListViewSchema mirror, built from ListViewSchema.shape, attaches with .superRefine); arm, major and the registered marker kept. (3) Test Core red at b83e8aaf (packages/cli migrate-meta-engine-guidance, TRACKER_ID): the D3 entry's reason printed 'objectui#6152'. I reworded it to 'objectui has since retired that floor' and regenerated registry.ts, spec-changes.json and the upgrade guide with gen:migration-registry, gen:spec-changes and gen:upgrade-guide (e295f361). No other #-plus-4-5-digit id remains in this diff's printed text (refusal messages, .describe(), changeset, entry strings); the [#22491] markers left are code comments only. The cli test now passes under the lock at e295f361. I made no PR body edit; the seat applies pr_body_delta.",
     "tests": "One lock call per suite, OS_VERIFY_LOCK_SLOT=issue-22491, each verdict read from its VERDICT line. At b83e8aaf (merged head): the four touched spec test files (view-form-pagination, view-chart-binding, view, object-refinement-check-exports), 'Test Files 4 passed (4) / Tests 732 passed (732)', VERDICT command-exit 0. Spec typecheck: VERDICT command-exit 0, 'check:test-typecheck: OK'. Rest: turbo build of @objectstack/rest^... 'Tasks: 24 successful, 24 total', then src/meta-view-chart-binding.test.ts 'Test Files 1 passed (1) / Tests 4 passed (4)', VERDICT command-exit 0. At e295f361: turbo build of @objectstack/cli... 'Tasks: 59 successful, 59 total', then `pnpm --filter @objectstack/cli exec vitest run --project integration --maxWorkers=2 test/migrate-meta-engine-guidance.test.ts`, 'Test Files 1 passed (1) / Tests 3 passed (3)', VERDICT command-exit 0. That file spawns the CLI, so it belongs to the integration tier. e295f361 differs from b83e8aaf only in the entry's prose and its three generated projections, which none of the b83e8aaf runs reads. Generated-artifact gates at the merged head: check:spec-changes, check:upgrade-guide and check:migration-registry exit 0; check:generated 'All 15 generated artifacts are up to date' at 742960d6 and again inside the e295f361 gate union. Full spec, lint, rest, metadata* and cli suites at the merged head are declared to CI. The first-round results (all at 7836b326) stand as reported in comment 6087996555.",
     "mcp_calls": "0 — no MCP GitHub tool was called. Reads went through gh api REST (the review comment, the PR body, the PR read-back).",
     "api_writes": "1 — this patch round's os-dev-report comment on #22491, through scripts/pm/post-stamped.mjs, the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executing POST /repos/objectstack-ai/objectstack/issues/22491/comments). git push (2 pushes: 7836b326 to b83e8aaf, then b83e8aaf to e295f361, both fast-forward) is not a REST write. No PR body edit, no label write.",
     "open_questions": [],
     "out_of_scope_findings": [
      "carrier: objectui domain:spec seat · noted, not filed — unchanged from round 1 (comment 6087996555): objectui app-shell ObjectView.tsx:3162 reads only viewDef.chart for a chart view, while plugin-list reads chart || options.chart. Read-only inference, not reproduced."
     ],
     "gates": {
      "derivation": "At HEAD e295f361, after the last commit: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` gave 114 commands; `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` gave the 'Artifact rosters' block, 49 commands. Both lists are byte-identical to the derivations at 7836b326 and b83e8aaf. Union, de-duplicated: 161, all run, each exit code captured before any pipe.",
      "exit_codes": "158 exit 0. That includes check:spec-changes, check:upgrade-guide, check:migration-registry, check:generated, the roster's check:error-code-provenance / check:meta-url-spelling / check:changeset-fixed / check:authz-resolver / check:error-code-casing / check:filter-alias-parity, and also check:skill-examples and check:dual-build-cjs-loads, both now measured because the cli closure build put their prerequisites on disk. 3 exit 2 NOT WIRED without a PR context: node scripts/check-closing-target-claim.mjs, node scripts/check-partof-closing-keyword.mjs, node scripts/check-single-claim-paths.mjs. Re-run against PR #22528 (live body), each exits 0. The changeset gates on b83e8aaf: check-changeset-no-major exit 0 ('pre-release mode (tag: next) — major bumps are the expected product'), check-adr-0087-registration exit 0 ('registered view-chart-binding-dataset-required (new here)'), check-empty-changeset exit 0, check:changeset-gate-self-tests exit 0. An intermediate union at b83e8aaf ran while a turbo build was rewriting dist and recorded transient exit 3/1 rows. It is superseded by the e295f361 run, which ran with no build in flight.",
      "ran_verdict": "✓ dispatch-gates --ran: 114 derived famil(ies) accounted for — 114 run, 0 NOT-MEASURED (a DERIVED zero — all 114 recorded an exit code and none of them is 3)."
     },
     "line_budget": "after the merge, against merge base ee8751d4: 16 files, additions 671, deletions 28, 699 changed lines, generated files included (registry.ts +53, spec-changes.json +14, protocol-upgrade-guide.md +3, content/docs/references 9/9, api-surface +1, export-origins +1). That is under the 3,000-line threshold.",
     "pr_body_delta": {
      "line_2_replace": "Clause-②: no (narrowing)  ==becomes==  Clause-②: yes (narrowing)",
      "verification_heading_replace": "## Verification (local, at `7836b326`; CI owns the full farm)  ==becomes==  ## Verification (local; first round at `7836b326`, patch round at `e295f361`; CI owns the full farm)",
      "verification_append_after_table": "**Patch round, at `e295f361`.**\n\n- **Sync.** Merged `origin/main` at `ee8751d4` with `scripts/pm/os-regen-merge.sh` (no rebase) into merge commit `be6f3e23`. That brought in protocol 18 from `4e9fe9ff`.\n  - The script's step-3 hand-off commit `d3900905` regenerated `content/docs/references/data/object.mdx` from the merged tree, after a spec build. That build ran after the merge commit, never in the MERGE state.\n  - `742960d6` contains only `gen:spec-changes` + `gen:upgrade-guide` output.\n  - Every step-18 entry id on `origin/main` is still present after the merge; the only id added is `view-chart-binding-dataset-required`.\n- **Changeset** (`b83e8aaf`): `Clause-②: yes (narrowing)`, and one sentence naming the new export `checkListViewChartBinding`. `check-changeset-no-major`, `check-adr-0087-registration` (\"registered view-chart-binding-dataset-required (new here)\"), `check-empty-changeset` and `check:changeset-gate-self-tests` each exit 0.\n- **Test Core fix** (`e295f361`): the D3 entry's `reason` named an objectui tracker id, which the `migrate meta` guidance must not print. That wording is gone, and the projections were regenerated with `gen:migration-registry` / `gen:spec-changes` / `gen:upgrade-guide`. No other `#` plus 4–5 digit id is left in this diff's printed text (refusal messages, `.describe()`, changeset, entry strings).\n- **Re-run, one lock call per suite:**\n  - the four touched spec test files: 4/4 files, 732 tests (at `b83e8aaf`);\n  - spec typecheck: exit 0 (at `b83e8aaf`);\n  - `rest` `meta-view-chart-binding.test.ts` after a turbo build of `@objectstack/rest^...` (24/24): 1/1 file, 4 tests (at `b83e8aaf`);\n  - `packages/cli` `test/migrate-meta-engine-guidance.test.ts` (`--project integration`), after a turbo build of `@objectstack/cli...` (59/59): 1/1 file, 3 tests (at `e295f361`).\n  - `e295f361` changes only the entry's prose and the three projections, so the `b83e8aaf` runs read identical inputs.\n- **Gates** at `e295f361`: all 161 union commands (`dispatch-gates --commands`, 114 derived, plus the 49 artifact-roster commands) were run, each exit code captured before any pipe.\n  - 158 exit 0, including `check:spec-changes`, `check:upgrade-guide`, `check:migration-registry`, `check:generated`, `check:error-code-provenance`, `check:skill-examples` and `check:dual-build-cjs-loads`.\n  - The three PR-context guards (`check-closing-target-claim`, `check-partof-closing-keyword`, `check-single-claim-paths`) exit 2 without a PR. Re-run against PR #22528, each exits 0.\n  - `--ran`: \"✓ dispatch-gates --ran: 114 derived famil(ies) accounted for — 114 run, 0 NOT-MEASURED (a DERIVED zero — all 114 recorded an exit code and none of them is 3).\"\n- **Declared to CI:** the full `spec`, `lint`, `rest`, `metadata*` and `cli` suites at the merged head."
     },
     "deviations": [
      "os-regen-merge.sh step 3 was refused by pre-commit, because content/docs/references/data/object.mdx had merged without a text merge. The merge commit itself (be6f3e23) had already been made and MERGE_HEAD was absent. I ran `pnpm --filter @objectstack/spec build && gen:docs` under the lock and committed the hand-off (d3900905) as the hook and the script prescribe. I did not re-run the script.",
      "For that spec build I wrapped the lock call in `timeout 590` again. It acquired at 0s and finished in 95s, so nothing was killed. Every later call ran unwrapped, in the background, waited on with `tail --pid`.",
      "The rest suite call combined a turbo build of its closure with the single test file in one lock hold, and the cli call did the same. The order asked for one lock call per suite, and each build was that suite's own prerequisite.",
      "The spec files, spec typecheck and the rest file were re-verified at b83e8aaf, not re-run at e295f361. e295f361 changes only the D3 entry's prose and its generated projections, which none of those reads."
     ],
     "files_changed": [
      ".changeset/22491-chart-list-view-binds-a-dataset.md",
      "content/docs/references/api/protocol.mdx",
      "content/docs/references/data/object.mdx",
      "content/docs/references/ui/view.mdx",
      "docs/protocol-upgrade-guide.md",
      "packages/rest/src/meta-view-chart-binding.test.ts",
      "packages/spec/api-surface/ui.json",
      "packages/spec/export-origins/ui.json",
      "packages/spec/spec-changes.json",
      "packages/spec/src/migrations/entries/semantic/18.view-chart-binding-dataset-required.ts",
      "packages/spec/src/migrations/registry.ts",
      "packages/spec/src/ui/object-refinement-check-exports.test.ts",
      "packages/spec/src/ui/view-chart-binding.test.ts",
      "packages/spec/src/ui/view-form-pagination.test.ts",
      "packages/spec/src/ui/view.test.ts",
      "packages/spec/src/ui/view.zod.ts"
     ],
     "head": "e295f36163"
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat note on report 6089488712: the patch round is accepted. The PR waits behind PR #22523 on the generated files, then re-syncs and goes to contract review

    domain:spec seat 3 (#18883) · zhuangjianguo · session session_01KNKBCRDJCu5tGy3TEbvtrF · 2026-10-09T21:25Z · holder of claim 6083229542. Thread-read: 6089488712.

    Accepted at e295f361:

    • the protocol-18 sync through os-regen-merge.sh;
    • Clause-②: yes (narrowing) with the new export named;
    • the D3 entry's reason without a tracker id, which turned the Test Core red at b83e8aaf green.

    Every check at e295f361 has concluded green. The PR body now carries the patch-round block and Clause-②: yes (narrowing) on its second line (applied by this seat, read back identical).

    What it waits on (serial, landing step D):

    Next, when PR #22523 is MERGED (this seat runs it; nothing is owed from the branch until then):

    1. A sync of origin/main through os-regen-merge.sh, the regenerated chain, and a sibling-entry assertion. That assertion covers security-catalog-environment-overlay-refused from PR feat(cli): os migrate security-catalog-overlays — list, and with --apply delete, the environment rows a v18 cold boot refuses #22523 and view-chart-binding-dataset-required from this PR.
    2. The contract review at CONTRACT_REVIEW_TIER on that head.
    3. The queue.

    Carried, not filed: objectui's app-shell ObjectView.tsx reads only viewDef.chart for a chart view, while plugin-list reads chart || options.chart. This is a read-only inference and was not reproduced, so it has no reach:. Carrier: the objectui domain:spec seat, named in this seat's round report.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions