22c0317c71
fix(web): a body cut off mid-file is a 400; bidirectional controls are stripped from a title (second review)
mathiasandClaude Sonnet 5.52026-10-02 17:22:41 +02:00
9a2f24b3c9
fix(uploads): refuse a full queue before spooling, probing or creating a row (second review)
mathiasandClaude Sonnet 5.52026-10-02 17:22:41 +02:00
3f5b9345a0
feat(uploads): HasRoom -- say before spooling whether a submit would be accepted (second review)
mathiasandClaude Sonnet 5.52026-10-02 17:22:41 +02:00
16db156406
fix(config): the engine timeout defaults to 20 minutes so two wedged engines leave the job time for a fallback (second review)
mathiasandClaude Sonnet 5.52026-10-02 17:22:41 +02:00
471425cd4c
fix(cmd): the configured upload chat model is in the shared chat service's list, so it is no longer silently swapped (second review finding 2)
mathiasandClaude Sonnet 5.52026-10-02 17:22:41 +02:00
8f79132fcb
test: second review -- the upload chat model outside the chain, room checked before spooling, a cut-off body is a 400, bidi controls in titles, the ensemble's deadline wiring, an honest test name (red)
mathiasandClaude Sonnet 5.52026-10-02 17:20:38 +02:00
b1f9d5f4b7
test: second review -- the upload chat model outside the chain, room checked before spooling, a cut-off body is a 400, bidi controls in titles, the ensemble's deadline wiring, an honest test name (red)
mathiasandClaude Sonnet 5.52026-10-02 17:20:38 +02:00
5bd2e3d3d0
test: second review -- the upload chat model outside the chain, room checked before spooling, a cut-off body is a 400, bidi controls in titles, the ensemble's deadline wiring, an honest test name (red)
mathiasandClaude Sonnet 5.52026-10-02 17:20:38 +02:00
b8a6e2f6f5
test: second review -- the upload chat model outside the chain, room checked before spooling, a cut-off body is a 400, bidi controls in titles, the ensemble's deadline wiring, an honest test name (red)
mathiasandClaude Sonnet 5.52026-10-02 17:20:38 +02:00
335ad0cd85
test: second review -- the upload chat model outside the chain, room checked before spooling, a cut-off body is a 400, bidi controls in titles, the ensemble's deadline wiring, an honest test name (red)
mathiasandClaude Sonnet 5.52026-10-02 17:20:38 +02:00
59bc373068
test: second review -- the upload chat model outside the chain, room checked before spooling, a cut-off body is a 400, bidi controls in titles, the ensemble's deadline wiring, an honest test name (red)
mathiasandClaude Sonnet 5.52026-10-02 17:20:38 +02:00
d505f64c99
test: second review -- the upload chat model outside the chain, room checked before spooling, a cut-off body is a 400, bidi controls in titles, the ensemble's deadline wiring, an honest test name (red)
mathiasandClaude Sonnet 5.52026-10-02 17:20:38 +02:00
9314454ab1
feat(web): show a step's note under it, escaped (second review finding 1)
mathiasandClaude Sonnet 5.52026-10-02 17:20:02 +02:00
9c8ac0f9fb
fix(web): no message for the removed incomplete kind (second review finding 1)
mathiasandClaude Sonnet 5.52026-10-02 17:20:02 +02:00
f7284ccdc9
fix(uploads): a file much shorter than it claimed is transcribed and noted, not refused; the tolerances are named (second review finding 1)
mathiasandClaude Sonnet 5.52026-10-02 17:20:02 +02:00
4943c80dbd
feat(progress): Annotate -- a note on a step, saved at once (second review finding 1)
mathiasandClaude Sonnet 5.52026-10-02 17:20:02 +02:00
8eca8f721b
feat(domain): ProgressStep.Note; UploadErrIncomplete removed -- a short file is noted, not refused (second review finding 1)
mathiasandClaude Sonnet 5.52026-10-02 17:20:02 +02:00
406c0232c1
test: a shortfall is noted on the audio step, not refused; the 80%, two-minute and 30-second tolerances are pinned (red; second review finding 1)
mathiasandClaude Sonnet 5.52026-10-02 17:19:32 +02:00
ac530de91a
test: a shortfall is noted on the audio step, not refused; the 80%, two-minute and 30-second tolerances are pinned (red; second review finding 1)
mathiasandClaude Sonnet 5.52026-10-02 17:19:32 +02:00
a90107b73b
test: a shortfall is noted on the audio step, not refused; the 80%, two-minute and 30-second tolerances are pinned (red; second review finding 1)
mathiasandClaude Sonnet 5.52026-10-02 17:19:32 +02:00
0ef83f2ccb
test: a shortfall is noted on the audio step, not refused; the 80%, two-minute and 30-second tolerances are pinned (red; second review finding 1)
mathiasandClaude Sonnet 5.52026-10-02 17:19:32 +02:00
71cd50aa88
fix(docker): install xz in the ffmpeg stage -- the golang image has none; found by building the image, which CI does not do on a pull request (second review)
mathiasandClaude Sonnet 5.52026-10-02 17:19:06 +02:00
aa54089230
docs(claude): errors are logged and shown as kinds, and what carries transcript text must be local (ADR-035)
mathiasandClaude Sonnet 5.52026-10-02 16:50:56 +02:00
8749ffe6a9
docs(homelab): the engine timeout, a local chat model, ffmpeg in the image, and 31B with Low Power Mode off
mathiasandClaude Sonnet 5.52026-10-02 16:50:56 +02:00
67879f85eb
test(acceptance): map the hardening scenarios, and follow the two tests renamed in the review
mathiasandClaude Sonnet 5.52026-10-02 16:50:43 +02:00
08b7654d06
docs(use-cases): scenarios for the review's hardening (ADR-035 decision 8) -- the coverage gate is red until mapped
mathiasandClaude Sonnet 5.52026-10-02 16:50:35 +02:00
f03b0213d0
docs(adr): record the owner's decisions on #34, #35 and ADR-034, and the adversarial review's hardening (ADR-035 decision 8)
mathiasandClaude Sonnet 5.52026-10-02 16:50:22 +02:00
cb22832413
feat(docker): static ffmpeg and ffprobe in the distroless image, pinned by version and sha256 (#34 option A)
mathiasandClaude Sonnet 5.52026-10-02 16:50:02 +02:00
5d4324c2a2
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
6596e83cd5
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
bc90e3aec7
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
1a57489d04
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
ede6c0e5ea
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
5928925589
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
e5bba3cd23
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
2df8a7eb20
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
6e7c772b31
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
a2027c9f9b
chore(fixtures): invented text in place of words that may come from the private recording; the research note no longer names the private file (adversarial review F10)
mathiasandClaude Sonnet 5.52026-10-02 16:49:54 +02:00
e38ea3175d
test: assertions the adversarial review found missing -- log lines, immediate saves, snapshot isolation, store and temp-file failures, bounded snippet, identical list (review F9)
mathiasandClaude Sonnet 5.52026-10-02 16:48:58 +02:00
cdb709b9e2
test: assertions the adversarial review found missing -- log lines, immediate saves, snapshot isolation, store and temp-file failures, bounded snippet, identical list (review F9)
mathiasandClaude Sonnet 5.52026-10-02 16:48:58 +02:00
0d8bf0f94c
test: assertions the adversarial review found missing -- log lines, immediate saves, snapshot isolation, store and temp-file failures, bounded snippet, identical list (review F9)
mathiasandClaude Sonnet 5.52026-10-02 16:48:58 +02:00
5b3e550d9b
test: assertions the adversarial review found missing -- log lines, immediate saves, snapshot isolation, store and temp-file failures, bounded snippet, identical list (review F9)
mathiasandClaude Sonnet 5.52026-10-02 16:48:58 +02:00
cb0ed8642a
test: assertions the adversarial review found missing -- log lines, immediate saves, snapshot isolation, store and temp-file failures, bounded snippet, identical list (review F9)
mathiasandClaude Sonnet 5.52026-10-02 16:48:58 +02:00
b8a4778513
test(web): a malformed multipart header is a 400 whose text is not logged; the file-name case no longer demands a 303
mathiasandClaude Sonnet 5.52026-10-02 16:47:49 +02:00
9b82c06d92
fix(web): 429 for a busy queue; a non-UUID id and a malformed or odd-byte title are 4xx or cleaned, never 500 (review F6, F7)
mathiasandClaude Sonnet 5.52026-10-02 16:47:49 +02:00
93b4dbec1e
feat(uploads): a full queue is a busy rejection, the row failed honestly (review F6)
mathiasandClaude Sonnet 5.52026-10-02 16:47:49 +02:00
019ee636c8
test: a bounded queue answered as 'busy', and bad input answered with a 4xx (red; adversarial review F6, F7)
mathiasandClaude Sonnet 5.52026-10-02 16:46:13 +02:00
0da24d42f4
test: a bounded queue answered as 'busy', and bad input answered with a 4xx (red; adversarial review F6, F7)
mathiasandClaude Sonnet 5.52026-10-02 16:46:13 +02:00
2891ffabae
test: a bounded queue answered as 'busy', and bad input answered with a 4xx (red; adversarial review F6, F7)
mathiasandClaude Sonnet 5.52026-10-02 16:46:13 +02:00
aa0322095b
test: a bounded queue answered as 'busy', and bad input answered with a 4xx (red; adversarial review F6, F7)
mathiasandClaude Sonnet 5.52026-10-02 16:46:13 +02:00
a7e2cc43c0
test(cmd): the built worker refuses audio longer than the configured maximum (review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:45:25 +02:00
6b83d72655
fix(cmd): the converter is capped and the worker measures, at the configured maximum (review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:45:25 +02:00
07050cf9b6
feat(web): say in words why a recording was refused for its real length (review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:45:25 +02:00
16cd246241
feat(uploads): the worker measures the converted audio against the limit and the claim (review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:45:25 +02:00
132f46b047
feat(uploads): the job carries the duration the file claimed (review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:45:25 +02:00
12576aa129
feat(audio): MaxSeconds caps the converted length, so a header that lies cannot become hours of WAV (review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:45:25 +02:00
ba39864b2b
feat(domain): UploadErrTooLong and UploadErrIncomplete -- the two ways a file's claimed length can be wrong (review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:45:25 +02:00
741eccb575
test: the duration limit is checked against what is converted, not what the header claims (red; adversarial review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:43:46 +02:00
5640d95f40
test: the duration limit is checked against what is converted, not what the header claims (red; adversarial review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:43:46 +02:00
8f62d053ee
test: the duration limit is checked against what is converted, not what the header claims (red; adversarial review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:43:46 +02:00
52351c2cc1
test: the duration limit is checked against what is converted, not what the header claims (red; adversarial review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:43:46 +02:00
29b3b725d1
test: the duration limit is checked against what is converted, not what the header claims (red; adversarial review F2)
mathiasandClaude Sonnet 5.52026-10-02 16:43:46 +02:00
c8ec468e47
feat(transcribe): WithTimeout -- each engine call gets its own deadline so a wedged engine fails while the job lives (review F4)
mathiasandClaude Sonnet 5.52026-10-02 16:42:46 +02:00
81a60d5fd4
test: a per-engine deadline so a wedged primary reaches the fallback (red; adversarial review F4)
mathiasandClaude Sonnet 5.52026-10-02 16:41:38 +02:00
c8c7356f19
test: a per-engine deadline so a wedged primary reaches the fallback (red; adversarial review F4)
mathiasandClaude Sonnet 5.52026-10-02 16:41:38 +02:00
8d1b7d887f
test: a per-engine deadline so a wedged primary reaches the fallback (red; adversarial review F4)
mathiasandClaude Sonnet 5.52026-10-02 16:41:38 +02:00
21b337702a
test: a per-engine deadline so a wedged primary reaches the fallback (red; adversarial review F4)
mathiasandClaude Sonnet 5.52026-10-02 16:41:38 +02:00
d16c2998d0
test(reconcile): the stored reason is a kind -- the old assertion encoded the leak the review found
mathiasandClaude Sonnet 5.52026-10-02 16:40:55 +02:00
fb79dbb045
fix(uploads.go): an error reaches the log, the row and the page as a kind, never its text (adversarial review F3, F5)
mathiasandClaude Sonnet 5.52026-10-02 16:40:55 +02:00
a2587eae9b
fix(worker.go): an error reaches the log, the row and the page as a kind, never its text (adversarial review F3, F5)
mathiasandClaude Sonnet 5.52026-10-02 16:40:55 +02:00
0b35278cdf
fix(transcribe): an error reaches the log, the row and the page as a kind, never its text (adversarial review F3, F5)
mathiasandClaude Sonnet 5.52026-10-02 16:40:55 +02:00
16a8833f79
fix(reconcile.go): an error reaches the log, the row and the page as a kind, never its text (adversarial review F3, F5)
mathiasandClaude Sonnet 5.52026-10-02 16:40:55 +02:00
03a122c9f5
fix(tracker.go): an error reaches the log, the row and the page as a kind, never its text (adversarial review F3, F5)
mathiasandClaude Sonnet 5.52026-10-02 16:40:55 +02:00
31f5a74d2a
test(web): the upload routes' error paths log a kind, not the text (red; review F5)
mathiasandClaude Sonnet 5.52026-10-02 16:40:10 +02:00
166ff849c0
test(uploads): a failure logs a kind, never the error text or the spool path (red; review F5)
mathiasandClaude Sonnet 5.52026-10-02 16:40:10 +02:00
e9863c2e12
test(progress): a keyed failure logs its kind, not the error's text (red; review F3)
mathiasandClaude Sonnet 5.52026-10-02 16:40:10 +02:00
8f3300b377
test(transcribe): a failed engine's reason is a kind, not its error text (red; review F3)
mathiasandClaude Sonnet 5.52026-10-02 16:40:10 +02:00
f6c3f2af23
test(reconcile): the skipped reason carries a kind, not the model's text (red; review F3)
mathiasandClaude Sonnet 5.52026-10-02 16:40:10 +02:00
2d1b08458b
feat(transcribe): StatusError.HTTPStatus -- its code, never its snippet, becomes the kind (review F3)
mathiasandClaude Sonnet 5.52026-10-02 16:39:38 +02:00
2608ad2f09
feat(llm): HTTPError -- a status code to branch on, a bounded body in the text (review F3)
mathiasandClaude Sonnet 5.52026-10-02 16:39:38 +02:00
81f3d7ffc6
test(transcribe): a StatusError exposes its code as a kind, not its snippet (red; adversarial review F3)
mathiasandClaude Sonnet 5.52026-10-02 16:39:25 +02:00
8c82d67b12
test(llm): a non-200 is an HTTP status error whose kind carries no body, and the body is bounded (red; adversarial review F3)
mathiasandClaude Sonnet 5.52026-10-02 16:39:25 +02:00
d8eea66c4c
feat(errkind): Of -- a kind from a fixed vocabulary, never the error's text (review F3, F5)
mathiasandClaude Sonnet 5.52026-10-02 16:39:10 +02:00
dc0c64ddeb
test(errkind): an error reduced to a safe kind, never its text (red; adversarial review F3, F5)
mathiasandClaude Sonnet 5.52026-10-02 16:39:04 +02:00