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
The finally fires status=doneunconditionally — including when the pass body raised. The relay routes this to the renderer, and IndexProgressRenderer.apply() treats anystatus=done for kind=graph as terminal (it keys on kind+status, not pass_), so it marks the task graph ✓ and stops it.
Impact
Standalone (misleading ✓): if a pass body raises (e.g. a Ladybug write fails partway through pass 6), the child still reports pass=6/6 status=done → the renderer shows graph ✓ for a pass that did not succeed.
Interaction with Fix graph progress state after interruption #452 (done→failed flicker): the child emits pass=6/6 status=done (renderer graph ✓), the exception propagates and the child exits non-zero, then run_build_ast_graph's parent-side finally correctly emits status=failed (renderer graph ✗). On TTY the description flickers ✓→✗ (final state correct); on non-TTY / for programmatic on_progress consumers, two terminal lines/events are emitted (graph done then graph failed) for one failed build.
The parent's final failed state is the correct one — this issue is about the spurious done the child emits underneath it.
Suggested fix
Track whether the body raised and emit failed (or omit the terminal line) when it did:
This makes the pass-level event truthful on its own and removes the ✓-then-✗ sequence for the pass-raises case.
Out of scope (not fixed by the above)
If pass 6 completes cleanly but a later step (post-pass-6 cleanup, db finalize, etc.) fails, the pass=6/6 status=done is arguably legitimate (pass 6 did finish) yet the renderer still treats it as terminal for the whole graph kind. Resolving that would require the renderer to distinguish a per-pass done (non-terminal for the kind) from an overall terminal done — a larger change to progress.py routing. Worth noting but separate from the unconditional-done bug above.
_graph_pass_progressemitsstatus=doneeven when the pass body raisedFollow-up to #452 (surfaced during review of the parent-side terminal graph event).
Problem
_graph_pass_progress(src/java_codebase_rag/graph/build_ast_graph.py:140) wraps each graph pass 2–6 and emits a progress line in itsfinally:The
finallyfiresstatus=doneunconditionally — including when the pass body raised. The relay routes this to the renderer, andIndexProgressRenderer.apply()treats anystatus=doneforkind=graphas terminal (it keys onkind+status, notpass_), so it marks the taskgraph ✓and stops it.Impact
pass=6/6 status=done→ the renderer showsgraph ✓for a pass that did not succeed.pass=6/6 status=done(renderergraph ✓), the exception propagates and the child exits non-zero, thenrun_build_ast_graph's parent-sidefinallycorrectly emitsstatus=failed(renderergraph ✗). On TTY the description flickers✓→✗(final state correct); on non-TTY / for programmaticon_progressconsumers, two terminal lines/events are emitted (graph donethengraph failed) for one failed build.The parent's final
failedstate is the correct one — this issue is about the spuriousdonethe child emits underneath it.Suggested fix
Track whether the body raised and emit
failed(or omit the terminal line) when it did:This makes the pass-level event truthful on its own and removes the
✓-then-✗sequence for the pass-raises case.Out of scope (not fixed by the above)
If pass 6 completes cleanly but a later step (post-pass-6 cleanup, db finalize, etc.) fails, the
pass=6/6 status=doneis arguably legitimate (pass 6 did finish) yet the renderer still treats it as terminal for the wholegraphkind. Resolving that would require the renderer to distinguish a per-passdone(non-terminal for the kind) from an overall terminaldone— a larger change toprogress.pyrouting. Worth noting but separate from the unconditional-donebug above.Context