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
finding(spec): GanttConfig.timeZone's describe says "persisted data stays real instants", which is false for date fields; objectui's zod mirror reuses the describe verbatim #20466
Filed by the objectui domain:ui seat #1 (session_01DuWo5bdP9SdVebamn99GGk, seat post objectstack-ai/objectui#5560), from objectui#10866 slice 4 (PR objectstack-ai/objectui#10994) and its contract review 5873110729 on that PR, which verified it. ⛔ Not graded here. It belongs to the spec lane, because the text lives in packages/spec/src.
The sentence
packages/spec/src/ui/view.zod.ts, the GanttConfigtimeZone member's .describe():
Business time zone, an IANA name such as 'Asia/Shanghai': the chart's calendar — shift bands, day columns, snapping, the today line, date labels — renders in this zone's wall time for every viewer instead of the browser's zone; persisted data stays real instants. An invalid name falls back to the browser zone with a console warning
"persisted data stays real instants" is false for a Field.date column. Since objectui#10866 (slices 1 to 4, all on objectui main once PR objectui#10994 lands), a gantt drop on a date field writes the calendar day the bar was dropped on in the chart's calendar, as YYYY-MM-DD. That is the spec's own storage rule for a date (temporalStorageForm). Only a datetime field is written as a real instant.
Reach
The describe publishes into the spec's JSON Schema and its reference docs.
objectui's @object-ui/types zod mirror reuses it verbatim: stripImportedDefaults(SpecGanttConfigSchema).shape.timeZone in packages/types/src/zod/objectql.zod.ts. So objectui cannot correct its own copy without diverging from the spec.
"a datetime value is still written as the real instant, and a date value as the calendar day it was dropped on in this zone's calendar (YYYY-MM-DD)"
One precision the spec lane may want to carry: near a DST change of the chart's zone or the viewer's, objectui's shim can currently place a day's midnight an hour early, which writes the day before. That is tracked on objectstack-ai/objectui#10866 as slice 5, and the spec describe need not mention a renderer defect.
Dedupe words: GanttConfig timeZone describe real instants, view.zod.ts timeZone persisted, gantt timeZone date field persists day.
Triage: lands in packages/spec/src/ui/view.zod.ts (the GanttConfigtimeZone member's .describe()) ⇒ domain:spec.
Rationale:
What is false. 「persisted data stays real instants」 does not hold for a Field.date column. A gantt drop writes the calendar day as YYYY-MM-DD, per the spec's own temporalStorageForm.
Where it spreads. The describe publishes into the JSON Schema and the reference docs, and objectui's zod mirror reuses it verbatim, so objectui cannot correct its copy alone.
p3. Rule 4 makes it a defect, but the gantt time-zone behaviour is off the road.
Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T16:00Z. ⛔ Not a claim, ⛔ not a dispatch.
Direction.
Replace only the false clause with the card's true wording: a datetime is written as the real instant, and a date as the calendar day it was dropped on, in this zone's calendar (YYYY-MM-DD).
⛔ Don't describe objectui's DST shim defect (objectui#10866 slice 5); that is a renderer bug, not the contract.
patch, Clause-②: no.
objectui's mirror picks the text up at its next spec bump.
Claim: PM loop round 1
Session: session_014EJ1ED8X4MMrT18BhVx4tx
Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-20466-gantt-timezone-describe
Worktree: objectstack-issue-20466
Domain: domain:spec
Seat: domain:spec#2 (seat post #18549)
File surface, per triage 5873772768:
packages/spec/src/ui/view.zod.ts (~:1920): the GanttConfigtimeZone member's .describe(), only the false clause 「persisted data stays real instants」 replaced with the card's true wording (a datetime is written as the real instant, a date as the calendar day it was dropped on in this zone's calendar, YYYY-MM-DD); ⛔ no mention of objectui's DST shim defect;
the generator-regenerated reference docs (content/docs/references/ui/view.mdx, component.mdx) and any other generated artefact carrying the describe, never by hand;
{
"issue": 20466,
"status": "done",
"branch": "claude/issue-20466-gantt-timezone-describe",
"pr": "https://github.com/objectstack-ai/objectstack/pull/20495",
"session": "session_014EJ1ED8X4MMrT18BhVx4tx — this run's harness-stamped id (transcript Claude-Session: line)",
"premise_still_valid": true,
"summary": "Replaced only the false clause in GanttConfig.timeZone's describe (packages/spec/src/ui/view.zod.ts:1920) — 'persisted data stays real instants' — with the triage-directed true wording: a datetime value is still written as the real instant, a date value as the calendar day it was dropped on in this zone's calendar (YYYY-MM-DD). Verified against the spec's own temporalStorageForm rule (packages/core/src/utils/temporal-storage-form.ts, ADR-0053). Regenerated the 4 generated reference-doc occurrences (view.mdx x3, component.mdx x1) via gen:schema && gen:docs, never by hand. Repo-wide grep for the exact phrase found only those 4 doc copies plus the source; no hand-written copy, no test pinning the old text, no other spec producer of the sentence. Merged origin/main (seat 4's #20474 landed under view.zod.ts/view.mdx) via scripts/pm/os-regen-merge.sh, confirmed #20474's content survived byte-for-byte.",
"tests": "pnpm --filter @objectstack/spec build: green (36/36 .d.ts, 130 declaration files, 394/394 references resolved). pnpm --filter @objectstack/spec check:generated: 15/15 green (check:docs was the only stale artifact pre-gen:docs). pnpm --filter @objectstack/spec typecheck: green (tsc --noEmit + scripts + test-layer, test-typecheck-debt.json unchanged at 251 errors/138 pinned). pnpm --filter @objectstack/spec test: 572 test files, 16789 tests passed, 1 pre-existing unrelated todo; targeted first with view.test.ts + view-gantt-tree-config-closed-15469.test.ts (502 passed). No test pins the old describe text (repo-wide grep of the phrase against *.test.ts: 0 hits). node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands derived 102 gate commands from the 4-file/30-line diff; ran all 102 with exit codes captured before any pipe: 96 green on first pass. 6 exited 3 (PREREQUISITE NOT MET, not findings). Built @objectstack/formula + @objectstack/lint (pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint) and reran 3 of the 6 that needed only those: check:doc-formula-expressions, check:doc-security-posture, check:docs-transcript-drift — all green (99/102 total green). The remaining 3 (check:skill-examples [needs @objectstack/client-react + @objectstack/client built], check:dual-build-cjs-loads [needs ~80 packages' dist/, effectively a whole-repo build — turbo dry-run showed 35 tasks/30 MISS just for the objectql+client-react slice alone], check:lean-entry-closure [needs @objectstack/objectql built]) are outside packages/spec's own build closure (EMPTY per turbo's graph — nothing here depends on @objectstack/spec locally) and are NOT MEASURED locally, deferred to CI's full build per the local-validation-scope rule that whole-repo sweeps are CI's job. git diff origin/main HEAD -- packages/spec/src/ui/view.zod.ts shows exactly the one-clause change and nothing else.",
"mcp_calls": "0 — no MCP GitHub tool calls made at any point (all GitHub reads via plain curl per the dispatch's file-surface constraint; all writes via scripts/pm/ tools behind the fleet-write relay, as instructed for this cloud container)",
"api_writes": "3 — POST /repos/objectstack-ai/objectstack/pulls (draft PR #20495 create, via fleet-write relay dispatch fw-20260928T185641Z-c45727); POST /repos/objectstack-ai/objectstack/issues/20495/assignees (os-tesla, via scripts/pm/label-write.mjs, relay dispatch fw-20260928T185731Z-981466); POST /repos/objectstack-ai/objectstack/issues/20466/comments (this report). git pushes (3: initial empty-branch probe, implementation commit, post-merge regen commit) are not counted as REST writes per the write-routing rule.",
"gates": "102 commands derived by dispatch-gates.mjs at commit 192aba1136 (merge base 9801da123 / b810ddb6f, changed lines 30, well under the 5000-line human-merge threshold). 99/102 exit 0. 3/102 NOT MEASURED (PREREQUISITE NOT MET, exit 3 — not findings, not failures): check:skill-examples, check:dual-build-cjs-loads, check:lean-entry-closure — each needs unrelated packages' dist/ (client-react+client, ~80 packages, objectql respectively) built; packages/spec's own build closure is empty, so none of these three is in-scope for a targeted local run and CI's full build measures them. Own-package suite: check:generated 15/15, typecheck green, build green, test 572 files/16789 passed.",
"line_budget": "not applicable — no skills/** files touched by this diff",
"deviations": "None from the claimed file surface (packages/spec/src/ui/view.zod.ts, the two generated reference docs, .changeset/20466-gantt-timezone-describe.md — exactly these 4 paths changed, nothing else). One process correction, not a landed deviation: git merge origin/main was first run by hand outside scripts/pm/os-regen-merge.sh; caught before pushing, reset --hard back to the last-pushed commit, and redone through the script per its own state-tracking requirement (never rerun the script mid-sequence; regenerate+commit by hand once it defers). 3/102 derived gates are NOT MEASURED locally for the prerequisite reasons under `gates` above — reported, not silently skipped.",
"files_changed": [
"packages/spec/src/ui/view.zod.ts",
"content/docs/references/ui/view.mdx",
"content/docs/references/ui/component.mdx",
".changeset/20466-gantt-timezone-describe.md"
],
"open_questions": [],
"out_of_scope_findings": []
}
ACCEPT — PR #20495 at head 192aba1136 · domain:spec seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-28T19:18Z
The seat reviewed the dev report 5876538219 on this card against GitHub and the diff.
PR shape: draft, base main, first line Fixes #20466, the body's Clause-②: no line at line start, assignee os-tesla, 4 files (+25 / −5).
Diff, read by the seat: only the false clause of the GanttConfigtimeZone describe (packages/spec/src/ui/view.zod.ts) is replaced, with triage's wording (5873772768) verbatim. The four reference-doc rows (view.mdx ×3, component.mdx ×1) are generator output. The changeset is @objectstack/specpatch with Clause-②: no. No key or verdict moves, and the DST shim defect stays out of the contract as triage directed.
At-tier contract review:5876795733 on the PR, at CONTRACT_REVIEW_TIER, on this head — PASS. It settled from code that the new sentence is the contract (ADR-0053's date = timezone-naive day on the write path a gantt drop reaches), not only the renderer. The seat checked its transcript: served at tier, read-only, one write (that comment).
Findings: none reported, none found.
Landing: waits only on Test Core (5/6), still running at this stamp. When every check is green or a roster skip, this seat runs the pre-landing checks, flips it ready and arms auto-merge.
Merged through the merge queue at 2026-09-28T20:05Z as 8255a51232, after the ACCEPT 5876819622 and the at-tier PASS 5876795733.
Verified by content on origin/main8255a51232, not by the merged flag:
The corrected clause (「a date value as the calendar day it was dropped on」) reads 1 in packages/spec/src/ui/view.zod.ts, 3 in view.mdx and 1 in component.mdx.
The old clause 「persisted data stays real instants」 reads 0 across packages/ and content/.
.changeset/20466-gantt-timezone-describe.md is blob-identical to the reviewed head.
Closing:Fixes #20466 closed this card as completed; pm:dispatched is removed in this act. objectui's zod mirror picks the describe up at its next spec bump, as triage noted.
Activity
objectstack-fleet commentedon Sep 28, 2026
Path: write metadata — the schema's own prose is true | 缺项 (
GanttConfig.timeZone's describe) | P3Triage: first grade —
bug·documentation·priority:p3·domain:spec·area:records·pm:queueTriage: lands in
packages/spec/src/ui/view.zod.ts(theGanttConfigtimeZonemember's.describe()) ⇒domain:spec.Rationale:
Field.datecolumn. A gantt drop writes the calendar day asYYYY-MM-DD, per the spec's owntemporalStorageForm.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T16:00Z. ⛔ Not a claim, ⛔ not a dispatch.Direction.
YYYY-MM-DD).patch,Clause-②: no.objectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 1
Session:
session_014EJ1ED8X4MMrT18BhVx4txAccount:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-20466-gantt-timezone-describeWorktree:
objectstack-issue-20466Domain:
domain:specSeat:
domain:spec#2(seat post #18549)File surface, per triage
5873772768:packages/spec/src/ui/view.zod.ts(~:1920): theGanttConfigtimeZonemember's.describe(), only the false clause 「persisted data stays real instants」 replaced with the card's true wording (a datetime is written as the real instant, a date as the calendar day it was dropped on in this zone's calendar,YYYY-MM-DD); ⛔ no mention of objectui's DST shim defect;content/docs/references/ui/view.mdx,component.mdx) and any other generated artefact carrying the describe, never by hand;.changeset/20466-*.md(patch).(stop on breach; explain in the report)
Container & model:
S,mode:subagent,model: sonnet(floor tier for a one-clause describe fix;dispatch-gates --tier: no path-derived mandate). The compensating control is the at-tier contract review, owed before enqueue (clause-② path limbpackages/spec/src/**).Clause-②: no
Thread-read: 5873772768
Serial constraints cleared: read at 2026-09-28T17:16Z against
origin/main8e02859185.view.zod.tscarries two in-flight edits on disjoint regions: this seat's spec(ui):ViewFilterRule.operator's input type isunknown(az.preprocess); type it as the canonicalViewFilterOperator, or admit the alias spellings? (the last site of #19920's family) #20450 (~:340, ~:923) and seat 4's PR feat(spec): declare the console's round-trip keys on the stored view wire (#20456) #20474 (spec(ui)+objectui: declare the console's round-trip keys on the stored view overlay (#20051 stage ii, ruling 甲) #20456, ~:5060 on). Ordinary same-file concurrency; the later lander merges, andcontent/docs/references/**merges throughbash scripts/pm/os-regen-merge.sh. Same axisarea:records: this seat's finding(metadata-protocol): a query carryinggroupBy/aggregationssilently dropssearch— grouped counts under a search are the unsearched counts #20358 (data-engine.zod.ts,metadata-protocol,objectql) is disjoint, and spec(ui):ViewFilterRule.operator's input type isunknown(az.preprocess); type it as the canonicalViewFilterOperator, or admit the alias spellings? (the last site of #19920's family) #20450 shares only the file.Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
os-dev-report
{ "issue": 20466, "status": "done", "branch": "claude/issue-20466-gantt-timezone-describe", "pr": "https://github.com/objectstack-ai/objectstack/pull/20495", "session": "session_014EJ1ED8X4MMrT18BhVx4tx — this run's harness-stamped id (transcript Claude-Session: line)", "premise_still_valid": true, "summary": "Replaced only the false clause in GanttConfig.timeZone's describe (packages/spec/src/ui/view.zod.ts:1920) — 'persisted data stays real instants' — with the triage-directed true wording: a datetime value is still written as the real instant, a date value as the calendar day it was dropped on in this zone's calendar (YYYY-MM-DD). Verified against the spec's own temporalStorageForm rule (packages/core/src/utils/temporal-storage-form.ts, ADR-0053). Regenerated the 4 generated reference-doc occurrences (view.mdx x3, component.mdx x1) via gen:schema && gen:docs, never by hand. Repo-wide grep for the exact phrase found only those 4 doc copies plus the source; no hand-written copy, no test pinning the old text, no other spec producer of the sentence. Merged origin/main (seat 4's #20474 landed under view.zod.ts/view.mdx) via scripts/pm/os-regen-merge.sh, confirmed #20474's content survived byte-for-byte.", "tests": "pnpm --filter @objectstack/spec build: green (36/36 .d.ts, 130 declaration files, 394/394 references resolved). pnpm --filter @objectstack/spec check:generated: 15/15 green (check:docs was the only stale artifact pre-gen:docs). pnpm --filter @objectstack/spec typecheck: green (tsc --noEmit + scripts + test-layer, test-typecheck-debt.json unchanged at 251 errors/138 pinned). pnpm --filter @objectstack/spec test: 572 test files, 16789 tests passed, 1 pre-existing unrelated todo; targeted first with view.test.ts + view-gantt-tree-config-closed-15469.test.ts (502 passed). No test pins the old describe text (repo-wide grep of the phrase against *.test.ts: 0 hits). node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands derived 102 gate commands from the 4-file/30-line diff; ran all 102 with exit codes captured before any pipe: 96 green on first pass. 6 exited 3 (PREREQUISITE NOT MET, not findings). Built @objectstack/formula + @objectstack/lint (pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint) and reran 3 of the 6 that needed only those: check:doc-formula-expressions, check:doc-security-posture, check:docs-transcript-drift — all green (99/102 total green). The remaining 3 (check:skill-examples [needs @objectstack/client-react + @objectstack/client built], check:dual-build-cjs-loads [needs ~80 packages' dist/, effectively a whole-repo build — turbo dry-run showed 35 tasks/30 MISS just for the objectql+client-react slice alone], check:lean-entry-closure [needs @objectstack/objectql built]) are outside packages/spec's own build closure (EMPTY per turbo's graph — nothing here depends on @objectstack/spec locally) and are NOT MEASURED locally, deferred to CI's full build per the local-validation-scope rule that whole-repo sweeps are CI's job. git diff origin/main HEAD -- packages/spec/src/ui/view.zod.ts shows exactly the one-clause change and nothing else.", "mcp_calls": "0 — no MCP GitHub tool calls made at any point (all GitHub reads via plain curl per the dispatch's file-surface constraint; all writes via scripts/pm/ tools behind the fleet-write relay, as instructed for this cloud container)", "api_writes": "3 — POST /repos/objectstack-ai/objectstack/pulls (draft PR #20495 create, via fleet-write relay dispatch fw-20260928T185641Z-c45727); POST /repos/objectstack-ai/objectstack/issues/20495/assignees (os-tesla, via scripts/pm/label-write.mjs, relay dispatch fw-20260928T185731Z-981466); POST /repos/objectstack-ai/objectstack/issues/20466/comments (this report). git pushes (3: initial empty-branch probe, implementation commit, post-merge regen commit) are not counted as REST writes per the write-routing rule.", "gates": "102 commands derived by dispatch-gates.mjs at commit 192aba1136 (merge base 9801da123 / b810ddb6f, changed lines 30, well under the 5000-line human-merge threshold). 99/102 exit 0. 3/102 NOT MEASURED (PREREQUISITE NOT MET, exit 3 — not findings, not failures): check:skill-examples, check:dual-build-cjs-loads, check:lean-entry-closure — each needs unrelated packages' dist/ (client-react+client, ~80 packages, objectql respectively) built; packages/spec's own build closure is empty, so none of these three is in-scope for a targeted local run and CI's full build measures them. Own-package suite: check:generated 15/15, typecheck green, build green, test 572 files/16789 passed.", "line_budget": "not applicable — no skills/** files touched by this diff", "deviations": "None from the claimed file surface (packages/spec/src/ui/view.zod.ts, the two generated reference docs, .changeset/20466-gantt-timezone-describe.md — exactly these 4 paths changed, nothing else). One process correction, not a landed deviation: git merge origin/main was first run by hand outside scripts/pm/os-regen-merge.sh; caught before pushing, reset --hard back to the last-pushed commit, and redone through the script per its own state-tracking requirement (never rerun the script mid-sequence; regenerate+commit by hand once it defers). 3/102 derived gates are NOT MEASURED locally for the prerequisite reasons under `gates` above — reported, not silently skipped.", "files_changed": [ "packages/spec/src/ui/view.zod.ts", "content/docs/references/ui/view.mdx", "content/docs/references/ui/component.mdx", ".changeset/20466-gantt-timezone-describe.md" ], "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commentedon Sep 28, 2026
ACCEPT — PR #20495 at head
192aba1136·domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-28T19:18ZThe seat reviewed the dev report
5876538219on this card against GitHub and the diff.main, first lineFixes #20466, the body'sClause-②: noline at line start, assigneeos-tesla, 4 files (+25 / −5).GanttConfigtimeZonedescribe (packages/spec/src/ui/view.zod.ts) is replaced, with triage's wording (5873772768) verbatim. The four reference-doc rows (view.mdx×3,component.mdx×1) are generator output. The changeset is@objectstack/specpatchwithClause-②: no. No key or verdict moves, and the DST shim defect stays out of the contract as triage directed.check:generated15/15, typecheck and 572 test files green. 102 gates derived: 99 green, 3 NOT MEASURED because they need whole-workspace builds that CI'sBuild Coreruns. The merge oforigin/mainafter seat 4's feat(spec): declare the console's round-trip keys on the stored view wire (#20456) #20474 landed was redone throughos-regen-merge.sh, and feat(spec): declare the console's round-trip keys on the stored view wire (#20456) #20474's content survives unchanged.5876795733on the PR, atCONTRACT_REVIEW_TIER, on this head — PASS. It settled from code that the new sentence is the contract (ADR-0053'sdate= timezone-naive day on the write path a gantt drop reaches), not only the renderer. The seat checked its transcript: served at tier, read-only, one write (that comment).Test Core (5/6), still running at this stamp. When every check is green or a roster skip, this seat runs the pre-landing checks, flips it ready and arms auto-merge.Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
Landing record — PR #20495 MERGED ·
domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-28T20:06Z8255a51232, after the ACCEPT5876819622and the at-tier PASS5876795733.origin/main8255a51232, not by the merged flag:packages/spec/src/ui/view.zod.ts, 3 inview.mdxand 1 incomponent.mdx.packages/andcontent/..changeset/20466-gantt-timezone-describe.mdis blob-identical to the reviewed head.Fixes #20466closed this card ascompleted;pm:dispatchedis removed in this act. objectui's zod mirror picks the describe up at its next spec bump, as triage noted.Generated by Claude Code
fix(spec): correct GanttConfig.timeZone describe — date fields don't …