Reviews P5 / D4-B: a failed analysis leaves the project exactly as it was, plus an explanation. Each case pairs the row (where the state lives) with the popover it opens (where the detail lives). Nothing here is a new surface — the row and the popover both ship today; what changes is the wording, the shortfall count, and a third part in the popover body.
The content model. A failed incremental run is a shortfall from an attempted
reality, so the UX must hold both numbers: what you have (5 analysed, in the DB, curated)
and what you asked for (7 on disk). Both already exist — the sidebar reads
ingested=7, sessions=5. The gap is what the popover explains.
The run never reached a terminus, so the serve never re-imported: the 5 interviews and every star and tag are exactly as they were. These five differ only in the cause and what you can do about it.
A1 · out of credit · the archetype
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Add credit to your Claude account, then analyse again.
A2 · bad key
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Check the key in Settings ▸ LLM Provider, then analyse again.
A3 · rate limited · transient, nothing to fix
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Nothing needs fixing — try again in a few minutes.
A4 · provider outage · explicitly not yours to fix
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Nothing to fix here — try again shortly.
A5 · no network
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Check your connection, then analyse again.
Every popover above is state · cause · action. Today only the middle part exists, and for
this family it renders the raw provider string plus Category: api_server — which is
computer science, not something a researcher can act on. The state line is new and is the
answer to “what am I looking at?”; the action line is new and is the answer to “what is
under my control?”.
A3 and A4 deliberately tell you to do nothing. An action line that invents a chore for a transient outage is worse than none — it sends the researcher to check a key that was never wrong. Saying “nothing needs fixing” is the honest action, and it is the reason the mapping is per-category rather than a single generic “try again”.
The relative time is the shipped twin, not a new format:
chrome.pipeline.analysedRelative already renders “Analysed 3 minutes ago” in this
very row.
The case your scenario spends its second half on. This path already exists and is already good: the popover names the file and gives a human reason. What it lacks is the state line above it and, for the all-refused case, a header that isn’t a lie.
B1 · both new interviews refused · per-file reasons
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Replace or remove these two, then analyse again.
B2 · mixed reasons · one incomplete transfer, one not a recording
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Replace or remove these two, then analyse again.
B3 · partial completion · the run DID finish, the DB moved 5 → 6
Your analysis now has 6 of 7 interviews. One wasn’t added.
Replace or remove it, then analyse again to add it.
B1 and B3 look almost identical and mean opposite things. In B1 nothing moved — you still have the 5 you curated. In B3 the run completed, the serve re-imported, and your project is now genuinely 6. Without the state line a researcher cannot tell those apart, and the count in the row is the only clue. That is why the line says “still showing your previous analysis” in one and “your analysis now has” in the other — the verb is carrying the distinction.
The row wording differs too, and should: Analysis failed · 5 of 7 versus
Analysed · 6 of 7. Same shortfall shape, different truth about what you have.
Where the wording has to hold up without a tidy cause, a short filename, or a small number of failures.
C1 · no structured cause captured · the degraded path
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Open Show Log for what the analysis was doing when it stopped.
C2 · every new file refused · today this says “Run had failures”
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Replace or remove these two, then analyse again.
C3 · twelve failures · overflow truncation
Still showing your previous analysis — 38 of 58 interviews, from 2 hours ago.
These 20 share one problem — check how they were exported, then analyse again.
C4 · long provider message + long non-Latin filename · wrapping and truncation
Still showing your previous analysis — 12 of 14 interviews, from 4 days ago.
Replace or remove these two, then analyse again.
C5 · disk full · the action names the volume
Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.
Free up space on Macintosh HD, then analyse again.
C6 · first-ever analysis failed · nothing to fall back to
Add credit to your Claude account, then analyse again.
C7 · you stopped it yourself · no glyph, no popover (the glyph rule)
“A run they stopped is not news” — design-desktop-project-status.md’s glyph rule.
The shortfall count still earns its place, because that the researcher may well have
forgotten.
C8 · the drive went away mid-analysis · a different family entirely
unknown and the row reads “Run had failures” — false severity, and a known defect
the popover doc already logs. Nothing failed in the machinery; the files were refused.
“Nothing new to analyse” is the honest header, and it needs the missing
unusable_input entries in pillPrecedence and the pill strings.The part your scenario is really about: a clue that is under my control. Categories are
the shipped PipelineFailureCategory cases; the labels already exist as pill strings;
the action column is what’s new.
| category | cause line | action line | under their control? |
|---|---|---|---|
| out_of_credit | Your Claude account is out of credit. | Add credit to your Claude account, then analyse again. | yes — billing |
| auth | Claude wouldn’t accept the API key. | Check the key in Settings ▸ LLM Provider, then analyse again. | yes — in app |
| quota | Claude is rate-limiting requests. | Nothing needs fixing — try again in a few minutes. | no — wait |
| api_server | Claude had a problem at their end. | Nothing to fix here — try again shortly. | no |
| network | Couldn’t reach Claude. | Check your connection, then analyse again. | yes |
| disk | The disk ran out of space while transcribing. | Free up space on <volume>, then analyse again. | yes |
| unusable_input | per-file reasons — no global cause line | Replace or remove <these N>, then analyse again. | yes — the files |
| missing_binary | A tool Bristlenose needs is missing. | Check Diagnostics ▸ Check Health. | yes — setup |
| whisper | The transcription model didn’t load. | Check Diagnostics ▸ Check Health. | yes — setup |
| unknown | Detailed cause not captured. | Open Show Log for what the analysis was doing when it stopped. | — |
Ten cause lines and ten action lines, in 21 locales. That is the real size of the piece, and it is separable from the two small gates that let the report through at all. The cause column largely exists as pill labels (“Out of credit”, “Provider key issue”, “Rate limited”) — but those are nouns for a one-line row, and the popover has room for a sentence that names the actor (“Claude wouldn’t accept…”) rather than a category.
“Run” is gone throughout, per your steer — analysis is what the researcher thinks is
happening, a run is what the computer does. Note the shipped corpus already contradicts itself
here: the popover header says Run failed while its own tooltip says
Analysis finished with failures. This settles it in the direction the tooltip
already chose.
Two rows are load-bearing in an unobvious way. quota and
api_server are the only ones whose action is “do nothing”, and they are also the
ones a naive mapping would get wrong by inventing a chore. If the action column ever grows a
default, the default must be “try again shortly”, never “check your settings”.