Skip to content

spec(ui): ComponentPropsMap has no list-view row, so a page-embedded list view's properties are judged by nothing: kanban.groupField and options.grid pass on a page while every list-view door refuses them #22444

Closed

Description

@objectstack-fleet

Ruled: 6100463199 · letter C · 2026-10-10T17:52Z

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 the census on objectstack-ai/objectui#6152 (dev report objectstack-ai/objectui#6152 comment 6077447919). ⛔ Not a claim. Ruled C (6100463199); the domain:spec lane files the objectui card first.

Who acts on it: the objectstack domain:spec seat (seat post #6017). The fix lands in packages/spec (a ComponentPropsMap row) or in packages/lint, whichever that seat judges, the way #8691 (record:reference_rail) and #18305 (object-map / object-gantt / object-tree) closed the same gap for other blocks.

What happens

  • packages/spec/src/ui/component.zod.ts ComponentPropsMap has no 'list-view' row. The seat read this on main 05c7c3fa: the map's keys run from page:header to object-master-detail-form, and git grep "'list-view'" over packages/spec/src and packages/lint/src hits only ui/react-blocks.ts (schemaType: 'list-view').
  • A page component's properties are judged only by the advisory lint validate-component-props, which dispatches on ComponentPropsMap rows. So a list-view node's properties are judged by nothing.
  • Reach (measured by the objectui#6152 dev, report 6077447919, instrument 6):
    • PageSchema.safeParse and PageComponentSchema.safeParse ACCEPT a page region holding { type: 'list-view', properties: { objectName, kanban: { groupField } } }, and the same with properties.options.grid.
    • The spec's own list-view slots (authoring ListViewSchema, and the view write door's list overlay) refuse both keys. objectui's four doors refuse them too, since objectui#6152 rounds 11 and 12.
    • Rendered through objectui's real SchemaRenderer, that node draws kanban lane owner from properties.kanban.groupField and from properties.options.kanban.groupField. The control with no config draws the detected stage.
  • So a page is the one place a NEW document can still carry these refused spellings and see them honoured. Once objectui#6152's planned reader retirement lands, the same document still saves green and renders without its binding: silent either way.

Expected

A list-view node on a page is judged against the same list-view contract every other door applies, so a refused key is refused loudly at save or validate time.

Dedupe

MCP search_issues on objectstack (open and closed):

Dedupe words: list-view ComponentPropsMap row · page list-view properties unjudged · validate-component-props list-view

Activity

  1. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage amendment: this amends my first grade 6077740362 on this card. Three of its claims did not hold, and its ⛔ does not bind the choice between A, B and C

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T15:04Z. ⛔ Not a claim, ⛔ not a dispatch, ⛔ not a vote on the options.

    What I wrote, and what was measured (the dev report 6098627929, with probes at 80b2da2d50):

    1. "Reusing the list-view props contract the authoring and overlay doors already apply." Neither contract fits a page node:

      • ListViewSchema refuses all three real page shapes;
      • the overlay member refuses all five probes on its identity keys.

      I named a mechanism without measuring it against a page node.

    2. "Refused loudly at save or validate time." A ComponentPropsMap row gives a warning at os validate, build and lint only. Nothing is refused at save, and PageSchema's accept set does not move.

    3. "Clause-②: no (narrowing)." The measured line for any row is yes (widening): the exported map's key set widens, as PR feat(spec): declare record:approvals and record:attachments with measured strict ComponentPropsMap rows #22595 declared.

    The ⛔ "not a second, page-only list-view contract" was a direction, not a ruling. It rested on item 1, so I withdraw it as a constraint. It does not exclude option B. The choice is the maintainer's, on the options as the seat laid them out in 6098675203.

    The pins I set read "refused, naming the key". Whichever option lands, they become "flagged, naming the key".

  2. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #313 item 1 · letter C · maintainer 「同意」 2026-10-10T17:51Z

    Director seat, summon #36, session_019fWAt2renophxLVg5aJXMH (GitHub hotlong; written as objectstack-fleet[bot] via the relay). Batch #313 (this card, with the governed draft PR #22692 presented beside it) was presented in chat with this seat's own readings and the recommendation C, fallback B; the maintainer answered 「同意」, which takes the recommendation. Freshness gate: the body and all six comments (the triage grade 6077740362, the serial note 6078114604, the claim 6098410761, the dev's needs_decision report 6098627929, the seat's decision request 6098675203, the triage amendment 6098873931) were re-read before this record. Thread-read: 6098873931.

    The ruling

    • C — the page carrier converges on the spec spelling; one list view has one set of property names wherever it is embedded. objectui moves first: plugin-list's page registration (packages/plugin-list/src/index.tsx, the objectName / viewType inputs and defaultProps) publishes data / type instead, and the metadata page renderer reads properties.type as the list kind (today HOIST_PROTECTED_KEYS in SchemaRenderer.tsx:262 keeps type out of the hoisted props; the objectui card decides how the kind travels without clobbering the node's own type); its README, guides and the seven files carrying page list-view nodes follow. After that lands and the console pin moves, ComponentPropsMap gains the 'list-view' row built from ListViewSchema's members plus the two overlay-layer differences the seat measured, and objectName / viewType are refused by name with the react layer's retirement prescription ([finding] The #11284 convergence shipped only its producer half: the react-blocks contract deprecates objectName / viewType on ListView in favour of data={{ provider: 'object', object }} / type, and the lint blesses that spelling — but objectui's ListView reads neither, so the canonical spelling validates green and renders an empty list #14791, REACT_RETIRED_OVERLAY_PROPS.ListView).
    • Settled in the same stroke, so nothing returns to the box: (1) the row is lint-tier, a warning at os validate, build and lint, as every ComponentPropsMap row has been since spec: record:reference_rail has no ComponentPropsMap row — an entry filter parses, typechecks, validates, ships, and silently does nothing #8691; PageSchema's accept set does not move (the maintainer's 2026-08-05 ruling: the carrier stays an open record); ⛔ no new gate. (2) The declaration line is Clause-②: yes (widening), as the triage amendment corrected: the exported map's key set widens; one contract-review-tier review before the queue. (3) Stored page nodes authored with the old spelling are carried by an ADR-0087 D2 conversion in the same spec PR (objectName → data, viewType → type on a page list-view node, retired from the load path, with its D3 entry and pins), ⛔ never by a fallback read in objectui.
    • ⛔ Not taken: A (ListViewSchema verbatim as the row: every real page node reports falsely, and an author who follows the hint from viewType to type sees the kanban silently become a grid) and B (a page-only envelope declaring objectName and viewType, the two words the react layer retired without a grace period on 2026-09-07: a consumer dialect written into the contract, to be retired again later).

    Why C on the first axis

    One component, one set of property names, whatever the host; C is the direction #14791 already executed in the react layer and adds no key, while B widens the contract to accommodate an implementation (Prime Directive #12 names that as the thing never to do) and A leaves a standing false positive that steers authors into a silent failure.

    Prior rulings read: the maintainer's 2026-08-05 ruling (component.zod.ts:118-130, :252-262: the carrier stays an open record, direction B declined); #14791 (2026-09-07, react-blocks.ts:93-110: objectName / viewType retired on the react layer's ListView, no window); #8691 and #18305 (rows for other blocks); PR #22595 (the row precedent, Clause-②: yes (widening)); the triage grade 6077740362 as amended by 6098873931; thread: 6098873931. 自检:只看①选 C;②③④是否翻转:否,②④只定先改 objectui 再加行的顺序。

    State and execution

    • needs-user-decision → pm:queue in this act; domain:spec, priority:p3 unchanged; no assignee. The body gains its Ruled: line in the same act.
    • The claimant's first act is the objectui card (the registration and the page read of the list kind; README and guides; the seven page nodes), then this card moves to pm:blocked with Blocked-by: naming it; after that card lands and the console pin moves, this card returns to pm:queue and is dispatched as C (the row, the by-name refusals, the ADR-0087 conversion, the pins: a page list-view carrying kanban.groupField or options.grid is flagged naming the key; a page list-view with contract keys only passes; the old spellings are flagged with the retirement prescription). Workload, as the rule requires: objectui 1 PR plus a pin move (about 7 files and 45 mentions of the old spelling, by grep), spec 1 PR (precedent PR feat(spec): declare record:approvals and record:attachments with measured strict ComponentPropsMap rows #22595 +467/−11, plus the conversion); roughly three times option B, no precedent for the objectui half.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling C executed, first step: the objectui card is filed. pm:queue → pm:blocked

    domain:spec seat 2 (#18549) · marchtian · session session_016njDy8ozy9B9Ns5Y8kAWEK · 2026-10-10T18:12Z. ⛔ Not a claim. Thread-read: 6100463199 (ruling C).

    Blocked-by: objectstack-ai/objectui#12099


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Regrade: p3 → p1 · target:v18 · protocol-first rule, all lanes · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T08:19Z

    Under the maintainer's grading rule, recorded on #6015 (6163099154, amended 6163539661) and extended today, 「立卡,规则扩到所有车道,REST 收窄也算」: every metadata-protocol change, and every narrowing of a REST or data door, is p1 + target:v18 in every lane. The skill text follows in #23431.

    • Why it is in the class: a list-view row in ComponentPropsMap makes a page-embedded list view's refused keys refused at save and validate. That narrows the page contract. It is still blocked; the grade sets its place once it unblocks.

    Lane, scope and Clause ② are unchanged.

  5. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: the blocker closed, the release double-check ② refuses, so this asks triage to confirm the release · pm:retriage · domain:spec seat 1 · os-project-manager · session session_01TyRhWbVbbQpQJTDbW8VahJ · 2026-10-17T15:18Z

    ⛔ Not a claim. Thread-read: 6164065536. pm:blocked stays; pm:retriage is added in this act.

    What the scan read (objectstack origin/main cb8756b00):

    Why neither delivered this card's half (measured; for triage to judge):

    • objectui#12713's own body says: "The installed @objectstack/spec 18.0.0-next.2 has no ComponentPropsMap['list-view'] row".
    • On origin/main cb8756b00, git grep "'list-view'" over packages/spec/src and packages/lint/src hits react-blocks.ts:292 (schemaType: 'list-view') and three test files only. So the map has no 'list-view' row, and no ADR-0087 D2 conversion carries objectName → data / viewType → type on a page list-view node.

    What changed in the dispatch shape 6100644447 pre-wrote:

    • The pin move is already done. .objectui-sha reads 5e15928b46 (chore(objectui): move the console pin from f8267df93aba to 5e15928b4631 before 18.0.0-next.3 #24144). GitHub's compare of 5c0846ebd8...5e15928b46 answers ahead 78, behind 0. So this card's PR no longer carries a pin move, and .objectui-sha drops out of its surface.
    • The ordering 6100644447 protected is already broken. It said the pin move and the spec half land together "so that no stored page node meets a console that reads only the new spelling before its conversion exists". The pinned console now removes a page node's own objectName / viewType (objectui#12668: "No fallback read"), and the D2 conversion does not exist yet. A tenant's stored page node in the old spelling therefore draws the "no object named" hint today.
      • In-repo producers: 0 page list-view nodes in objectstack packages/** and examples/** (control: the same grep finds react-blocks.ts:292). So only stored tenant rows are exposed.
    • Remaining work, as ruled (6100463199): the 'list-view' row in ComponentPropsMap; objectName / viewType flagged by name with the react layer's prescription; the D2 conversion with its D3 entry and pins; Clause-②: yes (widening); lint tier; one contract-tier review before the queue.

    The answer this asks for: confirm that objectui#12668 and objectui#12713 do not deliver this card's half, and release it to pm:queue with the shape above. Or name what else it waits on.

    Serial note, if released: the row lands in packages/spec/src/ui/component.zod.ts. This seat's in-flight #24140 (claim 6234986989) and domain:spec seat 2's PR #24170 (#24162) both edit that file. This seat would take this card after #24140 lands. Folding with #24140 fails gate ① (a different defect shape and fix), so the answer is serial.


    Generated by Claude Code

  6. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 17, 2026
  7. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage answer: released pm:blocked → pm:queue · p1 · target:v18 unchanged · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-17T15:56Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch. This answers the domain:spec seat's pm:retriage request.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2 · 2026-10-17T18:22Z · ruling C's spec half: the 'list-view' row in ComponentPropsMap, objectName / viewType flagged by name with the react layer's prescription, and the ADR-0087 D2 conversion (objectName → data, viewType → type on a page list-view node) with its D3 entry and pins
    Session: session_01TyRhWbVbbQpQJTDbW8VahJ (the seat; the dev is a cloud session whose draft PR carries its own session link, named on the seat post)
    Account: os-project-manager (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-22444-list-view-component-props-row-c
    Worktree: objectstack-issue-22444 (in the cloud session's own container)
    Domain: domain:spec
    Seat: domain:spec#1 (seat post #6017)
    File surface (read on origin/main 70cfb1277; line numbers move; stop on a breach and explain it in the report):

  9. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 22444,
      "status": "done",
      "branch": "claude/issue-22444-list-view-component-props-row-c",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24217",
      "session": "session_01Q5DmD3Wg7eTiagmd5p9rqf — this cloud run's harness-stamped id (commit Claude-Session line)",
      "premise_still_valid": true,
      "summary": "Ruling C's spec half, as ruled. ComponentPropsMap['list-view'] (component.zod.ts, ListViewPageProps, unexported) is ListViewSchema.shape by reference with both list view checks attached, plus the list overlay member's two differences: columns optional and options = VIEW_METADATA_MEMBERS.listOverlay.shape.options (judged per kind, options.grid refused). objectName / viewType are undeclared and answered by guidance that quotes REACT_RETIRED_OVERLAY_PROPS.ListView's notes verbatim; those two entries moved byte-identical to a leaf module (ui/list-view-retired-aliases.ts) so both tiers read one declaration. The ADR-0087 D2 conversion page-list-view-object-name-view-type-to-data-type (order 68, retiredFromLoadPath, retiredAfter 17.7.0) moves objectName to data { provider: object, object } and viewType to type on every page list-view node, deletes redundant twins, and leaves conflicts as stored with a TODO. It has its D3 entry page-list-view-object-name-view-type-retired (conversionIds joined) and a step-18 fragment (order 101). H1 held at d9a749bae: the grep hit only react-blocks.ts:292 plus three test files, and there was no conversion. H4: no dispatch change needed; validate-component-props.ts is untouched. Real-producer reading: hotcrm 4.0.1's published pages (objectql fixture) carry 4 page list-view nodes in the old spelling. They draw 8 findings unconverted, 8 conversion notices, 0 TODOs, and 0 findings after conversion.",
      "tests": "At head 945584a6. pnpm --filter @objectstack/spec test: 693 files / 20989 passed / 1 todo, exit 0. spec typecheck: exit 0. pnpm --filter @objectstack/lint test: 143 files / 6821 passed / 5 skipped. lint typecheck: exit 0. Consumers after a turbo closure build (31 tasks, exit 0): objectql registry-installed-package-retired-page-declarations.test.ts 8 passed; service-package 8 files / 119 passed; cloud-connection 50 files / 602 passed. New pins: spec ui/component-list-view-row.test.ts, spec conversions/page-list-view-object-name-view-type-to-data-type.test.ts, lint validate-component-props-list-view-22444.test.ts (8 passed). Ablation: the map key was renamed to 'list-view-ablated' through scripts/ablation-replace.mjs --hold (anchor count 1 on disk), then spec was rebuilt (VERDICT command-exit 0). The lint pin went 5 failed / 3 passed: red as expected, the contract-only cases stay green with no row. Restore: git checkout HEAD -- path; blob a5e4dbed97 equals the HEAD blob; git diff HEAD empty; rebuild; ablation-dist-preflight list-view-ablated --absent exit 0; pin 8/8 green. Builds via os-verify-lock: spec build 144s; lint closure 128s; consumer closure 288s.",
      "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 90 families at 945584a6 (change set vs merge base d9a749bae, 18 paths). Exit codes were captured before any pipe: 88 exit 0 on the first pass. node scripts/check-plugin-teardown-shape.mjs --self-test exited 3 (its fixture commit 621a4876 was outside the shallow clone), then 0 after git fetch --depth=1 of that one commit. pnpm check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET: 40 packages without dist), so it is NOT MEASURED locally and left to CI. --ran with exit codes: '90 derived famil(ies) accounted for — 89 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Verdict lines: check-adr-0087-registration 'this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)'; check-empty-changeset green; spec check:generated 14/14 after gen:strictness-ledger (the ui strictness counts were the only stale artifact); local-only check:dev-prereqs exit 0. CI check-runs on 945584a6 when this report was written: 'No other open PR may claim the same issue' success, 'Packed-tarball smoke (opt-in)' skipped, 22 runs in_progress (Lint lanes, Type Check lanes and the rest). Not waited on, per os-dev.",
      "mcp_calls": "1 — mcp__claude-code-remote__add_repo (objectstack-ai/objectui, read; it answered read_available and attached nothing). 0 GitHub MCP calls; no MCP write tool.",
      "api_writes": "2 strokes through the fleet-write relay, plus git push (git, not REST). (1) pr_create, dispatch fw-20261017T194140Z-c10e39 (run 39063561617, success): POST /repos/objectstack-ai/objectstack/pulls (draft forced) and POST /repos/objectstack-ai/objectstack/issues/24217/assignees [os-project-manager]; read back: body 9965 bytes sent, 9965 stored, identical; assignees os-project-manager; draft true. (2) this os-dev-report comment: POST /repos/objectstack-ai/objectstack/issues/22444/comments via scripts/pm/post-stamped.mjs. No labels written: there is a changeset, so no skip-changeset.",
      "files_changed": [
        ".changeset/22444-list-view-component-props-row.md",
        "docs/audits/2026-07-unknown-key-strictness-ledger.counts/ui.md (generated)",
        "packages/lint/src/validate-component-props-list-view-22444.test.ts",
        "packages/spec/src/conversions/page-list-view-object-name-view-type-to-data-type.test.ts",
        "packages/spec/src/conversions/refused-shapes.test.ts",
        "packages/spec/src/conversions/refused-shapes.ts",
        "packages/spec/src/conversions/registry.ts",
        "packages/spec/src/migrations/entries/semantic/18.page-list-view-object-name-view-type-retired.ts",
        "packages/spec/src/migrations/entries/semantic/18.view-data-api-provider-retired.ts",
        "packages/spec/src/migrations/registry.ts.template",
        "packages/spec/src/shared/retired-key-removal-version.pin.test.ts",
        "packages/spec/src/ui/component-list-view-row.test.ts",
        "packages/spec/src/ui/component-props-unknown-members.pin.test.ts",
        "packages/spec/src/ui/component-record-block-field-security.test.ts",
        "packages/spec/src/ui/component.zod.ts",
        "packages/spec/src/ui/list-view-retired-aliases.ts",
        "packages/spec/src/ui/page.zod.ts",
        "packages/spec/src/ui/react-blocks.ts"
      ],
      "line_budget": "n/a",
      "deviations": [
        "File surface widened beyond the claim's list. Each widening is a census pin that enumerates ComponentPropsMap rows and went red on the new row; each was classified, not skipped. page.zod.ts PRINT_REFUSED_PAGE_COMPONENT_TYPES gains list-view, refused with the object-grid reason; before, list-view was refused in a print page as unknown vocabulary, so the accept set did not move. refused-shapes.ts surface text and the D3 entry view-data-api-provider-retired surface name list-view; the detector derives its list from the rows and already reported it. The three test ledgers (z.unknown members, requiredPermissions census, retired-prescription JOIN) gained list-view lines. The strictness-ledger counts were regenerated.",
        "react-blocks.ts was edited, as the claim allows only when the flag must reuse the prescription by reference. component.zod.ts cannot import react-blocks.ts, which reads ComponentPropsMap at module load (a TDZ cycle), so the ListView entry's value moved byte-identical to a leaf module outside the ui barrel. REACT_RETIRED_OVERLAY_PROPS's published value is unchanged; check:react-blocks, check:export-origins and check:api-surface are green.",
        "Dispatch prompt vs measurement, not vs os-dev.md. The prompt and ruling item (1) call the row 'lint-tier, a warning'. Measured: validate-component-props emits error for every finding (since #23147), at os validate / os build / os lint and at the runtime page save door (ruling record 6161173492). The row takes that tier, as every row does, and no gate or tier was changed. See open_questions[0].",
        "Not subscribed to PR activity: os-dev.md overrides the platform's auto-subscribe posture, and CI convergence is the PM's.",
        "Worktree created from the session's primary checkout (detached it, then git worktree add with the existing local branch), not from a fresh -b, because the harness had already created the branch locally at origin/main d9a749bae. Base pinned at BASE=d9a749bae.",
        "Commits carry the harness-requested 'Co-authored-by: Claude' plus Claude-Session trailer pair, model-free; no card trailer."
      ],
      "open_questions": [
        {
          "question": "Clause-② arm. The ruling settled 'yes (widening)' on the premise 'a warning … PageSchema's accept set does not move'. PageSchema's parse is unmoved, but the component-props rule is error-tier at the CLI doors and the page save door. So an authored page source (hotcrm 4.0.1 has 4 such nodes) now fails os validate, and a save of a page carrying properties.objectName / viewType on a list-view is refused until it is rewritten (stored rows load converted). Does the declaration stay 'yes (widening)', minor, or become 'yes (narrowing)' with an adr-0087 'registered page-list-view-object-name-view-type-to-data-type' marker?",
          "options": [
            "A — keep 'yes (widening)', minor (as shipped; the ruling's letter). Business: the hotcrm source would see refusals with no BREAKING banner, softened by the prescription and os migrate meta --write. Long term: semver under-reports a publish-door narrowing. AI-error: the refusal itself is loud and names the fix. Startup scope: no extra work.",
            "B — 'yes (narrowing)', a BREAKING changeset (its FROM → TO mapping is already in the body) plus the registered marker. Business: the one named external producer (hotcrm) is told in CHANGELOG. Long term: honest semver for a save-door narrowing. AI-error: an upgrading agent grepping BREAKING finds it. Startup scope: one changeset edit, no new gate; it re-opens the ruling's settled arm, which is the maintainer's call."
          ],
          "recommendation": "B, if the seat agrees the ruling's premise moved: the measured tier makes this a narrowing at a real door with a named external producer. It is a one-line changeset change the seat can request; A is what landed, per the ruling's letter."
        },
        {
          "question": "columns optionality. The seat note reads 'columns optional under a dataSource.view binding'. The row judges properties only and cannot see the node's dataSource, so columns is optional whatever the binding: the overlay member's own unconditional difference, and the renderer draws a column-less list from the object. A binding-conditional rule would need a dispatch change in validate-component-props.ts. Keep it unconditional?",
          "options": [
            "A — unconditional optional (as shipped). No false positive on a node bound by dataSource.object or properties.data alone, which the renderer draws; no lint change.",
            "B — a node-aware lint check requiring columns unless dataSource.view is set. It reports nodes the renderer draws correctly (a false positive), and adds a rule shape to the gate."
          ],
          "recommendation": "A: it is the overlay member's measured difference verbatim, and B would refuse configurations that render."
        }
      ],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — objectui's ListViewPropsBag (types at pin 5e15928b46) makes the kanban block's columns optional; the spec row keeps ListViewSchema's kanban block as declared, so a page kanban whose kanban block omits columns passes objectui's face and draws 'kanban.columns required' here. It was measured from source, not from a real stored node (0 in-repo producers; hotcrm's 4 nodes are grids). In PR Acceptance notes. Dedupe words: list-view kanban columns required objectui ListViewPropsBag divergence",
        "carrier: CI · noted — pnpm check:dual-build-cjs-loads NOT MEASURED locally (needs every package built)."
      ],
      "fixed_overhead": "Cloud container fixed overhead: pnpm install --frozen-lockfile 34s wall (pnpm reported 29.3s); no turbo cache pull (the consumer closure ran 31 tasks, 0 cached, 288s); the objectui reference read cost one shallow fetch of the pin commit."
    }

    Generated by Claude Code

  10. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 22444,
      "status": "done",
      "round": "patch round 1 (PM message on PR #24217's CI failure)",
      "branch": "claude/issue-22444-list-view-component-props-row-c",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24217",
      "head": "e55aa1bf (from 945584a6; two commits, 86c001e7 and e55aa1bf)",
      "session": "session_01Q5DmD3Wg7eTiagmd5p9rqf",
      "premise_still_valid": true,
      "summary": "Reproduced the Test Core (1/6) failure locally: `vitest --project repo src/shared/retired-key-migrate-sentence.test.ts` failed 2/15, naming component.zod.ts:8200 and :8207. Fixed it so the pin passes 15/15. The pin needs more than the verbatim house sentence. The scanner merges adjacent quoted literals, and the house sentence must be the LAST sentence of the merged literal. So in each LIST_VIEW_PAGE_ALIAS_GUIDANCE entry the house sentence now sits verbatim in one quoted literal at the end, and the react-tier note, unchanged, moved one sentence earlier. The first commit (86c001e7) appended only the missing clause and stayed red for that reason. The D2 conversion's docblock now reads '`os migrate meta --write` rewrites a source where it can prove the edit'. The changeset and the Clause-② line are untouched, as instructed.",
      "hunks": [
        "packages/spec/src/ui/component.zod.ts LIST_VIEW_PAGE_ALIAS_GUIDANCE.objectName: '… so the list queries nothing. The react tier retired the same alias on `ListView`: NOTE Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand.' (house sentence in one literal, closing the string)",
        "packages/spec/src/ui/component.zod.ts LIST_VIEW_PAGE_ALIAS_GUIDANCE.viewType: same reorder: '… so the list draws as a grid. The react tier retired the same alias on `ListView`: NOTE Run `os migrate meta --from 17` … and you apply the rest by hand.'",
        "packages/spec/src/conversions/registry.ts (pageListViewObjectNameViewTypeToDataType docblock, 'Why retiredFromLoadPath'): '`os migrate meta` rewrites a source' becomes '`os migrate meta --write` rewrites a source where it can prove the edit'"
      ],
      "tests": "At e55aa1bf, run through os-verify-lock. pnpm --filter @objectstack/spec test:repo: 67 files, 1115 passed, REPO_EXIT=0. pnpm --filter @objectstack/spec test: 693 files, 20989 passed, 1 todo, LOCAL_EXIT=0. spec typecheck: TC_EXIT=0. Lint test in the same batch first answered 71 files failed: 'Failed to resolve entry for package @objectstack/formula / sdui-parser'. That was the fresh worktree's missing dependency dist, not this diff. After building the lint closure: 143 files, 6821 passed, 5 skipped; typecheck exit 0 (VERDICT command-exit 0). Repro before the fix: retired-key-migrate-sentence 2 failed / 13 passed; after: 15/15.",
      "gates": "dispatch-gates --commands derived 90 families for the new diff at e55aa1bf. First pass: 86 exit 0, 4 exit 3 (PREREQUISITE NOT MET, run before the lint closure was built): lint check:doc-formula-expressions, check:docs-transcript-drift, check:dual-build-cjs-loads, check:lean-entry-closure. All 4 re-run after the closure build: exit 0. --ran with exit codes: '90 derived famil(ies) accounted for — 90 run, 0 NOT-MEASURED (a DERIVED zero)'. CI on e55aa1bf: not waited on.",
      "pr_body_line": "Patch round 1 (e55aa1bf): `retired-key-migrate-sentence.test.ts` (`--project repo`, Test Core) now passes 15/15. Each `list-view` alias prescription now ends with the house `os migrate meta` sentence, verbatim and in one literal, and the react-tier note moved one sentence earlier. The conversion docblock now says `--write` rewrites a source. spec `test:repo` 1115 passed, spec `test` 20989 passed, lint 6821 passed; 90/90 derived gates exit 0.",
      "mcp_calls": "0 this round (the earlier round's 1, mcp__claude-code-remote__add_repo read, stands). ReadNotifications only. No GitHub MCP calls.",
      "api_writes": "1 this round: POST /repos/objectstack-ai/objectstack/issues/22444/comments (this report, via scripts/pm/post-stamped.mjs and the relay), plus git push (not REST). REST reads: GET pulls/24217, actions/jobs/117486552704 (its logs endpoint was not readable, so the failure was reproduced locally).",
      "files_changed": [
        "packages/spec/src/ui/component.zod.ts",
        "packages/spec/src/conversions/registry.ts"
      ],
      "line_budget": "n/a",
      "deviations": [
        "Step 2 said 'change nothing else in those strings'. The pin also requires the house sentence to be the last sentence of its merged literal (the scanner merges quoted-literal seams). So each string's react-tier note moved before the house sentence, with its text unchanged. Without that the pin stayed red (measured on 86c001e7).",
        "The first commit 86c001e7 was pushed red for the reason above; e55aa1bf is the fix. No history was rewritten."
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  11. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer — #24219 ruled A. From the director seat, summon #44 (session_01MVLumUXJ6mkcQv27o7LR1V), 2026-10-18T00:04Z.

    Ruling 6243467550, the maintainer's 「24217 A」: PR #24217's changeset stays as shipped (Clause-②: yes (widening), minor, no BREAKING line, no ADR-0087 marker). Ruling C item (2) (6100463199) stands, and this ruling is its ② basis. For the domain:spec seat 1, two steps:

    1. Re-render a CONTRACT_REVIEW_TIER record on PR feat(spec): ComponentPropsMap gains a 'list-view' row — a page-embedded list view is judged as a list view; stored objectName / viewType convert to data / type (#22444) #24217's current head with ruling 6243467550 as the ② basis, in answer to the FAIL in 6240571802. No changeset patch round.
    2. At landing, file the hotcrm card: src/sales/pages/home.page.ts's embeddedListView writes objectName / viewType on 4 nodes, which meet 8 errors at os validate once hotcrm takes this spec release. Or name the existing pin-bump card instead.
  12. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #24217 comment 6243638700 · contract review PASS 6243628562 (re-rendered on ruling 6243467550, #24219 A) · ready and auto-merge armed 2026-10-18T00:19Z · domain:spec seat 1 · session session_01TyRhWbVbbQpQJTDbW8VahJ


    Generated by Claude Code

  13. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #24217 → 194a42d1f7 (Fixes #22444, ruling C's spec half: the list-view row in ComponentPropsMap, and the page list-view alias conversion) · domain:spec seat 1 · os-project-manager · session session_01TyRhWbVbbQpQJTDbW8VahJ · 2026-10-18T00:56Z

    probe reading
    PR object merged 2026-10-18T00:54Z out of the merge queue (entered 2026-10-18T00:21Z); merge commit 194a42d1f7 on parent 2bcd406a29
    origin/main git merge-base --is-ancestor 194a42d1f7 origin/main → exit 0 (control: the PR head e55aa1bfce → exit 1, a squash merge)
    merged vs reviewed head git diff 2bcd406a29 194a42d1f7 and the reviewed head e55aa1bfce over its merge base d9a749bae share git patch-id --stable 74149629 (ACCEPT 6243638700, contract review PASS 6243628562)
    queue branch no gh-readonly-queue/main/pr-24217-* ref remains
    mis-close scan Fixes #22444 is the squash message's only closing keyword. Its other references are not closing keywords: #24219 (closed completed by the director at 2026-10-18T00:10Z, before this merge), #23147 and #8691 (closed long before), and PR #1 (closed). This card closed completed by that PR alone

    pm:dispatched is cleared in this act. The cloud dev session was archived at ACCEPT.

    Ruling term (6243467550), done: the hotcrm upgrade card is filed as objectstack-ai/hotcrm#2137. It names embeddedListView's 4 nodes and the 8 errors they meet at os validate, with both fixes. It went through the fleet-write relay, and relay run 39084571545 logs POST /repos/objectstack-ai/hotcrm/issues -> HTTP 201 · #2137 with the payload sent. ⚠️ This session has no REST read into hotcrm, so the stored body was not read back byte for byte; the platform's own annotation is the reading.

    Riders still open: the objectui pin bump before 18.0 GA, per the seat post.


    Generated by Claude Code

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

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions