Analysis failure states — sidebar row + popover

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.


Artefact — product pixels only Commentary — not the product

A · Global failure — nothing was added, your work is untouched

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

Rockclimbing5
Analysis failed · 5 of 7
Analysis failed
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

Your Claude account is out of credit.

Add credit to your Claude account, then analyse again.

A2 · bad key

Rockclimbing5
Analysis failed · 5 of 7
Analysis failed
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

Claude wouldn’t accept the API key.

Check the key in Settings ▸ LLM Provider, then analyse again.

A3 · rate limited · transient, nothing to fix

Rockclimbing5
Analysis failed · 5 of 7
Analysis failed
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

Claude is rate-limiting requests.

Nothing needs fixing — try again in a few minutes.

A4 · provider outage · explicitly not yours to fix

Rockclimbing5
Analysis failed · 5 of 7
Analysis failed
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

Claude had a problem at their end.

Nothing to fix here — try again shortly.

A5 · no network

Rockclimbing5
Analysis failed · 5 of 7
Analysis failed
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

Couldn’t reach Claude.

Check your connection, then analyse again.

Commentary — the three-part body, and what it replaces

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.

B · The files themselves — “what’s special about those two videos?”

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

Rockclimbing5
Analysis failed · 5 of 7
Analysis failed
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

Interviews2 of 2 new not added
Screen Recording…37.37.mov Not a format Bristlenose reads. interview-fritchoff.m4a No sound in this file — there is nothing to transcribe.

Replace or remove these two, then analyse again.

B2 · mixed reasons · one incomplete transfer, one not a recording

Rockclimbing5
Analysis failed · 5 of 7
Analysis failed
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

Interviews2 of 2 new not added
teams-call-2026-09-02.mp4 The file is incomplete — the transfer stopped early. consent-form.mp4 Not a recording, despite the file extension.

Replace or remove these two, then analyse again.

B3 · partial completion · the run DID finish, the DB moved 5 → 6

Rockclimbing6
Analysed · 6 of 7
Partial completion
Show Log

Your analysis now has 6 of 7 interviews. One wasn’t added.

Interviews1 of 2 new not added
interview-fritchoff.m4a No sound in this file — there is nothing to transcribe.

Replace or remove it, then analyse again to add it.

Commentary — B3 is the state line’s reason for existing

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.

C · The unreasonable states

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

Rockclimbing5
Analysis failed · 5 of 7
Analysis failed
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

Detailed cause not captured.

Open Show Log for what the analysis was doing when it stopped.

C2 · every new file refused · today this says “Run had failures”

Rockclimbing5
Nothing to analyse · 5 of 7
Nothing new to analyse
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

Interviews2 of 2 new not added
notes.docx Not a format Bristlenose reads. empty-export.mp4 The file is empty — the transfer produced no data.

Replace or remove these two, then analyse again.

C3 · twelve failures · overflow truncation

project-ikea38
Analysis failed · 38 of 58
Analysis failed
Show Log

Still showing your previous analysis — 38 of 58 interviews, from 2 hours ago.

Interviews20 of 20 new not added
p21-session.movNot a format Bristlenose reads. p22-session.movNot a format Bristlenose reads. p23-session.movNot a format Bristlenose reads. … and 17 more failures truncated

These 20 share one problem — check how they were exported, then analyse again.

C4 · long provider message + long non-Latin filename · wrapping and truncation

調査プロジェクト・2026年秋12
Analysis failed · 12 of 14
Analysis failed
Show Log

Still showing your previous analysis — 12 of 14 interviews, from 4 days ago.

Interviews2 of 2 new not added
インタビュー録音_田中由紀_2026年9月2日_最終版.m4a The file is incomplete — the transfer stopped early. Screen Recording 2026-09-02 at 14.37.37 (copy) (1).mov Not a format Bristlenose reads.

Replace or remove these two, then analyse again.

C5 · disk full · the action names the volume

Rockclimbing5
Analysis failed · 5 of 7
Analysis failed
Show Log

Still showing your previous analysis — 5 of 7 interviews, from 3 minutes ago.

The disk ran out of space while transcribing.

Free up space on Macintosh HD, then analyse again.

C6 · first-ever analysis failed · nothing to fall back to

Pilot study0
Analysis failed
Analysis failed
Show Log
Your Claude account is out of credit.

Add credit to your Claude account, then analyse again.

C7 · you stopped it yourself · no glyph, no popover (the glyph rule)

Rockclimbing5
Stopped · 5 of 7
no popover

“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

Rockclimbing5
Not responding
Not responding
The folder didn’t answer — it may be a disconnected drive or network share.
/Volumes/Field Recordings 2026/Rockclimbing
Commentary — the four that are decisions, not drawings

D · The category → action mapping

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.

categorycause lineaction lineunder their control?
out_of_creditYour Claude account is out of credit.Add credit to your Claude account, then analyse again.yes — billing
authClaude wouldn’t accept the API key.Check the key in Settings ▸ LLM Provider, then analyse again.yes — in app
quotaClaude is rate-limiting requests.Nothing needs fixing — try again in a few minutes.no — wait
api_serverClaude had a problem at their end.Nothing to fix here — try again shortly.no
networkCouldn’t reach Claude.Check your connection, then analyse again.yes
diskThe disk ran out of space while transcribing.Free up space on <volume>, then analyse again.yes
unusable_inputper-file reasons — no global cause lineReplace or remove <these N>, then analyse again.yes — the files
missing_binaryA tool Bristlenose needs is missing.Check Diagnostics ▸ Check Health.yes — setup
whisperThe transcription model didn’t load.Check Diagnostics ▸ Check Health.yes — setup
unknownDetailed cause not captured.Open Show Log for what the analysis was doing when it stopped.—
Commentary — what this costs and what it settles

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”.