WIP: feat(docker): re-attachable update jobs, honest status, and real progress #4

Closed
thisilike wants to merge 1 commit from feat/docker-jobs-and-status into feat/core-ui-for-docker
Owner

Third of four; stacked on #3.

An update was not addressable. Progress went out on an at-most-once stream and nowhere else, so dismissing the modal, switching tabs or reloading lost it — and the "done" that ends a run can simply not arrive. The server keeps each run in a registry and answers /jobs and /jobs/:project; the pages re-attach to what is already running. One primitive (job_follow.svelte.ts) does that for all three of them.

Compose progress was appended verbatim. --ansi never makes compose print one line per redraw frame — ~3000 for a 3 GB pull. compose_progress.ts parses those back into the keyed entity events the redraw was expressing, so the UI can draw bars, rates and an aggregate.

A stopped container was reported as a fault. A one-shot that exits 0 by design is finished, not broken; marking it red meant any stack with an init container never looked healthy. The same rule rolls up to a stack health dot.

Verified in the rig: a stack update start-to-finish with keyed progress rows, completion, and the spinner clearing; 104 module tests.

Third of four; stacked on #3. **An update was not addressable.** Progress went out on an at-most-once stream and nowhere else, so dismissing the modal, switching tabs or reloading lost it — and the "done" that ends a run can simply not arrive. The server keeps each run in a registry and answers `/jobs` and `/jobs/:project`; the pages re-attach to what is already running. One primitive (`job_follow.svelte.ts`) does that for all three of them. **Compose progress was appended verbatim.** `--ansi never` makes compose print one line per redraw frame — ~3000 for a 3 GB pull. `compose_progress.ts` parses those back into the keyed entity events the redraw was expressing, so the UI can draw bars, rates and an aggregate. **A stopped container was reported as a fault.** A one-shot that exits 0 by design is finished, not broken; marking it red meant any stack with an init container never looked healthy. The same rule rolls up to a stack health dot. Verified in the rig: a stack update start-to-finish with keyed progress rows, completion, and the spinner clearing; 104 module tests.
Three things the module got wrong, all of which show up the moment an update
takes longer than a click.

**An update was not addressable.** Progress went out on an at-most-once
stream and nowhere else, so dismissing the modal, switching tabs or reloading
lost it — and the "done" that ends a run can simply not arrive. The server
now keeps each run in a registry with its progress and log, hands out a job
per project atomically, and answers `/jobs` and `/jobs/:project`; the pages
re-attach to what is already running instead of guessing. One primitive
(`job_follow.svelte.ts`) does that for all three of them.

**Compose progress was appended verbatim.** `--ansi never` makes compose
print one line per redraw frame — about 3000 for a 3 GB pull — which is why
the log was unreadable. `compose_progress.ts` parses those frames back into
the keyed entity events the redraw was expressing, so a layer replaces its
own row and the UI can draw bars, rates and an aggregate. Byte totals only
exist in `--progress json`, which is probed for and used where available.

**A stopped container was reported as a fault.** A one-shot that exits 0 by
design — a migration, a seeder — is finished, not broken, and marking it red
meant any stack with an init container never looked healthy. `status.ts`
identifies one by what compose says about it (a sibling waiting with
`service_completed_successfully`), and the same rule now rolls up to a stack
health dot on the card and the detail page.

The pin work rides on top of this and lands separately.
thisilike changed title from feat(docker): re-attachable update jobs, honest status, and real progress to WIP: feat(docker): re-attachable update jobs, honest status, and real progress 2026-08-09 19:03:35 +02:00
thisilike closed this pull request 2026-08-09 23:01:41 +02:00

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
OpsDeck/core!4
No description provided.