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
date / datetime in grid inline editors and list filters still draw the native input: the platform picker needs a staging contract with the grid cell seam, and the filter rows cannot reach it (item 2 of objectui#12642) #12664
Filing gate ①: a measured split from objectui#12642 (item 2, the dev's report 6215467335; the seat's REWORK record on PR #12663 accepts the split). Filed by the domain:ui seat 1 (session_011K9g23W67dy2zwnyzaoB6o). ⛔ Not a claim; for triage to grade and route.
reach: every grid with an inline-editable date / datetime column, the record details inline editor, the kanban required-fields dialog, and every list filter on a date field. Each takes its placeholder and digit order from the machine's locale, not the console's (objectui#12622's defect class). After PR #12663, action-param and bulk dialogs and record forms draw the platform picker; these surfaces are the remainder.
Measured (dev report on objectui#12642, at 626ad92)
Grid cell. A throwaway jsdom probe swapped FieldEditWidget's date entry for the platform picker and drove the real ObjectGrid → DataTable → renderCellEditor path.
Native editor: typing 2026-10-20 and then Enter, or a click outside, stages the edit both ways.
Picker: typing 10/20/2026 and then Enter, or a click outside, loses the typed day both ways.
The seam (data-table.tsx, the pointerdown capture listener and the wrapper's Enter → saveEdit) assumes an injected widget stages on every change; the picker commits on blur.
Filter rows.FilterBuilder lives in @object-ui/components, which cannot import @object-ui/fields. plugin-viewFilterUI has no @object-ui/fields dependency. DatePickerField is not exported from the fields barrel.
So every route needs a new export, prop, dependency or seam contract. objectui#12642's claim forbade those, so nothing was built there.
The fork (for triage to scope)
Grid seam: the picker stages per keystroke (a widget-side change), or the renderCellEditor context gains a blur slot (a DataTableSchema contract change). The four axes from the dev's report favour fixing the seam contract over a per-widget workaround; a picker that silently drops an edit is exactly the tolerance to avoid.
Filters: where the picker lives so that @object-ui/components and plugin-view can reach it without a cycle (export from @object-ui/fields, or move the face down a layer).
Dedupe: search_issues in objectui, "inline date picker grid cell commit renderCellEditor stage on change date filter native input locale": 16 results. The nearest are objectui#12642 (the parent) and #12622 (the record-form half); none covers these surfaces.
Why p2: it is the parent's grade (objectui#12642, p2) and the same defect class (objectui#12622): a placeholder and digit order taken from the machine's locale, not the console's.
Scope, from the fork as measured:
Grid seam: fix the seam contract, not the widget, as the dev's four axes favour. A picker that silently drops a typed day is the tolerance to avoid. A renderCellEditor blur slot is a DataTableSchema contract change, so the claim declares Clause-②.
Filters: the claim picks where the picker lives so that @object-ui/components and plugin-view reach it without a cycle (an export from @object-ui/fields, or the face moved down a layer). A new export is a public-surface change, declared on the claim.
If the two halves land better in two PRs, the claimant files the second as its own card (the self-split rule).
Not this card: objectui#12642 item 3 (whether DatePicker retires at the next major) is on the maintainer's list. This card fixes the surfaces and does not decide that.
Claim: PM loop round 3 (priority:p2; half 1 of triage's scope 6216283515, the grid cell seam. Half 2, the filters, is split to objectui#12743 per triage's self-split rule)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12664-grid-date-picker
Worktree: objectui-issue-12664
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/components/src/renderers/complex/data-table.tsx (the inline-edit seam: renderCellEditor, the pointerdown capture and the Enter → saveEdit path); packages/types/src/data-display.ts and packages/types/src/zod/data-display.zod.ts (the renderCellEditor context contract, only if the seam gains a slot); packages/fields/src/FieldEditWidget.tsx and packages/fields/src/widgets/date-picker/ (the date / datetime entries and the picker's commit hook); packages/plugin-grid/src/ObjectGrid.tsx only where it builds the cell editor context; tests beside each; one .changeset/12664-*.md (stop on breach; explain in the report). ⛔ Not the filter rows (objectui#12743).
Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate for these paths)
Clause-②: yes (provisional: triage names a renderCellEditor blur/commit slot as a DataTableSchema contract change; the dev reports the measured shape, and a contract-tier review is owed before the queue)
Responsibility: objectui: FieldEditWidget's date / datetime entries draw the native input, because the grid seam assumes an injected widget stages on every change, and the platform picker commits on blur | the platform picker already used on record forms and dialogs (objectui#12622, #12642) | every grid with an inline-editable date / datetime column, the record details inline editor and the kanban required-fields dialog (measured at claim)
Thread-read: 6216283515
Serial constraints cleared: scanned every open objectui PR's file list just now. None touches data-table.tsx, FieldEditWidget.tsx, ObjectGrid.tsx, the date-picker/ widgets or renderCellEditor. This seat's in-flight objectui#12700 part 2 (PR #12740) touches apps/console routing and HomeLayout.tsx only, so it is disjoint.
Claimed at: 2026-10-16T17:22Z
{
"issue": 12664,
"status": "done",
"branch": "claude/issue-12664-grid-date-picker",
"pr": "https://github.com/objectstack-ai/objectui/pull/12756",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB (mode:subagent, the parent's id)",
"premise_still_valid": true,
"summary": "Dispatch order read in full, md5 9642fd0bff31272111c6852a96975971; newest Claim (6220951034) names this branch. FieldEditWidget now maps date / datetime to the platform picker through React.lazy with the same import() specifier fieldWidgetMap uses, inside its own Suspense whose placeholder holds no input, so the picker stays in the fields-date-picker chunk. The data-table injected-editor seam now blurs the focused control inside the editor before Enter or a click outside commits (flushInjectedEditor), and saveEdit reads a synchronous mirror of editValue (editValueRef), so a widget that reads its input on blur stages first and the commit saves that value; Escape does not blur. A1 is corrected: no context member was needed (the widget's own stage call from its own onBlur is the existing channel), so the claim's Clause-② yes is corrected to no on the PR's second line; only the renderCellEditor doc comment gained a paragraph. Surfaces measured: grid inline editor and kanban required-fields dialog render FieldEditWidget and now draw the picker; the record details inline editor (plugin-detail InlineFieldInput) routes date / datetime to DateField ahead of FieldEditWidget, so its seam differs and it is reported, not wired. ObjectGrid.tsx needed no change.",
"tests": "At 65d216c12 under os-verify-lock (VERDICT command-exit 0), --maxWorkers=1: the eight pin files (plugin-grid inlineEditDatePicker-12664 + inlineEditExitMode, components data-table-injected-editor-blur-commit-12664 + data-table-injected-editor-focus-6859, fields FieldEditWidget.datePicker-12664 + inline-widget-aria-invalid-7126, kanban RequiredFieldsDialog.datePicker-12664 + ariaInvalidText-7126): Test Files 8 passed (8), Tests 46 passed (46). A2 pins on the real ObjectGrid path (data source faked only): picker face not input[type=date]; zh session placeholder YYYY/MM/DD and value 2026/10/01; (a) typed 10/20/2026 + Enter gives Save All sends { due: '2026-10-20' }; (b) typed day + click outside gives same, and a datetime cell 10/20/2026 14:30 sends that local instant; (c) Escape gives no Save All, update not called; (d) CONTROL text cell stages per keystroke with no focus/blur (Save All offered while the editor is open), then commits. (e) kanban dialog draws the picker and submits { due: '2026-10-20' } and the datetime instant; record details inline editor measured as not rendering FieldEditWidget for date. Wider runs at 3fa0a8b3f: targeted fields set (15 files naming FieldEditWidget / the picker / the inline tables) + 2 kanban files: 17 passed, 362 tests; 41 plugin-grid / data-table / plugin-detail / app-shell files driving inline edit or FieldEditWidget: 41 passed, 383 tests; packages/plugin-kanban/ whole dir at 8f3b52452: 70 of 71 files passed, the one red was RequiredFieldsDialog.ariaInvalidText-7126 asserting input[type=date], updated in 3fa0a8b3f to await the lazy picker (assertions on aria-invalid unchanged). Ablation via objectstack scripts/ablation-replace.mjs (through source: vitest.config.mts aliases @object-ui/components and @object-ui/fields to src, no dist step), each restored to blob 8bb8dc070ba0 == HEAD with git diff HEAD empty: blur removed (anchor x1 to x0, blob 8bb8dc070ba0 to 3daa67683343): (b) date and (b) datetime red, (a) green because the picker's own Enter stages, 2 failed | 5 passed; fresh read removed (editValueRef.current gives editValue, blob to 4e8ba952928b): (a), (b) date, (b) datetime red, 3 failed | 4 passed; (c) and (d) green in both legs. NOT MEASURED: whole-package runs of packages/fields (exit 124 at its 560s timeout), packages/components, packages/plugin-grid, packages/plugin-detail — targeted sets declared in their place, CI runs the farm. NOT MEASURED: Bundle Analysis / check:eager-closure, reason: needs a console build that does not fit next to the test runs; the picker is reached only through import().",
"gates": "closure build `pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-grid^...' --filter '@object-ui/plugin-kanban^...' build` exit 0. type-check: @object-ui/types 0, components 0, fields 0, plugin-grid 0, plugin-kanban 0 (tsconfig.test.json --listFilesOnly lists each new test file). eslint --no-inline-config --format json over the 10 changed .ts/.tsx files: exit 1, the single error is react-hooks/static-components in data-table.tsx, present in the BASE blob too; data-table.tsx 1 error / 44 warnings and FieldEditWidget.tsx 0 / 6, both equal to BASE. Pre-tsc battery all exit 0: check:phantom-deps, check:self-import, check:unreferenced-sources, check:doc-example-readers, check:handler-key-reads, check:side-effects-array, check:element-data-source-declaration, check:spec-symbols, check:action-forward-parity, check:designer-field-key-parity, check:icon-record-names, check:i18n-keys, check:i18n-drift, check:i18n-designer-parity, check:control-bytes, check-hand-rolled-comment-mask.mjs. check-changeset-fixed.mjs 0, check-changeset-presence.mjs 0 ('10 source file(s) of 5 released package(s) changed, and this change declares 1 changeset(s)'), check:changeset-claims 0, check-changeset-no-major.mjs 0, check:new-line-citations 0. check:spec-floors not run (not in the derived set). check-governed-queue-guard --test: NOT GOVERNED. CI families: in_progress.",
"files_changed": [
"packages/components/src/renderers/complex/data-table.tsx",
"packages/types/src/data-display.ts",
"packages/fields/src/FieldEditWidget.tsx",
"packages/fields/src/widgets/date-picker/DatePickerField.tsx",
"packages/plugin-grid/src/__tests__/inlineEditDatePicker-12664.test.tsx",
"packages/components/src/__tests__/data-table-injected-editor-blur-commit-12664.test.tsx",
"packages/fields/src/__tests__/FieldEditWidget.datePicker-12664.test.tsx",
"packages/fields/src/__tests__/inline-widget-aria-invalid-7126.test.tsx",
"packages/plugin-kanban/src/__tests__/RequiredFieldsDialog.datePicker-12664.test.tsx",
"packages/plugin-kanban/src/__tests__/RequiredFieldsDialog.ariaInvalidText-7126.test.tsx",
".changeset/12664-grid-date-picker.md"
],
"line_budget": "n/a: no skills/** or governed file touched",
"deviations": "1) Clause-② corrected from the claim's provisional yes to no, per A1's own instruction (existing seam carries it); stated on the PR's second line. 2) packages/zod/data-display.zod.ts and ObjectGrid.tsx were in the surface but needed no edit. 3) Two existing pins outside the named new tests were edited (fields inline-widget-aria-invalid-7126, kanban RequiredFieldsDialog.ariaInvalidText-7126): both sit beside touched sites and only await the lazy widget / select the picker's box. 4) Lint ran as eslint on the changed files, not pnpm lint (turbo). 5) The install log went to the scratchpad root before the issue-12664/ subdirectory existed. 6) Zero label writes: objectui and no label named in the dispatch.",
"mcp_calls": "0 — no MCP tool used; all GitHub reads by gh api REST",
"api_writes": "3 — POST repos/objectstack-ai/objectui/pulls (draft PR #12756), POST repos/objectstack-ai/objectui/issues/12756/assignees (baozhoutao), POST repos/objectstack-ai/objectui/issues/12664/comments (this report); each through objectstack scripts/pm/write-pace.mjs --run. Plus 4 git pushes (empty-branch probe, 8f3b52452, 3fa0a8b3f, 65d216c12).",
"open_questions": [
{
"question": "Does the seat accept Clause-② no (no renderCellEditor member added; the documented behaviour now says the table blurs the focused control before Enter / click-outside commits)?",
"options": [
"A. Accept no: the context type is byte-identical (exact Equal pin green), zod unchanged; the seam's behaviour is table-internal plus one doc paragraph.",
"B. Treat the documented blur-before-commit behaviour as a contract change and run a contract-tier review anyway."
],
"recommendation": "A. Business need: the real surfaces (grid cells, kanban dialog) are served without a new member. Long-term soundness: one channel (stage) stays the only way a value reaches the table; no second callback for hosts to forget. AI-error resistance: nothing new to declare or wire, so nothing an author can declare and leave unhonoured. Startup scope: no surface expansion. B costs a review round for a type shape that did not move."
}
],
"out_of_scope_findings": [
"carrier: seat (domain:ui) · noted, not filed: the record details inline editor (plugin-detail InlineFieldInput) routes date / datetime to DateField ahead of FieldEditWidget and keeps the native input, and its datetime arm edits a date-only control and writes local midnight (code read, not measured through a public door). Moving it to the picker changes what a datetime edit writes, so it needs its own card. Dedupe words: record detail inline date picker native input, InlineFieldInput datetime local midnight, detail inline editor locale placeholder",
"carrier: seat · noted, not filed: the still-pending .changeset/12642-*.md says the inline editors keep the native input; false after PR #12756, whose changeset states the new behaviour.",
"carrier: seat · noted, not filed: an unparsable typed text (e.g. 02/30/2026) on Enter / click outside in a grid cell is refused by the picker and the cell closes on its previous value; nothing wrong is written, but the text and the notice are not kept as they are on a form."
]
}
PR #12756 merged through the merge queue as d66d7e8, which is on main. Verified by content: all 13 of the PR's files on origin/main are blob-identical to the accepted head 74d831b. The squash commit's message names no model.
What landed:
The grid's inline cell editor and the kanban required-fields dialog draw date / datetime with the platform picker, its placeholder in the console locale and its code in the lazy fields-date-picker chunk.
The data table blurs the focused control inside an injected editor before Enter or a click outside commits. A widget that reads its input on blur therefore stages first, and the typed day is saved. Escape still discards.
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: first grade,
bug·priority:p2·domain:ui·area:records·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T13:13ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
renderCellEditorblur slot is aDataTableSchemacontract change, so the claim declaresClause-②.@object-ui/componentsandplugin-viewreach it without a cycle (an export from@object-ui/fields, or the face moved down a layer). A new export is a public-surface change, declared on the claim.DatePickerretires at the next major) is on the maintainer's list. This card fixes the surfaces and does not decide that.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 3 (
priority:p2; half 1 of triage's scope6216283515, the grid cell seam. Half 2, the filters, is split to objectui#12743 per triage's self-split rule)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12664-grid-date-pickerWorktree:
objectui-issue-12664Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/components/src/renderers/complex/data-table.tsx(the inline-edit seam:renderCellEditor, the pointerdown capture and the Enter →saveEditpath);packages/types/src/data-display.tsandpackages/types/src/zod/data-display.zod.ts(therenderCellEditorcontext contract, only if the seam gains a slot);packages/fields/src/FieldEditWidget.tsxandpackages/fields/src/widgets/date-picker/(the date / datetime entries and the picker's commit hook);packages/plugin-grid/src/ObjectGrid.tsxonly where it builds the cell editor context; tests beside each; one.changeset/12664-*.md(stop on breach; explain in the report). ⛔ Not the filter rows (objectui#12743).Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate for these paths)Clause-②: yes (provisional: triage names a
renderCellEditorblur/commit slot as aDataTableSchemacontract change; the dev reports the measured shape, and a contract-tier review is owed before the queue)Responsibility:
objectui: FieldEditWidget's date / datetime entries draw the native input, because the grid seam assumes an injected widget stages on every change, and the platform picker commits on blur | the platform picker already used on record forms and dialogs (objectui#12622, #12642) | every grid with an inline-editable date / datetime column, the record details inline editor and the kanban required-fields dialog (measured at claim)Thread-read: 6216283515
Serial constraints cleared: scanned every open objectui PR's file list just now. None touches
data-table.tsx,FieldEditWidget.tsx,ObjectGrid.tsx, thedate-picker/widgets orrenderCellEditor. This seat's in-flight objectui#12700 part 2 (PR #12740) touchesapps/consolerouting andHomeLayout.tsxonly, so it is disjoint.Claimed at: 2026-10-16T17:22Z
baozhoutao commentedon Oct 16, 2026
os-dev-report
{ "issue": 12664, "status": "done", "branch": "claude/issue-12664-grid-date-picker", "pr": "https://github.com/objectstack-ai/objectui/pull/12756", "session": "session_01XVp19E1MYUTFM3dnkwz8gB (mode:subagent, the parent's id)", "premise_still_valid": true, "summary": "Dispatch order read in full, md5 9642fd0bff31272111c6852a96975971; newest Claim (6220951034) names this branch. FieldEditWidget now maps date / datetime to the platform picker through React.lazy with the same import() specifier fieldWidgetMap uses, inside its own Suspense whose placeholder holds no input, so the picker stays in the fields-date-picker chunk. The data-table injected-editor seam now blurs the focused control inside the editor before Enter or a click outside commits (flushInjectedEditor), and saveEdit reads a synchronous mirror of editValue (editValueRef), so a widget that reads its input on blur stages first and the commit saves that value; Escape does not blur. A1 is corrected: no context member was needed (the widget's own stage call from its own onBlur is the existing channel), so the claim's Clause-② yes is corrected to no on the PR's second line; only the renderCellEditor doc comment gained a paragraph. Surfaces measured: grid inline editor and kanban required-fields dialog render FieldEditWidget and now draw the picker; the record details inline editor (plugin-detail InlineFieldInput) routes date / datetime to DateField ahead of FieldEditWidget, so its seam differs and it is reported, not wired. ObjectGrid.tsx needed no change.", "tests": "At 65d216c12 under os-verify-lock (VERDICT command-exit 0), --maxWorkers=1: the eight pin files (plugin-grid inlineEditDatePicker-12664 + inlineEditExitMode, components data-table-injected-editor-blur-commit-12664 + data-table-injected-editor-focus-6859, fields FieldEditWidget.datePicker-12664 + inline-widget-aria-invalid-7126, kanban RequiredFieldsDialog.datePicker-12664 + ariaInvalidText-7126): Test Files 8 passed (8), Tests 46 passed (46). A2 pins on the real ObjectGrid path (data source faked only): picker face not input[type=date]; zh session placeholder YYYY/MM/DD and value 2026/10/01; (a) typed 10/20/2026 + Enter gives Save All sends { due: '2026-10-20' }; (b) typed day + click outside gives same, and a datetime cell 10/20/2026 14:30 sends that local instant; (c) Escape gives no Save All, update not called; (d) CONTROL text cell stages per keystroke with no focus/blur (Save All offered while the editor is open), then commits. (e) kanban dialog draws the picker and submits { due: '2026-10-20' } and the datetime instant; record details inline editor measured as not rendering FieldEditWidget for date. Wider runs at 3fa0a8b3f: targeted fields set (15 files naming FieldEditWidget / the picker / the inline tables) + 2 kanban files: 17 passed, 362 tests; 41 plugin-grid / data-table / plugin-detail / app-shell files driving inline edit or FieldEditWidget: 41 passed, 383 tests; packages/plugin-kanban/ whole dir at 8f3b52452: 70 of 71 files passed, the one red was RequiredFieldsDialog.ariaInvalidText-7126 asserting input[type=date], updated in 3fa0a8b3f to await the lazy picker (assertions on aria-invalid unchanged). Ablation via objectstack scripts/ablation-replace.mjs (through source: vitest.config.mts aliases @object-ui/components and @object-ui/fields to src, no dist step), each restored to blob 8bb8dc070ba0 == HEAD with git diff HEAD empty: blur removed (anchor x1 to x0, blob 8bb8dc070ba0 to 3daa67683343): (b) date and (b) datetime red, (a) green because the picker's own Enter stages, 2 failed | 5 passed; fresh read removed (editValueRef.current gives editValue, blob to 4e8ba952928b): (a), (b) date, (b) datetime red, 3 failed | 4 passed; (c) and (d) green in both legs. NOT MEASURED: whole-package runs of packages/fields (exit 124 at its 560s timeout), packages/components, packages/plugin-grid, packages/plugin-detail — targeted sets declared in their place, CI runs the farm. NOT MEASURED: Bundle Analysis / check:eager-closure, reason: needs a console build that does not fit next to the test runs; the picker is reached only through import().", "gates": "closure build `pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-grid^...' --filter '@object-ui/plugin-kanban^...' build` exit 0. type-check: @object-ui/types 0, components 0, fields 0, plugin-grid 0, plugin-kanban 0 (tsconfig.test.json --listFilesOnly lists each new test file). eslint --no-inline-config --format json over the 10 changed .ts/.tsx files: exit 1, the single error is react-hooks/static-components in data-table.tsx, present in the BASE blob too; data-table.tsx 1 error / 44 warnings and FieldEditWidget.tsx 0 / 6, both equal to BASE. Pre-tsc battery all exit 0: check:phantom-deps, check:self-import, check:unreferenced-sources, check:doc-example-readers, check:handler-key-reads, check:side-effects-array, check:element-data-source-declaration, check:spec-symbols, check:action-forward-parity, check:designer-field-key-parity, check:icon-record-names, check:i18n-keys, check:i18n-drift, check:i18n-designer-parity, check:control-bytes, check-hand-rolled-comment-mask.mjs. check-changeset-fixed.mjs 0, check-changeset-presence.mjs 0 ('10 source file(s) of 5 released package(s) changed, and this change declares 1 changeset(s)'), check:changeset-claims 0, check-changeset-no-major.mjs 0, check:new-line-citations 0. check:spec-floors not run (not in the derived set). check-governed-queue-guard --test: NOT GOVERNED. CI families: in_progress.", "files_changed": [ "packages/components/src/renderers/complex/data-table.tsx", "packages/types/src/data-display.ts", "packages/fields/src/FieldEditWidget.tsx", "packages/fields/src/widgets/date-picker/DatePickerField.tsx", "packages/plugin-grid/src/__tests__/inlineEditDatePicker-12664.test.tsx", "packages/components/src/__tests__/data-table-injected-editor-blur-commit-12664.test.tsx", "packages/fields/src/__tests__/FieldEditWidget.datePicker-12664.test.tsx", "packages/fields/src/__tests__/inline-widget-aria-invalid-7126.test.tsx", "packages/plugin-kanban/src/__tests__/RequiredFieldsDialog.datePicker-12664.test.tsx", "packages/plugin-kanban/src/__tests__/RequiredFieldsDialog.ariaInvalidText-7126.test.tsx", ".changeset/12664-grid-date-picker.md" ], "line_budget": "n/a: no skills/** or governed file touched", "deviations": "1) Clause-② corrected from the claim's provisional yes to no, per A1's own instruction (existing seam carries it); stated on the PR's second line. 2) packages/zod/data-display.zod.ts and ObjectGrid.tsx were in the surface but needed no edit. 3) Two existing pins outside the named new tests were edited (fields inline-widget-aria-invalid-7126, kanban RequiredFieldsDialog.ariaInvalidText-7126): both sit beside touched sites and only await the lazy widget / select the picker's box. 4) Lint ran as eslint on the changed files, not pnpm lint (turbo). 5) The install log went to the scratchpad root before the issue-12664/ subdirectory existed. 6) Zero label writes: objectui and no label named in the dispatch.", "mcp_calls": "0 — no MCP tool used; all GitHub reads by gh api REST", "api_writes": "3 — POST repos/objectstack-ai/objectui/pulls (draft PR #12756), POST repos/objectstack-ai/objectui/issues/12756/assignees (baozhoutao), POST repos/objectstack-ai/objectui/issues/12664/comments (this report); each through objectstack scripts/pm/write-pace.mjs --run. Plus 4 git pushes (empty-branch probe, 8f3b52452, 3fa0a8b3f, 65d216c12).", "open_questions": [ { "question": "Does the seat accept Clause-② no (no renderCellEditor member added; the documented behaviour now says the table blurs the focused control before Enter / click-outside commits)?", "options": [ "A. Accept no: the context type is byte-identical (exact Equal pin green), zod unchanged; the seam's behaviour is table-internal plus one doc paragraph.", "B. Treat the documented blur-before-commit behaviour as a contract change and run a contract-tier review anyway." ], "recommendation": "A. Business need: the real surfaces (grid cells, kanban dialog) are served without a new member. Long-term soundness: one channel (stage) stays the only way a value reaches the table; no second callback for hosts to forget. AI-error resistance: nothing new to declare or wire, so nothing an author can declare and leave unhonoured. Startup scope: no surface expansion. B costs a review round for a type shape that did not move." } ], "out_of_scope_findings": [ "carrier: seat (domain:ui) · noted, not filed: the record details inline editor (plugin-detail InlineFieldInput) routes date / datetime to DateField ahead of FieldEditWidget and keeps the native input, and its datetime arm edits a date-only control and writes local midnight (code read, not measured through a public door). Moving it to the picker changes what a datetime edit writes, so it needs its own card. Dedupe words: record detail inline date picker native input, InlineFieldInput datetime local midnight, detail inline editor locale placeholder", "carrier: seat · noted, not filed: the still-pending .changeset/12642-*.md says the inline editors keep the native input; false after PR #12756, whose changeset states the new behaviour.", "carrier: seat · noted, not filed: an unparsable typed text (e.g. 02/30/2026) on Enter / click outside in a grid cell is refused by the picker and the cell closes on its previous value; nothing wrong is written, but the text and the notice are not kept as they are on a form." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-16T19:03ZPR #12756 merged through the merge queue as
d66d7e8, which is onmain. Verified by content: all 13 of the PR's files onorigin/mainare blob-identical to the accepted head74d831b. The squash commit's message names no model.What landed:
date/datetimewith the platform picker, its placeholder in the console locale and its code in the lazyfields-date-pickerchunk.FieldEditWidgetas keeping the native input.Left open on purpose:
datetimeedit, which drops its time: objectui#12759.pm:dispatchedleaves with this note. The card closedcompletedon merge.Generated by Claude Code