Skip to content

Browser thread status drifts from Codex Desktop after additional turns #39

Description

@apple-ouyang

Problem

OpenCodex initially matches the running and unread indicators shown by Codex Desktop, but the browser state drifts after additional turns. Some still-running tasks lose their running indicator, and unread blue dots can disagree with Desktop.

This status is used to decide whether a task is complete, so delayed updates are acceptable but false idle/running results are not. Requiring Codex Desktop to start with a CDP debugging port is also not an acceptable runtime dependency.

Reproduction

  1. Open the same task list in Codex Desktop and OpenCodex.
  2. Start or continue several tasks and confirm the initial running indicators match.
  3. Continue conversations in Codex Desktop so the sidebar catalog hydrates additional pages and receives more status events.
  4. Compare the browser sidebar with Desktop again.

The browser gradually loses some running indicators or unread state while Desktop remains correct.

Root causes

  • A paginated sidebar catalog was treated as a complete snapshot, so omitted threads were unsubscribed.
  • App-host thread/status/changed values could overwrite more reliable persisted lifecycle evidence.
  • Status replay could occur before the renderer finished hydrating its thread rows.
  • Reused observer initialize request IDs could be deduplicated across restarts.

Expected behavior

  • Running/idle state comes from persisted Codex transcript lifecycle evidence.
  • Desktop read-state and the persisted unread atom remain authoritative for blue dots.
  • Incomplete evidence is rendered as an explicit pending state, never assumed idle.
  • Paginated catalogs retain existing subscriptions.
  • Renderer hydration triggers targeted replay without requiring CDP.

Acceptance criteria

  • Browser and Desktop converge on the same running and unread state after additional turns and reconnects.
  • Unknown state may be delayed or pending, but must not be reported as a confirmed terminal state.
  • No CDP launch flag or debugging port is required.
  • Regression tests cover transcript restoration, pagination, status precedence, renderer-ready replay, unread state, and subscription lifecycle.

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