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.
Summary
A Codex-harness primary or secondmate cannot keep a perpetual process-event source alive across idle turns.
bin/fm-watch-checkpoint.shreconciles 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):2026-08-15T11:51:57Z; it emitted sequence 14, the source exited, the result stayed pending.bin/fm-procevent.sh listreportedOWNER none, PENDING 1; the session-start guard reported the last watcher beat ~144,900 s old.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
proceventcontract 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 onprocevent.What we would find useful
bin/fm-procevent.shcould surfaceOWNER nonewith 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.