fix(cli): close live board rows on every exit path (#1347) - #1348
Closed
Jaro-c wants to merge 1 commit into
Closed
Conversation
Jaro-c
force-pushed
the
fix/issue-1347-close-orphaned-board-rows
branch
from
August 6, 2026 20:14
5bb4c0c to
1f2bc2a
Compare
Jaro-c
force-pushed
the
fix/issue-1347-close-orphaned-board-rows
branch
from
August 6, 2026 22:16
1f2bc2a to
ab0e018
Compare
Six call sites across `up` and `down` opened a board row with `progress::start` and never closed it on a code path that returned or fell through, so the row stayed on the working spinner forever even though the operation was over. The plain sink emitted nothing and the live board painted a frozen `Creating`/`Removing`/`Pulling` spinner. The container-create side of `up` already does this right — it closes with `"Exists"`, `"Running"` or `"Created"` before returning. The six sites missing the close are: | Command | File | Verb before | Verb after | |---------|-----------------------|-------------|-------------| | up | network/mod.rs | (stuck) | "Exists" | | up | volume/mod.rs | (stuck) | "Exists" | | up | build/pull.rs | (stuck) | "Failed" | | down | lifecycle/mod.rs | (stuck) | "Absent" / "Failed" | | down | lifecycle/mod.rs | (stuck) | "Absent" / "Failed" | | down | lifecycle/parallel.rs | (stuck) | "Absent" / "Failed" | Closing with an honest verb makes the failure arms in `down` visible: the genuine removal failure used to print as a tracing::warn and exit with the error, but the board kept painting `Removing` with a spinner, hiding which resource failed. The verb-banding now paints "Failed" red instead of green, and the row marker carries a red ✘ for verb = "Failed" (case-insensitive, failsafe to ✘ so a future caller using "failed" or "Failing" does not silently regress to the green ✔ of a successful row). The per-site fix is what the issue calls out; the structural fix (a guard returned by `start()` that force-closes on drop) is a separate concern worth its own issue — leaving the per-site pattern unchanged matches the existing `Exists`/`Running` precedent and fixes every observable from the bug report. Signed-off-by: Jaro-c <75870284+Jaro-c@users.noreply.github.com>
Jaro-c
force-pushed
the
fix/issue-1347-close-orphaned-board-rows
branch
from
August 6, 2026 22:18
ab0e018 to
9aff2e8
Compare
This was referenced Aug 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #1347
What this fixes
Six call sites across
upanddownopened a board row withprogress::startand never closed it on a code path that returned orfell through, so the row sat on the working spinner forever even
though the operation was over. The plain sink emitted nothing and the
live board painted a frozen
Creating/Removing/Pulling/Stoppingspinner.The container-create side of
upalready does this right — it closeswith
"Exists"/"Running"/"Created"before returning. Thesix sites missing the close are:
upinternal/engine/network/mod.rs"Exists"upinternal/engine/volume/mod.rs"Exists"upinternal/engine/build/pull.rs"Failed"downinternal/engine/lifecycle/mod.rs"Absent"/"Failed"downinternal/engine/lifecycle/mod.rs"Absent"/"Failed"downinternal/engine/lifecycle/parallel.rs"Absent"/"Failed"The failure arms in
downwere the most painful: a removal thatgenuinely failed printed as a
tracing::warnand the process exitedwith the error, but the board kept painting the row with a spinner,
hiding which resource failed.
What this does NOT fix
The structural fix (a guard returned by
start()that force-closeson drop with a fallback verb) is a separate concern — the issue lists
it as a follow-up worth deciding, not as part of this fix. The per-site
fix matches the existing
"Exists"/"Running"precedent on thecontainer-create side and fixes every observable from the bug report.
Visual: a failed row no longer looks like a successful one
Closing with the verb
"Failed"is not enough on its own — the rowmarker would still have been a green ✔, so a failed row would have
read as a successful one except for the word.
internal/ui/progress/row.rs: newFAILED_MARK(✘) in red,selected whenever the closing verb starts with
fail(case-insensitive).internal/ui/mod.rs:action_stylenow paints verbs starting withfailred, so the word is red too.How it was verified
cargo test --no-default-features --features watch,completionspasses (1481 tests, including 3 new ones for the failed marker and
verb band).
cargo buildclean (only the pre-existing dead-code warnings).cargo fmt --checkclean.cargo clippy --libclean of new warnings.upthenup— network + volume showExistsinstead ofstaying on
Creating.down -vthendown -v— network + volume showAbsentinstead of staying on
Removing.upagainst a non-existent image image — image row showsFailedinstead of staying onPulling, exit code is non-zero.Notes
(action_style). The per-site wiring is straightforward enough that
the unit tests + empirical verification cover the change end-to-end.
progress::start/progress_linekeep the same signatures.