Skip to content

[codex] canonicalize client timestamps#4112

Merged
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
maxwellyoung:codex/canonicalize-client-timestamps
Jul 18, 2026
Merged

[codex] canonicalize client timestamps#4112
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
maxwellyoung:codex/canonicalize-client-timestamps

Conversation

@maxwellyoung

@maxwellyoung maxwellyoung commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Fixes #3983.

What changed

  • assign canonical timestamps to client orchestration commands when the server receives them
  • apply the same receipt timestamp to nested thread creation metadata when a first turn bootstraps a thread
  • cover both ordinary timestamped commands and bootstrap turns with regression tests

Why

Clients currently generate createdAt from their local clocks. If a client clock is ahead, that future timestamp reaches persisted events and projections, so an older user message can sort after its assistant response and after genuinely newer prompts.

Canonicalizing at the server boundary keeps persisted chronology consistent across web and desktop clients while leaving internal server-generated command timestamps unchanged.

This is forward-only: it prevents new skewed records but does not migrate timestamps that are already persisted.

Verification

  • vp check (passes with 10 pre-existing warnings in unrelated web files)
  • vp run typecheck
  • vp test (4,756 passed, 7 skipped)
  • git diff --check

Note

Canonicalize client timestamps in normalizeDispatchCommand with server receipt time

  • Adds canonicalizeClientCommandTimestamps in Normalizer.ts that replaces client-supplied createdAt with the server's receipt timestamp.
  • For thread.turn.start commands that include bootstrap.createThread, the bootstrap's createdAt is also overwritten.
  • normalizeDispatchCommand now calls this before any other normalization logic.
  • Behavioral Change: client-provided createdAt values on all dispatched commands are now silently overwritten with the server receipt time.

Macroscope summarized 3337346.


Note

Medium Risk
Silently overwrites client timestamps on every dispatched command, which changes persisted event ordering for all clients but is scoped to the normalization boundary and covered by tests.

Overview
Client orchestration commands no longer persist client-supplied createdAt values. normalizeDispatchCommand now stamps commands with the server’s receipt time via new canonicalizeClientCommandTimestamps, applied before workspace and attachment normalization on both HTTP and WebSocket dispatch paths.

For thread.turn.start commands that bootstrap a new thread, the nested bootstrap.createThread.createdAt is overwritten with the same receipt timestamp so thread creation and the first turn stay in order when client clocks are skewed. Regression tests cover a plain timestamped command and a bootstrap turn.

This is forward-only: existing persisted timestamps are unchanged.

Reviewed by Cursor Bugbot for commit 3337346. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 4239b51b-c002-43a3-8c1d-d24f76dc9c3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Jul 18, 2026
@maxwellyoung
maxwellyoung marked this pull request as ready for review July 18, 2026 00:28
@macroscopeapp

macroscopeapp Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

This PR adds server-side timestamp canonicalization to ensure consistent timestamps regardless of client clock drift. The change is focused, well-tested, and follows a standard pattern for data integrity.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarminge merged commit da3c203 into pingdotgg:main Jul 18, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Client clock skew persists future timestamps and reorders thread messages

2 participants