mathias and Claude Sonnet 5.5
cff5cd2f0a
test: fourth review -- a hang-up anywhere in the body, an abandoned request is not an implicit 200, a database error is logged as its SQLSTATE (red)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:46:07 +02:00
mathias and Claude Sonnet 5.5
fc8ac376fa
test: fourth review -- a hang-up anywhere in the body, an abandoned request is not an implicit 200, a database error is logged as its SQLSTATE (red)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:46:07 +02:00
mathias and Claude Sonnet 5.5
73fe203d62
test: fourth review -- a hang-up anywhere in the body, an abandoned request is not an implicit 200, a database error is logged as its SQLSTATE (red)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:46:07 +02:00
mathias and Claude Sonnet 5.5
632dbeba0e
feat(uploads): ErrClientRead marks an error from reading the client's body (third review)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:36:42 +02:00
mathias and Claude Sonnet 5.5
fb5dc9d461
test: third review -- a real disconnect is not an error, a DB drop is not the client's, a note stays visible, every bidi character and the 80% boundary pinned (red)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:35:29 +02:00
mathias and Claude Sonnet 5.5
1b0fc668bc
test: third review -- a real disconnect is not an error, a DB drop is not the client's, a note stays visible, every bidi character and the 80% boundary pinned (red)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:35:29 +02:00
mathias and Claude Sonnet 5.5
375da83c5e
test: third review -- a real disconnect is not an error, a DB drop is not the client's, a note stays visible, every bidi character and the 80% boundary pinned (red)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:35:29 +02:00
mathias and Claude Sonnet 5.5
9a2f24b3c9
fix(uploads): refuse a full queue before spooling, probing or creating a row (second review)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:22:41 +02:00
mathias and Claude Sonnet 5.5
3f5b9345a0
feat(uploads): HasRoom -- say before spooling whether a submit would be accepted (second review)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:22:41 +02:00
mathias and Claude Sonnet 5.5
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)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:20:38 +02:00
mathias and Claude Sonnet 5.5
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)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:20:38 +02:00
mathias and Claude Sonnet 5.5
f7284ccdc9
fix(uploads): a file much shorter than it claimed is transcribed and noted, not refused; the tolerances are named (second review finding 1)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:20:02 +02:00
mathias and Claude Sonnet 5.5
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)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 17:19:32 +02:00
mathias and Claude Sonnet 5.5
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)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:48:58 +02:00
mathias and Claude Sonnet 5.5
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)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:48:58 +02:00
mathias and Claude Sonnet 5.5
93b4dbec1e
feat(uploads): a full queue is a busy rejection, the row failed honestly (review F6)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:47:49 +02:00
mathias and Claude Sonnet 5.5
f9ad85cac4
feat(uploads): a bounded queue, in total and per user (review F6)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:47:49 +02:00
mathias and Claude Sonnet 5.5
a1d6754ae9
feat(uploads): ReasonBusy, a rejection that is the user's to retry (review F6)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:47:49 +02:00
mathias and Claude Sonnet 5.5
2891ffabae
test: a bounded queue answered as 'busy', and bad input answered with a 4xx (red; adversarial review F6, F7)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:46:13 +02:00
mathias and Claude Sonnet 5.5
aa0322095b
test: a bounded queue answered as 'busy', and bad input answered with a 4xx (red; adversarial review F6, F7)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:46:13 +02:00
mathias and Claude Sonnet 5.5
16cd246241
feat(uploads): the worker measures the converted audio against the limit and the claim (review F2)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:45:25 +02:00
mathias and Claude Sonnet 5.5
132f46b047
feat(uploads): the job carries the duration the file claimed (review F2)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:45:25 +02:00
mathias and Claude Sonnet 5.5
8f62d053ee
test: the duration limit is checked against what is converted, not what the header claims (red; adversarial review F2)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:43:46 +02:00
mathias and Claude Sonnet 5.5
52351c2cc1
test: the duration limit is checked against what is converted, not what the header claims (red; adversarial review F2)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:43:46 +02:00
mathias and Claude Sonnet 5.5
a2587eae9b
fix(worker.go): an error reaches the log, the row and the page as a kind, never its text (adversarial review F3, F5)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:40:55 +02:00
mathias and Claude Sonnet 5.5
166ff849c0
test(uploads): a failure logs a kind, never the error text or the spool path (red; review F5)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 16:40:10 +02:00
mathias and Claude Sonnet 5.5
c6319b9bc6
refactor(uploads): the worker's own failure is FailRunning
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 08:53:43 +02:00
mathias and Claude Sonnet 5.5
9393c27cdb
test(uploads): the worker waits for its heartbeat to finish -- a mutation that skipped the wait survived until now
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 08:53:10 +02:00
mathias and Claude Sonnet 5.5
538ed93ccd
test(uploads): a slow heartbeat write, so one is in flight when the job ends
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 08:53:10 +02:00
mathias and Claude Sonnet 5.5
27a88a0a1f
feat(uploads): the worker reports real phases, beats on its own, and logs each one (ADR-035)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 08:53:10 +02:00
mathias and Claude Sonnet 5.5
eb4d4b67e6
test(uploads): the worker reports real phases, beats on its own, and logs them in order without the transcript (red)
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 08:52:20 +02:00
mathias and Claude Sonnet 5.5
3f66c35497
test(uploads): the worker's store double records progress saves and heartbeats
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-02 08:52:20 +02:00
mathias and Claude Sonnet 5.5
f102199097
feat(uploads): Intake passes whether the file had a video track to the store
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 18:43:00 +02:00
mathias and Claude Sonnet 5.5
01eab1ab6f
feat(uploads): a video track is no longer a reason to reject (ADR-033)
...
Only no-audio, unreadable length and too-long are refused. ReasonVideo is gone.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 18:43:00 +02:00
mathias and Claude Sonnet 5.5
ab62cdaf1c
test(uploads): Accept records whether the file had a video track (red)
...
Red: Store.CreateUpload does not take hadVideo yet.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 18:42:13 +02:00
mathias and Claude Sonnet 5.5
6cbb7b2df0
test(uploads): a recording with a video track is accepted (red)
...
A Teams meeting with the camera off is still an .mp4 with a video track.
Video with no audio is now rejected as having no audio.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 18:42:04 +02:00
mathias and Claude Sonnet 5.5
a8dadb8ca4
feat(uploads): in-process transcription worker, one job at a time (ADR-033)
...
Queue -> StartTranscribing -> ffmpeg to 16 kHz WAV -> gateway chain ->
CompleteUpload, with a per-job timeout so a hung endpoint ends in failed, not
a spinner. The upload and the WAV are deleted on every path (audio is never
retained). A shutdown mid-job is not a failure: the row is left for the
start-up sweep. Cancellation wins over a non-empty queue, so queued jobs are
never started on shutdown; stop() deletes their audio and refuses new jobs.
Concurrency is 1 on purpose: two simultaneous long jobs on iguana were never
measured, and a Metal OOM there latches whisper (infra#273). The queue is
process-local, so ADR-018's single-replica assumption now has a second
dependent.
Mutation-checked, -race clean: cleanup, shutdown-vs-failure, timeout,
concurrency and stop-cleanup each turn a test red.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 16:54:52 +02:00
mathias and Claude Sonnet 5.5
3cfc95640e
test(uploads): a queued job at shutdown must never be started; timeout test fails fast
...
Mutation-testing the worker showed deleting stop()'s cleanup went unnoticed:
Process was incidentally deleting the audio of jobs it should never have
started. The stop test now asserts only the running job was converted (red on
the old code). The timeout test no longer hangs for the 10-minute go test
default when the timeout is removed.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 16:54:52 +02:00
mathias and Claude Sonnet 5.5
52417e6b47
test(uploads): in-process transcription worker (red)
...
Success path deletes both the upload and the WAV; failures are typed and still
delete the audio; a shutdown mid-job leaves the row for the start-up sweep
(it is not a transcription failure); a hung endpoint is failed by the job
timeout, never an eternal spinner; strictly one job at a time (two long jobs on
iguana were never measured); stopping deletes queued audio and refuses new jobs.
Red: uploads.Worker is undefined.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 16:47:22 +02:00
mathias and Claude Sonnet 5.5
1910d3dfb5
feat(uploads): Intake -- spool, probe, validate, queue; clean up on every failure (ADR-033)
...
Bounded read (cap+1 byte tells 'at the limit' from 'over'); a file that fails
validation creates no row; a prober fault is our error, not the user's bad
file; a row whose job cannot be submitted is failed, never left queued.
Mutation-checked: cap off-by-one, missing cleanup and deleting the handed-over
file each turn a test red.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 16:40:13 +02:00
mathias and Claude Sonnet 5.5
b98e9df462
test(uploads): Accept -- size cap, probe verdicts, cleanup on every failure path (red)
...
Red: uploads.Job, Intake and ErrUnreadable are undefined.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 16:40:03 +02:00
mathias and Claude Sonnet 5.5
e3e1f17c40
feat(uploads): validation policy for probed audio uploads (ADR-033)
...
Video is checked first so it is always refused as video; limits and reasons
are typed so callers and tests branch on Reason, not message text.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 16:39:51 +02:00
mathias and Claude Sonnet 5.5
f42b8e23fc
test(uploads): validation policy -- video, no-audio, too-long, unreadable (red)
...
Probe-based, not extension-based: a Teams voice-only export is typically an
.mp4 with no video stream, indistinguishable from video by name (ADR-033).
Red: package uploads does not exist.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-10-01 16:39:20 +02:00