Skip to content

Studio 2.0#99

Draft
senigami wants to merge 80 commits into
mainfrom
studio-2.0
Draft

Studio 2.0#99
senigami wants to merge 80 commits into
mainfrom
studio-2.0

Conversation

@senigami

@senigami senigami commented Apr 9, 2026

Copy link
Copy Markdown
Owner

No description provided.

senigami and others added 11 commits April 8, 2026 10:34
* stubbs

* more detailed connections

* robust scaffolding

* add missing functions and cleanup

* fixing issues before they happen

* fix some other issues

* added dependency contracts

* added missing scaffolding

* pr fix and better UX navigation

* add manifest version

* phase 1 complete

* final final commit v2
* phase 2

* Update test_domain_contracts.py

* Update phase_2_domain_contracts.md

* Update __init__.py

* Fix for build

* Update phase_2_domain_contracts.md
…93)

* engine contract, registry, registry, validator

* fixing bugs

* update plan

* next part

* VoxtralVoiceEngine

* xtts

* first-pass bridge-backed synthesis contract

* voice_build and voice_test now opt into the new bridge-backed synthesis path behind USE_V2_ENGINE_BRIDGE

* Path.replace() -> shutil.move()

* enhance importance of websocket communication
@senigami senigami linked an issue Apr 9, 2026 that may be closed by this pull request
* normalized websocket event contract

* Preserve job status in normalized websocket updates

* Implement progress service throttling and ETA safeguards

* Implement revision-safe artifact reconciliation

* Allow explicit progress resets in ProgressService

* Harden progress timing and stale websocket guards

* Preserve live job metadata across hydration and websocket updates

* Align progress ETA controls with V2 update semantics

* `authoritativeFloor` is only honored in some paths right now. The main `

* Simplify predictive progress handoff and staged test inputs

* Fix predictive bar ETA anchoring and floor handling

* Stabilize predictive progress floor handling

* Extract predictive progress bar helpers

* Refactor predictive progress bar into engine and debug helpers

* Reorganize agent rules into task-focused routers
#101)

* Expose raw smoothing budget in progress bar debug

* Expand phase plans for TTS server and settings UX

* Add TTS Server feature flag and bridge routing

* Update test_tts_client.py

* Add explicit Studio boot wiring and orchestrator flag

* Complete Phase 5 orchestrator foundation and TTS server routing

* Implement core Studio 2.0 orchestration task bodies

* Update registry.py
Comment thread app/tts_server/server.py Fixed
@senigami senigami added the Epic Larger Story containing smaller stories required for full completion. label Apr 18, 2026
@senigami senigami self-assigned this Apr 18, 2026
…avigation realignment (#103)

* Add named feature flag constants and helper tests

* Document Phase 6 handoff and frontend cutover assumptions

* Clarify Phase 6 queue and header cutover plan

* Introduce live-jobs store for frontend queue state
Implement hydration coordinator for queue snapshots
Wire queue and header badge to shared sync boundary
Fix duplicate hydration pull on initial websocket connect
Normalize overlay pruning timestamps to prevent stale state regressions

* Mark Phase 6 patch 1 checks complete

* Fix backend ETA projection for live progress events

* Harden startup ETA and speed metric training

* Checkpoint progress ETA history storage

* Move render performance history to database

* Add collaboration rules for Codex

Add .agents/rules/collaboration-with-codex.md: a new agent rule document defining expectations for working with Codex. It instructs implementers to follow prompts exactly, avoid unrelated edits, run `git status --short` and inspect diffs before handoff, clean up transient/scratch files, and never delete tracked files unless asked. It also documents state handling (Durable Studio 2.0 in SQLite; `state.json` as a migration shim), UI component responsibilities, job `status` as authoritative, ETA training restrictions (only successful persisted `done` jobs), test requirements when changing behavior (update product-rule tests and do not weaken tests), and a final handoff checklist (changed files, tests run and results, remaining risks, and artifacts).

* Fix progress hook test expectations

* Update .gitignore

* Stabilize shell hydration state in the app shell

* Wire project subnavigation into route shell

* Harden project route transitions

* Harden queue hydration source tracking

* Cut over queue route boundary

* Mark Phase 6 checklist complete

* Polish Phase 6 cleanup seams

* Refine project chapter breadcrumb navigation

* Remove duplicate chapter dropdown option

* Remove tracked frontend scratch artifacts

* Move performance retention to startup

* Improve worker fallback observability

* Remove debug logs and name layout z-index tiers
@senigami senigami added this to the Studio 2.0 milestone Apr 23, 2026
* Begin Phase 7 settings route foundation

* Phase 7 production blocks and export actions

* Add batch generation actions to production editor

* Add render batch recovery actions

* Add Script view and export polish

* Add Script range selection and split assignment

* Place it in the ScriptView playback polish slice, not the source-text or

* Highlight active playback batch in Script view

* Tighten Script playback highlight spacing

* Fix pre-push lint fallout

* Add TTS Engines settings shell

* Clarify TTS Engines install action status

* Restore API settings tab

* Mark API settings tab complete

* Add About tab diagnostics

* Fix settings deep links and Voxtral controls

* Fix settings deep links and Voxtral controls

* Fix Voxtral settings metadata and reload caching

* Expose plugin-owned engine schema metadata

* Remove legacy settings tray

* Finalize plugin enablement contract

* Fix voice engine filter labels

* Fix cloud voice control fallbacks

* Harden voice plugin hook contract

* Bump python-multipart to patched version

* Tighten voice gating and disabled voice tabs

* Mark phase 7 ready for handoff

* Fix settings test expectations
Comment thread app/api/routers/chapters.py Fixed
Comment thread app/api/routers/engines.py Fixed
* Move queue into companion drawer

* Add project snapshot and export manifest foundation

* Fix plugin template whitespace

* Add dated project backup bundle contract

* Add downloadable project backup archive

* Align backup archive format with issue 19

* Add stored project backup history

* Expose project assembly and backup tabs

* Finalize project tabs and backup management

* Unify inline editing across project tabs

* Unify chapter assignment feedback and cleanup flow

* Restore default selection and paragraph click targets

* Expand book paragraph hit targets

* Fix chapter audio export and voice readiness handling

* Tighten chapter header wrap and clarify stability mode

* Fix voice storage paths and rebuild status

* Clarify voice rebuild status and sample playback

* Fix stale voice and settings test expectations

* Add portable voice bundle export and import

* Make voice export/import more discoverable

* Update phase_8_cleanup_and_legacy_removal.md

* Harden chapter asset resolution

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

* Fix voice profile resolution for narrator defaults and renames

* Harden filesystem path joins across chapter and project APIs

* fix push

* Update projects.py

* Harden backend path handling for CodeQL

* fix tests

* Harden path containment in project and chapter helpers

* The lesson is to keep the safety boundary explicit and local:
- use `for

* Update chapters.py

* Harden path containment and sanitize error responses

* fix tests

* That rule is not currently in `.agent/rules.md`, so it should be added:

* Refactor settings route into focused panels

* Refactor ChapterEditor into focused hooks and components

* Split chapter subcomponent tests into focused files

* Split voice router into focused modules

* Refactor chapter compatibility helpers into smaller modules

* Split chapter and job modules into focused files

* Split chapter and voice tests into focused files

* Split Voices tab into focused modules

* Split engine registry into smaller modules

* Refactor engines into modular utility packages

* Split speaker refinement tests into focused modules

* Refactor large test suites into modular files

* Fix manual memoization lint error in useVoicesData

* Fix fixture shadowing lint errors and pre-existing react-hooks/refs errors

* Fix lint issues in voices and XTTS utils

* Fix pytest test package imports

* Restore legacy state and xtts facade exports

* Fix state file patching across compatibility modules

* trial 1

* trial 2

* trial 3

* Update migration.py

* Update test_storage_normalization.py

* Update migration.py

* Update migration.py

* Harden project file paths for CodeQL

* fixed for push

* Update config.py

* Update config.py

* fix tests

* Delete codeql-annotations.json

* Update speakers.py

* trial 4

* Harden project migration path containment

* Update migration.py

* Refactor speaker path containment with realpath checks

* trial 5

* trial 6

* Update bundles.py

* Harden chapter path validation and update security tests

* trial 7

* Harden path containment and update chapter tests

* Update chapters_cleanup.py

* Harden voice storage version path checks

* Harden voice bundle root resolution and update path lessons

* trial 8

* trial 9

* Potential fix for pull request finding 'CodeQL / Uncontrolled data used in path expression'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for pull request finding 'CodeQL / Information exposure through an exception'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for pull request finding 'CodeQL / Uncontrolled data used in path expression'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for pull request finding 'CodeQL / Uncontrolled data used in path expression'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for pull request finding 'CodeQL / Information exposure through an exception'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for pull request finding 'CodeQL / Uncontrolled data used in path expression'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Delete codeql-annotations.json

* Update speaker.py

* Update voices_bundles.py

* Create codeql.yml

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Comment thread app/jobs/speaker.py Fixed
Comment thread app/jobs/speaker.py Fixed
Comment thread app/jobs/speaker.py Fixed
Comment thread app/jobs/speaker.py Fixed
Comment thread app/jobs/speaker.py Fixed
Comment thread app/api/routers/voices_bundles.py Fixed
* Add plugin security docs and guided install PoC

* Add public Studio TTS API and gateway controls

* Document Studio TTS gateway integration

* Add plugin isolation tests and mark phase 9 complete

* Promote TTS Server to default runtime

* Promote Studio 2.0 defaults and runtime status

* Harden Phase 10 retry fallback handling

* Add engine test endpoint and tighten voice profile scanning

* Handle engine API outages and voice migration

* It’s fixed enough to proceed with the plan of attack. The last patch is,

* Harden v2 voice profile discovery and startup readiness

* Persist engine test audio and expose replay metadata

* Clarify XTTS settings and make toast actions optional

* Fix XTTS docs and orchestration imports

* Update tts_api.py

* Use a short delayed startup overlay reveal and keep threading startup it

* Refine voice assignment dropdown rendering

* Add character reassignment to script view

* Relax startup gate and surface engine diagnostics

* Improve Voxtral settings and diagnostics handling

* Load Voxtral schema from plugin settings

* Consolidate Voxtral enablement state and remove stale notes

* Move autosave notice to General settings

* Stop sentence dropdown clicks from triggering paint assignment

* Document Phase 11 v2-only runtime cleanup

* Bump Studio to 2.0.0 and expand phase cleanup plans

* Mark phase 10 cleanup checklist complete

* Refine runtime status text and privacy notice metadata

* Update voice tests for motion and engine props

* Update phase 10 cleanup tracking notes

* Fix CI blockers in Phase 10 cleanup

* Stabilize backend tests for default TTS runtime

* Stabilize backend CI for v2-default runtime
* Document Phase 10 handoff and Phase 11 audit start

* Remove silent TTS Server fallback

* Trim wasteful legacy-path tests

* Remove legacy bridge quarantine tests

* Consolidate built-in engine metadata

* Finish Phase 11 audit cleanup

* Remove legacy voice routing flags

* Remove v2 bridge feature flag

* Remove unused legacy bridge shim

* Route render handlers through voice bridge

* Fix bridge handler error logging

* Trim bridge helper whitespace

* Add plugin behavior metadata foundation

* Migrate voice action policy to plugin behavior metadata

* Route orchestration through engine behavior

* Fix behavior cutover lint issues

* Move legacy engine implementations behind adapters

* Generalize legacy dashboard defaults

* Realign Phase 11 cleanup plan

* Record Phase 11 hard cutover direction

* Document declared plugin hook contract

* Generalize plugin hook contract and cleanup docs

* Genericize voice UI and job behavior metadata

* Finish state and metrics hard cutover

* Fix checkpoint blockers in metrics slice

* Fix analysis chunk limit response

* Remove legacy local bridge and cleanup tests

* Record deferred tts namespace rename

* Finalize frontend engine label cleanup

* Purge final dead legacy dashboard tests

* Record engine bundle test colocation

* Keep plugin engines self-contained

* Remove residual legacy config and dashboard

* Fix worker bridge output tests

* Fix worker bridge output tests

* Record final engine bundle verification

* Polish voice contracts and job engine typing

* Generalize engine boundary comments and contracts

* Move v1 engine cleanup into migration and generic defaults

* Remove legacy runtime logic and finalize v2 cleanup

* Enforce v2 speaker resolution and add profile tests

* Route assembly and voice jobs through orchestrator

* Remove legacy app.jobs worker runtime

* Fix voice verification and queue visibility regressions

* Add dynamic dev port selection for backend and frontend

* Track render start separately from preparing

* Add task cancellation and restore predictive progress

* Skip ETA projection for post-synthesis progress updates

* Harden chapter audio routing and legacy path compatibility

* Update test_studio_task_progress.py

* Remove remaining V1 runtime fallback paths

* Update test_voice_security.py

* fix tests

* Remove V1 fallbacks and move migration to boot

* phase 11 plan organize

* Disambiguate audiobook assembly cache paths

* Add manifest-driven engine test samples

* Remove per-project migration from project listing

* Fix blank engine enablement message in queue validation

* Fix duplicate React keys in chapter and settings views

* Honor plugin test_text for engine verification

* Improve TTS startup readiness and runtime cleanup

* Fix grouped render progress and chapter audio routing

* Serialize bridge-backed synthesis jobs

* Record render stats from orchestrator completions

* Refresh queue and segment state on live updates

* Restore pending render cues in ScriptView

* Add dev load timing probes

* Instrument project load timing

* Remove project migration from reads

* Optimize chapter segment loading

* Add Playwright settings navigation coverage

* Smooth chapter render text progress from predictive bar

* Propagate render block progress to script text

* Add model-aware render speed calibration

* Display plugin computer speed as CPS

* Add reset for computed engine speed

* Add hard reset for engine speed baseline

* Fix enqueue single API test

* Exclude Playwright specs from Vitest

* Update AboutSettingsPanel.tsx

* Refactor TTS plugins to canonical mini-repo layout

* refactor: migrate legacy frontend components to the new pages directory structure and implement comprehensive unit test coverage.

* docs: add version 2.0.0 and 1.8.5 release highlights to changelog

* refactor: reorganize project and settings components into dedicated feature directories for improved project structure

* Remove obsolete cleanup code

* Update bridge.py

* Keep engine test artifacts inside plugin folders

* Make Voices toolbar responsive

* Enhance agent rules with review and verification guidance

* Normalize engine test timestamps and Voxtral reference lookup

* Codify project structure rules

* Remove frontend XTTS fallback assumptions

* Remove last jobs shim compatibility stub

* Remove backend jobs queue shim cleanup

* Remove obsolete enqueue-single API route

* Harden backend behavior helpers with manifest progress parsing

* Switch chunking to engine-specific text limits

* plugin-declared test samples for voice assets

* Harden public project and voice asset routes

* Decommission stale V1 storage utility

* Audit uploads legacy cover compatibility

* Close behavior and text utility cleanup

* Relocate baseline CPS fallback to behavior helpers

* Move XTTS requirements into plugin

* Move XTTS launcher conflict checks into plugin

* Remove hardcoded XTTS-v2 copy from frontend

* Close phase 11 and plan phase 12 polish

* remove accidental files
* Expand Phase 12 backlog and verification gates

* Remove app persistence imports from Voxtral plugin core

* Localize plugin core dependencies for portability

* Refine chapter VCR playback controls

* Add press-and-hold skim controls to chapter playback

* Add Project Library sorting, list view, and created dates

* Retire legacy jobs API and complete master agnostic conversion

* Refine memory and handoff workflow

* Fix storage and registry lint regressions

* Move jobs hydration to WebSockets

* Document standalone CLI usage for XTTS and Voxtral

* Add developer harness links to plugin READMEs

* Add plugin developer mode and engine logos

* Document multilingual voice languages and disable dev mode

* Tighten plugin dev mode scenario safety

* Validate TTS plugin manifest contracts

* Surface developer plugin diagnostics safely

* Improve engine dev panel diagnostics

* Validate plugin dev scenarios

* Harden plugin dependency install refresh

* Finish plugin lifecycle and compatibility hardening

* Support per-voice plugin settings save flow

* Harden Chapter Editor playback controls

* Remove obsolete Chapter Editor tabs

* Remove remaining Chapter Editor production tab

* Prune production block infrastructure

* Fix API test syntax error

* Fix ChapterEditor queue test drift

* Refine Chapter Editor toolbar order

* Update Phase 12 cleanup boards

* Show queue output metadata

* Sync Phase 12 audit boards

* Mark TTS plugin zip flows complete

* Retire legacy jobs API surface

* Allow synthesis during pending verification

* Fix chapter audio finalization fallback

* Surface queue failure reasons

* Sync Memory for queue failure reasons

* attempted fix

* Reduce websocket chatter for job status updates

* Trace websocket sources and tighten queue scope

* Add websocket classification for queue routing

* Move websocket debug logging into listeners

* Restore xtts studio handler logger

* checkpoint before full "finalizing" removal

* not perfect but better queue

* startup working

* checkpoint but display still not as good as previous commit

* Trim redundant job_updated websocket broadcasts

* Skip redundant job_updated broadcasts during synthesis

* Trim redundant startup websocket broadcasts

* just before creating a central consumer

* Prevent inferred voice engines from persisting to disk

* Enforce explicit voice engine resolution across backend

* Remove last voice-engine fallback defaults

* Document the live event stream contract

* Add live event stream contract and schema module

* Flatten job update payloads in live event normalization

* Wire live output to the live event audit store

* Wire TTS diagnostics to live audit logs

* Route job events through live topic subscriptions

* Refactor queue handling and update tests

* Document live output subscriber ownership fix

* Refactor live output filtering to use consumer registry

* Document the studio event broadcaster contract

* Implement phase 1 studio event broadcaster helpers

* Add websocket facade for canonical studio events

* Refine phase handoff and memory workflow

* Route live events through new topic handlers

* Emit canonical queue events for websocket broadcasts

* Normalize voice test progress broadcast envelope

* Emit canonical studio events for TTS logs

* Migrate project updates to canonical lifecycle events

* Migrate segment progress to canonical studio events

* Remove frontend websocket compatibility shims

* Audit and correct studio event progress and log contracts

* Restrict queue sync to authoritative queue items

* Fix completed group rendering in Chapter Editor

* Fix live progress regression handling in queue and chapter jobs

* Stabilize queue ETA and retention debug visibility

* Refine queue retention and ETA diagnostics

* Fix ChapterEditor segment progress source and reset state

* Update test_websocket_broadcast.py

* Stabilize segment progress handoff at segment boundaries

* Refactor queue cleanup and update tests

* Remove synthetic 99 percent segment completion event

* Add confidence weighting to chapter editor progress bars

* Add confidence to live output and stabilize chapter progress

* Fix segment start seeding and preparing guard

* Unify live queue merge logic and block stale progress

* Promote segment start to processing for ChapterEditor bar

* Standardize runtime on Python 3.11

* Add job lifecycle live events

* feat: implement live event subscription routing for chapter and voice test states with improved queue snapshot persistence

* Fix progress rollback and segment source selection

* Disable startup verification synthesis and require verified synth

* Checkpoint ETA calibration rebuild

* Checkpoint ETA checklist corrections

* Checkpoint synthesis metrics path audit

* Fix ChapterEditor batch progress mapping

* Fix XTTS render timing handoff

* Fix render timing and ETA calibration

* Add ETA timestamps and stabilize queue countdown source selection

* Smooth predictive ETA during lane migrations

* `confidence` is missing from that debug projection, not necessarily from

* Normalize canonical event payloads and confidence fields

* Restore computed CPS display in engine settings

* Expose calibration summary on engine cards

* Add structured timing contracts for synthesis results

* Expose calibration confidence in engine registry

* Drop legacy make_mp3 from render performance samples

* Fix XTTS sample counts from render chunks

* Refine phase handoff and memory tracking

* Move voice-test queue schema into docs

* Align voice sample start timing with real synthesis markers

* Fix terminal parameter retention in done transition

* Fix pre-push whitespace warnings

* Update sample progress test contract
senigami and others added 30 commits July 17, 2026 19:39
* Add synced player-piano reader with chapter timing sidecar

Generates a versioned per-chunk-group timing sidecar (<chapter>.timing.json)
whenever a chapter's audio finishes rendering, hooked into the orchestrator's
existing post-finalize completion point alongside the peaks sidecar. Served
via a new API route, included in backup exports, and recoverable through a
new restore endpoint even when a backup omits per-segment audio.

On the Book tab, a new player-piano read-along reader (embedded card +
standalone route) syncs the currently-playing chunk group's text to real
playback position via the sidecar, with bidirectional click-to-seek. The
chapter editor/Booth is untouched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Fix three pre-existing bugs on studio-2.0 found during a pre-PR green-gate check

Confirmed on a clean origin/studio-2.0 checkout (unrelated to any feature
branch work), so fixed here rather than shipping a red merge base:

- XTTS_ENV_ACTIVATE/XTTS_ENV_PYTHON test fixtures (tests/domain/test_domain_contracts.py,
  tests/bridge/conftest.py) monkeypatched them on app_adapter, but #145 moved
  check_env() to read them from core.implementation via a function-local
  import. Both fixtures now patch the right module.
- ArchetypeQuickPick.tsx (#146) shadowed the global MouseEvent type via
  `import { type MouseEvent } from 'react'`, mistyping a native
  document.addEventListener handler and breaking `tsc -b`.
- Root-caused a full-suite-only, order-dependent hang in
  tts_engines/tts_xtts/tests/test_xtts_implementation.py: the
  implementation_module fixture in test_xtts_env_readiness.py popped
  tts_engines.tts_xtts.plugin.core.implementation from sys.modules to force
  a reload, then only popped again at teardown instead of restoring the
  original module object. Every later dotted-string mock.patch() on that
  module (in a different test file) silently re-imported a disconnected
  copy, so the patch became a no-op and the real warm-worker/subprocess
  path ran until the 15s per-test timeout killed it. Fixture now restores
  the original sys.modules entry at teardown; added a regression test that
  asserts identity is restored.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Document PR-base and pre-push-hook lessons in docs/lessons/INDEX.md

Neither the studio-2.0-not-main PR rule nor the pre-push hook's
first-push-falls-back-to-main gotcha (hit while opening this PR) was
written down anywhere git-tracked, so both would have to be rediscovered
by whoever hits them next.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
#150)

* Add memory-queue mechanism for worktrees, fix worktree.baseRef default

Claude Code's auto-memory store is keyed to the session's exact working-
directory path, so a memory saved directly from inside a .claude/worktrees/
worktree lands in a namespace that's orphaned the moment the worktree is
removed. Adds .agent/memory-queue/ (tracked, analogous to
docs/code-map/queue/) plus .agent/rules/memory-queue.md documenting the
convention: queue a memory candidate there instead of writing directly,
reconcile into real memory on request once entries land in studio-2.0 via
normal PR merges.

Also sets worktree.baseRef to "head" in .claude/settings.json — it was
unset, so EnterWorktree defaulted to branching new worktrees from
origin/<default-branch>, which is stale git main here (51 commits behind
studio-2.0, missing the entire Studio 2.0 architecture). "head" branches
from current local HEAD instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Add public-repo privacy note to memory-queue rule

Fable's direction sign-off on this PR flagged that this repo is public,
and the memory queue explicitly invites user/feedback memory candidates
(the owner's own preferences and working style) into files that get
committed and pushed — reconciliation deletes the queue entry, but git
history on a merged commit is permanent regardless. Adds a line telling
the queuing agent to write in terms of the technical/workflow pattern,
never personal specifics, and to surface anything too personal directly
to the owner instead of queuing it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Make memory-queue rule two-sided: consolidate when not in a worktree

The rule only ever told worktree sessions to write to the queue -- nothing
told main-checkout sessions to drain it. A queue that's only ever filled
and never emptied loses the memory just as surely as never queuing it did
in the first place (this was also Fable's "no trigger" concern from the
direction review on this same PR). Restructures the file around two
explicit, parallel branches -- in a worktree: queue; in the main checkout:
check and reconcile -- and updates the .agent/rules.md router line and the
CLAUDE.md pointer to describe both sides instead of just one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Merges the 48 pending docs/code-map/queue/*.json entries into map.json's
shards: the studio_plugin_sdk/ dependency inversion (new top-level shard,
app/studio_plugin_sdk/* rewritten as shims), the backend-namespace-006
rename verification, W-PERF safe-foundation additions, both PR-134 gateway
bugfixes, the span word-boundary snap, the synced-reader reader-sync
feature (backend timing sidecar + restore endpoint + frontend sync
engine/UI), and the recording-cue/archetype-library frontend expansion.
Removes the 4 dead app/infra/* stub records (deleted by simplification-005).

Schema upgrade: backfills failure_modes for the 8 flows that lacked them
(the map's own backfill-debt signal), recomputes file_hashes/repo_checksum
for every touched file, advances meta.synced_commit to HEAD, and adds the
new studio_plugin_sdk/ shard to meta.shards. All self-checking invariants
re-verified clean.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…rule

Lands the persistent orchestrator role for this repo: Cadence (self-chosen
2026-07-18, internal-only, belongs to the role not any session or model)
plus an explicit director mandate defining what the orchestrating session
does without asking (commit verified work, manage the agent roster with
adversarial gating, run structural audits uninvited, curate the record,
dispatch/verify subagents) versus what still requires the owner (anything
leaving the machine, destructive operations, amending the mandate itself,
and all perceptual/product judgment -- evidence staged, verdicts never
asserted).

Also adds .agent/rules/session-closeout.md, adapted from Kei's handoff
addendum: a backward sweep of state docs (fix what today invalidated), a
forward-looking plan refresh ("would a fresh session acting on these docs
alone do the right next thing?"), and a respawn prompt refreshed into
.memory/HANDOFF.md -- wired into the rules router and named a standing
duty in the mandate.

Reflects the owner's same-day mode change to focused single-session work;
worktree/concurrency safeguards remain binding whenever those modes are
used.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The owner extended the director mandate today: deciding when to push and
when/how to open a PR (direct commit vs. its own branch, draft vs. ready
for review) moves from ask-first to act-then-report, same footing as the
rest of the do-then-report list. Merging a PR, cutting a release, and
posting outside the repo remain ask-first -- this is a scope expansion,
not a blanket removal of gates. PR descriptions go through the write-pr
skill specifically, never greenlight-pr-draft (this repo isn't
Greenlight-governed).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…151)

First hire under the director mandate: .claude/agents/runtime-verifier.md
owns end-to-end behavioral verification -- driving real renders/builds,
cross-checking sibling artifacts (WAV/timing-sidecar/DB/manifest) for
consistency, and auditing tracker/session "done" claims against git and
disk reality. Its convictions trace to real incidents: PR #134 shipping
gateway-green while the happy path was broken, W-PAR's cap>1 default
shipping ahead of live-render verification, the tool-use-count lesson,
and the timing-sidecar staleness bug class. It stages evidence for
perceptual/UX judgment and never asserts a verdict itself, matching the
mandate's ask-first boundary on perceptual and product decisions.

engineer.md and designer.md gain matching Team Boundaries tables so all
three profiles cross-reference each other's jurisdiction consistently.

Adversarially reviewed before commit (per the mandate's roster-change
gate): one real contradiction found and fixed -- designer.md initially
delegated visual-conformance confirmation to runtime-verifier, which its
own profile (and the binding mandate) correctly refuses as a perceptual
verdict; designer.md's boundary cell now asks it to confirm the artifact
supports a claimed state, not whether it looks right.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Ran the worker naming ceremony from the orchestrator playbook: one-shot
spawn per specialist, sole task, no accompanying work. engineer chose
Ledger (a ledger doesn't just record, it has to balance, and it makes a
discrepancy visible instead of rounding it away -- the same thing every
one of its convictions insists on). designer chose Floor (from its own
rule that accessibility is a floor, not a feature: unglamorous,
load-bearing, invisible when it holds, catastrophic when it doesn't).
Names recorded in each profile's body + description, and in CLAUDE.md's
roster line, per the mandate's own record-keeping convention.

runtime-verifier's ceremony hit a real environment limit rather than
declining to name itself: the agent type isn't registered in a session
that predates the profile file existing on disk, even after merging it
in -- retried once, same result. Left unnamed with a note for the next
session to retry.

Adversarially reviewed before commit (per the mandate's roster-change
gate). The review caught two real issues, both fixed: the proposed
insertions were originally second-person ("you answer to"), breaking
both files' established first-person voice and contradicting the
ceremony's own premise that the name was self-chosen; and the review
caught that every "2026-07-18" date written across CLAUDE.md, memory,
and .memory/ this session was one day ahead of the actual date
(2026-07-17) -- corrected throughout, not just in the new lines.

Also fixed a stale engineer.md line ("push/PR/merge -- ever, without an
explicit ask") that no longer matched the mandate's expanded scope for
the orchestrating session; reworded to clarify those decisions belong to
the dispatching orchestrator, not the engineer subagent itself.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The owner challenged Floor as soon as it landed: it's a verbatim quote of
the profile's own "accessibility is a floor, not a feature" conviction
heading, not a name arrived at by synthesis -- the same failure mode
Cadence was caught in earlier this session (reach for the on-brand word,
build the rationale after). Put the same challenge back to the same
agent instance rather than starting fresh, so it had to actually
reconsider, not just defend the original pick harder.

It landed on Witness: advocacy for an absent party (the user who isn't
in the room), a critique standard that requires citations over vibes,
and verifying rendered reality instead of judging from source alone --
three separate convictions synthesized into a word that appears nowhere
in its own profile text. Reviewed clean before commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: catch up wiki and changelog to shipped Studio 2.0 work

Backfills changelog entries for shipped-but-undocumented work found by
combing the plans archive: the Quiet Studio visual redesign, the Book
tab front door, Director's Console (Cast/Booth/Revise/Write replacing
the old Studio/Review toggle), the chapter-tabs fix batch, series
suggestions in the project form, and the two voice-variant fast-follows
(version history + A/B playback, tagging + switcher redesign).

Updates Concepts.md, Library-and-Projects.md, Voices-and-Voice-Profiles.md,
and Recording-Guide.md to describe the current shipped behavior, and
bumps the version to 2.0.13.

* docs: fix stale route tables and changelog date ordering from wiki backfill

Accuracy-review follow-up to the wiki catch-up commit:

- Concepts.md / Library-and-Projects.md: the book-tab tables claimed a
  Manuscript/Casting/Chapter Workspace(studio)/Publish pipeline. The actual
  routed tabs are Book, Contents, Cast, Lexicon, Publish, Backups, and the
  Chapter Workspace lives at /book/:id/chapter/:chapterId (opened from
  Contents), not at a 'studio' stage route. Tables and section headings
  rewritten to match frontend/src/pages/Book/lib/stages.ts and app/App.tsx.
- Library-and-Projects.md: Publish section still said identity fields are
  edited there and Backups live there — both contradicted the new changelog
  entries (Book tab owns identity; Backups is its own tab). Fixed.
- Changelog.md: the backfilled 07-10, 07-09, and 06-20 entries were inserted
  above existing 07-11 entries, breaking descending date order. Moved each
  next to its correct date neighbors; content unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* docs: consolidate design-docs/plans/ — delete completed work, compress TASKS.md

Release-wrapup documentation cleanup. A separate wiki/changelog effort is already
preserving feature-shipped narrative, so this pass deletes completed plan
folders outright instead of archiving them, and rewrites TASKS.md to a single
line per done item (open/future work keeps full detail).

Deleted (all confirmed complete, merged, or superseded, and re-verified to have
no spec citing their path):
- design-docs/plans/_archive/ in full except phases/phase_12_multilingual_*
  (interface-localization.md cites it directly as the localization design source)
- COMPLETED_WORK_REPORT.md, MOVE_MAP.md (pure historical narrative/move-log)
- active/archive/span_word_boundary_snapping/ (misplaced already-archived plan
  nested inside active/; shipped PR #143)
- active/mixed-synthesis-fused-proposal/, active/mixed-synthesis-load-attribution/
  (W-MIX/W-MIX-LA, fully done, folded into live-events.md/progress-presentation.md)
- active/north_star_screen_parity/ (all 13 tasks done 2026-07-11)
- active/organizational_cleanup.md, active/file_split_plan.md (both retired/done,
  folded into simplification/)
- pr-dispatch/ — 10 of 11 PR briefs (all their PRs merged, verified via `gh pr
  list --state merged`); kept 08-video-utils-decision.md because
  design-docs/specs/video-sample.md cites it in its `sources:` list

Kept in active/ despite being complete, because a binding spec cites their path
as its live-implementation record and deleting would dangle that citation:
audio_player_waveform_scrubber/ (audio-player.md), huggingface_voice_upload/
(voice-bundles.md changelog), synced_reader/ (data-model.md cross-reference).
reference/ and proposals/ left untouched for the same reason (cited throughout
design-docs/specs/).

TASKS.md: 823 → 302 lines. Every checked-off epic collapsed to a one-line
summary; W-PAR's owner-pending visual-check items, the open simplification/
namespace-rename/release-gating work, and every unresolved design decision
keep their full actionable detail.

Repointed the resulting dangling references in master_fix_plan/*,
active/parallel-segment-rendering, active/chapter_editor_catalog_completion,
active/simplification, proposals/*, and README.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: resolve 3 spec-cited completed plan folders (part 1 cleanup)

audio_player_waveform_scrubber, huggingface_voice_upload, and
synced_reader were all fully shipped work kept only because a spec
cited their file path directly. Replace each citation with an inline
outcome note or a wiki/Changelog.md pointer, fix the final_release/04
missing-suffix link in voice-bundles.md, and delete the three
completed plan folders.

* docs: update plans/README.md now that the 3 spec-cited plans are gone

* docs: fix remaining dangling links to the deleted waveform-scrubber plan

master_fix_plan/tasks/004 and audio_player_completion_004/README.md still
linked into design-docs/plans/active/audio_player_waveform_scrubber/,
which the prior commit deleted. Repoint to the wiki changelog / inline
outcome notes instead of a path that no longer exists.

* docs: split TASKS.md into REMAINING_TASKS / COMPLETED_WORK / FUTURE_WORK

Replaces one 302-line file mixing status, history, and backlog with three
single-purpose documents:

- REMAINING_TASKS.md — everything still open before v2.0.0: visual checks,
  owner design decisions, unwritten code, the release-gating checklist.
- COMPLETED_WORK.md — a compact per-workstream summary of what shipped
  (full narrative stays in wiki/Changelog.md).
- FUTURE_WORK.md — post-2.0 backlog, merged with the former
  post_release_backlog.md so post-release scope lives in one place.

TASKS.md is now a thin redirect so the ~40 existing inbound links to it
across design-docs/ keep resolving. README.md and the two final_release/
docs that cited post_release_backlog.md directly are repointed.

* docs: fix stale claims found by Fable's adversarial review

Fable reviewed the plans-consolidation PR and found two "still open" claims
in the new status docs that were actually already shipped, plus stale
convention docs that would mislead future agents/sessions:

- plugins/ -> tts_engines/ backend namespace rename: fully shipped (111
  tracked files under tts_engines/, PLUGINS_DIR resolves there by default;
  any local plugins/ dir is untracked runtime state, not part of the repo).
  Moved from REMAINING_TASKS.md to COMPLETED_WORK.md; fixed the same stale
  claim in FUTURE_WORK.md and master_fix_plan/01-map.md.
- ChapterHeader.tsx large-file split: already done, it's a 6-line barrel.
  Moved from REMAINING_TASKS.md to COMPLETED_WORK.md.
- master_fix_plan/tasks/011-release-gating.md's "repoint before deleting"
  list still named the 3 plan folders this same consolidation already
  deleted and repointed — removed them, noted they're done.
- Three plan docs (v2_huggingface_voice_interface.md and two reference/
  docs) pointed at active/huggingface_voice_upload/ as if the gap it closed
  were still open; that folder was deleted in this consolidation and the
  gap has been closed since 2026-07-12 (voice-bundles.md 1.7.0/1.8.0).
  Repointed to the spec's changelog instead.
- AGENTS.md and .agent/rules/session-closeout.md still taught the old
  TASKS.md-is-the-only-status-source / _archive/ convention. Updated both
  to describe the new REMAINING_TASKS.md / COMPLETED_WORK.md / FUTURE_WORK.md
  split and the delete-outright-not-archive policy.

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
The plugins/ -> tts_engines/ namespace rename (006) shipped in #139;
this removes an untracked stale plugins/ directory left on disk and
fixes a docstring in boot.py that still referenced the old path.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…version (#154)

* Record Plumb naming; document deliberate model-inherit; fix boundary drift

- runtime-verifier answers to Plumb (self-chosen 2026-07-18, ceremony ran
  once a fresh session showed the agent type registered, as scheduled)
- all three profiles: model 'inherit' documented as deliberate; background
  delivery-protocol line added to Output sections
- designer.md: fix Team Boundaries direction inversion (artifact-state
  confirmation is the verifier's duty, not something it relies on designer
  for) — pre-existing, caught by the roster-change adversarial gate
- gate results: 2 lenses + refuting skeptics; 2 should-fix + 1 nit accepted,
  2 nits declined with reasons recorded in the PR

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Revoke internal-only for Tess: owner credits her publicly (2026-07-18)

The internal-only clause was the orchestrator's own caution, not an owner
directive; the owner revoked it and is adding a public credit + avatar on
the site. Names still stay out of code identifiers and app UI copy, and
the specialists' names remain internal unless the owner decides otherwise.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…TED_WORK (#156)

The 2026-07-17 plans consolidation (#153) made REMAINING_TASKS.md/COMPLETED_WORK.md
the status source of truth but left master_fix_plan's own per-task banners
unrevised, so several flatly contradicted reality: 006 said the plugins/->
tts_engines/ rename was "genuinely not started" (it shipped, #155 cleaned up
the last cruft), 004/005 said "NOT STARTED" despite the audio player and most
of the simplification pass being done, 007's roadmap line said "NOT STARTED"
while its own task file said "G1-G6 DONE", and 010's task file contradicted
its own next paragraph. Re-derived each status from COMPLETED_WORK.md /
REMAINING_TASKS.md and corrected the banners plus 008's stale PENDING(UX) list.

Docs only; no app code touched.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…dden agent machinery (#157)

* docs: move internal dev-tooling output out of the public docs/ folder

docs/ is published as-is by GitHub Pages (main:/docs), but code-map/,
design-critique/, lessons/, and checklists/ had accumulated there —
each is a Claude-skill default output path that doesn't know this
repo's docs/ is bound to a public site. All four are internal
(dependency graphs, UI critique write-ups, operational lessons,
review checklists), not site content.

Moved all four into design-docs/ (this repo's existing internal-docs
home) and updated every reference: CLAUDE.md, .agent/rules/*,
.claude/agents/{designer,engineer}.md, .claude/settings.json's Stop
hook, design-docs/specs/*, and historical plan docs that cited the
old paths. Also extended the global ~/.claude/settings.json
SessionStart hook to check design-docs/code-map/ as a fallback when
docs/code-map/ isn't present, so other repos using the old
convention are unaffected.

docs/ now holds only genuinely public content: index.html, demo/,
handbook/, user-guide/, assets/, plugin-sdk/, coming-soon-*.html,
v1.html.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* chore: reorganize repo — hide agent machinery, keep top level about the product

Second step of the docs/ cleanup, widened to a deliberate top-level
structure. The top level now telegraphs four things — run it, read the
code, read the docs, contribute — and hides everything an agent or tool
consumes but a human doesn't navigate.

Moves (all git-tracked renames, history preserved):
- design-docs/{code-map,lessons,checklists} -> .agent/{...}. These are
  machine/agent-consumed (the SessionStart hook reads code-map; skills
  and sessions read lessons/checklists), not human dev docs. .agent/
  already owns rules/, scripts/, memory-queue/ — so this is one coherent
  hidden "agent operating system," distinct from .claude/ (harness config,
  path-fixed). Directly implements the owner's "hide map-code" directive.
- design-docs/ is now purely human dev docs: plans, specs, decisions
  (ADRs), personas, workflows, style-guide, audits, design-critique.

Deleted:
- .agents/ — the retired Codex/Antigravity/Memory workflow (referenced the
  capital-M Memory/ dir retired 2026-07-04), superseded by .agent/. No
  inbound references.

Deliberately NOT moved (verified root-referenced / import-pinned):
- Source dirs (app, frontend, tts_engines, studio_plugin_sdk, tests,
  scripts, examples) stay visible & top-level — pinned by import paths and
  the point of "devs get easy access to code."
- assets/ (README + engine manifests + site) and demo/demo.zip (launchers)
  are root-referenced; docs/ is bound to GitHub Pages main:/docs.

Reference updates: CLAUDE.md (new Repository layout section + code-map /
lessons paths), .agent/rules/*, .claude/agents/engineer.md, the repo Stop
hook's changelog-queue path, design-docs specs + plan docs. The global
~/.claude SessionStart hook now resolves docs/ -> design-docs/ -> .agent/
code-map in order, so every repo convention keeps working.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: retire stale dev-aid docs; add release-readiness stale-docs sweep plan

Release-prep cleanup: remove development scaffolding whose history is
captured in the wiki changelog (current through 2026-07-17), keeping only
forward-relevant docs.

Retired (safe, self-contained):
- design-docs/design-critique/ (12 files) — a 2026-07-11 development aid;
  its findings shipped (code carries them as inline "(design-critique
  follow-up)" comments). Repointed the one real provenance citation
  (design-system.md v1.16.0 changelog row: kept finding IDs, dropped the
  dead path) before deleting.
- design-docs/audits/voice_queue_event_stream_audit.md — a 2026-06-07
  "implementation complete" handoff, uncited, superseded by
  specs/event-stream-processing-schema.md.

Also closed a latent instance of the "internal output in the published
docs/" trap: the designer/engineer/runtime-verifier agent profiles routed
reports to docs/agent-reports/ (never created) → now .agent/reports/.

Added design-docs/plans/active/final_release/20_stale_docs_retirement.md:
the execution plan for the Stage-6 cleanup gate, with the exact
spec→provenance citation map for the release-gating remainder (reference/,
_archive localization fragment, done proposals, pr-dispatch/08 — each cited
by 1-4 specs that must be repointed before deletion). Linked from
REMAINING_TASKS.md. That larger sweep is sequenced, not blitzed: mass-editing
~10 spec files to repoint provenance right before the tag is the
"expensive if wrong" case and deserves its own reviewed commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: eliminate _archive/; relocate localization inventory (deferred-feature source)

Owner directive: get rid of the _archive/ category. Done — but the one
fragment left in it was NOT disposable, so it was relocated, not deleted.

_archive/ held only the phase_12_multilingual localization inventory. That
inventory is the design source for a DEFERRED feature: interface-localization.md
is status:active but the feature is unbuilt (completion=0, frontend/src/i18n/
is a dark scaffold, master_fix_plan/012 lists it as deferred post-v2). The
active spec cites the folder as its "working inventory" (text maps, per-locale
source JSON). Deleting it would gut the spec.

So: relocated to plans/proposals/localization_interface_{plan.md,examples/}
(proposals/ = design drafts + deferred-feature sources awaiting scheduling),
repointed its citers (interface-localization.md, specs/README.md,
master_fix_plan/012), and removed the empty _archive/. The repo now keeps no
archive going forward — a done plan is deleted outright, narrative to the wiki.

Also updated the docs that described _archive as still existing (plans/README.md
folder table, master_fix_plan/00 + 011) and the two active plans that still
instructed "move folder to _archive/ when done" (frontend_testability_sweep,
chapter_editor_catalog_completion) → delete-outright per the new policy.

Reclassified the Stage-6 sweep plan (final_release/20): the key correction is
that "stale" != "in reference/ or _archive/". A provenance-cited plan is only
deletable if its feature SHIPPED. Section B is now split B1 (shipped → repoint +
delete: north-star, site-redesign, v2 sdk/bundle/taxonomy, audio-scrubbing,
pr-dispatch/08) vs B2 (deferred-feature design source → KEEP: localization,
W-PERF performance-script, HF voice / AI casting).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: add release consolidation ledger; spot-check finds 3 unlogged shipped features

Per owner: keep a fuller per-item report summarizing each shipped workstream
before the source plans are deleted — the consolidation record that makes the
"major reduction" verifiable. It tracks each shipped item against where its
history (wiki changelog) and user docs live, what source plan it retires, and a
verify checkbox; plus the do-now (pre-release) / future triage.

final_release/21_release_consolidation_ledger.md. Working ledger, deleted at the
tag; its permanent residue is COMPLETED_WORK.md + wiki/Changelog.md. Deletion
mechanics stay in doc 20.

First spot-check pass already caught a real gap: three shipped workstreams have
NO wiki changelog entry — HuggingFace voice browse/upload, AI casting + voice-
metadata UI, and the recording-cue/persona expansion (PR #146). The premise
"wiki holds the history so we can delete the plans" had three holes; those
source plans are now marked blocked-from-deletion until their changelog entries
are written (added as the first do-now).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: write the 2 sourceable missing changelog entries (HF voice, recording-cue)

Closes 2 of the 3 wiki-changelog gaps the consolidation ledger's spot-check
found. Both entries are sourced from authoritative dates, not memory:

- HuggingFace voice (## [Added] - 2026-07-12, import note 07-03) — sourced from
  voice-bundles.md changelog rows 1.3.0/1.5.0/1.5.1 (import + provenance,
  07-03) and 1.6.0-1.9.0 (upload/publish workstream, 07-12).
- Recording-cue composer + expanded character library (## [Added] - 2026-07-17)
  — sourced from PR #146 + COMPLETED_WORK.

The 3rd gap (AI casting "Suggest voices" UI) is HELD, not written: no clean
landing date or dedicated spec row, and its release-vs-fast-follow scope is an
open owner decision. Fabricating a public history entry there would pollute the
record we're trying to protect — flagged in the ledger for sourcing + an owner
scope call. Its source plan stays blocked from deletion until then.

Ledger (final_release/21) updated: HF + recording-cue rows now CL-verified;
AI-casting row marked HELD with the reason.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: user-doc verification pass — 5 wiki concept-page gaps found

Ran the read-only user-doc spot-check the consolidation ledger set up: checked
each shipped feature against the wiki concept page that should describe it for
users. Recorded results in final_release/21 Part 1b.

Covered (real wiki sections exist): Director's Console, variant version history,
variant tags, taxonomy/tags, series suggestions, recording-cue suggest-from-
qualities, AI casting suggestion panel (user doc DOES cover it, even though its
changelog entry is held), demo, TTS gateway.

User-doc gaps (→ do-now): parallel rendering (not in Queue-and-Jobs), waveform
tape/scrubber (not in Concepts Player Bar), video sample export (not in
File-Formats/user-guide), read-along reader (Library "Booth" is the OLD Review
workflow, not the new player-piano reader), HF import/publish user actions
(bundle format documented, workflow not).

These are user-facing product prose in the owner's voice, so flagged for an
owner call (hand-list vs Tess-drafts) rather than written blind.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: correct 3 overclaimed "shipped" items; account for #153-deleted plans

Owner review (2026-07-18) corrected three items COMPLETED_WORK listed as shipped:
- HuggingFace voice browse/upload — code landed but UNTESTED, needs owner
  sign-off. Not shipped.
- AI casting + voice-metadata UI — marked future in the app, placeholder UI.
  Not shipped; belongs in FUTURE_WORK.
- Recording-cue/persona expansion — code landed but the owner's portrait-image
  generation + live E2E are outstanding. Not complete.

Actions:
- Reverted the 2 premature wiki/Changelog.md entries (HF, recording-cue) I wrote
  last turn — a feature that isn't owner-verified-complete is not history-of-record.
- Corrected COMPLETED_WORK.md (all 3) and added AI casting to FUTURE_WORK.md.
- Ledger (final_release/21): new §1c "built but NOT complete — DO NOT DELETE";
  flagged the Voices wiki page's AI-casting "suggestion panel" wording as an
  overclaim (documents a placeholder as live).
- **Part 0 (answers the owner's question):** #153 deleted 124 files under
  _archive/ (v2-conversion design corpus) under a blanket "history is in the
  wiki" claim; NONE got an individual report entry, and most are architecture
  rationale a user-facing changelog wouldn't carry. Recoverable at git 2dd721a^.
  Do-now: verify that rationale lives in ADRs/specs, recover what doesn't.
- Lesson added (.agent/lessons): "shipped" in a summary doc is a claim to verify,
  not a fact — don't write the changelog or delete a plan on its word alone.

No plans were deleted; the ledger gate held. This is the verify-before-delete
process working as intended.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: Part 0 rationale check — 124 deleted plans' decisions preserved in ADRs/specs

Completes the read-only verification behind the owner's archived-plans question.
Result: the #153-deleted v2-conversion corpus was execution scaffolding + design
drafts whose durable decisions crystallized into the 15 ADRs + 23 specs and whose
outcomes are in code + wiki/Changelog.md. Mapped every major topic to its ADR/spec
home; no lost load-bearing rationale, all git-recoverable at 2dd721a^.

Two minor thin spots (not blocking, not lost): settings architecture has no single
spec (distributed, acceptable), and the read-along reader's UX design rationale is
git-only though its timing-sidecar contract is in data-model.md.

Ledger Part 0 updated from "unverified" to this verified finding.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Hire archivist (Registrar) and user-docs-writer (Docent); expand roster to five

Owner asked whether we need standing ownership of spec/ADR compliance, document
retirement, and user-facing docs — given tonight's session (a summary doc
overclaimed 3 "shipped" features, two wiki changelog entries had to be reverted
after owner correction; a prior cleanup had deleted 124 archived plans with no
per-file verification), the answer is yes. Two new roles, not three: folding
"specs/ADRs followed" into one archivist role alongside document-retirement
lifecycle, since they're one coherent job, while user-facing docs stays
separate — a genuinely different skill (writing for end users) from auditing
internals.

- .claude/agents/archivist.md → Registrar: owns spec/ADR drift auditing and the
  plan-retirement lifecycle (this session's final_release/20 and 21 docs are
  its concrete template). Refuses to retire a plan on a "shipped" claim alone;
  requires citation-graph clearance + wiki coverage + owner sign-off first.
- .claude/agents/user-docs-writer.md → Docent: owns wiki/*, docs/handbook/,
  docs/user-guide/ in the product's user voice. Proactively finds doc gaps AND
  overclaims (a placeholder described as live), verifies completion status
  before writing anything up as available.

Both drafted per the agent-profiles skill's anatomy, then put through a real
adversarial review (Agent tool, general-purpose) before commit, which caught
real problems and required these fixes:
- Both new profiles undercounted the roster ("one of four") and had incomplete
  peer tables (archivist's table omitted designer; user-docs-writer's omitted
  runtime-verifier).
- A genuine unresolved overlap between archivist and runtime-verifier on "is
  this feature reachable / not a placeholder" — narrowed archivist to static/
  on-disk checks only, added an explicit tie-breaker sentence, and required it
  to request (not assert) runtime-verifier's live-behavior check.
- The three existing profiles (engineer/designer/runtime-verifier) still said
  "one of three" with no rows for the new peers — updated all three in the
  same change so the roster's own boundary tables don't ship self-contradictory
  on day one.
- CLAUDE.md's binding Roster line updated to include both hires.
- A reordered/misquoted line in user-docs-writer.md corrected against the
  actual wiki source sentence.

CLAUDE.md's Roster line now names all five. Going forward: claim-verification
("is this actually shipped/done") routes to runtime-verifier or archivist
depending on whether it's a runtime or documentation claim — not self-graded
by whichever session is doing the work, which is the exact gap that let the
COMPLETED_WORK.md overclaim through tonight.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Rename Registrar/Docent to Edda/Rosetta after a real naming ceremony; fix
peer-table inversion found by the first archivist audit

Two things happened this turn, in order:

1. Ran the archivist's actual first audit (dispatched as itself, opus) against
   PR #157's cumulative changes — the "fable sign-off" the owner asked whether
   I'd done (I hadn't; only one lighter adversarial pass on the hire itself).
   Verdict: NOT SIGNED OFF, one real correctness bug found:

   MF-1: user-docs-writer.md and archivist.md's peer-table 4th column ("they
   rely on me for") was inverted in most rows — stating what the profile-owner
   receives from the peer instead of what the peer relies on the profile-owner
   for. This is the exact regression class #154 fixed one commit earlier
   ("fix designer boundary inversion"), reintroduced in self-graded new work.
   Fixed both files' tables to state the correct direction.

   Minor corrections folded in per the same audit: ledger doc 20's mislabeled
   design-critique path (was docs/, labeled design-docs/), COMPLETED_WORK's
   "~150" archive-deletion count corrected to the verified 124, a dangling link
   to a #153-deleted plan in chapter_editor_catalog_completion/01-map.md, and
   pulling the three "not shipped" corrections (HF voice, AI casting,
   recording-cue) out of a flat list into a clearly separated "Built, not yet
   complete" section — AI casting moved entirely to FUTURE_WORK.md since the
   duplication there was worse than a missing entry.

2. Owner pushback, independent of the audit: "Registrar" and "Docent" are
   functional descriptions wearing a name's clothes — a registrar literally
   registers, a docent literally explains exhibits — failing the bar the
   existing roster clears (Tess/Ledger/Witness/Plumb are real words/names that
   do interpretive work to reach the role, not job-title synonyms). Directive:
   redo the naming ceremony with a high-capability model doing real
   deliberation, the way Fable named Tess.

   Dispatched a full ceremony (model: fable) per role: 5-7 real candidates each,
   tested against a naturalization bar (would a stranger accept this as an
   actual name, the way Tess/Mason pass and Pilot fails) and against the
   role's actual convictions, with two honest reversals recorded (Sibyl and
   Beatrice both had real depth but re-encoded the wrong metaphor on scrutiny —
   same as Witness's own "Floor" precedent). Landed on:
   - archivist -> Edda (the Norse codex compiled before its oral sources were
     lost — nothing leaves the record while something cites it, nothing enters
     it on say-so; also a real given name in Iceland/Germany/Italy)
   - user-docs-writer -> Rosetta (one decree in three scripts, checkable
     side-by-side against the source, publishing the demotic text for the
     reader who'll never see the priestly one; also a real given name)

   Updated both profiles' identity paragraphs and frontmatter, and CLAUDE.md's
   Roster line, recording the reversal the same way Witness's "Floor" pick is
   recorded.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Re-examine Ledger/Witness/Plumb against the Edda/Rosetta naming bar; replace
Witness with Veronica, enrich Ledger and Plumb's derivations

Owner asked to rerun the same naming scrutiny just applied to the two new
hires against the three established names, on the theory some could find
something "that has the same meaning but is really theirs." Dispatched the
same ceremony (model: fable) against all three, with explicit instruction not
to manufacture a change — an honest "this already holds up" is a valid,
expected outcome, not a failure to find something.

Result, one change out of three:

- **Ledger — KEPT.** Passes naturalization already (real surname, rising
  given name post-Heath-Ledger). Found a genuine second etymological layer
  that was never written down: the surname descends from Norman Leodegar
  ("the people's spear") via St. Leodegar of Autun, the bishop who kept
  objecting after his tongue was cut out for it — "silence when I disagree is
  failure" in seventh-century form. Added to the derivation paragraph.

- **Witness — REPLACED with Veronica.** Honest failure: "Witness" is a bare
  English function noun, nobody is actually named that — the same failure
  class as Registrar/Docent, just missed on the first pass because the depth
  (three real conviction-layers) was already good. Veronica keeps the exact
  same meaning while being a real name: the medieval *vera icon* reading (the
  woman who received the true image directly from the source, not a
  retelling) maps onto "verify rendered reality, never judge from source
  alone"; the Greek root Berenikē ("bearer of victory") maps onto advocating
  for someone else's win, never claiming it as her own. This is the same
  same-day-revision move this profile already made once (Floor -> Witness),
  now applied a second time on the same evidence-based footing.

- **Plumb — KEPT.** Already passes naturalization (real surname; "Plum" a
  real worn nickname) and its depth — one Latin root (plumbum), four branches
  each mapping to a conviction — was arguably the strongest derivation on the
  roster already. Added the unrecorded fourth branch: aplomb, "according to
  the plumb line," the composure of a reference that's physical, not opinion.
  Norma was the closest real challenger (carpenter's-square metaphor,
  slightly better naturalized) but only a lateral swap, not a clear
  improvement — recorded as runner-up, not adopted, per the "don't
  manufacture change" instruction.

Updated: designer.md (Veronica, full derivation), engineer.md + runtime-
verifier.md (enriched derivations, names unchanged), user-docs-writer.md's
cross-reference ("designer/Witness" -> "designer/Veronica"), and CLAUDE.md's
Roster line records all of it, including the two rejected-under-scrutiny
new-hire candidates (Sibyl, Beatrice) and Plumb's not-quite runner-up (Norma).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* docs: retire road_to_v2.md and stale CodeQL PR-123 alert list

road_to_v2.md's open items are all already tracked in REMAINING_TASKS.md/
COMPLETED_WORK.md/FUTURE_WORK.md except the run.sh/run.ps1 generic plugin
setup loop, folded in here. codeql_open_alerts_pr123.md's alerts are all
resolved per live code-scanning API (only #809 remains open, not in this
list) — safe to delete rather than repoint.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: consolidate remaining muddied plan/workflow docs

- master_agnostic_tasks.md: 187 -> ~55 lines. Collapsed shipped Phases
  1-12 to a COMPLETED_WORK.md pointer. Retired the whole "Deferred
  Architecture: Namespace Rename" section as stale — plugins/ -> tts_engines/
  fully shipped (confirmed live: PLUGINS_DIR resolves to tts_engines/,
  plugins/ dir doesn't exist) and the real remainder is already tracked
  once in REMAINING_TASKS.md. Dropped duplicate/stale open items (Taxonomy
  v2 Phase G is done per COMPLETED_WORK.md; Phase-11 manual verify and
  v1.html screenshot refresh dupe REMAINING_TASKS.md).
- 09_logic_audit.md: collapsed 41 shipped findings (B1-B20, F1-F15, D1-D3,
  R1-R3) to one-line summaries per section; kept the 4 genuinely open items
  (D4, R4-R6) and the verification gate verbatim.
- 07_frontend_themes_and_responsive.md: collapsed shipped Steps 1-3 (token
  audit, dark theme, responsive gaps) to summaries; kept open Step 4
  (Playwright/axe verification) and Step 6 (final acceptance gate) verbatim.
- workflows/README.md: added the missing pain-points.md listing.
- workflows/library-book-chapter.md: cut a stale pain point (legacy
  ProjectLibrary->ProjectDetail hop) confirmed already dead/non-live per
  master_agnostic_tasks.md's R6-T10 scope.

Verified parallel-segment-rendering's README/task-checkbox status is
consistent (not a discrepancy) before leaving it untouched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: consolidate execution-detail plan folders to done-summaries

Collapsed verbose, fully-shipped implementation logs (line-numbered specs,
code snippets, deviation notes) down to compact done-summaries that keep
commit references, real findings, and open items — same treatment as the
prior pass on master_agnostic_tasks.md/09/07.

- audio_player_completion_004/: all 9 task files + 00-overview.md + README.md
  (each ~100-280 lines -> ~15-30 lines; kept status.json commit refs, real
  findings like the getGroupSegmentIds truncation bug, and pending owner
  sign-off items).
- performance_script_model_execution/: tasks 000-004 (the 5 done ones;
  005-012 confirmed already lean/pending, left untouched).
- simplification/: 03/04/05 phase docs trimmed to open-item focus (LF-1..4,
  BE-2/3/5/6 kept in full; done items collapsed with commit refs);
  styling_separation_execution/ 00-overview.md + all 18 done task files
  collapsed to one-line stubs (task 019, the only open one, untouched).
- final_release/21_release_consolidation_ledger.md: corrected a false-done
  claim caught during the audit — "Series suggestions on project
  create/edit" was marked shipped (2026-07-11 checkmark) but the code still
  shows a plain text input, not the combo-box/typeahead the underlying task
  requires. Series *position* did ship; suggestions did not.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
An owner-facing 'How This System Works' guide in design-docs/ — the
team roster, model choosing, playbooks grouped by what you'd actually
say, session shape, cheat sheet, and file map. Inspired by a sibling
system's artifact; written against this repo's actual roster and skills.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
A pre-reviewed hiring pool at .agent/candidate-agents/ — draft profiles
for four plausible future seats (security, release/packaging, performance,
plugin/SDK steward), authored nameless per the self-choose-at-hire-time
convention, plus a README (pool conventions + 3 role sketches whose
existence is undecided) and a Fable review briefing.

Purpose: spend the scarce frontier-review window on profile-craft now, so
a future hire starts from a Fable-reviewed primer instead of a cold draft.
Nothing here is active — .agent/candidate-agents/ is not dispatchable.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* agents: add reasoning-analyst candidate (Opus/max, twin-converge)

Follow-up to #160 (which squash-merged the first four candidates). Adds
the fifth candidate: a frontier-reasoning STAND-IN — method-driven
(code-map + blast-radius + adversarial multi-hypothesis), pinned to
model: opus at max reasoning effort, dispatched as >=2 differently-framed
twin passes that converge (agreement = the call, disagreement = escalation
signal and ceiling-detector). Honest bright line: it can't be Fable and
escalates rather than faking frontier depth.

Also updates the README pool table + Fable briefing to cover it, and asks
Fable to rule on the twin/converge realization (orchestrator vs a
reasoning-twins Workflow vs deferring to fusion-reasoning) and whether
profile-level effort frontmatter is honored.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* agents: propose sibling-pair form of the reasoning twins

Elevates the twin/converge contract to two persistent sibling seats with
different temperaments — Elder (structural/top-down) and Younger
(empirical/bottom-up) — so diversity is baked into character, not hoped
for from instructions.

Load-bearing constraint: independence is sacred. Siblings share
name/lineage (younger may be named in awareness of the elder), but each
reasons BLIND to the other's conclusion; convergence is reconciled by a
neutral third step, never the elder — any awareness leaking into the
reasoning collapses the ensemble into an echo.

Naming: a scoped exception to the no-pre-hire-naming rule, sequenced —
Fable first rules the sibling design sound, and only then names them one
at a time (Elder first, Younger in awareness of the Elder), watching
token usage. If the design doesn't hold, seed rationale only, no names.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* agents: correct twin naming to self-naming-on-Fable + encode the naming standard

Framing fix per owner: the siblings NAME THEMSELVES (the repo's standard
self-choice ceremony, as every live seat did) with Fable as the driving
model so the introspection is frontier-quality — not Fable imposing names.
Fable reviews the design; the seats self-name on Fable.

Also encodes the naming standard each self-choice must meet: keyed off the
seat's own load-bearing conviction, naturalistic (the Witness->Veronica
test), relational for the pair, survives adversarial re-examination,
internal-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Fable (claude-fable-5) ran the candidate-pool review + naming ceremony as
an owner-approved, orchestrator-verified subagent. Records its banked
judgment in FABLE-PRIMING-OUTPUT.md: all 5 candidates kept (4 base +
reasoning-analyst), 3 role sketches dropped/merged, sibling-pair design
ruled sound with an added 'each sibling answers the whole question'
constraint (closes an implicit-division-of-labor leak), twin contract to
be realized via the existing fusion-reasoning skill, and the two siblings
self-named Constance (Elder) / Petra (Younger) — recorded for hire, not
yet added to the live roster.

Also clarifies the manual's Fable rule per owner correction: not 'never
unattended' absolutely, but 'never in the background WITHOUT approval' —
an owner-approved, supervised, orchestrator-verified Fable subagent (as
used here) is the sanctioned shape; autonomous Fable use is not.

Authored-by: Tessera (orchestrator) · Claude Code
…enario menu (#163)

* agents: hire the reasoning twins Constance & Petra

Hires the reasoning-analyst sibling pair as live seats — a durable Fable
stand-in for hard open-ended calls (root-cause, architecture, blast-radius),
run as two independent panelists via the fusion-reasoning skill:

- Constance (elder, structural/top-down) — reasons downward from the
  code-map's invariants/flows; Latin constantia, 'standing together'.
- Petra (younger, empirical/bottom-up) — reasons upward from what the code
  actually does; Greek petra, bedrock; named in awareness of her elder.

Both model: opus (deliberate exception to model-inherit), independence-
sacred with a neutral fusion-reasoning judge and no deciding vote, the
complete-answer constraint (temperament is a lens, never a scope split),
and honest escalation to owner-driven Fable past their ceiling.

Design ruled sound by Fable; passed one adversarial review (mandate
guardrail) that caught + fixed a YAML frontmatter parse blocker before
commit. Records the pair in CLAUDE.md's roster and the manual's team table.

Authored-by: Tessera (orchestrator) · Claude Code

* calibration: add scouted scenario menu (12 real benchmark candidates)

Scout output for the Frontier Calibration program: 12 real, currently-open
problems verified against live code (not trusted from plan docs), 2 per
activity type — root-cause, architecture, blast-radius, adversarial review,
planning, spec-vs-code drift. Strongest 3 flagged: RC-1 (span resync data
loss), AR-1 (VRAM-aware auto-throttle), SD-1 (stale always-on lesson vs
current gate). Awaiting the owner's pick of the range to capture Fable
references on.

Authored-by: Tessera (orchestrator) · Claude Code

* calibration: add answer-neutral briefings for the 6 chosen scenarios

One briefing per activity type (RC-1 root-cause, AR-1 architecture, BR-1
blast-radius, AD-2 adversarial review, PL-2 planning, SD-1 spec-drift).
Each states the question + evidence pointers only — answer hints and
grading-only ground truth stripped, per Fable's correlation-leak rule.
These feed the Fable reference capture now AND the twins identically in
Phase 2, so the comparison is fair.

Authored-by: Tessera (orchestrator) · Claude Code
…#164)

* calibration: bank 6 Fable references + findings summary + adaptive sequencing

Phase 1 complete. Banks the 6 gold-standard Fable reference analyses (one
per activity type: RC-1 root-cause, AR-1 architecture, BR-1 blast-radius,
AD-2 adversarial review, PL-2 planning, SD-1 spec-drift) captured against
the answer-neutral briefings — the Fable-gated work is done.

Adds findings-summary.md routing each reference's actionable finding toward
the roadmap (RC-1 data-loss root cause, AD-2 F3 semaphore-leak bug, AR-1
OOM-prevention design, BR-1 BE-6 blast radius, PL-2 doc-05 reconciliation,
SD-1 stale always-on lesson) — implement-after-twin-run for benchmark
integrity. Updates the program with adaptive gap-driven sequencing (run 6
first; escalate to a type's 2nd scenario only on a real gap) and the
dual-purpose 'findings feed the roadmap' principle.

Authored-by: Tessera (orchestrator) · Claude Code

* calibration: pivot the method to PLAN REVIEW (per owner)

The calibration task is no longer twins-vs-Fable on raw scenarios — it is
PLAN REVIEW. Findings stay banked (no fixing); each feeds an implementation
plan built the normal way, and the twins + Fable review that plan
independently and blind, then we compare. Fable's plan reviews are now the
time-boxed step (plans must exist first). Updates Method, Scarcity,
Sequencing, Dual-purpose, and Phases accordingly; reframes findings-summary.

Authored-by: Tessera (orchestrator) · Claude Code
* plan: sub-sentence span preservation fix (from RC-1 finding)

Draft implementation plan from the RC-1 Fable finding (whole-sentence
positional equality in sync_chapter_segments cannot preserve manually-split
fragment rows). Design: content-anchored reconciliation (hash + offset at
split time) instead of index+equality, shared between sync and
get_resync_preview, with loss surfaced on save. Status: DRAFT, awaiting the
twin + Fable plan review (Frontier Calibration Phase 3). No code changes.

Authored-by: Tessera (orchestrator) · Claude Code

* calibration: Phase 3 complete — RC-1 plan reviewed by twins + Fable, compared

Three independent blind reviews of the span-preservation-fix plan:
- Fable: sound-with-changes; caught the multi-split anchor gap + audio-
  preservation gap; flagged TDD sequencing.
- Constance: same core gap independently, PLUS a build-breaking conflict
  with an existing committed test, PLUS an unrelated pre-existing column-
  loss bug in the same function.
- Petra: same core gap independently, PLUS identified the plan's mechanism
  itself (re-derive) as wrong vs. preserve-in-place, catching a revision-id
  concurrency churn bug neither Fable nor Constance found, plus a simpler
  schema-free alternative with a stated falsifier.

Comparison verdict: the twins matched Fable's core catch and each added
findings Fable's single pass didn't surface — cross-reviewer synthesis is
where the value concentrated, not any one reviewer alone. Plan is NOT
build-ready; needs the preserve-in-place mechanism, test reconciliation,
and resequencing before implementation. No code changed.

Authored-by: Tessera (orchestrator) · Claude Code
* plan: RC-1 corrected plan via plan-architect, folding in 3-way review

Properly built (not hand-written) implementation plan for the RC-1
sub-sentence-span data-loss fix, superseding 00-plan.md. Built from the
original finding plus all three review findings (Fable, Constance, Petra)
and three verification scouts resolving open questions:
- schema-free whitespace falsifier confirmed real, fixed via strip-after-
  concat (not raw concatenation)
- the existing duplicate-sentence test's exact protected semantics
  (first-occurrence-by-position, never cross-match)
- the full 9-column (not 6) silent data-loss accounting on every rebuild

Core mechanism corrected to preserve-in-place (not re-derive), align_segments
extracted as one shared function for both sync and preview, tests
sequenced per R1/TDD, index-cascade fix split out as an independently
shippable first workload. Full map/roadmap/task-file structure per
plan-architect, with a coverage table tracing every review finding to
the task that addresses it.

Authored-by: Tessera (orchestrator) · Claude Code

* calibration: round 2 — twins catch a blocker + correctness bug Fable missed

Same three reviewers (resumed with v1 context) re-review the corrected v2
plan. Fable: build-ready, minor flags only. Constance: MUST-FIX N1
(fragment-run cap of 3 is wrong — assignments accumulate across separate
edits, 4+ real) + N2 (preserve-in-place contradicts Task 0's own
re-indexing of segment_order, which is hashed into the revision id).
Petra: BLOCKER — Task 0's stated behavior necessarily preserves the
'Middle' sentence in the existing frozen duplicate-reorder test, but that
test's current assertion (Middle -> unprocessed) encodes the very bug
being fixed; the plan as written traps the implementer into an
unresolvable contradiction.

Both twins independently converged on the same deeper issue from
different angles that neither Fable's pass nor the plan's author caught:
fixing the bug means some existing test ASSERTIONS (not its intent) must
change. Calibration verdict: twins outperformed a single Fable pass this
round, following round 1's 'twins matched Fable' — combined signal
favors twins+Fable comparison over either alone. No code changed; plan
corrections identified, not yet applied.

Authored-by: Tessera (orchestrator) · Claude Code

* plan: apply round-2 corrections (unbounded runs, test contradiction, path fixes)

Fixes all 5 issues from round 2 twin review (RC-1-v2-plan-comparison.md):

1. Fragment-run length is now unbounded/prefix-driven, not capped at 3
   (Constance N1 -- assignments accumulate across separate edits with no
   re-merge, 4+ fragments are real).
2. Reconciled 'preserve in place' with position re-indexing (Constance N2):
   segment_order may change on a preserved row when an earlier edit shifts
   position; only id/character/speaker/audio are the untouched guarantee.
   P6's hash rationale corrected to id+order+text, not id alone.
3. Resolved Petra's BLOCKER: Task 0 and Invariant I2 now state explicitly
   that the existing test's 'Middle -> unprocessed' assertion encodes the
   pre-fix bug and MUST be updated to 'Middle preserved' as part of Task 0's
   deliverable, while the Repeat-duplicate assertions are the actual
   protected behavior and stay unchanged. This was a real contradiction the
   plan built into itself -- now resolved with explicit acceptance criteria.
4. Corrected Invariant I3's cited code path (preserve_gap=True, not the
   library default False) -- the falsifier conclusion (strip-after-concat)
   still holds, but Task 1's test fixture must exercise the real path.
5. Named one concrete algorithm (monotonic/order-preserving matching, e.g.
   SequenceMatcher-style) for both Task 0 and Task 4/align_segments, and
   made Task 4 explicitly supersede Task 0's aligner so there's one
   implementation, not two.

Plan is now considered build-ready pending a final read; no code changed.

Authored-by: Tessera (orchestrator) · Claude Code
* plans: draft implementation plans for remaining 5 calibration scenarios

Draft plans for AR-1 (concurrency auto-throttle), BR-1 (app/jobs move),
AD-2 (cap-resolution hardening), SD-1 (lesson correction), and a PL-2
addendum to the existing doc 05 (standalone plugin repos). Each built as
one consolidated plan doc (not the full plan-architect ceremony) given
the Fable references already supply map-equivalent detail. All DRAFT,
awaiting twin + Fable review. No code changes.

Authored-by: Tessera (orchestrator) · Claude Code

* calibration: complete Phase 3 for all 6 scenarios + apply corrections

All 6 calibration scenarios now have plan + 3-way review (Fable, Constance,
Petra) complete. Applies the concrete fixes their reviews surfaced:

- AR-1: fixed a real arithmetic bug (penalty subtracted before vs after
  the manifest-ceiling clamp -- Petra), resolved the blocking CUDA-process
  question (both twins independently ruled out in-process torch sampling),
  recorded a genuine twin disagreement on sampling transport as an
  escalated build-time choice rather than picking one, added the
  goal-honesty reframe (mitigation not prevention) and ETA-jitter flag.
- BR-1: fixed a critical wrong-precedent defect both twins independently
  caught (the cited shim doesn't preserve module identity; naive copy
  would silently un-mock ~13 test sites) -- corrected to the real
  sys.modules-aliasing mechanism, gates now loop over every submodule.
- AD-2: adopted Constance's simpler idempotent-release fix for F3 (no
  token/plumbing needed -- release unconditionally from every gate) over
  the more complex token-threading both Fable and Petra proposed; added
  the F4 engine_id guard both twins flagged; fixed F5's fix mechanism
  (drop the truthiness gate, not a sentinel that can't work).
- PL-2, SD-1: findings recorded; PL-2's doc-05-section-inversion miss
  (both twins independently caught) flagged for the next touch.

Overall result: the twins-together pattern held across all 6 scenarios --
consistently caught real issues a single Fable pass missed, without
exception. Full findings in all-6-scenarios-findings.md.

Authored-by: Tessera (orchestrator) · Claude Code
Fable references captured for all 6 remaining scenarios (RC-2, AR-2, BR-2,
AD-1, PL-1, SD-2). Plans built for 4: SD-2 (CLAUDE.md task-inventory
drift), AD-1 (word-boundary snap parity -- surfaces a genuinely new,
previously undocumented UTF-16-vs-codepoint bug), AR-2 (auto-isolated
plugin venv design), PL-1 (ACX loudness QA + normalization, complete
slice plan). RC-2 needs no plan (fix already shipped, pure calibration
value). BR-2's blast-radius findings folded directly into the already-
built RC-1 fix plan -- found a real gap (9-column INSERT interaction,
preserved_ids/cleanup risk) before any code was written.

Twin/Fable 3-way review not yet run on these 4 new plans -- time-boxed to
prioritize Fable reference capture first. Next step: run review on
whichever plan is highest-value (AD-1, AR-2 recommended).

Authored-by: Tessera (orchestrator) · Claude Code
…169)

* calibration: record Phase 4 (implement + code-review sign-off comparison)

Owner-directed: after a plan is approved, implement the fix as real code,
then run the twins-vs-Fable comparison on the resulting diff (code review,
not plan review). Standing policy: Fable signs off on code changes when
available; the twins sign off going forward regardless of Fable's
availability. Compare sign-offs, watch for gaps, same discipline as
Phase 3. First test case: the RC-1 fix.

Authored-by: Tessera (orchestrator) · Claude Code

* feat: implement align_segments core (RC-1 fix, Task 1)

Phase 4 of the calibration program: first real code from an approved
calibration plan. Implements the shared content-anchored alignment
function per the reviewed design -- position-anchored exact match first,
then content-search and fragment-run search for unresolved sentences,
both gated on content-uniqueness so duplicate content never cross-matches
(Invariant I2) while uniquely-identified content is recognized at a new
position (fixing the actual RC-1 bug). Unbounded fragment-run length
(Constance's round-2 finding). Strip-after-concat comparison (Invariant
I3). 7 unit tests covering the whole-sentence, 2/3/4+-fragment,
duplicate-disambiguation, whitespace-falsifier, and genuine-edit cases --
all passing, all confirmed against the corrected test semantics from the
plan's two review rounds.

Not yet wired into sync_chapter_segments / get_resync_preview (Tasks 3-5)
-- this is Task 1 only, a self-contained, independently reviewable diff,
by design (Phase 4's first code-review test case).

Authored-by: Tessera (orchestrator) · Claude Code

* fix: close a real data-loss bug in align_segments (Fable code review)

Fable's code review (Phase 4) hand-traced and confirmed a deterministic bug:
the blanket duplicate-content gate destroyed ALL rows of a manually-split
sentence whenever its whole-sentence text also appeared verbatim elsewhere
in the chapter -- including on a pure resave with zero edits. Reproduced
and confirmed the exact failing case before fixing.

Fix: a genuine multi-row fragment run (>=2 rows) is now exempted from the
duplicate-sensitivity gate -- a multi-row split is an explicit, deliberate
user action, categorically different from a naturally-occurring duplicate
whole sentence. A length-1 match stays gated (still ambiguous, same as the
single-row case) -- this preserves the existing reordered-duplicates test's
outcome exactly.

Also fixes a weaker finding from both Fable and Constance's reviews: the
whitespace-falsifier test put its artifact on the wrong side (fresh, not
existing) and didn't actually exercise the strip-after-concat step it
claimed to -- rewritten to put trailing gap whitespace on the fragment
side, verified it fails without the strip.

Both twins' code reviews (independently) flagged this general area
('the plan's own #1 risk -- duplicate x fragment-run intersection --
is untested') but neither constructed the concrete failing case Fable
hand-traced. This is the calibration's clearest Fable-vs-twins gap to
date on code review specifically, as opposed to plan review where the
twins have generally matched or exceeded Fable.

9/9 tests pass, ruff clean.

Authored-by: Tessera (orchestrator) · Claude Code

* calibration: Phase 4 code-review comparison — the clearest Fable-vs-twins gap yet

Records the first Phase 4 result: Fable caught a real, verified data-loss
bug that both twins' code reviews missed, despite both independently
flagging the exact same risk area (the plan's own named #1 concern) as
under-tested. Neither twin constructed the adversarial input; Fable did,
hand-traced it, and I independently reproduced it before fixing.

Durable takeaway for the twins' profiles: flagging an untested risk area
is not equivalent to constructing and tracing an adversarial input against
it -- the latter is what caught the bug. Standing policy: route
consequential diffs through both Fable and twins when Fable is available;
when it isn't, require twins to build the adversarial case for any
plan-named top risk, not just confirm coverage exists.

Authored-by: Tessera (orchestrator) · Claude Code
* feat: wire align_segments into sync_chapter_segments (RC-1 Task 4)

Replaces the delete-all-then-reinsert-all pattern with a differential
write: align_segments() computes which existing rows to preserve (incl.
multi-row fragment runs), and preserved rows with no position/audio
change get NO DB write at all -- the actual 'preserve in place'
guarantee, not id-preserving-reinsert. segment_order updates only for
rows whose position shifted (Invariant I1a); shared-audio invalidation
pass kept from the original implementation. 493 existing tests (db/ +
domain/) pass unchanged; all 5 test_chapters_sync.py tests pass without
modification, including the previously-established reordered-duplicates
test.

IMPORTANT FINDING while verifying end-to-end (not caught by either Fable
review round or either twin round, since all four reasoned only at the
sync_chapter_segments/align_segments level): align_segments correctly
preserves a row's id/audio at write time, but get_chapter_segments'
separate chunk-group canonical-audio-file check (app/domain/chunk_groups.py)
can re-invalidate that same row's audio on READ if its position shift
causes it to merge into a different character/profile chunk group where
it is no longer the group's canonical (first) member. This means the
round-2 plan correction ('Middle should be preserved, not unprocessed')
was incomplete -- the ROW is preserved, but its RENDERED AUDIO can still
be correctly re-invalidated by this independent, pre-existing mechanism.
The existing test's original 'Middle -> unprocessed' assertion turns out
to still hold, for a different and more subtle reason than originally
believed. Flagging for the next review round rather than silently
patching around it.

Authored-by: Tessera (orchestrator) · Claude Code

* test: close Fable's Task 4 code-review gaps (R1 tests, docs, decisions)

Fable's Task 4 code review found real, valid gaps despite approving the
underlying mechanism:

1. Zero committed tests shipped with Task 4 -- a real R1/TDD violation.
   Added 3 tests, revert-checked against pre-Task-4 code (2 of 3 correctly
   fail on old code; the revision-id test passes on both since this
   simple no-split case doesn't distinguish old/new behavior, noted
   honestly in the task file rather than overclaimed).
2. The task file's own acceptance criteria were never checked off, and
   I5's required decision was never recorded. Both fixed: I5 deferred
   explicitly (preserved rows already fixed as a side effect; new rows'
   residual 9-column loss judged low-risk, filed for a follow-up if it
   ever matters).
3. Fable sharpened my own chunk-group finding significantly during its
   review (executing code, not hand-tracing, per its own suggested
   workaround): the invalidation isn't caused by position shift at all --
   it happens on the FIRST read regardless, because same-character rows
   merge into one canonical group from the moment they're created. This
   means the PRE-EXISTING committed duplicate test is confounded for its
   Middle/duplicate-Repeat assertions -- they'd pass identically even if
   align_segments totally failed to preserve those rows. Recorded as a
   new Invariant I8 in 01-map.md so this isn't rediscovered as a fresh
   bug later, with an explicit instruction that future regression tests
   must use distinct-character scenarios to avoid the same confound.
4. segment_alignment.py's docstring corrected from present-tense
   overclaim ('IS the shared function for both callers') to accurate
   status (only sync_chapter_segments is wired; get_resync_preview drift
   is live until Task 5) -- per Petra's finding that the docstring
   currently misrepresents a live, user-visible bug as already fixed.

All three reviewers (Fable, Constance, Petra) confirmed the underlying
Task 4 mechanism is correct; this commit closes the verification-
discipline gaps their reviews found. 496 tests pass (db/ + domain/),
ruff clean.

Authored-by: Tessera (orchestrator) · Claude Code

* calibration: Task 4 code-review comparison (testing the risk-instantiation gate)

Records round 2 of Phase 4's Fable-vs-twins comparison. The gate (construct
+ execute, not hand-trace) visibly changed both twins' behavior this round
-- Constance got a finding she says she wouldn't have without it, Petra
used execution to avoid a false positive. But Fable still found the
sharpest version of the shared chunk-group finding, because it ran the
specific disambiguating experiment (checking behavior before any resync
at all) that revealed the mechanism's real trigger and the resulting test
confound -- neither twin ran that control. Also neither twin caught the
zero-committed-tests process violation.

Updated durable takeaway: the gate closes 'confirm but don't execute' but
not yet 'vary the experiment to find the simplest/most consequential
trigger', nor process-compliance checking. Both should become explicit
review steps going forward.

Authored-by: Tessera (orchestrator) · Claude Code
…fixes (#171)

* feat: wire align_segments into get_resync_preview (RC-1 Task 5)

Replaces the duplicated position-only equality check with a call to the
shared align_segments -- closes the drift Petra's Task 4 code review
found live: the preview reported false 'destructive'/loss warnings for
saves the real sync actually preserves (a uniquely-identified sentence
moved by a reorder). Remains a pure read -- no DB writes, verified by test.

preserved_assignments_count counts at fresh-sentence granularity (a
multi-row fragment run counts once); lost_assignments_count and
affected_character_names derive from align_segments' unmatched_existing_ids.

3 new tests, revert-checked (the reorder-preservation test correctly
fails on pre-Task-5 code: predicted 1 lost assignment where the real sync
preserves 0). 499 tests pass (db/ + domain/), ruff clean.

Authored-by: Tessera (orchestrator) · Claude Code

* fix: close is_destructive false-positive (Fable + Constance Task 5 reviews)

Both Fable and Constance's Task 5 code reviews independently found the
same adjacent bug: get_resync_preview's is_destructive flag used a stale
total_new < total_old row-count heuristic that predates align_segments --
before the RC-1 fix, a legitimate manual split had no way to shrink the
row count while preserving assignments, so the heuristic was a valid
proxy for real loss. Now a preserved multi-row fragment run legitimately
maps to one fresh sentence, so the heuristic fires on every split-
containing chapter regardless of actual loss, producing a genuinely
contradictory UI: a destructive-resync warning icon directly above 'all
current speaker assignments will be preserved'.

Fix: is_destructive keyed purely to lost_assignments_count (the field
this function's own contract is actually about). Added a regression test
reproducing the exact contradiction (4 existing rows incl. a 3-fragment
split -> 2 fresh sentences, zero assignments lost, asserts NOT
destructive).

Also updates segment_alignment.py's STATUS docstring now that Task 5 has
actually landed (was stale, per Petra's finding).

Authored-by: Tessera (orchestrator) · Claude Code

* feat: surface lost_assignments_count on the save response (RC-1 Task 6)

sync_chapter_segments now returns {success, lost_assignments_count}
instead of a bare True (backward compatible -- all 3 existing callers
discarded the return value already, confirmed by exhaustive grep across
the live tree, excluding stale .claude/worktrees/ snapshots).
update_chapter threads it through for text-content saves; the two API
routes that trigger a sync (PUT /chapters/{id}, the explicit
sync-segments endpoint) now include lost_assignments_count in their JSON
response, so an ordinary text save can warn the user, not just the
explicit resync route's preview.

1081 tests pass (db/ + domain/ + api/), ruff clean.

Authored-by: Tessera (orchestrator) · Claude Code

* test: close Task 6's backend gaps; document frontend UI as deliberately deferred

Fable's Task 6 code review (backend correct, safe, zero regressions) found
two real gaps against the task's own acceptance criteria:

1. No API-level tests -- added 2 (test_api_chapters.py): an ordinary
   PUT /chapters/{id} save that destroys a real assignment surfaces
   lost_assignments_count=1; a clean resave surfaces 0; same guarantee
   for the explicit /sync-segments route.
2. The frontend never consumes lost_assignments_count at all, so Task 6's
   stated purpose ("so the UI can warn the user") isn't reachable by any
   real user yet. Added the TS response type so a future consumer can use
   it, but deliberately did NOT wire useChapterPersistence.ts to show a
   warning -- that's a real UI/IA decision (timing, blocking vs. inline,
   modal reuse) that belongs with the designer/owner per this repo's
   mandate, not a unilateral call by this task. Task file updated to
   status 'partially complete' rather than silently marked done.

1083 tests pass (db/ + domain/ + api/), ruff clean across app/.

Authored-by: Tessera (orchestrator) - Claude Code
Records what actually shipped tonight vs. plan-of-record: Tasks 1/4/5
done and 3-way reviewed; Task 6 backend done, frontend UI deliberately
deferred to design review; Task 0 superseded by Task 4 as designed;
Task 2 never needed. One honest open gap: the self-committing
transaction posture has no committed test yet.

Authored-by: Tessera (orchestrator) - Claude Code
Distills the twins-vs-Fable calibration program's findings
(.agent/frontier-calibration/) into three durable review-ratchet
entries in .agent/checklists/code-review.md:

1. For any risk a plan/predecessor review names as its own top concern,
   construct the combined adversarial input and EXECUTE it -- confirming
   a test exists or flagging an area "under-tested" is not sufficient.
2. Once a finding is confirmed, vary one dimension to find its simplest
   trigger -- this is what surfaces second-order consequences (e.g. a
   confounded pre-existing test) that mere confirmation misses.
3. Verify a diff's own task/plan acceptance criteria mechanically
   (committed tests exist, checkboxes ticked, required decisions
   recorded) as a step separate from correctness review.

Fable directly reviewed and signed off on this addition (not a rubber
stamp): it caught a real inaccuracy in item 1's original provenance --
attributing "executed" to a pass where it had actually hand-traced --
and requested a correction before approving. Fixed: the provenance now
states plainly that the Task 1 finding came from a careful manual trace,
not execution, and that the "always execute" rule is a deliberate
strengthening adopted because hand-tracing (even when it worked once)
is less reliable than real execution. Independently cross-checked both
twins' sub-claims in items 1 and 2 against their actual review files
(rc1-task1-{constance,petra}-review.md, rc1-task4-{constance,petra}-review.md)
-- both confirmed accurate as written.

Authored-by: Tessera (orchestrator) - Claude Code
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Epic Larger Story containing smaller stories required for full completion.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Studio 2.0 - Core Architectural Redesign & Modular Plugin System

2 participants