ltcai 12.3.0 → 12.4.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 (98) hide show
  1. package/README.md +39 -39
  2. package/docs/CHANGELOG.md +31 -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/models/model_providers.py +2 -0
  14. package/latticeai/services/architecture_readiness.py +1 -1
  15. package/latticeai/services/model_capability_registry.py +77 -0
  16. package/latticeai/services/model_catalog.py +18 -0
  17. package/latticeai/services/model_engines.py +3 -1
  18. package/latticeai/services/product_readiness.py +1 -1
  19. package/package.json +3 -3
  20. package/requirements.txt +3 -1
  21. package/scripts/check_current_release_docs.mjs +1 -1
  22. package/scripts/release_screen_claims.json +11 -0
  23. package/src-tauri/Cargo.lock +10 -10
  24. package/src-tauri/Cargo.toml +1 -1
  25. package/src-tauri/tauri.conf.json +1 -1
  26. package/static/app/asset-manifest.json +46 -47
  27. package/static/app/assets/Act-inLiZfDE.js +2 -0
  28. package/static/app/assets/AdminConsole-iLFwSJSg.js +1 -0
  29. package/static/app/assets/Brain-Cb7noiNc.js +2 -0
  30. package/static/app/assets/BrainHome-CfiJ4tau.js +2 -0
  31. package/static/app/assets/BrainSignals-ShxKNNqr.js +1 -0
  32. package/static/app/assets/Capture-Cajj1Trf.js +1 -0
  33. package/static/app/assets/Chronicle-CPd8GP_O.js +1 -0
  34. package/static/app/assets/CommandPalette-Cb_GWoYC.js +1 -0
  35. package/static/app/assets/DigitalBrainExplorer-Df6KVrBz.js +321 -0
  36. package/static/app/assets/Library-Dk5Mefl_.js +1 -0
  37. package/static/app/assets/LivingBrain-u9X_XGC2.js +1 -0
  38. package/static/app/assets/{ProductFlow-DccERGr3.js → ProductFlow-CpX0BMr9.js} +1 -1
  39. package/static/app/assets/{QueryClientProvider-B3OjqSyJ.js → QueryClientProvider-CTiSBeU6.js} +1 -1
  40. package/static/app/assets/ReviewCard-C64YFHOR.js +3 -0
  41. package/static/app/assets/RunsListPanel-DKZEJcxF.js +1 -0
  42. package/static/app/assets/System-Dretrknf.js +1 -0
  43. package/static/app/assets/WorkflowGraph-CE6XgWjJ.js +1 -0
  44. package/static/app/assets/WorkflowsPanel-MKU05J7_.js +2 -0
  45. package/static/app/assets/actHelpers-BjMnKMCI.js +1 -0
  46. package/static/app/assets/arrow-left-Cbck4Ig2.js +1 -0
  47. package/static/app/assets/{bot-CAfN5QD1.js → bot-Qgvc2PGU.js} +1 -1
  48. package/static/app/assets/{brain-DNNLFQgq.js → brain-BwGnubn8.js} +1 -1
  49. package/static/app/assets/{button-D0k7_k6e.js → button-DEloiIsj.js} +1 -1
  50. package/static/app/assets/circle-check-CDygnRMn.js +1 -0
  51. package/static/app/assets/{circle-pause-Dxw6SJuA.js → circle-pause-CkkmXxA9.js} +1 -1
  52. package/static/app/assets/{circle-play-DuoLDLEg.js → circle-play-rnb6A1zq.js} +1 -1
  53. package/static/app/assets/{cpu-BGOpEdGX.js → cpu-CzcGFQQq.js} +1 -1
  54. package/static/app/assets/{download-wXD9L5vN.js → download-BTQigJvp.js} +1 -1
  55. package/static/app/assets/{folder-open-CittV8Ey.js → folder-open-CIXPPhhm.js} +1 -1
  56. package/static/app/assets/{hard-drive-CLQPYYBF.js → hard-drive-CZXxdIcT.js} +1 -1
  57. package/static/app/assets/index-CHQbWj9a.js +13 -0
  58. package/static/app/assets/index-C_dThdD6.css +2 -0
  59. package/static/app/assets/{input-RZ8aKj6d.js → input-CTZHuOXe.js} +1 -1
  60. package/static/app/assets/jsx-runtime-CU_pEDDh.js +1 -0
  61. package/static/app/assets/{link-2-B7QYeNdJ.js → link-2-BsG1NQUA.js} +1 -1
  62. package/static/app/assets/{permissionCopy-DFGEuU2d.js → permissionCopy-klyWL3ai.js} +1 -1
  63. package/static/app/assets/primitives-ZmN4jzq-.js +1 -0
  64. package/static/app/assets/search-xjKVb4Nh.js +1 -0
  65. package/static/app/assets/{share-2-Drg0MPgx.js → share-2-Cuv9rj7A.js} +1 -1
  66. package/static/app/assets/{shield-alert-CFKdCGM8.js → shield-alert-KKySFd03.js} +1 -1
  67. package/static/app/assets/{textarea-n_69mQP_.js → textarea-CBwqgGSA.js} +1 -1
  68. package/static/app/assets/useFocusTrap-D93vds_Z.js +1 -0
  69. package/static/app/assets/{useMutation-Dvcq6J6b.js → useMutation-B9hHPD0p.js} +1 -1
  70. package/static/app/assets/{workspace-BgBHikYl.js → workspace-JGzrc0D8.js} +1 -1
  71. package/static/app/index.html +4 -4
  72. package/static/sw.js +1 -1
  73. package/static/app/assets/Act-CZXyMcfJ.js +0 -2
  74. package/static/app/assets/AdminConsole-CAkZk0BI.js +0 -1
  75. package/static/app/assets/Brain-DN_7_HSV.js +0 -2
  76. package/static/app/assets/BrainHome-BBP0ouU-.js +0 -2
  77. package/static/app/assets/BrainSignals-nyRNxvQ3.js +0 -1
  78. package/static/app/assets/Capture-DBvFoZKL.js +0 -1
  79. package/static/app/assets/Chronicle-BC5zmR44.js +0 -1
  80. package/static/app/assets/CommandPalette-Bs-Fk6HT.js +0 -1
  81. package/static/app/assets/DigitalBrainExplorer-CNcCktPP.js +0 -321
  82. package/static/app/assets/Library-CxUA4xai.js +0 -1
  83. package/static/app/assets/LivingBrain-CiyjvwKy.js +0 -1
  84. package/static/app/assets/ReviewCard-lawM1khV.js +0 -3
  85. package/static/app/assets/RunsListPanel-DQC-zQ7m.js +0 -1
  86. package/static/app/assets/System-DwqYJQaj.js +0 -1
  87. package/static/app/assets/WorkflowGraph-pJ2eFrhy.js +0 -1
  88. package/static/app/assets/WorkflowsPanel-BIGjfM7h.js +0 -2
  89. package/static/app/assets/actHelpers-DfIqS92u.js +0 -1
  90. package/static/app/assets/arrow-left-DvwQxqcD.js +0 -1
  91. package/static/app/assets/circle-check-hH6updC-.js +0 -1
  92. package/static/app/assets/index-C0VEkbAp.js +0 -13
  93. package/static/app/assets/index-C8gwOf0C.css +0 -2
  94. package/static/app/assets/jsx-runtime-bzQ4Vb5N.js +0 -1
  95. package/static/app/assets/primitives-EKxh12KR.js +0 -1
  96. package/static/app/assets/search-BA5Ge197.js +0 -1
  97. package/static/app/assets/sourceMeta-BzqJiEPI.js +0 -1
  98. package/static/app/assets/useFocusTrap-B0w4AxK1.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.4.0 Living Brain walkthrough](output/release/v12.4.0/gifs/v12.4.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.4.0/screenshots/01-login.png) | ![Model install](output/release/v12.4.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v12.4.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.4.0/SCREENSHOT_INDEX.md](output/release/v12.4.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.4.0/screenshots/13-chronicle.png) | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v12.4.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.4.0/screenshots/05-memory-graph.png) | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v12.4.0/screenshots/06-capture.png) |
56
+ | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v12.4.0/screenshots/12-review-center.png) | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v12.4.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.4.0/screenshots/11-knowledge-journey.png) | **Say how much it may do alone** — one dial in plain words ![Settings](output/release/v12.4.0/screenshots/08-system.png) |
58
58
 
59
59
  ## Why this is yours
60
60
 
@@ -70,42 +70,41 @@ 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.4.0 — Sharp Weight**:
74
+
75
+ The local and cloud model catalog adds **Qwen 3.8 27B 4-bit** and **Gemma 4 26B
76
+ A4B QAT / QAT-OptiQ 4-bit** builds, closes all Python (`pillow>=13,<14`) and npm
77
+ dependency security advisories, hardens engine URL scheme validation, and scopes
78
+ Tailwind CSS v4's oxide scanner to `frontend/`. The door is still **422
79
+ operations / 41 families** over a **20-route worker**. Cloud is still optional
80
+ and the default is still local.
81
+
82
+ - **Qwen 3.8 27B 4-bit local & cloud integration.** Added
83
+ `mlx-community/Qwen3.8-27B-4bit` (`16.1GB`, `qwen3_5`), wired GGUF/HF routes
84
+ (`ggml-org/Qwen3.8-27B-GGUF:Q4_K_M`, `Qwen/Qwen3.8-27B`) across all 5 local
85
+ engines, and added `Qwen/Qwen3.8-27B` / `qwen/qwen3.8-27b` to `together` and
86
+ `openrouter`.
87
+ - **Gemma 4 26B A4B QAT & QAT-OptiQ 4-bit builds.** Added
88
+ `mlx-community/gemma-4-26B-A4B-it-qat-4bit` (`15.6GB`, routed to Google's
89
+ official QAT GGUF `google/gemma-4-26B-A4B-it-qat-q4_0-gguf:Q4_0`) and
90
+ `mlx-community/gemma-4-26B-A4B-it-qat-OptiQ-4bit` (`21.9GB`, sensitivity-guided
91
+ mixed 4-bit/8-bit `mlx-optiq` build).
92
+ - **Dependency security audit closure & runtime hardening.** Upgraded `pillow`
93
+ to `>=13,<14`, resolved all npm lockfile advisories in root and
94
+ `vscode-extension`, enforced `http(s)://` scheme checks in `model_engines`,
95
+ and scoped `@import "tailwindcss" source("..");` in `frontend/src/styles.css`.
97
96
 
98
97
  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).
98
+ [docs/releases/RELEASE_NOTES_v12.4.0.md](docs/releases/RELEASE_NOTES_v12.4.0.md).
100
99
  Guide: [RELEASE.md](RELEASE.md) · History: [docs/CHANGELOG.md](docs/CHANGELOG.md).
101
100
 
102
- Expected artifacts for 12.3.0 must use exact filenames:
101
+ Expected artifacts for 12.4.0 must use exact filenames:
103
102
 
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`
103
+ - `dist/ltcai-12.4.0-py3-none-any.whl`
104
+ - `dist/ltcai-12.4.0.tar.gz`
105
+ - `ltcai-12.4.0.tgz`
106
+ - `dist/ltcai-12.4.0.vsix`
107
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_12.4.0_aarch64.dmg`
109
108
 
110
109
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
111
110
 
@@ -176,7 +175,7 @@ Validation via `npm run lint`, `npm run test:unit`, `npm run test:visual`.
176
175
  pending-only, no Self-Model refiner, `delete_node` leaving `PART_OF`,
177
176
  review events silent without an owner, KG-api ingest text-only, two
178
177
  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)
178
+ [docs/releases/RELEASE_NOTES_v12.4.0.md](docs/releases/RELEASE_NOTES_v12.4.0.md)
180
179
  and prioritized in [docs/ROADMAP.md](docs/ROADMAP.md).
181
180
 
182
181
  ## Release History
@@ -188,6 +187,7 @@ same boundary. Earlier notes live in [docs/releases/](docs/releases/).
188
187
 
189
188
  | Version | Theme |
190
189
  | --- | --- |
190
+ | 12.4.0 | Sharp Weight |
191
191
  | 12.3.0 | Live Wire |
192
192
  | 12.2.1 | True Count |
193
193
  | 12.2.0 | Small Voice |
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,37 @@ 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.4.0] - 2026-11-11 — Sharp Weight
8
+
9
+ ### Added
10
+ - Added `mlx-community/Qwen3.8-27B-4bit` (`16.1GB`, `qwen3_5`) to the local
11
+ model capability registry, multi-engine GGUF/HF routes
12
+ (`ggml-org/Qwen3.8-27B-GGUF:Q4_K_M`, `Qwen/Qwen3.8-27B`), `together` and
13
+ `openrouter` cloud catalogs, and Rust `CATALOG_HINTS`.
14
+ - Added `mlx-community/gemma-4-26B-A4B-it-qat-4bit` (`15.6GB`, routed to
15
+ Google's official QAT GGUF `google/gemma-4-26B-A4B-it-qat-q4_0-gguf:Q4_0` and
16
+ `google/gemma-4-26B-A4B-it-qat-q4_0-unquantized`) and
17
+ `mlx-community/gemma-4-26B-A4B-it-qat-OptiQ-4bit` (`21.9GB`, sensitivity-guided
18
+ mixed 4-bit/8-bit `mlx-optiq` build on Google's QAT base) to the capability
19
+ registry, engine routes, and Rust `CATALOG_HINTS`.
20
+
21
+ ### Changed
22
+ - Upgraded `pillow` dependency constraint to `>=13,<14` in `pyproject.toml` and
23
+ `requirements.txt` (closing 39 CVEs in `pillow 12.3.0`), and synchronized
24
+ `reportlab>=4,<5` and `huggingface_hub>=1.0,<2` in `requirements.txt`.
25
+ - Updated npm dependencies and lockfiles in root and `vscode-extension`
26
+ (`vitest` and `@vitest/coverage-v8` `^4.1.12`, `glob` `^14.0.4`, `minimatch`
27
+ `^11.0.7`) so `npm audit` reports 0 vulnerabilities.
28
+
29
+ ### Fixed
30
+ - Hardened `_json_request` and `get_openai_compatible_server_models` in
31
+ `latticeai/services/model_engines.py` to reject non-`http(s)://` URL schemes.
32
+ - Fixed `admin_log_retention` in `rust/lattice-platform/src/adminops/admin/handlers.rs`
33
+ to read `state.auth.clock().now()` instead of real wall-clock `unix_now()`,
34
+ eliminating wall-clock drift against deterministic audit fixtures.
35
+ - Scoped `@import "tailwindcss" source("..");` in `frontend/src/styles.css` so
36
+ `@tailwindcss/oxide` only scans `frontend/` instead of walking `rust/target`.
37
+
7
38
  ## [12.3.0] - 2026-10-19 — Live Wire
8
39
 
9
40
  ### Added
@@ -1,6 +1,6 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **12.3.0 — Live Wire**.
3
+ Current release: **12.4.0 — Sharp Weight**.
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.4.0 — Sharp Weight**.
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.4.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.4.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.4.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.4.0-py3-none-any.whl`
329
+ - `dist/ltcai-12.4.0.tar.gz`
330
+ - `ltcai-12.4.0.tgz`
331
+ - `dist/ltcai-12.4.0.vsix`
332
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_12.4.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.4.0 — Sharp Weight**.
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.4.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.4.0 — Sharp Weight**.
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.4.0 — Sharp Weight**.
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.4.0 — Sharp Weight**.
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.4.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.4.0"
@@ -84,6 +84,7 @@ PROVIDER_MODEL_CATALOG = {
84
84
  {"id": "anthropic/claude-opus-4.7", "name": "Claude Opus 4.7 via OpenRouter", "family": "Claude"},
85
85
  {"id": "anthropic/claude-sonnet-4.6", "name": "Claude Sonnet 4.6 via OpenRouter", "family": "Claude"},
86
86
  {"id": "anthropic/claude-haiku-4.5", "name": "Claude Haiku 4.5 via OpenRouter", "family": "Claude"},
87
+ {"id": "qwen/qwen3.8-27b", "name": "Qwen3.8 27B via OpenRouter", "family": "Qwen"},
87
88
  {"id": "qwen/qwen3.6-35b-a3b", "name": "Qwen3.6 35B A3B via OpenRouter", "family": "Qwen"},
88
89
  {"id": "google/gemma-4-12b-it", "name": "Gemma 4 12B via OpenRouter", "family": "Gemma"},
89
90
  {"id": "x-ai/grok-4.6", "name": "Grok 4.6 via OpenRouter", "family": "Grok"},
@@ -94,6 +95,7 @@ PROVIDER_MODEL_CATALOG = {
94
95
  {"id": "meta-llama/llama-4-scout-17b-16e-instruct", "name": "Llama 4 Scout", "family": "Llama"},
95
96
  ],
96
97
  "together": [
98
+ {"id": "Qwen/Qwen3.8-27B", "name": "Qwen3.8 27B", "family": "Qwen"},
97
99
  {"id": "Qwen/Qwen3.6-27B", "name": "Qwen3.6 27B", "family": "Qwen"},
98
100
  {"id": "google/gemma-4-12b-it", "name": "Gemma 4 12B", "family": "Gemma"},
99
101
  {"id": "meta-llama/Llama-4-Scout-17B-16E-Instruct", "name": "Llama 4 Scout", "family": "Llama"},
@@ -19,7 +19,7 @@ from dataclasses import dataclass
19
19
  from pathlib import Path
20
20
  from typing import Any, Dict, List
21
21
 
22
- ARCHITECTURE_VERSION_TARGET = "12.3.0"
22
+ ARCHITECTURE_VERSION_TARGET = "12.4.0"
23
23
 
24
24
  PREFERRED_REFACTORING_ORDER = [
25
25
  "agent-runtime",
@@ -346,6 +346,32 @@ _REGISTRY: List[ModelCapability] = [
346
346
  ),
347
347
 
348
348
  # ── MoE tier (32GB+ RAM) ─────────────────────────────────────────────────
349
+ ModelCapability(
350
+ id="mlx-community/gemma-4-26B-A4B-it-qat-4bit",
351
+ hf_repo_id="mlx-community/gemma-4-26B-A4B-it-qat-4bit",
352
+ name="Gemma 4 26B A4B QAT Instruct",
353
+ family="Gemma 4",
354
+ tag="local-vlm",
355
+ size="15.6GB",
356
+ architecture="gemma4",
357
+ download_size_gb=15.64,
358
+ quantization="4bit",
359
+ provider_hints=["local_mlx", "ollama", "vllm", "lmstudio", "llamacpp"],
360
+ download_strategy="hf_hub",
361
+ load_strategy="mlx_vlm",
362
+ hardware=HardwareProfile(
363
+ min_ram_gb=22.0, recommended_ram_gb=32.0, apple_silicon_pref=True,
364
+ notes="Quantization-Aware Trained (QAT) 4-bit MoE with 8-bit shared MLP and router layers; higher accuracy than standard 4-bit PTQ on 32GB+ Apple Silicon.",
365
+ ),
366
+ source_country="미국", source_company="Google",
367
+ verification=VerificationStatus(
368
+ hf_exists=True, hf_last_checked="2026-11-11", has_config=True, has_tokenizer=True,
369
+ has_weights_hint=True, pipeline_tag="image-text-to-text", likes=9, license="apache-2.0",
370
+ notes="library_name=mlx, ungated, 3 safetensors shards, official Google QAT base.",
371
+ verified_by="hf-api-light",
372
+ ),
373
+ display_priority=48,
374
+ ),
349
375
  ModelCapability(
350
376
  id="mlx-community/gemma-4-26b-a4b-it-4bit",
351
377
  hf_repo_id="mlx-community/gemma-4-26b-a4b-it-4bit",
@@ -371,6 +397,32 @@ _REGISTRY: List[ModelCapability] = [
371
397
  ),
372
398
  display_priority=50,
373
399
  ),
400
+ ModelCapability(
401
+ id="mlx-community/gemma-4-26B-A4B-it-qat-OptiQ-4bit",
402
+ hf_repo_id="mlx-community/gemma-4-26B-A4B-it-qat-OptiQ-4bit",
403
+ name="Gemma 4 26B A4B QAT OptiQ Instruct",
404
+ family="Gemma 4",
405
+ tag="local-vlm",
406
+ size="21.9GB",
407
+ architecture="gemma4",
408
+ download_size_gb=21.89,
409
+ quantization="OptiQ-4bit",
410
+ provider_hints=["local_mlx"],
411
+ download_strategy="hf_hub",
412
+ load_strategy="mlx_vlm",
413
+ hardware=HardwareProfile(
414
+ min_ram_gb=28.0, recommended_ram_gb=48.0, apple_silicon_pref=True,
415
+ notes="Sensitivity-guided mixed 4-bit/8-bit OptiQ quantization built on Google's QAT Gemma 4 26B A4B base for higher reasoning and tool-calling fidelity.",
416
+ ),
417
+ source_country="미국", source_company="Google",
418
+ verification=VerificationStatus(
419
+ hf_exists=True, hf_last_checked="2026-11-11", has_config=True, has_tokenizer=True,
420
+ has_weights_hint=True, pipeline_tag="text-generation", likes=4, license="apache-2.0",
421
+ notes="library_name=mlx, ungated, 5 safetensors shards, mlx-optiq sensitivity-guided mixed 4/8-bit.",
422
+ verified_by="hf-api-light",
423
+ ),
424
+ display_priority=51,
425
+ ),
374
426
  ModelCapability(
375
427
  id="mlx-community/Qwen3.6-35B-A3B-4bit",
376
428
  hf_repo_id="mlx-community/Qwen3.6-35B-A3B-4bit",
@@ -398,6 +450,31 @@ _REGISTRY: List[ModelCapability] = [
398
450
  ),
399
451
 
400
452
  # ── Large tier (48GB+ RAM) ───────────────────────────────────────────────
453
+ ModelCapability(
454
+ id="mlx-community/Qwen3.8-27B-4bit",
455
+ hf_repo_id="mlx-community/Qwen3.8-27B-4bit",
456
+ name="Qwen3.8 27B",
457
+ family="Qwen3.8",
458
+ tag="local-vlm",
459
+ size="16.1GB",
460
+ architecture="qwen3_5",
461
+ download_size_gb=16.08,
462
+ quantization="4bit",
463
+ provider_hints=["local_mlx", "ollama", "vllm", "lmstudio", "llamacpp"],
464
+ download_strategy="hf_hub",
465
+ load_strategy="mlx_vlm",
466
+ hardware=HardwareProfile(
467
+ min_ram_gb=24.0, recommended_ram_gb=48.0, apple_silicon_pref=True,
468
+ notes="Latest Qwen 3.8 27B dense multimodal model; higher coding, reasoning, and agentic tool accuracy than Qwen 3.6 27B at identical 16.1GB 4-bit footprint.",
469
+ ),
470
+ source_country="중국", source_company="Alibaba",
471
+ verification=VerificationStatus(
472
+ hf_exists=True, hf_last_checked="2026-11-11", has_config=True, has_tokenizer=True,
473
+ has_weights_hint=True, pipeline_tag="image-text-to-text", likes=237, license="apache-2.0",
474
+ notes="library_name=mlx, ungated, 3 safetensors shards.", verified_by="hf-api-light",
475
+ ),
476
+ display_priority=52,
477
+ ),
401
478
  ModelCapability(
402
479
  id="mlx-community/Qwen3.6-27B-4bit",
403
480
  hf_repo_id="mlx-community/Qwen3.6-27B-4bit",
@@ -135,15 +135,28 @@ _ENGINE_ROUTES: Dict[str, Dict[str, str]] = {
135
135
  "mlx-community/gemma-4-12B-it-4bit", "ggml-org/gemma-4-12B-it-GGUF", "google/gemma-4-12B-it",
136
136
  ollama_tag="Q4_0",
137
137
  ),
138
+ "mlx-community/gemma-4-26B-A4B-it-qat-4bit": _gguf_routes(
139
+ "mlx-community/gemma-4-26B-A4B-it-qat-4bit", "google/gemma-4-26B-A4B-it-qat-q4_0-gguf",
140
+ "google/gemma-4-26B-A4B-it-qat-q4_0-unquantized",
141
+ ollama_tag="Q4_0",
142
+ ),
138
143
  "mlx-community/gemma-4-26b-a4b-it-4bit": _gguf_routes(
139
144
  "mlx-community/gemma-4-26b-a4b-it-4bit", "ggml-org/gemma-4-26B-A4B-it-GGUF",
140
145
  "google/gemma-4-26B-A4B-it",
141
146
  ollama_tag="Q4_0",
142
147
  ),
148
+ "mlx-community/gemma-4-26B-A4B-it-qat-OptiQ-4bit": _gguf_routes(
149
+ "mlx-community/gemma-4-26B-A4B-it-qat-OptiQ-4bit", "unsloth/gemma-4-26B-A4B-it-GGUF",
150
+ "google/gemma-4-26B-A4B-it-qat-q4_0-unquantized",
151
+ ollama_tag="Q4_0",
152
+ ),
143
153
  "mlx-community/gemma-4-31b-it-4bit": _gguf_routes(
144
154
  "mlx-community/gemma-4-31b-it-4bit", "ggml-org/gemma-4-31B-it-GGUF", "google/gemma-4-31B-it",
145
155
  ollama_tag="Q4_0",
146
156
  ),
157
+ "mlx-community/Qwen3.8-27B-4bit": _gguf_routes(
158
+ "mlx-community/Qwen3.8-27B-4bit", "ggml-org/Qwen3.8-27B-GGUF", "Qwen/Qwen3.8-27B",
159
+ ),
147
160
  "mlx-community/Qwen3.6-27B-4bit": _gguf_routes(
148
161
  "mlx-community/Qwen3.6-27B-4bit", "ggml-org/Qwen3.6-27B-GGUF", "Qwen/Qwen3.6-27B",
149
162
  ),
@@ -164,6 +177,11 @@ _ENGINE_ROUTES: Dict[str, Dict[str, str]] = {
164
177
  # is no other Gemma 4 26B — and resolving that to nothing would be pedantry.
165
178
  _COMMON_MISNAMES: Dict[str, str] = {
166
179
  "gemma-4-26b-it-4bit": "mlx-community/gemma-4-26b-a4b-it-4bit",
180
+ "gemma-4-26b-qat-4bit": "mlx-community/gemma-4-26B-A4B-it-qat-4bit",
181
+ "gemma-4-26b-a4b-qat-4bit": "mlx-community/gemma-4-26B-A4B-it-qat-4bit",
182
+ "gemma-4-26b-optiq-4bit": "mlx-community/gemma-4-26B-A4B-it-qat-OptiQ-4bit",
183
+ "qwen-3.8-27b-4bit": "mlx-community/Qwen3.8-27B-4bit",
184
+ "qwen3.8-27b": "mlx-community/Qwen3.8-27B-4bit",
167
185
  }
168
186
 
169
187
  # Keyed by both the lowercase short name ("gemma-4-12b-it-4bit") and the
@@ -112,6 +112,8 @@ def _json_request(
112
112
  payload: Optional[Dict[str, Any]] = None,
113
113
  timeout: float = 10.0,
114
114
  ) -> Dict[str, Any]:
115
+ if not str(url).startswith(("http://", "https://")):
116
+ raise ValueError(f"Unsupported URL scheme in {url!r}")
115
117
  data = None
116
118
  req_headers = dict(headers or {})
117
119
  if payload is not None:
@@ -225,7 +227,7 @@ def get_openai_compatible_server_models(provider: str) -> List[str]:
225
227
  config = OPENAI_COMPATIBLE_PROVIDERS.get(provider) or {}
226
228
  base_url = os.getenv(config.get("base_url_env", "")) if config.get("base_url_env") else None
227
229
  base_url = (base_url or config.get("base_url") or "").rstrip("/")
228
- if not base_url:
230
+ if not base_url or not base_url.startswith(("http://", "https://")):
229
231
  return []
230
232
 
231
233
  api_key = os.getenv(config.get("env_key", "")) or config.get("api_key_fallback") or provider
@@ -28,7 +28,7 @@ from typing import Any, Dict, List
28
28
 
29
29
  from latticeai.services.architecture_readiness import architecture_readiness
30
30
 
31
- PRODUCT_VERSION_TARGET = "12.3.0"
31
+ PRODUCT_VERSION_TARGET = "12.4.0"
32
32
 
33
33
 
34
34
  @dataclass(frozen=True)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "12.3.0",
3
+ "version": "12.4.0",
4
4
  "description": "Lattice AI — local-first Digital Brain that keeps your knowledge durable across any AI model.",
5
5
  "homepage": "https://github.com/TaeSooPark-PTS/LatticeAI#readme",
6
6
  "repository": {
@@ -140,7 +140,7 @@
140
140
  "@types/react": "^19.2.17",
141
141
  "@types/react-dom": "^19.2.3",
142
142
  "@vitejs/plugin-react": "^6.0.2",
143
- "@vitest/coverage-v8": "^4.1.10",
143
+ "@vitest/coverage-v8": "^4.1.12",
144
144
  "autoprefixer": "^10.5.0",
145
145
  "class-variance-authority": "^0.7.1",
146
146
  "clsx": "^2.1.1",
@@ -157,7 +157,7 @@
157
157
  "tailwindcss": "^4.3.0",
158
158
  "typescript": "^5.9.3",
159
159
  "vite": "^8.0.16",
160
- "vitest": "^4.1.10",
160
+ "vitest": "^4.1.12",
161
161
  "zustand": "^5.0.14"
162
162
  },
163
163
  "overrides": {
package/requirements.txt CHANGED
@@ -2,10 +2,12 @@ fastapi>=0.110,<1
2
2
  uvicorn>=0.29,<1
3
3
  pydantic>=2.7,<3
4
4
  httpx>=0.27,<1
5
- pillow>=10,<13
5
+ pillow>=13,<14
6
6
  openai>=1.30,<3
7
7
  python-docx>=1.1,<2
8
8
  openpyxl>=3.1,<4
9
9
  python-pptx>=0.6.23,<2
10
10
  keyring>=24,<26
11
11
  pdfplumber>=0.11,<0.12
12
+ reportlab>=4,<5
13
+ huggingface_hub>=1.0,<2
@@ -6,7 +6,7 @@ const root = process.cwd();
6
6
  const pkg = JSON.parse(readFileSync(path.join(root, "package.json"), "utf8"));
7
7
  const version = pkg.version;
8
8
  const releaseDir = `output/release/v${version}`;
9
- const releaseTheme = "Live Wire";
9
+ const releaseTheme = "Sharp Weight";
10
10
  const title = `${version} — ${releaseTheme}`;
11
11
  const escapedVersion = version.replaceAll(".", "\\.");
12
12
 
@@ -20,6 +20,17 @@
20
20
  "whole-image delta: naming where the change is makes the claim more",
21
21
  "specific, not less."
22
22
  ],
23
+ "12.4.0": {
24
+ "_why": [
25
+ "Sharp Weight is a model catalog and security audit release: Qwen 3.8 27B",
26
+ "4-bit and Gemma 4 26B A4B QAT / QAT-OptiQ 4-bit catalog expansion,",
27
+ "Pillow 13.0.0 and npm lockfile vulnerability closure, model_engines",
28
+ "URL scheme validation, and scoped Tailwind CSS v4 source scanning.",
29
+ "",
30
+ "No screen was redesigned. Empty claim set on purpose. Unclaimed screens",
31
+ "are still measured and printed; they are not gated."
32
+ ]
33
+ },
23
34
  "12.3.0": {
24
35
  "_why": [
25
36
  "Live Wire is a backend and runtime release: verified Hugging Face GGUF",