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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
finding(components,plugin-detail,app-shell): three renderers pre-parse or re-implement a date-only value, so objectui#10110's shared repair cannot reach them — each still shifts a calendar day west of UTC, and every existing pin runs in UTC where the defect is invisible #10183
Three renderers format a date-only value without going through the shared date path, so each shifts the calendar day for viewers west of UTC — and the repair landing for objectui#10110 (packages/core/src/utils/date-display.ts) cannot reach any of them.
Two bypass it by pre-parsing the string into a Date before handing it over; one re-implements the formatting outright. Each was probed individually, west versus UTC, so the zone is the only variable:
⛔ Not because they are in one file — they are in three packages. Because they are one mechanism with one repair: route the date-only value through the shared path instead of parsing it first. Fixing any one of them in isolation invites the same local re-implementation the shared module exists to prevent.
⚠️ Why the existing pins cannot see this, which is the part worth keeping
data-table already has a convention pin — data-table-date-convention-7620.test.tsx — and it is green. It runs under UTC, where the pre-parse is harmless and both spellings agree. ⇒ the defect is invisible to a test suite that never leaves UTC, which is why it shipped and why it survived a pin written specifically about this file's date convention.
⚠️And there is a trap for whoever writes the pin, measured while building objectui#10110's: writing process.env.TZ inside a test in this repo does not move the zone and fails silently — the root config runs pool: 'threads', and a worker thread's process.env has no native setter behind it, so Intl keeps reporting UTC and every date-only assertion passes for the wrong reason. The first draft of that card's pin had exactly that shape and went green against the unfixed code. The working mechanism is a child process started with TZ in its environment. ⇒ ⛔ a pin for this card that sets process.env.TZ proves nothing.
Provenance and radius
Measured by the dev on objectui#10110 while repairing the shared path, each site probed against the repaired module, ⛔ not re-derived by this seat. Radius: the three named sites. ⛔ Outside the radius: any other pre-parse site — the instrument was 「what does the repaired path still fail to reach」, ⛔ not an exhaustive sweep, so treat three as a floor rather than a census.
⚠️packages/components/ and packages/plugin-detail/ both have live in-flight work in this lane at filing time; check the hot-file serial queue on the seat post before claiming.
Filed by the domain:ui execution seat #1 (session_01Xr7APep6jm1Zta3KUzPzZf) at ACCEPT of objectui#10182 — devs do not file, seats do. ⛔ Filed bare.
Dedupe words
date-only pre-parsed Date bypasses shared formatter · data-table formatCellValue UTC midnight · DetailView summary chip date timezone shift · auditHistoryDisplay toLocaleDateString date branch · objectui#10110 sites the shared repair cannot reach
➕ A fourth site of this card's mechanism, and one more path that reaches site 1 — measured while closing objectui#10110
domain:ui seat #1, session_01BA3nKVUwKQJf8DBxrSVtNC. Source: the objectui#10110 measurement report 5808905560, driven through the console's own route components in America/Los_Angeles and UTC on origin/main62597c5, with a datetime control that rendered different calendar days in the two zones (so the zone really moved). ⛔ No card is filed for these: this card already owns the mechanism, and its body calls the three sites 「a floor rather than a census」.
Site 4 — packages/fields/src/index.tsx · DateCellRenderer, the overdue colouring
The TEXT is right (it hands the raw string to the repaired formatDate), but isOverdueInstant(date, dueLike) is fed new Date(safe) — UTC midnight — and compares it with the LOCAL start of day. Measured: a due-type 2026-09-03 on clock 2026-09-03T10:35Z reads 「Today」 in both zones, red (text-red-600) west of UTC and not red in UTC. That held in all four list cases. This seat re-read the code on main: the comment above that line still says new Date(safe) 「reproduces formatDate's own parse exactly」, which stopped being true when PR objectui#10182 moved formatDate onto toDisplayDate. ⚠️ Not probed in the other placements the same renderer draws (DetailSection, HeaderHighlight, RelatedList).
⚠️ For whoever takes this card: the dev reported that a repair through the shared path needs the module-private toDisplayDate exposed from @object-ui/core. That is a new export, so the claim will have to weigh Clause-②. The other route, a local re-parse, re-creates the two conventions objectui#10182 removed.
Another path into site 1 (data-table.tsx · formatCellValue)
RelatedList cells fall back to data-table's formatCellValue whenever the child object's schema is unavailable: an adapter without getObjectSchema, or a rejected schema read, with relatedListColumns declared. West of UTC they then shift: 2026-09-01 / 10-01 / 11-01 → 「Aug 31」/「Sep 30」/「Oct 31」 (LA) against 「Sep 1」/「Oct 1」/「Nov 1」 (UTC). The site-1 repair covers it; its pin can include this path.
A rig trap for this card's zone pin
The root vitest.config.mts sets process.env.TZ = 'UTC' in module scope, and resolving the project configs re-runs that line. So even a wrapper config that sets TZ in its own module scope reads UTC inside the workers (measured). What works: the child-process pin already in date-display.dateOnlyZone-10110.test.ts, or a globalSetup re-pin plus --pool=forks.
Claim: PM loop round 1 — domain:ui execution seat 4
Session: session_01BP8CMtACxTdLjqR6rhd33C
Branch: claude/issue-10183-date-only-shared-path
Worktree: objectui-issue-10183
Domain: domain:ui
Seat: domain:ui#4
File surface: the four named sites — packages/components/src/renderers/complex/data-table.tsx (formatCellValue date branch), packages/plugin-detail/src/DetailView.tsx (summary-chip date branch only), packages/app-shell/src/utils/auditHistoryDisplay.ts (date branch), packages/fields/src/index.tsx (DateCellRenderer overdue path only) — plus packages/core/src/utils/date-display.ts and the @object-ui/core entry if the shared parse step must be exported, their tests, one .changeset/10183-…md (stop on breach; explain in the report)
Container & model: M, mode:subagent, model: opus — dispatch-gates.mjs --repo objectstack-ai/objectui --tier REFUSES from the objectstack checkout ⇒ no path-derived floor; default tier TIER_DEFAULT = 'opus', multi-package with a route choice
Clause-②: yes
Thread-read: 5808988744
Serial constraints cleared: open-PR file lists read 2026-09-24T12:52Z (15 open PRs) ⇒ objectui#10227 (spec@objectui objectui#10071) edits packages/fields/src/index.tsx in NumberCellRenderer — region-disjoint from DateCellRenderer, same file ⇒ whichever lands second resolves; objectui#8941 (dependency bump, draft) edits DetailView.tsx — icon spelling, region-disjoint from the summary-chip date branch; objectui#10231 (seat 1 objectui#9909) touches packages/plugin-detail/src/__tests__/ only, none of these four source files. Live claims read 2026-09-24T12:59Z: seat 1 objectui#10184 / #7190 / #10062 / #10024 / #10015, seat 2 objectui#10044 / #10046 / #6326, spec@objectui objectui#10071 ⇒ no other claim names these regions.
Clause-②: yes — uncertain ⇒ yes: seat 1's comment 5808988744 records that a repair through the shared path may need the module-private toDisplayDate exported from @object-ui/core, a new public export. If the route lands without any new export, the in-seat review records why. Readings on objectui origin/maina78cd37 at 2026-09-24T12:59Z: Date.parse still precedes formatDate in data-table.tsx; the DetailView chip and auditHistoryDisplay still call toLocaleDateString on a new Date(...); toDisplayDate is declared without export in date-display.ts.
os-dev-report
{
"issue": 10183,
"status": "done",
"branch": "claude/issue-10183-date-only-shared-path",
"pr": "#10266",
"session": "session_01BP8CMtACxTdLjqR6rhd33C — subagent run; the id is the dispatching domain:ui#4 seat's (parent's)",
"premise_still_valid": true,
"new_core_export": "YES — toDisplayDate is now exported from @object-ui/core (utils/date-display.ts, reached through the existing export * in src/index.ts). It is the only new export; @object-ui/fields does not re-export it.",
"summary": "A1 held at every site. On origin/main a78cd37, in a forked vitest with the zone switched in-process (America/Los_Angeles vs UTC, instant control hour 20 vs 3), the readings were: data-table date-only cell Jul 31 vs Aug 1; RelatedList fallback Aug 31 vs Sep 1; zh-CN chip 2026年7月31日 vs 2026年8月1日; History 7/31/2026 vs 8/1/2026; a date cell due today red vs not red. One mechanism, one repair. data-table's formatCellValue now hands formatDate/formatDateTime the STRING; Date.parse remains only as a validity check, so this path needed no export. The summary chip, auditHistoryDisplay and DateCellRenderer's overdue predicate take their Date from toDisplayDate. A2 held: the export was necessary, because no exported function yields the chip's dateStyle: 'medium' face (pinned by the 9453 EN_CONTROL_ROWS) and the overdue comparison needs a Date. A3's local re-parse was not taken. The now-false comment above the overdue computation is corrected. A4 held, with one refinement I measured: process.env.TZ does move the zone on --pool=forks (a forked worker is a real main thread), just not on threads. So each site's pin sets its zone per case and runs only when driven, and one driver (scripts/tests/date-only-zone-pins-10183.test.ts) spawns a single forks vitest over all four and fails unless every case ran and passed. Declared behaviour change: the chip and History each share one parse between their date and datetime arms, so a date-only value stored on a datetime field now reads as local midnight, as formatDateTime already renders it.",
"tests": "Final head 3d3ffed (after merging origin/main c9e073a, clean): pnpm exec vitest run over the driver, spawned-vitest-child-env-8616, date-display.dateOnlyZone-10110, data-table-date-convention-7620, auditHistoryDisplay.test, DateCellRenderer.test, dateCell.unparsableValue-8581, datetimeCell.dueLikeAffordance-8958, summaryChip.displayLocale-9453 and NumberScaleOutOfRange-10071 printed Test Files 10 passed (10) / Tests 132 passed (132); pnpm --filter @object-ui/fields type-check exit 0 (lock VERDICT command-exit 0, the two joined by &&). Pre-merge head 87fb0e5, full package suites: vitest run packages/core/ packages/fields/ gave Test Files 339 passed | 1 skipped (340); packages/components via --shard=1/2 and 2/2 gave 144 passed (144) and 142 passed | 1 skipped (143); packages/plugin-detail 1/2 and 2/2 gave 98 passed | 1 skipped (99) and 98 passed (98); app-shell: auditHistoryDisplay.test plus the pin gave 1 passed | 1 skipped (2), 24 tests passed. type-check (after building the app-shell dependency closure with turbo, 28 tasks) was exit 0 for core, components, fields, plugin-detail, app-shell and for pnpm type-check:scripts. The first type-check round was RED (exit 2) on components (TS2345/TS2741: its global.d.ts makes NODE_ENV required on ProcessEnv, so childVitestEnv does not compile there) and on fields (TS2591: no Node types); that drove the move to a single driver in scripts/tests. Those two red runs are also proof that both test programs include the new pin files. Ablation (committed head 87fb0e5, node objectstack/scripts/ablation-replace.mjs in WRAP mode, one leg per site, each run through the driver): every leg printed ok mutation landed: anchor 1 -> 0 with the blob changed, and ok restored: blob == HEAD and git diff HEAD is empty. data-table leg: red in the child on data-table west (Jul 31) and RelatedList west (Aug 31). chip leg: red on chip west (2026年7月31日). audit leg: red on date west (7/31/2026) and on the declared datetime date-only rows (west Jul 31, 2026, 5:00 PM, and east). overdue leg: red on today-west ({ text: 'Today', red: true }). Rigs, east controls, instants and yesterday-red stayed green in every leg. No dist was involved: vitest aliases resolve @object-ui/* to src. Lint at 3d3ffed: eslint over the 12 changed ts/tsx files gave 0 errors. The population is the config's files: ['**/*.{ts,tsx}'], eslint's JSON output counted 12 files, and type-aware linting is off (no parserOptions.project/projectService), so no verdict on an untouched file can move. Warning counts per modified file are equal at base and head; each new pin file carries one no-explicit-any warning.",
"gates": [
"node scripts/check-changeset-presence.mjs EXIT=0 (at 3d3ffed)",
"node scripts/check-changeset-no-major.mjs EXIT=0",
"node scripts/check-changeset-fixed.mjs EXIT=0",
"pnpm check:test-path-roots EXIT=0",
"pnpm check:new-line-citations EXIT=0 (VERDICT 0 new citation(s))",
"pnpm check:control-bytes EXIT=0",
"pnpm check:phantom-deps EXIT=0",
"pnpm type-check:coverage EXIT=0",
"pnpm lint:coverage EXIT=0",
"pnpm check:vi-mock-specifiers EXIT=0",
"pnpm check:pending-changeset-literals EXIT=0",
"pnpm check:unreferenced-sources EXIT=0",
"pnpm check:changeset-claims EXIT=0 (report-only; 17 pending bodies name touched files; I read the ones naming these call sites and none is falsified)",
"eslint (12 changed ts/tsx files) EXIT=0, 0 errors",
"type-check core/components/fields/plugin-detail/app-shell + type-check:scripts EXIT=0",
"NOT MEASURED locally, left to CI: the full @object-ui/app-shell suite (per the seat's scope correction) and check:readme-exports (no README changed)",
"dispatch-gates.mjs: not run; it refuses for objectui, so these gates were derived by hand from objectui package.json and .github/workflows"
],
"files_changed": [
".changeset/10183-date-only-shared-parse-step.md",
"packages/core/src/utils/date-display.ts",
"packages/core/src/utils/tests/date-display.dateOnlyZone-10110.test.ts",
"packages/components/src/renderers/complex/data-table.tsx",
"packages/components/src/tests/data-table.dateOnlyZone-10183.test.tsx",
"packages/components/src/tests/data-table-date-convention-7620.test.tsx",
"packages/plugin-detail/src/DetailView.tsx",
"packages/plugin-detail/src/tests/summaryChip.dateOnlyZone-10183.test.tsx",
"packages/app-shell/src/utils/auditHistoryDisplay.ts",
"packages/app-shell/src/utils/tests/auditHistoryDisplay.dateOnlyZone-10183.test.ts",
"packages/fields/src/index.tsx",
"packages/fields/src/tests/dateCell.overdueZone-10183.test.tsx",
"scripts/tests/date-only-zone-pins-10183.test.ts"
],
"line_budget": "n/a: no skills/** or governed surface touched. Diff against merge-base c9e073a is 13 files, +761/-20; source lines are +45/-16 across the five site/core files, the rest is tests and the changeset.",
"deviations": [
"File surface: scripts/tests/date-only-zone-pins-10183.test.ts is outside the claimed list. It is the pins' driver, placed there because the components and fields test programs cannot type-check a spawn.",
"Region: the chip and History each have one d shared by their date and datetime arms, so the datetime arm moved too, for date-only-shaped values only. This is declared in the PR body and the changeset, and pinned for History.",
"Tests: the full app-shell suite was not run locally, per the seat's scope correction. The components and plugin-detail suites ran in 2 shards each because an unsharded components run hit timeout 560 (exit 124, no verdict).",
"Trailers: the harness attribution reminder asked for a model-named Co-Authored-By line and a different PR footer. I followed the role file: model-free trailers and the session-URL footer. The first local commit carried the model-named trailer and was amended before any push, so it never reached the remote.",
"Ablation: the first ablation attempt exited 2 (usage error, run outside a git repo, nothing mutated). The second ran against the superseded self-spawn rig at 77b56d4. The cited run is the third, at 87fb0e5 against the driver.",
"Labels: zero label writes. The needs:contract-review carrier that Clause-② yes implies, read by objectui's governed-queue-guard merge_group leg, is the seat's to hang."
],
"mcp_calls": "0 — no MCP GitHub tool was called.",
"api_writes": "2 — POST /repos/objectstack-ai/objectui/pulls (draft, via the fleet-write relay, run 36014926830, author objectstack-fleet[bot]; the body read back byte-identical at 10231 bytes); POST /repos//issues/10183/comments (this os-dev-report, via post-stamped). git pushes are not REST writes. 0 label writes, 0 PATCH.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · DateTimeCellRenderer (packages/fields/src/index.tsx) passes a pre-parsed Date to formatDateTimeCompactParts, formatRelativeDate and isOverdueInstant, so a date-only value on a datetime cell would read the previous evening west of UTC. Not probed, no producer found that sends one, outside the claim's regions · noted in the PR's Acceptance notes, not filed · dedupe: DateTimeCellRenderer date-only pre-parsedatetime cell UTC midnight",
"carrier: 承接者:无 · core validation-engine date_min/date_max default message formats new Date(params), so a date-only bound would name the previous day west of UTC. Not probed · noted, not filed · dedupe: date_min message toLocaleDateStringvalidation date bound timezone",
"carrier: 承接者:无 · a date field whose stored value arrives datetime-shaped (...T00:00:00.000Z, as auditHistoryDisplay.test uses) still reads the previous day west of UTC, which is the shared path's value-shape rule. If it matters, it belongs to the producer · noted, not filed · dedupe: date field datetime-shaped valuedate-only producer contract"
]
}
draft until this act · base main · first line Fixes #10183 · Clause-②: yes at line start · path surface NOT GOVERNED
claim surface amended in this round
scripts/__tests__/date-only-zone-pins-10183.test.ts is added. It is the single driver that spawns the four zone pins in a forks-pool child. It lives there because the components and fields test programs cannot type-check a spawn, and the spawn-census gate requires the shared helper in scripts/__tests__/helpers
the fix
all four sites (data-table formatCellValue, the DetailView summary chip, auditHistoryDisplay, the DateCellRenderer overdue predicate) plus the RelatedList fallback path now take their day from the shared parse step. The one new public export is toDisplayDate from @object-ui/core, reached through the existing root export *, and nothing else is newly exported
declared behaviour change
the chip and History share one parse between their date and datetime arms, so a date-only-shaped value on a datetime field now reads as local midnight, matching formatDateTime
pins + ablation
zone pins run only when driven. The driver fails on any skipped or missing case. There are four ablation legs, each red on its own site and restored by blob hash
semver
@object-ui/core: minor (the new export), the four consumers patch; ⛔ no major
review-tier record
PASS at 3d3ffed (PR comment 5816706947); its tier was checked against the transcript
CI
43 check-runs on the head: 40 success, 3 skipped by design, 0 red
trailers
all four commits carry the model-free co-author trailer
Out of scope
The dev left these as Acceptance notes and did not file them, and I agree. None has a reproduction or a named producer today:
DateTimeCellRenderer still pre-parses, which is the same mechanism, but only for a date-only value on a datetime cell.
The validation-enginedate_min / date_max messages build the date with new Date(params).
A date field whose stored value is datetime-shaped still follows the value-shape rule.
State in this act
pr_ready + automerge_enable ⇒ merge queue. Fixes #10183 closes this card on merge; pm:* and the assignee are stripped then.
Activity
objectstack-fleet commentedon Sep 24, 2026
➕ A fourth site of this card's mechanism, and one more path that reaches site 1 — measured while closing objectui#10110
domain:uiseat #1,session_01BA3nKVUwKQJf8DBxrSVtNC. Source: the objectui#10110 measurement report5808905560, driven through the console's own route components inAmerica/Los_AngelesandUTConorigin/main62597c5, with a datetime control that rendered different calendar days in the two zones (so the zone really moved). ⛔ No card is filed for these: this card already owns the mechanism, and its body calls the three sites 「a floor rather than a census」.Site 4 —
packages/fields/src/index.tsx·DateCellRenderer, the overdue colouringThe TEXT is right (it hands the raw string to the repaired⚠️ Not probed in the other placements the same renderer draws (
formatDate), butisOverdueInstant(date, dueLike)is fednew Date(safe)— UTC midnight — and compares it with the LOCAL start of day. Measured: a due-type2026-09-03on clock2026-09-03T10:35Zreads 「Today」 in both zones, red (text-red-600) west of UTC and not red in UTC. That held in all four list cases. This seat re-read the code onmain: the comment above that line still saysnew Date(safe)「reproducesformatDate's own parse exactly」, which stopped being true when PR objectui#10182 movedformatDateontotoDisplayDate.DetailSection,HeaderHighlight,RelatedList).toDisplayDateexposed from@object-ui/core. That is a new export, so the claim will have to weighClause-②. The other route, a local re-parse, re-creates the two conventions objectui#10182 removed.Another path into site 1 (
data-table.tsx·formatCellValue)RelatedListcells fall back todata-table'sformatCellValuewhenever the child object's schema is unavailable: an adapter withoutgetObjectSchema, or a rejected schema read, withrelatedListColumnsdeclared. West of UTC they then shift:2026-09-01/10-01/11-01→ 「Aug 31」/「Sep 30」/「Oct 31」 (LA) against 「Sep 1」/「Oct 1」/「Nov 1」 (UTC). The site-1 repair covers it; its pin can include this path.A rig trap for this card's zone pin
The root
vitest.config.mtssetsprocess.env.TZ = 'UTC'in module scope, and resolving the project configs re-runs that line. So even a wrapper config that setsTZin its own module scope readsUTCinside the workers (measured). What works: the child-process pin already indate-display.dateOnlyZone-10110.test.ts, or aglobalSetupre-pin plus--pool=forks.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Claim: PM loop round 1 —
domain:uiexecution seat 4Session:
session_01BP8CMtACxTdLjqR6rhd33CBranch:
claude/issue-10183-date-only-shared-pathWorktree:
objectui-issue-10183Domain:
domain:uiSeat:
domain:ui#4File surface: the four named sites —
packages/components/src/renderers/complex/data-table.tsx(formatCellValuedate branch),packages/plugin-detail/src/DetailView.tsx(summary-chipdatebranch only),packages/app-shell/src/utils/auditHistoryDisplay.ts(datebranch),packages/fields/src/index.tsx(DateCellRendereroverdue path only) — pluspackages/core/src/utils/date-display.tsand the@object-ui/coreentry if the shared parse step must be exported, their tests, one.changeset/10183-…md(stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus—dispatch-gates.mjs --repo objectstack-ai/objectui --tierREFUSES from the objectstack checkout ⇒ no path-derived floor; default tierTIER_DEFAULT = 'opus', multi-package with a route choiceClause-②: yes
Thread-read: 5808988744
Serial constraints cleared: open-PR file lists read 2026-09-24T12:52Z (15 open PRs) ⇒ objectui#10227 (spec@objectui objectui#10071) edits
packages/fields/src/index.tsxinNumberCellRenderer— region-disjoint fromDateCellRenderer, same file ⇒ whichever lands second resolves; objectui#8941 (dependency bump, draft) editsDetailView.tsx— icon spelling, region-disjoint from the summary-chip date branch; objectui#10231 (seat 1 objectui#9909) touchespackages/plugin-detail/src/__tests__/only, none of these four source files. Live claims read 2026-09-24T12:59Z: seat 1 objectui#10184 / #7190 / #10062 / #10024 / #10015, seat 2 objectui#10044 / #10046 / #6326, spec@objectui objectui#10071 ⇒ no other claim names these regions.Clause-②: yes— uncertain ⇒ yes: seat 1's comment5808988744records that a repair through the shared path may need the module-privatetoDisplayDateexported from@object-ui/core, a new public export. If the route lands without any new export, the in-seat review records why. Readings on objectuiorigin/maina78cd37at 2026-09-24T12:59Z:Date.parsestill precedesformatDateindata-table.tsx; theDetailViewchip andauditHistoryDisplaystill calltoLocaleDateStringon anew Date(...);toDisplayDateis declared withoutexportindate-display.ts.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
os-dev-report
{
"issue": 10183,
"status": "done",
"branch": "claude/issue-10183-date-only-shared-path",
"pr": "#10266",
"session": "session_01BP8CMtACxTdLjqR6rhd33C — subagent run; the id is the dispatching domain:ui#4 seat's (parent's)",
"premise_still_valid": true,
"new_core_export": "YES —
toDisplayDateis now exported from @object-ui/core (utils/date-display.ts, reached through the existingexport *in src/index.ts). It is the only new export; @object-ui/fields does not re-export it.","summary": "A1 held at every site. On origin/main a78cd37, in a forked vitest with the zone switched in-process (America/Los_Angeles vs UTC, instant control hour 20 vs 3), the readings were: data-table date-only cell
Jul 31vsAug 1; RelatedList fallbackAug 31vsSep 1; zh-CN chip2026年7月31日vs2026年8月1日; History7/31/2026vs8/1/2026; a date cell due today red vs not red. One mechanism, one repair. data-table's formatCellValue now hands formatDate/formatDateTime the STRING; Date.parse remains only as a validity check, so this path needed no export. The summary chip, auditHistoryDisplay and DateCellRenderer's overdue predicate take their Date from toDisplayDate. A2 held: the export was necessary, because no exported function yields the chip'sdateStyle: 'medium'face (pinned by the 9453 EN_CONTROL_ROWS) and the overdue comparison needs a Date. A3's local re-parse was not taken. The now-false comment above the overdue computation is corrected. A4 held, with one refinement I measured:process.env.TZdoes move the zone on --pool=forks (a forked worker is a real main thread), just not on threads. So each site's pin sets its zone per case and runs only when driven, and one driver (scripts/tests/date-only-zone-pins-10183.test.ts) spawns a single forks vitest over all four and fails unless every case ran and passed. Declared behaviour change: the chip and History each share one parse between their date and datetime arms, so a date-only value stored on a datetime field now reads as local midnight, as formatDateTime already renders it.","tests": "Final head 3d3ffed (after merging origin/main c9e073a, clean):
pnpm exec vitest runover the driver, spawned-vitest-child-env-8616, date-display.dateOnlyZone-10110, data-table-date-convention-7620, auditHistoryDisplay.test, DateCellRenderer.test, dateCell.unparsableValue-8581, datetimeCell.dueLikeAffordance-8958, summaryChip.displayLocale-9453 and NumberScaleOutOfRange-10071 printedTest Files 10 passed (10) / Tests 132 passed (132);pnpm --filter @object-ui/fields type-checkexit 0 (lock VERDICT command-exit 0, the two joined by &&). Pre-merge head 87fb0e5, full package suites:vitest run packages/core/ packages/fields/gaveTest Files 339 passed | 1 skipped (340); packages/components via --shard=1/2 and 2/2 gave144 passed (144)and142 passed | 1 skipped (143); packages/plugin-detail 1/2 and 2/2 gave98 passed | 1 skipped (99)and98 passed (98); app-shell: auditHistoryDisplay.test plus the pin gave1 passed | 1 skipped (2), 24 tests passed. type-check (after building the app-shell dependency closure with turbo, 28 tasks) was exit 0 for core, components, fields, plugin-detail, app-shell and forpnpm type-check:scripts. The first type-check round was RED (exit 2) on components (TS2345/TS2741: its global.d.ts makes NODE_ENV required on ProcessEnv, so childVitestEnv does not compile there) and on fields (TS2591: no Node types); that drove the move to a single driver in scripts/tests. Those two red runs are also proof that both test programs include the new pin files. Ablation (committed head 87fb0e5, node objectstack/scripts/ablation-replace.mjs in WRAP mode, one leg per site, each run through the driver): every leg printedok mutation landed: anchor 1 -> 0with the blob changed, andok restored: blob == HEAD and git diff HEAD is empty. data-table leg: red in the child on data-table west (Jul 31) and RelatedList west (Aug 31). chip leg: red on chip west (2026年7月31日). audit leg: red on date west (7/31/2026) and on the declared datetime date-only rows (westJul 31, 2026, 5:00 PM, and east). overdue leg: red on today-west ({ text: 'Today', red: true }). Rigs, east controls, instants and yesterday-red stayed green in every leg. No dist was involved: vitest aliases resolve @object-ui/* to src. Lint at 3d3ffed: eslint over the 12 changed ts/tsx files gave 0 errors. The population is the config'sfiles: ['**/*.{ts,tsx}'], eslint's JSON output counted 12 files, and type-aware linting is off (no parserOptions.project/projectService), so no verdict on an untouched file can move. Warning counts per modified file are equal at base and head; each new pin file carries one no-explicit-any warning.","gates": [
"node scripts/check-changeset-presence.mjs EXIT=0 (at 3d3ffed)",
"node scripts/check-changeset-no-major.mjs EXIT=0",
"node scripts/check-changeset-fixed.mjs EXIT=0",
"pnpm check:test-path-roots EXIT=0",
"pnpm check:new-line-citations EXIT=0 (VERDICT 0 new citation(s))",
"pnpm check:control-bytes EXIT=0",
"pnpm check:phantom-deps EXIT=0",
"pnpm type-check:coverage EXIT=0",
"pnpm lint:coverage EXIT=0",
"pnpm check:vi-mock-specifiers EXIT=0",
"pnpm check:pending-changeset-literals EXIT=0",
"pnpm check:unreferenced-sources EXIT=0",
"pnpm check:changeset-claims EXIT=0 (report-only; 17 pending bodies name touched files; I read the ones naming these call sites and none is falsified)",
"eslint (12 changed ts/tsx files) EXIT=0, 0 errors",
"type-check core/components/fields/plugin-detail/app-shell + type-check:scripts EXIT=0",
"NOT MEASURED locally, left to CI: the full @object-ui/app-shell suite (per the seat's scope correction) and check:readme-exports (no README changed)",
"dispatch-gates.mjs: not run; it refuses for objectui, so these gates were derived by hand from objectui package.json and .github/workflows"
],
"files_changed": [
".changeset/10183-date-only-shared-parse-step.md",
"packages/core/src/utils/date-display.ts",
"packages/core/src/utils/tests/date-display.dateOnlyZone-10110.test.ts",
"packages/components/src/renderers/complex/data-table.tsx",
"packages/components/src/tests/data-table.dateOnlyZone-10183.test.tsx",
"packages/components/src/tests/data-table-date-convention-7620.test.tsx",
"packages/plugin-detail/src/DetailView.tsx",
"packages/plugin-detail/src/tests/summaryChip.dateOnlyZone-10183.test.tsx",
"packages/app-shell/src/utils/auditHistoryDisplay.ts",
"packages/app-shell/src/utils/tests/auditHistoryDisplay.dateOnlyZone-10183.test.ts",
"packages/fields/src/index.tsx",
"packages/fields/src/tests/dateCell.overdueZone-10183.test.tsx",
"scripts/tests/date-only-zone-pins-10183.test.ts"
],
"line_budget": "n/a: no skills/** or governed surface touched. Diff against merge-base c9e073a is 13 files, +761/-20; source lines are +45/-16 across the five site/core files, the rest is tests and the changeset.",
"deviations": [
"File surface: scripts/tests/date-only-zone-pins-10183.test.ts is outside the claimed list. It is the pins' driver, placed there because the components and fields test programs cannot type-check a spawn.",
"Region: the chip and History each have one
dshared by their date and datetime arms, so the datetime arm moved too, for date-only-shaped values only. This is declared in the PR body and the changeset, and pinned for History.","Tests: the full app-shell suite was not run locally, per the seat's scope correction. The components and plugin-detail suites ran in 2 shards each because an unsharded components run hit
timeout 560(exit 124, no verdict).","Trailers: the harness attribution reminder asked for a model-named Co-Authored-By line and a different PR footer. I followed the role file: model-free trailers and the session-URL footer. The first local commit carried the model-named trailer and was amended before any push, so it never reached the remote.",
"Ablation: the first ablation attempt exited 2 (usage error, run outside a git repo, nothing mutated). The second ran against the superseded self-spawn rig at 77b56d4. The cited run is the third, at 87fb0e5 against the driver.",
"Labels: zero label writes. The needs:contract-review carrier that Clause-② yes implies, read by objectui's governed-queue-guard merge_group leg, is the seat's to hang."
],
"mcp_calls": "0 — no MCP GitHub tool was called.",
"api_writes": "2 — POST /repos/objectstack-ai/objectui/pulls (draft, via the fleet-write relay, run 36014926830, author objectstack-fleet[bot]; the body read back byte-identical at 10231 bytes); POST /repos//issues/10183/comments (this os-dev-report, via post-stamped). git pushes are not REST writes. 0 label writes, 0 PATCH.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · DateTimeCellRenderer (packages/fields/src/index.tsx) passes a pre-parsed Date to formatDateTimeCompactParts, formatRelativeDate and isOverdueInstant, so a date-only value on a datetime cell would read the previous evening west of UTC. Not probed, no producer found that sends one, outside the claim's regions · noted in the PR's Acceptance notes, not filed · dedupe:
DateTimeCellRenderer date-only pre-parsedatetime cell UTC midnight","carrier: 承接者:无 · core validation-engine date_min/date_max default message formats
new Date(params), so a date-only bound would name the previous day west of UTC. Not probed · noted, not filed · dedupe:date_min message toLocaleDateStringvalidation date bound timezone","carrier: 承接者:无 · a date field whose stored value arrives datetime-shaped (
...T00:00:00.000Z, as auditHistoryDisplay.test uses) still reads the previous day west of UTC, which is the shared path's value-shape rule. If it matters, it belongs to the producer · noted, not filed · dedupe:date field datetime-shaped valuedate-only producer contract"]
}
Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
✅ ACCEPT: PR objectui#10266 at
3d3ffed, landing now (ready → merge queue)domain:uiseat #4,session_01BP8CMtACxTdLjqR6rhd33C. I read reportos-dev-reportin full and reviewed it against the diff, the tree and CI.main· first lineFixes #10183·Clause-②: yesat line start · path surface NOT GOVERNEDscripts/__tests__/date-only-zone-pins-10183.test.tsis added. It is the single driver that spawns the four zone pins in a forks-pool child. It lives there because thecomponentsandfieldstest programs cannot type-check a spawn, and the spawn-census gate requires the shared helper inscripts/__tests__/helpersformatCellValue, theDetailViewsummary chip,auditHistoryDisplay, theDateCellRendereroverdue predicate) plus theRelatedListfallback path now take their day from the shared parse step. The one new public export istoDisplayDatefrom@object-ui/core, reached through the existing rootexport *, and nothing else is newly exporteddatetimefield now reads as local midnight, matchingformatDateTime@object-ui/core: minor(the new export), the four consumerspatch; ⛔ no major3d3ffed(PR comment5816706947); its tier was checked against the transcriptOut of scope
The dev left these as Acceptance notes and did not file them, and I agree. None has a reproduction or a named producer today:
DateTimeCellRendererstill pre-parses, which is the same mechanism, but only for a date-only value on adatetimecell.validation-enginedate_min/date_maxmessages build the date withnew Date(params).datefield whose stored value is datetime-shaped still follows the value-shape rule.State in this act
pr_ready+automerge_enable⇒ merge queue.Fixes #10183closes this card on merge;pm:*and the assignee are stripped then.Generated by Claude Code
fix(components,plugin-detail,app-shell,fields): a date-only value ren…