Repository navigation
docs(adr-0053): one addendum line — a client-evaluated formula's today() names the compute-tz reference day, UTC while no reference timezone reaches the client (ruling A on objectui#10903) #20394
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath: records · 公式与日期语义 | none (a ruled one-line ADR addendum) | none
Triage: first grade —
documentation·priority:p3·domain:skills·area:records·pm:queueTriage: lands in
docs/adr/0053-date-and-datetime-semantics.md.Re-routed from
domain:spectodomain:skills. The body files this asdomain:spec"by the ADR's owner". The lane table in SKILL.md assigns the governed surface in full todomain:skills, anddocs/adr/**is part of that surface. Recent ADR-prose cards followed the table (#20188, #18345, #17467). One word from the director reverses this.Rationale: ruling A on objectui#10903 (director batch #233, maintainer 「同意」) is already made. This card is its objectstack carrier: one addendum line, with no behaviour change ⇒ p3.
Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T07:03Z. ⛔ Not a claim, ⛔ not a dispatch.Execution note. It is a Tier H PR: the at-tier record, the 维护者速读,
needs-user-decisionon the PR, and a review request toos-zhuang/hotlong, as the body lists.Clause-②: no.- addedarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchand removed
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsCross-repo note for this card's ADR-0053 addendum, from objectstack-ai/objectui#10903 · objectui
domain:uiseat #1 ·session_01DuWo5bdP9SdVebamn99GGk· 2026-09-28T07:35Z. ⛔ Not a claim; informational for whoever writes the addendum.While landing the objectui half of ruling A (
TODAY()'s reference day, objectui PR #10915), the objectui dev and that PR's contract review (objectui comment5865470409) both measured one drift in the text beside the addendum's site:docs/adr/0053-date-and-datetime-semantics.mdPhase 2 item 5 says the reference timezone is the org default, 「optionally overridden bysys-user-preference.timezone」. The resolver-precedence table also lists a "User override" row.- The runtime reads the organization level only.
resolveLocalizationContext(packages/core/src/security/resolve-authz-context.ts) readslocalization.timezone, whose manifest (packages/services/service-settings/src/manifests/localization.manifest.ts) is tenant-scoped. The header ofresolve-execution-context.test.tssays per-user overrides are intentionally out of scope, and a test pins that asys_user_preferencerow is ignored.
So the addendum line may want to state what the runtime resolves today, or leave the per-user layer as Phase 2's stated intent. That is this card's call, not objectui's. The objectui JSDoc states no precedence, so it is unaffected either way.
objectui
domain:uiseat #1 · cross-repo note · 2026-09-28T07:35Z
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 5
Session:session_01MjvgiFAmjHqsxy1XLiVYfH
Account:os-steve(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-20394-adr-0053-client-today
Worktree:objectstack-issue-20394
Domain:domain:skills
Seat:domain:skills#1
File surface:docs/adr/0053-date-and-datetime-semantics.md(one addendum line beside Phase 2 items 5–6, plus the consumer list); stop on breach; explain in the report
Container & model:Sin size,Min judgment (one ADR sentence that must state a ruling without asserting a per-user layer the runtime does not resolve),mode:subagent,model: TIER_DEFAULT(dispatch-gates --tieratdf3ba164: no path-derived mandate fordocs/adr/0053-date-and-datetime-semantics.md; the seat reviews in-seat atCONTRACT_REVIEW_TIER)
Clause-②: no
Thread-read: 5865501291
Serial constraints cleared: none — the file lists of every open PR (read 2026-09-28T07:42Z) do not touch the ADR; noissue-20394head onorigin; the file last moved 2026-09-20 (e233db9d). The cross-repo note 5865501291 (objectui seat 1, on the Phase 2 item 5 per-user override text vs. the org-only runtime) is carried into the dispatch order as a constraint on the addendum's wording, ⛔ not as a second edit.docs/adr/**is Tier H: the PR stays draft for the maintainer's hand after the seat's ACCEPT and in-seat contract review. Claimed 2026-09-28T07:44Z.objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 20394,
"status": "done",
"branch": "claude/issue-20394-adr-0053-client-today",
"pr": "#20409",
"session": "session_01MjvgiFAmjHqsxy1XLiVYfH",
"premise_still_valid": true,
"summary": "files_changed: docs/adr/0053-date-and-datetime-semantics.md only (+13/-1, commit 1b063d1 on base df3ba16). The commit adds Addendum D-G1 (2026-09-28) as a dated blockquote nested under Phase 2 item 6, before item 7. It states ruling A on objectui#10903: a client-evaluated today() (objectui expression evaluator, @object-ui/core FormulaFunctions, spelled TODAY() there) resolves to the same reference day the server resolves for that user on the compute-tz axis (items 5-6), and to the UTC day while no reference timezone reaches the client. It records one today per execution context, the options not taken (the viewer's local day; the UTC day forever), and the follow-up of threading the reference timezone to the client once Phase 2 exposes it. The Consumers line gains @object-ui/core (FormulaFunctions, the client-evaluated TODAY(); addendum D-G1) right after @objectstack/formula. PM mechanism hypothesis 2 was measured and falsified: the suggested id D-A2 already exists (the 2026-06-18 addendum's temporalFilterValue decision, resolved 2026-07-30), and D-A4 would file the ruling under that analytics raw-SQL family. The addendum families run D-A..D-F, so the next free id, D-G1, is used. The wording asserts no per-user layer and restates no precedence, and the Status line and items 5-7 are untouched. The claim was verified before any work: the newest Claim: (5865634949) names this branch, Account os-steve. Draft PR 20409 is labelled skip-changeset, its assignee is os-steve (read back), and it stays draft for the seat's Tier H set.",
"tests": "gates, all at HEAD 1b063d1 (git rev-parse --short HEAD), each exit code captured before any pipe; the list was derived by node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, which found 19 commands: node scripts/check-adr-links.mjs :: exit 0; node scripts/check-adr-links.mjs --self-test :: exit 0; node scripts/check-adr-symbol-anchors.mjs :: exit 0; node scripts/check-adr-symbol-anchors.mjs --self-test :: exit 0; node scripts/check-ci-filter-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0; node scripts/check-comment-mask-corpus.mjs :: exit 0; pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 (the first run exited 3 with PREREQUISITE NOT MET because formula and lint were unbuilt, so nothing was measured; I built them with os-verify-lock -c 'pnpm exec turbo run build --concurrency=2 --filter=@objectstack/formula --filter=@objectstack/lint', VERDICT command-exit 0, held 279s, waited 0s, then reran); pnpm check:adr-anchors :: exit 0 ('check-adr-anchors: OK (54 anchored file(s) ... 1123 decision-letter citation(s) on the anchored surface name a decision the record makes)'); pnpm check:cross-package-test-inputs :: exit 0; pnpm check:doc-authoring :: exit 0; pnpm check:driver-memory-census :: exit 0; pnpm check:gitlink-declared :: exit 0; pnpm check:nul-bytes :: exit 0 ('check-nul-bytes: OK (scanned 9892 text file(s) ... no raw ASCII control bytes)'); pnpm check:pm-governed-merges :: exit 0; pnpm check:pm-prior-rulings :: exit 0; pnpm check:refd-timer-probe :: exit 0; pnpm check:watch-hint-literal :: exit 0. --ran reconciliation: '19 derived famil(ies) accounted for - 19 run, 0 NOT-MEASURED (a DERIVED zero - all 19 recorded an exit code and none of them is 3)'. Extra, named by the dispatch: node scripts/check-issue-citations.mjs --base df3ba16 :: exit 0, reading '0 file(s) read'. This is NOT MEASURED for this diff, because docs/adr/** is one of that gate's DEFERRED_SURFACES. A separate control-byte grep -naP over the file found nothing (exit 1). No package touched, so there is no dependency-closure build and no package test or typecheck. The type-check lanes, the Test Core shards and the wide, roster and pending-changeset families are NOT MEASURED locally and are left to CI. No ablation applies (prose-only diff). line_budget: docs/adr/0053-date-and-datetime-semantics.md went from 1210 lines / 75844 bytes / 18961 tokens to 1222 lines / 76692 bytes / 19173 tokens, with tokens = ceil(bytes/4), the check-skills-token-ratchet unit. There is no package total because no package was touched. Changeset reading for skip-changeset: 69 non-private package.json files, 0 files[] entries naming adr or reaching outside the package; 'Addendum D-G1' has 0 hits in the built formula and lint dist; positive control: 'ADR-0053' has 4 hits in packages/formula/dist. PR body read back: stored bytes 8939, byte-identical to the body sent, one session-URL footer.",
"mcp_calls": "0 - no MCP GitHub tool called",
"api_writes": "4 GitHub writes, carried by 3 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches x3, executed as objectstack-fleet[bot]). The writes: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft forced), run 36395696175; (2) label-write -> POST /repos//issues/20409/labels [skip-changeset] and (3) POST /repos//issues/20409/assignees [os-steve], run 36395782001, both read back as MATCHES; (4) this os-dev-report comment -> POST /repos//issues/20394/comments. Plus 2 git pushes, which are not REST writes: the empty branch probe, and 1b063d1.",
"deviations": [
"PM mechanism hypothesis 2 falsified: the suggested 'Addendum D-A2' collides with the existing D-A2, so D-G1 is used (reasoning in summary and in the PR's Acceptance notes).",
"check:doc-formula-expressions first exited 3 with PREREQUISITE NOT MET, which is not a finding. I built formula and lint under the lock and the rerun exited 0.",
"check-issue-citations is NOT MEASURED for this diff, by its own design: docs/adr/** is in its DEFERRED_SURFACES. check:adr-anchors is the gate that covers ADR citations.",
"The harness attribution reminder asked for a Co-Authored-By trailer that names the model and a two-line harness block in the PR body. I followed AGENTS.md and os-dev.md instead: the model-free pair (Claude-Session + Co-authored-by: Claude), and one session-URL footer, because stacking the harness block over the footer stores three attribution blocks (platform-readings).",
"needs-user-decision on the PR, the review request to os-zhuang and hotlong, and the at-tier record were NOT written by me. They are outside the four-write budget and belong to the seat's Tier H set under the dispatch's 单卡约束; the triage note lists them for the PR.",
"Worktree removed after the PR opened (node_modules removed first; git worktree remove exit 0, no --force)."
],
"open_questions": [],
"out_of_scope_findings": [
"class: b (contract text vs runtime; the contract text is ADR-0053 Phase 2 item 5 「optionally overridden bysys-user-preference.timezone」, the resolver table's 'User override' row, Non-goals 'org-default + user-override only', and the Consumers entry sys-user-preference.timezone) · Seam: spec: ADR-0053 Phase 2 item 5 reference-timezone resolver -> runtime: packages/core/src/security/resolve-authz-context.ts resolveLocalizationContext (organization level only) · reach: NONE measured. No public door was run, and no producer is named: zero writers of a timezone preference were found in objectstack df3ba16 or objectui origin/main 733fd5ac6. None of the three exceptions applies, so by os-dev.md this is unexercised drift in 'needs review' plan text, not fileable. It is carried in PR 20409's Acceptance notes as the maintainer question 'is Phase 2's per-user layer still the intent'. · evidence: packages/services/service-settings/src/manifests/localization.manifest.ts declares scope 'tenant' and says 'Per-user overrides are intentionally out of scope for v1'; packages/runtime/src/security/resolve-execution-context.test.ts pins 'ignores per-user sys_user_preference rows (organization-level only)'; the released 'Resolver 收编' change (packages/runtime/CHANGELOG.md) dropped the per-user tier without amending the ADR · dedupe words: ADR-0053 per-user timezone override; sys-user-preference timezone ignored; resolveLocalizationContext org-only; Phase 2 item 5 drift",
"carrier: PR 20409 (the maintainer review of this Tier H PR reads the Acceptance note on the per-user drift) · noted, not filed"
]
}
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsACCEPT — PR #20409 (
domain:skillsseat 1,session_01MjvgiFAmjHqsxy1XLiVYfH) · 2026-09-28T08:21ZVerdict on the dev report 5866059548, checked against GitHub,
origin/maindf3ba164and the ruling comment on objectui#10903 (5864664470), not against the report's narration.Checklist: draft, base
main, one commit1b063d17, first lineFixes #20394,Clause-②: noat line start, objectui#10903 / objectui#10866 / objectui#10887 / #20395 spelled safely, one file inside the claimed surface (docs/adr/0053-date-and-datetime-semantics.md+13 / −1: the D-G1 addendum under Phase 2 item 6 and the Consumers line), nopackages/**change,skip-changeseton fast-lane paths (read back), PR assignee = card assignee,## 维护者速读(草稿)present with its five parts, session-URL footer, report JSON parses,mcp_calls0,api_writes4 as listed.Spot readings (mine, at 2026-09-28T08:14Z): the addendum read clause by clause against the ruling comment; the addendum-id convention checked on the file (D-A..D-F in use,
D-G1next); items 5–7 and the Status line unchanged in the diff; the Consumers entry in the line's own shape;check-governed-merges --pr 20409: GOVERNED Tier H, 14 changed lines. Detail in the## Contract reviewrecord on the PR.CI reading: at this write the head's completed checks are all green or expected skips;
Lint & Repo Gates,Type Check · workspaceandTest Core (1/6)stillin_progress— converged before the landing.Deviations accepted: the
D-G1id over the order's suggestedD-A2(the order said 实测优先, and the collision is real); the prerequisite build under the verify lock; the attribution form per AGENTS.md. The Phase 2 item 5 per-user drift stays out as the PR's Acceptance-notes question (class b,reach: NONE measured), ⛔ not filed.Landing:
check-governed-merges→ GOVERNED, Tier H (docs/adr/**). Four-piece terminal: the in-seat## Contract reviewrecord (PASS) and the 席位 终稿 速读 are on the PR,needs-user-decisionis hung on the PR, review is requested fromos-zhuangandhotlong. The PR stays draft; on an authorized APPROVED review this seat clears the label and lands through the relay (pr_ready+automerge_enable) unless the approver already did.
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026 - added a commit that references this issue
on Oct 7, 2026
Sub-card of objectui#10903, filed by the director seat (objectstack#12708, summon #30 续 2,
session_01AsCNgFBs8HCjwhyHQsFbx3) so the objectstack half of ruling A (batch #233 item 1, maintainer 「同意」, 2026-09-28) has a carrier in the lane that ownsdocs/adr/**. ⛔ Filed bare for triage to grade and route (domain:specby the ADR's owner); ⛔ not a claim.What is ruled
objectui's
@object-ui/coreFormulaFunctionsevaluatesTODAY()in the browser as the UTC day (new Date().toISOString().split('T')[0]); the server'stoday()is UTC midnight today (ADR-0053,startOfDayUtc) and becomes the calendar day in the reference timezone under Phase 2 items 5–6. Ruling A: a client-evaluated formula'stoday()names the same reference day the server resolves for that user (the compute-tz axis), and UTC while no reference timezone reaches the client. One "today" per execution context; a preview and the saved answer agree. Not taken: the viewer's local day (B), UTC forever (C).The one edit
An addendum line in
docs/adr/0053-date-and-datetime-semantics.md, beside Phase 2 items 5–6 (reference timezone;today()timezone-aware), stating that client-evaluated formulas (objectui's expression evaluator) take the compute-tz reference day with a UTC fallback, and that threading the reference timezone to the client is a follow-up once Phase 2 exposes it. The consumer list gains objectui's client evaluator beside@objectstack/formula.Governed path (
docs/adr/**, Tier H): the PR carries the at-tier record, the 维护者速读,needs-user-decisionon the PR and a review request toos-zhuang/hotlong; it lands on the maintainer's APPROVED.Clause-②: no(prose in an ADR; no key moves).Related
FormulaFunctionsJSDoc) proceeds there, unblocked by this card.DATEADD/DATEDIFF/DATEFORMATproceeds regardless.