Repository navigation
finding(types): objectui#7759 group F (STRUCTURAL) plus ChatbotSchema.body — the remaining CONCRETE mirror-wider-than-declaration rows, settled per ruling F1 and rules 1/2 #10296
Description
Activity
- addeddomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
on Sep 24, 2026 objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsClaim: PM loop round 7 — objectui#10296 (#7759 group F STRUCTURAL, plus
ChatbotSchema.body)
Session:session_01877XiBYSaRCk2CU7cMSg3S
Branch:claude/issue-10296-7759-group-f
Worktree:objectui-issue-10296
Domain:domain:spec
Seat:domain:spec#1
File surface:- the
packages/typespairs that group F re-derives to (each is named in the dev report before it is edited), plusChatbotSchemaincomplex.ts/zod/complex.zod.ts; - the matching rows in the parity ledger, pins, and one
.changeset/10296-…md.
⛔ Excluded regions:
DashboardComponentSchema/AppComponentSchema/PageNodeSchema(PR objectui#10273);FilterField/FilterBuilder/FormSchema/HeaderBar/Container(objectui#10286);CalendarSchema(objectui#10293);Slider/Tooltip(PR objectui#10292);- the group E keys (PR objectui#10294).
A pair inside an excluded region STOPS and is reported.
Container & model:S,mode:subagent,model: opus(TIER_DEFAULT)
Clause-②: yes
Thread-read: none
Serial constraints cleared: re-measured at 2026-09-24T16:20Z. Every sibling region is excluded by name, above. The parity ledger is shared with all of them, and whichever lands later mergesmain.Dispatch authority: objectstack-ai/objectstack#19980, and 「任务很多,并发保持3」 (the maintainer). This fills the slot freed by the #7759 group E dev (PR objectui#10294).
- the
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 10296, "status": "done", "branch": "claude/issue-10296-7759-group-f", "pr": "https://github.com/objectstack-ai/objectui/pull/10307", "session": "session_01877XiBYSaRCk2CU7cMSg3S — the parent PM seat's id (mode:subagent)", "premise_still_valid": true, "summary": "STEP 1 TABLE (re-derived on origin/main 8b1f06619 from WIDER_ARMS, CONCRETE rows only; each sibling branch was fetched into a private ref and checked for whether the row disappears there): DashboardComponentSchema::header/globalFilters -> excluded (#2231 / PR #10273). DashboardComponentSchema::dateRange (F) -> STOP: it is inside PR #10273's excluded DashboardComponentSchema region, and it is still present on that branch. FilterBuilderSchema::fields, FilterFieldSchema::operators, ContainerSchema::maxWidth, HeaderBarSchema::variant -> #10286 (all gone on its branch). FormSchema::mode -> #10286 region (still present on its branch). FormSchema::layout -> excluded (renderer feature). CalendarSchema::defaultValue/value -> #10293 (gone). SliderSchema::defaultValue/value, TooltipSchema::content -> PR #10292 (gone). DataTableSchema::columns/renderCellEditor, TableColumnSchema::cell, FieldConditionSchema::custom, FieldConstraintsSchema::validate, FormFieldSchema::condition/validation, FormSchema::fields -> PR #10294 (all gone). HeaderBarSchema::logo (F) -> STOP: it is inside #10286's HeaderBar region and still present on that branch. DetailViewFieldSchema::options (F) -> MY SCOPE, settled. ChatbotSchema.body -> ALREADY SETTLED on main: objectui#8572 / PR #9639 retired it on both faces as a never tombstone, and its row left the ledger. There is no work for it here, and that part of the card's premise is stale (the rest of the card holds). CHANGE: the mirror of DetailViewFieldSchema.options now reads the spec's authoring SelectOptionSchema by reference, through stripImportedDefaults, per F1. It no longer uses the inline shape that admitted a number/boolean value and stripped other keys, and it does not use the read model SelectOptionMetadata. The spec declares no per-field options on record:details, so the pair is objectui-own, but the element is the spec's select-option concept, and F1 names SelectOptionSchema explicitly. On objectstack origin/main, SelectOptionSchema has the same key set as the installed 17.4.0. The tsc measurement shows one remaining incompatibility: visibleWhen. The spec's input envelope requires dialect, while the read model's objectui wire (#2212) has an optional dialect and a required source. That is recorded as an EXPECTED DIVERGENCE, read model, not repaired: the WiderThanDeclared/WIDER_ARMS row stays but is re-annotated, KnownDrift gains DetailViewFieldSchema:options, and the same cause propagates one level up to DetailViewSectionSchema:fields (a new entry) and DetailViewSchema fields/sections. The header was re-derived to 48 entries / 89 keys, with the restated figure updated, and SPEC_DERIVED_PAIRS gained the pair because the census test derived it. Assignee os-bill and the labels were left untouched.", "tests": "HEAD a8446a2ae (the final commit; main had not moved, so the merge was a no-op). (1) Under the verify lock: pnpm --filter @object-ui/types type-check (tsc, examples, test configs) exited 0, then pnpm exec vitest run packages/types/ gave 'Test Files 215 passed (215)' and 'Tests 4929 passed (4929)'; VERDICT command-exit 0. These ran on bytes identical to a8446a2ae. (2) New pin packages/types/src/__tests__/detail-view-field-options-10296.test.ts, 6 tests: invalid_type at options.0.value for a number and for a boolean; unrecognized_keys at options.0 with keys [icon] or [disabled]; an accepting control with every spec key; and verdict parity with the spec schema over 6 samples. (3) Reverse verification, done once for the single remedy class, with the fix committed first and trap-guarded with absolute paths: I wrote the base-commit views.zod.ts into place. The on-disk markers read inline value union 1, SpecSelectOptionSchema 0. The pin then gave 'Tests 5 failed | 1 passed (6)' (the accepting control stays green, as expected), and tsc -p tsconfig.test.json exited 2 with 'LedgerMismatch ... views.zod.ts#DetailViewFieldSchema'. The restore used git checkout HEAD -- FILE; afterwards git diff HEAD was 0 bytes and the blob hash was 5caaadb6 for both HEAD and disk. (4) Downstream: turbo build of the @object-ui/plugin-detail^... closure (11 tasks, exit 0); pnpm --filter @object-ui/plugin-detail type-check exited 0; the two plugin-detail tests that import the zod DetailViewSchema/DetailViewSectionSchema gave '2 passed', '21 passed'. No other package imports the changed zod exports; I checked by git grep, and all other hits were comments. The TS declaration is unchanged. (5) eslint --no-inline-config on the 3 changed source files, --format json: 3 files, 0 errors, and 2 no-explicit-any warnings on lines 1250/1349, which are untouched pre-existing lines. The population is exactly those 3 files. Type-aware linting is not configured in eslint.config.js (no parserOptions.project), so the diff cannot move any untouched file's verdict. (6) Gates at exit 0: check-changeset-presence, check:spec-symbols, check:new-line-citations ('0 new citation(s)'), check:control-bytes, check-changeset-no-major, check:changeset-claims, check:pending-changeset-literals, check:installed-pin-claims. NOT MEASURED: check:spec-floors, reason: PREREQUISITE (no-artifact, it needs a whole-workspace build), left to CI. dispatch-gates.mjs is objectstack-only; I derived objectui's list by hand from the dispatch and package.json.", "mcp_calls": "0", "api_writes": "2 — both through the fleet-write relay (repository_dispatch to objectstack-ai/objectstack, executed as objectstack-fleet[bot]): pr_create POST /repos/objectstack-ai/objectui/pulls (draft, PR #10307, run 36030396492, body read back byte-identical at 6592 bytes with 0 angle brackets); comment POST /repos/objectstack-ai/objectui/issues/10296/comments (this report). Plus git push of the branch (not a REST write). Zero label writes, because the PM told me not to touch labels.", "open_questions": [ { "question": "DetailViewFieldSchema.options: which is right for visibleWhen, recording it as an expected divergence (what this PR does, with 4 KnownDrift keys, 1 of them the leaf and 3 propagated) or overriding it on the mirror with objectui's ExpressionWireSchema, as form.zod's SelectOptionSchema already does (zero-row ledger)?", "options": [ "A: keep the spec's authoring envelope and record the divergence (this PR)", "B: override visibleWhen with objectui's wire, so the rows clear" ], "recommendation": "A. B reshapes a spec-declared key locally, which ordering note 5617614225 forbids. If objectui's wire and the spec envelope should converge, that is a spec-or-wire decision for its own card, not one to settle through this row." } ], "out_of_scope_findings": [ "STOP (not a finding, re-routed): DashboardComponentSchema::dateRange is F, in PR #10273's excluded region. Measured in passing: @objectstack/spec 17.4.0 exports DATE_RANGE_DEFAULT_RANGES / DateRangeDefaultRange from @objectstack/spec/ui, so rule 1 likely governs (the mirror takes the spec's vocabulary). Not measured to a verdict. carrier: PM, after #10273 lands · noted, not filed · dedupe words: dateRange defaultRange DATE_RANGE_DEFAULT_RANGES mirror", "STOP (not a finding, re-routed): HeaderBarSchema::logo is F, in #10286's HeaderBar region, and still in WIDER_ARMS on that branch. Proposal F routed it to ADR-0049 enforce-or-remove with variant. carrier: #10286 / PM · noted, not filed · dedupe words: HeaderBarSchema logo enforce-or-remove", "premise note: ChatbotSchema.body was already retired on main by objectui#8572 (PR #9639), so the card's second key needs no work. carrier: none needed · noted, not filed" ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsACCEPT: objectui#10296 (#7759 group F plus
ChatbotSchema.body), delivered by PR objectui#10307 at head3925bdd. Sessionsession_01877XiBYSaRCk2CU7cMSg3S,domain:spec@ objectui seat.Scope, re-derived:
DetailViewFieldSchema.optionswas the only in-scope row left after subtracting the siblings.ChatbotSchema.bodywas already retired onmain(objectui#8572 / PR feat(types)!: retire ChatbotSchema.body on both published faces (objectui#8572) #9639). That part of the premise was stale.DashboardComponentSchema::dateRange(in PR feat(types): App/Dashboard/Page twins take the spec by reference, like their zod mirrors #10273's region) andHeaderBarSchema::logo(in PR fix(types): settle FilterField.operators, Container.maxWidth and HeaderBar.variant between mirror and declaration (objectui#10286) #10300's region) are STOPPED, not dropped. Each follows its region's PR.- For
dateRange, spec 17.4.0 exportsDATE_RANGE_DEFAULT_RANGES, so rule 1 likely governs. logogoes to ADR-0049 enforce-or-remove, withvariant.
- For
Change: the mirror of
optionsnow reads the spec's authoringSelectOptionSchemaby reference, per F1, and not the read model.visibleWhenis recorded as an expected divergence (option A), which is propagated in KnownDrift.Review: Clause-② yes. The isolated contract review at
a8446a2was PASS. Its delta review at this head, recorded on the PR, is PASS. That delta:- adds output-shape pins (a string
visibleWhenbecomes acelenvelope; a dialect-less envelope and an empty string are refused); - states the
SystemIdentifierSchemavalue rule exactly; - adds a whitespace-only tripwire for the next spec bump.
Tests: 4941 in types, and the plugin-detail closure type-check passes. The remedy was reverse-verified at
a8446a2.Landing: flip ready and enqueue once every check on this head is green or an expected skip.
⚠️ The Spec Main Shape Gate is red on every objectui head until objectui#10287 lands.
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsACCEPT refreshed for PR objectui#10307 at head
da3afd5, from thedomain:spec@ objectui seat, sessionsession_01877XiBYSaRCk2CU7cMSg3S.Change since the last ACCEPT. The head moved to
da3afd5after the Spec Main Shape Gate flagged two diagnostics of this PR's own, atzod-mirror-parity.test.ts:3477/3496. On objectstackmain,SelectOptionSchema.visibleWhenrequires a non-blanksource, so the fourDetailView*WIDER rows no longer measure WIDER there.The fix is test-only.
- A shape predicate is read off the mirror's own input face.
- The four rows are withheld only when that predicate is false, which means only on
main. - On 17.4.0 nothing is waived, and an ablation proves the rows still redden if the gate is forced.
- A runtime tripwire forces the rows, their
WIDER_ARMSentries and the gate to be deleted together at the next spec bump. - The dev reproduced the gate locally against
main: red before the fix, green after.
Review. The isolated delta review at this head, recorded on the PR, is PASS. It confirmed three things:
- the gate cannot mask an unrelated widening, because withholding is by key and the recorded set only shrinks;
- the container rows' only wider member was
options; - the tripwire matches both spec versions.
Landing. Flip ready and enqueue once every check on this head is green or an expected skip. The remaining red is the Spec Main Shape Gate on objectui#10287, and its fix, PR objectui#10315, has been accepted and is landing.
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026
Execution split of #7759, covering the last CONCRETE rows: group F (STRUCTURAL) and the group-D key
ChatbotSchema.body. Governing text: ruling 5617221514, as adopted by the director in 5617465269, plus the ordering note 5617614225. Priority and domain are inherited from the parent (priority:p2,domain:spec). Filed by thedomain:spec@ objectui execution seat, sessionsession_01877XiBYSaRCk2CU7cMSg3S.Siblings (this card's exclusions)
DataTableSchema::columns(F) andFormSchema::fields(D) through their nested function armDashboardComponentSchema.header/.globalFiltersFormSchema.layoutRules
SelectOptionSchema), ⛔ never at a runtime read model. Where the declaration is a read model, the difference is recorded as an expected divergence. The comment at 5596511491 warns thatDetailViewFieldSchema.optionsmust NOT be "fixed" by mirroringSelectOptionMetadata.ChatbotSchema.body: it has a live read site. Settle it by rule 1 if the spec declares it, or rule 2 if not, after a two-face element-shape comparison.Done when
The dev re-derives the remaining CONCRETE
WiderThanDeclaredrows onmainafter the sibling PRs land, or against their branches. Each in-scope row is either settled, with a pin that reddens on revert, or explicitly recorded as an expected divergence. There is oneminorchangeset. Clause-② yes.