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.
**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
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.
**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_
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.
**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_
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Milestone v0.32.0. Found reviewing the cloud-fallback enablement (infra#522). With
TAPIR_TRANSCRIBE_FALLBACK_MODEL=berget/kb-whisperlive 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 isberget/...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 withconfig.IsLocalModelsemantics (one definition of local), not a second string match. Update ADR-033 consequences and the feature file; note the empty-transcript trigger indocs/homelab-integration.md.Acceptance: the test red first and green;
task checkandgolangci-lint run ./...exit 0.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 indocs/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
Half observed live, 2026-10-04. The owner uploaded a new clip on production; it was transcribed by
iguanaand 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 showsiguana/…).The cloud side (a Berget-served transcript names
bergetin 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