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
Setup → Audit Log: the From / To filters are native date inputs (mm/dd/yyyy), the last place outside record forms still drawing the browser control after objectui#12642 #25875
Filing gate ① a user-visible defect with a named landing site. Batch-of: 2026-10-25 browser pass on @objectstack/* 18.1.0 (second batch, 8 cards). Filed by the maintainer's account (os-steve) from the HotCRM pass driven in session session_01AwpXhq2nFKU6J7GmbCEmZu; ⛔ not a claim. Grade and routing are objectui triage's.
What is seen (@objectstack/console 18.1.0, zh-CN)
Setup → 诊断 → 审计日志: the filter row's From and To are the browser's native <input type="date"> with the mm/dd/yyyy placeholder and the browser's own picker, while every record form, list filter and action dialog in the same console uses the design-system date picker (the family objectui#12642 closed). On a zh-CN console the native control also shows the OS locale's format, not the console's. t33-审计日志.png.
reach: the public UI, measured once as the dev admin.
Expected
The audit-log filter bar uses the same date picker as list filters. (The bar's English labels are the i18n card objectui#13521; this card is the control only.)
Dedupe
objectui#12642 (closed) is the family close-out for native date inputs outside record forms and lists action-param dialogs, bulk dialogs, inline editors and list filters; the audit log component is not in its list. No other hit in this batch's searches. Report: REPORT.md §7.
Transferred 2026-10-26T02:00Z from objectstack-ai/objectui#13537, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the ui/ workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.
Paths. The body names no file paths; the UI code it describes lives under ui/ here (the Console is ui/apps/console, the libraries ui/packages/*).
Claim: PM loop round 1 · 2026-10-26T09:21Z
Session: session_01SMps7wq7rBTk53e8KTSEup
Account: os-steve
Branch: claude/issue-25875-audit-log-date-picker
Worktree: objectstack-issue-25875
Domain: domain:ui
Seat: domain:ui#2
File surface: ui/apps/console/src/pages/system/AuditLogPage.tsx (the From / To filter controls and their imports), ui/apps/console/src/pages/system/AuditLogPage.filterLabels-13224.test.tsx (flip the native-input pins) and other AuditLogPage.*.test.tsx only if they break; scripts/sdui-manifest.record.json only if its gate goes red; root .changeset/25875-audit-log-date-picker.md (stop on breach; explain in the report). ⛔ ui/packages/i18n/src/locales/*.ts, ui/.github/** and the root .github/workflows/ci.yml are out of bounds.
Container & model: S, mode:subagent, model: default tier (dispatch-gates --tier --repo objectstack-ai/objectstack: no path-derived mandate), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: the audit-log page, which hand-rolls native date inputs | the shared localized date picker the record forms already use | every Setup admin filtering the audit log, in a non-US locale
Thread-read: 6406553056
Premise: holds 2026-10-26T09:03Z — on origin/mainb0384f3fe5AuditLogPage.tsx:565,569 render <Input type="date"> for From / To; the shared picker is reached through getLazyFieldWidget('date') from @object-ui/fields (index.tsx ~4557), which writes the same YYYY-MM-DD and '' on clear.
Serial constraints cleared: none — no open claim holds AuditLogPage.tsx (area handed from seat 1 to seat 2 on 2026-10-26).
Writes: PR only via the relay op pr_create; comments only via the relay write tools; ⛔ no GitHub MCP writes.
Ruling section: triage 6406553056 — use the shared localized date picker, as the record forms do.
Suggested route: render getLazyFieldWidget('date') inside <Suspense> with field={{ type: 'date', name, label }}, value, onChange (keep setPage(0)) and the existing id, so each Label still names exactly one control; ⛔ no direct DatePickerField import or new subpath export (public surface + eager-closure budget). The picker commits on blur / Enter, so the flipped test types in the display locale's format and blurs.
{
"issue": 25875,
"status": "done",
"branch": "claude/issue-25875-audit-log-date-picker",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26061",
"session": "session_01SMps7wq7rBTk53e8KTSEup",
"premise_still_valid": true,
"summary": "Premise measured on origin/main 88531fab: AuditLogPage.tsx drew two native date inputs for From / To, and the picker is reachable only through getLazyFieldWidget('date'). Both filters now render getLazyFieldWidget('date'), resolved once at module scope, inside Suspense with a Skeleton fallback. Props: the existing label id, value, onChange (keeps setPage(0)) and field {type:'date', name, label}. The Input import is dropped. There is no DatePickerField import and no new export. Filter state and the request are unchanged: the picker writes YYYY-MM-DD, and an empty string on clear. The 13224 suite's native-input pins are flipped: each label names the picker's text box, never its calendar button. The live-filter test types in the en-US display format and commits on blur (From) and on Enter (To). Card assignee untouched. Diff stays within the claimed file surface (3 files): AuditLogPage.tsx, AuditLogPage.filterLabels-13224.test.tsx, and the root changeset .changeset/25875-audit-log-date-picker.md (@object-ui/console patch). origin/main was merged once before the PR opened, because #26008 touched AuditLogPage.tsx on a disjoint line. Worktree removed after the PR opened.",
"tests": "Head 63114661. Under os-verify-lock: (1) the UI-deps build that CI's 'Build UI Deps' step runs: turbo build of @objectstack/spec... client... core... formula... lint... sdui-parser... types..., BUILD_OK. (2) pnpm exec turbo run type-check --concurrency=2 --filter=@object-ui/console: 'Tasks: 71 successful, 71 total', TC_EXIT=0. (3) vitest run --root ../.. --project @object-ui/console --maxWorkers=2 over the six AuditLogPage.*.test.tsx plus consolePagesLocale-secondPass-13460, consoleFaces.displayLocale-9909 and orphanedPageComponentRefs-10520: 'Test Files 9 passed (9) · Tests 68 passed (68)', TEST_EXIT=0. The lock printed 'VERDICT batch-last-exit 0'; the last part was the && of TC and TEST. eslint --no-inline-config over the two changed files: exit 0, 0 errors; its 2 warnings were already on main, on untouched lines. Ablation, run once with the fix committed first: AuditLogPage.tsx was overwritten with the 88531fab copy, confirmed on disk by grep (2 type=date, 0 DateFilterWidget). The flipped suite then went red: 2 failed | 1 passed (3), both date pins. The file was restored with git checkout HEAD under a trap. Proof: blob hash equals HEAD (38133454…), git diff HEAD has 0 lines, and grep finds 3 DateFilterWidget. The run was relative-import src under vitest aliases, so no dist was involved.",
"gates": "Local, at the final head 63114661: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 34 commands. Each ran with its exit captured before any pipe, and all 34 exited 0. They include check-sdui-manifest, which is green, so the manifest record is untouched. Others: check:nul-bytes, check:cross-package-test-inputs, check:test-source-alias, check:type-check-coverage, check:type-check-debt, check-changeset-no-major, check-empty-changeset, check-adr-0087-registration, check-closing-keyword-parity and check:published-files. Reconciled with --ran, recording 'cmd :: exit N': 'Run reconciliation — 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN' (a DERIVED zero). Also run: node scripts/check-changeset-fixed.mjs, the roster gate under .changeset, exit 0. CI on PR #26061 at 63114661 when this report was written: 23 check-runs, 20 in_progress, 2 skipped, 1 success. Lint UI, Type Check UI, Test UI and Build & E2E UI are still in_progress; not waited on, per contract.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — (1) fleet-write relay pr_create: POST /repos/objectstack-ai/objectstack/dispatches, run 40309031860 success; PR #26061 opened as a draft, body read back identical (3302/3302 bytes), assignee os-steve. (2) this os-dev-report comment via scripts/pm/post-stamped.mjs. git push is not counted (no REST).",
"open_questions": [],
"out_of_scope_findings": []
}
{
"issue": 25875,
"status": "done",
"branch": "claude/issue-25875-audit-log-date-picker",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26061",
"session": "session_01SMps7wq7rBTk53e8KTSEup",
"premise_still_valid": true,
"summary": "Patch round 1. New head 9c96dae0, one commit on top of 63114661, test-only. CI Test UI (13/16) was red because the From / To labels named no control: the lazy getLazyFieldWidget('date') chunk had not resolved within settle(), so the Suspense skeleton was still showing. AuditLogPage.filterLabels-13224.test.tsx gains a datePickersMounted() helper. It is a waitFor on queryAllByLabelText('From' / 'To', exact) having length 1, with a 5 s timeout. Both tests that query the pickers call it after settle(). No sleeps, no retries, and AuditLogPage.tsx is unchanged. No other AuditLogPage.*.test.tsx touches the pickers. consolePagesLocale-secondPass-13460 only reads the label elements, which render outside Suspense. PR mergeable=true against current main, so no merge was made; pushed without force. Worktree recreated from origin/BRANCH for the round and removed again after.",
"tests": "Head 9c96dae0, under os-verify-lock (VERDICT command-exit 0). First the UI-deps build, BUILD_OK. Then vitest --project @object-ui/console over the six AuditLogPage.*.test.tsx plus consolePagesLocale-secondPass-13460, 3 consecutive runs at --maxWorkers=2: RUN1/RUN2/RUN3 each exit 0, 'Test Files 7 passed (7) · Tests 43 passed (43)'. Then one run at --maxWorkers=1: exit 0, 'Tests 43 passed (43)'.",
"gates": "At 9c96dae0 the ratchet families were re-run, lock-free: check:type-check-coverage, check:type-check-debt, check:test-source-alias, check:cross-package-test-inputs and check:nul-bytes, each exit 0. The full 34-command derived union was green at 63114661 (34 run, 0 NOT-MEASURED) and was not re-run for this test-only commit. CI on 9c96dae0 was not waited on.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "1 this round — this os-dev-report comment via scripts/pm/post-stamped.mjs. git push is not counted.",
"open_questions": [],
"out_of_scope_findings": []
}
Activity
objectstack-fleet commentedon Oct 25, 2026
Triage: first grade —
bug·priority:p3·domain:ui·area:i18n·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-25T14:55Z⛔ Not a claim, ⛔ not a dispatch.
Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Transferred 2026-10-26T02:00Z from objectstack-ai/objectui#13537, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the
ui/workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.Paths. The body names no file paths; the UI code it describes lives under
ui/here (the Console isui/apps/console, the librariesui/packages/*).No stale
pm:dispatchedor assignee to strip.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1 · 2026-10-26T09:21Z
Session:
session_01SMps7wq7rBTk53e8KTSEupAccount:
os-steveBranch:
claude/issue-25875-audit-log-date-pickerWorktree:
objectstack-issue-25875Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/apps/console/src/pages/system/AuditLogPage.tsx(the From / To filter controls and their imports),ui/apps/console/src/pages/system/AuditLogPage.filterLabels-13224.test.tsx(flip the native-input pins) and otherAuditLogPage.*.test.tsxonly if they break;scripts/sdui-manifest.record.jsononly if its gate goes red; root.changeset/25875-audit-log-date-picker.md(stop on breach; explain in the report). ⛔ui/packages/i18n/src/locales/*.ts,ui/.github/**and the root.github/workflows/ci.ymlare out of bounds.Container & model:
S,mode:subagent,model: default tier (dispatch-gates --tier --repo objectstack-ai/objectstack: no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility:
the audit-log page, which hand-rolls native date inputs|the shared localized date picker the record forms already use|every Setup admin filtering the audit log, in a non-US localeThread-read: 6406553056
Premise: holds 2026-10-26T09:03Z — on
origin/mainb0384f3fe5AuditLogPage.tsx:565,569render<Input type="date">for From / To; the shared picker is reached throughgetLazyFieldWidget('date')from@object-ui/fields(index.tsx ~4557), which writes the sameYYYY-MM-DDand''on clear.Serial constraints cleared: none — no open claim holds
AuditLogPage.tsx(area handed from seat 1 to seat 2 on 2026-10-26).Writes: PR only via the relay op
pr_create; comments only via the relay write tools; ⛔ no GitHub MCP writes.getLazyFieldWidget('date')inside<Suspense>withfield={{ type: 'date', name, label }},value,onChange(keepsetPage(0)) and the existingid, so each Label still names exactly one control; ⛔ no directDatePickerFieldimport or new subpath export (public surface + eager-closure budget). The picker commits on blur / Enter, so the flipped test types in the display locale's format and blurs.objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25875, "status": "done", "branch": "claude/issue-25875-audit-log-date-picker", "pr": "https://github.com/objectstack-ai/objectstack/pull/26061", "session": "session_01SMps7wq7rBTk53e8KTSEup", "premise_still_valid": true, "summary": "Premise measured on origin/main 88531fab: AuditLogPage.tsx drew two native date inputs for From / To, and the picker is reachable only through getLazyFieldWidget('date'). Both filters now render getLazyFieldWidget('date'), resolved once at module scope, inside Suspense with a Skeleton fallback. Props: the existing label id, value, onChange (keeps setPage(0)) and field {type:'date', name, label}. The Input import is dropped. There is no DatePickerField import and no new export. Filter state and the request are unchanged: the picker writes YYYY-MM-DD, and an empty string on clear. The 13224 suite's native-input pins are flipped: each label names the picker's text box, never its calendar button. The live-filter test types in the en-US display format and commits on blur (From) and on Enter (To). Card assignee untouched. Diff stays within the claimed file surface (3 files): AuditLogPage.tsx, AuditLogPage.filterLabels-13224.test.tsx, and the root changeset .changeset/25875-audit-log-date-picker.md (@object-ui/console patch). origin/main was merged once before the PR opened, because #26008 touched AuditLogPage.tsx on a disjoint line. Worktree removed after the PR opened.", "tests": "Head 63114661. Under os-verify-lock: (1) the UI-deps build that CI's 'Build UI Deps' step runs: turbo build of @objectstack/spec... client... core... formula... lint... sdui-parser... types..., BUILD_OK. (2) pnpm exec turbo run type-check --concurrency=2 --filter=@object-ui/console: 'Tasks: 71 successful, 71 total', TC_EXIT=0. (3) vitest run --root ../.. --project @object-ui/console --maxWorkers=2 over the six AuditLogPage.*.test.tsx plus consolePagesLocale-secondPass-13460, consoleFaces.displayLocale-9909 and orphanedPageComponentRefs-10520: 'Test Files 9 passed (9) · Tests 68 passed (68)', TEST_EXIT=0. The lock printed 'VERDICT batch-last-exit 0'; the last part was the && of TC and TEST. eslint --no-inline-config over the two changed files: exit 0, 0 errors; its 2 warnings were already on main, on untouched lines. Ablation, run once with the fix committed first: AuditLogPage.tsx was overwritten with the 88531fab copy, confirmed on disk by grep (2 type=date, 0 DateFilterWidget). The flipped suite then went red: 2 failed | 1 passed (3), both date pins. The file was restored with git checkout HEAD under a trap. Proof: blob hash equals HEAD (38133454…), git diff HEAD has 0 lines, and grep finds 3 DateFilterWidget. The run was relative-import src under vitest aliases, so no dist was involved.", "gates": "Local, at the final head 63114661: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 34 commands. Each ran with its exit captured before any pipe, and all 34 exited 0. They include check-sdui-manifest, which is green, so the manifest record is untouched. Others: check:nul-bytes, check:cross-package-test-inputs, check:test-source-alias, check:type-check-coverage, check:type-check-debt, check-changeset-no-major, check-empty-changeset, check-adr-0087-registration, check-closing-keyword-parity and check:published-files. Reconciled with --ran, recording 'cmd :: exit N': 'Run reconciliation — 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN' (a DERIVED zero). Also run: node scripts/check-changeset-fixed.mjs, the roster gate under .changeset, exit 0. CI on PR #26061 at 63114661 when this report was written: 23 check-runs, 20 in_progress, 2 skipped, 1 success. Lint UI, Type Check UI, Test UI and Build & E2E UI are still in_progress; not waited on, per contract.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — (1) fleet-write relay pr_create: POST /repos/objectstack-ai/objectstack/dispatches, run 40309031860 success; PR #26061 opened as a draft, body read back identical (3302/3302 bytes), assignee os-steve. (2) this os-dev-report comment via scripts/pm/post-stamped.mjs. git push is not counted (no REST).", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
ACCEPT → PR #26061 comment 6414047768 · seat 2 · 2026-10-26T10:51Z
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25875, "status": "done", "branch": "claude/issue-25875-audit-log-date-picker", "pr": "https://github.com/objectstack-ai/objectstack/pull/26061", "session": "session_01SMps7wq7rBTk53e8KTSEup", "premise_still_valid": true, "summary": "Patch round 1. New head 9c96dae0, one commit on top of 63114661, test-only. CI Test UI (13/16) was red because the From / To labels named no control: the lazy getLazyFieldWidget('date') chunk had not resolved within settle(), so the Suspense skeleton was still showing. AuditLogPage.filterLabels-13224.test.tsx gains a datePickersMounted() helper. It is a waitFor on queryAllByLabelText('From' / 'To', exact) having length 1, with a 5 s timeout. Both tests that query the pickers call it after settle(). No sleeps, no retries, and AuditLogPage.tsx is unchanged. No other AuditLogPage.*.test.tsx touches the pickers. consolePagesLocale-secondPass-13460 only reads the label elements, which render outside Suspense. PR mergeable=true against current main, so no merge was made; pushed without force. Worktree recreated from origin/BRANCH for the round and removed again after.", "tests": "Head 9c96dae0, under os-verify-lock (VERDICT command-exit 0). First the UI-deps build, BUILD_OK. Then vitest --project @object-ui/console over the six AuditLogPage.*.test.tsx plus consolePagesLocale-secondPass-13460, 3 consecutive runs at --maxWorkers=2: RUN1/RUN2/RUN3 each exit 0, 'Test Files 7 passed (7) · Tests 43 passed (43)'. Then one run at --maxWorkers=1: exit 0, 'Tests 43 passed (43)'.", "gates": "At 9c96dae0 the ratchet families were re-run, lock-free: check:type-check-coverage, check:type-check-debt, check:test-source-alias, check:cross-package-test-inputs and check:nul-bytes, each exit 0. The full 34-command derived union was green at 63114661 (34 run, 0 NOT-MEASURED) and was not re-run for this test-only commit. CI on 9c96dae0 was not waited on.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "1 this round — this os-dev-report comment via scripts/pm/post-stamped.mjs. git push is not counted.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Landed · seat 2 · 2026-10-26T12:34Z
9753d163, head9c96dae0(ACCEPT 6414047768 + test-only patch round)origin/mainf6c61932, contains9753d163(git merge-base --is-ancestorexit 0)gh-readonly-queue/main/pr-26061-*: none left (consumed)Fixes #25875on #26061Status:
pm:dispatchedremoved; the card is done. Nothing remains.