LearnNewsExamplesServices
Frontmatter
id17302
titleCockpit timestamps render viewer-local via Intl; wire stays UTC
stateClosed
labels
enhancementdesignaiagent-os
assigneesneo-opus-grace
createdAtAug 17, 2026, 6:20 PM
updatedAtAug 18, 2026, 11:26 AM
githubUrlhttps://github.com/neomjs/neo/issues/17302
authorneo-fable-clio
commentsCount0
parentIssue14560
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 18, 2026, 11:26 AM
milestonev13.2

Cockpit timestamps render viewer-local via Intl; wire stays UTC

Closed Backlog/active-chunk-17 enhancementdesignaiagent-os
neo-fable-clio
neo-fable-clio commented on Aug 17, 2026, 6:20 PM

Context

Operator feedback, live during the #17271 L1 paired session (2026-08-17): "date and time shows UTC, local time and time formatting would be better (easy in JS)." The activity stream renders HH:MM derived from UTC instants; the operator seat sits in Europe/Berlin (+2 in August) — every glance at the surface whose whole point is at-a-glance truth requires mental offset arithmetic.

The Problem

Human-facing instants across the cockpit (activity rows, presence lastSeenAt, catch-up entries, mailbox panes) render raw-UTC-derived strings. No §04-bar rule exists for time presentation, so each surface invents its own — the exact per-surface drift the design SSOT (#17263 → PR #17279) exists to prevent.

The Architectural Reality

  • apps/agentos/view/fleet/ActivityStream.mjs renders row times; coalesced same-actor runs show the newest event per the documented run contract.
  • The §06 design SSOT + apps/agentos/TOKENS.md (merged via PR #17279) is the governing home for a presentation rule; panes (#17268) inherit from it.
  • Wire DTOs (fleet snapshots, presence envelopes) carry ISO-8601 UTC and MUST stay that way — receipts and cross-checks (e.g. the #17271 AC2 evidence table) depend on wire-time being zone-free.

The Fix

  1. One rule in the §06 SSOT (+ TOKENS.md appendix line): human-facing instants render via Intl.DateTimeFormat in the VIEWER's locale/zone; wire stays ISO-UTC; the exact ISO instant rides title/hover for receipt-grade reading. Same-day instants render time-only; older rows gain a compact locale-aware date part.
  2. First consumer: the ActivityStream row template (coalesced runs: newest instant).
  3. Sweep remaining cockpit surfaces to the rule (presence lastSeen, catch-up, mailbox panes) — same PR or an explicitly listed follow-up.

Acceptance Criteria

  • Stream rows render viewer-local time (Intl); ISO-UTC on hover/title.
  • SSOT §06 + TOKENS.md carry the time-presentation rule (spec merged with implementation).
  • Wire DTOs unchanged (ISO UTC).
  • Unit coverage: formatter honored under a mocked non-UTC zone; same-day vs older-row format switch.
  • One shared helper, token-governed — no bespoke per-surface formatters left in touched surfaces.

Out of Scope

Relative-time vocabulary ("3m ago") — a separate design question; absolute-local is this ticket. Pane-level information design (#17268).

Related

Epic #14560 (parent) · #17263 / PR #17279 (§04 bar + SSOT home) · #17268 (panes inherit the rule) · #17271 (origin session, operator-witnessed L1 run)

Live latest-open sweep: latest 20 open checked 2026-08-17T16:19Z, no equivalent; A2A claim window (last 60 min) clean; KB semantic + exact keyword sweeps clean (adjacent-only: #17087 timestamp guard dedup — code-level, unrelated).

Origin Session ID: 7ee47ccf-d1c7-469d-a75e-15cebf3b5ea5

Retrieval Hint: query_raw_memories("cockpit viewer-local Intl timestamps SSOT rule L1 session")

tobiu referenced in commit fdfc533 - "feat(agentos): cockpit instants render viewer-local while the wire stays UTC (#17302) (#17323) on Aug 18, 2026, 11:26 AM
tobiu closed this issue on Aug 18, 2026, 11:26 AM