Say when a recording's audio went to the cloud: label the serving endpoint, and document that an empty transcript also triggers the fallback #52

Closed
opened 2026-10-03 18:48:22 +00:00 by mathias · 2 comments
Owner

Milestone v0.32.0. Found reviewing the cloud-fallback enablement (infra#522). With TAPIR_TRANSCRIBE_FALLBACK_MODEL=berget/kb-whisper live in production, the transcript page shows the serving endpoint as the bare alias (berget/kb-whisper), with no wording that it is a cloud (EU-hosted) service. Also, the audio goes to Berget not only when the local engine is down but when it returns an empty transcript (a silent or music-only file). A user reading a transcript should be told plainly that this recording's audio left the homelab.

Work (red test first): TestUploadStatus_NamesACloudEndpointAsLeavingTheHomelab: a done upload whose endpoint is berget/... shows a plain-words line ("This recording's audio was transcribed by Berget (a cloud service in the EU) because the local engine could not") and a local endpoint shows none. Decide the classification from the alias prefix with config.IsLocalModel semantics (one definition of local), not a second string match. Update ADR-033 consequences and the feature file; note the empty-transcript trigger in docs/homelab-integration.md.

Acceptance: the test red first and green; task check and golangci-lint run ./... exit 0.


Created via git-mcp on behalf of @mathias

**Milestone v0.32.0. Found reviewing the cloud-fallback enablement (infra#522).** With `TAPIR_TRANSCRIBE_FALLBACK_MODEL=berget/kb-whisper` live in production, the transcript page shows the serving endpoint as the **bare alias** (`berget/kb-whisper`), with no wording that it is a cloud (EU-hosted) service. Also, the audio goes to Berget not only when the local engine is down but when it returns an **empty transcript** (a silent or music-only file). A user reading a transcript should be told plainly that this recording's audio left the homelab. **Work (red test first):** `TestUploadStatus_NamesACloudEndpointAsLeavingTheHomelab`: a done upload whose endpoint is `berget/...` shows a plain-words line ("This recording's audio was transcribed by Berget (a cloud service in the EU) because the local engine could not") and a local endpoint shows none. Decide the classification from the alias prefix with `config.IsLocalModel` semantics (one definition of local), not a second string match. Update ADR-033 consequences and the feature file; note the empty-transcript trigger in `docs/homelab-integration.md`. **Acceptance:** the test red first and green; `task check` and `golangci-lint run ./...` exit 0. --- _Created via git-mcp on behalf of @mathias_
mathias added this to the v0.32.0 - audio upload follow-ups milestone 2026-10-03 18:48:22 +00:00
mathias added the risk/lowsize/xstype/feat labels 2026-10-03 18:48:22 +00:00
Author
Owner

Shipped in v0.32.0 (PR #58, merge 85f4cc3; production image now 7b7da65). Left OPEN on purpose: it needs a transcript that was actually served by the cloud fallback, which I cannot trigger from outside (an authenticated upload plus a local engine failure).

What is built: a transcript whose endpoint is not local shows, in plain words: "This recording's audio left the homelab: it was transcribed by a cloud service ({provider}) because the local engine could not." "Local" is config.IsLocalModel, the same definition the start-up validation uses. The empty-transcript fallback trigger is documented in docs/homelab-integration.md; the feature scenarios and the coverage map are updated.

The adversarial review (four rounds) found three real defects in the first versions, all fixed test-first: an all-local transcript from the two-engine path ("A + B, reconciled by C") was called cloud-served; then a bare alias in that composite was judged local (a cloud engine shown as local); then a model named like a connector word passed. The final parser splits the producer's own format exactly and judges every alias whole; about 60 probes found nothing judged local that is not. Lesson written to the brain: wiki/homelab/failures/safety-claim-from-a-display-string-fails-open-on-what-it-does-not-recognise.

To close: next time a transcript is served by Berget, check that its page shows the note naming berget, and that a local one shows none. A reconciled all-local one (once ADR-034's reconcile is enabled, D10) must show none. I will close this on your word, or on the first observation in a log or a screenshot.


Created via git-mcp on behalf of @mathias

**Shipped in v0.32.0** (PR #58, merge 85f4cc3; production image now 7b7da65). Left OPEN on purpose: it needs a transcript that was actually served by the cloud fallback, which I cannot trigger from outside (an authenticated upload plus a local engine failure). What is built: a transcript whose endpoint is not local shows, in plain words: "This recording's audio left the homelab: it was transcribed by a cloud service ({provider}) because the local engine could not." "Local" is `config.IsLocalModel`, the same definition the start-up validation uses. The empty-transcript fallback trigger is documented in `docs/homelab-integration.md`; the feature scenarios and the coverage map are updated. The adversarial review (four rounds) found three real defects in the first versions, all fixed test-first: an all-local transcript from the two-engine path ("A + B, reconciled by C") was called cloud-served; then a bare alias in that composite was judged local (a cloud engine shown as local); then a model named like a connector word passed. The final parser splits the producer's own format exactly and judges every alias whole; about 60 probes found nothing judged local that is not. Lesson written to the brain: `wiki/homelab/failures/safety-claim-from-a-display-string-fails-open-on-what-it-does-not-recognise`. **To close:** next time a transcript is served by Berget, check that its page shows the note naming `berget`, and that a local one shows none. A reconciled all-local one (once ADR-034's reconcile is enabled, D10) must show none. I will close this on your word, or on the first observation in a log or a screenshot. --- _Created via git-mcp on behalf of @mathias_
Author
Owner

Half observed live, 2026-10-04. The owner uploaded a new clip on production; it was transcribed by iguana and the page labelled it so, with no cloud note. That is correct: the Berget fallback fires only when the local engine fails or returns an empty transcript, and iguana did neither, so there was nothing cloud-served to label. This confirms the local side (no false note, the endpoint chip shows iguana/…).

The cloud side (a Berget-served transcript names berget in the note) rests on tests and four adversarial-review rounds; it cannot be triggered from outside without making iguana fail. It is carried as an acceptance item in #60 (the first live Berget-served transcript must show the note; a reconciled all-local one must show none), so it is not forgotten. Closing this issue on that basis.


Created via git-mcp on behalf of @mathias

**Half observed live, 2026-10-04.** The owner uploaded a new clip on production; it was transcribed by `iguana` and the page labelled it so, with no cloud note. That is correct: the Berget fallback fires only when the local engine fails or returns an empty transcript, and iguana did neither, so there was nothing cloud-served to label. This confirms the local side (no false note, the endpoint chip shows `iguana/…`). The cloud side (a Berget-served transcript names `berget` in the note) rests on tests and four adversarial-review rounds; it cannot be triggered from outside without making iguana fail. It is carried as an acceptance item in #60 (the first live Berget-served transcript must show the note; a reconciled all-local one must show none), so it is not forgotten. Closing this issue on that basis. --- _Created via git-mcp on behalf of @mathias_
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mathias/tapir#52