diff --git a/AUDIT.md b/AUDIT.md
index dffa363d..bf879eac 100644
--- a/AUDIT.md
+++ b/AUDIT.md
@@ -1,8 +1,8 @@
# WorldScript Studio — Codebase Audit Report
-**Date:** 2026-04-17 (baseline); **follow-up chain:** … → 2026-05-28 (v1.19.0 — Security/Voice/RTL/Logger B-1..B-8) → **2026-05-30 (B-1 passphrase UX + CI unblock)** → **2026-05-31 (i18n audit + settings features + CI stabilization)** → **2026-05-31 (Edge-AI Perfection Cycle — Phases 0-7 complete)** → **2026-06-01 (Post-crash session: CI stabilisation + 14 CodeAnt AI fixes + E2E hardening)** → **2026-06-02 (Perf Phase 2.3 — pipeline-LRU unification + PR #69 CodeAnt fixes)** → **2026-06-03 (WorkerBus v2 Phase 3 — Rust TaskSupervisor + Tauri-build unblock)** → **2026-06-06 (Phase 3 i18n Expansion — ja/zh/pt/el + Intl APIs)** → **2026-06-09 (v1.21 Deep Audit Correction — Whisper WASM download UI + 3 CodeAnt fixes + CloudSync LWW)** → **2026-06-09 (feat/deep-audit-v1.21 — CSP hardening, zh locale ≤5% EN, coverage Batches A/B/C, VoiceActivityCoordinator B-2 bridge)** → **2026-06-11 (Ultimate Copilot v2 Phase 2+3 — markdown, sidebar, Apply-to-chapter, InlineAnnotation, ProForge chip; PR #110+#111)** → **2026-06-11 (v1.22.0 release — OpenRouter Cloud 5 provider, AI Execution Modes hybrid/cloud/local/eco, AiModeIndicator, SW cache-invalidation fix)** → **2026-06-13/14 (v1.23 perfection batch — OpenRouter + AI-Execution-Mode settings sections localized/modernized, i18n single-brace interpolation bug-class fix + `i18nPlaceholders` regression guard, bundle split + budget tightening PR #130)** → **2026-06-16 (v1.23.0 release — rebrand StoryCraft → WorldScript Studio, local-first data foundation ADR-0008, Tauri blank-screen + asset-URL fixes, AI error taxonomy + retry hardening, command-palette & local-AI settings localization, WorldScript W monogram icons)** → **2026-06-16 (post-release documentation perfection pass — corpus sync, metric reconciliation, history archival, dependabot hardening)** → **2026-06-17 (Language expansion — +6 locales fi/sv/hu/is/eu/fa (RTL); PR #174 merged; `LanguageSelector` exonym localization via `portal.language.names.*`; portal chrome 100 % for the 6 new langs; README/AUDIT/CHANGELOG docs sync)**
+**Date:** 2026-04-17 (baseline); **follow-up chain:** … → 2026-05-28 (v1.19.0 — Security/Voice/RTL/Logger B-1..B-8) → **2026-05-30 (B-1 passphrase UX + CI unblock)** → **2026-05-31 (i18n audit + settings features + CI stabilization)** → **2026-05-31 (Edge-AI Perfection Cycle — Phases 0-7 complete)** → **2026-06-01 (Post-crash session: CI stabilisation + 14 CodeAnt AI fixes + E2E hardening)** → **2026-06-02 (Perf Phase 2.3 — pipeline-LRU unification + PR #69 CodeAnt fixes)** → **2026-06-03 (WorkerBus v2 Phase 3 — Rust TaskSupervisor + Tauri-build unblock)** → **2026-06-06 (Phase 3 i18n Expansion — ja/zh/pt/el + Intl APIs)** → **2026-06-09 (v1.21 Deep Audit Correction — Whisper WASM download UI + 3 CodeAnt fixes + CloudSync LWW)** → **2026-06-09 (feat/deep-audit-v1.21 — CSP hardening, zh locale ≤5% EN, coverage Batches A/B/C, VoiceActivityCoordinator B-2 bridge)** → **2026-06-11 (Ultimate Copilot v2 Phase 2+3 — markdown, sidebar, Apply-to-chapter, InlineAnnotation, ProForge chip; PR #110+#111)** → **2026-06-11 (v1.22.0 release — OpenRouter Cloud 5 provider, AI Execution Modes hybrid/cloud/local/eco, AiModeIndicator, SW cache-invalidation fix)** → **2026-06-13/14 (v1.23 perfection batch — OpenRouter + AI-Execution-Mode settings sections localized/modernized, i18n single-brace interpolation bug-class fix + `i18nPlaceholders` regression guard, bundle split + budget tightening PR #130)** → **2026-06-16 (v1.23.0 release — rebrand StoryCraft → WorldScript Studio, local-first data foundation ADR-0008, Tauri blank-screen + asset-URL fixes, AI error taxonomy + retry hardening, command-palette & local-AI settings localization, WorldScript W monogram icons)** → **2026-06-16 (post-release documentation perfection pass — corpus sync, metric reconciliation, history archival, dependabot hardening)** → **2026-06-17 (Language expansion — +6 locales fi/sv/hu/is/eu/fa (RTL); PR #174 merged; `LanguageSelector` exonym localization via `portal.language.names.*`; portal chrome 100 % for the 6 new langs; README/AUDIT/CHANGELOG docs sync)** → **2026-07-28 (v1.24.1 — Local-AI reliability fixes #266, Dependabot backlog triage, Issue #60 audit closeout, security/build hardening)**
**Scope:** Full application, repository configuration, CI/CD, documentation, release validation
-**Current version:** **v1.24.0** — 2026-06-21 (Critical & Immediate hardening sequence: Privacy → Analytics opt-out now gates all DuckDB writes + telemetry (SEC-6); reusable `Badge` + experimental labeling; +101 tests for collab-transport/ProForge/Copilot; voice consent clarity; device-aware Ollama recommendation + one-click pull; dependency/onboarding/docs hygiene; **2786 keys × 17 locales**)
+**Current version:** **v1.24.1** — 2026-07-28 (Local-AI reliability — desktop Ollama/LM Studio/vLLM discovery + browser status-badge fixes; AI heuristic-fallback foundation + Outline/Character/World/Plot-Board generators; real self-hosted LanguageTool integration; 20-PR Dependabot backlog triage; Issue #60 vendor-fork audit closeout; `persist-credentials`/CWE-209 security hardening; **2844 keys × 19 locales**)
**Quality gate (2026-06-17 — language expansion +6 locales):** lint ✅ · typecheck ✅ · i18n:check ✅ (**2716 keys × 17 locales** — fi/sv/hu/is/eu + fa RTL) · placeholder guard ✅ (17 bundles) · targeted unit tests ✅ (LanguageSelector 9 · I18nContext 59 · i18nPlaceholders 33). `LanguageSelector` exonym labels localized via `portal.language.names.*` (native endonym stays hardcoded by design). **Bulk translation completed** for all 10 Beta locales (glossary v2.0, ~44 anchor terms/locale; placeholder-masked, checkpointed): post-run coverage fi 91 % · sv 90 % · hu 91 % · is 92 % · eu 92 % · fa 93 % · ja 99 % · zh 100 % · pt 98 % · el 97 % (Beta MT; human native review tracked). Two bulk-script bugs fixed: (1) `glossaryTranslate` partial-match left ~1,300 strings partially English → now exact-match only; (2) `--all` mangled `help.json` rich HTML → `help.json` excluded from `--all` (`ALL_SKIP`) and kept English fallback for the 6 new langs (tag-dense markup isn't MT-safe; human-review task). New `docs/TRANSLATION-GUIDE.md` + `I18N-GLOSSARY.md` v2.0.
@@ -14,12 +14,14 @@
## v1.24.1 Local-AI reliability + Dependabot batch (2026-07-28)
-**Quality gate (2026-07-28):** lint ✅ · typecheck ✅ · i18n:check ✅ (**2834 keys × 19 locales** — `ru`/`ko` added since the v1.24.0 count above; `settings.ai.providerStatusUnavailableBrowser` new key) · targeted unit tests ✅ (PR #272: 40 · PR #273: 64, incl. new badge-reconciliation + scan-endpoint-order coverage).
+**Quality gate (2026-07-28):** lint ✅ · typecheck ✅ · i18n:check ✅ (**2844 keys × 19 locales** — `ru`/`ko` added since the v1.24.0 count above; `settings.ai.providerStatusUnavailableBrowser` + `settings.ai.testError.*` new keys) · targeted unit tests ✅ (127 across the 7 merged PRs, incl. badge-reconciliation, scan-endpoint-order, CWE-209 stale-request-guard, and binder-pin-reconciliation coverage) · **5807+ tests / 525 files** · CI Quality Gate (Node 22 + 24) green on every merged PR.
-- **#266 (Ollama/LM Studio/vLLM), two remaining halves fixed**, both root-caused with a real build+runtime repro rather than guessed: (1) desktop discovery was still broken after #269 because `vite.config.ts` externalized `@tauri-apps/*` even for the Tauri build itself, leaving `services/localServerHttp.ts`'s plugin-http import unresolvable in the packaged app — fixed via a shared `isTauriBuild()` check (PR #272); (2) the browser status badge and the desktop-only banner were driven by two unreconciled state signals, so the badge always read "Ready" next to a banner saying otherwise — fixed with a distinct "Not available in browser" label (PR #273).
-- **Dependabot backlog triaged:** 13 of 18 open PRs merged directly; the remaining 5 (AI-SDK v4 family, biome 2.5.x, dev-tooling/Babel 8) each had a real breaking-change blocker, root-caused and fixed with real code (AI-SDK family combined into PR #275; biome and dev-tooling fixes pushed directly onto their Dependabot branches) rather than force-merged or suppressed. See `TODO.md` § v1.24.1 for the full breakdown.
+- **#266 (Ollama/LM Studio/vLLM), two remaining halves fixed**, both root-caused with a real build+runtime repro rather than guessed: (1) desktop discovery was still broken after #269 because `vite.config.ts` externalized `@tauri-apps/*` even for the Tauri build itself, leaving `services/localServerHttp.ts`'s plugin-http import unresolvable in the packaged app — fixed via a shared `isTauriBuild()` check (PR #272); (2) the browser status badge and the desktop-only banner were driven by two unreconciled state signals, so the badge always read "Ready" next to a banner saying otherwise — fixed with a distinct "Not available in browser" label (PR #273). Issue closed with a full root-cause explanation.
+- **Dependabot backlog triaged — 20 PRs resolved (16 merged, 4 closed as superseded):** 14 were straightforward bumps (Actions, small JS/dev-tooling patches, Tauri/Rust crates, the tauri-deps group, a stray `log` crate bump); the other 6 each had a real breaking-change blocker, root-caused and fixed with real code rather than force-merged or suppressed — biome 2.5.x and dev-tooling/Babel 8 were fixed directly on their own Dependabot branch and merged, while the 4-PR AI-SDK v4 family (`@ai-sdk/google`/`@ai-sdk/openai`/`@ai-sdk/react`/`ai`) was combined into one coordinated PR #275 and the 4 originals closed as superseded. See `TODO.md` § v1.24.1 for the full breakdown.
- **Issue #60 (vendor-fork audit):** confirmed done (fork `10.3.0-sc2`, `verify:vendor` CI guard); status comment posted, issue stays open per its own standing-reminder policy.
- **CLAUDE.md doc-drift correction:** locale roster count (17→19) and per-locale module count (20→21) were stale relative to `i18n/locales.ts` (the actual SSOT).
+- **`pnpm run build` warnings eliminated:** an invalid `[dir:ltr]`/`[dir:rtl]` Tailwind arbitrary variant (compiled to the invalid CSS pseudo-class `:is(dir:ltr)`) replaced with Tailwind's built-in `ltr:`/`rtl:` direction variants; 3 dynamic `import()` calls Rolldown flagged as ineffective (already statically imported elsewhere) converted to static imports.
+- **CodeRabbit review-body findings that failed to post inline** (GitHub API error on a rate-limited re-review of PR #274) verified against current code and fixed: `AiProviderCard` a11y (`role="status" aria-live="polite"`) and a genuine CWE-209 stale-request race in `handleTest` (monotonic request-id guard); `ollamaService.ts`'s `plugin_unavailable` branch no longer forwards `LocalServerError.message` directly.
## v1.24.0 Dependency Hygiene + Onboarding + Docs Truth-up (2026-06-21, PR F)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index eca265cc..b0d5aeeb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [1.24.1] — 2026-07-28
+
+> Local-AI reliability (desktop Ollama/LM Studio/vLLM discovery, misleading browser status badge),
+> the AI heuristic-fallback foundation + Outline/Character/World/Plot-Board generators, real
+> self-hosted LanguageTool integration, a 20-PR Dependabot backlog triage (16 merged directly,
+> 4 closed as superseded after the AI SDK v4 family/biome 2.5.x/dev-tooling-Babel-8 blockers were
+> root-caused and fixed), the Issue #60 vendor-fork audit
+> closeout, and security/build hardening (`persist-credentials` CWE-522, `ltr`/`rtl` Tailwind fix,
+> 3 ineffective dynamic imports, 2 CWE-209 fixes).
+
### Added
- **Heuristic fallback for Plot-Board "suggest next beat".** Completes offline coverage of the
diff --git a/README.md b/README.md
index 2f8dd645..b71890c0 100644
--- a/README.md
+++ b/README.md
@@ -9,11 +9,11 @@
-
+
-
-
+
+
@@ -351,7 +351,7 @@ One-click encrypted export of your entire project library from **Settings → Da
### 🌐 Full Multi-Language Support
-Shipped UI locales with **2806 i18n keys** across all 17 languages — zero hardcoded user-facing strings:
+Shipped UI locales with **2844 i18n keys** across all 19 languages — zero hardcoded user-facing strings:
- 🇩🇪 **German** (Deutsch)
- 🇬🇧 **English**
@@ -460,8 +460,8 @@ The Settings → AI panel shows a live GPU status badge with adapter details and
| **PDF Export** | jsPDF | Client-side, configurable PDF document generation |
| **Document Export** | docx + jszip | Word-compatible `.docx` generation (lazy-loaded) |
| **PWA** | Service Worker + Web App Manifest v3 | Offline support, installability, Workbox chunking |
-| **i18n** | Custom React Context (`I18nContext.tsx`) | 2806 keys × 19 locales (de/en/es/fr/it + ar/he/fa RTL Beta + ja/zh/pt/el/fi/sv/hu/is/eu Beta); EN fallback; `localStorage` persistence |
-| **Testing** | Vitest 4.x (5807+ tests / 509 files) + Playwright E2E | Unit/integration + cross-browser E2E; Stryker mutation (manual workflow) |
+| **i18n** | Custom React Context (`I18nContext.tsx`) | 2844 keys × 19 locales (de/en/es/fr/it + ar/he/fa RTL Beta + ja/zh/pt/el/fi/sv/hu/is/eu Beta); EN fallback; `localStorage` persistence |
+| **Testing** | Vitest 4.x (5807+ tests / 525 files) + Playwright E2E | Unit/integration + cross-browser E2E; Stryker mutation (manual workflow) |
| **Code Quality** | Biome (lint + format) + TypeScript 7 (tsgo) strict | `--error-on-warnings` in CI; zero `any` policy |
| **Visualization** | Force-directed graph | Interactive character relationship network |
| **Desktop** | Tauri v2 | Cross-platform installer; auto-updater via `latest.json` |
@@ -498,7 +498,7 @@ WorldScript-Studio/
│ ├── sw.js # PWA Service Worker
│ └── manifest.json # PWA Web App Manifest v3
├── tests/
-│ ├── unit/ # Vitest unit tests (5807+ tests, 509 files)
+│ ├── unit/ # Vitest unit tests (5807+ tests, 525 files)
│ │ ├── ai/ # aiSmallModules, aiCoreFallbackPaths
│ │ └── settings/ # WebLlmPanel, AiSections
│ └── e2e/ # Playwright specs + helpers.ts
@@ -656,10 +656,10 @@ The main pipeline is [`.github/workflows/ci.yml`](.github/workflows/ci.yml). Opt
| `deploy` | `main` only | GitHub Pages after **`build` + `e2e`** succeed |
| `scorecard` | weekly + `main` push | OpenSSF Scorecard — SARIF uploaded to GitHub Code Scanning |
-**Current test metrics (2026-06-16):**
-- **5807+ unit tests** across **509 test files** — all passing
+**Current test metrics (2026-07-28):**
+- **5807+ unit tests** across **525 test files** — all passing
- Coverage thresholds: lines ≥ 74 · branches ≥ 60 · functions ≥ 67 · statements ≥ 72 — enforced in CI (see Codecov badge for live metrics)
-- i18n: **2806 keys × 19 locales** (en/de/fr/es/it + ar/he/fa RTL Beta + ja/zh/pt/el/fi/sv/hu/is/eu Beta)
+- i18n: **2844 keys × 19 locales** (en/de/fr/es/it + ar/he/fa RTL Beta + ja/zh/pt/el/fi/sv/hu/is/eu Beta)
**CI-cloud-first workflow (recommended):** On constrained hardware run **`pnpm run lint && pnpm run i18n:check && pnpm run typecheck`** locally, then push and let CI handle coverage, E2E, Lighthouse, and Stryker. Authoritative numbers come from CI artifacts (Codecov, JUnit). After CI goes green, update the README badges and `AUDIT.md` quality-gate line from the reported metrics. See **[`docs/CI.md`](docs/CI.md) § Cloud CI-first vs local development** for the full post-merge doc-update checklist.
diff --git a/TODO.md b/TODO.md
index f73c6794..8beb0173 100644
--- a/TODO.md
+++ b/TODO.md
@@ -51,12 +51,14 @@ Status: 🔄 in progress | ⬜ open | ✅ done
- ✅ **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](docs/adr/0012-local-server-connectivity-tauri-http.md).
- ✅ **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** — 13 of 18 open PRs merged directly (Actions bumps, small JS/dev-tooling patches, Tauri/Rust crates, the tauri-deps group). The remaining 5 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 merges.
+- ✅ **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.
## Dependency-Hygiene Backlog (carried forward)
diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md
index a6ab4ec5..517a0b45 100644
--- a/graphify-out/GRAPH_REPORT.md
+++ b/graphify-out/GRAPH_REPORT.md
@@ -1,12 +1,12 @@
-# Graph Report - StoryCraft-Studio (2026-06-24)
+# Graph Report - WorldScript-Studio (2026-07-28)
## Corpus Check
-- 1161 files · ~1,309,314 words
+- 1182 files · ~803,833 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
-- 5044 nodes · 8851 edges · 87 communities detected
-- Extraction: 76% EXTRACTED · 24% INFERRED · 0% AMBIGUOUS · INFERRED: 2165 edges (avg confidence: 0.8)
+- 3739 nodes · 4920 edges · 72 communities detected
+- Extraction: 70% EXTRACTED · 30% INFERRED · 0% AMBIGUOUS · INFERRED: 1482 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output
## Community Hubs (Navigation)
@@ -39,551 +39,432 @@
- [[_COMMUNITY_Community 26|Community 26]]
- [[_COMMUNITY_Community 27|Community 27]]
- [[_COMMUNITY_Community 28|Community 28]]
+- [[_COMMUNITY_Community 29|Community 29]]
- [[_COMMUNITY_Community 30|Community 30]]
-- [[_COMMUNITY_Community 32|Community 32]]
-- [[_COMMUNITY_Community 33|Community 33]]
+- [[_COMMUNITY_Community 31|Community 31]]
+- [[_COMMUNITY_Community 34|Community 34]]
- [[_COMMUNITY_Community 35|Community 35]]
+- [[_COMMUNITY_Community 36|Community 36]]
- [[_COMMUNITY_Community 37|Community 37]]
- [[_COMMUNITY_Community 38|Community 38]]
- [[_COMMUNITY_Community 39|Community 39]]
+- [[_COMMUNITY_Community 40|Community 40]]
- [[_COMMUNITY_Community 42|Community 42]]
-- [[_COMMUNITY_Community 44|Community 44]]
+- [[_COMMUNITY_Community 43|Community 43]]
- [[_COMMUNITY_Community 45|Community 45]]
+- [[_COMMUNITY_Community 46|Community 46]]
+- [[_COMMUNITY_Community 47|Community 47]]
- [[_COMMUNITY_Community 48|Community 48]]
-- [[_COMMUNITY_Community 49|Community 49]]
-- [[_COMMUNITY_Community 52|Community 52]]
-- [[_COMMUNITY_Community 57|Community 57]]
-- [[_COMMUNITY_Community 60|Community 60]]
-- [[_COMMUNITY_Community 63|Community 63]]
-- [[_COMMUNITY_Community 64|Community 64]]
-- [[_COMMUNITY_Community 65|Community 65]]
-- [[_COMMUNITY_Community 66|Community 66]]
-- [[_COMMUNITY_Community 71|Community 71]]
-- [[_COMMUNITY_Community 72|Community 72]]
-- [[_COMMUNITY_Community 77|Community 77]]
-- [[_COMMUNITY_Community 83|Community 83]]
+- [[_COMMUNITY_Community 51|Community 51]]
+- [[_COMMUNITY_Community 53|Community 53]]
+- [[_COMMUNITY_Community 54|Community 54]]
+- [[_COMMUNITY_Community 61|Community 61]]
+- [[_COMMUNITY_Community 67|Community 67]]
+- [[_COMMUNITY_Community 70|Community 70]]
+- [[_COMMUNITY_Community 73|Community 73]]
+- [[_COMMUNITY_Community 74|Community 74]]
+- [[_COMMUNITY_Community 75|Community 75]]
+- [[_COMMUNITY_Community 76|Community 76]]
+- [[_COMMUNITY_Community 84|Community 84]]
+- [[_COMMUNITY_Community 85|Community 85]]
- [[_COMMUNITY_Community 86|Community 86]]
-- [[_COMMUNITY_Community 90|Community 90]]
-- [[_COMMUNITY_Community 99|Community 99]]
-- [[_COMMUNITY_Community 134|Community 134]]
-- [[_COMMUNITY_Community 145|Community 145]]
-- [[_COMMUNITY_Community 151|Community 151]]
-- [[_COMMUNITY_Community 184|Community 184]]
-- [[_COMMUNITY_Community 232|Community 232]]
-- [[_COMMUNITY_Community 274|Community 274]]
-- [[_COMMUNITY_Community 279|Community 279]]
-- [[_COMMUNITY_Community 745|Community 745]]
-- [[_COMMUNITY_Community 746|Community 746]]
-- [[_COMMUNITY_Community 747|Community 747]]
-- [[_COMMUNITY_Community 748|Community 748]]
-- [[_COMMUNITY_Community 749|Community 749]]
-- [[_COMMUNITY_Community 750|Community 750]]
-- [[_COMMUNITY_Community 751|Community 751]]
-- [[_COMMUNITY_Community 752|Community 752]]
-- [[_COMMUNITY_Community 753|Community 753]]
-- [[_COMMUNITY_Community 754|Community 754]]
-- [[_COMMUNITY_Community 755|Community 755]]
-- [[_COMMUNITY_Community 756|Community 756]]
-- [[_COMMUNITY_Community 757|Community 757]]
-- [[_COMMUNITY_Community 758|Community 758]]
-- [[_COMMUNITY_Community 759|Community 759]]
-- [[_COMMUNITY_Community 760|Community 760]]
-- [[_COMMUNITY_Community 761|Community 761]]
-- [[_COMMUNITY_Community 762|Community 762]]
-- [[_COMMUNITY_Community 763|Community 763]]
-- [[_COMMUNITY_Community 764|Community 764]]
-- [[_COMMUNITY_Community 765|Community 765]]
-- [[_COMMUNITY_Community 766|Community 766]]
-- [[_COMMUNITY_Community 767|Community 767]]
-- [[_COMMUNITY_Community 768|Community 768]]
-- [[_COMMUNITY_Community 769|Community 769]]
+- [[_COMMUNITY_Community 89|Community 89]]
+- [[_COMMUNITY_Community 93|Community 93]]
+- [[_COMMUNITY_Community 101|Community 101]]
+- [[_COMMUNITY_Community 105|Community 105]]
+- [[_COMMUNITY_Community 107|Community 107]]
+- [[_COMMUNITY_Community 111|Community 111]]
+- [[_COMMUNITY_Community 123|Community 123]]
+- [[_COMMUNITY_Community 163|Community 163]]
+- [[_COMMUNITY_Community 175|Community 175]]
+- [[_COMMUNITY_Community 182|Community 182]]
+- [[_COMMUNITY_Community 219|Community 219]]
+- [[_COMMUNITY_Community 271|Community 271]]
+- [[_COMMUNITY_Community 315|Community 315]]
+- [[_COMMUNITY_Community 319|Community 319]]
## God Nodes (most connected - your core abstractions)
-1. `mt()` - 104 edges
-2. `Bv` - 74 edges
-3. `fn()` - 63 edges
-4. `t()` - 50 edges
-5. `Ze()` - 43 edges
-6. `wx()` - 41 edges
-7. `xA` - 40 edges
-8. `CloudSyncBackend` - 39 edges
-9. `StorageManager` - 36 edges
-10. `tA()` - 34 edges
+1. `fn()` - 63 edges
+2. `t()` - 42 edges
+3. `CloudSyncBackend` - 39 edges
+4. `StorageManager` - 36 edges
+5. `useTranslation()` - 33 edges
+6. `retryFs()` - 31 edges
+7. `VoiceCommandService` - 30 edges
+8. `useAppDispatch()` - 29 edges
+9. `match()` - 27 edges
+10. `getItem()` - 24 edges
## Surprising Connections (you probably didn't know these)
-- `useTranslation()` --calls--> `IdbUnlockModal()` [INFERRED]
- hooks/useTranslation.ts → components/settings/IdbUnlockModal.tsx
+- `offlineFallback()` --calls--> `match()` [INFERRED]
+ public/sw.js → tests/unit/GrammarCheckPanel.test.tsx
- `getItem()` --calls--> `readMode()` [INFERRED]
features/featureFlags/featureFlagsStorage.ts → components/copilot/CopilotPanel.tsx
- `setItem()` --calls--> `writeMode()` [INFERRED]
features/featureFlags/featureFlagsStorage.ts → components/copilot/CopilotPanel.tsx
-- `Ja()` --calls--> `matches()` [INFERRED]
- e2e-deep-report/trace/assets/codeMirrorModule-Ds_H_9Yq.js → tests/unit/ai/localModelStorageService.test.ts
-- `stubDownload()` --calls--> `fn()` [INFERRED]
- tests/unit/epubApiService.test.ts → stories/PWAComponents.stories.tsx
+- `setItem()` --calls--> `enableDebugLogging()` [INFERRED]
+ features/featureFlags/featureFlagsStorage.ts → services/logger.ts
+- `removeItem()` --calls--> `disableDebugLogging()` [INFERRED]
+ features/featureFlags/featureFlagsStorage.ts → services/logger.ts
## Communities
### Community 0 - "Community 0"
Cohesion: 0.01
-Nodes (329): md(), flushMicrotasks(), _0, _2(), A0, a2(), aA(), ab() (+321 more)
+Nodes (125): recordLatency(), AiInferenceCacheService, hashKey(), assertCloudAiAllowed(), assertCloudAiAllowedSync(), assertLoraLocalOnly(), _clearPendingRequestsForTest(), createCancellationToken() (+117 more)
### Community 1 - "Community 1"
Cohesion: 0.01
-Nodes (132): recordLatency(), AiInferenceCacheService, hashKey(), _cleanupPendingRequest(), _clearPendingRequestsForTest(), binderDepth(), collectSubtreeIds(), createCancellationToken() (+124 more)
+Nodes (60): makeContext(), makeContext(), makeDeps(), makeStoreState(), createFakeAdapter(), createFakeDevice(), makeCopilot(), makeContext() (+52 more)
### Community 2 - "Community 2"
-Cohesion: 0.01
-Nodes (171): af(), ef(), ff(), Ja(), lf(), mt(), nf(), of() (+163 more)
+Cohesion: 0.02
+Nodes (65): AnalyticsBootstrap(), App(), ViewLoader(), useCommandExecutor(), CopilotLauncher(), parseHash(), readCurrentView(), Header() (+57 more)
### Community 3 - "Community 3"
-Cohesion: 0.01
-Nodes (98): accessibilityPresetDefaults(), normalizeAccessibilitySettings(), applyPreset(), handleRemoveKey(), handleSaveKey(), handleTestConnection(), CloudSyncBackend, decryptCloudPayload() (+90 more)
+Cohesion: 0.02
+Nodes (42): loadAgent(), analyticsPersistenceAllowedNow(), isAnalyticsPersistenceAllowed(), bindAbortSignal(), setRetryFeedback(), CircuitBreaker, loadStoryCodex(), translate() (+34 more)
### Community 4 - "Community 4"
-Cohesion: 0.01
-Nodes (80): handleCopyForNotion(), handleDocxImport(), handleExport(), handlePasteImport(), handleBuildLocalRag(), handleWebllmDownload(), isCustomOllamaModel(), analyticsPersistenceAllowedNow() (+72 more)
+Cohesion: 0.03
+Nodes (61): getActiveAiMode(), getLocalFallbackModel(), AnalyticsAgent, check(), extractCatalogFlags(), extractDefaultsFromSlice(), extractFlagsFromSlice(), extractHiddenFlags() (+53 more)
### Community 5 - "Community 5"
Cohesion: 0.02
-Nodes (92): AdaptiveAiEngine, _clearLatencyHistory(), estimateLatency(), getTaskConfig(), selectModelForBackend(), pipeline(), pipeline(), start() (+84 more)
+Nodes (57): glossaryTranslate(), loadCheckpoint(), loadGlossary(), main(), maskPlaceholders(), parseArgs(), restorePlaceholders(), saveCheckpoint() (+49 more)
### Community 6 - "Community 6"
Cohesion: 0.03
-Nodes (17): a_(), bh, Dh(), eA(), el(), GE(), Gh(), lv() (+9 more)
+Nodes (57): item(), BookPreviewView(), getLocalUser(), getRandomColor(), handleKeyDown(), sanitizeRoomInput(), stripControlChars(), deleteIdb() (+49 more)
### Community 7 - "Community 7"
-Cohesion: 0.01
-Nodes (80): categoryFromMessage(), categoryFromStatus(), classificationFor(), classifyAiError(), extractStatus(), getAiErrorMessage(), isOffline(), clampRetryAfter() (+72 more)
+Cohesion: 0.03
+Nodes (58): collectSubtreeIds(), installDesktopMenu(), installCloseToTray(), installDesktopTray(), routeTask(), addDebouncedListener(), getLocalFirstHandle(), initAdaptiveAiOnStartup() (+50 more)
### Community 8 - "Community 8"
-Cohesion: 0.03
-Nodes (69): FsAssetStore, glossaryTranslate(), loadCheckpoint(), loadGlossary(), main(), maskPlaceholders(), parseArgs(), restorePlaceholders() (+61 more)
+Cohesion: 0.06
+Nodes (39): attachCause(), cleanPrompt(), sanitizePromptBlock(), stripControlChars(), handleRemoveKey(), handleSaveKey(), handleTestConnection(), FsAssetStore (+31 more)
### Community 9 - "Community 9"
-Cohesion: 0.02
-Nodes (70): item(), clearBenchmarkResults(), getLocalUser(), getRandomColor(), handleKeyDown(), sanitizeRoomInput(), stripControlChars(), deleteIdb() (+62 more)
+Cohesion: 0.03
+Nodes (40): handleCopyForNotion(), handleDocxImport(), handleExport(), handlePasteImport(), binderDepth(), handleAddFolder(), handleAddLink(), handleAddNote() (+32 more)
### Community 10 - "Community 10"
-Cohesion: 0.02
-Nodes (35): isEcoMode(), generateMessageId(), getWorker(), send(), EcoModeService, FeedbackService, handleEcoToggle(), KokoroTtsEngine (+27 more)
+Cohesion: 0.04
+Nodes (65): getOpenRouterFallbackProvider(), getOpenRouterModel(), isCloudOnlyMode(), isOffline(), notifyLocalModelsReady(), shouldRouteLocally(), shouldUseOpenRouter(), _cleanupPendingRequest() (+57 more)
### Community 11 - "Community 11"
-Cohesion: 0.02
-Nodes (64): AnalyticsBootstrap(), App(), ViewLoader(), BookPreviewView(), useCommandExecutor(), CopilotLauncher(), Header(), useAppDispatch() (+56 more)
+Cohesion: 0.03
+Nodes (48): MockDoc, MockWebrtcProvider, releaseComputeDevice(), decrypt(), decryptJson(), encrypt(), encryptJson(), dbNameForProject() (+40 more)
### Community 12 - "Community 12"
-Cohesion: 0.03
-Nodes (97): AiModeIndicator(), getActiveAiMode(), getOpenRouterFallbackProvider(), getOpenRouterModel(), isCloudOnlyMode(), isOffline(), notifyLocalModelsReady(), shouldRouteLocally() (+89 more)
+Cohesion: 0.04
+Nodes (16): isEcoMode(), FeedbackService, ConsentRequiredError, createSttEngine(), WebSpeechSttEngine, createTtsEngine(), WebSpeechTtsEngine, createVadEngine() (+8 more)
### Community 13 - "Community 13"
-Cohesion: 0.05
-Nodes (53): getLocalFallbackModel(), generateJson(), attachCause(), cleanPrompt(), sanitizePromptBlock(), stripControlChars(), stripJsonFences(), AnalyticsAgent (+45 more)
+Cohesion: 0.04
+Nodes (49): createAttentionPipeline(), createComputePipeline(), createKvCachePipeline(), createMlpPipeline(), createSimilarityBuffers(), createSimilarityPipeline(), encodeSimilarityUniforms(), getComputeDevice() (+41 more)
### Community 14 - "Community 14"
-Cohesion: 0.03
-Nodes (35): AudioNavigator, getFocusable(), onKeyDown(), onPointerUp(), buildEncodedPayload(), makeCommands(), makeProjectData(), Hb() (+27 more)
+Cohesion: 0.04
+Nodes (22): CloudSyncBackend, CloudSyncClient, decryptCloudPayload(), deriveCloudSyncKey(), encryptCloudPayload(), hasMigrationMarker(), legacyDatabaseListed(), migrateLegacyWorldscriptDbIfNeeded() (+14 more)
### Community 15 - "Community 15"
-Cohesion: 0.04
-Nodes (61): countWords(), enrichProjectIndex(), extractCharacterNames(), getDb(), indexProject(), listIndexedProjects(), removeProjectIndex(), semanticSearchProjects() (+53 more)
+Cohesion: 0.03
+Nodes (30): pipeline(), applyPreset(), async(), close(), isSidebar(), onKey(), onPointerDown(), readMode() (+22 more)
### Community 16 - "Community 16"
Cohesion: 0.04
-Nodes (35): assertNoSeriousViolations(), loadAgent(), bindAbortSignal(), setRetryFeedback(), navigateToCollaborationSettings(), connectSrcTokens(), group1(), tauriCsp() (+27 more)
+Nodes (26): start(), handleBuildLocalRag(), handleWebllmDownload(), isCustomOllamaModel(), EcoModeService, GpuResourceManager, detectWebGpuSupport(), isAbortError() (+18 more)
### Community 17 - "Community 17"
-Cohesion: 0.06
-Nodes (15): bb(), d_, f_, h_, kS(), mc(), ps(), r0() (+7 more)
+Cohesion: 0.05
+Nodes (25): CollabEncryptionRequiredError, CollaborationService, resolveWebRtcSignalingUrls(), getDuckDb(), initDuckDb(), isOPFSSupported(), decryptDuckDbData(), encryptDuckDbData() (+17 more)
### Community 18 - "Community 18"
-Cohesion: 0.04
-Nodes (39): collect(), buildPaletteCommandModels(), collectAllDefinitions(), resolveTitle(), runCommandById(), DeadLetterQueue, openDlqDb(), storeClear() (+31 more)
+Cohesion: 0.05
+Nodes (39): countWords(), enrichProjectIndex(), extractCharacterNames(), getDb(), indexProject(), listIndexedProjects(), removeProjectIndex(), semanticSearchProjects() (+31 more)
### Community 19 - "Community 19"
-Cohesion: 0.04
-Nodes (37): createAttentionPipeline(), createComputePipeline(), createKvCachePipeline(), createMlpPipeline(), createSimilarityBuffers(), createSimilarityPipeline(), encodeSimilarityUniforms(), getComputeDevice() (+29 more)
+Cohesion: 0.06
+Nodes (17): navigateToCollaborationSettings(), clickNavItem(), ensureBlankProject(), flushWriterDebounce(), seedGeminiApiKey(), selectFirstEnabledWriterSection(), waitForMainChrome(), waitForSpaReady() (+9 more)
### Community 20 - "Community 20"
-Cohesion: 0.1
-Nodes (11): bc(), fr(), Go(), jS(), LS, Xd, xn(), aa (+3 more)
+Cohesion: 0.06
+Nodes (30): AdaptiveAiEngine, _clearLatencyHistory(), estimateLatency(), getTaskConfig(), selectModelForBackend(), clearBenchmarkResults(), getLastBenchmarkResults(), loadResults() (+22 more)
### Community 21 - "Community 21"
Cohesion: 0.07
-Nodes (32): applyPreset(), async(), close(), isSidebar(), onKey(), onPointerDown(), readMode(), writeMode() (+24 more)
-
-### Community 22 - "Community 22"
-Cohesion: 0.06
Nodes (13): createBrowserProForgeCapability(), buildPorts(), runCopilotDiagnostic(), buildNormManuscriptExport(), paginateNormLines(), stripLightMarkdown(), wrapParagraphToLines(), wrapPlainTextToNormLines() (+5 more)
-### Community 23 - "Community 23"
-Cohesion: 0.11
+### Community 22 - "Community 22"
+Cohesion: 0.1
Nodes (1): StorageManager
-### Community 24 - "Community 24"
+### Community 23 - "Community 23"
Cohesion: 0.07
Nodes (16): smallProject(), buildCharacter(), buildLargeManuscript(), buildParagraph(), buildSectionContent(), buildWorld(), countWords(), makeRng() (+8 more)
+### Community 24 - "Community 24"
+Cohesion: 0.1
+Nodes (20): handleEncryptedLibraryExport(), handleExportSettingsJson(), createImageRegistrar(), esc(), exportEpub(), exportEpubViaApi(), renderBody(), renderLine() (+12 more)
+
### Community 25 - "Community 25"
-Cohesion: 0.14
-Nodes (21): handleToggle(), handleDelete(), handleFileChange(), activateAdapter(), clearDatasetEntries(), deactivateAdapter(), deleteAdapter(), exportAdapter() (+13 more)
+Cohesion: 0.16
+Nodes (23): AiModeIndicator(), isOpenRouterFreeModel(), buildHeaders(), buildMessages(), buildRequestBody(), computeBackoffMs(), delay(), _delayProvider() (+15 more)
### Community 26 - "Community 26"
Cohesion: 0.14
-Nodes (15): normalize(), buildExcerpt(), extractCharacters(), extractManuscriptSections(), searchAcrossProjectIndex(), searchAcrossProjects(), normalizeSearch(), scoreAgainstQuery() (+7 more)
+Nodes (21): handleToggle(), handleDelete(), handleFileChange(), activateAdapter(), clearDatasetEntries(), deactivateAdapter(), deleteAdapter(), exportAdapter() (+13 more)
### Community 27 - "Community 27"
-Cohesion: 0.35
-Nodes (2): cc, Gb()
+Cohesion: 0.14
+Nodes (15): normalize(), buildExcerpt(), extractCharacters(), extractManuscriptSections(), searchAcrossProjectIndex(), searchAcrossProjects(), normalizeSearch(), scoreAgainstQuery() (+7 more)
### Community 28 - "Community 28"
-Cohesion: 0.17
-Nodes (9): applyTextEdit(), applyReviewEditsToSection(), containsDisallowedControlChar(), isValidRange(), nearestFreeOccurrence(), planAcceptedManuscriptEdits(), validateProposedText(), applyEditsPure() (+1 more)
+Cohesion: 0.16
+Nodes (15): collect(), analyze_text(), count_sentences(), count_syllables(), counts_words_chars_and_spaces(), empty_text_is_all_zero(), flesch_score_is_finite_for_real_prose(), run_text_analyze() (+7 more)
+
+### Community 29 - "Community 29"
+Cohesion: 0.11
+Nodes (9): renderSheet(), renderPanel(), componentDidCatch(), render(), renderEdges(), renderPanel(), createHookWrapper(), isDispatcherAction() (+1 more)
### Community 30 - "Community 30"
-Cohesion: 0.21
-Nodes (8): classifyDevice(), detectIsMobile(), getBatteryLevel(), getHealthReport(), getMemoryInfo(), getStorageQuotaMb(), classifyVram(), detectWebGpuDetails()
+Cohesion: 0.2
+Nodes (14): categoryFromMessage(), categoryFromStatus(), classificationFor(), classifyAiError(), extractStatus(), getAiErrorMessage(), isOffline(), clampRetryAfter() (+6 more)
-### Community 32 - "Community 32"
+### Community 31 - "Community 31"
+Cohesion: 0.17
+Nodes (9): applyTextEdit(), extractCodeBlock(), applyReviewEditsToSection(), containsDisallowedControlChar(), isValidRange(), nearestFreeOccurrence(), planAcceptedManuscriptEdits(), validateProposedText() (+1 more)
+
+### Community 34 - "Community 34"
+Cohesion: 0.2
+Nodes (7): characterHeuristicGenerator(), outlineHeuristicGenerator(), planOutlineBeats(), plotBoardHeuristicGenerator(), clampConfidence(), makeHeuristicResult(), worldHeuristicGenerator()
+
+### Community 35 - "Community 35"
+Cohesion: 0.27
+Nodes (7): assertPermission(), createDeniedConstructor(), createSandboxedRunner(), installRuntimeGuards(), normalizePluginSource(), restoreConstructor(), restoreRuntimeGuards()
+
+### Community 36 - "Community 36"
+Cohesion: 0.22
+Nodes (4): accessibilityPresetDefaults(), normalizeAccessibilitySettings(), applyPreset(), baseSettings()
+
+### Community 37 - "Community 37"
Cohesion: 0.29
Nodes (1): PriorityTaskQueue
-### Community 33 - "Community 33"
+### Community 38 - "Community 38"
+Cohesion: 0.33
+Nodes (1): AudioNavigator
+
+### Community 39 - "Community 39"
Cohesion: 0.25
Nodes (3): useManuscriptLayout(), useMediaQuery(), useResizablePanels()
-### Community 35 - "Community 35"
+### Community 40 - "Community 40"
+Cohesion: 0.32
+Nodes (4): clearServiceWorkerCaches(), deleteAllIndexedDBDatabases(), runWipe(), wipeAllAppData()
+
+### Community 42 - "Community 42"
+Cohesion: 0.43
+Nodes (4): getTransformers(), handleInference(), loadPipeline(), runInference()
+
+### Community 43 - "Community 43"
Cohesion: 0.29
Nodes (5): MockAudioContext, MockBufferSource, MockGain, NonEndingSource, TrackingContext
-### Community 37 - "Community 37"
+### Community 45 - "Community 45"
Cohesion: 0.33
Nodes (3): useSwipeGesture(), useWriterLayout(), useWriterViewContext()
-### Community 38 - "Community 38"
+### Community 46 - "Community 46"
Cohesion: 0.53
Nodes (4): buildWebNNExecutionProviders(), detectWebNN(), isDirectMLAvailable(), isDirectMLHeuristic()
-### Community 39 - "Community 39"
+### Community 47 - "Community 47"
+Cohesion: 0.4
+Nodes (2): getFocusable(), onKeyDown()
+
+### Community 48 - "Community 48"
Cohesion: 0.7
Nodes (4): check_cuda_and_vram(), check_package(), check_python_version(), main()
-### Community 42 - "Community 42"
+### Community 51 - "Community 51"
Cohesion: 0.5
Nodes (3): createStorageMock(), setupStorage(), SpeechSynthesisUtteranceMock
-### Community 44 - "Community 44"
-Cohesion: 0.4
-Nodes (4): Room, SignalingConn, WebrtcConn, WebrtcProvider
-
-### Community 45 - "Community 45"
+### Community 53 - "Community 53"
Cohesion: 0.4
Nodes (2): useDashboardContext(), DashboardHeader()
-### Community 48 - "Community 48"
-Cohesion: 0.6
-Nodes (4): applyFormula(), computeReadabilitySnapshot(), estimateSyllables(), getSyllablePattern()
-
-### Community 49 - "Community 49"
-Cohesion: 0.5
-Nodes (1): rc
+### Community 54 - "Community 54"
+Cohesion: 0.4
+Nodes (4): Room, SignalingConn, WebrtcConn, WebrtcProvider
-### Community 52 - "Community 52"
+### Community 61 - "Community 61"
Cohesion: 0.67
Nodes (2): makeConfig(), startPipelinePayload()
-### Community 57 - "Community 57"
+### Community 67 - "Community 67"
Cohesion: 0.67
Nodes (2): make(), noop()
-### Community 60 - "Community 60"
+### Community 70 - "Community 70"
Cohesion: 0.67
Nodes (2): defaultProject(), setProjectData()
-### Community 63 - "Community 63"
+### Community 73 - "Community 73"
Cohesion: 0.83
Nodes (3): makeChars(), makeProject(), makeWorlds()
-### Community 64 - "Community 64"
+### Community 74 - "Community 74"
Cohesion: 0.83
Nodes (3): emptyChars(), emptyWorlds(), makeProject()
-### Community 65 - "Community 65"
+### Community 75 - "Community 75"
Cohesion: 0.5
Nodes (2): ManuscriptDesktopLayout(), useManuscriptViewContext()
-### Community 66 - "Community 66"
+### Community 76 - "Community 76"
Cohesion: 0.5
Nodes (3): AsyncDuckDB, AsyncDuckDBConnection, ConsoleLogger
-### Community 71 - "Community 71"
+### Community 84 - "Community 84"
+Cohesion: 0.67
+Nodes (2): getFocusable(), handleTabKey()
+
+### Community 85 - "Community 85"
Cohesion: 0.67
Nodes (2): getQuestionsForArchetype(), getTemplateForArchetype()
-### Community 72 - "Community 72"
+### Community 86 - "Community 86"
Cohesion: 0.83
Nodes (3): esc(), inline(), renderExportMarkdownToHtml()
-### Community 77 - "Community 77"
+### Community 89 - "Community 89"
+Cohesion: 1.0
+Nodes (2): isTauriBuild(), resolveViteBase()
+
+### Community 93 - "Community 93"
Cohesion: 0.67
Nodes (1): makeSection()
-### Community 83 - "Community 83"
+### Community 101 - "Community 101"
Cohesion: 0.67
Nodes (1): MockGoogleGenAI
-### Community 86 - "Community 86"
+### Community 105 - "Community 105"
Cohesion: 0.67
Nodes (1): makeDeps()
-### Community 90 - "Community 90"
+### Community 107 - "Community 107"
+Cohesion: 1.0
+Nodes (2): fireSwipe(), makePointerEvent()
+
+### Community 111 - "Community 111"
Cohesion: 0.67
Nodes (1): FakeAudioContext
-### Community 99 - "Community 99"
+### Community 123 - "Community 123"
Cohesion: 0.67
Nodes (1): TaskError
-### Community 134 - "Community 134"
+### Community 163 - "Community 163"
Cohesion: 1.0
Nodes (1): MockIntersectionObserver
-### Community 145 - "Community 145"
+### Community 175 - "Community 175"
Cohesion: 1.0
Nodes (1): MockWorker
-### Community 151 - "Community 151"
+### Community 182 - "Community 182"
Cohesion: 1.0
Nodes (1): MockBroadcastChannel
-### Community 184 - "Community 184"
+### Community 219 - "Community 219"
Cohesion: 1.0
Nodes (1): MockIntersectionObserver
-### Community 232 - "Community 232"
+### Community 271 - "Community 271"
Cohesion: 1.0
Nodes (1): MockWorker
-### Community 274 - "Community 274"
+### Community 315 - "Community 315"
Cohesion: 1.0
Nodes (1): FileSystemService
-### Community 279 - "Community 279"
+### Community 319 - "Community 319"
Cohesion: 1.0
Nodes (1): IndexedDBService
-### Community 745 - "Community 745"
-Cohesion: 1.0
-Nodes (1): Remove ANSI escape codes from text.
-
-### Community 746 - "Community 746"
-Cohesion: 1.0
-Nodes (1): Remove timestamp strings from text.
-
-### Community 747 - "Community 747"
-Cohesion: 1.0
-Nodes (1): Replace long base64 strings with placeholder.
-
-### Community 748 - "Community 748"
-Cohesion: 1.0
-Nodes (1): Remove NPM/pnpm warning lines.
-
-### Community 749 - "Community 749"
-Cohesion: 1.0
-Nodes (1): Remove redundant success messages.
-
-### Community 750 - "Community 750"
-Cohesion: 1.0
-Nodes (1): Apply all preprocessing steps to reduce token payload.
-
-### Community 751 - "Community 751"
-Cohesion: 1.0
-Nodes (1): Extract only error-related sections from log.
-
-### Community 752 - "Community 752"
-Cohesion: 1.0
-Nodes (1): Pydantic models for CI Analyzer structured output. QNBS-v3: These models enforce
-
-### Community 753 - "Community 753"
-Cohesion: 1.0
-Nodes (1): Structured CI error for VS Code problem matcher integration.
-
-### Community 754 - "Community 754"
-Cohesion: 1.0
-Nodes (1): Vitest JSON test result structure.
-
-### Community 755 - "Community 755"
-Cohesion: 1.0
-Nodes (1): Full Vitest JSON report structure.
-
-### Community 756 - "Community 756"
-Cohesion: 1.0
-Nodes (1): Stryker per-file mutation report.
-
-### Community 757 - "Community 757"
-Cohesion: 1.0
-Nodes (1): Full Stryker JSON report structure.
-
-### Community 758 - "Community 758"
-Cohesion: 1.0
-Nodes (1): Initialize OpenRouter client for Poolside Laguna model.
-
-### Community 759 - "Community 759"
-Cohesion: 1.0
-Nodes (1): Analyze Vitest JSON report and raw logs for errors.
-
-### Community 760 - "Community 760"
-Cohesion: 1.0
-Nodes (1): Analyze Stryker JSON report for surviving mutants.
-
-### Community 761 - "Community 761"
-Cohesion: 1.0
-Nodes (1): Send preprocessed errors to LLM for analysis.
-
-### Community 762 - "Community 762"
-Cohesion: 1.0
-Nodes (1): Format errors for VS Code problem matcher.
-
-### Community 763 - "Community 763"
-Cohesion: 1.0
-Nodes (1): Main entry point for CI analyzer.
-
-### Community 764 - "Community 764"
-Cohesion: 1.0
-Nodes (1): Execute gh CLI command and return parsed JSON output.
-
-### Community 765 - "Community 765"
-Cohesion: 1.0
-Nodes (1): Get the ID of the most recent failed CI run.
-
-### Community 766 - "Community 766"
-Cohesion: 1.0
-Nodes (1): Download a specific artifact from a workflow run.
-
-### Community 767 - "Community 767"
-Cohesion: 1.0
-Nodes (1): Get raw logs from a failed workflow run.
-
-### Community 768 - "Community 768"
-Cohesion: 1.0
-Nodes (1): Parse Vitest JSON report for failing tests.
-
-### Community 769 - "Community 769"
-Cohesion: 1.0
-Nodes (1): Parse Stryker JSON report for surviving mutants.
-
## Knowledge Gaps
-- **54 isolated node(s):** `Emits JSON progress events on each training log step.`, `qb`, `v2`, `MockIntersectionObserver`, `MockWorker` (+49 more)
+- **27 isolated node(s):** `Emits JSON progress events on each training log step.`, `MockIntersectionObserver`, `MockWorker`, `MockGoogleGenAI`, `MockBroadcastChannel` (+22 more)
These have ≤1 connection - possible missing edges or undocumented components.
-- **Thin community `Community 23`** (36 nodes): `storageService.ts`, `StorageManager`, `.clearApiKey()`, `.clearGeminiApiKey()`, `.constructor()`, `.deleteAllBinderAssetsForProject()`, `.deleteBinderAsset()`, `.deleteImage()`, `.deleteProject()`, `.deleteRagVectors()`, `.deleteSnapshot()`, `.deleteStoryCodex()`, `.getApiKey()`, `.getBackend()`, `.getBinderAsset()`, `.getGeminiApiKey()`, `.getImage()`, `.getRagVectors()`, `.getSnapshotData()`, `.getStoryCodex()`, `.hasSavedData()`, `.initializeBackend()`, `.listBinderAssetIds()`, `.listProjects()`, `.listSnapshots()`, `.loadProject()`, `.loadSettings()`, `.saveApiKey()`, `.saveBinderAsset()`, `.saveGeminiApiKey()`, `.saveImage()`, `.saveProject()`, `.saveRagVectors()`, `.saveSettings()`, `.saveSnapshot()`, `.saveStoryCodex()`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 27`** (17 nodes): `cc`, `._applyAttribute()`, `._assert()`, `.constructor()`, `._eof()`, `._isWhitespace()`, `._next()`, `.parse()`, `._peek()`, `._readAttributes()`, `._readIdentifier()`, `._readRegex()`, `._readString()`, `._readStringOrRegex()`, `._skipWhitespace()`, `._throwError()`, `Gb()`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 32`** (10 nodes): `taskQueue.ts`, `PriorityTaskQueue`, `.constructor()`, `.dequeue()`, `.effectivePriority()`, `.enqueue()`, `.peek()`, `.promoteStarvedTasks()`, `.stats()`, `.totalDepth()`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 45`** (5 nodes): `DashboardHeader.tsx`, `DashboardContext.ts`, `useDashboardContext()`, `Chip()`, `DashboardHeader()`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 49`** (4 nodes): `rc`, `.constructor()`, `.toSource()`, `.toString()`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 52`** (4 nodes): `makeConfig()`, `makeReviewItem()`, `startPipelinePayload()`, `proForgeSlice.test.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 57`** (4 nodes): `make()`, `noop()`, `aiRetry.test.ts`, `aiRetry.test.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 60`** (4 nodes): `useDashboard.test.ts`, `defaultProject()`, `defaultSection()`, `setProjectData()`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 65`** (4 nodes): `ManuscriptDesktopLayout.tsx`, `ManuscriptViewContext.ts`, `ManuscriptDesktopLayout()`, `useManuscriptViewContext()`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 71`** (4 nodes): `getAllTemplates()`, `getQuestionsForArchetype()`, `getTemplateForArchetype()`, `characterInterviewTemplates.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 77`** (3 nodes): `makeSection()`, `plotBoardService.test.ts`, `plotBoardService.test.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 83`** (3 nodes): `makeStream()`, `MockGoogleGenAI`, `geminiService.test.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 86`** (3 nodes): `makeDeps()`, `aiSuggestions.test.ts`, `aiSuggestions.test.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 90`** (3 nodes): `useMicLevel.test.ts`, `FakeAudioContext`, `resolveStream()`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 99`** (3 nodes): `types.ts`, `TaskError`, `.constructor()`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 134`** (2 nodes): `MockIntersectionObserver`, `BookPreviewView.test.tsx`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 145`** (2 nodes): `MockWorker`, `duckdbClient.test.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 151`** (2 nodes): `MockBroadcastChannel`, `tabLeaderElection.test.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 184`** (2 nodes): `useBookPreviewView.test.ts`, `MockIntersectionObserver`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 232`** (2 nodes): `workerPool.test.ts`, `MockWorker`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 274`** (2 nodes): `FileSystemService`, `index.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 279`** (2 nodes): `IndexedDBService`, `index.ts`
- Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 745`** (1 nodes): `Remove ANSI escape codes from text.`
+- **Thin community `Community 22`** (37 nodes): `.initialize()`, `storageService.ts`, `StorageManager`, `.clearApiKey()`, `.clearGeminiApiKey()`, `.constructor()`, `.deleteAllBinderAssetsForProject()`, `.deleteBinderAsset()`, `.deleteImage()`, `.deleteProject()`, `.deleteRagVectors()`, `.deleteSnapshot()`, `.deleteStoryCodex()`, `.getApiKey()`, `.getBackend()`, `.getBinderAsset()`, `.getGeminiApiKey()`, `.getImage()`, `.getRagVectors()`, `.getSnapshotData()`, `.getStoryCodex()`, `.hasSavedData()`, `.initializeBackend()`, `.listBinderAssetIds()`, `.listProjects()`, `.listSnapshots()`, `.loadProject()`, `.loadSettings()`, `.saveApiKey()`, `.saveBinderAsset()`, `.saveGeminiApiKey()`, `.saveImage()`, `.saveProject()`, `.saveRagVectors()`, `.saveSettings()`, `.saveSnapshot()`, `.saveStoryCodex()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 746`** (1 nodes): `Remove timestamp strings from text.`
+- **Thin community `Community 37`** (10 nodes): `taskQueue.ts`, `PriorityTaskQueue`, `.constructor()`, `.dequeue()`, `.effectivePriority()`, `.enqueue()`, `.peek()`, `.promoteStarvedTasks()`, `.stats()`, `.totalDepth()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 747`** (1 nodes): `Replace long base64 strings with placeholder.`
+- **Thin community `Community 38`** (9 nodes): `AudioNavigator`, `.announce()`, `.focusElement()`, `.focusFirstIn()`, `.getFocusedLabel()`, `.nextLandmark()`, `.previousLandmark()`, `.scanLandmarks()`, `audioNavigator.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 748`** (1 nodes): `Remove NPM/pnpm warning lines.`
+- **Thin community `Community 47`** (6 nodes): `getFocusable()`, `onKeyDown()`, `onPointerDown()`, `onPointerMove()`, `onPointerUp()`, `BottomSheet.tsx`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 749`** (1 nodes): `Remove redundant success messages.`
+- **Thin community `Community 53`** (5 nodes): `DashboardHeader.tsx`, `DashboardContext.ts`, `useDashboardContext()`, `Chip()`, `DashboardHeader()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 750`** (1 nodes): `Apply all preprocessing steps to reduce token payload.`
+- **Thin community `Community 61`** (4 nodes): `makeConfig()`, `makeReviewItem()`, `startPipelinePayload()`, `proForgeSlice.test.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 751`** (1 nodes): `Extract only error-related sections from log.`
+- **Thin community `Community 67`** (4 nodes): `make()`, `noop()`, `aiRetry.test.ts`, `aiRetry.test.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 752`** (1 nodes): `Pydantic models for CI Analyzer structured output. QNBS-v3: These models enforce`
+- **Thin community `Community 70`** (4 nodes): `useDashboard.test.ts`, `defaultProject()`, `defaultSection()`, `setProjectData()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 753`** (1 nodes): `Structured CI error for VS Code problem matcher integration.`
+- **Thin community `Community 75`** (4 nodes): `ManuscriptDesktopLayout.tsx`, `ManuscriptViewContext.ts`, `ManuscriptDesktopLayout()`, `useManuscriptViewContext()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 754`** (1 nodes): `Vitest JSON test result structure.`
+- **Thin community `Community 84`** (4 nodes): `Drawer.tsx`, `getFocusable()`, `handleEsc()`, `handleTabKey()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 755`** (1 nodes): `Full Vitest JSON report structure.`
+- **Thin community `Community 85`** (4 nodes): `getAllTemplates()`, `getQuestionsForArchetype()`, `getTemplateForArchetype()`, `characterInterviewTemplates.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 756`** (1 nodes): `Stryker per-file mutation report.`
+- **Thin community `Community 89`** (3 nodes): `resolveViteBase.ts`, `isTauriBuild()`, `resolveViteBase()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 757`** (1 nodes): `Full Stryker JSON report structure.`
+- **Thin community `Community 93`** (3 nodes): `makeSection()`, `plotBoardService.test.ts`, `plotBoardService.test.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 758`** (1 nodes): `Initialize OpenRouter client for Poolside Laguna model.`
+- **Thin community `Community 101`** (3 nodes): `makeStream()`, `MockGoogleGenAI`, `geminiService.test.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 759`** (1 nodes): `Analyze Vitest JSON report and raw logs for errors.`
+- **Thin community `Community 105`** (3 nodes): `makeDeps()`, `aiSuggestions.test.ts`, `aiSuggestions.test.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 760`** (1 nodes): `Analyze Stryker JSON report for surviving mutants.`
+- **Thin community `Community 107`** (3 nodes): `useSwipeGesture.test.ts`, `fireSwipe()`, `makePointerEvent()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 761`** (1 nodes): `Send preprocessed errors to LLM for analysis.`
+- **Thin community `Community 111`** (3 nodes): `useMicLevel.test.ts`, `FakeAudioContext`, `resolveStream()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 762`** (1 nodes): `Format errors for VS Code problem matcher.`
+- **Thin community `Community 123`** (3 nodes): `types.ts`, `TaskError`, `.constructor()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 763`** (1 nodes): `Main entry point for CI analyzer.`
+- **Thin community `Community 163`** (2 nodes): `MockIntersectionObserver`, `BookPreviewView.test.tsx`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 764`** (1 nodes): `Execute gh CLI command and return parsed JSON output.`
+- **Thin community `Community 175`** (2 nodes): `MockWorker`, `duckdbClient.test.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 765`** (1 nodes): `Get the ID of the most recent failed CI run.`
+- **Thin community `Community 182`** (2 nodes): `MockBroadcastChannel`, `tabLeaderElection.test.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 766`** (1 nodes): `Download a specific artifact from a workflow run.`
+- **Thin community `Community 219`** (2 nodes): `useBookPreviewView.test.ts`, `MockIntersectionObserver`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 767`** (1 nodes): `Get raw logs from a failed workflow run.`
+- **Thin community `Community 271`** (2 nodes): `workerPool.test.ts`, `MockWorker`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 768`** (1 nodes): `Parse Vitest JSON report for failing tests.`
+- **Thin community `Community 315`** (2 nodes): `FileSystemService`, `index.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 769`** (1 nodes): `Parse Stryker JSON report for surviving mutants.`
+- **Thin community `Community 319`** (2 nodes): `IndexedDBService`, `index.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
-- **Why does `mt()` connect `Community 2` to `Community 0`, `Community 1`, `Community 4`, `Community 5`, `Community 6`, `Community 10`, `Community 13`, `Community 14`, `Community 17`, `Community 20`, `Community 21`, `Community 22`?**
- _High betweenness centrality (0.082) - this node is a cross-community bridge._
-- **Why does `fn()` connect `Community 7` to `Community 1`, `Community 3`, `Community 8`, `Community 13`, `Community 14`, `Community 21`, `Community 22`?**
- _High betweenness centrality (0.054) - this node is a cross-community bridge._
-- **Why does `wx()` connect `Community 0` to `Community 2`, `Community 4`, `Community 8`, `Community 10`, `Community 19`?**
- _High betweenness centrality (0.039) - this node is a cross-community bridge._
-- **Are the 87 inferred relationships involving `mt()` (e.g. with `pE()` and `xE()`) actually correct?**
- _`mt()` has 87 INFERRED edges - model-reasoned connections that need verification._
+- **Why does `fn()` connect `Community 1` to `Community 0`, `Community 3`, `Community 8`, `Community 15`, `Community 21`, `Community 24`, `Community 29`, `Community 30`?**
+ _High betweenness centrality (0.062) - this node is a cross-community bridge._
+- **Why does `t()` connect `Community 9` to `Community 2`, `Community 7`, `Community 8`, `Community 15`, `Community 16`, `Community 24`, `Community 25`, `Community 26`, `Community 30`?**
+ _High betweenness centrality (0.049) - this node is a cross-community bridge._
+- **Why does `useTranslation()` connect `Community 2` to `Community 0`, `Community 25`, `Community 6`?**
+ _High betweenness centrality (0.030) - this node is a cross-community bridge._
- **Are the 62 inferred relationships involving `fn()` (e.g. with `makeMediaQuery()` and `MockSpeechRecognition()`) actually correct?**
_`fn()` has 62 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 49 inferred relationships involving `t()` (e.g. with `.flattenForSingleProject()` and `fr()`) actually correct?**
- _`t()` has 49 INFERRED edges - model-reasoned connections that need verification._
-- **What connects `Emits JSON progress events on each training log step.`, `qb`, `v2` to the rest of the system?**
- _54 weakly-connected nodes found - possible documentation gaps or missing edges._
\ No newline at end of file
+- **Are the 41 inferred relationships involving `t()` (e.g. with `handleSaveKey()` and `handleRemoveKey()`) actually correct?**
+ _`t()` has 41 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 32 inferred relationships involving `useTranslation()` (e.g. with `ViewLoader()` and `App()`) actually correct?**
+ _`useTranslation()` has 32 INFERRED edges - model-reasoned connections that need verification._
+- **What connects `Emits JSON progress events on each training log step.`, `MockIntersectionObserver`, `MockWorker` to the rest of the system?**
+ _27 weakly-connected nodes found - possible documentation gaps or missing edges._
\ No newline at end of file
diff --git a/package.json b/package.json
index ce938eda..8ff06f88 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "worldscript-studio",
"private": true,
- "version": "1.24.0",
+ "version": "1.24.1",
"description": "WorldScript Studio — offline-first, AI-powered creative writing application.",
"author": "QNBS",
"keywords": [
diff --git a/public/sw.js b/public/sw.js
index 4077b774..46ea50a5 100644
--- a/public/sw.js
+++ b/public/sw.js
@@ -5,7 +5,7 @@
// offline fallback, push notifications, share target
// ============================================================
-const APP_VERSION = '1.24.0';
+const APP_VERSION = '1.24.1';
const CACHE_STATIC = `worldscript-static-v${APP_VERSION}`;
const CACHE_DYNAMIC = `worldscript-dynamic-v${APP_VERSION}`;
const CACHE_IMAGES = `worldscript-images-v${APP_VERSION}`;
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index f925981c..d718c13d 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -6593,7 +6593,7 @@ dependencies = [
[[package]]
name = "worldscript-studio"
-version = "1.24.0"
+version = "1.24.1"
dependencies = [
"base64 0.22.1",
"candle-core",
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index 76463c1d..f1e8b962 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "worldscript-studio"
-version = "1.24.0"
+version = "1.24.1"
description = "AI-powered creative writing and world-building application"
authors = ["QNBS"]
license = "MIT"
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index 13d8bd24..9b5a9069 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -1,7 +1,7 @@
{
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
"productName": "WorldScript Studio",
- "version": "1.24.0",
+ "version": "1.24.1",
"identifier": "com.worldscript.studio",
"build": {
"frontendDist": "../dist",