ltcai 12.3.0 → 12.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +25 -39
  2. package/docs/CHANGELOG.md +44 -0
  3. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  4. package/docs/DEVELOPMENT.md +11 -11
  5. package/docs/ONBOARDING.md +1 -1
  6. package/docs/OPERATIONS.md +1 -1
  7. package/docs/ROADMAP.md +1 -1
  8. package/docs/TRUST_MODEL.md +1 -1
  9. package/docs/WHY_LATTICE.md +1 -1
  10. package/docs/kg-schema.md +1 -1
  11. package/lattice_brain/__init__.py +1 -1
  12. package/latticeai/__init__.py +1 -1
  13. package/latticeai/api/models.py +21 -1
  14. package/latticeai/api/search.py +8 -1
  15. package/latticeai/api/worker_compute.py +9 -1
  16. package/latticeai/core/embedding_providers/__init__.py +14 -0
  17. package/latticeai/core/embedding_providers/autodetect.py +91 -24
  18. package/latticeai/core/embedding_providers/base.py +10 -2
  19. package/latticeai/core/embedding_providers/profiles.py +44 -0
  20. package/latticeai/core/embedding_providers/text.py +325 -2
  21. package/latticeai/models/model_providers.py +2 -0
  22. package/latticeai/services/architecture_readiness.py +1 -1
  23. package/latticeai/services/embedding_recommendation.py +229 -0
  24. package/latticeai/services/model_capability_registry.py +114 -0
  25. package/latticeai/services/model_catalog.py +148 -0
  26. package/latticeai/services/model_engines.py +3 -1
  27. package/latticeai/services/product_readiness.py +1 -1
  28. package/package.json +3 -3
  29. package/requirements.txt +3 -1
  30. package/scripts/bump_version.py +106 -6
  31. package/scripts/check_current_release_docs.mjs +1 -1
  32. package/scripts/check_screenshot_pixel_delta.py +6 -2
  33. package/scripts/release_screen_claims.json +11 -0
  34. package/src-tauri/Cargo.lock +10 -10
  35. package/src-tauri/Cargo.toml +1 -1
  36. package/src-tauri/tauri.conf.json +1 -1
  37. package/static/app/asset-manifest.json +46 -47
  38. package/static/app/assets/Act-DQ2Ldwo8.js +2 -0
  39. package/static/app/assets/AdminConsole-y6EjiXeH.js +1 -0
  40. package/static/app/assets/Brain-CRWWw-h9.js +2 -0
  41. package/static/app/assets/BrainHome-cmvTu7Ea.js +2 -0
  42. package/static/app/assets/BrainSignals-gaNn5E4-.js +1 -0
  43. package/static/app/assets/Capture-BJK7in1j.js +1 -0
  44. package/static/app/assets/Chronicle-BuYZ9lMt.js +1 -0
  45. package/static/app/assets/CommandPalette-BjFwuKaA.js +1 -0
  46. package/static/app/assets/DigitalBrainExplorer-DTBRPYJ3.js +321 -0
  47. package/static/app/assets/Library-BsmZ-YVh.js +1 -0
  48. package/static/app/assets/LivingBrain-aT9hgkPV.js +1 -0
  49. package/static/app/assets/ProductFlow-Ct0QLLY5.js +1 -0
  50. package/static/app/assets/{QueryClientProvider-B3OjqSyJ.js → QueryClientProvider-CTiSBeU6.js} +1 -1
  51. package/static/app/assets/ReviewCard-CdooYtWr.js +3 -0
  52. package/static/app/assets/RunsListPanel-Btf2DIrG.js +1 -0
  53. package/static/app/assets/System-B77M4t-M.js +1 -0
  54. package/static/app/assets/WorkflowGraph-u3ZKLvZe.js +1 -0
  55. package/static/app/assets/WorkflowsPanel--nTFq3Cs.js +2 -0
  56. package/static/app/assets/actHelpers-xNnCfUeC.js +1 -0
  57. package/static/app/assets/arrow-left-Cp4NHbfX.js +1 -0
  58. package/static/app/assets/{bot-CAfN5QD1.js → bot-CXwvpODC.js} +1 -1
  59. package/static/app/assets/{brain-DNNLFQgq.js → brain-BzjoGgor.js} +1 -1
  60. package/static/app/assets/{button-D0k7_k6e.js → button-_hHOhp7g.js} +1 -1
  61. package/static/app/assets/circle-check-qG5dMahn.js +1 -0
  62. package/static/app/assets/{circle-pause-Dxw6SJuA.js → circle-pause-DBOqYYMh.js} +1 -1
  63. package/static/app/assets/{circle-play-DuoLDLEg.js → circle-play-DA0Vf2NH.js} +1 -1
  64. package/static/app/assets/{cpu-BGOpEdGX.js → cpu-DwsE0_o3.js} +1 -1
  65. package/static/app/assets/{download-wXD9L5vN.js → download-iCoe2f2Q.js} +1 -1
  66. package/static/app/assets/{folder-open-CittV8Ey.js → folder-open-C1vNOMhy.js} +1 -1
  67. package/static/app/assets/{hard-drive-CLQPYYBF.js → hard-drive-a73KaYth.js} +1 -1
  68. package/static/app/assets/index-Dbb2YhYw.css +2 -0
  69. package/static/app/assets/index-DpuEeYmP.js +13 -0
  70. package/static/app/assets/{input-RZ8aKj6d.js → input-BclQNHyj.js} +1 -1
  71. package/static/app/assets/jsx-runtime-CU_pEDDh.js +1 -0
  72. package/static/app/assets/{link-2-B7QYeNdJ.js → link-2-D23wihBe.js} +1 -1
  73. package/static/app/assets/{permissionCopy-DFGEuU2d.js → permissionCopy-DiGZRKAY.js} +1 -1
  74. package/static/app/assets/primitives-1S-XCgmz.js +1 -0
  75. package/static/app/assets/search-Cl2k5uhD.js +1 -0
  76. package/static/app/assets/{share-2-Drg0MPgx.js → share-2-47_av_aF.js} +1 -1
  77. package/static/app/assets/{shield-alert-CFKdCGM8.js → shield-alert-BvKq2P-G.js} +1 -1
  78. package/static/app/assets/{textarea-n_69mQP_.js → textarea-DcLO52bu.js} +1 -1
  79. package/static/app/assets/useFocusTrap-CpqVPzJ_.js +1 -0
  80. package/static/app/assets/{useMutation-Dvcq6J6b.js → useMutation-DhI3jqCN.js} +1 -1
  81. package/static/app/assets/workspace-DwNHbqaX.js +1 -0
  82. package/static/app/index.html +4 -4
  83. package/static/sw.js +1 -1
  84. package/static/app/assets/Act-CZXyMcfJ.js +0 -2
  85. package/static/app/assets/AdminConsole-CAkZk0BI.js +0 -1
  86. package/static/app/assets/Brain-DN_7_HSV.js +0 -2
  87. package/static/app/assets/BrainHome-BBP0ouU-.js +0 -2
  88. package/static/app/assets/BrainSignals-nyRNxvQ3.js +0 -1
  89. package/static/app/assets/Capture-DBvFoZKL.js +0 -1
  90. package/static/app/assets/Chronicle-BC5zmR44.js +0 -1
  91. package/static/app/assets/CommandPalette-Bs-Fk6HT.js +0 -1
  92. package/static/app/assets/DigitalBrainExplorer-CNcCktPP.js +0 -321
  93. package/static/app/assets/Library-CxUA4xai.js +0 -1
  94. package/static/app/assets/LivingBrain-CiyjvwKy.js +0 -1
  95. package/static/app/assets/ProductFlow-DccERGr3.js +0 -1
  96. package/static/app/assets/ReviewCard-lawM1khV.js +0 -3
  97. package/static/app/assets/RunsListPanel-DQC-zQ7m.js +0 -1
  98. package/static/app/assets/System-DwqYJQaj.js +0 -1
  99. package/static/app/assets/WorkflowGraph-pJ2eFrhy.js +0 -1
  100. package/static/app/assets/WorkflowsPanel-BIGjfM7h.js +0 -2
  101. package/static/app/assets/actHelpers-DfIqS92u.js +0 -1
  102. package/static/app/assets/arrow-left-DvwQxqcD.js +0 -1
  103. package/static/app/assets/circle-check-hH6updC-.js +0 -1
  104. package/static/app/assets/index-C0VEkbAp.js +0 -13
  105. package/static/app/assets/index-C8gwOf0C.css +0 -2
  106. package/static/app/assets/jsx-runtime-bzQ4Vb5N.js +0 -1
  107. package/static/app/assets/primitives-EKxh12KR.js +0 -1
  108. package/static/app/assets/search-BA5Ge197.js +0 -1
  109. package/static/app/assets/sourceMeta-BzqJiEPI.js +0 -1
  110. package/static/app/assets/useFocusTrap-B0w4AxK1.js +0 -1
  111. package/static/app/assets/workspace-BgBHikYl.js +0 -1
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  [![CD Status](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/publish.yml/badge.svg)](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/publish.yml)
13
13
  [![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
14
14
 
15
- ![v12.3.0 Living Brain walkthrough](output/release/v12.3.0/gifs/v12.3.0-living-brain-walkthrough.gif)
15
+ ![v12.5.0 Living Brain walkthrough](output/release/v12.5.0/gifs/v12.5.0-living-brain-walkthrough.gif)
16
16
 
17
17
  Lattice AI is a Digital Brain that lives on your computer. Chat, files,
18
18
  folders, notes, and web pages all land in one knowledge graph you own.
@@ -42,19 +42,19 @@ LTCAI # then open http://127.0.0.1:4825/app
42
42
 
43
43
  | | | |
44
44
  | --- | --- | --- |
45
- | ![Login](output/release/v12.3.0/screenshots/01-login.png) | ![Model install](output/release/v12.3.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v12.3.0/screenshots/07-model-library.png) |
45
+ | ![Login](output/release/v12.5.0/screenshots/01-login.png) | ![Model install](output/release/v12.5.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v12.5.0/screenshots/07-model-library.png) |
46
46
 
47
47
  Screenshot index:
48
- [output/release/v12.3.0/SCREENSHOT_INDEX.md](output/release/v12.3.0/SCREENSHOT_INDEX.md)
48
+ [output/release/v12.5.0/SCREENSHOT_INDEX.md](output/release/v12.5.0/SCREENSHOT_INDEX.md)
49
49
 
50
50
  ## What you can do
51
51
 
52
52
  | | |
53
53
  | --- | --- |
54
- | **See your Brain's story in time** — a growth curve, an activity heatmap, and each day's story ![Brain Chronicle](output/release/v12.3.0/screenshots/13-chronicle.png) | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v12.3.0/screenshots/04-brain-chat-home.png) |
55
- | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v12.3.0/screenshots/05-memory-graph.png) | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v12.3.0/screenshots/06-capture.png) |
56
- | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v12.3.0/screenshots/12-review-center.png) | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v12.3.0/screenshots/02-recommended-models.png) |
57
- | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v12.3.0/screenshots/11-knowledge-journey.png) | **Say how much it may do alone** — one dial in plain words ![Settings](output/release/v12.3.0/screenshots/08-system.png) |
54
+ | **See your Brain's story in time** — a growth curve, an activity heatmap, and each day's story ![Brain Chronicle](output/release/v12.5.0/screenshots/13-chronicle.png) | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v12.5.0/screenshots/04-brain-chat-home.png) |
55
+ | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v12.5.0/screenshots/05-memory-graph.png) | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v12.5.0/screenshots/06-capture.png) |
56
+ | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v12.5.0/screenshots/12-review-center.png) | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v12.5.0/screenshots/02-recommended-models.png) |
57
+ | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v12.5.0/screenshots/11-knowledge-journey.png) | **Say how much it may do alone** — one dial in plain words ![Settings](output/release/v12.5.0/screenshots/08-system.png) |
58
58
 
59
59
  ## Why this is yours
60
60
 
@@ -70,42 +70,27 @@ Screenshot index:
70
70
 
71
71
  ## Current Release
72
72
 
73
- The current release is **12.3.0 — Live Wire**:
74
-
75
- Model catalog routes, GGUF quantization tags, small-model tool/MCP calling,
76
- and HTML generation/inspection/download are verified end-to-end against live
77
- repositories and a loaded local model. The door is still **422 operations /
78
- 41 families** over a **20-route worker**. Cloud is still optional and the
79
- default is still local.
80
-
81
- - **Verified Hugging Face GGUF tags & routes.** `ggml-org/gemma-4-*-GGUF`
82
- uses `Q4_0`, `ggml-org/gpt-oss-20b-GGUF` uses `MXFP4`, and `Qwen3.5-9B` /
83
- `Qwen3.6-35B-A3B` GGUF routes are wired across `ollama`, `lmstudio`, and
84
- `llamacpp`.
85
- - **Auxiliary GGUF filtering, `--mmproj` companion load, and shard checks.**
86
- `mmproj-`/`mtp-`/`dflash-`/`eagle3-`/`imatrix` GGUFs are excluded from
87
- primary weight selection, companion `mmproj-*.gguf` files are downloaded
88
- for `llama-server`, and `model.safetensors.index.json` shards are verified.
89
- - **Small-model tool calling & MCP calling hardening.** Expanded
90
- `KNOWN_ACTIONS`, stringified `arguments` recovery, OpenAI `tool_calls`
91
- array unwrapping, fenced HTML/code block salvage, and `adopt_named_args`
92
- in `perform_action`.
93
- - **HTML structure inspection & RFC 5987 UTF-8 download.**
94
- `POST /tools/inspect_html` extracts `title`, `links`, `scripts`,
95
- `stylesheets`, `images`, `forms`, and `headings`; `GET /tools/download`
96
- decodes UTF-8 paths and sends `filename*=UTF-8''...`.
73
+ The current release is **12.5.0 — Deep Vector**:
74
+
75
+ The embedding pipeline adds native **Google EmbeddingGemma 2** (`google/embeddinggemma-2`, 768-dim) support with Hugging Face mean-pooling and L2 normalization, adds **hardware-aware embedding model recommendations** that calculate host RAM/VRAM reservations before recommending LLMs, migrates screenshot pixel diffing to Pillow 13+ `get_flattened_data()`, upgrades GitHub Actions CI/CD to Node 24 native major versions, and automates full OpenAPI specification and fragment synchronization in `scripts/bump_version.py`. The door is still **422 operations / 41 families** over a **20-route worker**. Cloud is still optional and the default is still local.
76
+
77
+ - **Google EmbeddingGemma 2 native integration.** Native Hugging Face embedding provider support (`google/embeddinggemma-2`, `embeddinggemma-2`, `embeddinggemma-2-4bit`, `embeddinggemma-2-8bit`, `embeddinggemma-300m`, 768-dimensional vectors) in `latticeai/core/embedding_providers/text.py` with mean pooling, L2 normalization, task instruction prefixes, and automatic semantic activation. Hash embedding fallback remains preserved when offline.
78
+ - **Hardware-aware PC-tailored embedding recommendations.** Modularized `recommend_embedding_for_host` in `lattice-platform` and `latticeai/services/embedding_recommendation.py`. Systems with >=8GB RAM receive `google/embeddinggemma-2` with a 0.5GB–1.5GB reserved RAM budget; smaller hosts receive `google/embeddinggemma-300m`. The host probe calculates `effective_ram_gb` before LLM tier selection.
79
+ - **Onboarding and Model Library embedding UI.** Added the PC-tailored EmbeddingGemma 2 recommendation card in `ProductFlow.tsx` with full i18n support, and surfaced Google EmbeddingGemma 2 in the Model Library (`Library.tsx`) embedding section with 1-click install and activation.
80
+ - **Pillow 13+ flattened data & CI/CD modernisation.** Replaced Pillow 14-deprecated `diff.getdata()` calls in `scripts/check_screenshot_pixel_delta.py` with `diff.get_flattened_data()`, and pinned GitHub Actions to Node 24 native versions with `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"`.
81
+ - **OpenAPI specification and fixture version automation.** Extended `scripts/bump_version.py` to synchronize `frontend/openapi.json`, `rust/fixtures/openapi/_envelope.json`, all 13 OpenAPI fragment files, and `rust/fixtures/openapi/_index.json` with recomputed SHA-256 digests across 49 targets.
97
82
 
98
83
  Release notes live in [docs/releases/](docs/releases/). This version:
99
- [docs/releases/RELEASE_NOTES_v12.3.0.md](docs/releases/RELEASE_NOTES_v12.3.0.md).
84
+ [docs/releases/RELEASE_NOTES_v12.5.0.md](docs/releases/RELEASE_NOTES_v12.5.0.md).
100
85
  Guide: [RELEASE.md](RELEASE.md) · History: [docs/CHANGELOG.md](docs/CHANGELOG.md).
101
86
 
102
- Expected artifacts for 12.3.0 must use exact filenames:
87
+ Expected artifacts for 12.5.0 must use exact filenames:
103
88
 
104
- - `dist/ltcai-12.3.0-py3-none-any.whl`
105
- - `dist/ltcai-12.3.0.tar.gz`
106
- - `ltcai-12.3.0.tgz`
107
- - `dist/ltcai-12.3.0.vsix`
108
- - `src-tauri/target/release/bundle/dmg/Lattice AI_12.3.0_aarch64.dmg`
89
+ - `dist/ltcai-12.5.0-py3-none-any.whl`
90
+ - `dist/ltcai-12.5.0.tar.gz`
91
+ - `ltcai-12.5.0.tgz`
92
+ - `dist/ltcai-12.5.0.vsix`
93
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_12.5.0_aarch64.dmg`
109
94
 
110
95
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
111
96
 
@@ -176,7 +161,7 @@ Validation via `npm run lint`, `npm run test:unit`, `npm run test:visual`.
176
161
  pending-only, no Self-Model refiner, `delete_node` leaving `PART_OF`,
177
162
  review events silent without an owner, KG-api ingest text-only, two
178
163
  store cycles per review mutation) are listed with their reasons in
179
- [docs/releases/RELEASE_NOTES_v12.3.0.md](docs/releases/RELEASE_NOTES_v12.3.0.md)
164
+ [docs/releases/RELEASE_NOTES_v12.4.0.md](docs/releases/RELEASE_NOTES_v12.4.0.md)
180
165
  and prioritized in [docs/ROADMAP.md](docs/ROADMAP.md).
181
166
 
182
167
  ## Release History
@@ -188,6 +173,7 @@ same boundary. Earlier notes live in [docs/releases/](docs/releases/).
188
173
 
189
174
  | Version | Theme |
190
175
  | --- | --- |
176
+ | 12.4.0 | Sharp Weight |
191
177
  | 12.3.0 | Live Wire |
192
178
  | 12.2.1 | True Count |
193
179
  | 12.2.0 | Small Voice |
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,50 @@ The top entry is either the current unreleased main-branch work or the current
4
4
  release line. Older entries are historical and may describe behavior as it
5
5
  existed at that release.
6
6
 
7
+ ## [12.5.0] - 2026-11-11 — Deep Vector
8
+
9
+ ### Added
10
+ - Added native Hugging Face embedding provider for Google EmbeddingGemma 2 (`google/embeddinggemma-2`, `embeddinggemma-2`, `embeddinggemma-2-4bit`, `embeddinggemma-2-8bit`, `embeddinggemma-300m`, 768-dim) with mean-pooling, L2 normalization, task prefixes, and fallback protection in `latticeai/core/embedding_providers/text.py`.
11
+ - Added hardware-aware PC-tailored embedding recommendations (`recommend_embedding_for_host`) in `rust/lattice-platform/src/modelops/models_catalog/embedding.rs` and `latticeai/services/embedding_recommendation.py` with memory reservation (0.5GB–1.5GB for Gemma 2, 0.3GB for 300M) before LLM selection.
12
+ - Added PC-tailored EmbeddingGemma 2 recommendation card in `ProductFlow.tsx` (i18n supported) and surfaced Google EmbeddingGemma 2 in `Library.tsx` with 1-click prepare/download.
13
+ - Added comprehensive visual E2E test suite `tests/visual/v3.all_buttons_inspection.spec.js` asserting all routes, controls, tabs, and buttons operate with 0 errors.
14
+
15
+ ### Changed
16
+ - Migrated `scripts/check_screenshot_pixel_delta.py` from Pillow 14-deprecated `diff.getdata()` to `diff.get_flattened_data()`.
17
+ - Upgraded all GitHub Actions workflows (`.github/workflows/*.yml`) to Node 24 native major versions with `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"`.
18
+ - Automated OpenAPI specification and fixture version synchronization across 49 targets in `scripts/bump_version.py`.
19
+
20
+ ## [12.4.0] - 2026-11-11 — Sharp Weight
21
+
22
+ ### Added
23
+ - Added `mlx-community/Qwen3.8-27B-4bit` (`16.1GB`, `qwen3_5`) to the local
24
+ model capability registry, multi-engine GGUF/HF routes
25
+ (`ggml-org/Qwen3.8-27B-GGUF:Q4_K_M`, `Qwen/Qwen3.8-27B`), `together` and
26
+ `openrouter` cloud catalogs, and Rust `CATALOG_HINTS`.
27
+ - Added `mlx-community/gemma-4-26B-A4B-it-qat-4bit` (`15.6GB`, routed to
28
+ Google's official QAT GGUF `google/gemma-4-26B-A4B-it-qat-q4_0-gguf:Q4_0` and
29
+ `google/gemma-4-26B-A4B-it-qat-q4_0-unquantized`) and
30
+ `mlx-community/gemma-4-26B-A4B-it-qat-OptiQ-4bit` (`21.9GB`, sensitivity-guided
31
+ mixed 4-bit/8-bit `mlx-optiq` build on Google's QAT base) to the capability
32
+ registry, engine routes, and Rust `CATALOG_HINTS`.
33
+
34
+ ### Changed
35
+ - Upgraded `pillow` dependency constraint to `>=13,<14` in `pyproject.toml` and
36
+ `requirements.txt` (closing 39 CVEs in `pillow 12.3.0`), and synchronized
37
+ `reportlab>=4,<5` and `huggingface_hub>=1.0,<2` in `requirements.txt`.
38
+ - Updated npm dependencies and lockfiles in root and `vscode-extension`
39
+ (`vitest` and `@vitest/coverage-v8` `^4.1.12`, `glob` `^14.0.4`, `minimatch`
40
+ `^11.0.7`) so `npm audit` reports 0 vulnerabilities.
41
+
42
+ ### Fixed
43
+ - Hardened `_json_request` and `get_openai_compatible_server_models` in
44
+ `latticeai/services/model_engines.py` to reject non-`http(s)://` URL schemes.
45
+ - Fixed `admin_log_retention` in `rust/lattice-platform/src/adminops/admin/handlers.rs`
46
+ to read `state.auth.clock().now()` instead of real wall-clock `unix_now()`,
47
+ eliminating wall-clock drift against deterministic audit fixtures.
48
+ - Scoped `@import "tailwindcss" source("..");` in `frontend/src/styles.css` so
49
+ `@tailwindcss/oxide` only scans `frontend/` instead of walking `rust/target`.
50
+
7
51
  ## [12.3.0] - 2026-10-19 — Live Wire
8
52
 
9
53
  ### Added
@@ -1,6 +1,6 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **12.3.0 — Live Wire**.
3
+ Current release: **12.5.0 — Deep Vector**.
4
4
 
5
5
  LatticeAI defines the path from a strong local-first framework (8.4.0
6
6
  action-aware baseline, 8.5.0 registry+DI hardening, 8.6.0 capture/navigation
@@ -3,7 +3,7 @@
3
3
  > **Status: canonical** — current contributor guidance, kept in sync with the
4
4
  > current release.
5
5
 
6
- Current release: **12.3.0 — Live Wire**.
6
+ Current release: **12.5.0 — Deep Vector**.
7
7
 
8
8
  This document is the contributor onboarding path: how to boot the tree, where
9
9
  a change belongs, which gates will go red, and the house rules that keep the
@@ -80,7 +80,7 @@ worker interpreter with `LTCAI_PYTHON` when both exist.
80
80
  `rust/target/release/lattice-host`, then `rust/target/debug/lattice-host`. If
81
81
  none exist it runs `cargo build -p lattice-host` (debug). A stale
82
82
  `rust/target/release/lattice-host` wins over a current debug binary — pin or
83
- rebuild (`cargo build -p lattice-host --release`) if `-V` is not 12.3.0.
83
+ rebuild (`cargo build -p lattice-host --release`) if `-V` is not 12.4.0.
84
84
 
85
85
  Do not run `npm start` and `npm run dev` on the same port. The worker
86
86
  entrypoint defaults to `LATTICEAI_PORT` or **4825**, the same port as the
@@ -237,7 +237,7 @@ in `rust/`.
237
237
  Markdown) and `scripts/check_doc_status.mjs` (every relative link under the
238
238
  root canonical docs and `docs/**`). A red line is a broken relative path —
239
239
  fix the href or put the file where the href says. Canonical docs (this one
240
- included) must carry `Current release: **12.3.0 — …**` matching
240
+ included) must carry `Current release: **12.5.0 — …**` matching
241
241
  `package.json`; do not bump that marker here ahead of the release lane.
242
242
  `npm run docs:check-current` is the release-set version pin
243
243
  ([`scripts/check_current_release_docs.mjs`](../scripts/check_current_release_docs.mjs)).
@@ -248,7 +248,7 @@ changelog entries that mention old versions stay.
248
248
  ### Release-evidence binding
249
249
 
250
250
  `scripts/check_release_evidence_bound.mjs` (lint member 9) checks that
251
- `output/release/v12.3.0/SCREENSHOT_INDEX.md` still names the live
251
+ `output/release/v12.4.0/SCREENSHOT_INDEX.md` still names the live
252
252
  `static/app/asset-manifest.json` digest and the visual mock-server
253
253
  fingerprint. It exists so a later `npm run build:assets` cannot ship
254
254
  screenshots of an older UI, and so a mock-server edit cannot leave the
@@ -317,19 +317,19 @@ For user-facing, API, runtime, release, or packaging changes, check:
317
317
  appears
318
318
 
319
319
  The release-docs lane owns README / ARCHITECTURE / FEATURE_STATUS version
320
- bumps. Do not move this file's `Current release` marker off 12.3.0 ahead of
320
+ bumps. Do not move this file's `Current release` marker off 12.5.0 ahead of
321
321
  that lane.
322
322
 
323
323
  Release/publish examples must use exact target-version filenames. Do not
324
324
  document wildcard artifact upload commands.
325
325
 
326
- For 12.3.0 release work, exact artifacts are:
326
+ For 12.5.0 release work, exact artifacts are:
327
327
 
328
- - `dist/ltcai-12.3.0-py3-none-any.whl`
329
- - `dist/ltcai-12.3.0.tar.gz`
330
- - `ltcai-12.3.0.tgz`
331
- - `dist/ltcai-12.3.0.vsix`
332
- - `src-tauri/target/release/bundle/dmg/Lattice AI_12.3.0_aarch64.dmg`
328
+ - `dist/ltcai-12.5.0-py3-none-any.whl`
329
+ - `dist/ltcai-12.5.0.tar.gz`
330
+ - `ltcai-12.5.0.tgz`
331
+ - `dist/ltcai-12.5.0.vsix`
332
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_12.5.0_aarch64.dmg`
333
333
 
334
334
  The dmg is ad-hoc signed (effectively unsigned); `npm run release:validate`
335
335
  checks the names and presence, not a Developer ID signature.
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Onboarding
2
2
 
3
- Current release: **12.3.0 — Live Wire**.
3
+ Current release: **12.5.0 — Deep Vector**.
4
4
 
5
5
  The first-run goal is a five-minute path from "I opened the app" to "my Brain
6
6
  has a source, a question, and proof." This page is the product contract behind
@@ -1,4 +1,4 @@
1
- # Lattice AI — Operations Guide (v12.3.0)
1
+ # Lattice AI — Operations Guide (v12.5.0)
2
2
 
3
3
  > **Status: canonical** — kept in sync with the current release. Storage layout
4
4
  > below reflects the SQLite live Brain store and workspace scoping, not the
package/docs/ROADMAP.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > **Status: reference** — point-in-time inventory, redated at v12.0.0. Not a
4
4
  > canonical current-release document; version gates do not bind it.
5
5
 
6
- As of **2026-10-19**, against the 12.3.0 — Live Wire tree. The rows below
6
+ As of **2026-11-11**, against the 12.4.0 — Sharp Weight tree. The rows below
7
7
  were gathered against 11.9.0 and re-checked when 12.0.0 shipped; what that
8
8
  release closed is marked closed rather than deleted, so the ledger still
9
9
  shows what was owed.
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **12.3.0 — Live Wire**.
3
+ Current release: **12.5.0 — Deep Vector**.
4
4
 
5
5
  Lattice AI is local-first, explicit about external communication, and honest
6
6
  when a capability is unavailable.
@@ -1,6 +1,6 @@
1
1
  # Why Lattice AI Exists
2
2
 
3
- Current release: **12.3.0 — Live Wire**.
3
+ Current release: **12.5.0 — Deep Vector**.
4
4
 
5
5
  **Lattice AI is a local-first Digital Brain that keeps your knowledge durable
6
6
  across any AI model.**
package/docs/kg-schema.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Knowledge Graph Schema
2
2
 
3
- Current release: **12.3.0 — Live Wire**.
3
+ Current release: **12.5.0 — Deep Vector**.
4
4
 
5
5
  명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
6
6
  구현: `lattice_brain/graph/schema.py`
@@ -31,7 +31,7 @@ from .multimodal import (
31
31
  transcribe_audio,
32
32
  )
33
33
 
34
- __version__ = "12.3.0"
34
+ __version__ = "12.5.0"
35
35
 
36
36
  __all__ = [
37
37
  "AudioFacts",
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "12.3.0"
3
+ __version__ = "12.5.0"
@@ -264,6 +264,11 @@ def create_models_router(
264
264
  "size": item["size"],
265
265
  "display_name": item.get("name") or item.get("id"),
266
266
  "modality": item.get("modality") or "multimodal",
267
+ "category": item.get("category") or ("embedding" if item.get("task") == "embedding" else "chat"),
268
+ "task": item.get("task") or ("embedding" if item.get("category") == "embedding" else "chat"),
269
+ "role": item.get("role") or ("embedding" if item.get("category") == "embedding" else "chat"),
270
+ "dimensions": item.get("dimensions"),
271
+ "hf_repo_id": item.get("hf_repo_id") or item["id"],
267
272
  "source_country": item.get("source_country"),
268
273
  "source_company": item.get("source_company"),
269
274
  "execution_method": item.get("execution_method"),
@@ -356,12 +361,27 @@ def create_models_router(
356
361
  )
357
362
  # 5.2.0: surface structured registry info (verified status, hf, hardware, strategies) for UX
358
363
  try:
359
- from latticeai.services.model_catalog import get_verified_models
364
+ from latticeai.services.model_catalog import (
365
+ get_verified_models,
366
+ recommend_embedding_for_hardware,
367
+ )
360
368
  verified = get_verified_models()
369
+ embedding_rec = recommend_embedding_for_hardware()
361
370
  except Exception:
362
371
  verified = []
372
+ embedding_rec = {
373
+ "id": "google/embeddinggemma-2",
374
+ "hf_repo_id": "google/embeddinggemma-2",
375
+ "name": "Google EmbeddingGemma 2",
376
+ "category": "embedding",
377
+ "task": "embedding",
378
+ "role": "embedding",
379
+ "dimensions": 768,
380
+ }
363
381
  return {
364
382
  "recommended": recommended,
383
+ "embedding_model": embedding_rec.get("id") or "google/embeddinggemma-2",
384
+ "embedding_recommendation": embedding_rec,
365
385
  "cloud": _router.detected_cloud_models(),
366
386
  "engines": engines,
367
387
  "loaded": _router.loaded_model_ids,
@@ -23,6 +23,10 @@ from typing import Any, Callable, Dict, NoReturn, Optional
23
23
 
24
24
  from fastapi import APIRouter, HTTPException, Request
25
25
 
26
+ from latticeai.core.embedding_providers.profiles import (
27
+ RECOMMENDED_EMBEDDING_MODEL,
28
+ RECOMMENDED_EMBEDDING_PROFILE,
29
+ )
26
30
  from latticeai.services.search_service import SearchService
27
31
 
28
32
 
@@ -44,8 +48,11 @@ def create_search_router(
44
48
  require_user(request)
45
49
  resolved = embedding_info() if embedding_info else {}
46
50
  try:
47
- return service.embeddings_status(resolved=resolved, refresh=refresh)
51
+ payload = dict(service.embeddings_status(resolved=resolved, refresh=refresh))
48
52
  except ValueError as exc:
49
53
  _raise_embedder_error(exc)
54
+ payload.setdefault("recommended_model", RECOMMENDED_EMBEDDING_MODEL)
55
+ payload.setdefault("recommended_profile", RECOMMENDED_EMBEDDING_PROFILE)
56
+ return payload
50
57
 
51
58
  return router
@@ -85,6 +85,10 @@ from pydantic import BaseModel, Field
85
85
 
86
86
  from latticeai.api.agent_worker_seam import SEAM_RATE_BUCKET
87
87
  from latticeai.api.agent_worker_seam import _seam_open as seam_open
88
+ from latticeai.core.embedding_providers.profiles import (
89
+ RECOMMENDED_EMBEDDING_MODEL,
90
+ RECOMMENDED_EMBEDDING_PROFILE,
91
+ )
88
92
  from latticeai.core.messages import MESSAGES, http_error, resolve_language
89
93
  from latticeai.core.quiet import quiet
90
94
  from latticeai.services.voice_capture import (
@@ -633,6 +637,7 @@ def create_worker_compute_router(
633
637
  if callable(role_aware)
634
638
  else await asyncio.to_thread(provider.embed_batch, texts)
635
639
  )
640
+ grade = getattr(provider, "grade", "fallback")
636
641
  return {
637
642
  "vectors": vectors,
638
643
  "dim": provider.dim,
@@ -641,7 +646,10 @@ def create_worker_compute_router(
641
646
  "kind": kind,
642
647
  # Additive (v12.0.0): `fallback` means these vectors are feature
643
648
  # hashes, not meaning. A caller that stores them can say so.
644
- "grade": getattr(provider, "grade", "fallback"),
649
+ "grade": grade,
650
+ "semantic": grade != "fallback",
651
+ "recommended_model": RECOMMENDED_EMBEDDING_MODEL,
652
+ "recommended_profile": RECOMMENDED_EMBEDDING_PROFILE,
645
653
  }
646
654
 
647
655
  @router.post("/worker/parse")
@@ -70,9 +70,11 @@ from lattice_brain.embeddings import LocalEmbeddingModel as LocalEmbeddingModel
70
70
 
71
71
  from .autodetect import AUTO_PROVIDER as AUTO_PROVIDER
72
72
  from .autodetect import AUTODETECT_ENV as AUTODETECT_ENV
73
+ from .autodetect import LOCAL_HF_MODELS as LOCAL_HF_MODELS
73
74
  from .autodetect import LOCAL_MLX_MODELS as LOCAL_MLX_MODELS
74
75
  from .autodetect import Detection as Detection
75
76
  from .autodetect import detect_embedder as detect_embedder
77
+ from .autodetect import detect_local_hf as detect_local_hf
76
78
  from .autodetect import detect_local_mlx as detect_local_mlx
77
79
  from .autodetect import detect_ollama as detect_ollama
78
80
  from .autodetect import resolve_auto_provider as resolve_auto_provider
@@ -92,11 +94,16 @@ from .captions import VisionCaptioner as VisionCaptioner
92
94
  from .captions import resolve_vision_captioner as resolve_vision_captioner
93
95
  from .captions import vision_caption_port as vision_caption_port
94
96
  from .profiles import PRODUCTION_PROVIDER_PROFILES as PRODUCTION_PROVIDER_PROFILES
97
+ from .profiles import RECOMMENDED_EMBEDDING_MODEL as RECOMMENDED_EMBEDDING_MODEL
98
+ from .profiles import RECOMMENDED_EMBEDDING_PROFILE as RECOMMENDED_EMBEDDING_PROFILE
95
99
  from .profiles import embedding_provider_profiles as embedding_provider_profiles
96
100
  from .profiles import resolve_embedding_profile as resolve_embedding_profile
101
+ from .text import DEFAULT_HF_EMBEDDING_MODEL as DEFAULT_HF_EMBEDDING_MODEL
102
+ from .text import EMBEDDINGGEMMA_PREFIXES as EMBEDDINGGEMMA_PREFIXES
97
103
  from .text import PROVIDER_TYPES as PROVIDER_TYPES
98
104
  from .text import CustomEmbeddingProvider as CustomEmbeddingProvider
99
105
  from .text import HashEmbeddingProvider as HashEmbeddingProvider
106
+ from .text import HuggingFaceEmbeddingProvider as HuggingFaceEmbeddingProvider
100
107
  from .text import MLXEmbeddingProvider as MLXEmbeddingProvider
101
108
  from .text import OllamaEmbeddingProvider as OllamaEmbeddingProvider
102
109
  from .text import OpenAICompatibleEmbeddingProvider as OpenAICompatibleEmbeddingProvider
@@ -123,9 +130,15 @@ from .vision import resolve_vision_embedder as resolve_vision_embedder
123
130
  __all__ = [
124
131
  "AUTODETECT_ENV",
125
132
  "AUTO_PROVIDER",
133
+ "DEFAULT_HF_EMBEDDING_MODEL",
134
+ "EMBEDDINGGEMMA_PREFIXES",
135
+ "LOCAL_HF_MODELS",
126
136
  "LOCAL_MLX_MODELS",
137
+ "RECOMMENDED_EMBEDDING_MODEL",
138
+ "RECOMMENDED_EMBEDDING_PROFILE",
127
139
  "Detection",
128
140
  "detect_embedder",
141
+ "detect_local_hf",
129
142
  "detect_local_mlx",
130
143
  "detect_ollama",
131
144
  "resolve_auto_provider",
@@ -151,6 +164,7 @@ __all__ = [
151
164
  "resolve_vision_embedder",
152
165
  "vision_caption_port",
153
166
  "HashEmbeddingProvider",
167
+ "HuggingFaceEmbeddingProvider",
154
168
  "MLXEmbeddingProvider",
155
169
  "OllamaEmbeddingProvider",
156
170
  "OpenAICompatibleEmbeddingProvider",