Officer shows a live panel per background job carrying that job's output, and the user watches it. A command that writes nothing until it finishes leaves that panel reading "Nothing written yet." for the whole run, which is exactly what a hung job looks like. Written after doing it twice in one session: plugin installs driven from a script printed nothing for two minutes, and the owner asked whether I was stuck. Both times the work was fine. So: verbose flags on, echo around each step when the tool has none, per-item output in a loop, and the result on the last line — that is the line still on screen when the panel stops. Plus the buffering trap, because a program that prints steadily still shows nothing through a pipe. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1.4 KiB
name, description, version
| name | description | version |
|---|---|---|
| Background jobs report progress | Use when starting anything in the background, or any command that will take more than a few seconds. | 1 |
Officer shows a live panel for every background job, and it shows that job's output. The user watches
it while the job runs. If the command writes nothing until it finishes, that panel says
Nothing written yet. for as long as the work takes — which is indistinguishable from a job that has
hung, and is read as one.
So a background job has a second requirement beyond doing its work: it must say what it is doing while it does it.
- Prefer the verbose form of whatever you are running. Most tools have one, and it is off by default.
- If the tool cannot report progress, wrap it —
echobefore and after each step, so the panel shows the step that is running and the step that finished. - A long loop prints per item, not at the end.
12/50 donebeats one summary nobody sees for ten minutes. - Make the last line the result. That is the line still on screen when the panel stops.
Watch for buffering. Output through a pipe is block-buffered, so a program that prints steadily can still
produce nothing for minutes — stdbuf -oL, --line-buffered, or the tool's own unbuffered flag fixes it.
None of this applies to a command that finishes quickly. It applies the moment you decide something is long enough to background.