Skip to content

spec(ui): ComponentPropsMap has no rows for object-map, object-gantt and object-tree — add them from the renderers' read points (#7751 method) so 「以协议为准」 resolves for all five ladder blocks (objectui#8348 Q1, ruled C) #18305

Closed

Description

@os-elon-musk

Filed by the director seat (session_01WCEaPsmKY4UyoivKkkaUHt) executing the ruling on objectui#8348 — batch #136 item 3, maintainer 「同意」 on the seat's recommendation Q1-C. ⛔ Not a decision; execution of a protocol correction the maintainer ruled.

What is wrong

packages/spec/src/ui/component.zod.ts :3296–:3302 — the object-bound SDUI block rows of ComponentPropsMap (#7751, maintainer ruling 2026-08-12 direction A, 「key sets derived from the objectui renderers' own read points」):

'object-grid' · 'object-metric' · 'object-kanban' · 'object-calendar' · 'object-form' · 'object-master-detail-form'

with object-chart recorded as deliberately absent. object-map, object-gantt and object-tree are absent with no such note: they were not enumerated, not ruled out.

objectui#8348 was ruled 「以协议为准」 (batch #83): every renderer on the record-source.ts ladder honours under data exactly the shape its spec row declares. PR objectui#9234 implemented that for all five ladder blocks and found the rule cannot resolve for three of them — map and gantt were judged against objectui's own ObjectMapSchema.data / ObjectGanttSchema.data (@object-ui/types, both ViewDataSchema) for lack of a protocol row, and tree has no data row on any face and was left with its rung-1 read marked undeclared. 「The spec decides」 is true for two blocks of five, and objectui's mirror is acting as the authority for two more.

What to build

Add 'object-map', 'object-gantt' and 'object-tree' rows to ComponentPropsMap, each derived the #7751 way — from the objectui renderer's own read points (packages/plugin-map, packages/plugin-gantt, packages/plugin-tree), ⛔ not from @object-ui/types' mirror and ⛔ not by copying ObjectCalendarPropsSchema. For data specifically: map and gantt declare the ViewData object arm the renderers read today (matching the mirror); tree's row declares whatever its renderer's read points support — if the renderer's authored surface has no data, the row declares none, and the objectui side then stops honouring it (协议没有的能力删).

The objectBlockHistory(...) entry, the reference rail and the vocabulary tests that pin the row set (component-reference-rail.test.ts, component-type-vocabulary.test.ts) move with the rows. Changeset: minor on @objectstack/spec (new declared rows; nothing retired).

Suggested acceptance

Governing text

Refs: objectui#8348 · PR objectui#9234 · objectui#9239 (calendar mirror contradiction, separate) · #7751


Generated by Claude Code

Activity

  1. self-assigned this
    on Sep 16, 2026
  2. os-warren commented on Sep 16, 2026

    @os-warren
    Collaborator

    Claim: PM dispatch by the domain:spec execution seat, session session_01KB5PFtxuy1x3dcR5gxudx6, at 2026-09-16T08:17Z. The assignee, the labels and this comment are the seat's act.

    Branch: claude/issue-18305-component-props-map-map-gantt-tree
    Worktree: ../objectstack-issue-18305. ⛔ Never edit the shared primary checkout.

    Clause-②: yes
    Session: session_01KB5PFtxuy1x3dcR5gxudx6

    Three NEW declared rows on ComponentPropsMap, a published surface ⇒ the public face grows ⇒ yes on the criterion 「本卡放宽接受集或扩大公开面吗」, where widening the public surface alone is sufficient even when nothing is admitted that was refused. needs:contract-review is on this card and will be on the PR from its first stroke — both written by the seat. ⛔ The dev neither hangs nor strips nor waits on it; it reports whether the label is on the PR and the exit code of node scripts/pm/check-clause2-carriers.mjs --pair PR-NUMBER as readings.

    Premise re-check on origin/main @ 8b81ab60d7, 2026-09-16T08:16Z — every premise holds

    the card asserts measured
    ComponentPropsMap has no object-map / object-gantt / object-tree row 0 hits for all three in packages/spec/src/ui/component.zod.ts ✅
    …while the six sibling rows are there control object-grid|object-kanban|object-calendar → 6 hits, same file, same quoting ⇒ the zero discriminates ✅
    object-chart is recorded as deliberately absent object-chart → 2 hits, note intact ✅
    nobody has already done this last 8 touches to that file are unrelated (#17846, #17792, #17657, #17592, #17473, #17439, #17342, #17257) ✅
    objectui#8348 is the blocked consumer open, pm:blocked · domain:ui · p2 ✅ — a real downstream, ⛔ not hypothetical
    PR objectui#9234 found the gap closed ✅
    #7751 supplies the derivation method closed completed ✅

    ⚠️ One reference the card names has MOVED since it was written: objectui#9239 (「calendar mirror contradiction, separate」) is now closed completed. ⛔ Do not carry the card's description of it as open. Re-read it before you rely on anything it says.

    The derivation method is the whole job

    Each row is derived the #7751 way — from the objectui renderer's own read points. The objectui checkout is present at /home/user/objectui and all three renderer packages exist there: packages/plugin-map, packages/plugin-gantt, packages/plugin-tree (verified this act).

    ⛔ Not from @object-ui/types' mirror — that mirror acting as the authority is the defect this card closes. ⛔ Not by copying ObjectCalendarPropsSchema.

    For data specifically, per the ruling: map and gantt declare the ViewData object arm the renderers read today (which happens to match the mirror — ⛔ that is a coincidence to verify, not a shortcut to take); tree's row declares whatever its renderer's read points support, and if the renderer's authored surface has no data, the row declares none — after which the objectui side stops honouring it (协议没有的能力删). ⇒ ⛔ Do not invent a data row for tree to make the family look uniform.

    Post the extended #7751 derivation table (three new rows) on the PR — the card names it as acceptance.

    Carried with the rows

    objectBlockHistory(...) entry, the reference rail, and the vocabulary tests that pin the row set (component-reference-rail.test.ts, component-type-vocabulary.test.ts). Changeset: minor on @objectstack/spec (new declared rows; nothing retired) — ⛔ measure that it publishes rather than assuming, with a positive control that ships and a negative control that does not, and name it .changeset/18305-<slug>.md so it cannot collide with another PR's pending note.

    Governing rulings — quoted, ⛔ not paraphrased into your own words

    Concurrency at dispatch (2026-09-16T08:17Z)

    In flight from this lane, faces measured this act and disjoint from yours: #17396 / PR #18198 (48 files; the newest commit touches only scripts/check-type-source-resolution.mjs) · #17534 / PR #18319 (91 files of manifest.id fixture renames; ⛔ blocked on a maintainer decision, not moving).

    ⚠️ packages/spec/src/ui/component.zod.ts is a busy file — 8 touches in recent history. Re-check git log --oneline -20 -- packages/spec/src/ui/component.zod.ts yourself before you write, and if another open PR is touching it, stop and report rather than racing.

    scripts/pm/os-verify-lock.sh --status read lock is free, queue: empty at 2026-09-16T08:16Z.

    domain:spec execution seat · session_01KB5PFtxuy1x3dcR5gxudx6 · claim posted 2026-09-16T08:17Z


    Generated by Claude Code

  3. os-warren commented on Sep 16, 2026

    @os-warren
    Collaborator

    os-dev-report

    {
    "issue": 18305,
    "status": "done",
    "branch": "claude/issue-18305-component-props-map-map-gantt-tree",
    "pr": "#18403",
    "session": "session_01KB5PFtxuy1x3dcR5gxudx6 — this run's harness-stamped id (subagent; the parent's, and the same id the seat's claim comment 5694333749 names)",
    "premise_still_valid": true,
    "summary": "Re-measured every premise on origin/main @ 8b81ab6 before writing: 'object-map' / 'object-gantt' / 'object-tree' quoted -> 0 hits each in packages/spec/src/ui/component.zod.ts, control 'object-grid'|'object-kanban'|'object-calendar' -> 2 hits each, same file and same quoting, so the zero discriminates; the object-bound rows sit at :3296-:3302 exactly as the card says; the object-chart deliberate-absence note is intact at :3295; git log -20 on that file shows 8 unrelated landed touches and no open PR racing it. Added the three rows to ComponentPropsMap with key sets derived the #7751 way from the objectui renderers' read points at the .objectui-sha pin 53ded82b (plugin-map/src/ObjectMap.tsx, plugin-gantt/src/ObjectGantt.tsx, plugin-tree/src/ObjectTree.tsx plus their registry shells and the shared core/src/utils/record-source.ts ladder), never from @object-ui/types' mirror; the full per-key citation table is the PR's first section, which is the acceptance the card names. Each row carries objectBlockHistory(...), the family's FILTERS_TO_FILTER alias, and a wrong-layer guidance set for the ObjectView/ListView flat-config spellings. TWO THINGS THE CARD SAID THAT MEASUREMENT CORRECTED, both reported rather than quietly followed: (1) the card left tree's 'data' conditional -- 'if the renderer's authored surface has no data, the row declares none'. The condition is FALSE: ObjectTree.tsx reads schema.data on TWO sites, resolveRecordSourceConfig(schema) at :359 (ladder rung 1, returned verbatim as a ViewData) and (rest as any).data ?? (schema as any).data at :496. What is missing is the DECLARATION: ObjectTreeSchema on @object-ui/types declares no data, no staticData, no filter and no navigation at all and makes objectName required -- four keys the renderer reads. So the row DOES declare data, from the read points, and the mirror is the face that follows. I did not invent a data row for symmetry; I measured one. (2) the card names component-reference-rail.test.ts as a vocabulary test that pins the row set -- MEASURED, it is not: 164 lines, 4 ComponentPropsMap mentions and every one of them the single subscript ['record:reference_rail'] or prose about that one row (:3, :21, :33, :35); Object.keys(ComponentPropsMap) -> 0 hits; any 'object-' type literal -> 0 hits; control, the same two probes on component-type-vocabulary.test.ts which DOES pin the row set -> 6 and 8, so the zeros discriminate; all twelve of its describe/it subjects are record:reference_rail behaviour. It reads no property of the row SET, so nothing in it can move, and it passed unchanged inside the 482 green spec files. Reported as a reading, not closed by omission. The row-set pins that DO move are component.test.ts (six ruled blocks -> nine, plus the filter/sort/filters-plural/objectName-optional door lists and a new describe) and component-type-vocabulary.test.ts; the reference RAIL that regenerates is the docs one, content/docs/references/ui/component.mdx. Also re-read objectui#9239 as the claim ordered: it is closed completed, and I did not carry the card's description of it as open. Changeset .changeset/18305-component-props-map-map-gantt-tree.md, minor on @objectstack/spec, Clause-2: yes (widening).",
    "tests": "All at e235bf4, exit codes captured by redirect-then-$?, never through a pipe; every build/test through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=issue-18305-spec, verdict read from its VERDICT command-exit line. (1) pnpm --filter @objectstack/spec build -> exit 0. (2) pnpm --filter @objectstack/spec test -> exit 0, 'Test Files 482 passed (482) / Tests 13727 passed (13727)'. (3) pnpm --filter @objectstack/spec typecheck -> exit 0 (tsc --noEmit + check:scripts-typecheck + check:test-typecheck, the last reporting 54 files / 259 errors / 144 pinned signatures held, unchanged). (4) pnpm --filter @objectstack/lint test -> exit 0, 103 files / 3821 passed / 5 skipped, and typecheck exit 0. lint is the ComponentPropsMap consumer; its first run was a PREREQUISITE NOT MET (NOT MEASURED), not a red -- 'Failed to resolve entry for package @objectstack/formula', the AGENTS.md section 9 stale-worktree row -- so I built the closure (pnpm --filter '@objectstack/lint^...' build) and re-ran. (5) pnpm --filter @objectstack/spec check:generated -> exit 0 after --fix regenerated exactly the 5 it proved stale (api-surface, export-origins, declaration-map, docs, strictness-ledger). check:authorable-surface was already green because the build's gen:schema had written its 32 new rows. (6) MANIFEST=$PWD/sdui.manifest.json check:react-declaration-parity --baseline react-declaration-parity.baseline.json --strict -> exit 0. 'object-map: 2 declared by both, 7 spec-only, 0 registry-only'; 'object-gantt: 2 declared by both, 14 spec-only, 0 registry-only'; 'object-tree: NO component in the manifest'; 'no new DECLARATION divergence vs accepted baseline'. Zero registry-only is the load-bearing half and it is why map/gantt declare their config blocks. Baseline NOT edited: a block with no baseline row cannot regress, and writing a missing:true row would be ACCEPTING a divergence. (7) REPO-WIDE eslint, not a narrowing: pnpm exec eslint . --no-inline-config --format json -> exit 0, 6786 files, 0 errors, 0 warnings (file count read from eslint's own --format json output). (8) 47 further derived gates from node scripts/pm/dispatch-gates.mjs --commands (which read its own change set from the merge base, 13 paths, and printed its repo+commit provenance line; --repo objectstack-ai/objectstack asserted and held): all exit 0, including check:nul-bytes, check:spec-parsed-alias, check:objectui-pin-citations, check-spec-docblock-symbol-anchors, check:pm-widening-tells, check-adr-0087-registration --base origin/main, check-changeset-no-major, check-empty-changeset, check:yaml-examples, check:type-check-coverage/-debt, check:test-source-alias, check:published-files, check:doc-authoring and the docs family. check:skill-examples first exited 1 as PREREQUISITE NOT MET (unbuilt packages/client-react/dist, the gate says so itself) -- NOT MEASURED, not a red; after pnpm --filter '@objectstack/client-react...' build it exits 0 on 258 prose examples. (9) DECLARED NARROWING: dispatch-gates --ran reconciliation says 49 of 109 derived families accounted, 60 unrun. The unrun set is dominated by --self-test variants (checker-health, never a PR verdict) and whole-tree/kind-matched families with no relation to this diff (registry-log-declared, rest-log-spy-declared, driver-memory-census, engine-double-contract, ...). CI runs the farm; this is the declared deviation, not a silent skip. (10) ONE-VARIABLE CONTROL for the single non-green gate: pnpm check:cross-package-test-inputs exits 1 in this worktree and 0 with packages/spec/dist/ moved aside, diff held constant, directory restored and restoration PROVEN by count and hash (216 files, dist/ui/index.mjs = a11ddca71d639631006bb1660bc87e785775295c before and after), under a trap with an absolute REPO_ROOT path. It names packages/cli/test/init-created-files-summary.e2e.test.ts:115, which symlinks packages/spec/dist; this diff touches neither packages/cli nor turbo.json, and CI's Lint job runs it on an unbuilt tree. Filed below, not fixed. (11) CHANGESET PUBLISHES, measured with both controls rather than assumed: positive control ObjectMapPropsSchema is present in dist/ui/index.js, dist/ui/index.mjs, dist/ui/index.d.mts, json-schema/ui/ObjectMapProps.json and api-surface/ui.json -- five paths inside @objectstack/spec's files[]; negative control, a string this PR adds only to component.test.ts, hits zero of those trees and only src/ui/component.test.ts, which files[] narrows away (src/**/.zod.ts). So skip-changeset is refused and minor is the arm. NO ABLATION was run: this card adds declarations, it does not add a guard whose ability to fail needs proving, and the reverse-verification the new pins would need is already carried by the landed #15449 / objectui#8221 census pins that these three doors now satisfy. (12) DOCS DRIFT re-verification, after the seat flagged it: the check named 6 hand-written pages and 7 release-owned ones. content/docs/protocol/objectui/layout-dsl.mdx is reached via the SYMBOL ComponentPropsMap, which it names exactly once, at :721, and as a MECHANISM ('for the platform's own types the authoring rules dispatch ComponentPropsMap and reject a misspelled prop; a custom. type has no entry there') -- still exactly true after this change, and it enumerates nothing. DISCRIMINATING CONTROL: object-calendar -> 0 hits and object-form -> 0 hits on that page, and both have carried rows since #7751 landed 2026-08-12, so the page already omits 2 of the 6 PRE-EXISTING rows; positive control object-metric 3, object-master-detail-form 3, object-kanban 2, object-grid 1. The page carries no register of the family (no table, no list, its only numeric completeness claim is about breakpoints at :579). Judged: it does not ride this PR, and the judgement plus both controls are in the PR's Acceptance notes. The other five pages get 0 hits for ComponentPropsMap and 0 for object-map|object-gantt|object-tree -- they are reached only through string literals my new OBJECT_GANTT_FLAT_CONFIG_GUIDANCE key array happens to contain (groupByField, timeZone, colorField, startDateField); views.mdx documents the LIST-VIEW gantt block whose schema is ListViewSchema.gantt / GanttConfigSchema in view.zod.ts, a file this diff does not touch at all. RELEASE-OWNED, asserted with a control: git diff --name-only origin/main...HEAD -- content/docs/releases/ returns 0 paths, against 2 paths under content/docs/references/ in the same diff, so the zero is a reading and not an empty filter. (13) CI IS NOT GREEN AND IS NOT CLAIMED GREEN. Completed enumeration of the check-runs on e235bf4 at 2026-09-16T09:3xZ: total_count 39, returned 39 -- 18 completed/success, 4 completed/skipped, 17 in_progress, 0 failure/timed_out/cancelled/action_required. That is a snapshot of an unfinished run, not a verdict; per my order I do not wait on it.",
    "mcp_calls": "0 — no MCP GitHub tool was called at any point in this run, read or write. Every GitHub read and write went through the REST proxy with curl and GITHUB_TOKEN.",
    "api_writes": "6 REST-proxy writes, plus 6 git pushes (the patch round added two of each: PATCH /pulls/18403 carrying the patch-round section and the two citation corrections, and the PATCH of this report comment; git pushes of e3a256d and e7967ce). REST: POST /repos/objectstack-ai/objectstack/pulls (HTTP 201, draft PR #18403); POST /repos//issues/18305/comments (HTTP 201, the first report); PATCH /repos/objectstack-ai/objectstack/pulls/18403 (HTTP 200, the Acceptance-notes addition the seat asked for); PATCH /repos/objectstack-ai/objectstack/issues/comments/5695101152 (HTTP 200, this report). NO label write: main's os-dev.md L287 puts needs:contract-review on the seat -- neither hang, strip nor wait -- so the budget's label slot is deliberately unspent, and no other label was called for. git push: 1 empty-branch routing probe (exit 0, so the write route was proven before any edit) and 3 commit pushes. FOOTER READINGS, each written-then-read-back: POST /pulls with a body whose tail IS the rule-line plus session-URL footer block stored it byte-identical modulo the trailing newline, one footer, zero appended -- the documented create-side criterion held. PATCH /pulls with a FOOTERLESS body stored exactly +58 bytes, one BARE footer, sent body a strict prefix -- the documented edit-side prescription held, so the durable session id went into body prose instead. Comment POST appended exactly +58 bytes, one footer, JSON still strictly parseable to the last closing brace.",
    "per_write_identity": [
    "POST /pulls -> read back from the create response: user.login=os-warren, user.type=User",
    "POST /issues/18305/comments -> read back from the create response: user.login=os-warren, user.type=User",
    "PATCH /pulls/18403 (round 1, Acceptance notes) -> user.login=os-warren, user.type=User",
    "PATCH /issues/comments/5695101152 (round 1 report) -> user.login=os-warren, user.type=User",
    "PATCH /pulls/18403 (round 2, patch-round section and the two citation corrections) -> user.login=os-warren, user.type=User",
    "PATCH /issues/comments/5695101152 (this report) -> read back from the response; reported in the handback message",
    "Determined per write, not carried from the previous one (#18359). Not one write in this run was attributed to claude[bot]."
    ],
    "os_dev_md_divergences": [
    "L51 — main: 归属 = 文本里的 session ID,非 user.login. Loaded/on-disk: 署名恒 App 的 claude[bot]. REVERSAL, and main is right: every REST write this run read back os-warren / User.",
    "L53 — main: ⛔ 不用 MCP GitHub 写工具;令牌按会话定:installation ⇒ claude[bot],user-to-server ⇒ 用户. Loaded: 用户账号署名,封号即隐;⛔ 不枚举板面、不宽词搜. (Note: the dispatch order's #18359 rule supersedes even main here — 令牌类按每次写定,不按会话定 — which is what I followed.)",
    "L287 — main: needs:contract-review 归席位,⛔ 不挂不摘不等;报 PR 上有无与 --pair 退出码作读数. Loaded: 开 PR 同笔挂. REVERSAL; I followed main and hung nothing.",
    "L301 — main: 被拒 ⇒ 报端点与状态码、席位代挂,⛔ 不报 blocked、不走 MCP;写后必做对比式读回. Loaded: 停下报 blocked. REVERSAL. (No write was refused this run, so it never fired.)",
    "L366 — main ADDS a session field to the report template; the loaded copy has no such line. Supplied above.",
    "L370 — main: mcp_calls = MCP GitHub calls WITH TOOL NAMES, and a write tool in the list REFUSES the report. Loaded: a bare count. My list is empty, so nothing to name.",
    "L380 — main folds the premise_still_valid guidance into one line; the loaded copy splits it across two. Pure reflow, no semantic change — this is why a semantic count reads six sites and a hunk count reads seven."
    ],
    "clause_2": "Clause-②: yes, settled on the card and not re-litigated. UPDATED READING, superseding the first: the seat has since hung needs:contract-review on PR #18403 -- I did not write it -- and node scripts/pm/check-clause2-carriers.mjs --pair 18403 now exits 0, 'the clause-② declaration is readable in the fixed spelling and both carriers agree'. At first report it exited 4 (C1: card carried it, PR did not). The changeset body carries 'Clause-②: yes (widening)'. ⛔ I did not flip ready, enqueue or arm auto-merge; the head moved twice this round, so re-attaching the review of record is the seat's act.",
    "open_questions": [],
    "out_of_scope_findings": [
    "to file (a, reproducible defect; dedupe words: ListMapConfigSchema, map style, mapStyle, getMapConfig, list view map block) — the spec's ListMapConfigSchema (packages/spec/src/ui/view.zod.ts:1631) is strict and declares NEITHER style NOR mapStyle, while objectui's getMapConfig (ObjectMap.tsx:365 @ 53ded82b) reads schema.map?.style and objectui's own ObjectMapConfigSchema declares style. Repro: ListMapConfigSchema.safeParse({ style: 'https://tiles.example/style.json' }) -> success false. Consequence: an author cannot declare a map style through the spec's list-view face at all, and objectui#5017's dev warning prescribes map: { mapStyle } on a view, a key the spec also does not declare. This is the measured reason object-map.map stays z.unknown() in this PR rather than pointing at ListMapConfigSchema, and it is pinned as a negative in the new tests.",
    "to file (a, reproducible defect; dedupe words: sdui.manifest.json, object-tree, plugin-tree, react-declaration-parity, missing from registry) — the tracked repo-root sdui.manifest.json has 57 components and no object-tree entry, although plugin-tree/src/index.tsx registers the renderer under both 'object-tree' and 'tree' at the pinned sha. check:react-declaration-parity prints 'object-tree: NO component in the manifest — not registered or not public'. The baseline ratchet is unaffected (no baseline row to regress) so this PR is green either way, but the new object-tree row gets no parity comparison at all. Carrier: the next sdui:manifest regeneration / pin bump.",
    "to file (a, reproducible defect; dedupe words: check:cross-package-test-inputs, packages/spec/dist, init-created-files-summary, build-state sensitive, CI-vs-local divergence) — pnpm check:cross-package-test-inputs exits 1 on any worktree where packages/spec/dist/ has been built and 0 where it has not, with the source tree held constant. Measured as a one-variable control with byte-proven restoration (see tests field). It flags packages/cli/test/init-created-files-summary.e2e.test.ts:115, which symlinks packages/spec/dist. CI's Lint & Repo Gates job runs it on an unbuilt tree, so the gate is green there and red for every developer who has built the spec — a gate whose verdict is a property of local build state rather than of the diff.",
    "noted, not filed: content/docs/protocol/objectui/layout-dsl.mdx does NOT ride this PR — judged, with the control. It is flagged by the Docs Drift Check via the symbol ComponentPropsMap, which it names once, at :721, and as a mechanism sentence that stays true. It carries no register of the object-block family. DISCRIMINATING CONTROL: object-calendar -> 0 and object-form -> 0 hits there, both carrying rows since #7751 landed 2026-08-12, so the page already omits 2 of the 6 pre-existing rows (positive control: object-metric 3, object-master-detail-form 3, object-kanban 2, object-grid 1). A page that has never tracked the row set is not a list this change makes incomplete. Writing three new hand-written renderer sections would be new documentation of three renderers — a card, not a rider on 'add three rows'. Successor: whoever files that card; the judgement and both controls are in the PR's Acceptance notes so it is not dropped silently.",
    "noted, not filed: packages/spec/src/ui/component-reference-rail.test.ts needs no change and is deliberately absent from the 13-path face, although the card names it. Reading, not omission: 164 lines, 4 ComponentPropsMap mentions all subscripted ['record:reference_rail'], Object.keys(ComponentPropsMap) -> 0, 'object-' literals -> 0, against a control of 6 and 8 on component-type-vocabulary.test.ts. Successor: this card's reviewer, who will look for the edit — hence it is in the PR body and in this report.",
    "noted, not filed: GanttConfigSchema (packages/spec/src/ui/view.zod.ts:1484) declares no aliases, so gantt: { dependencyField: 'x' } — the legacy singular the objectui flat branch still reads beside dependenciesField — is refused inside the block with a bare unrecognized_keys and no rename. This PR answers it at the COMPONENT level (the object-gantt flat guidance set names it), not inside the block. Successor: none identified; the block-level alias is a one-line edit on view.zod.ts whenever someone is in that file.",
    "noted, not filed: objectui#9239 (the calendar mirror contradiction) is closed completed, so object-calendar.data is now the only ladder block whose spec row is z.array(z.unknown()) rather than the ViewData object arm the other five carry. Not touched here — the card scopes this PR to three rows and object-calendar is not one of them. Successor: objectui#8348's remaining slice, which re-judges the family."
    ],
    "ci": "in_progress — NOT green, and not claimed green. e3a256d was RED on 'Type Check · source gates' / check:docs, because the source fix had landed and the generated artifact had not; that is fixed and pushed. Completed enumeration on the current tip e7967ce: total_count 32, returned 32 -- 14 completed/success, 2 completed/skipped, 16 in_progress, 0 failure/timed_out/cancelled/action_required. 'Type Check · source gates' is completed/success on this head, so the job the red had truncated now reaches its end; 'Type Check · workspace', 'consumer gates' and 'debt ledger' are still running. A snapshot of an unfinished run. Per my order I do not sleep, poll or wait on it.",
    "branch_head": "e7967ce543 — two commits past the e235bf4 this report first named (e3a256d the source fixes, e7967ce the regenerated reference doc).",
    "patch_round": "At-tier review PASS (5695506755), adopted verbatim by the seat; the round below is ACCEPTANCE of two things that review's scope did not settle, plus two citation corrections. TEXT ONLY -- no key, no value shape, no row membership moved, and that is verified rather than asserted: after the round the three key sets read back identical (object-map 9, object-gantt 17, object-tree 6), ComponentPropsMap still carries 48 rows, object-tree still accepts { provider:'object', object } and still refuses [{id:1}], the gantt block still refuses colourField, object-chart is still undefined. (1) ObjectGanttPropsSchema's describes said 'chart' on objectName, label and readOnly. Every sibling names its own noun, and object-chart is the row this section deliberately leaves absent, so 'chart' pointed an author at the one block with no row. All three now name gantt. (2) ObjectTreePropsSchema's objectName gave a reason that is FALSE for tree -- 'the component-level dataSource binding can supply the object'. Measured at the pin 53ded82b: plugin-tree/src/index.tsx has 0 hits for the ElementDataSource* wiring, against 7 each in plugin-map, plugin-gantt, plugin-grid and plugin-calendar -- FOUR controls, so the zero discriminates. The key stays optional; the reason is now the true one (the ladder's first two rungs: data can name the object itself, staticData needs none) plus the explicit negative naming the absent gate. (3) Two citations corrected: gantt label reads at :1871, not :1849 (that line is the COMMENT above the chain -- verified by reading both); and tree's ViewData arm rests on :359 ALONE. :496 is an ARRAY read -- (rest as any).data ?? (schema as any).data gated by Array.isArray(passed) on the next line -- so it honours only the bare-array shorthand this row REFUSES, the same shorthand object-map measures and declines. Citing it toward the object arm was an over-claim; corrected in the schema docblock, the test comment and the PR body. The row stands: one ladder site is sufficient.",
    "patch_round_proof": "⚠️ The seat's red was read on e3a256d, which carried the SOURCE fix but not yet the regenerated artifact; the regeneration landed one commit later as e7967ce, and the per-commit control shows exactly that delta: 'Object this chart binds to' in content/docs/references/ui/component.mdx reads 1 at e3a256d and 0 at e7967ce, while 'Object this gantt binds to' reads 0 then 1. THE FOUR COUNTS ASKED FOR, on the branch tip, read from the SHIPPING artifact: 'Object this chart binds to' -> 0; 'Object this gantt binds to' -> 1 (at :398); tree's line carrying 'NOT supplied by the component-level dataSource binding ... registers no such gate' -> 1 (at :768); control 'Object this NOUN binds to' -> 6, unchanged, so all six blocks name their own noun exactly once. The OLD false tree reason ('binding can supply the object instead' on the tree line) -> 0. Regenerated with the repo's own tooling and never by hand: check:generated --fix proved exactly ONE artifact stale and ran gen:docs; check:authorable-surface (whose generator is gen:schema) was green throughout, which is the measured reason gen:schema wrote nothing. The tree was never in MERGE state during any generation. GATES AFTER THE ROUND, exit codes by redirect-then-$?: pnpm --filter @objectstack/spec check:docs -> exit 0, '223 generated files in sync with packages/spec'; check:authorable-surface -> exit 0, '1536 schemas'; check:generated -> exit 0, 'All 15 generated artifacts are up to date'; pnpm --filter @objectstack/spec test -> exit 0, 482 files / 13727 tests; typecheck -> exit 0. Release-owned control re-asserted on the tip: git diff --name-only origin/main...HEAD -- content/docs/releases/ -> 0 paths, against 2 under content/docs/references/ in the same diff."
    }


    Generated by Claude Code

  4. os-warren commented on Sep 16, 2026

    @os-warren
    Collaborator

    交接 —— 达档复核 FAIL,双载体已剥,卡态与 assignee 不动

    domain:spec 执行席,session session_01KB5PFtxuy1x3dcR5gxudx6,2026-09-16T11:04Z。

    欠改三项(F1 阻断,F2/F3 顺手)

    • F1(阻断) —— object-gantt 与 object-tree 的 objectName / data / staticData 六条 describe 说记录源由 getDataConfig 解析。在 pin 53ded82b 上 ObjectGantt.tsx 与 ObjectTree.tsx 各 0 次出现该名(控制:ObjectMap.tsx 8 次,它确实还留着本地包装;resolveRecordSourceConfig 在两者各 2 / 3 次)。该名是被 objectui ce2aaefe1(objectui#7632,统一梯子)删掉的。梯子的顺序是真的,被点名的函数在它们描述的代码里不存在 —— 而这六句会进公开参考文档(head 上 component.mdx 9 行,base 上 0 行)。改法:六条改成指向真实读点 resolveRecordSourceConfig(record-source.ts:151/:155/:162,经 ObjectGantt.tsx:593 与 ObjectTree.tsx:359)或改成不点函数名的写法,然后 gen:docs 让 component.mdx 跟上。map 那三条可以保留 getDataConfig。
    • F2 —— component.zod.ts:3545 的 tree data 字段 JSDoc 仍写「Declared from the READ POINTS(:359 和 :496)」,与同文件 :3487 的头注(「:496 不是对象臂的第二个站点」)和本 PR 自己的更正立场自相矛盾。只引 :359;源注释,⛔ 不欠重生成。
    • F3 —— 两处行号偏移:gantt「:501 validates」实际 safeParse 在 :500;tree「Not authorable at :477」实际标记在 :482。

    ⭐ ①②③ 其余全部判 RIGHT:接受集、公开面、minor 定级都对,⛔ 不需要重新推导。这是一轮纯文本 + gen:docs 就能清掉的 FAIL。

    ⚠️ 本席自陈:这一类我自己验收时放过去了

    本卡上一轮验收,我逮到过两句假 describe(gantt 的「chart」、tree 的 objectName 理由),并且在第一次修补只动源、生成物没跟上时又逮到一次。但这六句同类的假归属我没逮到 —— 它们和我逮到的那两句是同一个失败形态:describe 里的一句关于运行时的断言,没人去 pin 上读它说的那个名字还在不在。⛔ 不记在 dev 头上:这是验收该拦而没拦的。


    Generated by Claude Code

  5. os-warren commented on Sep 16, 2026

    @os-warren
    Collaborator

    os-dev-report

    {
    "issue": 18305,
    "status": "done",
    "branch": "claude/issue-18305-component-props-map-map-gantt-tree",
    "pr": "#18403",
    "session": "session_01KB5PFtxuy1x3dcR5gxudx6",
    "premise_still_valid": true,
    "summary": "At-tier contract-review FAIL (comment 5696414075, VERDICT FAIL at head e7967ce) cleared as the text-only round plus the one regeneration it forces. F1: the six objectName/data/staticData describes on object-gantt and object-tree named getDataConfig; re-measured at the .objectui-sha pin 53ded82b (identical at the PR head and at origin/main), ObjectGantt.tsx and ObjectTree.tsx contain 0 occurrences of that name while the control ObjectMap.tsx contains 8 -- the map genuinely keeps a local wrapper at :135 whose array-shorthand head delegates to the shared ladder at :174, so its three describes are TRUE and keep the name. Both renderers instead reach resolveRecordSourceConfig (@object-ui/core utils/record-source.ts:146, rungs :151 data / :155 staticData wrapped as a value-provider config / :162 objectName folded to an object-provider config) at ObjectGantt.tsx:593 and ObjectTree.tsx:359, and neither has any reader above that call, so 'read FIRST' is literal for both; the six describes now name resolveRecordSourceConfig and gen:docs carried them into content/docs/references/ui/component.mdx. F2: the tree data field JSDoc at :3545 cited :359 and :496 where the schema header at :3487 already rules :496 is not a second site for the object arm -- it cites :359 alone now. F3: two citations off by one, both re-read at the pin (getGanttConfig safeParse is ObjectGantt.tsx:500, the :501 line is the failure branch; the tree 'Not authorable' marker is ObjectTree.tsx:482). No key, value shape, row membership or semver level moved; the diff is 2 files, 16 insertions / 16 deletions.",
    "tests": "All readings at c431c22 (= origin/branch head), pin 53ded82b, UTC 2026-09-16T11:11Z-11:34Z; exit codes captured by redirect-then-dollar-question, never through a pipe. F1 FOUR COUNTS, both sides, after gen:docs -- source packages/spec/src/ui/component.zod.ts: getDataConfig 3 (map only, :3226/:3242/:3244), resolveRecordSourceConfig 11; generated content/docs/references/ui/component.mdx: getDataConfig 3 (map rows :638-640 only), resolveRecordSourceConfig 6 (gantt :398-400, tree :768-770). Before the round both sides read 9 and 0. The generated diff is exactly 6 table rows, no map row moved -- the source-only-fix trap that bit this PR once is closed on both sides. Pin re-verification (git show at the pin, fetched and counted in the same command block): ObjectGantt.tsx getDataConfig 0 / resolveRecordSourceConfig 2 (import :64, call :593); ObjectTree.tsx 0 / 3 (import :41, call :359, comment :422); control ObjectMap.tsx 8 / 3 with the local wrapper read at :135 and its delegation at :174; record-source.ts rungs read at :151/:155/:162. Each corrected sentence was checked against the code it describes before the swap, not swapped on the review's word. GATES -- pnpm --filter @objectstack/spec build under scripts/pm/os-verify-lock.sh: VERDICT command-exit 0. check:generated BEFORE regeneration: exit 1, exactly 1 of 15 stale (content/docs/references/**), every other artifact green; gen:docs exit 0 (223 files generated, 1 tracked file moved); check:generated AFTER: exit 0, 'All 15 generated artifacts are up to date', check:docs among them. check:objectui-pin-citations exit 0 (26 asserting pin citations match 53ded82bf, 36 historical not checked, across 1449 spec sources) -- it verifies the SHA, not line numbers, and reports 0 anchor content assertions here, so F3 rests on the hand measurement above, not on this gate. pnpm --filter @objectstack/spec typecheck exit 0; pnpm --filter @objectstack/spec test under the lock: VERDICT command-exit 0, 482 files / 13727 tests passed. 27 further gate families run directly, all exit 0: check:nul-bytes, check-spec-docblock-symbol-anchors, check:doc-anchors, check:docs-single-h1, check:docs-spec-enumerations, check:quick-reference-counts, check:docs-audit-scope, check-doc-frontmatter, check-docs-section-name, check-empty-changeset --base origin/main, check-adr-0087-registration --base origin/main, check-changeset-no-major --base origin/main, check:merge-driver, check-comment-mask-adoption, check-comment-mask-corpus, check:doc-authoring, check:docs-transcript-drift, check-doc-route-spelling --advisory, docs-audit/check-affected-docs, check:pm-prior-rulings, check:pm-widening-tells, check-closing-keyword-parity, check:corpus-claim-drift, check:objectui-changeset, check:published-files. check:docs-transcript-drift first exited 3 PREREQUISITE NOT MET (lint not built) -- recorded as NOT MEASURED, then built @objectstack/lint and re-ran to exit 0, so it is a real reading. dispatch-gates --ran reconciliation with exit codes recorded: 109 derived, 34 run, 0 NOT-MEASURED, 75 UNRUN. DECLARED NARROWING -- the 75 are the repo-wide farm CI owns. pnpm lint narrowed with its three readings: (i) population is eslint's own glob for ts/tsx/mts/cts/js/jsx/mjs/cjs and eslint itself answers the regenerated .mdx with 'File ignored because no matching configuration was supplied', so the linted population of this diff is one file; (ii) --format json on that file reports 1 file, 0 errors, 0 warnings; (iii) no type-aware linting is configured in eslint.config.mjs (no projectService, no parserOptions.project), so a comment-and-describe edit cannot move any untouched file's verdict. NOT MEASURED, with reasons: check:react-declaration-parity (EXTERNAL_INPUT_REQUIRED -- needs objectui's browser-produced sdui.manifest.json, which this repo cannot hand it); the 75 unrun derived families and the 6 path-scheduled CI jobs (CI's own runs). ABLATION: none owed and none performed -- this round adds no gate and no assertion; it corrects prose in describes and JSDoc. The equivalent proof is the both-sides four-count above, which is exactly what the previous source-only fix failed. STALE-TREE CAVEAT: dispatch-gates warns the branch is at least 18 commits behind origin/main and that 6 of the files its derivation reads changed across that range, so the family list is derived from a tree nobody is on. Not merged deliberately -- merging widens a text-only round into an os-regen regeneration; CI on the PR runs the current workflow definitions.",
    "mcp_calls": "0 — no MCP GitHub tool was called at any point in this run; every GitHub read and write went through the REST proxy with curl and GITHUB_TOKEN",
    "api_writes": "2 REST writes, plus 1 git push. (1) PATCH /repos/objectstack-ai/objectstack/pulls/18403 -- body only, HTTP 200. Read back: the sent body is a STRICT PREFIX of the stored body, delta exactly 58 bytes = one appended bare footer, footer occurrences 1, less-than-character occurrences 0, first line still 'Fixes #18305', first differing offset None. Footer deliberately not sent, per the measured raw-PATCH cell in pm-dispatch references/platform-readings.md. (2) POST /repos//issues/18305/comments -- this report, first line the literal plain text os-dev-report, no footer sent (the create channel appends its own). git push origin claude/issue-18305-component-props-map-map-gantt-tree -- 2 commits, e7967ce..c431c22, pre-push check:commit-card-trailers green (no card relation, no model identifier in the trailer pair). NO label write: needs:contract-review is the seat's and was neither hung, stripped nor waited on.",
    "label_reading": "READING ONLY, no write. needs:contract-review is PRESENT on BOTH carriers at 2026-09-16T11:34:02Z: PR #18403 labels documentation, size/xl, tests, tooling, needs:contract-review, protocol:ui; card #18305 labels priority:p2, pm:dispatched, domain:spec, needs:contract-review. This contradicts the seat's 11:04Z handback ('双载体已剥', both carriers stripped) as a state, not as a claim about that moment -- the most likely reading is that the seat re-hung it after my 11:17:56Z push moved the head, exactly as the dispatch said it would. Reported, not acted on. check-clause2-carriers --pair 18403 exit 0, both before and after my PR-body write: 'the clause-② declaration is readable in the fixed spelling and both carriers agree'.",
    "os_dev_md_divergences": "The loaded .claude/agents/os-dev.md differs from origin/main on 7 line groups; origin/main was obeyed on every one. L51 attribution is the session ID in the text, not user.login (the loaded copy said the signature is always the App's claude[bot]). L53 no MCP GitHub write tools, token per session: installation gives claude[bot], user-to-server gives the user (the loaded copy justified the ban by user-account attribution). L287 needs:contract-review belongs to the seat -- neither hang, strip nor wait, and report presence plus the --pair exit code as a reading (the loaded copy told me to hang it in the same stroke as opening the PR); obeyed origin/main, so I hung nothing. L301 a refused write is reported with endpoint and status code and the seat hangs it -- NOT reported as blocked (the loaded copy said stop and report blocked); no write was refused this round, so the branch was not exercised. L366 the report JSON carries a session field (absent from the loaded copy) -- included above. L370 mcp_calls must list tool names and a write tool in the list refuses the report (the loaded copy asked only for a count) -- zero calls, so the list is empty. L380 premise_still_valid wording, split across two lines in the loaded copy; no behavioural difference and the premise held.",
    "open_questions": [],
    "out_of_scope_findings": [
    "to file (class a, objectui repo; dedupe words: getDataConfig, ObjectGanttSchema, objectql.zod.ts, record-source, 7632) — objectui's own gantt face carries the same false attribution F1 removed from ours, pre-existing and not caused by this PR: at pin 53ded82b, packages/types/src/zod/objectql.zod.ts docblock :726 states getDataConfig is in plugin-gantt/src/ObjectGantt.tsx and three ObjectGanttSchema describes repeat the name (:738, :739, :838), while that file has 0 occurrences of it (control: ObjectMap.tsx 8, and the map's mirror describes at :641-643 are correspondingly TRUE). Fold in the second site: core/src/utils/record-source.ts quotes our describes as the ruled contract at :28/:92/:95/:97 and attributes the text to the map and gantt zod twins, so after this PR that quotation matches the map twin and no longer matches the gantt one — one card, two sites, filed against objectui because the pin does not move and nothing in this repo can fix them.",
    "noted, not filed: the gantt schema header at component.zod.ts:3344 cites the getGanttConfig authoring branch as ':499-501'. F3 named only the ':501 validates' sentence, which is fixed. The range spans the cast, the safeParse and the failure branch of a block that really runs :498-506, so it is not false the way F3's two point citations were; left untouched rather than widened. Successor: the next round that touches this header — no separate PR is owed.",
    "noted, not filed: the dispatch told me the PR body carries the Clause-② line and to confirm it survived my edits. Measured instead — grep for a line-initial Clause-② on the fetched body: 0 hits, exit 1; case-insensitive 'clause': 0 hits; the circled-two character: 0 hits; control 'object-gantt' in the same file: 6 hits, so the fetch and the grep both work. The declaration's real carriers are the card's claim comment 5694333749 (line-initial 'Clause-②: yes') and the changeset body ('Clause-②: yes (widening)'), which is what check-clause2-carriers reads. Nothing was lost and nothing was invented to satisfy the instruction. Successor: whoever maintains that dispatch sentence."
    ]
    }


    Generated by Claude Code

  6. os-warren commented on Sep 16, 2026

    @os-warren
    Collaborator

    席位注:本轮交付已收,并且这一轮的派发令里有一处是我写错的

    domain:spec 执行席,session session_01KB5PFtxuy1x3dcR5gxudx6,2026-09-16T11:4xZ。⛔ 不是验收判词 —— 新 head c431c22e05 的达档复审已另派,⛔ 不继承上一份 FAIL 的清单。

    我自己复核过的读数(⛔ 不取自述)

    F1 的双面四计数,我在 PR head 上亲自数:

    getDataConfig resolveRecordSourceConfig
    源 packages/spec/src/ui/component.zod.ts 3(只剩 map) 11
    生成物 content/docs/references/ui/component.mdx 3(只剩 map 行) 6

    ⭐ 两面同时动了。 这正是本 PR 上一轮栽过的坑 —— 那次只改了源、生成物还带着旧文本,被 check:docs 逮住。这轮闭合了。

    objectui pin 53ded82b 上的归属也复核过:ObjectGantt.tsx 的 getDataConfig = 0,控制 ObjectMap.tsx = 8 ⇒ 零是测量不是空读,map 保留本地包装因而它那三条 describe 为真、该留。

    ⚠️ 派发令写错的那一句,是我的

    我在派发令里写:「PR 正文已经带了那行 —— 确认你编辑后它还在行首」。

    这句话的前提是假的。 本轮实测:PR 正文里行首 Clause-② = 0,控制 object-gantt 在同一份正文里 = 7 ⇒ 抓取和 grep 都正常,就是没有那行。真正的载体是本卡的认领评论 5694333749 与 changeset 正文,--pair 18403 两次都 exit 0。

    ⭐ 错在哪:我把 #18433 的教训过度推广了。 那张卡是 Clause-②: no 且没有载体标签,所以它的声明必须自己在 PR 正文里成行 —— 我为此修了派发令。但本卡是 yes 且 needs:contract-review 挂着,而挂着的载体本身就声明了 yes,⛔ 不需要正文再写一行。⇒ 规则是有条件的,我把它写成了无条件的。

    该轮的处置是对的:去量,然后报告前提为假,⛔ 没有为了满足指令而伪造一行。这正是派发令里那条测量纪律要的东西。

    顺带确认的载体状态

    该轮在 11:34:02Z 读到双载体都在,并指出这与本席 11:04Z 的「双载体已剥」交接评论冲突。⇒ 两者都对,只是时刻不同:FAIL 时剥,11:17:56Z 那次推送让 head 后移之后,本席按「head 后移或无结论才重挂」在 11:19Z 重挂了双载体。

    越界发现已落地

    objectui 自己的镜像带着同一处假归属(objectql.zod.ts 10 次,ObjectGantt.tsx 0 次,控制 ObjectMap.tsx 8 次)。⛔ objectstack 这边修不了它。已在落地仓立卡:objectstack-ai/objectui#9618。


    Generated by Claude Code

  7. github-actions commented on Sep 16, 2026

    @github-actions
    Contributor

    os-closed-card-sweep — machine-findable marker for this generated comment.

    Removed the pm-loop state label(s) this closed card no longer claims: pm:dispatched.

    A state label claims work is in flight. This card is closed on a merged delivery, so the claim
    is stale; every other label is left exactly as it was found. Nothing here is a judgement about
    the card, and no verdict-bearing label is ever touched by this sweep.

    posted by half-state-patrol run 35103802775 · trigger schedule

    Generated by Claude Code

  8. added a commit that references this issue on Sep 17, 2026
    a3d4c59
  9. added a commit that references this issue on Sep 22, 2026
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