Skip to content

codex harness: perpetual procevent sources go ownerless across idle turns (no cross-turn continuity) #2502

Description

@tiago-peixoto

Summary

A Codex-harness primary or secondmate cannot keep a perpetual process-event source alive across idle turns. bin/fm-watch-checkpoint.sh reconciles and restarts sources at each checkpoint, but only while a turn is active; when the last actionable turn ends, nothing owns the source until the next captain-triggered turn. A perpetual source that goes single-shot after each result therefore sits ownerless indefinitely.

Observed behavior, measured

Secondmate on harness=codex, owning a perpetual GitHub PR-monitoring source (bin/fm-procevent.sh, single-shot after each actionable result by design, relying on ordinary watcher reconciliation to re-arm):

  • Last successful inventory 2026-08-15T11:51:57Z; it emitted sequence 14, the source exited, the result stayed pending.
  • At diagnosis ~40 hours later: bin/fm-procevent.sh list reported OWNER none, PENDING 1; the session-start guard reported the last watcher beat ~144,900 s old.
  • Consequence: a captain-authored PR opened during the interval was never inventoried, and a base squash-merge that turned another PR conflict-dirty was never observed. Both had correct predicates; there was simply no observation interval.

Diagnosis and evidence: the secondmate's own report confirmed "Codex checkpoints reconcile and restart sources at each checkpoint, but only while a turn is active, so there is no cross-turn continuity."

Why this is a harness-protocol defect, not a source defect

The procevent contract is explicit: the handler acknowledges the captured result and ordinary reconciliation keeps the perpetual source armed. On Claude the Stop-owned auto-arm (bin/fm-claude-stop-autoarm.sh) supplies that continuity across idle turns with no model tokens. On Pi/opencode the extension model does. Codex's protocol is bounded foreground checkpoints (docs/supervision-protocols/codex.md) precisely because Codex cannot reason while a foreground call runs - which is correct for wakes but leaves no idle-turn owner for source reconciliation. The same-shaped hazard exists for any Codex home relying on procevent.

What we would find useful

  • A Codex-side idle-turn continuity mechanism for procevent reconciliation - the smallest shared correction, not a per-source sidecar or scheduler (which the secondmate correctly refused to build).
  • Failing that, bin/fm-procevent.sh could surface OWNER none with a stale-age loudly through the session-start digest and the daemon heartbeat scan, so a dead perpetual source becomes a visible alarm rather than a silent absence. The 40-hour gap here was discovered by a captain asking "why wasn't this PR reviewed?", which is the wrong instrument.

Firstmate fork at the current upstream tip; happy to contribute either fix. Related: this is the procevent-side twin of the supervision-starvation class fixed in #2392.

Metadata

Metadata

Assignees

No one assigned

    Labels

    ready-for-prTriage: real bug or VISION-aligned feature, open for a PR

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions