Observation
ORA-2026-0064
Observation
Claude CronCreate jobs within a single persistent session share the session's message queue. When two CronCreate jobs fire at the same moment, their prompts coalesce into a single turn instead of executing independently. This was observed on 2026-04-18 at 14:48:19Z in session bf0cf587-7e1d-44be-b399-34acf92892de when evidence-health and shepherd fires coalesced.
Inventory of active cron/monitor surfaces
Externalized (LaunchAgent-based, no session collision risk)
| Surface | LaunchAgent | Cadence | Mechanism |
|---|---|---|---|
| Shepherd fire | com.orbit.shepherd-fire-prompt | 300s interval | claude -p one-shot (no persistent session) |
| Shepherd feed-watch | com.orbit.shepherd-feed-watch | 300s interval | bash script (no Claude session) |
| Provider parity check | com.orbit.provider-parity-check | calendar interval | bash script via osascript |
| Orphan sweep | com.orbit.orphan-sweep | calendar interval | bash script via osascript |
| Memory health check | com.orbit.memory-health-check | weekly Mon 09:30 | bash script via osascript |
| TRAM loop ops | com.camber.tramloop.ops | 30s interval | bash script |
| Beside direct read | com.heartwood.beside_direct_read | 60s interval | bash script |
| Desktop inbox ingest | com.camber.desktop-inbox-ingest | WatchPaths | bash script |
| Redline sync watcher | com.heartwoodcustombuilders.redline-sync-watcher | WatchPaths | bash script |
These have ZERO session collision risk because they either: (a) use claude -p which creates fresh one-shot sessions, or (b) are pure bash scripts that don't invoke Claude at all.
Session-only (CronCreate inside persistent Claude session — COLLISION RISK)
| Surface | Cadence | Session | Status |
|---|---|---|---|
| Evidence-health | :13 and :43 of each hour | bf0cf587-... (Claude Desktop ORA-01) | ACTIVE risk — no external launcher exists |
Evidence-health is the only identified session-only CronCreate. The shepherd was previously in the same collision class but has been externalized to a LaunchAgent (com.orbit.shepherd-fire-prompt) which launches claude -p one-shot calls.
Queue-collision analysis
The coalescing incident (2026-04-18T14:48:19Z) happened because: 1. Evidence-health CronCreate fired at :43 2. Shepherd CronCreate fired at approximately the same time (300s interval) 3. Both prompts landed in the same session message queue 4. Claude processed them as a single merged turn
After externalization of the shepherd to a LaunchAgent, the coalescing risk is eliminated for shepherd + evidence-health. However, if any NEW CronCreate jobs are added to the same persistent session, the coalescing pattern will recur.
Repair assessment
| Surface | Verdict | Action |
|---|---|---|
| Shepherd fire | NO RISK | Already externalized to LaunchAgent |
| Evidence-health | ACTIVE RISK | Needs externalization: create com.orbit.evidence-health.plist LaunchAgent + fire script (same pattern as shepherd-fire) |
| All bash-only LaunchAgents | NO RISK | Not Claude sessions |
| Future CronCreate jobs | LATENT RISK | Doctrine guard needed |
Recommended repairs
1. Externalize evidence-health — create com.orbit.evidence-health.plist + evidence-health-fire launcher script following the shepherd-fire pattern. Use claude -p one-shot with the evidence-health-cron-protocol.md as input. Calendar interval at :13 and :43 per hour.
2. Doctrine guard against session-only CronCreate — CronCreate inside persistent sessions should be treated as a last resort. Preferred pattern: LaunchAgent + claude -p one-shot (per ORA-2026-0013 long-running shepherd cron pattern). CronCreate is acceptable only when: (a) the job requires persistent session context that can't be reconstructed from files, AND (b) the session hosts at most one CronCreate job.
3. No rearm-minute changes needed — the externalized surfaces are already on sensible cadences. Shepherd at 300s with lock guard. Evidence-health at :13/:43 (~30 min intervals). No overlap risk when each runs in its own one-shot session.