#501 added RunState.sweeps_refused (trigger → not-started / failed / dirty) so that a run
whose deferred-work sweep was refused stops looking exactly like one that swept. It is surfaced on
four paths:
- the end-of-run summary (
Engine.summary() / RunSummary.render(), which also reaches the
ATTENTION file and the desktop notification),
documents.status_document, hence bmad-loop status --json,
- the human
bmad-loop status print,
- both
bmad-loop diagnose renders.
The TUI is not one of them. src/bmad_loop/tui/ references neither sweeps_refused nor
sweeps_triggered, and tui/data.py reads state.json directly (through journal.load_state)
rather than going through status_document, so it picks up neither field for free.
An operator watching a run in the dashboard therefore still sees a run that swept and a run whose
sweep was refused as identical — the exact gap #501 closed on every other surface. Under
[sweep] auto = "run-end" there is one trigger per run and nothing re-asks it, so the refusal is
not something a later screen will reveal.
Real work rather than a rename: the field has to be read in tui/data.py and given a surface (the
run detail pane is the obvious home, beside the other terminal-state fields).
Follow-up to #501.
#501 added
RunState.sweeps_refused(trigger →not-started/failed/dirty) so that a runwhose deferred-work sweep was refused stops looking exactly like one that swept. It is surfaced on
four paths:
Engine.summary()/RunSummary.render(), which also reaches theATTENTION file and the desktop notification),
documents.status_document, hencebmad-loop status --json,bmad-loop statusprint,bmad-loop diagnoserenders.The TUI is not one of them.
src/bmad_loop/tui/references neithersweeps_refusednorsweeps_triggered, andtui/data.pyreadsstate.jsondirectly (throughjournal.load_state)rather than going through
status_document, so it picks up neither field for free.An operator watching a run in the dashboard therefore still sees a run that swept and a run whose
sweep was refused as identical — the exact gap #501 closed on every other surface. Under
[sweep] auto = "run-end"there is one trigger per run and nothing re-asks it, so the refusal isnot something a later screen will reveal.
Real work rather than a rename: the field has to be read in
tui/data.pyand given a surface (therun detail pane is the obvious home, beside the other terminal-state fields).
Follow-up to #501.