Skip to content

Latest commit

Β 

History

History
656 lines (533 loc) Β· 67.7 KB

File metadata and controls

656 lines (533 loc) Β· 67.7 KB

WorldScript Studio β€” TODO (Current Sprint)

Prioritized task tracker for the current sprint. Status: πŸ”„ in progress | ⬜ open | βœ… done

Completed items are archived in docs/history/. Long-term features and quarterly planning β†’ ROADMAP.md.


Current Sprint β€” v1.28.6 corrected release cut: Tauri desktop release-build recovery (2026-09-09)

Status: πŸ”„ in progress. The authoritative native sequence remains docs/native/ROADMAP-QT-GPUI-DESKTOP.md, with the next Rust-Core capability choice recorded in docs/native/CORE-MIGRATION-LEDGER.md. R-15 implementation stays blocked behind the still-open Wave 2 prerequisite (ledger row 9). No Qt, GPUI, or R-15 implementation work is part of this sprint.

  • βœ… v1.28.5 tagged (PR #676, 2026-09-09) β€” but its tag-triggered Tauri desktop release build failed on every platform with a Rust/npm plugin version mismatch (tauri-plugin-http, tauri-plugin-notification drifted ahead of their npm counterparts after #661's Rust-only bump), so no GitHub desktop Release or installer/updater assets were ever published for it. This was desktop-build-specific: the separate Docker/GHCR publish workflow for this tag succeeded, so a container image for v1.28.5 does exist. The v1.28.5 tag is permanently kept as-is (never deleted/moved/re-tagged) as the historical failed/incomplete desktop-release cut; the corrected release ships as v1.28.6.
  • βœ… PR #678 merged (2026-09-09): aligned the drifted npm plugin versions and added check-tauri-plugin-versions.mjs, a cheap CI guard mirroring Tauri's own build-time Rust/npm parity check for every workspace importer, so this class of mismatch is caught before the next release tag instead of at tag-triggered release time. Cross-platform Windows/Ubuntu/macOS tauri-build.yml qualification succeeded on the exact final PR head / merge-candidate SHA (52f14d15aebede5a0482225ba6327221ef81d9c8) before merge; the resulting squash-merge commit on main was a different SHA, produced only after that qualification.
  • βœ… PR #679 merged (2026-09-09): resulting-main CI failed once post-#678 on the CHANGELOG completeness gate's PR-number-reference requirement. PR #678's number was already known before merge; what didn't exist yet was the final squash commit. The PR-branch check doesn't enforce a current PR's own already-known number against [Unreleased], only resulting-main's commit history, so PR CI stayed green and only resulting-main's docs:check caught the missing reference; a one-line CHANGELOG fix restored it to green. (A possible future pre-merge hardening of this check is recorded as deferred, memory-only follow-up β€” not part of this release cut.)
  • βœ… v1.28.6 released (PR #680, 2026-09-09): version/CHANGELOG.md/TODO.md/README.md reconciliation for the Tauri plugin-parity recovery, merged after an exact-SHA Windows/Ubuntu/macOS tauri-build.yml qualification passed on the intended tag commit. Tag v1.28.6 and its GitHub Release (full desktop installer/updater asset set, all platforms) are published; the tag-triggered Tauri/CI/Docker workflows and the post-release AUDIT.md evidence entry (PR #681) are complete.
  • βœ… PR #674 merged (2026-09-09): the CHANGELOG completeness gate upgraded from accepting any non-empty [Unreleased] section forever to requiring every governed commit to be individually referenced by PR number or subject slug; backfilled 13 previously-undocumented entries. The remaining structural heuristic-matching limitation (a short token like a version number can still clear the word-overlap ratio in an otherwise-matching sentence) is intentionally out of this gate's deterministic, non-NLP scope and is tracked separately as #675.
  • ⬜ Ledger row 9 (project state-shape compatibility adapter) remains open: durable source-generation fencing, writer integration, universal ingress/egress, and authority switch per docs/native/CORE-MIGRATION-LEDGER.md row 9. Wave 3/4 R-15 implementation stays blocked (S5_IMPLEMENTATION_READY=NO, recorded on row 10) until row 9 and S5_TERMINAL=YES are both true β€” no target release is set for that yet (tracked, not invented).
  • ⬜ #614 (narrow concurrent-first-install multi-tab race), #532 (WelcomePortal E2E entry nondeterminism root cause), and #675 (deterministic contract for the changelog gate's unnumbered-commit heuristic) remain open, tracked separately β€” not part of this sprint unless they directly block release or R-15 work.

Archived β€” v1.28.5 release cut, superseded by the v1.28.6 corrected release (2026-09-09)

  • βœ… v1.28.4 released (PR #615, tag+release published 2026-09-05); the prior sprint's release and governance work (attribution-hygiene guard PR #672, security-docs truth fix PR #673) closed out.
  • βœ… PR #674 merged (2026-09-09): CHANGELOG completeness-gate upgrade (see current sprint entry above for the full description, carried forward since it remains active work).
  • βœ… v1.28.5 release-prep PR #676 merged and tagged (2026-09-09) β€” see current sprint above for why this release cut is superseded by v1.28.6.

Archived β€” Release truth reconciliation and R-15 desktop at-rest encryption priority (2026-09-05)

Status: βœ… Superseded by the current sprint above. v1.28.4 shipped 2026-09-05; PR #674, the v1.28.5 release cut, and its v1.28.6 desktop-release-build recovery are the current sprint's continuation of this same work.

  • βœ… v1.28.2 (2026-08-27) and v1.28.3 (2026-08-27) released, closing out the prior sprint's accumulated reconstruction-reconciliation and documentation-truth work.
  • βœ… PWA first-install unprompted-reload fix (#585, PR #613) and shared-origin service-worker cache-read isolation fix (#514, PR #612) merged.
  • βœ… WCAG AA contrast + prefers-reduced-motion cascade fix and default-appearance-preset change (#565, PR #609); ManuscriptEditor contrast fix (#341, PR #560).
  • βœ… Preserve-first desktop corruption recovery (PR #542) and a distinct filesystem-I/O recovery action (PR #545) landed.
  • βœ… Visual regression testing repaired β€” baselines previously pointed at directory listings, not the application (PR #610).
  • βœ… v1.28.4 released (PR #615, tag+release published 2026-09-05): version/CHANGELOG.md/ TODO.md/README.md reconciled, v1.28.4 tag and GitHub Release published with all expected Desktop artifacts; post-merge main CI and CodeQL green (CodeQL has no tag trigger), tag-triggered CI/Tauri/Docker all green, and AUDIT.md updated with real evidence.
  • βœ… Attribution-hygiene guard merged (PR #672): fail-closed rejection of AI/session attribution trailers and footers in commits, tags, and PR titles/bodies (commit-msg hook, pre-push scan, CI).
  • βœ… Post-audit truth/governance remediation PR #673 merged: stale #356-active-remediation citations in docs/SECURITY-THREAT-MODEL.md/docs/IDB-ENCRYPTION.md rewritten to anchor on the living ledger state, with a mechanical check-doc-metrics.mjs guard against recurrence (first slice of the 2026-09-08 external audit's S1–S10 remediation sequence; further slices in progress).

Archived sprint history

The completed release and infrastructure sections below are retained for provenance. They are not the current sprint plan; long-term native sequencing belongs in the linked roadmap and ledger.

Archived β€” Post-#477 reconstruction reconciliation, Dependabot, and documentation truth (2026-08-26)

Status: βœ… Superseded by the current sprint above. The release this section's final bullet anticipated shipped as v1.28.2 and v1.28.3 (2026-08-27).

  • βœ… PR #477 (Qt/PWA architecture-governance roadmap) merged; v1.28.1 released 2026-08-23.
  • βœ… Reconstruction reconciliation: the frozen PR #491 bundle's three genuinely-still-required residual pieces were rebuilt fresh against current main and merged β€” structural workflow-policy YAML authority (#505, S4), Intel macOS qualification-only build lane (#508, S5), and tiered PR-size governance (#509, plus an incidental lint-info cleanup #511). #491 and #493 were closed with terminal reconciliation ledgers; every other frozen cluster was either already shipped via #494/#498–#502, or is a deliberately deferred architecture question with durable tracking (isolated-worktree hermetic-sandbox verification, issue #504).
  • βœ… Dependabot backlog cleared: #495 (osv-scanner-action 2.5.0β†’2.5.1 β€” plus a real pre-existing test-oracle fix for the hardcoded SHA it changed) and #496 (docker/setup-buildx-action 4.2.0β†’4.3.0) merged.
  • βœ… Documentation truth pass (AUDIT.md/TODO.md, this update).

Archived β€” Native desktop consolidation and Wave 2 G1 (2026-08-20)

Status: βœ… Superseded by the current sprint above.

  • βœ… P0 CI/deployment authority stabilization merged in PR #427 at 0309a255.
  • βœ… Cross-workspace Tauri path-dependency coverage and aggregate deployment gating are now regression-tested in the quality job.
  • βœ… G1 partial-completion items (task supervision, diagnostics, contract versioning) were carried forward into PR #477's architecture-governance roadmap, now merged.

Archived β€” Release v1.25.0 published (2026-08-01)

Status: βœ… Done. Tagged, released, and live β€” see the GitHub Release link below.

Native Grok/Claude providers, opt-in Browser-Ollama, and DuckDB codex_mentions.excerpt cell-level encryption (SEC-6) all shipped in this cycle β€” see docs/history/completed-v1.25.0-providers.md for the full completed checklist. CHANGELOG.md, package.json/README.md, and src-tauri/public/sw.js are all version-bumped and synced for this release.

  • βœ… PR #303 (DuckDB excerpt encryption SEC-6 + CodeRabbit fix + doc-truth fixes) merged to main at 256264d3 via admin-bypass squash-merge (fresh maintainer authorization; mergeStateStatus cache-lag artifact β€” all 20/20 checks green, 0 unresolved review threads, Tauri Rust build manually verified green on all 3 platforms before merge).
  • βœ… Tagged and published v1.25.0 after main's post-merge CI (build + e2e) went green β€” the GitHub Release is live with all Tauri installer assets (macOS/Linux/Windows) and .sig files; see v1.25.0 on GitHub.

Infra β€” Vercel deployment failures root-caused + fixed (2026-07-29)

Status: Resolved same-day. Briefly paused via vercel.json's git.deploymentEnabled: false after 2 consecutive preview-deployment failures with only a generic "Deployment has failed" message and no further detail from the GitHub Checks API. npx vercel inspect --logs needs an interactive account login unavailable in-session, so the actual fix came from noticing Vercel's buildCommand runs pnpm run build:edge (node scripts/build-edge.mjs β†’ vite build with DEPLOY_TARGET=edge) β€” a different command than the plain pnpm run build used for the earlier (misleading) local repro attempt, which succeeded and pointed away from a code cause. Reproducing the exact Vercel command locally (NODE_OPTIONS=--max-old-space-size=3072 pnpm run build:edge) immediately surfaced the real error: [MISSING_EXPORT] "ensureInferencePool" is not exported by "services/workerBusManager.ts" β€” services/ai/localEmbeddingService.ts (part of the in-flight worker-generation-consolidation migration, PR #288) imported and called a function that was never actually added to workerBusManager.ts. Vitest never caught it because localEmbeddingService.test.ts mocks the entire workerBusManager module (vi.mock(...) wholesale replacement), so the real file's missing export was invisible to that suite; tsgo's local typecheck also passed clean for reasons not fully understood (worth a follow-up look at cache behavior) β€” only rolldown's stricter static bundling in the real production build caught it. Fixed by adding the missing ensureInferencePool() (mirrors ensureDuckDbPool()'s shape) plus a workerBusManager.test.ts suite that imports the real module instead of mocking it β€” that suite would have caught this immediately. git.deploymentEnabled reverted to enabled; verified fixed via a clean local build:edge re-run before re-enabling.

Lesson for future Vercel-build debugging in this repo: always reproduce with the exact vercel.json buildCommand, not pnpm run build β€” they differ (build:edge sets DEPLOY_TARGET=edge and runs scripts/sync-deploy-base.mjs first) and a plain build passing does not prove the deploy build would.


v1.24.2 β€” CSP/crypto/doc-truth hardening (2026-07-29)

Status: Merged (PR #284) and released as v1.24.2 on 2026-07-29. Full record: docs/audit/WS-RUN-LOG-2026-07-29.md, docs/adr/0013-csp-wasm-and-blob-frames.md, docs/adr/0014-worker-generation-duplication.md. All 14 findings (F-01…F-14) code-complete β€” see AUDIT.md's new audit section for the finding table.

  • βœ… CSP functional truth β€” 'wasm-unsafe-eval' + frame-src blob: on all 5 surfaces; the local-inference stack (WebLLM/ONNX/Transformers.js/DuckDB-WASM/Whisper/Kokoro) had been silently broken in production for two months. New 3-layer CSP test architecture.
  • βœ… Desktop API-key encryption β€” PBKDF2 600k + random salt, replacing an unsalted single-SHA-256 scheme.
  • βœ… DuckDB-WASM self-hosted β€” replaced an unversioned, already-CSP-dead third-party CDN.
  • βœ… Doc-truth fixes β€” fabricated tauri-plugin-stronghold claim removed; canonical Vercel URL unified with a new drift gate; CI Storybook 3Γ—β†’1Γ— + a genuinely broken test-runner invocation fixed.
  • βœ… Coverage ratchet raised to CI-measured values (L79/F72/B65/S77).
  • βœ… Worker-generation consolidation (F-14) β€” the dedicated migration sprint docs/adr/0014-worker-generation-duplication.md deferred, executed as 4 stacked PRs: #286 (parity gate + real handler tests for the previously-untested v2 workers), #287 (DuckDB β€” duckdbClient.ts migrated, workers/duckdbWorker.ts deleted), #288 (embeddings β€” localEmbeddingService.ts migrated), #290 (NLP β€” localNlpService.ts migrated, workers/inference.worker.ts deleted, closing out v1 entirely). Decision record: docs/adr/0015-worker-generation-consolidation.md (supersedes 0014). Correction loops on #287/#288 surfaced and fixed real bugs the original v2 files had never been exercised against: DuckDB params were silently dropped (already live in telemetryService.ts's parameterized writes), terminatePool() could leave tasks hanging forever, a respawned DuckDB worker lost its connection, and ensureInferencePool() was imported but never defined (broke Vercel's prod build β€” see the entry below). Merge status: #286 merged; #287/#288/#290 open, stacked, CI green β€” merge in order before the next release.
  • βœ… Pre-existing, unrelated E2E a11y finding surfaced during this sprint's CI runs β€” tests/e2e/a11y.spec.ts "writer version control panel has no serious axe violations" failed deterministically (color-contrast 4.47 vs. 4.5 required, --sc-accent #92400e over its own /20-opacity background #e0cab0). Confirmed unrelated to the CSP/crypto sprint, but small and well-scoped, so fixed directly rather than deferred: components/writing/WriterViewUI.tsx's active-toggle classes reused --sc-accent for both background tint and text instead of the already-vetted --nav-background-active/--nav-text-active token pair; switched all 3 occurrences (Writer VC desktop/mobile + mobile ProForge, same shared pattern).
  • βœ… Tag v1.24.2 + publish the GitHub Release β€” stale entry, already done (verified via git tag/gh release list: v1.24.2 tagged and published 2026-07-29T11:25:42Z).

v1.24 β€” Post-release feature-flag refinement (2026-06-21)

  • βœ… ProForge β†’ opt-in β€” flipped enableProForge default to false (experimental, token-heavy); now 17 on / 6 off. Slice + tests + FEATURE-PARITY.md + CLAUDE.md updated in lockstep.
  • βœ… Feature catalog reconciled β€” featureCatalog.ts covers all 23 flags; defaultOn derived from the slice (drift now impossible, guarded by tests/unit/featureCatalog.test.ts); added risk/desktop/dependency metadata.
  • βœ… Grouped Settings UI β€” Experimental flags grouped by category with risk hints, dependency-aware disabling (Voice WASM β‡  Voice Support), "Desktop only" note (Rust Compute), and Reset-to-defaults.
  • βœ… WebNN flag decision β€” the ghost/stub enableWebnnInference toggle was retired (removed from featureFlagsSlice.ts's 22 flags); see tests/unit/featureFlagsSlice.test.ts:96 ("WebNN flag (a ghost/no-op toggle) was removed β†’ 22 flags"). This line was stale β€” reconciled 2026-07-29.
  • ⬜ CII Best Practices badge β€” removed from README.md (was a literal projects/XXXX placeholder β€” broken image, dead link). Register the project at https://bestpractices.coreinfrastructure.org/ (external, interactive signup β€” maintainer-only action), then re-add the badge with the real project ID.

v1.23 β€” P0 Audit Follow-up (DELIVERED 2026-06-16)

All P0 release-blockers closed and v1.23.0 shipped 2026-06-16. The only item still open is the human-only manual smoke-test sign-off (below). Forward-looking P1/P2 work has moved to the Upcoming β€” v1.24 / v2.0 Foundation block in ROADMAP.md. Archived v1.22 tasks β†’ docs/history/completed-v1.22.md.

P0 β€” Release-Blocker

  • βœ… ROADMAP/TODO sync β€” ROADMAP.md, TODO.md und AUDIT.md widerspruchsfrei auf v1.22.0 + v1.23-Ziele gebracht (2026-06-13). Vorheriger Drift: ROADMAP markierte alle P0 βœ…, TODO noch ⬜ β€” jetzt evidenzbasiert abgeglichen.
  • βœ… Tauri Desktop Pipeline final verifizieren β€” tauri-build.yml grΓΌn auf Ubuntu/macOS/Windows (Run #27439443241). Signing-Secret/Updater bleibt offen fΓΌr v* Releases (kein Secret fΓΌr workflow_dispatch).
  • βœ… Dependency-Hygiene β€” pnpm audit --audit-level=high und --audit-level=moderate β†’ 0 Vulnerabilities (verifiziert 2026-06-13). pnpm outdated neu erhoben: nur Patch/Minor-Drift, keine Majors. AUDIT.md Known Overrides Table aktualisiert: esbuild >=0.28.1-Row ergΓ€nzt, Platzhalter-CVE-Refs durch verifizierte Advisory-IDs ersetzt, Status-Datum auf 2026-06-13.
  • βœ… i18n Parity β€” pnpm run i18n:check grΓΌn (2590 Keys Γ— 11 Locales). ja/zh/pt/el + ar/he erreichen Projekt-Ziel ≀5 % EN-Placeholders; ar/he UI vollstΓ€ndig ΓΌbersetzt, native Review offen. --quality Scan zeigt zusΓ€tzliche "likely untranslated" EintrΓ€ge (v.a. technische Begriffe), die kein CI-Gate blockieren β€” siehe docs/V1.22-SMOKE-TEST.md fΓΌr manuelle Locale-PrΓΌfung.
  • βœ… Smoke-Test-Protokoll authored β€” docs/V1.22-SMOKE-TEST.md mit manuellen Szenarien fΓΌr alle v1.22-Features (AI-Modi, OpenRouter, Copilot v2, Voice-Download, PWA, Core, Tauri).
    • ⬜ Manuelle AusfΓΌhrung (Human-only): Protokoll gegen beide Live-Demos (GH Pages + Vercel) + lokalen Tauri-Build durchspielen und Sign-off-Tabelle ausfΓΌllen. Kein Code-Task β€” bleibt offen bis ein Tester die Matrix abhakt.
  • βœ… Plugin Sandbox post-fix validation β€” adversarial Worker-Tests ergΓ€nzt (WebAssembly-Denial, Generator/AsyncGenerator-Constructor-Escape, Guard-Restoration auf Success- und Error-Pfad) in tests/unit/workers/plugin.worker.test.ts (23 Tests grΓΌn). pluginRegistry.test.ts deckt Storage-Key-Validierung (Prefix/LΓ€nge/..-Traversal/Separatoren) + 2-MiB-Value-Cap bereits ab. Tracking + Follow-up FU-1 (Function.prototype.constructor Restore-Asymmetrie, low impact) in docs/AUDIT-PERFECTION-PLAN-v1.23.md.

P1 β€” Diese Woche

  • ⬜ Coverage-Ziele erreichen (Lβ‰₯85 %, Bβ‰₯75 %, Fβ‰₯80 %) β€” Fokus AI-Routing, Voice, Copilot.
  • ⬜ Local AI & Voice hΓ€rten (Whisper/Kokoro Low-End, Eco-Mode, RAM/GPU-Monitoring).
  • ⬜ Error Boundaries + Logging fΓΌr AI/Worker-Failures konsistent.
  • ⬜ Accessibility Deep-Dive (Keyboard + Screen-Reader).
    • βœ… AI Execution Mode section β€” Card shell, native ARIA radiogroup (arrow-key nav + roving tabindex), live-region announce, dynamic WebGPU/offline capability hints, full localization (AiModeIndicator hardcodes β†’ i18n, +7 keys Γ— 11 locales), new AiExecutionModeSection.test.tsx (10). (Delivered 2026-06-14 in feat/ai-execution-mode-perfection)
  • βœ… Command Palette Integration fΓΌr OpenRouter β€” ai.mode.openrouter.toggle (enable/disable provider + confirmation toast) und ai.mode.openrouter.resetCircuit (when-gated: nur sichtbar wenn OpenRouter aktiv und Circuit offen; ruft resetOpenRouterCircuit() + Toast). CommandRuntimeDeps.openRouterEnabled ergΓ€nzt (CommandPalette + App.tsx executeCommand). +5 i18n-Keys Γ— 11 Locales (palette.openRouter.*), +5 Tests in commandDefinitions.test.ts. lint/typecheck/i18n/tests grΓΌn. (Delivered 2026-06-14)

P2 β€” NΓ€chster Sprint

  • βœ… tests/unit/settings/openRouterSection.test.tsx β€” toggle, key input, model selector. (Delivered 2026-06-13 in feat/openrouter-section-perfection)
  • ⬜ pnpm exec tsx scripts/audit-feature-parity.ts β€” 0 drifts.

v1.24.1 β€” Local-AI reliability + Dependabot batch (2026-07-28)

  • βœ… Desktop Ollama/LM Studio/vLLM discovery fixed (#266) β€” vite.config.ts's rollupOptions.external was unconditionally externalizing @tauri-apps/* even for the Tauri desktop build itself, leaving services/localServerHttp.ts's @tauri-apps/plugin-http import unresolvable in the packaged .deb/.msi. Fixed via a shared isTauriBuild() check; see the 2026-07-28 update in ADR 0012.
  • βœ… Misleading "Ready" status badge for Ollama in the browser fixed (#266) β€” the status badge and the desktop-only banner were driven by two unreconciled state signals; badge now shows a distinct "Not available in browser" label. Scan also now prefers native /api/tags over the OpenAI-compat shim for Ollama.
  • βœ… Dependabot batch β€” 20 PRs resolved (16 merged, 4 closed as superseded) β€” 14 were straightforward bumps merged directly (Actions bumps, small JS/dev-tooling patches, Tauri/Rust crates, the tauri-deps group, and a stray log crate bump in /src-tauri, #246). The remaining 6 all had real breaking-change blockers, root-caused and fixed rather than force-merged or suppressed:
    • #255 / #249 / #253 / #250 (@ai-sdk/google/@ai-sdk/openai/@ai-sdk/react/ai major bumps) β€” @ai-sdk/google@4 alone emits LanguageModelV4, incompatible with the pre-upgrade ai package's LanguageModel type; root cause was a partial-family upgrade. Fixed by bumping all four together in PR #275 (feat/ai-sdk-v4-upgrade), which supersedes these 4 PRs β€” closed once #275 merged.
    • #252 (@biomejs/biome 2.4β†’2.5) β€” schema-version mismatch plus 2 real new lint findings (noUnsafeOptionalChaining Γ—4, noUndeclaredEnvVars Γ—21 via turbo.json globalEnv) fixed with real code changes, no suppressions; pushed directly onto the Dependabot branch.
    • #265 (dev-tooling group) β€” @babel/core@8 transitively broke react-docgen@8.0.3's Storybook build (loadPartialConfig removed); fixed by capping the existing pnpm-workspace.yaml override at <8, verified with a real build-storybook run; pushed directly onto the Dependabot branch.
  • βœ… Issue #60 (vendor-fork audit) β€” status comment posted confirming the audit is done (fork at 10.3.0-sc2, verify:vendor CI guard); issue stays open per its own "permanent reminder" note.
  • βœ… CLAUDE.md locale-count drift fixed β€” i18n section undercounted the locale roster (17 vs. the actual 19 β€” ru/ko were added in a prior PR but never reflected) and the per-locale module count (20 vs. 21).
  • βœ… pnpm run build warnings fixed β€” invalid [dir:ltr]/[dir:rtl] Tailwind arbitrary variant (compiled to the invalid CSS pseudo-class :is(dir:ltr)) replaced with the built-in ltr:/rtl: direction variants; 3 ineffective dynamic import() calls (already statically imported elsewhere) converted to static imports.
  • βœ… CodeRabbit findings that failed to post inline on PR #274 β€” a rate-limited re-review posted 10 findings as review-body text instead of formal threads (GitHub API error). Verified each against current code: 2 already fixed, 5 real (a11y + a genuine CWE-209 stale-request race in AiProviderCard.handleTest, an unsafe LocalServerError.message passthrough in ollamaService.ts, a loose test assertion) fixed with code + dedicated regression tests, 1 already resolved by an earlier commit, 2 judged already-adequately-covered by existing comments.
  • ⬜ Re-open: native Intel-Mac (x86_64) desktop builds β€” the macos-13 hosted runner (added to tauri-build.yml's matrix for this) never actually provisions a runner; the job sits in GitHub's queue indefinitely instead of starting, so 3 consecutive tagged-release builds each hung the full ~24h queue ceiling and blocked the entire release (the release job's needs: [bundle] only resolves once every matrix leg reaches a terminal state) even though Ubuntu/Windows/macOS-ARM finished in ~12 minutes. Removed macos-13 from the matrix on 2026-07-28 (see docs/TAURI-CI.md); Intel Mac users get no native build/auto-update until a working runner option is found (self-hosted, macos-latest-large, or a replacement GitHub-hosted Intel image).

Dependency-Hygiene Backlog (carried forward)

pnpm-workspace.yaml hardening (strictDepBuilds: true, blockExoticSubdeps: true, minimumReleaseAge: 10080) is active. pnpm audit --audit-level=high β†’ 0 vulnerabilities; pnpm audit --audit-level=moderate β†’ 0 vulnerabilities. Aktueller Status in AUDIT.md Β§ Known Overrides Table.

  • ⬜ pnpm override housekeeping β€” nach @storybook/test-runner Upgrade auf jest-process-manager 1.x (drops wait-on@7), direkten Lockfile-Patch auf joi entfernen.
  • ⬜ Renovate grouping β€” @storybook/* bumps atomisch upgraden.
  • ⬜ Moderate audit threshold β€” CI pnpm audit --audit-level von high auf moderate anheben, sobald joi/wait-on aus dem dep tree sind.

v1.21.0 β€” Integrity & Hardening Cycle (2026-06-10) β€” DELIVERED (PR #104, merged)

Master Plan: .claude/plans/master-prompt-worldscript-studio-glistening-pnueli.md (Deep Audit 2026-06-09, findings F-1…F-9). NOTE: prior sprint blocks are retained inline below (file convention), not moved to docs/history/.

WS β€” Integrity & Hardening

  • βœ… WS-1 (F-1/F-3/F-5, bc53bbc) β€” README badge v1.21.0β†’v1.20.0 + metrics (433 test files / 2 357 i18n keys); 28 misfiled CHANGELOG entries migrated [Unreleased]β†’[1.19.0]; this TODO rollover.
  • βœ… WS-2 (F-2, 5e7e49e) β€” CSP connect-src Option B: removed redundant cloud endpoints, kept https: for shipped BYOK; ADR-0004 + tests/unit/csp.test.ts (6/6); Tauri CSP stays strict.
  • βœ… WS-3 (F-6, 6ce236f) β€” @huggingface/transformers 4.2.0 verified against ai-core/voice: APIs unchanged, typecheck clean, 63 tests green; no source change.
  • βœ… WS-4 (F-4, f3cc74f+6cc3e7d) β€” suppression-debt ratchet gate (scripts/check-suppressions.mjs, baseline 181) wired into CI; abated 22 noExplicitAny (3 production + 19 test mocks β€” services/ had none) β†’ baseline 159.
  • βœ… WS-5 (F-8, 8e5bd4a) β€” bundle-budget single source of truth: --max-kb 6500 --max-entry-kb 4000, script defaults aligned; corrected the inaccurate "~4000 KB entry" claim (real entry β‰ˆ 496 KB).
  • βœ… WS-6 (F-7/F-9, 3e0aa82) β€” VENDOR-FORKS.md CVE/OSV-coverage section (vendored y-webrtc invisible to OSV β†’ manual process) + new docs/COVERAGE-POLICY.md ratchet rule.

Carried over from v1.20.0

  • βœ… P1-1 β€” WebLLM Worker Offload (ADR-0005): dedicated WorkerBus v2 webllm pool (workers/v2/webllm.worker.ts, capability inference.webllm); generateLocalText is worker-first with automatic main-thread fallback (NO_WEBGPU / spawn fail / circuit-open), decoupled from enableWorkerBusV2 via ensureWebLlmPool(); GPU mutex + tab election stay main-thread; progress bridges to inferenceProgressEmitter. Tests: webllmWorkerHandler.test.ts + updated localAiFacade.test.ts.
  • βœ… P1-2 β€” Whisper WASM STT end-to-end: download UI βœ… + VADβ†’STT bridge βœ… + E2E βœ… β€” deterministic deep suite tests/e2e/deep/voice/whisper-stt.spec.ts (download progress/cancel/errorβ†’retry, STTβ†’intentβ†’command, stop-listening) via guarded seam services/voice/voiceTestSeam.ts; nightly real-inference voice-nightly.yml + whisper-real.spec.ts. Remaining (follow-up, both CI/Playwright-only β€” cannot be reproduced or verified on the constrained local host): (a) real-audio transcription assertion needs a committed speech WAV driven via --use-file-for-fake-audio-capture (a valid speech fixture can't be generated offline here); (b) two STTβ†’command navigation deep tests are test.fixme β€” the headless mock-STT β†’ push-to-talk β†’ command-dispatch chain doesn't fire reliably under fake-media. Re-enable after capturing a Playwright trace of the CI voice-init sequence. The covered substitute is explicit unit coverage of the service chain: transcriptβ†’intentβ†’voice-command CustomEvent (tests/unit/services/voice/voiceDownloadAndIntent.test.ts processTranscript β€” asserts the dispatched commandId) + the App-level voice-commandβ†’executeCommandβ†’runCommandById bridge (App.tsx:512). Consent clarity DONE (v1.24.0, PR D): the misleading "all voice runs locally" intro is corrected and a per-engine cloud-vs-on-device privacy note now renders beside the STT engine selector (settings.voice.engine.privacyNote, 17 locales).
  • βœ… P1-7 β€” Bundle Budget single source of truth (F-8): package.json bundle:budget = --max-kb 6500 --max-entry-kb 4000; scripts/check-bundle-budget.mjs defaults match. Real sizes (CI 2026-06-09): entry index-* β‰ˆ 496 KB; largest vendor chunk lib-* β‰ˆ 6 054 KB (~446 KB headroom under the 6500 per-chunk ceiling). Superseded 2026-06-14 by PR #130 β€” budget tightened to --max-kb 6200 --max-entry-kb 2500; lib-* split into named vendor-webllm (~6.0 MB, binding constraint) / vendor-onnx / vendor-transformers chunks. See AUDIT.md Β§ v1.23 Bundle Split.
  • ⬜ P2-2..P2-4 β€” v2.0 foundation (Cloud-Sync conflict resolution, Plugin Registry Beta, ADRs 0005+).

v1.20.0 β€” Deep Correction & Release Hardening (2026-06-06)

Master Plan: docs/AUDIT-2026-06-06-Deep-Correction-Plan.md (aus .kimi/plans/obsidian-swamp-thing-tempest.md)

P0 β€” Release Unblock

  • βœ… P0-1 β€” Tauri Desktop Pipeline: pnpm config migration + signing fix + production hardening audit. Vercel green; CI Quality Gate running; Tauri builds active with new signing key. Commits 946045e–9d222c3.
  • βœ… P0-2 β€” Coverage C-7: 96 neue Tests geschrieben (Ziel 90 ΓΌbertroffen).
    • LoRA: datasetBuilder (19) + evaluationService (16)
    • Voice: intentEngine (17) + feedbackService (23) + audioNavigator (21)
  • βœ… P0-4 β€” Native File Associations + Single-Instance: .worldscript/.scst extensions registered, deep link handler in services/tauriDeepLink.ts, Rust RunEvent::Opened/RunEvent::SecondInstance handlers in lib.rs.
  • βœ… P0-3 β€” Quality Gates stabil: lint βœ… Β· typecheck βœ… Β· i18n:check βœ… Β· parity:check + bundle:budget + smoke:prod green on main (CI confirmed through PR #103, merged 2026-06-09).

P1 β€” AI Resilience & Core Reliability

  • πŸ”„ P1-2 β€” Whisper WASM STT end-to-end: Download UI βœ… (v1.21, 2026-06-09) Β· VADβ†’STT bridge βœ… (2026-06-09) β€” VoiceActivityCoordinator wires WebRtcVadEngine PCM frames into WasmSttEngine; MIN_SPEECH_CHUNKS gate + MAX_BUFFER_MS flush; voiceCommandService routes through coordinator when enableVoiceWasm + whisper active. 12 unit tests. Remaining: full E2E integration test (CI-only)
  • βœ… P1-3 β€” Redux-Undo Γ— Zustand Race Condition: manuscriptPinnedBinderNodeId reconciler in listenerMiddleware.ts β€” prΓΌft nach project save/undo/redo/import ob pinned node noch existiert, reset auf null wenn stale. Commit a799bc9.
    • Hinweis: Rust TaskSupervisor UI (ManuscriptStatsPanel) ist separat in WorkerBus v2 Phase 3 (siehe unten).

P2 β€” Global Readiness & i18n

  • 🟒 Language expansion β€” 6 neue Locales (11 β†’ 17): fi/sv/hu/is/eu (Beta) + fa (RTL, Persisch). Infra + Glossar (v2.0, ~44 Anker-Begriffe), Priority-Files hand-ΓΌbersetzt; alle ΓΌbrigen Module bulk-ΓΌbersetzt (glossar-verankert, Placeholder-maskiert) β†’ ~96-100 % ΓΌber alle 10 Beta-Locales. glossaryTranslate Partial-Match-Bug behoben (jetzt Exact-Match-only; ~1.300 teil-englische Strings neu ΓΌbersetzt). Offen: menschliche Native-Review (Checkliste in docs/TRANSLATION-GUIDE.md Β§6). Siehe docs/LANGUAGE-EXPANSION-2026.md.
  • βœ… P1-5 β€” Beta-Sprachen ja/zh/pt/el ≀ 5% English-Placeholders erreicht (verifiziert 2026-06-09: pt 2.2% Β· el 2.8% Β· ja 0.9% Β· zh 0.5%). Tooling: scripts/bulk-translate-locales.mjs (Google-Translate-Endpoint mit Rate-Limiting/Retry/Checkpointing/Glossary) + locales/translation-glossary.json + docs/BULK-TRANSLATION.md. Command: node scripts/bulk-translate-locales.mjs --lang=ja,zh,pt,el --all --delay=400.
  • βœ… P1-4 β€” Error Boundaries + Logging: Alle 19+ Views in App.tsx mit ErrorBoundary/ViewErrorBoundary gewrappt (WelcomePortal frΓΌher Return-Path + alle Modals/Portals). Commits f810d51 + 6305d64.

P3 β€” Architektur-Hardening & Performance

  • βœ… P1-6 β€” Race-Condition Audit: Redux-Undo + Zustand reconcile (listenerMiddleware.ts clears manuscriptPinnedBinderNodeId when node no longer exists after project change/undo/redo). Commit a799bc9.
  • βœ… P1-7 β€” Bundle Budget: ceilings unified in one place (bundle:budget = --max-kb 6500 --max-entry-kb 4000; script defaults match). Correction: the prior "~4000 KB Entry (nahe Limit)" note was inaccurate β€” the index-* entry is ~496 KB; the binding constraint is the lib-* vendor chunk (~6 054 KB vs the 6500 per-chunk ceiling). See WS-5 / F-8.
  • ⬜ P2-1 β€” Error Boundaries + Logging: Alle 19 Views, Kein console.error

P4 β€” v2.0 Foundation

  • ⬜ P2-2 β€” Cloud-Sync Conflict Resolution
  • ⬜ P2-3 β€” Plugin Registry Beta
  • ⬜ P2-4 β€” ADRs 0004/0005 + CLAUDE.md/AGENTS.md Update

v1.20.0 β€” CI Hardening + AI Core + Local AI Perfection (2026-06-01)

  • βœ… pnpm lockfile sync β€” @xenova/transformers β†’ @huggingface/transformers@^3.8.1; ERR_PNPM_OUTDATED_LOCKFILE blocked all CI runs
  • βœ… 14 CodeAnt AI issues fixed β€” webllm dispose on eviction, releaseWebLlm both variants, await releaseAllOnnxSessions, computeShaderFactory race condition, localAiDeviceProfiler backend recommendation, adaptiveAiEngine task field, telemetryService feature flag gate, window guards, AiSections conditional mount, AdaptiveAiHardwarePanel i18n (2160 keys Γ— 5 locales)
  • βœ… E2E stabilisation (24 β†’ ~0 failures) β€” VRT baselines, WelcomePortal contrast, waitForSpaReady theme-wait, seedGeminiApiKey role=switch fix, SceneBoard ARIA (toolbar/li), LoRA wizard skip, a11y locators, export localStorageOnly
  • βœ… Local AI Perfection β€” Phase 1 + 2.1 complete β€” IDB session lock + key rotation, Silero VAD + Kokoro TTS async, GPU diagnostics, real text-gen pipelines, AbortSignal
  • βœ… Scorecard Pinned-Dependencies #72 β€” graphifyy pip install pinned by SHA256 hash
  • βœ… prune-deployments.yml β€” all-environment pruning (Production/Preview/github-pages); 156 records deleted; github-script v7β†’v9 (node24)
  • βœ… Storybook cloud-first CI β€” storybook-debug.yml (manual dispatch), Playwright browser cache v5 (node24)
  • βœ… Local AI Perfection Phase 2.2 β€” LoRA productionization (2026-06-02): LoraView container assembles library/dataset/evaluation/wizard behind LoraViewContext; gated lora route in App.tsx; conditional sidebar nav (enableLoraAdapters); View/APP_SECTIONS/viewNavigationLabels/LORA icon/sidebar.lora (7 locales); lora-wizard.spec.ts re-enabled; LoraView unit test
  • βœ… AI retry/fetch hardening (2026-06-02) β€” aiRetry exponential backoff + jitter + Retry-After (P1-F5); fetchAdapter opt-in streaming-safe timeout (P1-F6)
  • πŸ”„ Local AI Perfection Phase 2.3 β€” Performance hardening. βœ… (2026-06-02) Pipeline LRU cache unified into services/ai/pipelineLruCache.ts (was duplicated in workers/inference.worker.ts + workers/v2/inference.worker.ts); adds dispose-on-evict (closes VRAM/RAM leak) + in-flight load dedup; 9 deterministic tests. ⬜ Remaining: WebLLM worker offload, LRU result-pipeline warmup tuning
  • πŸ”„ Local AI Perfection Phase 2.4 β€” Coverage. Correction: sileroVadEngine.ts (5 tests) + kokoroTtsEngine.ts already had tests since 2026-05-31 (TODO "0 tests" was stale). βœ… (2026-06-02) Filled real Kokoro gaps β€” cancel()/pause()/resume()/dispose() + no-WebAssembly branch (+4 tests β†’ 10). Inference-worker LRU now covered via pipelineLruCache.test.ts (13). ⬜ Remaining: threshold bump to CI-measured floor
  • βœ… OpenRouter Settings Section hardening (2026-06-13) β€” searchable design-system Select, authenticated model catalog fetch/cache, key validation/test-connection, full i18n (38 new keys Γ— 11 locales), ViewErrorBoundary wrapping, 10 OpenRouterSection unit tests + 12 openrouterModels tests + 4 provider tests. All 11 CodeAnt AI inline comments addressed (free-model i18n, cloud AI policy gates, cache validation, Escape propagation, authenticated catalog, error-resilient Select, re-fetch on credential change). PR feat/openrouter-section-perfection.
  • βœ… WorkerBus v2 Phase 1 β€” @domain/worker-bus package: typed worker pool, circuit breakers, dead-letter queue, priority task queue, progress emitter, protocol handler; 123 tests / 12 suites; 84.5% coverage
  • βœ… WorkerBus v2 Phase 2 β€” runtime wiring complete (2026-06-02): workerBusManager (singleton lifecycle), hybridRouter (web/Rust routing), legacyWorkerBusAdapter (ai-core shim), tauriTaskBridge (Tauri invoke); feature flag UI exposed; listenerMiddleware listeners; 154 combined tests; Rust backend stub deferred to Phase 3
  • βœ… WorkerBus authoritative scheduler hotfix (2026-08-01) β€” completed tasks drain from the live queue; dispatch honors priority/FIFO and pool capacity; pool waits are event-driven; queue wait is covered by the progress-rearmed inactivity watchdog; critical work has a hard eight-task reserve.
  • πŸ”„ WorkerBus v2 Phase 3 β€” Rust TaskSupervisor. βœ… (2026-06-03) src-tauri/src/commands/task_supervisor.rs + commands/mod.rs; worldscript_task_supervisor_ping (version) + worldscript_task_supervisor_submit (taskType dispatcher, honest success:false on unknown/bad payload) registered in lib.rs. First real compute task text.analyze (word/char/sentence/syllable counts + Flesch Reading Ease, pure-Rust, 8 #[cfg(test)] tests). TS front-end services/rustTaskSupervisor.ts (analyzeTextViaRust β€” probes isRustComputeAvailable before routing so a Rust-only task never hits the web pool; null β†’ JS fallback) + 5 unit tests. ⬜ Remaining: full cargo build/desktop verification (CI/Tauri β€” heavy locally); wire a real UI consumer (analytics/progress health); add more native tasks; candle rust-compute feature inference path
  • πŸ”„ C-7 β€” Coverage L85%/B75%/F80%; Stryker break 75β†’80
    • βœ… Stryker Config: concurrency 3, timeoutFactor 1.5, reporters [progress,json], tempDirName, slow warnings
    • βœ… Matrix-Parallelisierung: 5 Jobs (services-commands, services-core, services-ai, features-project, features-misc)
    • βœ… Incremental Caching pro Modul (actions/cache) mit force/incremental Mode-Switch
    • βœ… Timeout: 30 min pro Job (statt 45 min single job)
    • βœ… Aggregate Job mit kombinierter Summary-Tabelle
    • ⬜ Erste Test-Run auf GitHub Actions dispatchen und validieren
    • ⬜ Neue Dateien zur mutate-Liste hinzufΓΌgen (nach lokalem Test)
  • πŸ”„ C-6 β€” ar/he Beta shipped (2026-06-03): all 18 UI modules fully translated (ar + he), Noto Sans Arabic/Hebrew + Naskh fonts wired, [dir="rtl"] CSS net + shell logical-property conversion + canvas LTR islands, WelcomePortal ar/he selectors, "(Beta)" labels retained. i18n:check now validates ar/he parity (2259 keys Γ— 7 locales). Help Center gained an Advanced & Power Features category (8 articles, en/de/fr/es/it; ar/he English fallback) + 3 offline RAG chunks; in-app Settings Guide now documents every live category (Fine-Tuning/LoRA, Community, Plugins). ⬜ Remaining: native-speaker review + help.json long-form prose (English fallback for Beta) β€” community follow-up

v1.19.0 β€” Phase 2: B-Series Sprint (RELEASED 2026-05-28)

  • βœ… B-1 β€” services/storage/storageEncryptionService.ts β€” AES-256-GCM IDB at-rest encryption; PBKDF2 (310k iter), 32-byte random salt, extractable: false; enableIdbAtRestEncryption flag
  • βœ… B-2 β€” services/voice/wasmSttEngine.ts + sileroVadEngine.ts β€” Whisper WASM STT scaffold + Silero VAD v4 via ONNX; enableVoiceWasm flag
  • βœ… B-3 β€” packages/collab-transport β€” vendor fork of y-webrtc 10.3.0 with RTCDataChannel E2E encryption baked in (replaces pnpm patch approach)
  • βœ… B-4 β€” tests/e2e/a11y-axe.spec.ts β€” 8-view axe-core WCAG 2.2 AA E2E gate (CI-enforced, zero violations)
  • βœ… B-5 β€” locales/ar/ + locales/he/ locale stubs; enableRtlLayout flag activates html[dir="rtl"] + BiDi context provider
  • βœ… B-6 β€” services/logger.ts StructuredLogger rewrite β€” IDB sink (1 000-entry LRU), Tauri JSONL sink, GDPR sanitizeLogContext; createLogger(module) + .withContext(ctx) API
  • βœ… B-7 β€” Coverage thresholds raised: L 71 / F 63 / B 57 / S 69 (measured: 73/65/58/71)
  • βœ… B-8 β€” Stryker break 70β†’75; mutate targets 34β†’40 files
  • βœ… Docs β€” docs/SPRINT-HANDOFF-2026-05-28.md, CHANGELOG [1.19.0], ROADMAP, TODO, README, CLAUDE.md, SECURITY.md, IDB-ENCRYPTION.md, VOICE_MASTER_PLAN.md all updated
  • βœ… Quality gate β€” lint βœ… Β· typecheck βœ… Β· i18n:check βœ… Β· tests βœ…

Phase 3 β€” v2.0 Foundation (ACTIVE 2026-05-28)

  • βœ… C-1 β€” packages/collab-transport/src/crypto.js security hardening: PBKDF2 100kβ†’310k, extractable:false, return promise.reject() fix
  • βœ… C-2 β€” Reference plugins: services/plugins/wordCountOverlay.plugin.ts + sceneAppender.plugin.ts (8 tests) + runtime flag gate (2026-05-29)
  • βœ… C-3 β€” LoRA Ollama wiring: LoraAdapter.ollamaModelTag, AIRequestOptions.loraModelPath, selectActiveLoraOllamaTag; parity fix (2026-05-29): selector now wired into useWorldScriptAI + worldScriptCompletionFetch
  • βœ… C-4 β€” Cloud-Sync verified: services/cloudSync/ (3 files, 41 tests, AES-256-GCM); create() structural flag gate added (2026-05-29)
  • βœ… C-5 β€” GitHub Issue Templates (bug_report.yml, feature_request.yml, translation_pr.yml) + AGENTS.md hardening
  • βœ… Feature Parity Audit (2026-05-29) β€” 8 critical drifts fixed; docs/FEATURE-PARITY.md + features/featureCatalog.ts + scripts/audit-feature-parity.ts
  • βœ… C-7 partial (2026-05-28) β€” +130 tests; thresholds raised L73/F65/B58/S71; 4 192 tests / 392 files
  • βœ… Codespace Uplift (2026-05-30) β€” CLAUDE.md environment-aware shell rules; devcontainer re-activated (8-core/16GB); .devcontainer/README.md Modus Operandi section REVERTED β€” DevContainer/Codespaces config removed; local low-end hardware only
  • βœ… Vercel blank screen fix (2026-05-30) β€” index.html %BASE_URL% for manifest/favicon/og; index.tsx error safety net; 382 test files / 4567 tests all green
  • βœ… Production blank screen β€” zod/rolldown DCE (2026-06-02) β€” init_locales is not defined: rolldown's prod DCE dropped zod's __esm init wrappers (zod sideEffects:false). Fixed via patches/zod@4.4.3.patch (sideEffects:true). Added smoke:prod (headless mount check on built dist/) to CI build job + unhandledrejection startup handler β€” closes the dev-mode-E2E blind spot
  • πŸ”„ C-6 β€” ar/he UI translation complete (2026-06-03): 18 modules translated in locales/{ar,he}/ (help.json English fallback), Noto fonts + RTL shell layout shipped as Beta. Remaining: native-speaker review + help-article prose β€” community task. See docs/I18N-GLOSSARY-RTL.md
  • πŸ”„ C-7 remainder β€” Coverage β†’ L85%/B75%/F80%; Stryker break 75β†’80 (current thresholds: L73/F65/B58). Phase 3 started (2026-06-02): +33 LoRA tests (useLoraView, training wizard, sub-panels β€” were 0%)
  • 🟑 IDB at-rest encryption lifecycle (2026-08-11 reconciliation) β€” startup unlock, session lock, fail-closed protected writes, and a versioned single-owner migration journal are implemented. Disable, forgot-passphrase deletion, and passphrase rotation are intentionally blocked until per-store conversion, verification, cross-tab recovery, and recovery UX exist; do not describe them as completed.
  • βœ… P0-2 β€” Plugin worker isolation (workers/plugin.worker.ts) β€” routes plugin execution to isolated worker context with timeout and sandboxed API
  • 🟑 P0-4 β€” DuckDB OPFS at-rest encryption (services/duckdb/duckdbEncryption.ts) β€” cell-level encryption is now wired for the one column holding literal manuscript prose, codex_mentions.excerpt (v1.25.0): duckdbCodexWrite() encrypts it into excerpt_enc BLOB when enableIdbAtRestEncryption is active, with services/duckdb/codexExcerptEncryptionMigration.ts backfilling pre-existing plaintext rows. Full OPFS file-level encryption remains infeasible (DuckDB-WASM owns the OPFS file handle directly) and is an accepted, permanent limitation, not a remaining task β€” see .github/SECURITY.md SEC-6.
  • βœ… P0-5 β€” Voice WASM model download UI (components/voice/VoiceModelDownloadModal.tsx) β€” progress modal for Whisper/Kokoro model downloads with cancel/retry
  • πŸ”„ Whisper WASM STT model download + inference pipeline (B-2 continuation) β€” engine (services/voice/wasmSttEngine.ts) + download UI (P0-5 above) shipped; remaining scope narrowed to E2E integration test coverage only β€” stale ⬜ reconciled 2026-07-30.
  • πŸ”„ Kokoro/Piper TTS WASM engines β€” Kokoro DONE (services/voice/kokoroTtsEngine.ts, tested since 2026-05-31); Piper remains an unimplemented type-level placeholder only (preferredTtsEngine: 'piper' in voiceCommandService.ts has no backing engine file) β€” stale ⬜ reconciled 2026-07-30.
  • ⬜ PLANbib v1.7 features (Objects β†’ MindMap β†’ Interviews β†’ Timeline β†’ Wizard β†’ Analysis β†’ ReadMode β†’ Guide β†’ Desktop) β€” 9 phases, go-ahead from user required

v1.18.1 β€” TypeScript strict-mode compliance sweep (2026-05-27)

  • βœ… All pre-existing TypeScript errors fixed β€” zero tsc --noEmit errors across 47 changed files
  • βœ… BaseAgent.buildAiOpts() β€” new protected helper derives valid AIRequestOptions (model + provider) from PipelineConfig; applied to all 7 pipeline agents + selfReflect()
  • βœ… Voice components β€” VoicePrivacyConsentModal + VoicePrivacyStatus import paths, action names, and selector names corrected
  • βœ… versionControlSlice β€” added stub restoreSnapshot reducer (typed cross-slice signal)
  • βœ… 35+ test fixture corrections β€” StorySection shape, AiModel/Theme/MindMapNodeType/StoryObjectType literals, PrivacySettings required fields, DeviceHealthReport shape, FlatHelpArticle.contentKey
  • βœ… Quality gate β€” lint βœ… Β· typecheck βœ… Β· i18n:check βœ… Β· tests βœ…

v1.18.0 β€” ProForge Humanization & Refinement Sprint (RELEASED 2026-05-27)

  • βœ… Phase H β€” Author-facing vocabulary: stage labels, loading messages, RAG "passages" rename, flag descriptions, behavioral tests
  • βœ… Phase A β€” BaseAgent abstract class (~200 LOC removed); aiConstants.ts consolidation; addDebouncedListener factory in listenerMiddleware.ts
  • βœ… Phase P-1 β€” SupervisorAgent: heuristic quality gates (no AI calls), fallback sentinel detection
  • βœ… Phase P-2 β€” Orchestrator executeStageWithSupervision retry loop; hard gate: intake qualityScore < 30
  • βœ… Phase P-3 β€” BaseAgent.selfReflect() self-evaluation loop; DiagnosticAgent + StructuralAgent re-run on INCOHERENT flag
  • βœ… Phase P-4 β€” Honest fallbacks: all createFallback* use 0 scores + isFallback: true
  • βœ… Phase P-5 β€” PipelineReviewPanel redesign: Critical Actions card, severity-grouped view, Quick Accept High-Confidence button
  • βœ… Phase X-1 β€” Settings nav semantic grouping: NAV_GROUPS + NavGroupHeader
  • βœ… Phase X-2 β€” Flow Mode: transientUiStore flowMode/setFlowMode; Escape exits
  • βœ… Phase X-3 β€” Empty states for Characters, World, SceneBoard, ProForge views
  • βœ… i18n parity β€” 2055 keys Γ— 5 locales; proforge.pipeline.title/noneActive added to DE/ES/FR/IT
  • βœ… Test fixes β€” 84 previously-failing tests green: listenerMiddleware (sync getOriginalState), WriterViewUI (context mock), ProForgeDashboard (i18n key assertion), 3Γ— thunk files (aiPolicy mock)
  • βœ… Quality gate β€” lint βœ… Β· i18n:check βœ… Β· typecheck βœ… Β· tests βœ… (84 tests recovered, 0 regressions)

Coverage Sprint β€” Test Expansion + Maintenance (2026-05-26)

  • βœ… 89 new test files β€” settings, writing, manuscript, mind-map, ui, services, hooks, root components
  • βœ… ~400 new unit tests β€” AiScratchpad, ContextPanel, ToolInputs, InspectorPanel, NavigatorPanel, MindMapNodeEditor, MindMapNodeShape, ecoModeService, creativityTemperature, useCharacterInterviewsView, GpuMetricsPanel, FeatureFlagsSection, PrivacySection, SettingsOverviewCard, SettingsModals, + 70 more modules
  • βœ… Biome lint clean β€” 895 files, 0 errors
  • βœ… Total test files: 360 (was 178 files before this sprint)
  • βœ… ProForge test suite TypeScript errors fixed β€” 15 test files, 30+ TS errors resolved (EntityState, ProForgeState shape, PipelineStage/ReviewItemType/ReviewItemSeverity casts, i18n generic mock, biome-ignore placement)
  • βœ… Coverage Sprint test failures fixed β€” NotificationsSection (role=switch), Progress (CSS selector), ManuscriptEditor (word count regex), AnalyticsBootstrap (mock reset), ragPromptAssembly (token budget)
  • βœ… Dependencies updated β€” 16 packages (patch + minor); pnpm audit: 0 vulnerabilities
  • βœ… Coverage (2026-05-26): Stmts 71.29% / Branches 58.79% / Funcs 65.18% / Lines 73.06% β€” all CI thresholds passed (Sβ‰₯67/Bβ‰₯55/Fβ‰₯60/Lβ‰₯68); 4 044 tests / 360 files, 0 failures

v1.17 β€” Voice Full Support Foundation (RELEASED 2026-05-24)

  • βœ… Abstract Engine Interfaces β€” SttEngine, TtsEngine, VadEngine, WakeWordEngine, IntentEngine in services/voice/voiceTypes.ts
  • βœ… Web Speech API Fallbacks β€” WebSpeechSttEngine, WebSpeechTtsEngine, WebRtcVadEngine, EnergyThresholdWakeWordEngine (immediately available, 0 downloads)
  • βœ… Hybrid Intent Engine β€” template matching (exact) β†’ Jaccard fuzzy scoring β†’ slot extraction (navigation); view-context filtering; 25 static voice commands
  • βœ… VoiceCommandService β€” singleton orchestrator with state machine (idle β†’ listening β†’ processing β†’ speaking β†’ idle)
  • βœ… Redux State β€” voiceSlice (mode, transcript, processing, dictation, engine status, microphone permission, onboarding); VoiceSettings in settingsSlice; enableVoiceSupport in featureFlagsSlice
  • βœ… React Hooks β€” useVoice (service bridge), usePushToTalk (Ctrl+Shift+V), useVoiceDictation (editor insertion), useVoiceAccessibility (ARIA + focus)
  • βœ… UI Components β€” VoiceIndicator (status overlay), VoiceControlPanel (command panel), VoiceSettingsSection (settings tab with onboarding)
  • βœ… App Integration β€” App.tsx (conditional rendering, document.body.dataset['view'] for intent engine), Header.tsx (voice status), ManuscriptEditor.tsx (dictation support)
  • βœ… Audio Navigator β€” audioNavigator singleton: ARIA landmark scanning, focus management, aria-live regions
  • βœ… Feedback Service β€” 3 verbosity levels (minimal/standard/verbose); TTS queue; event listeners for visual feedback
  • βœ… i18n β€” 2025 keys Γ— 5 locales (voice.* settings added)
  • βœ… Tests β€” 83 unit tests / 9 test files (voiceSlice, intentEngine, feedbackService, sttEngine, ttsEngine, vadEngine, wakeWordEngine, audioNavigator, commandVoiceMappings)
  • βœ… Quality gate β€” lint βœ… Β· i18n:check βœ… Β· typecheck βœ… Β· 83/83 voice tests βœ…

DevEx β€” Dual-Graph Integration (2026-05-24)

  • βœ… CodeGraph Setup β€” global install, codegraph init -i, .codegraph/ solo-repo policy
  • βœ… pnpm Scripts β€” codegraph:* + graphs:update + codegraph:affected
  • βœ… VS Code: Tasks β€” CodeGraph status/update/report + Dual-Graph update
  • βœ… Documentation β€” docs/codegraph.md, docs/dual-graph-setup.md, README Hub, CONTRIBUTING
  • βœ… Agent Instructions β€” CLAUDE.md + .github/copilot-instructions.md CodeGraph rules
  • βœ… Automation β€” scripts/codegraph-report.mjs, scripts/dual-graph-update.mjs, scripts/pre-commit-codegraph.mjs
  • βœ… CI-AUDIT.md β€” graphs:update as post-feature repo policy
  • βœ… Quality gate β€” lint βœ… Β· Biome ignores .codegraph/ βœ…

v2.0 Open Items

  • βœ… Full RTCDataChannel in-flight E2E encryption (Yjs y-webrtc patch) β€” DONE, vendor fork packages/collab-transport (y-webrtc 10.3.0, C-1); see its AUDIT.md ("RTCDataChannel payloads are now E2E-encrypted when room.key is set") β€” stale ⬜ reconciled 2026-07-30.
  • πŸ”„ RTL language support (Arabic, Hebrew, Persian) β€” Beta shipped behind enableRtlLayout (B-5); see the more current "C-6" entry above for the ar/he UI-translation detail and remaining native-speaker-review scope β€” stale duplicate ⬜ reconciled 2026-07-30.
  • βœ… Fine-tuning / LoRA support for personalized writing styles β€” DONE, enableLoraAdapters shipped default-on (Settings β†’ AI β†’ Fine-Tuning, Ollama Modelfile activation) β€” stale ⬜ reconciled 2026-07-30.
  • ⬜ Cloud sync (optional, E2E-encrypted)
  • βœ… DS-5: Delete legacy bridge block from index.css (after DS-1 verified in production) β€” DONE: bridge block already removed in prior sprints; remaining aliases (--nav-*, --glass-*, --border-interactive, --ring-focus) are intentional semantic tokens, not legacy bridges.

v1.20.0 β€” UI Modernization Phase 1 (IN PROGRESS)

  • βœ… LanguageSelector β€” Modern combobox with search, flag emojis, RTL support
  • βœ… RadioGroup β€” Accessible radio group component
  • βœ… Tabs β€” WAI-ARIA compliant tabs component
  • βœ… ToggleSwitch β€” RTL-aware with reduced-motion support
  • βœ… WelcomePortal β€” Updated to use new LanguageSelector
  • πŸ”„ Select/Combobox β€” Design-system Select extended with optional searchable filtering; OpenRouter section migrated. Remaining: replace native <select> in other Settings/AI sections incrementally.
  • ⬜ Dropdown Menu β€” Action menus with icons and keyboard navigation
  • ⬜ Unit tests β€” Add tests for LanguageSelector, RadioGroup, Tabs
  • ⬜ Storybook stories β€” Add stories for new components
  • ⬜ CI verification β€” Wait for green CI before merge

v1.11 β€” Stabilization Sprint (RELEASED 2026-05-22)

  • βœ… Cloudflare deploy fix (P0) β€” resolve-deploy-base.mjs base β†’ deployBase; sync-deploy-base.mjs error propagation
  • βœ… services/dbInitialization.ts β€” initializeStorage() + resetAllDatabases() extracted from inline IIFE
  • βœ… StorageBackend retries β€” retryDb() applied to saveProject + saveSettings in dbService.ts
  • βœ… StorageErrorScreen recovery UI β€” index.tsx shows React component with Reload + Reset on DB init failure
  • βœ… Settings auto-save toast β€” listenerMiddleware.ts catch dispatches error notification
  • βœ… Help Center complete β€” 13 stub articles fully written (700–1000 chars HTML) Γ— 5 locales; 1931 keys Γ— 5 at parity
  • βœ… Tests β€” dbInitialization.test.ts (8 tests) + dbServiceRetry.test.ts (7 tests)
  • βœ… Quality gate β€” lint βœ… Β· i18n:check βœ… Β· typecheck βœ… Β· 15/15 new tests βœ…

v1.7 β€” DuckDB Analytics + Hybrid RAG + AI Extensions (RELEASED 2026-05-20)

  • βœ… DuckDB-WASM P0–P3 β€” worker, client, schema (10 tables + 5 views), analytics queries, migration, dual-write, RAG vectors, cross-project, codex, scene timeline
  • βœ… DuckDB resilience β€” init retry (3Γ—), dual-write retry (3Γ—), OPFS fallback to in-memory, error surface to Redux
  • βœ… Hybrid RAG wired end-to-end β€” ragMode setting, mode selector UI, consistency checker uses RAG context, Re-Index button in Reference Panel, Settings button bug fix
  • βœ… ONNX + Transformers.js as selectable primary AI providers
  • βœ… Service-level dedup β€” aiThunkUtils prevents concurrent duplicate AI requests
  • βœ… Per-project AI preset β€” hash-based deep links, dedup key hardening
  • βœ… WorkerBus backpressure β€” MAX_QUEUE_SIZE = 32, telemetry extended
  • βœ… Y-WebRTC E2E encryption β€” AES-256-GCM, PBKDF2 310k iter, CollaborationPanel badge
  • βœ… PlotCanvas rAF throttle β€” eliminates 60 Hz Redux dispatch storm
  • βœ… i18n β€” 1 625 keys Γ— 5 locales (+35 new keys)
  • βœ… Quality gate β€” lint βœ… typecheck βœ… i18n βœ… 2 024+ tests / 178 files βœ…

v1.8 β€” RAG Prompt Assembly + UX (2026-05-21)

  • βœ… assembleRAGPrompt β€” services/ragPromptAssembly.ts + PromptLibrary templates
  • βœ… Writer β€” RAG toggle + chunk badge; continuation/brainstorm/critic use hybrid context
  • βœ… Plot Board AI β€” suggestNextBeatThunk + modal UI
  • βœ… DuckDB embedding β€” rag_chunks.embedding 384-dim migration + dual-write fix
  • βœ… PWA audit β€” docs/PWA-AUDIT.md, handle_links, SW comment for WASM/ONNX
  • βœ… Settings & Help β€” RAG hybrid hint, help article + tryActionId, helpDocRetrieval chunk
  • βœ… UI tokens β€” Writer, Command Palette, Modal, Project AI preset (--ring-focus)
  • βœ… Docs β€” README hub, ROADMAP, CHANGELOG [Unreleased], AUDIT, .cursor/index.mdc
  • βœ… Tauri audit β€” docs/TAURI-CI.md checklist v1.8
  • βœ… Sprint ref β€” docs/SPRINT-V1.8.md

v2.0 Open Items

  • ⬜ DuckDB rag_chunks schema migration: FLOAT[64] BoW β†’ FLOAT[384] semantic vectors β€” superseded by v1.8 embedding column (verify on device)
  • βœ… Full RTCDataChannel in-flight E2E encryption (Yjs y-webrtc patch) β€” DONE, vendor fork packages/collab-transport (y-webrtc 10.3.0, C-1); see its AUDIT.md ("RTCDataChannel payloads are now E2E-encrypted when room.key is set") β€” stale ⬜ reconciled 2026-07-30.
  • πŸ”„ RTL language support (Arabic, Hebrew, Persian) β€” Beta shipped behind enableRtlLayout (B-5); see the more current "C-6" entry above for the ar/he UI-translation detail and remaining native-speaker-review scope β€” stale duplicate ⬜ reconciled 2026-07-30.
  • βœ… Fine-tuning / LoRA support for personalized writing styles β€” DONE, enableLoraAdapters shipped default-on (Settings β†’ AI β†’ Fine-Tuning, Ollama Modelfile activation) β€” stale ⬜ reconciled 2026-07-30.
  • ⬜ Cloud sync (optional, E2E-encrypted)
  • βœ… Branches coverage β‰₯ 55 % (v1.10: Vitest gate 55 %, RAG/help/plot tests)

v1.6 β€” Plot-Board v2 & Writer Experience (RELEASED 2026-05-19)

  • βœ… Plot-Board v2 β€” plotBoardSlice, plotBoardService, PlotCanvas, ConnectionLayer, SubplotPanel, TensionCurvePanel, ConnectionToolbar, beat-sheet overlays, mobile pinch/pan
  • βœ… Real-Time Book Preview β€” BookPreviewView, useBookPreviewView, BookPreviewContext, IntersectionObserver TOC, fullscreen
  • βœ… Reference Panel β€” ReferencePanelView (6 tabs: Characters, World, Notes, Binder, Comments, Revisions)
  • βœ… Per-Scene Revision History β€” sceneRevisionService (IDB), SceneRevisionPanel, word-level diff, named snapshots
  • βœ… Threaded Comments β€” sceneCommentsSlice, CommentsPanel, resolve/reply/delete
  • βœ… Progress Tracker β€” progressTrackerSlice, ProgressTrackerView, session timer, streak, velocity chart, heatmap
  • βœ… Mobile Polish β€” useFoldableLayout, deepLinkService, HAPTIC_PATTERNS named library
  • βœ… i18n β€” 1590 keys Γ— 5 locales
  • βœ… Quality gate β€” lint βœ… typecheck βœ… 2024 tests / 178 files (0 failures) βœ… coverage 65.91% lines βœ…

v2.0 Open Items

  • βœ… Full RTCDataChannel in-flight E2E encryption (Yjs y-webrtc patch) β€” DONE, vendor fork packages/collab-transport (y-webrtc 10.3.0, C-1); see its AUDIT.md ("RTCDataChannel payloads are now E2E-encrypted when room.key is set") β€” stale ⬜ reconciled 2026-07-30.
  • πŸ”„ RTL language support (Arabic, Hebrew, Persian) β€” Beta shipped behind enableRtlLayout (B-5); see the more current "C-6" entry above for the ar/he UI-translation detail and remaining native-speaker-review scope β€” stale duplicate ⬜ reconciled 2026-07-30.
  • βœ… Fine-tuning / LoRA support for personalized writing styles β€” DONE, enableLoraAdapters shipped default-on (Settings β†’ AI β†’ Fine-Tuning, Ollama Modelfile activation) β€” stale ⬜ reconciled 2026-07-30.
  • ⬜ Cloud sync (optional, E2E-encrypted)
  • ⬜ AI creativity presets per project (not global)
  • βœ… Branches coverage β‰₯ 55 % (v1.10: Vitest gate 55 %, RAG/help/plot tests)

v1.4.x β€” Quality Enhancement (Master Perfection Plan)

Complete .md inventory (19 curated sources): AUDIT.md Β§ Markdown corpus; navigation: README.md. Heavy tests CI-first: docs/CI.md.

High (🟑)

  • βœ… Unit test coverage target range 50–70 % β€” v1.10: Vitest thresholds 63 Lines Β· 55 Branches Β· 54 Functions Β· 62 Statements; focus tests: RAG, help index, plot snap, AI streaming
  • βœ… E2E mobile selectors (2026-05-17) β€” clickNavItem() helper + ARIA tabs in WriterViewUI + data-testid anchors in VersionControlPanel/ExportView; all 4 spec files migrated to 2026 golden hierarchy (CI gate green again)
  • βœ… CI hardening (2026-05-17) β€” Stryker break: 30 enforced, Lighthouse performanceβ†’error, OSV scanner in security job, concurrency fix (cancel-in-progress for PRs only), artifact retention unified, JUnit E2E upload
  • βœ… WebLLM model selector β€” WEBLLM_SUPPORTED_MODELS (4 MLC checkpoints: Llama 3.2 1B/3B, Phi-3.5 Mini, Gemma 2 2B), modelId/onProgress parameters, Settings UI with dropdown + progress indicator (WCAG 2.2 role="progressbar", useRef mounted guard) β€” packages/ai-core, services/localAiFacade.ts, components/settings/AiSections.tsx
  • βœ… Cross-project search v2 (2026-05-18) β€” DB_VERSION 8, projects-index-store, crossProjectIndexService.ts (privacy-preserving IDB index), searchAcrossProjectIndex(), two-phase CrossProjectSearchPanel; indexing on save via listenerMiddleware is the next step
  • βœ… Cross-project search service v1 β€” services/crossProjectSearchService.ts, searchAcrossProjects() via fuzzyScore, transientUiStore integration (isCrossProjectSearchOpen), commandDefinitions command
  • βœ… Collaboration security warning β€” security warning banner in CollaborationPanel (role="alert", aria-live="polite", WCAG 2.2 AA) visible before connection establishment; disappears after connect
  • βœ… Phase 1+2 unit tests β€” 17 new test files, 733 tests total; Vitest thresholds raised to 35/30/22/33 (previously 25/21/17/24)
  • βœ… Stryker extension (phase 4) β€” fuzzyScore.ts, palettePreferences.ts, commandBuilder.ts as additional mutation targets
  • βœ… E2E tests (phase 4) β€” commands.spec.ts (palette Ctrl+K, "dashboard" search, fuzzy "wrt", Enter-navigate), collaboration.spec.ts (security warning banner visible before connection)
  • βœ… One-click encrypted library export (ZIP + AES-GCM, META.json + vault.bin) β€” services/libraryBackupService.ts, Settings β†’ Data
  • βœ… WebLLM as selectable provider (webllm/browser, privacy same as Ollama) β€” services/aiProviderService.ts, packages/ai-core

Low (🟒)

  • βœ… i18n comprehensive sweep (2026-05-18) β€” all hardcoded strings eliminated; 1 440 keys in 5 locales (help.tryTour, Chapter 1, manifest.resizer.*, export.pasteSection.heading, outline.result.body, templates.tabs.*, error.boundary.* and many more); ErrorBoundary refactored with ErrorFallback function component for useTranslation(); TypeScript 6 strict fixes (TS2322/TS2352/TS4111/TS2375); test mocks adjusted for ErrorBoundary.test.tsx + AdvancedImportExport.test.tsx
  • βœ… Complete markdown documentation sync (README Hub, CONTRIBUTING, docs/CI, AUDIT, Copilot, CLAUDE, SECURITY, TAURI/graphify, CHANGELOG/ROADMAP/TODO) β€” 2026-05-16

v1.2.0 β€” Security & Quality

High (🟑)

  • βœ… Expand E2E tests (project import, character CRUD, snapshot flow + auto-snapshot)
  • βœ… StorageBackend interface β€” services/storageBackend.ts as contract, StorageManager.saveProject(StoryProject)
  • βœ… Logger with ring buffer + sink for crash diagnostics

Medium (🟠)

  • βœ… Make signaling URL for collaboration configurable in Settings (webrtcSignalingUrls, Settings β†’ Collaboration)
  • βœ… Yjs AES-256-GCM encryption foundation (2026-05-18) β€” collaborationService.ts gains encryptUpdate/decryptUpdate/deriveEncryptionKey/getEncryptionStatus; CollaborationPanel shows encryption badge; full RTCDataChannel in-flight encryption requires y-webrtc patching (v2.0)

Low (🟒)

  • βœ… Documentation audit (CI.md, README Hub, CONTRIBUTING, AUDIT follow-up, Copilot/CLAUDE/SECURITY/Graphify) β€” 2026-05-02
  • βœ… Visual regression (tests/e2e/visual-regression.spec.ts) β€” Chromium baseline under tests/e2e/*-snapshots/ (snapshotPathTemplate without OS suffix)
  • βœ… Bundle size budgets + rollup analysis in CI (pnpm run bundle:budget, pnpm run analyze, artifact bundle-analysis)
  • βœ… FR/ES/IT key parity + CI gate (pnpm run i18n:check) β€” translation content can be improved iteratively
  • βœ… Renovate auto-merge for patch updates (renovate.json)
  • βœ… Onboarding spotlight tour (driver.js, Dashboard + Help)
  • βœ… Tauri v2 release pipeline (2026-05-18) β€” tauri-build.yml generates latest.json from signed .sig artifacts; TAURI-UPDATER.md has full secrets table; TAURI-CI.md has 7-step first-release checklist; macOS notarization + Windows Authenticode still require maintainer certificates

Archived (v1.2.0 sprint β€” done)

  • βœ… Expand E2E tests: project-import.spec.ts (3 tests), characters.spec.ts (4 tests), snapshots.spec.ts (4 tests)
  • βœ… Ollama / local AI integration: ollamaService.ts + aiProviderService.ts + Settings UI complete, default model set to Qwen3 8B
  • βœ… Split projectSlice.ts into thunk modules (14 AI thunks β†’ features/project/thunks/)
  • βœ… Tauri parity: 6 missing features β€” fileSystemService retry/compression/snapshot-ID/deleteImage/hasSavedData/auto-snapshot + Story Codex & RAG vectors (gap 3)
  • βœ… Test suite expanded from ~80 to ~160+ tests (12 new test files)
  • βœ… Node 24 localStorage polyfill (CI green on Node LTS + current)

Archived (v1.1.2 hotfix β€” done)

  • βœ… codexService infinite-loop fix (CRIT-1)
  • βœ… Modal focus-trap cleanup consolidated (BUG-1)
  • βœ… FOUC theme-init fixed (BUG-2)
  • βœ… Untranslated languages removed from selector (CRIT-2)
  • βœ… Dead code removed (buildDeduplicationKey, persist/PERSIST)
  • βœ… ManuscriptView resize-listener cleanup (already fixed, TODO was stale)
  • βœ… DevContainer configuration (already fixed, TODO was stale)
  • βœ… Redundant deploy.yml (already fixed, TODO was stale)
  • βœ… Feature-flag system (already fixed, TODO was stale)
  • βœ… Request deduplication (abort-previous pattern in aiThunkUtils.ts)