Commit Graph

245 Commits

Author SHA1 Message Date
9f78a1552f feat(qa): fire a multica webhook autopilot for each sonar GitHub issue
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 03:28:41 +02:00
220f5fc1ec feat(qa): group sonar issues per rule
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 03:03:23 +02:00
98a87077d9 feat(qa): sonar triage loop (dry-run default) and multica agent hookup
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 02:47:21 +02:00
caee289bcc fix(conversation): keep Turn history rows visible in the Latency column
The rows were added to the DOM but the overflow:auto list was shrunk to zero
height by the flex column panel once the charts filled it. Adds tests for
#n + time rows, error rows and stats arriving after done.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 02:14:55 +02:00
a3ba3581fe feat(conversation): red/blue mic button with aria-pressed state
Red while the mic is hot (live or recording), blue when off; label toggles
Stop/Start microphone (DE+EN); pulse only without reduced motion; reset to
blue when microphone access fails.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 02:14:49 +02:00
0a30b00d7f refactor(conversation): show metrics in the latency column instead of a second tab
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 01:30:27 +02:00
e7a25d80ff feat(conversation): metrics view with TTFB charts and token usage
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 00:48:32 +02:00
dea6286775 feat(conversation): pick the LLM endpoint from the configured language models
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 00:33:30 +02:00
8ce8e791b2 feat(conversation): thinking on/off switch
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 00:21:11 +02:00
e8c0df027e test: fail any spec that would write to the live API
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 21:00:25 +02:00
38f88958c6 fix(magazine): mock /api/settings in magazine specs and await lazy module in deep-link spec
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 20:06:52 +02:00
aa92ed30b3 refactor(installer): extract run_command helper to cut cognitive complexity
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 19:28:37 +02:00
3317bfd063 test: make spawn helper test independent of leaked tasks
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 19:00:06 +02:00
4f30ee5c0d fix: keep references to background asyncio tasks
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 18:57:20 +02:00
2a06d0a488 fix(export): ship untagged file when provenance tagging fails
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 18:38:42 +02:00
8fed5eeda8 fix(voices): archetype language filter accepts ISO codes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 18:29:28 +02:00
b33559884c feat(voices): archetype gallery UI
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 18:23:14 +02:00
281869709b fix(voices): drop the Source unknown badge from list rows
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 18:22:41 +02:00
fece9122d1 feat(voices): archetype catalog and API
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 18:10:35 +02:00
c0a5d54763 fix(voices): robust LibriVox search and expose export_provenance_default
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 18:07:22 +02:00
7a86e51faa test(audiobook): cover emotion to instruct path and document audiobook emotions
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 17:56:54 +02:00
772c43d7f0 feat(voices): LibriVox and Wikimedia Commons voice sources
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 17:42:36 +02:00
9b169037a4 feat(tts): inline tags in generate, audiobook and magazine paths
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 17:35:18 +02:00
5a7c73ea42 feat(export): provenance tags and optional disclosure for exported audio
ID3 provenance tags (synthetic speech, generator, version, date, opt-in
voice name) on magazine MP3/ZIP/EPUB exports via a stream-copied temp copy;
verify endpoint and CLI; AudioSeal tier is a documented stub.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 17:02:41 +02:00
8b51487a64 feat(tts): inline pause, spell and speed tags
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:52:23 +02:00
91843e95e6 feat(voices): optional vocal isolation for URL imports
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:50:14 +02:00
e0daafd4e1 feat(voices): export and import voice bundles
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:42:28 +02:00
781bf6e7f2 feat(voices): consent and provenance field per voice
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:39:32 +02:00
b36423457b feat(design): auto-pick the best seed by scored candidates
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:37:58 +02:00
a0cd7b867f feat(voices): show audio problems in the voice library
Single-voice health endpoint (GET /api/voices/{id}/health), problems stored in
meta on import, shown in the Try-out voice panel; architecture note and docs.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:35:10 +02:00
67537310d0 feat(design): attribute chips for voice-design prompts
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:34:06 +02:00
19283a53a4 feat(voices): timestamped audio problem flags in voice health
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:10:56 +02:00
2594a236c4 feat(magazine): journalist/guest voices for c't-style interviews
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 15:25:51 +02:00
a8177711f4 feat(characters): global cast view in the sidebar and per-book characters inside Studio
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 22:29:42 +02:00
e1aca0ba34 feat(magazine): exclude entries from the untitled-page cleanup
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 22:06:28 +02:00
03ebd9ba35 feat(magazine): show page labels, display titles and merge suggestions
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 19:22:55 +02:00
42bb556db9 fix(magazine): approving a review page keeps all blocks of a multi-page article
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 14:48:37 +02:00
572fae892d fix(magazine): fit driving-mode text inside the frame and offer less text
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 14:46:31 +02:00
48af2b3ccb feat(magazine): detect continuation pages and suggest titles for untitled articles
"Page N" entries come from review stand-ins created after Approve saved only
the visible page's regions. New core/magazine_untitled.py classifies untitled
entries (continuation, article head, advert, picture page, contents, junk),
proposes merges into the previous article with confidence and evidence
(optional LLM check in the ambiguous band), and suggests titles
(deterministic, optional validated and cached LLM titles). Exposed through
derived GET /articles fields, GET /untitled, quality report, undoable
merge-into-previous / accept-title routes, POST /titles/suggest and
scripts/magazine_untitled.py (dry run by default, --apply backs up first).
Merges mark audio_stale; no audio is deleted; real titles are never
overwritten.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 14:36:29 +02:00
7eabdf0e43 feat(characters): distinct deterministic face profiles per character
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 14:25:56 +02:00
488e57e609 feat(magazine): clearer driving-mode menu with switches and theme selector
Menu is grouped into View (Picture/Text/Split radios), Show and Playback
(real switches) and Theme (Light|Auto|Dark segmented control). Fixes the
Dark option looking disabled: its data-theme=dark attribute matched the
app-wide dark palette selector. Adds automatic advance to the next article
with audio (switch, default on) with End of magazine state.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 14:24:05 +02:00
1f812d2faf fix(characters): merge profiles only on real names, keep other cast names, reasoning and foreign quotes out of a character
Real-library audit (270 records) traced the data damage to:
- identity matching on ANY shared token ("Zwerg", "der Zwerg", "Mann") with
  "longer text wins" merging (Arthag b02 = Kolon's species/relationships), and
- csRosterCanonicalName renaming a sheet to the first cast name among its
  aliases, which saved 16 whole-sheet copies (Zwerg/Kolon = Arthag b03,
  Fremder = Mann, Alchimist = Promos ...).

Fixes:
- static/js/character-identity.js + core/character_records.py: generic labels
  are never identity evidence; csFindMergeKey, csConsolidateAliasDuplicates,
  csRosterCanonicalName, clSameIdentity use it; own name always wins; clUpsert
  writes to the exact-name record before any alias scan; no seed rename onto a
  name that has its own record.
- _charsheets_parse: in cast-target mode drop other cast members' names from
  aliases / first / last name (Kolon: "Sharraz Garthai"), strip reasoning
  leakage ("Warte:", "Der Text sagt ...") from every text field.
- _character_scene_evidence: only a quote naming the character is used,
  otherwise its own mannerisms (16 panels showed another character's scene).
- _character_age_category: Junge/Mädchen/boy/girl, number words, Sommer/
  Winter ages, evidence clause, age-tagged quotes; "15 Jahre älter" is no age.
- scripts/audit_character_records.py (read-only) and
  scripts/clean_character_records.py (dry run by default, --apply backs up).

Tests: tests/test_character_record_hygiene.py, tests/character-identity.test.mjs.
Docs: architecture/character-extraction.md, Manual, CHANGELOG.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 14:09:53 +02:00
04f791e1f5 feat(characters): translate character info to English before image prompts
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 12:01:42 +02:00
4fd21b1d1c fix(characters): base dwarf body lock and species text on the character's own species assertion
Extraction notes in race_species that mention another character's species
("Mensch (oder Zwerg, ...)", "... 'Der Zwerg' wird separat erwähnt ...")
switched on the dwarf body lock (short legs, full beard) for human characters
and carried a sentence about another character into the Subject clause.
Confirmed on the real library: Marrad, Kolon and Arthag (book 02).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 11:09:19 +02:00
e60126721d feat(magazine): record/replay cache for vision responses in OCR comparisons
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 11:09:17 +02:00
5a69481f65 feat(magazine): night theme for driving mode (Auto/Light/Dark)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 09:15:28 +02:00
f120f3d4f4 style(magazine): separate driving-mode index rows with dividers and padding
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 09:07:13 +02:00
f13f884ab1 feat(magazine): driving index rows with play/resume buttons, author and listening status
Index rows reuse the playlist state helper (magListenState): round 44px play/resume/replay button,
smaller muted 'by Author', not played / partly played / played indicator with accessible text, live updates.
Also fix a stale word highlight in the lyrics view that made a driving-mode test fail.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 08:45:04 +02:00
2ffab0052c test(magazine): timing records of version 2 are readable
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 00:57:00 +02:00
9e5ea609ce feat(magazine): word-level timing via forced-aligner sidecar with player word highlight
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 00:37:40 +02:00