You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Named, coded parse diagnostics for train roadmaps.parse_train_roadmap
now surfaces the offending node/heading on malformed input instead of failing
opaquely: a malformed **Channel:** descriptor is prefixed with its node_id;
a duplicate ### Node: block is caught by a new coded (T-F) check before
the topo pass (previously mis-reported as a spurious (T-D) cycle with an empty
node list); and an empty <repo>/<plan-path> component is rejected at parse,
naming the heading. Both parse-time raises are caught at the CLI boundary with a
clean message and zero PRs opened; the duplicate fix is bound to INV-3. The
child-launch/dispatch half was already correct (dispatch locks are keyed per (repo, roadmap)) and is unchanged; all train invariants (INV-1..6, merge-SHA
false-green killer) remain intact.
Advisor board — heartbeat-aware liveness for the claude/Fable PTY leg (agent-harness#188)
Reviewer-progress heartbeat, not cosmetic animation. The self-PTY Claude TUI
leg (_run_claude_tui_session) now resets its stall clock only on GENUINE reviewer
progress — novel de-animated terminal text, review-file growth, or transcript
growth. The TUI's animated "thinking" status line (rotating verb + per-second
elapsed counter) and a Node CLI's incidental libuv/GC CPU no longer count as
liveness. This closes a regression where a genuinely-wedged Fable leg (blocked in ep_poll, ~2s CPU, no output) animated forever and hung ~17 min with no reclaim.
Typed stalled leg. A reclaimed wedge is surfaced as DEGRADED
(claude_tui_stalled), so the board names the liveness reclaim while the completed
seats are preserved. No fixed model-response timeout is injected when the caller did
not request one — the hard deadline stays the generous _MAX backstop and the real
kill is heartbeat extinction.
Regression coverage. New PTY-subprocess tests prove a silent-but-animating,
CPU-trickling leg is reclaimed within the stall window; a slow-but-progressing leg
is not killed; and no fixed short timeout is injected on the default path.