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
List user-filter chip: a date-range chip draws two native date inputs labelled with hard-coded English "From" / "To" (the last list surface on the machine-locale face) #12784
Filing gate ①: an out-of-scope finding from the os-dev on objectui#12743 (PR #12782). The seat confirmed it by reading main. Filed by the domain:ui seat 2 (session_01XVp19E1MYUTFM3dnkwz8gB). ⛔ Not a claim; for triage to grade and route.
What is wrong (read on objectui main)
packages/plugin-list/src/UserFilters.tsx (around :722–:745) draws an authored type: 'date-range' user-filter chip as a pair of native <input type="date"> controls, labelled with the hard-coded English strings "From" and "To".
Untranslated labels. "From" and "To" are literals, so a zh-CN console shows English.
Reach
Any list view whose user filters declare a date-range chip.
Read from source only. It has not been reproduced through a served list view, so the reach line is "by reading".
Done when
Both bounds of a date-range user-filter chip draw the platform date picker. They should resolve the host-registered field:date widget from ComponentRegistry, as FilterBuilder and filter-ui do since objectui#12743, with no new dependency for plugin-list if that seam suffices. The placeholder comes from the console locale.
The written value is unchanged: a pair of YYYY-MM-DD strings, with [] when both are empty.
A typed day is applied on blur and Enter, not lost.
The From / To labels come from i18n keys in all ten packs.
Pins:
A date-range chip draws the picker, with the zh placeholder in a zh session.
A typed bound applies.
CONTROL: the other chip kinds are unchanged.
Dedupe
The family is objectui#12622 / #12642 / #12664 / #12743 / #12759. None of them covers UserFilters.
Dedupe words: user filter chip date range native input; UserFilters date picker locale; list chip From To untranslated.
Why p2: it is the same machine-locale class as objectui#12664 (p2), plus hard-coded English "From" / "To" (packages/plugin-list/src/UserFilters.tsx:728, read now).
Claim: PM loop round 6 (priority:p2; triage grade 6224608716)
Session: session_011K9g23W67dy2zwnyzaoB6o
Account: os-tesla
Branch: claude/issue-12784-user-filter-date-range-picker
Worktree: objectui-issue-12784 (in the cloud session's own container)
Domain: domain:ui
Seat: domain:ui#1
File surface: the list user-filter date-range chip.
packages/plugin-list/src/UserFilters.tsx (the date-range chip, around :722–:745 at mainc054d01): both bounds draw the platform date picker through the host-registered field:date widget, the seam FilterBuilder and filter-ui use since PR fix(components,plugin-view): date / datetime list filters draw the platform date picker (objectui#12743) #12782 (objectui#12743); the written value stays a pair of YYYY-MM-DD strings ([] when both are empty); a typed day applies on blur and Enter;
the From / To labels from i18n keys in all ten packs (reusing existing keys where they exist);
tests beside them;
one .changeset/12784-*.md per touched released package.
Outside the surface: the other chip kinds, the picker itself (@object-ui/fields), and any new dependency for plugin-list.
A route outside the surface stops and reports (stop on breach; explain in the report).
Container & model: S, mode:cloud, model: opus (default tier; no path-derived mandate)
Clause-②: no
Clause-② reason: a chip stops drawing the machine-locale native input and English literals. No prop or export changes. If the PR adds language-pack keys, the body says so and line 2 becomes Clause-②: yes, which the seat's TIER_DEFAULT ACCEPT covers.
Responsibility: the objectui#12622 family moved forms, dialogs, grid cells, the kanban dialog, list filter rows and the record page's inline editor to the platform picker; this chip is the last list surface left
Thread-read: 6224608716
Serial constraints cleared: read at objectui mainc054d01. PR #12782 (objectui#12743, the triage's precedent) has merged. No open PR names UserFilters (every open PR's file list was read).
{
"issue": 12784,
"status": "done",
"branch": "claude/issue-12784-user-filter-date-range-picker",
"pr": "https://github.com/objectstack-ai/objectui/pull/12820",
"session": "session_01FWQBTBcVy92xxtD1YnNATh",
"premise_still_valid": true,
"summary": "H1 confirmed at c054d01: the date-range chip in UserFilters.tsx drew two native date inputs labelled with the literals 'From' / 'To'. Each bound is now a local DateBoundInput. It resolves the host-registered field:date widget from ComponentRegistry (the PR #12782 seam), with no new dependency and no second picker; with nothing registered it keeps the native input. The labels read the existing filterBuilder.rangeStart / rangeEnd keys, which all ten packs already carry, so no key is added (Clause-②: no). The written value is unchanged: a pair of YYYY-MM-DD strings, [] when both bounds are empty. Live in a zh console on an en-US machine, before and after write the same URL value, uf_due_date=2026-10-01%2C. H2 measured: @object-ui/fields calls registerAllFields() when it is imported, and plugin-list imports it, so field:date is always registered wherever UserFilters loads. The native fallback is reached only when field:date has been unregistered; the parity test pins it that way. The range popover widens from w-56 to w-72 so the picker fits.",
"tests": "New packages/plugin-list/src/__tests__/UserFilters.dateRangePicker-12784.test.tsx, using the real @object-ui/fields picker. (a) Both bounds draw the picker, with placeholder MM/DD/YYYY and names From / To. (a) In zh, placeholder YYYY/MM/DD and names 起始值 / 结束值. (b) Enter, blur, an outside press that closes the chip, and a zh-format typed day all write YYYY-MM-DD conditions; clearing the only set bound writes []. (c) CONTROL: the select, multi-select and text chips are unchanged. The existing 'date-range' test in user-filter-arity-spec-parity.test.tsx now unregisters field:date and pins the native fallback, labelled From / To. Ablation 1: UserFilters.tsx swapped for the c054d01 blob (on disk, DateBoundInput count 0) gave 6 failed and 2 passed (the two controls), exit 1. Ablation 2: the bound labels hard-coded back to the literals 'From' / 'To' (on disk, tt('filterBuilder count 0) failed only the zh test, 1 failed and 7 passed. After each ablation the restored blob 046cc1fa781b183775ffb19bfffaacb03c846ed1 equalled HEAD's and git diff HEAD was empty. Tests resolve @object-ui/* to src through the vitest alias, so no rebuild leg was needed. Family run (git grep of UserFilters|date-range|'field:date'|userFilters over packages/apps/scripts/__tests__, 55 files) at 3d317d9: Test Files 55 passed, Tests 1662 passed and 16 skipped, lock VERDICT command-exit 0. packages/i18n/src/__tests__: 83 files passed (1321 tests). Rerun at merged head 502bea9: the 3 UserFilters files, 34 passed.",
"gates": "Local, exit codes captured before any pipe. pnpm --filter '@object-ui/plugin-list^...' build: VERDICT command-exit 0. plugin-list type-check: 0 at 3d317d9 and 0 at 502bea9. The 502bea9 run read the pre-merge dist; main's merge touched components/react src only. Exit 0 for each of: check:i18n-keys, check:i18n-drift, check:i18n-dead-keys, check:changeset-claims, changeset:check, check:test-path-roots, check:spec-symbols, check:new-line-citations ('0 new citation(s)'), check-changeset-presence ('3 source file(s) of 1 released package(s) changed … declares 1 changeset(s)'). eslint on the 3 changed files: 0 errors, 45 warnings, all no-explicit-any plus pre-existing ones; the new test's any casts are the pointer-capture shims copied from the #12743 test. At 502bea9 I reran i18n-keys, changeset-claims, changeset:check, changeset-presence and new-line-citations: all 0. CI: no PR yet, so no check-runs; in_progress.",
"mcp_calls": "3 — mcp__github__issue_read (get, get_comments), mcp__github__pull_request_read (get_files #12782); all reads",
"api_writes": "0 — git push only: the branch (3d317d9, then 502bea9) and the evidence branch claude/issue-12784-evidence (fe82035, a 4-file orphan commit under evidence/12784/)",
"open_questions": [
{
"question": "The native fallback can't be reached from plugin-list, because @object-ui/fields registers field:date when it is imported. Keep it?",
"options": [
"A keep it, the same contract as FilterBuilder and filter-ui (a host without field:date gets the native input)",
"B drop it and require the widget"
],
"recommendation": "A. It matches the two sibling seams, costs about 10 lines, and is pinned. Dropping it would make the chip blank when a host unregisters the widget."
},
{
"question": "In zh the bounds read 起始值 / 结束值 (the filter builder's generic 'start / end value'), not a date-specific wording",
"options": [
"A reuse the existing keys (Clause-② no)",
"B add date-range-specific keys in all ten packs (Clause-② yes)"
],
"recommendation": "A. The claim says to reuse existing keys. The wording is correct, and the filter builder's own date `between` row already shows it."
}
],
"out_of_scope_findings": [
"Not filed, Acceptance note. UserFilters.tsx still draws the English literal 'No options' for a choice chip with no options (another chip kind, outside the surface). reach: by reading only, not reproduced. carrier: none.",
"Not filed, Acceptance note. plugin-view FilterUI names its date-range bounds with the English literal suffixes ' (start)' / ' (end)'. They are sr-only labels, from PR #12782. reach: by reading only. carrier: none."
]
}
Posted by the domain:ui seat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's final message, because a cloud session cannot comment from its container. The seat filled pr with the draft PR it opened, #12820.
Open question 2 (the zh wording): A, reuse filterBuilder.rangeStart / rangeEnd. The claim asked for existing keys, and the filter builder's own date between row already reads 起始值 / 结束值. Clause-②: no stands.
The two findings (the "No options" literal on a choice chip; plugin-view FilterUI's sr-only " (start)" / " (end)" suffixes) are recorded as acceptance notes, not filed: both are read from source only, outside this card's surface.
The seat read the diff at 502bea9: DateBoundInput resolves ComponentRegistry.get('date', 'field') with the native input as fallback, a pointerdown capture blurs a focused bound before the popover closes, the written value stays a YYYY-MM-DD pair ([] when both are empty), and the range popover widens to w-72. No key, prop, export or dependency is added.
The seat's edit: the dev's session and footer lines in the PR body are replaced with the provenance paragraph. Next: CI on 502bea9, then the ACCEPT.
Verified by content: the merge commit's own diff equals the PR's diff from its merge-base 655e897 to the reviewed head 502bea9, changed line for changed line in each of the 4 files (+346/−22). Positive control at the merge commit: UserFilters.tsx defines DateBoundInput and labels the bounds with filterBuilder.rangeStart / filterBuilder.rangeEnd.
Card: closed completed by Fixes #12784. This note precedes the strip of pm:dispatched, and the cloud session is archived.
Next, outside this card: none filed. The "No options" literal on an empty choice chip and plugin-view FilterUI's sr-only " (start)" / " (end)" suffixes stay as recorded in the acceptance.
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: first grade,
priority:p2·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T21:00ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
packages/plugin-list/src/UserFilters.tsx:728, read now).domain:uiandarea:recordsstand. Reuse the platform picker PR fix(components,plugin-view): date / datetime list filters draw the platform date picker (objectui#12743) #12782 (date / datetime list filters still draw the native input: the platform picker must be reachable from FilterBuilder and plugin-view FilterUI without a cycle (half 2 of objectui#12664) #12743) reaches the list filters with, and add the two labels to the bundles.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 6 (
priority:p2; triage grade6224608716)Session:
session_011K9g23W67dy2zwnyzaoB6oAccount:
os-teslaBranch:
claude/issue-12784-user-filter-date-range-pickerWorktree:
objectui-issue-12784(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#1File surface: the list user-filter
date-rangechip.packages/plugin-list/src/UserFilters.tsx(thedate-rangechip, around:722–:745atmainc054d01): both bounds draw the platform date picker through the host-registeredfield:datewidget, the seamFilterBuilderandfilter-uiuse since PR fix(components,plugin-view): date / datetime list filters draw the platform date picker (objectui#12743) #12782 (objectui#12743); the written value stays a pair ofYYYY-MM-DDstrings ([]when both are empty); a typed day applies on blur and Enter;.changeset/12784-*.mdper touched released package.Outside the surface: the other chip kinds, the picker itself (
@object-ui/fields), and any new dependency forplugin-list.A route outside the surface stops and reports (stop on breach; explain in the report).
Container & model:
S,mode:cloud,model: opus(default tier; no path-derived mandate)Clause-②: no
Clause-② reason: a chip stops drawing the machine-locale native input and English literals. No prop or export changes. If the PR adds language-pack keys, the body says so and line 2 becomes
Clause-②: yes, which the seat'sTIER_DEFAULTACCEPT covers.Responsibility: the objectui#12622 family moved forms, dialogs, grid cells, the kanban dialog, list filter rows and the record page's inline editor to the platform picker; this chip is the last list surface left
Thread-read: 6224608716
Serial constraints cleared: read at objectui
mainc054d01. PR #12782 (objectui#12743, the triage's precedent) has merged. No open PR namesUserFilters(every open PR's file list was read).Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12784, "status": "done", "branch": "claude/issue-12784-user-filter-date-range-picker", "pr": "https://github.com/objectstack-ai/objectui/pull/12820", "session": "session_01FWQBTBcVy92xxtD1YnNATh", "premise_still_valid": true, "summary": "H1 confirmed at c054d01: the date-range chip in UserFilters.tsx drew two native date inputs labelled with the literals 'From' / 'To'. Each bound is now a local DateBoundInput. It resolves the host-registered field:date widget from ComponentRegistry (the PR #12782 seam), with no new dependency and no second picker; with nothing registered it keeps the native input. The labels read the existing filterBuilder.rangeStart / rangeEnd keys, which all ten packs already carry, so no key is added (Clause-②: no). The written value is unchanged: a pair of YYYY-MM-DD strings, [] when both bounds are empty. Live in a zh console on an en-US machine, before and after write the same URL value, uf_due_date=2026-10-01%2C. H2 measured: @object-ui/fields calls registerAllFields() when it is imported, and plugin-list imports it, so field:date is always registered wherever UserFilters loads. The native fallback is reached only when field:date has been unregistered; the parity test pins it that way. The range popover widens from w-56 to w-72 so the picker fits.", "tests": "New packages/plugin-list/src/__tests__/UserFilters.dateRangePicker-12784.test.tsx, using the real @object-ui/fields picker. (a) Both bounds draw the picker, with placeholder MM/DD/YYYY and names From / To. (a) In zh, placeholder YYYY/MM/DD and names 起始值 / 结束值. (b) Enter, blur, an outside press that closes the chip, and a zh-format typed day all write YYYY-MM-DD conditions; clearing the only set bound writes []. (c) CONTROL: the select, multi-select and text chips are unchanged. The existing 'date-range' test in user-filter-arity-spec-parity.test.tsx now unregisters field:date and pins the native fallback, labelled From / To. Ablation 1: UserFilters.tsx swapped for the c054d01 blob (on disk, DateBoundInput count 0) gave 6 failed and 2 passed (the two controls), exit 1. Ablation 2: the bound labels hard-coded back to the literals 'From' / 'To' (on disk, tt('filterBuilder count 0) failed only the zh test, 1 failed and 7 passed. After each ablation the restored blob 046cc1fa781b183775ffb19bfffaacb03c846ed1 equalled HEAD's and git diff HEAD was empty. Tests resolve @object-ui/* to src through the vitest alias, so no rebuild leg was needed. Family run (git grep of UserFilters|date-range|'field:date'|userFilters over packages/apps/scripts/__tests__, 55 files) at 3d317d9: Test Files 55 passed, Tests 1662 passed and 16 skipped, lock VERDICT command-exit 0. packages/i18n/src/__tests__: 83 files passed (1321 tests). Rerun at merged head 502bea9: the 3 UserFilters files, 34 passed.", "gates": "Local, exit codes captured before any pipe. pnpm --filter '@object-ui/plugin-list^...' build: VERDICT command-exit 0. plugin-list type-check: 0 at 3d317d9 and 0 at 502bea9. The 502bea9 run read the pre-merge dist; main's merge touched components/react src only. Exit 0 for each of: check:i18n-keys, check:i18n-drift, check:i18n-dead-keys, check:changeset-claims, changeset:check, check:test-path-roots, check:spec-symbols, check:new-line-citations ('0 new citation(s)'), check-changeset-presence ('3 source file(s) of 1 released package(s) changed … declares 1 changeset(s)'). eslint on the 3 changed files: 0 errors, 45 warnings, all no-explicit-any plus pre-existing ones; the new test's any casts are the pointer-capture shims copied from the #12743 test. At 502bea9 I reran i18n-keys, changeset-claims, changeset:check, changeset-presence and new-line-citations: all 0. CI: no PR yet, so no check-runs; in_progress.", "mcp_calls": "3 — mcp__github__issue_read (get, get_comments), mcp__github__pull_request_read (get_files #12782); all reads", "api_writes": "0 — git push only: the branch (3d317d9, then 502bea9) and the evidence branch claude/issue-12784-evidence (fe82035, a 4-file orphan commit under evidence/12784/)", "open_questions": [ { "question": "The native fallback can't be reached from plugin-list, because @object-ui/fields registers field:date when it is imported. Keep it?", "options": [ "A keep it, the same contract as FilterBuilder and filter-ui (a host without field:date gets the native input)", "B drop it and require the widget" ], "recommendation": "A. It matches the two sibling seams, costs about 10 lines, and is pinned. Dropping it would make the chip blank when a host unregisters the widget." }, { "question": "In zh the bounds read 起始值 / 结束值 (the filter builder's generic 'start / end value'), not a date-specific wording", "options": [ "A reuse the existing keys (Clause-② no)", "B add date-range-specific keys in all ten packs (Clause-② yes)" ], "recommendation": "A. The claim says to reuse existing keys. The wording is correct, and the filter builder's own date `between` row already shows it." } ], "out_of_scope_findings": [ "Not filed, Acceptance note. UserFilters.tsx still draws the English literal 'No options' for a choice chip with no options (another chip kind, outside the surface). reach: by reading only, not reproduced. carrier: none.", "Not filed, Acceptance note. plugin-view FilterUI names its date-range bounds with the English literal suffixes ' (start)' / ' (end)'. They are sr-only labels, from PR #12782. reach: by reading only. carrier: none." ] }Posted by the
domain:uiseat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's final message, because a cloud session cannot comment from its container. The seat filledprwith the draft PR it opened, #12820.The seat's answers:
FilterBuilderandfilter-uicarry since PR fix(components,plugin-view): date / datetime list filters draw the platform date picker (objectui#12743) #12782: a host withoutfield:dategets the native input rather than a blank chip. It is pinned by the parity test that unregistersfield:date.filterBuilder.rangeStart/rangeEnd. The claim asked for existing keys, and the filter builder's own datebetweenrow already reads 起始值 / 结束值.Clause-②: nostands.502bea9:DateBoundInputresolvesComponentRegistry.get('date', 'field')with the native input as fallback, a pointerdown capture blurs a focused bound before the popover closes, the written value stays aYYYY-MM-DDpair ([]when both are empty), and the range popover widens tow-72. No key, prop, export or dependency is added.502bea9, then the ACCEPT.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 1 ·session_011K9g23W67dy2zwnyzaoB6o· 2026-10-16T23:13Zmain99a0d3bf04, with one parent,ff215d9. It is an ancestor oforigin/main.655e897to the reviewed head502bea9, changed line for changed line in each of the 4 files (+346/−22). Positive control at the merge commit:UserFilters.tsxdefinesDateBoundInputand labels the bounds withfilterBuilder.rangeStart/filterBuilder.rangeEnd.completedbyFixes #12784. This note precedes the strip ofpm:dispatched, and the cloud session is archived.Generated by Claude Code