813e679f93
fix(uploads): bound the silence in an upload body with a re-armed read deadline (#56) (#63)
v0.33.1
mathias2026-10-05 04:59:29 +00:00
b9643f5fb7
Merge pull request 'feat(uploads): choose the language of a recording; Swedish default, Other = auto (#61 interim)' (#62) from sprint/language into main
v0.33.0
mathias2026-10-05 04:59:03 +00:00
e3288d0654
feat(web): the language is named on the recording's page in every state; the feature says what Other really does (#61)
mathiasandClaude Sonnet 5.52026-10-04 22:41:42 +02:00
e0c53f8719
feat(uploads): an auto-language job is planned without the engines it never runs (#61)
mathiasandClaude Sonnet 5.52026-10-04 22:41:21 +02:00
0828f0debf
test(web): the language refusal asserts its message, not a word the form always contains (#61)
mathiasandClaude Sonnet 5.52026-10-04 22:40:47 +02:00
7282893877
test(transcribe): WithTimeout hands the engine the job's language, as on the production path (#61)
mathiasandClaude Sonnet 5.52026-10-04 22:40:35 +02:00
0338b18a17
feat(uploads): choose the language of a recording; record it, show it, carry it to the engines (#61)
mathiasandClaude Sonnet 5.52026-10-04 22:29:58 +02:00
ed9d76b0cf
feat(transcribe): a non-Swedish upload skips the Swedish-only base engine and is not reconciled (#61)
mathiasandClaude Sonnet 5.52026-10-04 22:26:37 +02:00
0b807c6bcd
feat(transcribe): the gateway sends language=sv, omits it for auto, and refuses anything else (#61)
mathiasandClaude Sonnet 5.52026-10-04 22:26:13 +02:00
7b7da650d4
docs(sprint): v0.31.1 and v0.32.0 shipped; what is observed live and what waits for an authenticated look
mathiasandClaude Sonnet 5.52026-10-04 00:34:59 +02:00
85f4cc3236
Merge pull request 'v0.32.0: per-recording delete and nav link, cloud-served note, tracker hardening, bounded LLM reads (#37#51#52#53)' (#58) from sprint/v032 into main
v0.32.0
mathias2026-10-03 22:31:26 +00:00
67bd0350a3
fix(web): judge every word of a reconciled endpoint that is not a connector, so an unprefixed alias is not called local (#52)
mathiasandClaude Sonnet 5.52026-10-04 00:22:41 +02:00
fc1e8e7ba8
test(web): a foreign post to the recording delete route leaves the recording, on an app that mounts uploads (#37, #48)
mathiasandClaude Sonnet 5.52026-10-03 21:32:14 +02:00
4a0226d8bd
test(llm): the response cap is pinned at its boundary and as the production default (#53)
mathiasandClaude Sonnet 5.52026-10-03 21:31:30 +02:00
01c1606caa
test(progress): the default save and heartbeat deadline is pinned, not only the override (#51)
mathiasandClaude Sonnet 5.52026-10-03 21:30:58 +02:00
9aa01468ce
fix(web): judge each alias of a reconciled endpoint, so an all-local transcript is not called cloud-served (#52)
mathiasandClaude Sonnet 5.52026-10-03 21:30:44 +02:00
a6691ac46b
docs: per-recording delete and the recordings link are built; feature scenarios and coverage map (#37)
mathiasandClaude Sonnet 5.52026-10-03 21:07:11 +02:00
f309a39027
feat(web): POST /uploads/{id}/delete, owner-scoped and refused while the recording is active (#37)
mathiasandClaude Sonnet 5.52026-10-03 21:06:46 +02:00
89611164e3
test(web): per-recording delete is owner-scoped, refused while active, offered only when finished (#37), red
mathiasandClaude Sonnet 5.52026-10-03 21:06:22 +02:00
8509004eb7
test(store): an owner can delete a finished upload; an active or foreign one is refused (#37), red
mathiasandClaude Sonnet 5.52026-10-03 21:05:52 +02:00
4ef3e85d16
test(web): the home list links to recordings only when uploads are mounted (#37), red
mathiasandClaude Sonnet 5.52026-10-03 21:05:16 +02:00
b8af7f32c7
fix(progress): stamp the heartbeat with the application clock the page compares it with (#51)
mathiasandClaude Sonnet 5.52026-10-03 21:04:42 +02:00
813192e5ba
test: heartbeats are stamped with the application clock, not the database's NOW() (#51), red
mathiasandClaude Sonnet 5.52026-10-03 21:04:15 +02:00
2ec1557a8c
fix(progress): bound every save and heartbeat write so a hung database cannot stall the job (#51)
mathiasandClaude Sonnet 5.52026-10-03 21:03:56 +02:00
68815755e8
test(progress): a hung save or beat must not stall the reporter or the heartbeat (#51), red
mathiasandClaude Sonnet 5.52026-10-03 21:03:37 +02:00
ba18668796
docs(feature): cloud-served transcripts say the audio left the homelab; empty transcript also triggers the fallback (#52)
mathiasandClaude Sonnet 5.52026-10-03 21:03:07 +02:00
a43ee19505
feat(web): helper naming the cloud provider of a transcript, one definition of local (#52)
mathiasandClaude Sonnet 5.52026-10-03 21:02:55 +02:00
61d1ff2255
fix(llm): read a bounded response body, 8 MiB on success and the error bound on failure (#53)
mathiasandClaude Sonnet 5.52026-10-03 21:01:53 +02:00
4ef446548d
docs(adr): spool arithmetic and the unbounded slow-drip limitation for the receive cap (#47)
mathiasandClaude Sonnet 5.52026-10-03 21:12:48 +02:00
145949875e
fix(audio): keep a bounded head of ffmpeg's output instead of buffering all of it (#49)
mathiasandClaude Sonnet 5.52026-10-03 21:12:48 +02:00
1b4747ed03
test: FailUpload must not overwrite a finished upload; ffmpeg stderr is bounded, red (review of #55)
mathiasandClaude Sonnet 5.52026-10-03 21:12:34 +02:00
9939afb90c
test: pin the production receive limits, split the vacuous drain test, harden the lint-gate test (review of #55)
mathiasandClaude Sonnet 5.52026-10-03 21:12:34 +02:00
253aa567aa
fix(serve): handle SIGTERM and wait for in-flight requests and the worker before exiting (#50)
mathiasandClaude Sonnet 5.52026-10-03 21:00:55 +02:00
5644dc3fc8
fix(uploads): record a job interrupted by shutdown at once, on its own short context (#50)
mathiasandClaude Sonnet 5.52026-10-03 21:00:55 +02:00
7df1de6628
test(serve): shutdown waits for in-flight requests and the worker, bounded (#50), red
mathiasandClaude Sonnet 5.52026-10-03 20:59:57 +02:00
7e920102f6
test: SIGTERM cancels the process context; a shutdown mid-job records the row interrupted at once (#50), red
mathiasandClaude Sonnet 5.52026-10-03 20:59:40 +02:00
7b19801bfa
test(audio): ffprobe/ffmpeg must cap streams, ffprobe must narrow its output (#49), red
mathiasandClaude Sonnet 5.52026-10-03 20:55:54 +02:00
24d65b2085
docs(sprint): audio upload follow-ups sweep sprint plan, oath and decision list
mathiasandClaude Sonnet 5.52026-10-03 20:50:34 +02:00
df7bd459ed
docs(adr): the ingress body-size item is resolved, and uploads are on in production (infra#520)
mathiasandClaude Sonnet 5.52026-10-03 16:29:32 +02:00
4a2067063d
feat: upload audio, get a private Swedish transcript, discuss it (#33, ADR-033) (#39)
v0.31.0
mathias2026-10-03 14:13:37 +00:00
9d7afb2bcb
fix(web): the title-part hang-up is handled like the rest, and an abandoned request is answered 499, not an implicit 200 (fourth review)
mathiasandClaude Sonnet 5.52026-10-02 17:47:13 +02:00
1266e18038
fix(uploads): every worker log carries a kind, including store and temp-file errors (fourth review)
mathiasandClaude Sonnet 5.52026-10-02 17:47:13 +02:00
51ee5d48e5
feat(errkind): a database error is reduced to its SQLSTATE, never its message, which can quote a transcript value (fourth review)
mathiasandClaude Sonnet 5.52026-10-02 17:47:13 +02:00
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)
mathiasandClaude Sonnet 5.52026-10-02 17:46:07 +02:00
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)
mathiasandClaude Sonnet 5.52026-10-02 17:46:07 +02:00
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)
mathiasandClaude Sonnet 5.52026-10-02 17:46:07 +02:00
fbc3ee61c1
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)
mathiasandClaude Sonnet 5.52026-10-02 17:46:07 +02:00
e97d4400b0
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)
mathiasandClaude Sonnet 5.52026-10-02 17:46:07 +02:00
6e50a97b6d
docs(adr): third review -- the hang-up path, the client-read marker, the note kept visible
mathiasandClaude Sonnet 5.52026-10-02 17:36:42 +02:00
815ee98d4c
test(web): the title input that proves a bidi character is dropped, not replaced
mathiasandClaude Sonnet 5.52026-10-02 17:36:42 +02:00
91e475807c
fix(web): a finished upload's record opens when a step carries a note (third review)
mathiasandClaude Sonnet 5.52026-10-02 17:36:42 +02:00
6d044ba403
fix(web): a client that hangs up is logged at INFO and not answered; the 400 follows the marker, not io.ErrUnexpectedEOF; hasNote (third review)
mathiasandClaude Sonnet 5.52026-10-02 17:36:42 +02:00
632dbeba0e
feat(uploads): ErrClientRead marks an error from reading the client's body (third review)
mathiasandClaude Sonnet 5.52026-10-02 17:36:42 +02:00
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)
mathiasandClaude Sonnet 5.52026-10-02 17:35:29 +02:00
272a5db75f
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)
mathiasandClaude Sonnet 5.52026-10-02 17:35:29 +02:00
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)
mathiasandClaude Sonnet 5.52026-10-02 17:35:29 +02:00
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)
mathiasandClaude Sonnet 5.52026-10-02 17:35:29 +02:00
af4e9c8632
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)
mathiasandClaude Sonnet 5.52026-10-02 17:35:29 +02:00
04a3bc261f
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)
mathiasandClaude Sonnet 5.52026-10-02 17:35:29 +02:00
08ffc2ff62
test(web): Go escapes for the bidirectional characters, which staticcheck ST1018 requires -- task check does not gate lint (#41)
mathiasandClaude Sonnet 5.52026-10-02 17:23:50 +02:00
b46a0dd0c9
docs(adr): second review -- the note instead of a refusal, room before spooling, the callable chat model, and the image that was actually built (ADR-035 decision 8)
mathiasandClaude Sonnet 5.52026-10-02 17:22:41 +02:00