ltcai 12.2.0 → 12.3.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 (79) hide show
  1. package/README.md +92 -84
  2. package/docs/CHANGELOG.md +64 -4
  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 +8 -8
  8. package/docs/TRUST_MODEL.md +2 -2
  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/core/embedding_providers/autodetect.py +0 -1
  14. package/latticeai/core/model_compat.py +2 -2
  15. package/latticeai/core/vector_index/hnsw.py +49 -10
  16. package/latticeai/core/vector_index/sidecar.py +120 -31
  17. package/latticeai/models/model_providers.py +10 -11
  18. package/latticeai/services/architecture_readiness.py +1 -1
  19. package/latticeai/services/model_capability_registry.py +2 -2
  20. package/latticeai/services/model_catalog.py +20 -12
  21. package/latticeai/services/model_engines.py +26 -14
  22. package/latticeai/services/model_runtime/download.py +53 -6
  23. package/latticeai/services/product_readiness.py +2 -2
  24. package/package.json +4 -6
  25. package/scripts/check_current_release_docs.mjs +1 -1
  26. package/scripts/release_screen_claims.json +24 -0
  27. package/src-tauri/Cargo.lock +10 -10
  28. package/src-tauri/Cargo.toml +1 -1
  29. package/src-tauri/tauri.conf.json +1 -1
  30. package/static/app/asset-manifest.json +44 -44
  31. package/static/app/assets/{Act-BjGgeuQd.js → Act-CZXyMcfJ.js} +2 -2
  32. package/static/app/assets/{AdminConsole-C6hcJGMr.js → AdminConsole-CAkZk0BI.js} +1 -1
  33. package/static/app/assets/{Brain-CNQnIaA8.js → Brain-DN_7_HSV.js} +2 -2
  34. package/static/app/assets/{BrainHome-CGJ6O69l.js → BrainHome-BBP0ouU-.js} +1 -1
  35. package/static/app/assets/{BrainSignals-DONPljxz.js → BrainSignals-nyRNxvQ3.js} +1 -1
  36. package/static/app/assets/{Capture-BMCC5544.js → Capture-DBvFoZKL.js} +1 -1
  37. package/static/app/assets/{Chronicle-DF6sOonx.js → Chronicle-BC5zmR44.js} +1 -1
  38. package/static/app/assets/{CommandPalette-DiWyutdM.js → CommandPalette-Bs-Fk6HT.js} +1 -1
  39. package/static/app/assets/{DigitalBrainExplorer-BL3V6Dqz.js → DigitalBrainExplorer-CNcCktPP.js} +1 -1
  40. package/static/app/assets/{Library-B-ue9hXL.js → Library-CxUA4xai.js} +1 -1
  41. package/static/app/assets/{LivingBrain-b1RiM5Rh.js → LivingBrain-CiyjvwKy.js} +1 -1
  42. package/static/app/assets/ProductFlow-DccERGr3.js +1 -0
  43. package/static/app/assets/{ReviewCard-D1fGTEn7.js → ReviewCard-lawM1khV.js} +1 -1
  44. package/static/app/assets/{RunsListPanel-DAirtLkS.js → RunsListPanel-DQC-zQ7m.js} +1 -1
  45. package/static/app/assets/{System-BEI1eoC4.js → System-DwqYJQaj.js} +1 -1
  46. package/static/app/assets/{WorkflowGraph-qrI6GU4R.js → WorkflowGraph-pJ2eFrhy.js} +1 -1
  47. package/static/app/assets/{WorkflowsPanel-CIMNTw-O.js → WorkflowsPanel-BIGjfM7h.js} +2 -2
  48. package/static/app/assets/{actHelpers-BMukIRnQ.js → actHelpers-DfIqS92u.js} +1 -1
  49. package/static/app/assets/arrow-left-DvwQxqcD.js +1 -0
  50. package/static/app/assets/{bot-Dkd-DbiP.js → bot-CAfN5QD1.js} +1 -1
  51. package/static/app/assets/{brain-BsexlNOA.js → brain-DNNLFQgq.js} +1 -1
  52. package/static/app/assets/{button-BA0N_zId.js → button-D0k7_k6e.js} +1 -1
  53. package/static/app/assets/circle-check-hH6updC-.js +1 -0
  54. package/static/app/assets/{circle-pause-918Kuvk0.js → circle-pause-Dxw6SJuA.js} +1 -1
  55. package/static/app/assets/{circle-play-CS0IbVDV.js → circle-play-DuoLDLEg.js} +1 -1
  56. package/static/app/assets/{cpu-BpvoWsjk.js → cpu-BGOpEdGX.js} +1 -1
  57. package/static/app/assets/{download-BvkMLLLN.js → download-wXD9L5vN.js} +1 -1
  58. package/static/app/assets/{folder-open-YmGugIBf.js → folder-open-CittV8Ey.js} +1 -1
  59. package/static/app/assets/{hard-drive-BOzmS-cq.js → hard-drive-CLQPYYBF.js} +1 -1
  60. package/static/app/assets/{index-CfeqZ9Ri.js → index-C0VEkbAp.js} +3 -3
  61. package/static/app/assets/{input-CFfCfMjO.js → input-RZ8aKj6d.js} +1 -1
  62. package/static/app/assets/{link-2-CcYzeM7M.js → link-2-B7QYeNdJ.js} +1 -1
  63. package/static/app/assets/{permissionCopy-B23r24oX.js → permissionCopy-DFGEuU2d.js} +1 -1
  64. package/static/app/assets/{primitives-BDryQl6H.js → primitives-EKxh12KR.js} +1 -1
  65. package/static/app/assets/search-BA5Ge197.js +1 -0
  66. package/static/app/assets/{share-2-B-gPv2ec.js → share-2-Drg0MPgx.js} +1 -1
  67. package/static/app/assets/{shield-alert-CfyRO1p0.js → shield-alert-CFKdCGM8.js} +1 -1
  68. package/static/app/assets/{sourceMeta-C4LDEy1S.js → sourceMeta-BzqJiEPI.js} +1 -1
  69. package/static/app/assets/{textarea-BdVMYEb1.js → textarea-n_69mQP_.js} +1 -1
  70. package/static/app/assets/{useFocusTrap-CV73DLHn.js → useFocusTrap-B0w4AxK1.js} +1 -1
  71. package/static/app/assets/{useMutation-B8QKq2NW.js → useMutation-Dvcq6J6b.js} +1 -1
  72. package/static/app/assets/workspace-BgBHikYl.js +1 -0
  73. package/static/app/index.html +1 -1
  74. package/static/sw.js +1 -1
  75. package/static/app/assets/ProductFlow-wZIKJW7G.js +0 -1
  76. package/static/app/assets/arrow-left-iVa1goff.js +0 -1
  77. package/static/app/assets/circle-check-BxaDWjPR.js +0 -1
  78. package/static/app/assets/search-DHsPwmPw.js +0 -1
  79. package/static/app/assets/workspace-BmfVs66W.js +0 -1
package/README.md CHANGED
@@ -12,100 +12,103 @@
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.2.0 Living Brain walkthrough](output/release/v12.2.0/gifs/v12.2.0-living-brain-walkthrough.gif)
15
+ ![v12.3.0 Living Brain walkthrough](output/release/v12.3.0/gifs/v12.3.0-living-brain-walkthrough.gif)
16
16
 
17
- Chat, files, folders, notes, and web pages all flow into one durable knowledge
18
- graph on your computer. The default is local. Cloud is optional — an
19
- OAuth-authenticated CLI (`agy` / `grok`) or an API key you configure — and
20
- nothing leaves your machine without explicit consent.
17
+ Lattice AI is a Digital Brain that lives on your computer. Chat, files,
18
+ folders, notes, and web pages all land in one knowledge graph you own.
19
+ The default is local. Cloud is optional, and nothing leaves the machine
20
+ without your consent.
21
21
 
22
22
  대화·파일·폴더·웹페이지가 전부 내 컴퓨터 안의 지식 그래프로 쌓입니다.
23
- 기본은 로컬이고, 클라우드는 선택입니다 (OAuth CLI 지원).
23
+ 기본은 로컬이고, 클라우드는 선택입니다.
24
24
 
25
- ## What You Can Do
26
-
27
- | | |
28
- | --- | --- |
29
- | **See your Brain's story in time** — a growth curve, an activity heatmap, and each day's story, rewindable to any past moment ![Brain Chronicle](output/release/v12.2.0/screenshots/13-chronicle.png) | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v12.2.0/screenshots/04-brain-chat-home.png) |
30
- | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v12.2.0/screenshots/05-memory-graph.png) | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v12.2.0/screenshots/06-capture.png) |
31
- | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v12.2.0/screenshots/12-review-center.png) | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v12.2.0/screenshots/02-recommended-models.png) |
32
- | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v12.2.0/screenshots/11-knowledge-journey.png) | **Say how much it may do alone** — one dial in plain words; dangerous actions stay blocked either way ![Settings](output/release/v12.2.0/screenshots/08-system.png) |
33
-
34
- ## Why Lattice AI
35
-
36
- - **Own your memory** — knowledge lives in a local SQLite Brain you can back up,
37
- export, inspect, and restore (`.latticebrain` encrypted archive).
38
- - **Model-independent** — switch between local MLX models and cloud models
39
- without rebuilding context from zero.
40
- - **Honest by design** — the Brain tells you when retrieval context is limited,
41
- when captured pages extracted poorly, and when the vector index is catching up.
42
- - **Safe automation** — automations are consent-first drafts; edits to existing
43
- content always pass through a reviewable proposal with a diff.
44
- - **Runs on the model your machine can hold** — the loop measures what a model
45
- can actually produce and adapts: a model too small to emit a tool call is
46
- walked through numbered choices instead, with the same permission gates,
47
- snapshots and sanitizers as every other profile.
48
-
49
- 매번 AI에게 프로젝트 맥락을 다시 설명하고 있다면, 지식이 여러 서비스에 흩어져
50
- 있다면, 그 기억을 특정 회사가 아니라 내가 소유하고 싶다면 — Lattice AI가 그
51
- 브레인입니다.
52
-
53
- ## Quick Start
25
+ ## Install
54
26
 
55
27
  ```bash
56
28
  pip install ltcai # or: npm install -g ltcai
57
29
  LTCAI # then open http://127.0.0.1:4825/app
58
30
  ```
59
31
 
60
- Apple Silicon local models: `pip install "ltcai[local]"`. Desktop app (Tauri)
61
- ships as a dmg on each [GitHub Release](https://github.com/TaeSooPark-PTS/LatticeAI/releases).
32
+ - Apple Silicon local models: `pip install "ltcai[local]"`
33
+ - Mac app: the `.dmg` on each [GitHub Release](https://github.com/TaeSooPark-PTS/LatticeAI/releases)
34
+ - Editor: the [VS Code / Cursor / Open VSX](https://marketplace.visualstudio.com/items?itemName=parktaesoo.ltcai) extension
62
35
 
63
- First-run flow — wake the Brain, pick the owner, load a recommended model:
36
+ ## First five minutes
37
+
38
+ 1. Open the app and sign in as the owner.
39
+ 2. Pick a recommended local model for this computer.
40
+ 3. Drop a folder, a file, or a note into Capture.
41
+ 4. Ask the Brain a question in your own words.
64
42
 
65
43
  | | | |
66
44
  | --- | --- | --- |
67
- | ![Login](output/release/v12.2.0/screenshots/01-login.png) | ![Model install](output/release/v12.2.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v12.2.0/screenshots/07-model-library.png) |
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) |
46
+
47
+ Screenshot index:
48
+ [output/release/v12.3.0/SCREENSHOT_INDEX.md](output/release/v12.3.0/SCREENSHOT_INDEX.md)
68
49
 
69
- Screenshot index and capture notes:
70
- [output/release/v12.2.0/SCREENSHOT_INDEX.md](output/release/v12.2.0/SCREENSHOT_INDEX.md)
50
+ ## What you can do
51
+
52
+ | | |
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) |
58
+
59
+ ## Why this is yours
60
+
61
+ - **The memory stays.** Knowledge lives in a local SQLite Brain you can back up, export, inspect, and restore (`.latticebrain`).
62
+ - **The model is replaceable.** Switch local MLX and optional cloud without rebuilding context from zero.
63
+ - **It says when it does not know.** Thin retrieval, a poor page extract, or hash-only search is named, not dressed as meaning.
64
+ - **Edits wait for you.** New files can land with little friction. Changing or deleting existing files becomes a proposal with a diff.
65
+ - **Small models can still act.** A 2B-class local model can call tools and skills; a model too small to emit JSON is walked through numbered choices.
66
+
67
+ 매번 AI에게 프로젝트 맥락을 다시 설명하고 있다면, 지식이 여러 서비스에 흩어져
68
+ 있다면, 그 기억을 특정 회사가 아니라 내가 소유하고 싶다면 — Lattice AI가 그
69
+ 브레인입니다.
71
70
 
72
71
  ## Current Release
73
72
 
74
- The current release is **12.2.0 — Small Voice**:
75
-
76
- 12.1.0 made remembering faster. This release makes a small local model
77
- able to *act*: 2B-class models can call MCP tools and skills without
78
- emitting perfect JSON, and the home screen names those actions in
79
- plain words. The door is still **422 operations / 41 families** over a
80
- **20-route worker**. Cloud is still optional and the default is still local.
81
-
82
- - **Small models speak tools.** `name`/`arguments`, Qwen XML, and
83
- `Action: mcp.grep` parse as the same call. Compact lists stay at nine
84
- rows. A skill's "use when" line is consulted even if the user never
85
- typed `skill.`. A quoted search term fills a missing `pattern`.
86
- - **The composer offers the work.** Folder search, read-and-summarize,
87
- memory, and skill review are chips under the box. Settings says the
88
- same in one card. MCP/skill steps in the timeline get a plain prefix.
89
- - **12.1.0 Fast Path is unchanged.** Folder overlap, one embed body,
90
- rebuild outside the write lock, auto-HNSW at 512.
91
-
92
- What this release does not close — small-model *content* quality, the
93
- mock-only `api_key` path, hash embeddings as the no-download fallback,
94
- watch never deleting on its own, the ad-hoc-signed dmg — is listed in
95
- [RELEASE_NOTES_v12.2.0.md](RELEASE_NOTES_v12.2.0.md).
96
-
97
- Expected artifacts for 12.2.0 release must use exact filenames:
98
-
99
- - `dist/ltcai-12.2.0-py3-none-any.whl`
100
- - `dist/ltcai-12.2.0.tar.gz`
101
- - `ltcai-12.2.0.tgz`
102
- - `dist/ltcai-12.2.0.vsix`
103
- - `src-tauri/target/release/bundle/dmg/Lattice AI_12.2.0_aarch64.dmg`
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''...`.
97
+
98
+ 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).
100
+ Guide: [RELEASE.md](RELEASE.md) · History: [docs/CHANGELOG.md](docs/CHANGELOG.md).
101
+
102
+ Expected artifacts for 12.3.0 must use exact filenames:
103
+
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`
104
109
 
105
110
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
106
111
 
107
- Release notes: [RELEASE.md](RELEASE.md) · Full history: [docs/CHANGELOG.md](docs/CHANGELOG.md)
108
-
109
112
  ## Architecture At A Glance
110
113
 
111
114
  One Rust server on localhost is the source of truth: `lattice-host` answers
@@ -132,8 +135,9 @@ Validation via `npm run lint`, `npm run test:unit`, `npm run test:visual`.
132
135
  migration tooling is not part of the 12.1.0 worker.
133
136
  - Docker, model downloads, cloud model calls, Brain Network, and update checks
134
137
  require explicit user action. Cloud is optional: `cli_oauth` (`agy` /
135
- `grok`) was live-checked at zero billing; the `api_key` path is
136
- mock-verified only.
138
+ `grok`) was live-checked at zero billing; the `api_key` path probes
139
+ `GET /models` with the key and fail-closes if the provider is
140
+ unreachable — it does not run a billed completion to verify.
137
141
  - **The Telegram bridge was removed in 11.6.0** — it lived in the platform code
138
142
  that became the AI worker. **SSO/OIDC login and callback flows were removed
139
143
  with it**; the configuration surface remains and password login is native.
@@ -153,16 +157,18 @@ Validation via `npm run lint`, `npm run test:unit`, `npm run test:visual`.
153
157
  100%-lines-and-branches gate was removed). The enforced claim is the
154
158
  floor, not whatever a given run measures.
155
159
  - **Small-model *content* quality is gated honestly.** With the `guided`
156
- profile even a 0.5B model writes the requested file and reaches DONE;
157
- a weak summary still fails the critic and the run ends
158
- FAILED/NEEDS_REVIEW rather than claiming success.
160
+ profile even a 0.5B model writes the requested file and reaches DONE.
161
+ A requested summary is filled from the file that was actually read;
162
+ if those words are still missing the run is held for review, not
163
+ marked done.
159
164
  - Vector search env still defaults to `brute` — exact and byte-compatible
160
165
  on a small Brain. At 512+ vectors with a bound worker sidecar it tries
161
166
  `hnsw+rescore` first and falls back to the exact scan if the sidecar
162
167
  cannot answer. `LATTICEAI_VECTOR_INDEX=hnsw` is still the explicit
163
168
  opt-in.
164
- - Watch never deletes on its own: a vanished file is reported, and
165
- cleanup runs only through the confirmed folder-prune flow.
169
+ - Watch prune removes vanished files from the **graph**, never from
170
+ disk. A one-shot folder ingest still reports vanished files and
171
+ waits for the confirmed prune door.
166
172
  - The macOS dmg is ad-hoc signed — effectively unsigned — so first launch
167
173
  needs the usual Gatekeeper step.
168
174
  - Pointer-control tools execute in the worker and are installed with
@@ -170,18 +176,20 @@ Validation via `npm run lint`, `npm run test:unit`, `npm run test:visual`.
170
176
  pending-only, no Self-Model refiner, `delete_node` leaving `PART_OF`,
171
177
  review events silent without an owner, KG-api ingest text-only, two
172
178
  store cycles per review mutation) are listed with their reasons in
173
- [RELEASE_NOTES_v12.2.0.md](RELEASE_NOTES_v12.2.0.md) and prioritized in
174
- [docs/ROADMAP.md](docs/ROADMAP.md).
179
+ [docs/releases/RELEASE_NOTES_v12.3.0.md](docs/releases/RELEASE_NOTES_v12.3.0.md)
180
+ and prioritized in [docs/ROADMAP.md](docs/ROADMAP.md).
175
181
 
176
182
  ## Release History
177
183
 
178
184
  Public history starts at 11.0.0. 11.6.0 rebuilt the product server in Rust and
179
185
  reduced the Python package to an AI worker, so a 10.x or 9.x install is a
180
186
  different program; `SECURITY.md` supports only 11.x, and this table states the
181
- same boundary. Earlier notes stay in the tree as `RELEASE_NOTES_v*.md` files.
187
+ same boundary. Earlier notes live in [docs/releases/](docs/releases/).
182
188
 
183
189
  | Version | Theme |
184
190
  | --- | --- |
191
+ | 12.3.0 | Live Wire |
192
+ | 12.2.1 | True Count |
185
193
  | 12.2.0 | Small Voice |
186
194
  | 12.1.0 | Fast Path |
187
195
  | 12.0.0 | Open House |
@@ -199,4 +207,4 @@ same boundary. Earlier notes stay in the tree as `RELEASE_NOTES_v*.md` files.
199
207
  | 11.0.1 | Both Branches |
200
208
  | 11.0.0 | Full Measure |
201
209
 
202
- Per-release details: [RELEASE_NOTES.md](RELEASE_NOTES.md)
210
+ Per-release details: [RELEASE_NOTES.md](RELEASE_NOTES.md) · folder: [docs/releases/](docs/releases/)
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,66 @@ 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.3.0] - 2026-10-19 — Live Wire
8
+
9
+ ### Added
10
+ - Full HTML structure parser in `POST /tools/inspect_html`: extracts `title`,
11
+ `links`, `scripts`, `stylesheets`, `images`, `forms`, and `headings`
12
+ (`h1`–`h6`) with `MAX_FILE_BYTES` enforcement.
13
+ - RFC 5987 `filename*=UTF-8''...` `Content-Disposition` attachment headers and
14
+ UTF-8 percent-decoding in `GET /tools/download`.
15
+ - Verified GGUF routing for `mlx-community/Qwen3.5-9B-MLX-4bit`
16
+ (`unsloth/Qwen3.5-9B-GGUF`) and `mlx-community/Qwen3.6-35B-A3B-4bit`
17
+ (`ggml-org/Qwen3.6-35B-A3B-GGUF`) across `ollama`, `lmstudio`, and `llamacpp`.
18
+ - Companion `mmproj-*.gguf` download and `--mmproj` flag in
19
+ `ensure_llamacpp_server`, plus `is_auxiliary_gguf` filtering (`mmproj-`,
20
+ `mtp-`, `dflash-`, `eagle3-`, `imatrix`) and `_shards_complete` verification
21
+ for `model.safetensors.index.json`.
22
+ - Small-model tool/MCP calling tolerances in `lattice-agent`: expanded
23
+ `KNOWN_ACTIONS`, stringified `arguments` recovery (trailing comma, truncation,
24
+ Python dict literal), OpenAI `tool_calls` array unwrapping, fenced HTML/code
25
+ block salvage for `write_file`/`local_write`, and `adopt_named_args` in
26
+ `perform_action`.
27
+
28
+ ### Changed
29
+ - `_gguf_routes` now accepts per-repository `ollama_tag` (`Q4_0` for
30
+ `ggml-org/gemma-4-*-GGUF`, `MXFP4` for `ggml-org/gpt-oss-20b-GGUF`).
31
+ - Cloud and local provider defaults updated to current models (`grok-4.6`,
32
+ `Qwen/Qwen3.6-27B`, `qwen/qwen3.6-35b-a3b`, `x-ai/grok-4.6`,
33
+ `hf.co/ggml-org/gemma-4-12B-it-GGUF:Q4_0`, `google/gemma-4-12B-it`).
34
+
35
+ ### Fixed
36
+ - Removed nonexistent `mlx-community/bge-m3` from `LOCAL_MLX_MODELS` while
37
+ retaining `bge-m3` in `OLLAMA_EMBEDDING_MODELS`.
38
+ - Fixed Latin-1 byte-to-char corruption on non-ASCII percent-encoded paths in
39
+ `/tools/download`.
40
+
41
+ ## [12.2.1] - 2026-08-29 — True Count
42
+
43
+ ### Added
44
+ - HNSW sidecar COUNT+delta load: a warm query never dumps `vector_embeddings`;
45
+ growth fetches missing ids only and appends.
46
+ - Skip-by-hash restamps size/mtime on the existing provenance row via
47
+ `GraphWriter`.
48
+ - Watch prune: a vanished watched file is removed from the graph
49
+ (`delete_document_tree`, confirm=true). Disk is never deleted.
50
+ - `complete_a_summary`: a thin "I summarized" answer is filled from the
51
+ `read_file` / `mcp.read_file` result already on the transcript.
52
+ - Compact catalog CORE now keeps `mcp.grep`, `mcp.list_dir`, `mcp.read_file`,
53
+ `mcp.knowledge_search` through the nine-row cap.
54
+ - `api_key` cloud `GET /models` probe (no completion). Unreachable keys
55
+ fail-close status.
56
+ - First-run and library copy name hash search as hash, with a path to a
57
+ meaning model.
58
+
59
+ ### Changed
60
+ - Per-version `RELEASE_NOTES_v*.md` files live in `docs/releases/`.
61
+ - README is user-first: install, first five minutes, then the release.
62
+
63
+ ### Fixed
64
+ - Loaded HNSW graphs can append a delta instead of rebuilding from the
65
+ incoming set alone (which wiped live labels).
66
+
7
67
  ## [12.2.0] - 2026-08-29 — Small Voice
8
68
 
9
69
  ### Added
@@ -210,7 +270,7 @@ existed at that release.
210
270
  - DMG는 ad-hoc 서명(미서명)이다.
211
271
  - 11.8.0이 열어 둔 항목(커버리지 바닥 라인 90, 멀티모달 이미지/비디오
212
272
  HTTP 문 없음, 11.7.0 leftover)은 그대로다. 전문은
213
- [RELEASE_NOTES_v11.9.0.md](../RELEASE_NOTES_v11.9.0.md).
273
+ [RELEASE_NOTES_v11.9.0.md](releases/RELEASE_NOTES_v11.9.0.md).
214
274
 
215
275
  ## [11.8.0] - 2026-08-16 — Travel Light
216
276
 
@@ -292,7 +352,7 @@ existed at that release.
292
352
  - `tests/visual/mock_server`가 고아 mock 라우트 하나를 아직 서빙합니다
293
353
  (현재 증거가 해시로 묶여 있어 다음 캡처 사이클에 정리).
294
354
  - 11.7.0이 열어 둔 항목은 그대로입니다. 전문은
295
- [RELEASE_NOTES_v11.8.0.md](../RELEASE_NOTES_v11.8.0.md).
355
+ [RELEASE_NOTES_v11.8.0.md](releases/RELEASE_NOTES_v11.8.0.md).
296
356
 
297
357
  ## [11.7.0] - 2026-08-15 — Clean Sweep
298
358
 
@@ -336,7 +396,7 @@ existed at that release.
336
396
  `delete_node`는 `PART_OF`를 남김. owner 없는 리뷰 이벤트는 침묵.
337
397
  KG-api ingest는 텍스트 전용. 리뷰 변이 = 스토어 사이클 2회.
338
398
  snooze 422 detail은 영문 리터럴. 전문은
339
- [RELEASE_NOTES_v11.7.0.md](../RELEASE_NOTES_v11.7.0.md).
399
+ [RELEASE_NOTES_v11.7.0.md](releases/RELEASE_NOTES_v11.7.0.md).
340
400
 
341
401
  ## [11.6.0] - 2026-08-15 — One Door
342
402
 
@@ -411,7 +471,7 @@ existed at that release.
411
471
  비어 있음 · 리뷰 스누즈 offset-aware 500 · 제안 이중 거절 500),
412
472
  업로드 추출 UTF-8 전용, 공급 벡터 1차 노드 한정, 네이티브 도구의 사용자
413
473
  훅 미발화, `sanitize_write_content` 미적용, 워커 원점으로 남은 seam 호출
414
- 3건. 전문은 [RELEASE_NOTES_v11.6.0.md](../RELEASE_NOTES_v11.6.0.md).
474
+ 3건. 전문은 [RELEASE_NOTES_v11.6.0.md](releases/RELEASE_NOTES_v11.6.0.md).
415
475
 
416
476
  ## [11.5.2] - 2026-08-12 — Tight Ship
417
477
 
@@ -1,6 +1,6 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **12.2.0 — Small Voice**.
3
+ Current release: **12.3.0 — Live Wire**.
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.2.0 — Small Voice**.
6
+ Current release: **12.3.0 — Live Wire**.
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.2.0.
83
+ rebuild (`cargo build -p lattice-host --release`) if `-V` is not 12.3.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.2.0 — …**` matching
240
+ included) must carry `Current release: **12.3.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.2.0/SCREENSHOT_INDEX.md` still names the live
251
+ `output/release/v12.3.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.2.0 ahead of
320
+ bumps. Do not move this file's `Current release` marker off 12.3.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.2.0 release work, exact artifacts are:
326
+ For 12.3.0 release work, exact artifacts are:
327
327
 
328
- - `dist/ltcai-12.2.0-py3-none-any.whl`
329
- - `dist/ltcai-12.2.0.tar.gz`
330
- - `ltcai-12.2.0.tgz`
331
- - `dist/ltcai-12.2.0.vsix`
332
- - `src-tauri/target/release/bundle/dmg/Lattice AI_12.2.0_aarch64.dmg`
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`
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.2.0 — Small Voice**.
3
+ Current release: **12.3.0 — Live Wire**.
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.2.0)
1
+ # Lattice AI — Operations Guide (v12.3.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-08-29**, against the 12.1.0 — Fast Path tree. The rows below
6
+ As of **2026-10-19**, against the 12.3.0 — Live Wire 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.
@@ -17,8 +17,8 @@ the contributor path is [DEVELOPMENT.md](DEVELOPMENT.md). This page is the
17
17
  honest leftover list, gathered from
18
18
  [FEATURE_STATUS.md](../FEATURE_STATUS.md) Known Limitations and the §정직한
19
19
  고지 sections of
20
- [RELEASE_NOTES_v11.9.0.md](../RELEASE_NOTES_v11.9.0.md) and
21
- [RELEASE_NOTES_v12.0.0.md](../RELEASE_NOTES_v12.0.0.md).
20
+ [releases/RELEASE_NOTES_v11.9.0.md](releases/RELEASE_NOTES_v11.9.0.md) and
21
+ [releases/RELEASE_NOTES_v12.0.0.md](releases/RELEASE_NOTES_v12.0.0.md).
22
22
 
23
23
  Four items those ledgers named **closed in 12.0.0**. They are kept below so
24
24
  they are not re-opened as work. Everything else is still open.
@@ -43,18 +43,18 @@ rather than being deleted: the small-model harness (P1) and the HNSW index
43
43
 
44
44
  | 무엇 | 왜 남았나 | 난이도 | 우선순위 | 제안 경로 |
45
45
  | --- | --- | --- | --- | --- |
46
- | **Small-model agent-run content quality** | **Half closed in 12.0.0.** The mechanical half is done: the `guided` profile stops asking for JSON, the dial is chosen by a measured probe, a run that produces nothing demotes itself downward mid-run, and a 0.5B model reached `DONE` in 3.9s with a real file. The half still open is the *writing* — a weak summary fails the critic and the run ends `FAILED` / `NEEDS_REVIEW`. The cross-model matrix is improving from 11 of 18. | L | **P1** — still the voice the product ships on 8GB, and still the reason a first run can end in a review state. | Keep measuring with the loop's own parser, not a second harness. New answers go under new fixture keys (`agent_loop` `*_extended`); do not rewrite frozen rows. The remaining lever is content, not format: better plan→content prompting and a critic that says *what* was thin, per-model hacks still forbidden. |
47
- | **Real-embedding default rollout** | **Narrowed in 12.0.0, not closed.** Auto-detection now adopts a real downloaded embedding model when one is present, the hash model is labelled `fallback` rather than presented as semantic, and vector identity is filtered by `(model, dim)` so two spaces cannot mix. What is still true: on a machine that has downloaded nothing, the default remains `lattice-local-hash-v1` (blake2 bag-of-features), and "semantic" recall is then a hash of tokens. | M | **P1** — recall is the product. Hash as a labelled fallback is fine; hash as the silent default is not. | Make the first-run flow offer the embedding model the way it offers a chat model, and keep the switch honest: drain the backlog through `lattice-jobs` so a change of embedder is a reindex, and report `stale_embedder` until the queue is empty. |
46
+ | **Small-model agent-run content quality** | **Narrowed in 12.2.1.** Mechanical half closed in 12.0.0 (`guided`, measured probe). 12.2.1 fills a thin summary from the `read_file` / `mcp.read_file` result already on the transcript; missing evidence is `NEEDS_REVIEW`, not a false DONE. Remaining: a 2B that never read the file, and writing that is fluent but wrong. | L | **P1** — still the voice on 8GB. | Keep measuring with the loop's own parser. Do not add a per-model branch. |
47
+ | **Real-embedding default rollout** | **Narrowed again in 12.2.1.** First-run and the library name hash search as hash and point at a meaning model. Auto-detection still adopts a real downloaded embedder when one is present. The no-download default is still `lattice-local-hash-v1`. | M | **P1** — recall is the product. | Offer an embedding model in first-run the way a chat model is offered. Drain through `lattice-jobs` on switch. No second embedder in `lattice-core`. |
48
48
  | **Worker-side batch embed** | **Closed in 12.1.0 on the ingest-time door**: one `/worker/embed` body is the document vector followed by every chunk, extract runs beside it, and `write_vectors_with` files those vectors. The drain planner stays the backlog path. Folder/watch overlap up to four files. What remains for a real-embed default is auto-detection on first run, not a second embedder. | M | **P1 → closed for the ingest door; the real-embed default row above is still open.** | Keep. Do not open a second embedder inside `lattice-core`. |
49
49
 
50
50
  ## P2 — real, but the product still works without them
51
51
 
52
52
  | 무엇 | 왜 남았나 | 난이도 | 우선순위 | 제안 경로 |
53
53
  | --- | --- | --- | --- | --- |
54
- | **HNSW whole-rebuild** | **Closed in 12.0.0; the default is deliberately unchanged.** The sidecar appends incrementally instead of being invalidated by every write, and the index is now used in real search: `hnsw+rescore` fetches `k * 8` candidate ids (cap 200) from `POST /worker/vector/query` and rescores exactly those rows natively, so recall is approximate and ordering is exact. Failures fall back to the exact scan carrying their reason. | L | **P2 → resolved for scale; the default stays `brute`.** | Nothing to build. The remaining decision is when to flip the default, and that needs recall@10 re-measured against the exact scan on a Brain that has been ingesting continuously — not a synthetic corpus. |
54
+ | **HNSW whole-rebuild / full-table dump** | **Closed in 12.2.1.** 12.0.0 appended instead of invalidating. 12.2.1 warm queries are `COUNT(*)` then missing ids only; a loaded sidecar appends a delta instead of rebuilding from the incoming set. Env default stays `brute`. | L | **P2 → closed for the dump; the default stays `brute`.** | Flip the default only after recall@10 vs exact scan on a live Brain. |
55
55
  | **Unsigned DMG** | `Lattice AI_12.0.0_aarch64.dmg` is ad-hoc signed (= unsigned). First launch needs the Gatekeeper bypass. `npm run release:validate` checks names and presence, not a Developer ID. | M | **P2** — first-run tax on desktop, not a Brain bug. Needs an Apple identity. | Developer ID Application + notarization in the release path. Exact artifact name stays `dist/…` / `src-tauri/target/release/bundle/dmg/Lattice AI_X.Y.Z_aarch64.dmg`. Credentials stay off the tree. |
56
- | **`api_key` cloud path is mock-only** | Contract-tested against a mock server. Never live-called — no billing budget. Live E2E is `cli_oauth` (`agy` / `grok`) at zero API billing. | S | **P2** — the supported cloud path already works. This is the paid-key twin. | One live contract test against a real OpenAI-compatible endpoint once a budget exists. Do not call the mock path "verified" in FEATURE_STATUS. Keep `local_only` winning on the request. |
57
- | **Vault-watch full-resync** | **Largely closed in 12.0.0**: the ingest fingerprint (size + mtime + content sha256) is on the watch path, so an unchanged note is not re-read, re-chunked or re-embedded. The pass itself still runs once through the bridge, because link edges need node ids only a completed ingest has. Cap is still 2,000 notes/run (`truncated: true`), still off by default. | M | **P2** — the wasteful part is gone; the shape of the pass is unchanged. | Attach links from the ids that already landed so the bridge does not need a whole pass at all. Keep the 2,000 cap and the `truncated` flag. Inline `#tags` stay out of scope. Watch still never deletes — cleanup is the confirmed prune door. |
56
+ | **`api_key` cloud path is mock-only** | **Narrowed in 12.2.1.** Status now live-probes `GET /models` with the key (no completion) and fail-closes when the provider is unreachable. Chat completions are still not billed in CI. Live E2E remains `cli_oauth`. | S | **P2** — the key is proven to work; a billed completion is still a budget. | One live contract completion once a budget exists. Keep `local_only` winning on the request. |
57
+ | **Vault-watch full-resync** | **Closed the remaining two holes in 12.2.1**: skip-by-hash restamps so a `touch` is not re-hashed forever, and vanished watched files are pruned from the graph (`delete_document_tree`). Disk is never deleted. Cap is still 2,000 notes/run. | M | **P2 → closed for skip and prune.** | Attach links from ids that already landed so the bridge does not need a whole pass. Keep the cap. |
58
58
  | **Self-Model has no screen** | Writes were restored in 11.7.0. `GET/POST/DELETE /api/memory/self-model*` and Review Center proposals work. `/app` has no profile view — "Brain이 나에 대해 뭐라고 생각하나" is an API call. | M | **P2** — the data path is real; the reader cannot see it. | A panel under `frontend/src/features/brain/` + `frontend/src/i18n/brain/`, reading the existing API. No new writer. Vitest 100% `all: true`. |
59
59
 
60
60
  ## P3 — honesty leftovers that should not grow
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **12.2.0 — Small Voice**.
3
+ Current release: **12.3.0 — Live Wire**.
4
4
 
5
5
  Lattice AI is local-first, explicit about external communication, and honest
6
6
  when a capability is unavailable.
@@ -87,7 +87,7 @@ does not mean secrets should appear in clear text.
87
87
  - Cloud model prompts follow the selected provider's policy once the user
88
88
  explicitly chooses that provider (or the `auto`/`always` escalation
89
89
  policy does, behind `cloud_allowed`). The `api_key` path is
90
- mock-verified only in this release; live OAuth used `cli_oauth` at
90
+ probed with `GET /models` (no billed completion); live OAuth used `cli_oauth` at
91
91
  zero billing. Extracted cloud knowledge is proposal-first.
92
92
  - A local admin can inspect local files and process memory outside Lattice AI.
93
93
  - Marketplace and model registries are third-party services when explicitly
@@ -1,6 +1,6 @@
1
1
  # Why Lattice AI Exists
2
2
 
3
- Current release: **12.2.0 — Small Voice**.
3
+ Current release: **12.3.0 — Live Wire**.
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.2.0 — Small Voice**.
3
+ Current release: **12.3.0 — Live Wire**.
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.2.0"
34
+ __version__ = "12.3.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.2.0"
3
+ __version__ = "12.3.0"
@@ -58,7 +58,6 @@ LOCAL_MLX_MODELS: Tuple[Tuple[str, int, bool], ...] = (
58
58
  ("mlx-community/multilingual-e5-large-mlx", 1024, True),
59
59
  ("mlx-community/snowflake-arctic-embed-l-v2.0-8bit", 1024, False),
60
60
  ("mlx-community/embeddinggemma-300m-4bit", 768, False),
61
- ("mlx-community/bge-m3", 1024, False),
62
61
  )
63
62
 
64
63
  #: Ollama model names that are embedders rather than chat models.
@@ -256,7 +256,7 @@ def _gemma4_runtime_candidates(raw_model_id: str) -> List[Dict[str, Any]]:
256
256
  {
257
257
  "engine": "ollama",
258
258
  "runtime": "Ollama GGUF",
259
- "load_id": "ollama:hf.co/ggml-org/gemma-4-12B-it-GGUF:Q4_K_M",
259
+ "load_id": "ollama:hf.co/ggml-org/gemma-4-12B-it-GGUF:Q4_0",
260
260
  "available": None,
261
261
  "role": "gguf_local_server",
262
262
  },
@@ -354,7 +354,7 @@ def model_runtime_compatibility(model_id: str, engine: Optional[str] = None) ->
354
354
  ],
355
355
  "alternatives": [
356
356
  {"id": "mlx-community/gemma-4-26b-a4b-it-4bit", "name": "Gemma 4 26B A4B", "engine": "local_mlx"},
357
- {"id": "ollama:hf.co/ggml-org/gemma-4-12B-it-GGUF:Q4_K_M", "name": "Gemma 4 12B GGUF", "engine": "ollama"},
357
+ {"id": "ollama:hf.co/ggml-org/gemma-4-12B-it-GGUF:Q4_0", "name": "Gemma 4 12B GGUF", "engine": "ollama"},
358
358
  {"id": "lmstudio:ggml-org/gemma-4-12B-it-GGUF", "name": "Gemma 4 12B GGUF", "engine": "lmstudio"},
359
359
  ],
360
360
  "action": "Runtime update needed",