Studio 2.0#99
Draft
senigami wants to merge 80 commits into
Draft
Conversation
* 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
* 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
…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
* 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
* 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
Contributor
There was a problem hiding this comment.
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>
* 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
* 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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.