Owner decision 2026-10-04 (D8, reverses the recommendation in #45): "I trust Berget; we should allow the user to select local model if they don't want to share." So Berget may be used for steps that today are local-only, and each user must be able to opt a recording out of any cloud step.
This issue is the opt-out, and it comes first. Nothing that widens what goes to Berget (a Berget reconciler/adjudicator, chat over a recording on a cloud model) ships before this exists. It is control code (it decides whether private audio and text leave the homelab): risk/high, adversarial review verified by execution, verdict recorded here.
Today's state (so the change is visible): audio fallback to berget/kb-whisper is on for every upload by deployment config (TAPIR_TRANSCRIBE_FALLBACK_MODEL, infra#522); the reconciler and the base/second engines must be koala/ or iguana/ (config start-up error otherwise, ADR-034 decision 4/7); chat over a recording offers local models only (ADR-035 decision 8); the tapir LiteLLM key is sovereignty: strict with an allowlist in the infra repo (k3s/apps/ai-stack/llm-consumers.yaml).
DECISION NEEDED (owner; recommendation first; blocks the work below)
Where is the choice made? Recommend: a checkbox on the upload form, "Keep this recording on local models only", stored on the row. A per-user default can come later. Alternative: a per-user setting only (simpler, less precise: one NDA recording among ordinary ones needs the switch flipped each time).
What is the default? Your words imply cloud allowed unless the user opts out, which is today's behaviour for audio. Recommend that default, with the page saying in plain words for every recording whether any cloud step was permitted. Alternative: default local-only, opt in to cloud (safer for client material; changes today's behaviour).
What does "local only" cover? Recommend all of it per recording: the audio fallback, a future cloud reconciler, and chat over that recording's transcript.
Is this an ADR? Recommend yes: a new ADR amending ADR-034 decision 4 ("the model must be local") and ADR-033's fallback paragraph, Proposed with you as decider, written when the work starts.
Work (test-first, one commit each, after the decisions)
Migration: a column on uploaded_transcripts (e.g. local_only boolean not null default false), RLS unchanged; the form field; the value reaches the worker with the job.
Worker/transcriber: with local_only, the cloud fallback is never attempted (a typed failure instead of the fallback; the row says why). Red first: a job with the flag and both local engines failing must not call the cloud endpoint.
Page: states per recording what was permitted and what was used (builds on the #52 note, which names the provider after the fact).
Chat over a recording: local models only when the flag is set.
Infra (separate repo, owner present): any new Berget model for the tapir key pin is an infra change with its own review (infra#523 is the open allowlist-staleness issue).
Acceptance
Red tests first, task check and golangci-lint run ./... exit 0 by $?; an adversarial review that tries to make a local_only recording reach a cloud endpoint (retries, fallback after a timeout, chat model selection, a crafted form, another user's row); a live check on production: a local_only upload with the local engine made to fail ends failed with the typed reason and the log shows no call to the cloud endpoint. Also here: the first live observation of the #52 cloud note (a Berget-served transcript must name berget; a reconciled all-local one must show no note).
Not in this issue
Evaluating which Berget models would pass the adjudicator bar (>= 80% accuracy, >= 85% order-swap consistency, <= 10% unparseable) is the measurement in #45. Source: docs/sprints/audio-upload-followups-2026-10.md (D8), ADR-034, ADR-035.
**Owner decision 2026-10-04 (D8, reverses the recommendation in #45):** "I trust Berget; we should allow the user to select local model if they don't want to share." So Berget may be used for steps that today are local-only, and each user must be able to opt a recording out of any cloud step.
**This issue is the opt-out, and it comes first.** Nothing that widens what goes to Berget (a Berget reconciler/adjudicator, chat over a recording on a cloud model) ships before this exists. It is control code (it decides whether private audio and text leave the homelab): `risk/high`, adversarial review verified by execution, verdict recorded here.
**Today's state (so the change is visible):** audio fallback to `berget/kb-whisper` is on for every upload by deployment config (`TAPIR_TRANSCRIBE_FALLBACK_MODEL`, infra#522); the reconciler and the base/second engines must be `koala/` or `iguana/` (config start-up error otherwise, ADR-034 decision 4/7); chat over a recording offers local models only (ADR-035 decision 8); the tapir LiteLLM key is `sovereignty: strict` with an allowlist in the infra repo (`k3s/apps/ai-stack/llm-consumers.yaml`).
## DECISION NEEDED (owner; recommendation first; blocks the work below)
1. **Where is the choice made?** Recommend: a checkbox on the upload form, "Keep this recording on local models only", stored on the row. A per-user default can come later. Alternative: a per-user setting only (simpler, less precise: one NDA recording among ordinary ones needs the switch flipped each time).
2. **What is the default?** Your words imply cloud allowed unless the user opts out, which is today's behaviour for audio. Recommend that default, with the page saying in plain words for every recording whether any cloud step was permitted. Alternative: default local-only, opt in to cloud (safer for client material; changes today's behaviour).
3. **What does "local only" cover?** Recommend all of it per recording: the audio fallback, a future cloud reconciler, and chat over that recording's transcript.
4. **Is this an ADR?** Recommend yes: a new ADR amending ADR-034 decision 4 ("the model must be local") and ADR-033's fallback paragraph, `Proposed` with you as decider, written when the work starts.
## Work (test-first, one commit each, after the decisions)
- Migration: a column on `uploaded_transcripts` (e.g. `local_only boolean not null default false`), RLS unchanged; the form field; the value reaches the worker with the job.
- Worker/transcriber: with `local_only`, the cloud fallback is never attempted (a typed failure instead of the fallback; the row says why). Red first: a job with the flag and both local engines failing must not call the cloud endpoint.
- Page: states per recording what was permitted and what was used (builds on the #52 note, which names the provider after the fact).
- Chat over a recording: local models only when the flag is set.
- Infra (separate repo, owner present): any new Berget model for the tapir key pin is an `infra` change with its own review (infra#523 is the open allowlist-staleness issue).
## Acceptance
Red tests first, `task check` and `golangci-lint run ./...` exit 0 by `$?`; an adversarial review that tries to make a `local_only` recording reach a cloud endpoint (retries, fallback after a timeout, chat model selection, a crafted form, another user's row); a live check on production: a `local_only` upload with the local engine made to fail ends `failed` with the typed reason and the log shows no call to the cloud endpoint. Also here: the **first live observation of the #52 cloud note** (a Berget-served transcript must name `berget`; a reconciled all-local one must show no note).
## Not in this issue
Evaluating which Berget models would pass the adjudicator bar (>= 80% accuracy, >= 85% order-swap consistency, <= 10% unparseable) is the measurement in #45. Source: docs/sprints/audio-upload-followups-2026-10.md (D8), ADR-034, ADR-035.
---
_Created via git-mcp on behalf of @mathias_
mathias
added this to the v0.32.0 - audio upload follow-ups milestone 2026-10-04 06:46:44 +00:00
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.
Owner decision 2026-10-04 (D8, reverses the recommendation in #45): "I trust Berget; we should allow the user to select local model if they don't want to share." So Berget may be used for steps that today are local-only, and each user must be able to opt a recording out of any cloud step.
This issue is the opt-out, and it comes first. Nothing that widens what goes to Berget (a Berget reconciler/adjudicator, chat over a recording on a cloud model) ships before this exists. It is control code (it decides whether private audio and text leave the homelab):
risk/high, adversarial review verified by execution, verdict recorded here.Today's state (so the change is visible): audio fallback to
berget/kb-whisperis on for every upload by deployment config (TAPIR_TRANSCRIBE_FALLBACK_MODEL, infra#522); the reconciler and the base/second engines must bekoala/origuana/(config start-up error otherwise, ADR-034 decision 4/7); chat over a recording offers local models only (ADR-035 decision 8); the tapir LiteLLM key issovereignty: strictwith an allowlist in the infra repo (k3s/apps/ai-stack/llm-consumers.yaml).DECISION NEEDED (owner; recommendation first; blocks the work below)
Proposedwith you as decider, written when the work starts.Work (test-first, one commit each, after the decisions)
uploaded_transcripts(e.g.local_only boolean not null default false), RLS unchanged; the form field; the value reaches the worker with the job.local_only, the cloud fallback is never attempted (a typed failure instead of the fallback; the row says why). Red first: a job with the flag and both local engines failing must not call the cloud endpoint.infrachange with its own review (infra#523 is the open allowlist-staleness issue).Acceptance
Red tests first,
task checkandgolangci-lint run ./...exit 0 by$?; an adversarial review that tries to make alocal_onlyrecording reach a cloud endpoint (retries, fallback after a timeout, chat model selection, a crafted form, another user's row); a live check on production: alocal_onlyupload with the local engine made to fail endsfailedwith the typed reason and the log shows no call to the cloud endpoint. Also here: the first live observation of the #52 cloud note (a Berget-served transcript must nameberget; a reconciled all-local one must show no note).Not in this issue
Evaluating which Berget models would pass the adjudicator bar (>= 80% accuracy, >= 85% order-swap consistency, <= 10% unparseable) is the measurement in #45. Source: docs/sprints/audio-upload-followups-2026-10.md (D8), ADR-034, ADR-035.
Created via git-mcp on behalf of @mathias