Skip to content

heal(conductor): clear dispatch drift (merged→done, stale→open, chronic→needs_human)#964

Closed
4444J99 wants to merge 1 commit into
mainfrom
heal/conductor-drift-2
Closed

heal(conductor): clear dispatch drift (merged→done, stale→open, chronic→needs_human)#964
4444J99 wants to merge 1 commit into
mainfrom
heal/conductor-drift-2

Conversation

@4444J99

@4444J99 4444J99 commented Jul 12, 2026

Copy link
Copy Markdown
Member

Root cause

Conductor Report reds on {PR_MERGED:2, DISPATCHED_NO_PR:5, CHRONIC:1} — normal live-queue churn the beat's heal-dispatch --apply resolves each cycle. Not related to the observatory work (which doesn't touch dispatch).

Fix

One sanctioned heal-dispatch.py --apply (status-mutator, packet TAB-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 --apply runs regularly (beat/daemon liveness, operational). Flagged, not papered over.

🤖 Generated with Claude Code

… 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>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread tasks.yaml
priority: high
budget_cost: 1
status: dispatched
status: open

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@4444J99

4444J99 commented Jul 12, 2026

Copy link
Copy Markdown
Member Author

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)

@4444J99 4444J99 closed this Jul 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant