docs: per-recording delete and the recordings link are built; feature scenarios and coverage map (#37)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
+6
-2
@@ -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:*
|
disabled by default, a failed iguana job fails honestly and the user retries. *Blocks:*
|
||||||
the production default only; the adapter ships either way.
|
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).
|
- ~~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
|
- ~~Per-transcript deletion is not built; account deletion cascades.~~ **Built 2026-10-03
|
||||||
without a delete button is a gap worth a ticket, not a silent omission.
|
(#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
|
**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`
|
surface, one image change. Removing the upload route removes the feature; `transcripts`, `videos`
|
||||||
|
|||||||
@@ -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
|
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
|
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
|
Scenario: A full queue is a retry, not an error
|
||||||
When too many recordings are already waiting
|
When too many recordings are already waiting
|
||||||
Then the upload is answered as busy, its row is failed honestly and its audio is deleted
|
Then the upload is answered as busy, its row is failed honestly and its audio is deleted
|
||||||
|
|||||||
@@ -124,6 +124,10 @@ var scenarioCoverage = map[string]string{
|
|||||||
|
|
||||||
"A transcript made by the cloud fallback says the audio left the homelab": "TestUploadStatus_ACloudServedTranscriptSaysTheAudioLeftTheHomelab",
|
"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
|
// audio_upload.feature, ADR-034
|
||||||
"Two engines transcribe the audio and their disagreements are reconciled": "TestEnsemble_BothEnginesRunInOrderAndTheirDisagreementIsReconciled",
|
"Two engines transcribe the audio and their disagreements are reconciled": "TestEnsemble_BothEnginesRunInOrderAndTheirDisagreementIsReconciled",
|
||||||
"Trivial disagreements never reach the model": "TestReconcile_TrivialDisputesAreResolvedWithoutAskingTheModel",
|
"Trivial disagreements never reach the model": "TestReconcile_TrivialDisputesAreResolvedWithoutAskingTheModel",
|
||||||
|
|||||||
Reference in New Issue
Block a user