Skip to content

OODA per-goal reasoner: higher-order re-orientation livelock — standing research goal spawns every cycle for ~6h but ships zero PRs/wip_refs (post-#4453 next-layer stall) #4509

Description

@rysweet

Summary

A stale-engineer investigation of standing research goal continuously-research-and-improve-your-own-cogn-70ab8541 surfaced a higher-order re-orientation livelock: the post-#4453 agentic per-goal reasoner correctly runs once per cycle and correctly chooses spawn (because there is no live PR/branch/worker), but the spawn never produces a durable artifact. Across ~6 hours (OODA cycles 2477–2484, 09:04–12:05 on 2026-07-23) every per-goal decision logs 0 PRs / wip_ref_count=0 / 0 effect jobs, is followed ~4 min later by a research_idle_fault (no-novel-action-produced), and ships zero PRs/branches. The single-cycle idle exemption (#4399/#2589) and the imperative-vs-reasoner split (#4453) are working exactly as designed — the goal never blocks, never gets reaped, refs are preserved — but the outer loop makes no shippable progress.

This is a non-blocking self-improvement signal, not a death signal. The engineer is alive (see verdict below); this issue tracks the wasted-work pattern only.

Evidence

Durable archive (survives worktree cleanup):
/home/azureuser/.simard/reaped-engineers/rysweet_Simard_continuously-research-and-improve-your-own-cogn-70ab8541-1784808433/

Repeating cadence from journal.txt (pid 3159928, post-#4453 binary):

09:04:02 per-goal: spawn (0 PRs, 0 wip refs, 0 effect jobs; standing_idle_signal true)
09:35:00 WARN no-progress breaker: research goal idled — FAULT signal recorded (counter reset, goal stays active, never blocked); re-orient is owned by the agentic per-goal reasoner
... (cycles 2478, 2479, 2480, 2481, 2482, 2483) ...
12:00:45 per-goal: spawn (No live PR/branch and wip_ref_count=0; standing research goal is idle)
12:05:35 WARN no-progress breaker: research goal idled — FAULT signal recorded ...

Every spawnresearch_idle_fault pair produces no wip_ref, no PR, no effect job. The reasoner keeps deciding to "start the next concrete piece" but nothing concrete ever lands.

Why this is a defect (root cause hypothesis)

The spawn action is chosen from durable inputs (open_pr_refs, wip_refs, worker_present) but there is no feedback edge that detects "I have chosen spawn N cycles in a row for this goal and none of them created a wip_ref / PR / effect job." The imperative rail was deliberately demoted to a pure signal by #4453 (correct), but nothing at the reasoner layer treats a repeated non-productive spawn as itself a stall to re-strategize. The result is a re-orientation livelock one level above the single-cycle idle the #4399/#4453 fixes already handle.

Proposed direction (not applied here)

  • Give drive_per_goal_cycle a bounded per-goal counter of consecutive spawn/idle-fault cycles that produced zero durable artifact, and when it trips, steer the reasoner toward a different PerGoalAction (e.g. investigate why spawns aren't landing, or reorient to a genuinely novel direction) instead of another identical spawn.
  • Ensure a spawned engineer that fails to open any wip_ref within a cycle window is surfaced as a signal, not silently retried.

Scope / related (already tracked — do NOT duplicate)

Investigation verdict (for context)

verdict = still-alive (false positive). Parent Simard OODA process (pid 3159928) was actively re-orienting the goal at cycle 2484 12:05:35, ~1.5 min before the manifest archive at unix ts 1784808433. idle_age_secs=11061 measures worker-file staleness, not process death. No reap, no worktree removal, no claim release.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingooda-stuckAuto-filed by the OODA no-progress breaker when a goal is stuck and needs operator attention

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions