heal(conductor): clear dispatch drift (merged→done, stale→open, chronic→needs_human)#964
heal(conductor): clear dispatch drift (merged→done, stale→open, chronic→needs_human)#9644444J99 wants to merge 1 commit into
Conversation
… chronic→needs_human)
The hourly Conductor Report reds on the drift gate: {PR_MERGED:2, DISPATCHED_NO_PR:5, CHRONIC:1} —
normal live-queue churn (merged-not-yet-harvested, stale dispatches, one new chronic) that the beat's
own heal-dispatch --apply resolves each cycle. Runs the sanctioned status-mutator effector once to
resolve it: merged PRs → done, stale dispatches → reopened, the chronic task → needs_human. Verified
all bad-gate keys → 0; board parses (2522 tasks); idempotent; reversible.
STOPGAP, not the durable fix (cf. #953): this recurs from ongoing merges/dispatches until the beat's
heal-dispatch --apply (heartbeat-loop.sh:453) runs regularly — beat/daemon liveness, an operational
matter, not a code change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f38ffb9b4f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| priority: high | ||
| budget_cost: 1 | ||
| status: dispatched | ||
| status: open |
There was a problem hiding this comment.
Refund no-PR reservations before reopening
This task (and the identical reopenings for #682/#683/#684/#696) is moved from dispatched back to open after only an async-reserve entry and a heal note saying no PR was produced, but the portal budget counters at the top of this same file are left unchanged (gemini: 3, opencode: 3, spent: 18). Because dispatch admission subtracts track.per_agent from each lane cap, these reopened tasks become eligible for another reservation while their abandoned reservations still count against the caps, so repeated heal cycles can incorrectly exhaust Gemini/OpenCode and stop dispatching open work. Please subtract the reopened tasks' budget_cost from the corresponding reserved agents when applying this transition.
Useful? React with 👍 / 👎.
|
Closing: wrong mechanism. The board (tasks.yaml) is single-writer-owned — tabularius commits 'board projection' every ~10-20 min (it wrote at 00:20:13, after this branch, which is why the PR went DIRTY). Healing the live board via a session PR perpetually races that single-writer. The conductor also isn't stuck-red; it flaps with normal queue churn (22:45 ✓, 23:08 ✓, 00:08 ✗). The durable fix is dispatch-system-level — the beat's own heal-dispatch --apply on a tighter cadence, or refining the drift gate to red only on genuinely-stuck drift (CHRONIC/PR_MISSING/PR_CLOSED) rather than transient in-flight churn (PR_MERGED-not-yet-harvested, DISPATCHED_NO_PR) — a distinct task, not a racing board-PR. (cf. #953) |
Root cause
Conductor Report reds on
{PR_MERGED:2, DISPATCHED_NO_PR:5, CHRONIC:1}— normal live-queue churn the beat'sheal-dispatch --applyresolves each cycle. Not related to the observatory work (which doesn't touch dispatch).Fix
One sanctioned
heal-dispatch.py --apply(status-mutator, packetTAB-STATUS-ASYNC-HEAL): merged PRs → done, stale dispatches → reopened, chronic → needs_human. Verified all bad-gate keys → 0, board parses (2522 tasks), reversible.Durable note
Stopgap (cf. #953) — recurs until the beat's own
heal-dispatch --applyruns regularly (beat/daemon liveness, operational). Flagged, not papered over.🤖 Generated with Claude Code