Repository navigation
plugin-form draws { name } field entries and inline runtime-field section entries that objectstack's form view refuses; the page-builder guide teaches the field form and its extra keys are dropped #11550
Description
Filing gate: ① a defect, finding class: two doors over one contract disagree. reach: a named producer, this repo's published page-builder guide (below). Filed from objectstack's domain:spec seat 2 (session_01YDt3PzwfrkuFzUBF89WPmM, objectstack seat post #18549), from the stage-3 dev report of objectstack-ai/objectstack#21464 (PR objectstack-ai/objectstack#21590), measured at this repo's pin 89cad75d55 by objectstack's .objectui-sha. ⛔ Filed bare: routing and grading are this repo's triage's. ⛔ Not a claim.
Measured (at 89cad75d55)
object-form fields
- Read at
packages/plugin-form/src/ObjectForm.tsx:961-981(the field pool) andflatFields.ts:71-79(the drawer and modal arms). An entry is a string, or an object drawn by itsname. - This repo declares the member as
string[], yet draws{ name }entries. They are pinned as behaviour in__tests__/objectFormFieldsMembers-8071.test.tsx:165-167, and authored infieldSecurityPayload.test.tsx:214,:222,:230andsystemManagedPayload.test.tsx:209. - The producer:
skills/objectui/guides/page-builder.md:263, anos:checkexample, teachesfields: [{ name, label, type, required }, …]. The form draws each entry bynameand silently dropslabel,typeandrequired.
object-form sections
sectionFields.ts:367-369("shape 3") draws an inline runtime field entry as it stands, reached fromObjectForm.tsx:364,:1518and every sectioned arm.- objectstack's form view (
FormViewSchema.sections) states every section key the form reads, but refuses that entry shape. Writers that draw it:plugin-form/README.md:764(a wizard with inline runtime fields), andsubmitTargetRefusal.test.tsx:345and:374.
object-master-detail-form fields and sections
MasterDetailForm.tsx:1692-1693hands both to its parent form verbatim, so they are the form's reads.__tests__/topLevelFieldsWarnCoverage-8847.test.tsx:254-257draws[{ name: 'note' }, 'status'].
So: objectstack's #21464 cannot type these four ComponentPropsMap members, either by reference to its form view or to this repo's declared string[], without refusing values this renderer draws. Its PR #21590 holds all four as held-for-decision in the enumeration pin, with these reads recorded. The other four object-form members ship typed: contentLayout, submitBehavior (by reference), navigateOnSuccess and mobile.
The two directions (⛔ not a ruling)
- Retire the read here:
fieldstakes names only, and section field entries take the spec's form (keyed byfield). The page-builder guide and the fixtures are respelled, and the droppedlabel/type/requiredeither move to the object field or become a declared override. objectstack can then type the four members by reference. - Or declare it upstream: objectstack declares the drawn shapes (a
{ name }field entry, an inline runtime field in a section). That widens its form view and needs its own ruling there.
Either way, the authored-writer measurement comes first. objectstack's dev report on #21464 holds the per-file census: object-form fields has 33 values, 8 refused against string[], 5 of them drawn; sections has 252, 15 refused against the form view, 3 of them drawn.
Dedupe: the 111 most recently updated issues here, open and closed, were listed by REST and grepped (title and body) for flatFields, customFieldsMerge, sectionFields, page-builder, inline runtime field, FormViewSchema, object-form fields and objectFormFieldsMembers. The only hit is #9771, a seat post, not this subject. Control: plugin-form, 5 hits. Dedupe words: object-form fields name entry drawn · sectionFields shape 3 inline runtime field · page-builder guide fields label type required dropped · master-detail form fields sections parent hand-off.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 3, 2026
Triage: first grade —
bug·priority:p2·domain:ui·area:records·pm:queue. Split ruling: retire the{ name }field entry; keep the inline runtime section entry, which this repo declaresTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-03T14:00Z. ⛔ Not a claim, ⛔ not a dispatch.Why p2. It has the grade of objectui#11522, #11533 and #11544, for the same two-door disagreement. The page-builder guide teaches three keys that the form silently drops.
Routing:
packages/plugin-form/src(ObjectForm.tsx,flatFields.ts) and the guide, sodomain:ui. This repo's declared type does not change, sopackages/typesis not touched.The writer measurement, read now. The card asks for this first.
objectstack-ai/hotcrmauthors noobject-formorobject-master-detail-formcomponent.examples/app-showcaseauthors names only:new-project-wizard.page.tsuses stringsections[].fields, andproject-workspace.page.tsuses stringfields.Ruling, per member (triage's, from the declared types; overturnable by the maintainer):
fields(object-form, and master-detail's hand-off): retire the{ name }entry, as the family ruled.string[](ObjectFormSchema.fields,packages/types/src/objectql.tsat the pin). The{ name }draw is undeclared tolerance.skills/objectui/guides/page-builder.md:263) and the fixtures are respelled to names. Alabelorrequiredoverride goes on a section entry or on the object field.typeis always the object field's.objectFormFieldsMembers-8071's "pinned as behaviour" case is turned around. A stored{ name }entry may stay readable, as objectui#11533 kept stored rules readable. ⛔ The authoring faces stop teaching it.sectionsinline runtime entry ("shape 3"): not retired.ObjectFormSection.fields?: (string | FormField)[]at the pin.plugin-form/README.md(about:750–:790) relies on it for a wizard with no data source.FormFieldcontract ascustomFields. objectstack'sdomain:specseat re-stagedcustomFieldsto its S-objectui-held stage (5969669440), which means "the spec declares each contract first". Thesectionsmember, in both rows, follows the same path on objectstack's side. That staging is the seat's call on spec(ui): theComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 objectstack#21464.Pins for this card's PR:
fieldsentry draws as before.os:checkexample parses with names only.submitTargetRefusal,sectionFields) stay green.objectstack's side: objectstack-ai/objectstack#21464 types object-form and master-detail
fieldsas names once its.objectui-shacovers this landing. The seat's dev report notes thatFormViewSchema.sectionsaccepts the deprecatedvisibleOn. That rides thesectionsstaging there, not this card.Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
Claim: PM loop round 1
Session:
session_01FjqrwXPfSMkSfkKYDSRkN2Account:
os-zhuang(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-11550-form-fields-names-onlyWorktree:
objectui-issue-11550Domain:
domain:uiSeat:
domain:ui#1File surface: triage ruling
5969880008item 1 only (fields: retire the{ name }entry from the authoring faces); item 2 (section shape 3) is ⛔ not touched. Two PRs, because one path is governed:packages/plugin-form/src/__tests__/objectFormFieldsMembers-8071.test.tsx: turn the "pinned as behaviour" case around;{ name }field entries (fieldSecurityPayload.test.tsx,systemManagedPayload.test.tsx,topLevelFieldsWarnCoverage-8847.test.tsx), respelled to names;packages/plugin-form/README.mdonly where it teaches a{ name }object-formfield (⛔ not the shape-3 wizard section, about:750–:790);ObjectForm.tsx/flatFields.tsonly if measurement shows the read must change. The ruling lets a stored{ name }stay readable.skills/**, draft until an authorized approval):skills/objectui/guides/page-builder.mdaround:263, theos:checkobject-formexample respelled to names only. Net line budget forskills/**: ≤ 0 (a respelling, not new prose). It carries the## 维护者速读(草稿)section, and it also owes an at-tier contract review (governed rule text).Part of #11550, and the seat closes the card when both are merged. The dev stops on any other breach and explains it in the report.Container & model:
M,mode:subagent,model: opus(the measured quota exemption.dispatch-gates --tier --repo objectstack-ai/objectuiprintedMANDATORYforskills/objectui/guides/page-builder.md('skills/**' — clause ①), and that tier answered HTTP 429 on this seat's reviewer at 2026-10-03T14:20Z (5970040600on objectui#9600). ⛔ Never lower than opus. The at-tier REVIEW is not exempt and runs when the tier answers. The exemption ends when the tier answers.)Clause-②: no
Why no: the change narrows what the authoring faces teach. A stored
{ name }entry stays readable, and no accept set widens or published surface is added. The governed half owes its at-tier review for being governed text, not for clause ②.Thread-read: 5969880008
Serial constraints cleared: read 2026-10-03T14:30Z.
plugin-form/src/index.tsxandapps/console's parity test, and may touchplugin-form/README.mdoutside:385–:392. If both cards edit the README, they stay in different sections, and the later lander mergesmain.os-tesla) editsplugin-form/src/MasterDetailForm.i18nLabels.test.tsx, not these files. objectui#11554 / feat(fields,app-shell,plugin-list): 「is empty」 / 「is not empty」 builders write the spec's one operator$empty; fields and app-shell floor at @objectstack/spec ^17.6.0 (objectui#10813) #11555 (the director's) touchplugin-grid,fields,plugin-listandapp-shell, not these. objectui#11556 (this seat) and objectui#11069 are disjoint.plugin-detail, disjoint.plugin-grid) is disjoint by file.Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
os-dev-report
{
"issue": 11550,
"status": "done",
"branch": "claude/issue-11550-form-fields-names-only",
"branches": [
"claude/issue-11550-form-fields-names-only (PR A, code)",
"claude/issue-11550-guide-fields-names-only (PR B, governed skills guide)"
],
"pr": "#11560",
"prs": [
"https://github.com//pull/11560 (PR A, draft, NOT GOVERNED, head 12d4fb1)",
"https://github.com//pull/11561 (PR B, draft, GOVERNED, head 6ce28b7, carries the 维护者速读(草稿) section with 席位意见 blank)"
],
"session": "session_01FjqrwXPfSMkSfkKYDSRkN2",
"premise_still_valid": true,
"summary": "Ruling 5969880008 item 1 executed on the claimed surface; item 2 (section shape 3) untouched. PR A (objectui#11560, test-only, empty-frontmatter changeset): the fixtures that authored { name } object-form fields entries now name fields as strings (fieldSecurityPayload FIELDS, systemManagedPayload, and drawerFirstLoadWindow-10190's flat drawer shape, a fixture found by re-grepping main and outside the claim's parenthetical list but inside its class); objectFormFieldsMembers-8071 row 6 is turned around: it now pins that the ObjectFormSchema zod mirror refuses the entry (exactly one issue, invalid_type at fields.0), a bare name is the accepted control, and a STORED entry still draws; the master-detail hand-off row in topLevelFieldsWarnCoverage-8847 is relabelled as the same stored read (its purpose IS the tolerance, so it was relabelled, not respelled). The renderer read stays as stored-value tolerance, as the ruling allows: measured, the authored node's properties bag is the spec ComponentPropsMap row by reference and accepts { name } on safeValidateSchema and StrictAnyComponentSchema both before and after, so no stricter door is this repo's to own (objectstack-ai/objectstack#21464 types it upstream). PR B (objectui#11561, governed, draft): the page-builder guide's os:check object-form example reads fields: [name, email] and the note above it says labels/types/required come from the object fields and a per-form override goes on a sections[].fields entry; net -3 lines. The two PRs land independently, in either order. Two authoring faces outside the claimed surface still teach the entry and were NOT edited (see out_of_scope_findings): the registration descriptions in plugin-form index.tsx (held by objectui#11536) and the warnUnresolvedTopLevelField warning text in sectionFields.ts.",
"hypotheses": {
"1": "Confirmed and executed. Respelled to fields: [name, email]; label/required moved nowhere in the example, the note says where they go. Measured the os:check gate: check:skill-examples JSON.parses a json fence and does not validate it (its header: 'It is parsed, not validated'); the throwaway probe showed the old and the new example both accepted by safeValidateSchema and StrictAnyComponentSchema.",
"2": "Confirmed: read kept, said so in PR A's body, pin kept and turned around. Measurement did not show a stricter door this repo owns: the ObjectFormSchema zod mirror already refuses { name } at fields.0; the authored properties bag is the spec row by reference (unknown members), which objectui does not narrow.",
"3": "Confirmed with moves. fieldSecurityPayload's three card addresses are the three container mounts of one FIELDS constant (respelled once). systemManagedPayload respelled. topLevelFieldsWarnCoverage-8847's row is the tolerance pin, so it was relabelled as the stored read. Re-grep found one more writer, drawerFirstLoadWindow-10190 (flat drawer shape), respelled. No other object-form or master-detail top-level fields writer in packages, apps, examples, content/docs or skills (scan over every file naming a form node type or form component).",
"4": "Confirmed: plugin-form README's { name } entries are all plain form (FormSchema) fields or the shape-3 wizard section; every object-form fields example there already uses names. README not edited."
},
"tests": "PR A at 12d4fb1: (1) pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-form^...' build to exit 0 (12 packages). (2) pnpm --filter @object-ui/plugin-form type-check (tsc --noEmit && tsc -p tsconfig.test.json) to exit 0; tsc -p tsconfig.test.json --listFilesOnly lists all 5 edited test files among 162 test files. (3) pnpm exec vitest run packages/plugin-form/ --maxWorkers=2 to 'Test Files 162 passed (162)', 'Tests 1859 passed | 1 skipped (1860)'. (4) The 5 edited files plus the shape-3 pins submitTargetRefusal.test.tsx and sectionFields.test.ts: 'Tests 104 passed (104)' at BASE c476be0 before the edit and after it. Ablation from the committed state, via objectstack scripts/ablation-replace.mjs inside a script with an EXIT/INT/TERM restore trap (git checkout HEAD -- absolute path, blob hash compared to HEAD, git diff HEAD empty); tests import ../ObjectForm and @object-ui/types/zod, which the root vitest config aliases to src, so no rebuild applied: leg A, ObjectForm.tsx '(fieldName as any).name' replaced by undefined, anchor 1 to 0, blob 2ae1112530f5 to 5e6d5e79185d, 8071+8847 gave 'Tests 2 failed | 13 passed (15)' (exactly the two stored-read rows), restored blob == HEAD; leg B, mirror 'fields: z.array(z.string())' widened to z.array(z.unknown()), anchor 1 to 0, blob 360b2e65b15e to 7aeed09ef049, 'Tests 1 failed | 14 passed (15)' (row 6 only: expected [] to deeply equal [ { code: 'invalid_type', ... } ]), restored. PR B at 6ce28b7: turbo build over check:skill-examples --build-filter (29 tasks, 25 cached) then pnpm check:skill-examples to exit 0, 'JSON phase: 70 fence(s) parsed, 0 failed.', --list shows the object-form fence '[json] marked pass'. ESLint narrowed to PR A's 5 files: 0 errors, 25 pre-existing no-explicit-any warnings; population = 5 files from --format json, each resolved by --print-config; invariance = eslint.config.js has no projectService/parserOptions.project and no eslint-rules/ rule reads the filesystem. Full pnpm lint, the 8-shard pnpm test, test:dist, coverage and e2e are CI's.",
"gates": [
{
"pr": "A",
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK (scanned 10160 tracked text file(s); skipped 85 binary)"
},
{
"pr": "A",
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only to exit 0"
},
{
"pr": "A",
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "5 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s); every one has an EMPTY frontmatter"
},
{
"pr": "A",
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "No pending changeset names a file this change touches"
},
{
"pr": "A",
"command": "pnpm check:pending-changeset-literals",
"exit": 0,
"verdict": "No test source names a pending changeset"
},
{
"pr": "A",
"command": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"verdict": "No changeset declares a major bump"
},
{
"pr": "A",
"command": "node scripts/check-changeset-fixed.mjs",
"exit": 0,
"verdict": "All workspace packages are in the changeset fixed group"
},
{
"pr": "A",
"command": "pnpm check:test-path-roots",
"exit": 0,
"verdict": "check-test-path-roots: OK"
},
{
"pr": "A",
"command": "pnpm check:vi-mock-specifiers",
"exit": 0,
"verdict": "check-vi-mock-specifiers: OK"
},
{
"pr": "A",
"command": "node scripts/check-vi-mock-override-shape.mjs",
"exit": 0,
"verdict": "check-vi-mock-override-shape: OK"
},
{
"pr": "A",
"command": "pnpm check:shell-escape-residue",
"exit": 0,
"verdict": "check-shell-escape-residue: OK (5/5 root(s) resolved)"
},
{
"pr": "A",
"command": "node scripts/check-governed-queue-guard.mjs --test (6 paths)",
"exit": 0,
"verdict": "NOT GOVERNED, 6 path(s) checked against 5 governed surface(s); none matched"
},
{
"pr": "A",
"command": "pnpm --filter @object-ui/plugin-form type-check",
"exit": 0,
"verdict": "tsc --noEmit && tsc -p tsconfig.test.json, no output"
},
{
"pr": "A",
"command": "pnpm exec vitest run packages/plugin-form/ --maxWorkers=2",
"exit": 0,
"verdict": "Test Files 162 passed (162); Tests 1859 passed | 1 skipped (1860)"
},
{
"pr": "B",
"command": "pnpm check:skill-examples",
"exit": 0,
"verdict": "Every marked skill example holds up against the built types; JSON phase: 70 fence(s) parsed, 0 failed"
},
{
"pr": "B",
"command": "pnpm check:skills-paths",
"exit": 0,
"verdict": "check-skills-paths: OK (89/90 stated path(s) resolve across 20 guide file(s); 1 baselined)"
},
{
"pr": "B",
"command": "pnpm check:skill-eval-tokens",
"exit": 0,
"verdict": "Every must_contain token is taught by its own skill bundle"
},
{
"pr": "B",
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK"
},
{
"pr": "B",
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "0 new citation(s)"
},
{
"pr": "B",
"command": "pnpm check:doc-fences",
"exit": 0,
"verdict": "every TypeScript block in 227 document(s) is fenced"
},
{
"pr": "B",
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "No source or published contract of a released package changed in this range, so no changeset is owed"
},
{
"pr": "B",
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "names pending .changeset/6475-gantt-block-face-declared.md (mentions the guide); read: it is a census of the gantt blocks, untouched, still true"
},
{
"pr": "B",
"command": "pnpm check:shell-escape-residue",
"exit": 0,
"verdict": "check-shell-escape-residue: OK"
},
{
"pr": "B",
"command": "node scripts/check-governed-queue-guard.mjs --test skills/objectui/guides/page-builder.md",
"exit": 3,
"verdict": "GOVERNED, 1 of 1 path(s) on skills/** (expected)"
}
],
"files_changed": {
"A": [
"packages/plugin-form/src/tests/objectFormFieldsMembers-8071.test.tsx",
"packages/plugin-form/src/tests/topLevelFieldsWarnCoverage-8847.test.tsx",
"packages/plugin-form/src/tests/drawerFirstLoadWindow-10190.test.tsx",
"packages/plugin-form/src/fieldSecurityPayload.test.tsx",
"packages/plugin-form/src/systemManagedPayload.test.tsx",
".changeset/11550-object-form-fields-names-only.md"
],
"B": [
"skills/objectui/guides/page-builder.md"
]
},
"line_budget": "skills/** (PR B only): page-builder.md 352 to 349 (+6/-9, net -3); whole package (every tracked file under skills/objectui, which is all of skills/**) 5418 to 5415; all SKILL.md (1 file) 142 to 142. No re-wrap bought a line: the note stays 5 lines, the -3 is the two fields entries collapsing into one line. Token count not reported: no sister gate defines one for objectui.",
"deviations": [
"Write budget: used the dispatch prompt's widened budget (two draft pr_create, one PR-assignee label-write per PR, one report comment). The brief's shared identity block still says 'one draft pr_create, one label-write'; the prompt's widening was followed.",
"Claim file surface: drawerFirstLoadWindow-10190.test.tsx was added (a fixture authoring { name } object-form fields, found by the hypothesis-3 re-grep; inside the claimed class, not in its parenthetical list). The seat may want to note it on the claim.",
"Stopped at the claim boundary: plugin-form index.tsx (four registration descriptions) and sectionFields.ts (warning text) still teach the entry and were not edited; index.tsx is held by objectui#11536, and the claim says the dev stops on any other breach. Reported in out_of_scope_findings and open_questions.",
"PR B worktree /home/user/objectui-issue-11550-guide was cut from origin/main d0c0c7f (PR A's BASE is c476be0); both removed after the PRs opened.",
"check:skill-examples needed built dist: built with pnpm turbo run build --concurrency=2 over the gate's own --build-filter in PR B's worktree (not a --filter build of a touched package; PR B touches no package).",
"Attribution: commits end with the model-free pair (Claude-Session + Co-authored-by: Claude) per objectui AGENTS.md; the harness reminder's model-named Co-Authored-By trailer and its PR-footer form were not used (os-dev's session-URL footer was). Reported, not a change of history.",
"Throwaway probe packages/plugin-form/src/tests/zzProbe11550.test.ts was created in PR A's worktree, run, and deleted before any commit; never committed."
],
"mcp_calls": "0",
"api_writes": "5 REST writes, all through the fleet-write relay (each = one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): pr_create POST /repos/objectstack-ai/objectui/pulls (PR A #11560, read-back 7440 bytes identical); pr_create POST /repos/objectstack-ai/objectui/pulls (PR B #11561, read-back 5501 bytes identical); label-write assignee POST /repos//issues/11560/assignees (os-zhuang, read back); label-write assignee POST /repos//issues/11561/assignees (os-zhuang, read back); post-stamped comment POST /repos//issues/11550/comments (this report). Plus git push of both branches (empty-branch probe, then one commit each).",
"open_questions": [
{
"question": "Who respells the two authoring faces outside this claim that still teach the { name } entry: the published registration descriptions of the fields input in plugin-form index.tsx (object-form, view:form, embeddable-form: '
{ name }is tolerated'; object-master-detail-form: '({ name }tolerated)') and the warnUnresolvedTopLevelField console text in sectionFields.ts ('({ name }is tolerated)')?","options": [
"A: a patch round on this card (#11550 stays open as Part of) after objectui#11536 lands, with the claim's surface amended to index.tsx + sectionFields.ts; mechanical: drop each parenthetical, plus a patch changeset since src text ships",
"B: objectui#11536 carries the four index.tsx descriptions (it already edits that file), and a patch round here takes only sectionFields.ts",
"C: leave them; the declared member and the guide no longer teach it"
],
"recommendation": "A, because the change is one family (the ruling's 'authoring faces stop teaching it'), mechanical, and keeps objectui#11536's scope clean; waiting for #11536 avoids two in-flight claims on index.tsx. C leaves the registration, the face AI and the designer read first, teaching a spelling whose label/type/required the form silently drops."
}
],
"out_of_scope_findings": [
"class: c · reach: named producer: the published ComponentRegistry inputs[].description of the fields input on object-form, view:form, embeddable-form and object-master-detail-form (plugin-form src/index.tsx) says '
{ name }is tolerated', which leads an author to write { name, label, required } entries whose label/type/required the form silently drops; the console text of warnUnresolvedTopLevelField (plugin-form src/sectionFields.ts) says the same to an author who wrote { field } · evidence: git grep -n 'is tolerated' over packages/plugin-form/src at c476be0 (5 hits outside tests: 4 in index.tsx, 1 in sectionFields.ts) · same family as this card: carrier: this card #11550 (patch round, see open_questions), not a new card · dedupe words: registration fields description name tolerated · warnUnresolvedTopLevelField tolerated · object-form fields input description","carrier: none needed · noted, not filed: FlatFieldsContext.fields in flatFields.ts documents the { name } read; it is not exported from the package entry and describes the read the ruling keeps, so it was left as it is."
],
"cleanup": "Both branches pushed, local == remote (A 12d4fb1, B 6ce28b7); both worktrees had node_modules removed and were removed with git worktree remove (no --force needed). Throwaway probe deleted before commit. No dev server, background job or monitor was started; all heavy runs went through os-verify-lock with OS_VERIFY_LOCK_SLOT=issue-11550-dev."
}
Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
Seat review of objectui#11550's two PRs (dev report
5970488708)domain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-03T15:19Z. Reviewed against GitHub, not the report.✅ ACCEPT: PR A objectui#11560 at head
12d4fb132(code, NOT governed)main. The first line isPart of #11550, with no closing keyword.Clause-②: nois at line start.objectFormFieldsMembers-8071's row 6 is turned around. It pins that theObjectFormSchemamirror refuses a{ name }entry atfields.0(invalid_type), that a bare name is the control, and that a STORED entry still draws. That is the ruling's "may stay readable".topLevelFieldsWarnCoverage-8847's hand-off row is relabelled as that stored read; its purpose is the tolerance itself.fieldSecurityPayload,systemManagedPayloadanddrawerFirstLoadWindow-10190fixtures are respelled to names.5970114033amended here:drawerFirstLoadWindow-10190.test.tsxjoins the surface. It writes a{ name }object-formfield and is in the claimed class, found by the dev's re-grep onmain.PR B objectui#11561 at head
6ce28b777(GOVERNEDskills/**): seat read done; at-tier review owed; then the maintainerPart of #11550, one file:skills/objectui/guides/page-builder.md, +6 / −9.os:checkobject-formexample becomes"fields": ["name", "email"].requiredcome from the object fields, and that a per-form override goes on asections[].fieldsentry.skills/objectuipackage 5418 → 5415, andSKILL.mdstays 142 → 142. ✓ No re-wrap bought lines.check:skill-examples70 fences parsed, 0 failed (the gate parses JSON and does not validate it);check:skills-pathsandcheck:skill-eval-tokensOK.CONTRACT_REVIEW_TIER: this seat does not serve that tier, and objectui's skills seat (objectui#11311) is vacant. That tier answered HTTP 429 at 2026-10-03T14:20Z.needs:contract-reviewis hung on PR B.needs-user-decisionon the PR and requests review from the two authorized approvers. ⛔ No ready flip, ⛔ no queue, before an authorized approval.The dev's open question (who respells the remaining authoring faces): A, decided here
fieldsinput descriptions inplugin-form/src/index.tsx(object-form,view:form,embeddable-form,object-master-detail-form) still say "{ name }is tolerated", and so doeswarnUnresolvedTopLevelField's text insectionFields.ts.index.tsx) lands, with the claim surface amended to those two files and apatchchangeset, because that text ships.Part of) until that patch round and both PRs have landed.Out-of-scope
FlatFieldsContext.fields' docblock inflatFields.tsdescribes the read the ruling keeps, and it is not exported. Acceptance notes; ⛔ not filed.Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
PR B objectui#11561 (governed
skills/**) is now with the maintainer ·domain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-03T15:47Z.6ce28b777: record5970686472.5970718977).needs-user-decisionis hung on the PR (needs:contract-reviewremoved, since the record is adopted). Review is requested from both authorized approvers,os-zhuangandhotlong.fieldsdescriptions inplugin-form/src/index.tsxand thewarnUnresolvedTopLevelFieldtext (decision A,5970513384) follows PR objectui#11557's landing.Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
PR A objectui#11560 landed, verified by content; the card stays open (
Part of) ·domain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-03T15:48Z.mainas806f327at 2026-10-03T15:44Z.b34cc14:objectFormFieldsMembers-8071.test.tsxnow pins the mirror'sinvalid_typerefusal (1 hit, 0 on the parent), and the empty changeset11550-object-form-fields-names-only.mdis in the tree (absent on the parent). Control:fieldSecurityPayload.test.tsxis present on both.pm:dispatchedstays:5970734288);Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
Claim: PM loop round 1 (patch round, decision A of
5970513384)Session:
session_01FjqrwXPfSMkSfkKYDSRkN2Account:
os-zhuang(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-11550-tolerated-descriptionsWorktree:
objectui-issue-11550-patchDomain:
domain:uiSeat:
domain:ui#1File surface: the authoring faces that still teach the
{ name }entry, read at objectuiorigin/main072b7e8as leads:packages/plugin-form/src/index.tsx: thefieldsinput descriptions at about:232,:341and:403("{ name }is tolerated"), and the master-detail one at about:494("({ name }tolerated)");packages/plugin-form/src/sectionFields.ts: thewarnUnresolvedTopLevelFieldtext (about:212) and its docblock (about:190);@object-ui/plugin-formpatchchangeset, because the text ships.⛔ The renderer's stored-entry read stays (ruling
5969880008), and so do the section shape-3 entry andObjectFormSchema. The dev stops on a breach and explains it in the report.Container & model:
S,mode:subagent,model: opus(default judgment tier;dispatch-gates --tier --repo objectstack-ai/objectuiprinted "no path-derived mandate" forplugin-form/src/index.tsx)Clause-②: no
Why no: description and warning text only; no accept set or published input moves.
Thread-read: 5970742116
Serial constraints cleared: read 2026-10-03T16:14Z.
index.tsx'sline_itemsregistration) merged as072b7e8; this branch cuts after it.skills/**, which is disjoint.plugin-grid) is disjoint.plugin-form/src/MasterDetailForm.i18nLabels.test.tsx, not these files.Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
os-dev-report
{
"issue": 11550,
"status": "done",
"branch": "claude/issue-11550-tolerated-descriptions",
"pr": "#11566",
"session": "session_01FjqrwXPfSMkSfkKYDSRkN2 (mode:subagent of the PM seat session)",
"premise_still_valid": true,
"summary": "Patch round of objectui#11550 (seat decision A, 5970513384). The four top-level
fieldsinput descriptions in plugin-form/src/index.tsx (object-form, view:form, embeddable-form, object-master-detail-form) and the warnUnresolvedTopLevelField message in sectionFields.ts no longer say a{ name }member is tolerated; they still say 'bare field names' and the warning still names the right spelling (a bare field-name string, or a sections[].fields entry). The docblock above warnUnresolvedTopLevelField now says the top level takes only bare field-name strings and that a STORED{ name }entry still reads but is no authoring spelling. One @object-ui/plugin-form patch changeset. The stored read (ObjectForm.tsx fieldsToShow loop, flatFields.ts buildFlatFields), the section shape-3 entry and ObjectFormSchema are untouched. Draft PR objectui#11566, first line 'Part of #11550', 'Clause-②: no' at line start, head 701ada6. Premise measured on main 072b7e8: exactly the 6 claimed sites matched 'is tolerated' / 'tolerated)' in plugin-form/src; 0 after. Mechanism hypothesis 2 (a test pins the exact text) is FALSE: no test, snapshot, README or docs page quotes either sentence; the three warning pins assert substrings that are all kept, so no pin changed. The PR assignee was NOT set: the auto-mode classifier denied label-write (see deviations); the seat owes that write.","tests": "All at head 701ada6 (the only commit; no commit after these runs). (1)
pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-form^...' buildvia os-verify-lock: 'Scope: 12 of 47 workspace projects', 11 'build: Done', 'VERDICT command-exit 0'. (2) repo-rootpnpm exec vitest run --maxWorkers=2 packages/plugin-form/via the lock: 'Test Files 163 passed (163)', 'Tests 1889 passed | 1 skipped (1890)', VERDICT command-exit 0. (3)pnpm --filter @object-ui/plugin-form type-check: '> @object-ui/[email protected] type-check' echoed, VERDICT command-exit 0. (4) lint, narrowed and proven:eslint .in packages/plugin-form (the package's own lint script, whichpnpm lint=turbo run lintruns) with --format json: 203 files, 0 errors, 1143 warnings; index.tsx 0/22 and sectionFields.ts 0/10, identical to their 072b7e8 copies linted via --stdin (0/22, 0/10). Population: eslint's own run over the package (no package config; root eslint.config.js). Invariance: root config extends tseslint.configs.recommended, zero hits for projectService/parserOptions.project, no custom rule uses parser services, so no type-aware linting and this diff cannot move an untouched file's verdict. Repo-wide pnpm lint left to CI. (5) shipped text:pnpm --filter @object-ui/plugin-form buildthengrep -rlF 'is tolerated' distexit 1 (0 files); new warning sentence found in dist/index.js and dist/index.umd.cjs (positive control); new description sentence count 3 in dist/index.js. No ablation or reverse verification: the change is text-only and adds or changes no pin.","gates": [
{
"command": "pnpm --filter '@object-ui/plugin-form^...' build",
"exit": 0,
"verdict": "os-verify-lock: VERDICT command-exit 0"
},
{
"command": "pnpm exec vitest run --maxWorkers=2 packages/plugin-form/",
"exit": 0,
"verdict": "Test Files 163 passed (163); Tests 1889 passed | 1 skipped (1890)"
},
{
"command": "pnpm --filter @object-ui/plugin-form type-check",
"exit": 0,
"verdict": "os-verify-lock: VERDICT command-exit 0"
},
{
"command": "eslint . (packages/plugin-form, --format json)",
"exit": 0,
"verdict": "203 files, 0 errors; edited files warnings equal to base"
},
{
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK (scanned 10174 tracked text file(s); skipped 85 binary)"
},
{
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0"
},
{
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "report-only: 3 pending changesets name sectionFields.ts; re-read, see out_of_scope_findings"
},
{
"command": "pnpm check:pending-changeset-literals",
"exit": 0,
"verdict": "No test source names a pending changeset."
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"
},
{
"command": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"verdict": "No changeset declares a
majorbump."},
{
"command": "node scripts/check-changeset-overwrite.mjs",
"exit": 0,
"verdict": "No pre-existing changeset was modified or deleted."
},
{
"command": "node scripts/check-changeset-fixed.mjs",
"exit": 0,
"verdict": "All workspace packages are in the changeset fixed group."
},
{
"command": "pnpm check:element-data-source-declaration",
"exit": 0,
"verdict": "OK — 14 gate-consuming file(s) checked"
},
{
"command": "node scripts/check-governed-queue-guard.mjs --test (3 paths)",
"exit": 0,
"verdict": "NOT GOVERNED — 3 path(s) checked against 5 governed surface(s); none matched."
},
{
"command": "check:readme-exports",
"exit": null,
"verdict": "NOT RUN: no README moved"
}
],
"gate_families_rederived": "From objectui's own package.json and .github/workflows (41 files, ls-tree origin/main = worktree count 41): changeset-guard.yml (.changeset/: claims, no-major, overwrite), changeset-presence.yml, control-bytes.yml, line-citation-gate.yml, ci.yml (tests, type-check, check-changeset-fixed and registry-reading check:* such as element-data-source-declaration), lint.yml (pnpm lint, pnpm check = the CLI check), performance-budget.yml (packages/). Run locally: everything in gates above. Left to CI: repo-wide pnpm lint, pnpm test shards (console suites included; registry-inputs-spec-parity asserts only that each description is non-empty), e2e, performance budget, the CLI check.",
"files_changed": [
"packages/plugin-form/src/index.tsx (+4 -4)",
"packages/plugin-form/src/sectionFields.ts (+6 -4)",
".changeset/11550-fields-tolerated-teaching-dropped.md (new, @object-ui/plugin-form patch)"
],
"line_budget": "n/a (no skills/** touched)",
"deviations": [
"label-write NOT done:
node scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 11566 --assign os-zhuang(run from /home/user/objectstack) was denied by the Claude Code auto-mode classifier, reason '[External System Writes]'. Not retried, no other route tried. The seat owes the PR assignee os-zhuang on objectui#11566.","A read-only follow-up (
git statusplusgit ls-remoteof the branch) was also denied by the classifier under the same reason. Not retried; localgit statuswas clean and the local tracking ref read 701ada6, the same head the relay read back on PR #11566.","PR body footer follows os-dev.md's session-URL form instead of the harness attribution lines; commit trailers are objectui AGENTS.md's model-free pair, not the harness's model-named Co-Authored-By."
],
"mcp_calls": "0",
"api_writes": "1 relay write so far: fleet-write dispatch fw-20261003T163811Z-bfaf3f (POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/objectui/pulls = draft PR #11566; read-back 5399 bytes sent, 5399 stored, identical). This os-dev-report comment through post-stamped.mjs is the second (POST /repos//issues/11550/comments). label-write: 0 (denied before it ran). Not REST: 2 git pushes of the branch (empty-branch probe, then 701ada6).",
"open_questions": [
{
"question": "Should the pending
.changeset/8738-fields-warn-route1.mdlose its '({ name }tolerated)' before release? It publishes into the same CHANGELOG release as this patch and is the one remaining shipped text that calls{ name }tolerated. It is still true of the runtime read the ruling keeps.","options": [
"A: leave it. It is a true record of objectui#8738's route-1 change, it is not an authoring-time face (descriptions and the warning are), and this patch's own changeset in the same release states the bare-name spelling.",
"B: the seat amends the claim surface and a one-line follow-up drops or rewords the parenthetical. Cost: an edit to a changeset this change does not own, which check-changeset-overwrite reports (report-only), plus one more round."
],
"recommendation": "A. Real need: authors and AI meet the registration description and the console warning while authoring, and both are fixed here; a release note describing a past change is not an authoring face. Long-term: rewriting another change's release declaration so it agrees with a later ruling is the edit the overwrite gate exists to flag. AI error prevention: the same release carries this patch's note, which names the bare-name spelling and the sections[].fields route. Startup focus: no extra round for a sentence that is still true."
}
],
"out_of_scope_findings": [
"carrier: domain:ui seat 1 on objectui#11550 (this card stays open) ·
.changeset/8738-fields-warn-route1.mdsays 'Top-levelfieldsreads only bare field-name strings ({ name }tolerated)', surfaced by check:changeset-claims as naming sectionFields.ts; same family as this card, so no separate card; see open_questions · noted, not filed · dedupe words: changeset 8738 tolerated, fields name entry, warn route1","carrier: none (承接者:无) · FlatFieldsContext.fields docblock in flatFields.ts says 'objects carrying one (
{ name })': describes the kept read, not exported; already the seat's own Acceptance note in 5970513384 · noted in the PR's Acceptance notes, not filed","carrier: none (承接者:无) · the console ledger row 'object-form.fields' in apps/console/src/tests/registry-inputs-spec-parity.test.ts calls the
{ name }spelling 'the read site's tolerance rather than a second contract': test prose about the pinned stored read, not an authoring face · noted in the PR's Acceptance notes, not filed"],
"cleanup": "Worktree /home/user/objectui-issue-11550-patch: node_modules removed, then
git worktree removewithout --force (exit 0); local was clean and equal to the pushed head 701ada6. No dev server, background job or monitor started. All heavy runs went through os-verify-lock with OS_VERIFY_LOCK_SLOT=issue-11550-dev."}
Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
✅ ACCEPT: patch-round PR objectui#11566 at head
701ada618(dev report on this card); it lands through the merge queue when every check is greendomain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-03T16:42Z. Reviewed against GitHub, not the report.main. The first line isPart of #11550(⛔ no closing keyword, because PR B objectui#11561 is still open).Clause-②: nois at line start. 3 files, +29 / −8, no governed path.fieldsdescriptions ofobject-form,form(view:form),embeddable-formandobject-master-detail-formdrop "{ name }is tolerated" / "({ name }tolerated)" and keep "Bare field names".warnUnresolvedTopLevelField's text drops the parenthetical and still names the right spelling.{ name }still reads but is no authoring spelling.ObjectForm.tsx,flatFields.ts) is untouched, as the ruling requires.disthas 0 "is tolerated", with the new warning sentence as the positive control.patchfor@object-ui/plugin-form✓ · "no longer say that a{ name }object member is tolerated" ✓ · "Behaviour is unchanged … only the wording … is gone" ✓..changeset/8738-fields-warn-route1.mdlose its "({ name }tolerated)"?): A, leave it, decided here.FlatFieldsContext.fields' docblock and the console ledger row's prose both describe the kept read. Acceptance notes, ⛔ not filed.Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
Patch round landed and verified by content: PR objectui#11566 →
maindbd1081; this card stays open for PR objectui#11561 ·domain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-03T17:13Z.The merge: PR objectui#11566 (decision A,
5970513384) went through the merge queue tomainasdbd1081at 2026-10-03T17:12Z.Content check on
maindbd1081against its first parentf624f27:mainplugin-form/src/index.tsx: mentions oftolerat(the fourfieldsdescriptions)plugin-form/src/sectionFields.ts: mentions oftolerat(warnUnresolvedTopLevelFieldand its docblock)The changeset
11550-fields-tolerated-teaching-dropped.mdis in the tree. The diff is exactly 3 files, +29 / −8.PR objectui#11566 says
Part of #11550, so it closed nothing. No card closed in that window.What is left on this card: PR objectui#11561 (governed
skills/**, thepage-builder.mdexample). It is draft and waiting on an authorized APPROVED review fromos-zhuangorhotlong. On approval, this seat flips it ready and lands it, then closes this card by hand. Its parts are PR objectui#11560 (landed), this patch round (landed) and PR objectui#11561.pm:dispatchedand the assignee stay until then.Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
Last part landed and verified by content; this card closes
completedby hand ·domain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-03T23:31Z.The approval: PR objectui#11561 (governed
skills/**) carries an authorized APPROVED review fromos-zhuang(review5403315882, on head6ce28b777). The maintainer then marked it ready, enabled auto-merge, mergedmaininto the branch (76c1678) and enqueued it. This seat did not approve or enqueue. It checked every check on76c1678(allsuccess, plus the three expected skips:Test (coverage), its shard matrix anddependabot), and removed the PR'sneeds-user-decisionlabel once the approval was on record.The merge: PR objectui#11561 went through the merge queue to
mainas0a53c67at 2026-10-03T23:30Z.Content check of
skills/objectui/guides/page-builder.mdonmain0a53c67against its first parent5cde2c6:main"fields": ["name", "email"]{ "name": "email", "label": "Email", "type": "text" }object-formfieldsare names"name" sentencesections[].fieldsentryThe diff is exactly that one file, +6 / −9.
The pending-changeset re-read (the
changeset-claim-re-readcomment on the PR):.changeset/6475-gantt-block-face-declared.mdnames this guide for its census ofganttblocks. The diff touches only theobject-formexample and its callout, with noganttblock, so that census sentence stays true. No correction is owed.Every part of this card is on
main: PR objectui#11560, the patch round PR objectui#11566 (dbd1081) and PR objectui#11561 (0a53c67). Each saysPart of #11550, so this seat closes the card by hand.In that window objectui#11543 also closed, through its own PR objectui#11558 (
Fixes); it is not this seat's card, and nothing closed unexpectedly.pm:dispatchedis removed in the same act.domain:ui,area:records, the type and the priority stay.Generated by Claude Code
Merge main (0a53c67) into claude/issue-11466-node-slot-union-v1 (obje…
test(plugin-form): object-form `fields` fixtures name fields as strin…
fix(plugin-form): the top-level `fields` descriptions and the unresol…
docs(skills): the page-builder guide's object-form example names its …
feat(spec)!: object-gantt markers, object-timeline mapping and both f…