diff --git a/DECISIONS.md b/DECISIONS.md index 86a60be..01f0dc4 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -1551,8 +1551,12 @@ deferred. The scope cut — chat first, no rich analysis, no video — is what k disabled by default, a failed iguana job fails honestly and the user retries. *Blocks:* the production default only; the adapter ships either way. - ~~Verify Tapir's ingress `proxy-body-size` against the 200 MB cap (`infra`).~~ **Resolved 2026-10-03:** real unauthenticated bodies of 2, 30, 120 and 210 MiB all pass NPM (TLS, piguard) and Traefik to tapir (a 302 to login); there is no body limit in that range. Uploads were enabled in production the same day, local engines only (infra#520). -- Per-transcript deletion is not built; account deletion cascades. A private-content store - without a delete button is a gap worth a ticket, not a silent omission. +- ~~Per-transcript deletion is not built; account deletion cascades.~~ **Built 2026-10-03 + (#37):** `POST /uploads/{id}/delete`, owner-scoped (a non-owner gets 404 by the same RLS + mechanism), confirm-then-delete on the recording's page. A recording that is **queued or + transcribing is refused (409) until it ends**, because the worker would otherwise write to a + row that is gone; a job whose service was lost stays undeletable until the next start's sweep + marks it failed. The home list now links to `/uploads` when uploads are mounted. **Reversibility.** Additive: one table (down-migration drops it), one adapter, one upload surface, one image change. Removing the upload route removes the feature; `transcripts`, `videos` diff --git a/docs/use-cases/audio_upload.feature b/docs/use-cases/audio_upload.feature index cd3ed30..d591ed7 100644 --- a/docs/use-cases/audio_upload.feature +++ b/docs/use-cases/audio_upload.feature @@ -245,6 +245,19 @@ Feature: Upload an audio recording, get a private Swedish transcript, discuss it Then its page says in plain words that the audio left the homelab and names the provider And a locally transcribed recording carries no such note + Scenario: I can delete a finished recording + When I confirm deleting a done or failed recording + Then the recording and its transcript are gone and I am back on my list + And another user's recording is a 404 and is untouched + + Scenario: A recording still being transcribed cannot be deleted + When I try to delete a recording that is queued or transcribing + Then I am told it is still being transcribed and nothing is removed + + Scenario: The home list links to my recordings when uploads are on + Given audio upload is enabled + Then the home list links to the recordings page + Scenario: A full queue is a retry, not an error When too many recordings are already waiting Then the upload is answered as busy, its row is failed honestly and its audio is deleted diff --git a/test/acceptance/scenario_coverage_test.go b/test/acceptance/scenario_coverage_test.go index 0dfcbba..bc16562 100644 --- a/test/acceptance/scenario_coverage_test.go +++ b/test/acceptance/scenario_coverage_test.go @@ -124,6 +124,10 @@ var scenarioCoverage = map[string]string{ "A transcript made by the cloud fallback says the audio left the homelab": "TestUploadStatus_ACloudServedTranscriptSaysTheAudioLeftTheHomelab", + "I can delete a finished recording": "TestUploadDelete_AnOwnerRemovesAFinishedOrFailedRecordingAndLandsOnTheList", + "A recording still being transcribed cannot be deleted": "TestUploadDelete_ARecordingStillBeingTranscribedIsRefusedWith409AndKept", + "The home list links to my recordings when uploads are on": "TestHomeList_LinksToRecordingsOnlyWhenUploadsAreMounted", + // audio_upload.feature, ADR-034 "Two engines transcribe the audio and their disagreements are reconciled": "TestEnsemble_BothEnginesRunInOrderAndTheirDisagreementIsReconciled", "Trivial disagreements never reach the model": "TestReconcile_TrivialDisputesAreResolvedWithoutAskingTheModel",