Skip to content

The merged transcript's wall clock is UTC on the server and local in the browser #447

Closed

Description

@Vortiago

The merged transcript's [HH:MM:SS] wall clock is rendered twice, in two
timezones, and the operator can see both at once.

Server — UTC. session_merge._clock (tapscribe/session_merge.py:309) parses
the stamp with text.parse_iso, which returns a tz-aware UTC datetime, then
calls .strftime("%H:%M:%S") on it. That feeds render_transcript_text, which
builds plain_text → session-transcript.txt on disk, and which
batch_summarize (:121) re-renders as the summarizer's input.

Client — the viewer's local time. formatters.fmtClock
(tapscribe/web/js/formatters.js:56) does new Date(iso) →
Intl.DateTimeFormat(undefined, …), i.e. the browser's timezone. That is what
the merged pane shows, what buildCopyText puts on the clipboard, and — since
the .txt download reuses buildCopyText (transcript.js:662) — what the
downloaded file contains.

For an operator anywhere but UTC the two disagree by their offset. Concretely at
UTC+2: the pane and the downloaded .txt read 14:05:12, while the summary the
model wrote from the same line says 12:05:12, and so does
session-transcript.txt sitting in the recordings folder next to it.

Deciding it

Which side moves is a product call, not a mechanical one:

  • Local everywhere matches what the operator experienced, and matches the
    rest of the dashboard (every other timestamp is Intl-formatted). But the
    server has no viewer timezone — it would have to be threaded to the summarize
    request, and session-transcript.txt is written by a batch job with no viewer
    at all.
  • UTC everywhere is unambiguous and needs no timezone plumbing, but makes
    the pane disagree with every other clock in the UI and with the wall clock the
    meeting actually happened on.
  • Stamp the offset (14:05:12+02:00, or a times are UTC header line on the
    rendered text) keeps both renderings and removes the ambiguity instead of the
    divergence. Cheapest, and probably right for the summarizer input specifically,
    where the model is reading the times rather than the operator.

Whatever wins, the two spellings should end up sharing one stated rule, the way
the speaker-name resolution now does.

Not new

Pre-existing: _clock has rendered UTC since the merged transcript existed.
Surfaced while reviewing #438, which routed the summarizer through
render_transcript_text and so put the two renderings side by side in one
operator-visible flow.

Activity

  1. added
    in-progressActively being worked on (in-flight delegation)
    on Sep 29, 2026
  2. Vortiago commented on Sep 29, 2026

    @Vortiago
    OwnerAuthor

    Claimed by the Slipestein delegation experiment, slice 447, on 2026-09-29. experiment.sh release 447 takes the label off when the slice ends, merged or not.

  3. removed
    in-progressActively being worked on (in-flight delegation)
    on Oct 3, 2026
  4. Vortiago commented on Oct 3, 2026

    @Vortiago
    OwnerAuthor

    Released by the Slipestein delegation experiment, slice 447: merged as TapScribe PR #462 (1ab024f). The issue is free to pick again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions