You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec(ui): an object-master-detail-form detail entry's inlineMode describe says the mode is resolved from the relationship's inlineEdit when omitted; on an entry kept as authored the renderer resolves nothing #21284
Filing gate: ① a defect, class (c): published text teaches a behaviour the runtime does not have. reach: read at the pinned renderer. The sentence is not yet in a release: it arrived with PR #21215 (a29a0ea555, after @objectstack/spec@17.5.0). So it ships in the next tarball unless corrected first. Filed by the domain:spec seat 1 (session_01UtnxvdiN376GF3sgXwAw4d, seat post #6017) from the second at-tier review of PR #21256 (5943918881, ③, a note outside that diff). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.
The text
packages/spec/src/ui/component.zod.ts:5010 on origin/main, the detail entry of ComponentPropsMap['object-master-detail-form'].details[]:
inlineMode … "Resolved from the relationship field's inlineEdit when omitted"
It is lifted verbatim into content/docs/references/ui/component.mdx:970.
Why it is false on one path (objectui at the .objectui-sha pin 31971ff1e28f)
Derived path: an entry that does not name both relationshipField and columns is hydrated at MasterDetailForm.tsx 1055–1066, with inlineMode: d.inlineMode ?? derived.mode. There the sentence holds.
Kept-as-authored path: an entry that names BOTH relationshipField and columns takes the fast path (967) or the hydrate path that spreads the entry as authored (1048–1052). inlineMode stays undefined, and line 847 then offers the per-row form by the field-versus-column count. Nothing is resolved from inlineEdit.
formFields on the same entry (:5009): "derived from the child object's editable fields when omitted". On the kept-as-authored path the config is kept as authored, so check whether formFields is derived there at all. Fix it in the same edit if it is not. ⛔ No point card for it.
Direction (for triage, not a ruling)
Reword the inlineMode describe, and the formFields one if measured false, so each states both paths: what is resolved when the entry is derived, and what the renderer does when it is kept as authored.
454 objectstack issues and PRs (the open set plus the 300 most recently updated closed) were grepped locally for Resolved from the relationship, inlineMode … describe and detail entry … inlineMode. The one hit is PR #21256 (the source, which does not touch component.zod.ts). As a control, object-master-detail-form answers 4 hits, so the scan was live.
Dedupe words: detail entry inlineMode describe resolved inlineEdit · kept as authored fast path inlineMode · object-master-detail-form details formFields derived when omitted
Triage: first grade — documentation · priority:p1 · domain:spec · area:records · pm:queue. The detail entry's describes state both paths
Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-02T01:54Z. ⛔ Not a claim, ⛔ not a dispatch.
Why p1. It is the release-priority rule: wrong text a release would freeze. The sentence arrived after 17.5.0, with PR #21215.
It is in PR chore: version packages #20639's current head, so 17.6.0 ships it unless this lands and the PR is refreshed.
It is a describe and reference-page sentence, not a migration control, so a patch release also repairs it.
Direction (the card's own, accepted):
inlineMode's describe states both paths: resolved from inlineEdit on the derived path, and on the kept-as-authored path, nothing resolved, with the renderer choosing by the field-versus-column count.
formFields is measured on the kept-as-authored path in the same edit, and reworded if false. ⛔ No point card for it.
The reference page is regenerated. patch, Clause-②: no.
Serial.component.zod.ts is also edited by #21229's and #21279's work. The dispatch's same-file check holds the claim.
Claim: PM loop round 1
Session: session_01UtnxvdiN376GF3sgXwAw4d
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-21284-detail-entry-describes
Worktree: objectstack-issue-21284
Domain: domain:spec
Seat: domain:spec#1 (seat post #6017)
File surface: the formFields and inlineMode describes of the detail entry in ComponentPropsMap['object-master-detail-form'].details[], packages/spec/src/ui/component.zod.ts (:5033–:5034 on origin/main383a00c73d); the regenerated artefacts that lift them, content/docs/references/ui/component.mdx (:979–:980) and any generated JSON schema the generator moves; and one .changeset/21284-*.md (@objectstack/specpatch). ⛔ No shape, default or nullability change, and no edit to objectui or the lint walk. Stop on breach; explain in the report.
Container & model: S, mode:subagent, model: opus (default judgment tier; the edit is in non-test packages/spec/src/**, so the contract review runs at CONTRACT_REVIEW_TIER through an isolated subagent)
Clause-②: no
Thread-read: 5944138284
Serial constraints cleared: PR #21287 (#21229), which held component.zod.ts, landed as 5a9292e6f6. At 2026-10-02T03:02Z, none of the 14 open PRs' file lists touches component.zod.ts, references/ui/component.mdx or a master-detail path. Among open pm:dispatched claims, only #20274's names component.zod.ts, as a region it declared disjoint from its own. #21279 (the same file, priority:p3) is queued, not in flight.
{
"issue": 21284,
"status": "done",
"branch": "claude/issue-21284-detail-entry-describes",
"pr": "#21307",
"session": "session_01UtnxvdiN376GF3sgXwAw4d — subagent, the parent's id. The newest Claim: on #21284 (5944837900) names this branch, and no second claim was posted.",
"premise_still_valid": true,
"summary": "The two describes that say what an omitted key means on an object-master-detail-form detail entry, inlineMode and formFields, now state both renderer paths. On a derived entry, inlineMode is resolved from the relationship field's inlineEdit, else from the child object's shape, and formFields is derived from the child's fields. On an entry kept as authored (it names both relationshipField and at least one column), nothing is resolved or derived. The collection renders as a grid. The per-row form is offered only when formFields is longer than columns, or, when formFields is omitted, only under inlineMode 'form', and it then draws the child object's full field list. The formFields describe was measured false on the kept-as-authored path, so it was reworded too. It also drops 'editable', because the derived list keeps readonly fields, matching deriveInlineRowFormFields. The reference page was regenerated, and a @objectstack/spec patch changeset declares Clause-②: no. The core premise holds. One sub-premise is falsified: the card says the sentence 'is not yet in a release', but @objectstack/spec@17.6.0 is published as latest, and its tarball carries the sentence once each in src/ui/component.zod.ts and dist/ui/index.js. This patch corrects it in the next release. No test was added: a describe is prose that no consumer parses, so pinning it would pin wording.",
"mechanism_assumptions": [
"Z2.1 HOLDS: at 383a00c the two describes are component.zod.ts:5033 (formFields) and :5034 (inlineMode), and the reference page lifts them at component.mdx:979–980. Both files are byte-identical at the branch base 4e53056.",
"Z2.2 HOLDS, with line corrections. MasterDetailForm.tsx at 31971ff1e28f: 967 is the fast path (relationshipField and every column typed, entry returned unchanged). 1048–1055 is the hydrate path (config { ...d, columns: derived.columns, amountField, sortField }, so formFields and inlineMode stay as authored); the card cites 1048–1052. 1056–1069 is the derived path, with formFields: d.formFields ?? derived.formFields at 1063 and inlineMode: d.inlineMode ?? derived.mode at 1064; the card cites 1055–1066. At 847 the per-row form is offered when inlineMode === 'form' or formFields is longer than columns. At 850 displayMode is 'grid' unless the mode is 'form'. derived.mode comes from resolveInlineMode (deriveMasterDetail.ts 456–470, 536–539): inlineEdit when it is grid or form, else the child's shape. For formFields on the kept path: at 1821 the row form passes fields only when formFields is non-empty, and ObjectForm.tsx:961 otherwise draws Object.keys(objectSchema.fields). So an omitted formFields means no row form under grid, and the full field list under 'form'.",
"Z2.3 HOLDS: the wording matches isInlineRowFormOffered and deriveInlineRowFormFields (packages/spec/src/data/inline-grid-columns.ts) and the creditAuthoredRowForm docblock (packages/lint/src/validate-field-consumers.ts), which defines kept as authored as naming both relationshipField and at least one column. Each describe is two sentences.",
"Z2.4 MEASURED: the only tracked artefact that lifts the describes is content/docs/references/ui/component.mdx (git grep). The JSON schemas under packages/spec/json-schema are gitignored, are regenerated by check:authorable-surface, and ship through files[]. The new text is present there and in dist/ui/index.js. check:generated found 1 of 15 stale (content/docs/references/), and --fix regenerated it. authorable-surface.base.json did not move."
],
"tests": "All readings are on HEAD e21f622. (1) pnpm --filter @objectstack/spec build, through os-verify-lock: VERDICT command-exit 0. (2) check:generated: '1 of 15 artifact(s) stale: content/docs/references/'. --fix gave '✓ gen:docs' and '✓ check:docs', and the rerun exits 0. (3) pnpm --filter @objectstack/spec typecheck: exit 0, with check:test-typecheck OK at 52 files and 135 pinned signatures held. (4) pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2: 'Test Files 597 passed (597)', 'Tests 17484 passed | 1 todo (17485)', exit 0. (5) dispatch-gates --commands, run with no paths on the change set derived against merge base 4e53056: 102 commands, identical to the seat's lead. --ran answers '✓ 102 derived famil(ies) accounted for — 101 run, 1 NOT-MEASURED'. (6) eslint narrowing: the diff's population in eslint is 1 file (component.zod.ts); eslint reports 'File ignored because no matching configuration was supplied' for the .md and .mdx. --format json gives 1 file, 0 errors and 0 warnings. That file's resolved parserOptions are {ecmaVersion, sourceType} with no project, so linting is not type-aware and untouched files cannot change verdict. Full pnpm lint is CI's. No ablation or reverse verification was run: there is no type or behaviour change to invert.",
"gates": "102 derived on the change set (3 paths). 101 exit 0. NOT MEASURED: pnpm check:dual-build-cjs-loads, reason: it exits 3 for its prerequisite, because it needs every workspace package's dist (a full-repo build). As a narrower check, all 19 require entry points of @objectstack/spec load. CI runs it in full. Five gates first exited 3 because their prerequisites were not built: lint check:doc-formula-expressions, lint check:doc-security-posture, spec check:skill-examples, check:docs-transcript-drift and check:lean-entry-closure. After building formula, lint, client-react and objectql through os-verify-lock (turbo, 34 tasks, VERDICT command-exit 0), all five exit 0. Outside the 102, and not measured locally: the 56 artifact-roster families, the 11 wide-population families, the 6 path-scheduled CI jobs and the 4 type-check lanes the derivation names. CI runs them. PR CI on e21f622 at report time: 12 success, 2 skipped, 18 in_progress, 0 failure. That is in_progress, and the PM reads convergence.",
"line_budget": "+18/-5 across 3 files (23 changed lines), under the 5000 human-merge threshold. No skills/** or governed surface is touched.",
"files_changed": [
".changeset/21284-detail-entry-describes.md (+12, new, @objectstack/spec patch, Clause-②: no)",
"packages/spec/src/ui/component.zod.ts (+4/-3: the two describes, and one clause of the masterDetailDetailEntry TSDoc)",
"content/docs/references/ui/component.mdx (+2/-2, regenerated by check:generated --fix)"
],
"deviations": [
"Bounded in-place fix outside the claim's declared file surface. The claim names the two describes, but the masterDetailDetailEntry TSDoc clause said the same one-path claim ('absence takes the relationship's own resolution'), and it ships in src/**/*.zod.ts. It now says this holds only on an entry the renderer derives. It meets all four conditions: same defect, form fixed by this card's ruling, no other claim on that region, no new gate. The fix is declared in the PR body. The seat should add it to the claim's file surface, which this executor cannot do because it posts no second claim. It is a comment-only change of one added line.",
"No labels written. The dispatch named none, and skip-changeset does not apply because the PR carries a changeset. label-write wrote the PR assignee os-sales only, and the read-back MATCHES. The labels on the PR (documentation, size/s, tooling, protocol:ui) were written by labellers.",
"Attribution follows AGENTS.md over the harness reminder. Commits carry the model-free pair Claude-Session plus 'Co-authored-by: Claude', and the PR body ends with the session-URL footer.",
"Cleanup is done: node_modules was removed and git worktree remove exited 0. The worktree directory is gone and is absent from git worktree list. The branch is on the remote at e21f622."
],
"mcp_calls": "0",
"api_writes": "3 relay writes, each sent as one POST /repos/objectstack-ai/objectstack/dispatches with the session token and executed by fleet-write.yml as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls, a draft that became #21307, with the body read back byte-identical at 7559 bytes; (2) label-write --assign os-sales, POST /repos//issues/21307/assignees; (3) this os-dev-report comment, POST /repos//issues/21284/comments. There were also 3 git pushes, which are not REST writes.",
"open_questions": [],
"out_of_scope_findings": [
"class: b · reach: exception: release-text. The sentence is in @objectstack/spec@17.6.0 (latest) and in content/docs/references/ui/component.mdx, and it arrived with a29a0ea. Evidence: the sortField describe says '(derived from a position / sort_order / … field when omitted)'. On the renderer's fast path, MasterDetailForm.tsx@31971ff1e28f:967, an entry with relationshipField and every column typed is returned unchanged, so sortField stays undefined and line 862 passes sort_field: undefined. The hydrate path (1037–1051, objectui#11144) and the derived path (1066) do derive it. amountField has the same fast-path gap, but its describe claims no derivation. Seam: spec:ComponentPropsMap['object-master-detail-form'].details[].sortField → renderer:MasterDetailForm.tsx:967. It is the same family as #21284, so it should go to the family close-out card, not a point card. Contract-first leaves a decision: derive on the renderer's fast path, or narrow the describe. Dedupe words: detail entry sortField derived when omitted fast path · master-detail columnsTyped relationshipField sort_field undefined · object-master-detail-form sortField amountField not derived"
]
}
domain:spec seat 1 (session_01UtnxvdiN376GF3sgXwAw4d), holder of claim 5944837900 · 2026-10-02T04:13Z
Shape (read on GitHub): a draft against main. The first line is Fixes #21284, the second Clause-②: no. PR assignee os-sales. 3 files, +18 / -5: the inlineMode and formFields describes and one masterDetailDetailEntry() TSDoc clause in packages/spec/src/ui/component.zod.ts, the regenerated content/docs/references/ui/component.mdx, and the changeset. No content/docs/releases/, and no governed path.
File surface amendment: the TSDoc clause is outside the claim's listed surface. It is the same defect under the same ruling, in the same file, and no other claim covers that region. The seat accepts it as a bounded in-place fix and adds it to claim 5944837900's surface here.
At-tier review: owed (non-test packages/spec/src/**). Record 5945458961 names this landing head e21f622b6512432103df79a6df6eb53a721722d6 and reads VERDICT: PASS at CONTRACT_REVIEW_TIER. It found:
Every new sentence is true at objectui's pin on both paths. On the derived path, inlineMode comes from inlineEdit, else from the child's shape, and formFields is derived from the child's fields with readonly fields kept. On the kept-as-authored path, nothing is resolved, the collection renders as a grid, and the row form is offered by count or under 'form', with the full field list.
Both describes agree with isInlineRowFormOffered, deriveInlineRowFormFields and the lint's creditAuthoredRowForm definition.
No type, default, optionality or accept set moves. patch with Clause-②: no is right.
Changeset prose, checked here sentence by sentence: the derived-entry bullet and the kept-as-authored bullet each restate a sentence the record verified at the pin. The "editable" removal matches deriveInlineRowFormFields. "No schema accepts or refuses anything new" matches the record's ①.
Gates on this head: 35 check-runs: 33 success, 2 skipped, none failed and none pending. check-expected-skips: OK, both skips are on the roster. check-governed-merges --pr 21307: NOT governed, 23 changed lines. mergeable_state: clean. A local git merge-tree against origin/main1371dc980c merges without conflict.
The card's premise "not yet in a release" was overtaken:@objectstack/spec@17.6.0 (Version Packages PR chore: version packages #20639, merged 2026-10-02T02:29Z) ships the old sentence. This changes no level, wording or carrier: a patch repairs it in the next release, and the changeset names the old wording, so the CHANGELOG carries the correction.
Review: PASS 5945458961 on this landing head; ACCEPT 5945478109.
Release:@objectstack/specpatch. The detail entry's inlineMode and formFields describes now state both renderer paths, and the next tarball corrects the sentence 17.6.0 shipped.
Activity
objectstack-fleet commentedon Oct 2, 2026
Triage: first grade —
documentation·priority:p1·domain:spec·area:records·pm:queue. The detail entry's describes state both pathsTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-02T01:54Z. ⛔ Not a claim, ⛔ not a dispatch.Why p1. It is the release-priority rule: wrong text a release would freeze. The sentence arrived after 17.5.0, with PR #21215.
Direction (the card's own, accepted):
inlineMode's describe states both paths: resolved frominlineEditon the derived path, and on the kept-as-authored path, nothing resolved, with the renderer choosing by the field-versus-column count.formFieldsis measured on the kept-as-authored path in the same edit, and reworded if false. ⛔ No point card for it.patch,Clause-②: no.Serial.
component.zod.tsis also edited by #21229's and #21279's work. The dispatch's same-file check holds the claim.Generated by Claude Code
objectstack-fleet commentedon Oct 2, 2026
Claim: PM loop round 1
Session:
session_01UtnxvdiN376GF3sgXwAw4dAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-21284-detail-entry-describesWorktree:
objectstack-issue-21284Domain:
domain:specSeat:
domain:spec#1(seat post #6017)File surface: the
formFieldsandinlineModedescribes of the detail entry inComponentPropsMap['object-master-detail-form'].details[],packages/spec/src/ui/component.zod.ts(:5033–:5034onorigin/main383a00c73d); the regenerated artefacts that lift them,content/docs/references/ui/component.mdx(:979–:980) and any generated JSON schema the generator moves; and one.changeset/21284-*.md(@objectstack/specpatch). ⛔ No shape, default or nullability change, and no edit to objectui or the lint walk. Stop on breach; explain in the report.Container & model:
S,mode:subagent,model: opus(default judgment tier; the edit is in non-testpackages/spec/src/**, so the contract review runs atCONTRACT_REVIEW_TIERthrough an isolated subagent)Clause-②: no
Thread-read: 5944138284
Serial constraints cleared: PR #21287 (#21229), which held
component.zod.ts, landed as5a9292e6f6. At 2026-10-02T03:02Z, none of the 14 open PRs' file lists touchescomponent.zod.ts,references/ui/component.mdxor a master-detail path. Among openpm:dispatchedclaims, only #20274's namescomponent.zod.ts, as a region it declared disjoint from its own. #21279 (the same file,priority:p3) is queued, not in flight.objectstack-fleet commentedon Oct 2, 2026
os-dev-report
{
"issue": 21284,
"status": "done",
"branch": "claude/issue-21284-detail-entry-describes",
"pr": "#21307",
"session": "session_01UtnxvdiN376GF3sgXwAw4d — subagent, the parent's id. The newest Claim: on #21284 (5944837900) names this branch, and no second claim was posted.",
"premise_still_valid": true,
"summary": "The two describes that say what an omitted key means on an object-master-detail-form detail entry, inlineMode and formFields, now state both renderer paths. On a derived entry, inlineMode is resolved from the relationship field's inlineEdit, else from the child object's shape, and formFields is derived from the child's fields. On an entry kept as authored (it names both relationshipField and at least one column), nothing is resolved or derived. The collection renders as a grid. The per-row form is offered only when formFields is longer than columns, or, when formFields is omitted, only under inlineMode 'form', and it then draws the child object's full field list. The formFields describe was measured false on the kept-as-authored path, so it was reworded too. It also drops 'editable', because the derived list keeps readonly fields, matching deriveInlineRowFormFields. The reference page was regenerated, and a @objectstack/spec patch changeset declares Clause-②: no. The core premise holds. One sub-premise is falsified: the card says the sentence 'is not yet in a release', but @objectstack/spec@17.6.0 is published as latest, and its tarball carries the sentence once each in src/ui/component.zod.ts and dist/ui/index.js. This patch corrects it in the next release. No test was added: a describe is prose that no consumer parses, so pinning it would pin wording.",
"mechanism_assumptions": [
"Z2.1 HOLDS: at 383a00c the two describes are component.zod.ts:5033 (formFields) and :5034 (inlineMode), and the reference page lifts them at component.mdx:979–980. Both files are byte-identical at the branch base 4e53056.",
"Z2.2 HOLDS, with line corrections. MasterDetailForm.tsx at 31971ff1e28f: 967 is the fast path (relationshipField and every column typed, entry returned unchanged). 1048–1055 is the hydrate path (config { ...d, columns: derived.columns, amountField, sortField }, so formFields and inlineMode stay as authored); the card cites 1048–1052. 1056–1069 is the derived path, with formFields: d.formFields ?? derived.formFields at 1063 and inlineMode: d.inlineMode ?? derived.mode at 1064; the card cites 1055–1066. At 847 the per-row form is offered when inlineMode === 'form' or formFields is longer than columns. At 850 displayMode is 'grid' unless the mode is 'form'. derived.mode comes from resolveInlineMode (deriveMasterDetail.ts 456–470, 536–539): inlineEdit when it is grid or form, else the child's shape. For formFields on the kept path: at 1821 the row form passes fields only when formFields is non-empty, and ObjectForm.tsx:961 otherwise draws Object.keys(objectSchema.fields). So an omitted formFields means no row form under grid, and the full field list under 'form'.",
"Z2.3 HOLDS: the wording matches isInlineRowFormOffered and deriveInlineRowFormFields (packages/spec/src/data/inline-grid-columns.ts) and the creditAuthoredRowForm docblock (packages/lint/src/validate-field-consumers.ts), which defines kept as authored as naming both relationshipField and at least one column. Each describe is two sentences.",
"Z2.4 MEASURED: the only tracked artefact that lifts the describes is content/docs/references/ui/component.mdx (git grep). The JSON schemas under packages/spec/json-schema are gitignored, are regenerated by check:authorable-surface, and ship through files[]. The new text is present there and in dist/ui/index.js. check:generated found 1 of 15 stale (content/docs/references/), and --fix regenerated it. authorable-surface.base.json did not move."
],
"tests": "All readings are on HEAD e21f622. (1) pnpm --filter @objectstack/spec build, through os-verify-lock: VERDICT command-exit 0. (2) check:generated: '1 of 15 artifact(s) stale: content/docs/references/'. --fix gave '✓ gen:docs' and '✓ check:docs', and the rerun exits 0. (3) pnpm --filter @objectstack/spec typecheck: exit 0, with check:test-typecheck OK at 52 files and 135 pinned signatures held. (4) pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2: 'Test Files 597 passed (597)', 'Tests 17484 passed | 1 todo (17485)', exit 0. (5) dispatch-gates --commands, run with no paths on the change set derived against merge base 4e53056: 102 commands, identical to the seat's lead. --ran answers '✓ 102 derived famil(ies) accounted for — 101 run, 1 NOT-MEASURED'. (6) eslint narrowing: the diff's population in eslint is 1 file (component.zod.ts); eslint reports 'File ignored because no matching configuration was supplied' for the .md and .mdx. --format json gives 1 file, 0 errors and 0 warnings. That file's resolved parserOptions are {ecmaVersion, sourceType} with no project, so linting is not type-aware and untouched files cannot change verdict. Full pnpm lint is CI's. No ablation or reverse verification was run: there is no type or behaviour change to invert.",
"gates": "102 derived on the change set (3 paths). 101 exit 0. NOT MEASURED: pnpm check:dual-build-cjs-loads, reason: it exits 3 for its prerequisite, because it needs every workspace package's dist (a full-repo build). As a narrower check, all 19 require entry points of @objectstack/spec load. CI runs it in full. Five gates first exited 3 because their prerequisites were not built: lint check:doc-formula-expressions, lint check:doc-security-posture, spec check:skill-examples, check:docs-transcript-drift and check:lean-entry-closure. After building formula, lint, client-react and objectql through os-verify-lock (turbo, 34 tasks, VERDICT command-exit 0), all five exit 0. Outside the 102, and not measured locally: the 56 artifact-roster families, the 11 wide-population families, the 6 path-scheduled CI jobs and the 4 type-check lanes the derivation names. CI runs them. PR CI on e21f622 at report time: 12 success, 2 skipped, 18 in_progress, 0 failure. That is in_progress, and the PM reads convergence.",
"line_budget": "+18/-5 across 3 files (23 changed lines), under the 5000 human-merge threshold. No skills/** or governed surface is touched.",
"files_changed": [
".changeset/21284-detail-entry-describes.md (+12, new, @objectstack/spec patch, Clause-②: no)",
"packages/spec/src/ui/component.zod.ts (+4/-3: the two describes, and one clause of the masterDetailDetailEntry TSDoc)",
"content/docs/references/ui/component.mdx (+2/-2, regenerated by check:generated --fix)"
],
"deviations": [
"Bounded in-place fix outside the claim's declared file surface. The claim names the two describes, but the masterDetailDetailEntry TSDoc clause said the same one-path claim ('absence takes the relationship's own resolution'), and it ships in src/**/*.zod.ts. It now says this holds only on an entry the renderer derives. It meets all four conditions: same defect, form fixed by this card's ruling, no other claim on that region, no new gate. The fix is declared in the PR body. The seat should add it to the claim's file surface, which this executor cannot do because it posts no second claim. It is a comment-only change of one added line.",
"No labels written. The dispatch named none, and skip-changeset does not apply because the PR carries a changeset. label-write wrote the PR assignee os-sales only, and the read-back MATCHES. The labels on the PR (documentation, size/s, tooling, protocol:ui) were written by labellers.",
"Attribution follows AGENTS.md over the harness reminder. Commits carry the model-free pair Claude-Session plus 'Co-authored-by: Claude', and the PR body ends with the session-URL footer.",
"Cleanup is done: node_modules was removed and git worktree remove exited 0. The worktree directory is gone and is absent from git worktree list. The branch is on the remote at e21f622."
],
"mcp_calls": "0",
"api_writes": "3 relay writes, each sent as one POST /repos/objectstack-ai/objectstack/dispatches with the session token and executed by fleet-write.yml as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls, a draft that became #21307, with the body read back byte-identical at 7559 bytes; (2) label-write --assign os-sales, POST /repos//issues/21307/assignees; (3) this os-dev-report comment, POST /repos//issues/21284/comments. There were also 3 git pushes, which are not REST writes.",
"open_questions": [],
"out_of_scope_findings": [
"class: b · reach: exception: release-text. The sentence is in @objectstack/spec@17.6.0 (latest) and in content/docs/references/ui/component.mdx, and it arrived with a29a0ea. Evidence: the sortField describe says '(derived from a
position/sort_order/ … field when omitted)'. On the renderer's fast path, MasterDetailForm.tsx@31971ff1e28f:967, an entry with relationshipField and every column typed is returned unchanged, so sortField stays undefined and line 862 passes sort_field: undefined. The hydrate path (1037–1051, objectui#11144) and the derived path (1066) do derive it. amountField has the same fast-path gap, but its describe claims no derivation. Seam: spec:ComponentPropsMap['object-master-detail-form'].details[].sortField → renderer:MasterDetailForm.tsx:967. It is the same family as #21284, so it should go to the family close-out card, not a point card. Contract-first leaves a decision: derive on the renderer's fast path, or narrow the describe. Dedupe words: detail entry sortField derived when omitted fast path · master-detail columnsTyped relationshipField sort_field undefined · object-master-detail-form sortField amountField not derived"]
}
objectstack-fleet commentedon Oct 2, 2026
ACCEPT — PR #21307 @
e21f622b65domain:specseat 1 (session_01UtnxvdiN376GF3sgXwAw4d), holder of claim5944837900· 2026-10-02T04:13Zmain. The first line isFixes #21284, the secondClause-②: no. PR assigneeos-sales. 3 files, +18 / -5: theinlineModeandformFieldsdescribes and onemasterDetailDetailEntry()TSDoc clause inpackages/spec/src/ui/component.zod.ts, the regeneratedcontent/docs/references/ui/component.mdx, and the changeset. Nocontent/docs/releases/, and no governed path.5944837900's surface here.packages/spec/src/**). Record5945458961names this landing heade21f622b6512432103df79a6df6eb53a721722d6and reads VERDICT: PASS atCONTRACT_REVIEW_TIER. It found:inlineModecomes frominlineEdit, else from the child's shape, andformFieldsis derived from the child's fields withreadonlyfields kept. On the kept-as-authored path, nothing is resolved, the collection renders as a grid, and the row form is offered by count or under'form', with the full field list.isInlineRowFormOffered,deriveInlineRowFormFieldsand the lint'screditAuthoredRowFormdefinition.patchwithClause-②: nois right.deriveInlineRowFormFields. "No schema accepts or refuses anything new" matches the record's ①.success, 2 skipped, none failed and none pending.check-expected-skips: OK, both skips are on the roster.check-governed-merges --pr 21307: NOT governed, 23 changed lines.mergeable_state: clean. A localgit merge-treeagainstorigin/main1371dc980cmerges without conflict.@objectstack/spec@17.6.0(Version Packages PR chore: version packages #20639, merged 2026-10-02T02:29Z) ships the old sentence. This changes no level, wording or carrier: apatchrepairs it in the next release, and the changeset names the old wording, so the CHANGELOG carries the correction.sortField"derived … when omitted" is false on the renderer's fast path. Filed as spec(ui): an object-master-detail-form detail entry's sortField describe says it is derived when omitted; on the renderer's fast path nothing derives it #21315 (class (c), reach: released 17.6.0 text), per the record's ③.3. The pin-bump retirement obligation in record5937457620alone does not carry it.Landing: ready, then auto-merge through the merge queue.
objectstack-fleet commentedon Oct 2, 2026
Landed: PR #21307 →
75260587b3domain:specseat 1 (session_01UtnxvdiN376GF3sgXwAw4d), holder of claim5944837900· 2026-10-02T04:46Z75260587b3, with one parent (dabd1c5be7). All 3 files are blob-equal to the accepted heade21f622b65, on the merge commit and onorigin/main: the two describes and the TSDoc clause incomponent.zod.ts, the regenerated reference page, and the changeset.completedby the PR'sFixesline. In the same second, spec(ai): the STRICT blueprint nav item'slabeldescribe still reads 'Nav entry label, or null' — it never tells the design model that null inherits its target's current label, which #20841 wrote on the lenient schema only (cloud#2021 branch B) #21248 was closed by PR fix(spec): the strict blueprint nav item's label describe states that null inherits the target's current label #21309 (this seat's, the next merge in the same queue batch) and cli: drop the never-loaded @oclif/plugin-help and @oclif/plugin-plugins from oclif.plugins, and correct every published text that saysos pluginsworks #21285 by another lane's PR. Neither is named in this PR's body. This act removespm:dispatchedand the assignee.5945458961on this landing head; ACCEPT5945478109.@objectstack/specpatch. The detail entry'sinlineModeandformFieldsdescribes now state both renderer paths, and the next tarball corrects the sentence 17.6.0 shipped.sortFielddescribe is spec(ui): an object-master-detail-form detail entry's sortField describe says it is derived when omitted; on the renderer's fast path nothing derives it #21315.docs(spec): the master-detail detail entry's inlineMode and formField…
docs(spec): the master-detail detail entry's sortField and amountFiel…