ltcai 11.6.0 → 11.9.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 (137) hide show
  1. package/README.md +80 -75
  2. package/docs/BENCHMARKS.md +9 -2
  3. package/docs/CHANGELOG.md +201 -0
  4. package/docs/CI_AND_RELEASE_GATES.md +126 -41
  5. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  6. package/docs/DEVELOPMENT.md +34 -14
  7. package/docs/LEGACY_COMPATIBILITY.md +10 -6
  8. package/docs/ONBOARDING.md +5 -3
  9. package/docs/OPERATIONS.md +5 -1
  10. package/docs/PERMISSION_MODE.md +14 -9
  11. package/docs/TRUST_MODEL.md +13 -6
  12. package/docs/USABILITY_AUDIT.md +5 -0
  13. package/docs/WHY_LATTICE.md +6 -4
  14. package/docs/kg-schema.md +7 -3
  15. package/docs/mcp-tools.md +73 -79
  16. package/docs/security-model.md +6 -3
  17. package/lattice_brain/__init__.py +1 -1
  18. package/lattice_brain/graph/_kg_common/__init__.py +1 -54
  19. package/lattice_brain/graph/_kg_common/text.py +14 -450
  20. package/lattice_brain/ingestion/__init__.py +6 -3
  21. package/lattice_brain/multimodal/__init__.py +9 -3
  22. package/latticeai/__init__.py +1 -1
  23. package/latticeai/api/agent_worker_seam.py +12 -1
  24. package/latticeai/api/models.py +18 -110
  25. package/latticeai/api/search.py +7 -30
  26. package/latticeai/api/worker_compute.py +53 -107
  27. package/latticeai/api/worker_seams.py +17 -2
  28. package/latticeai/core/http_origin.py +3 -3
  29. package/latticeai/core/messages.py +0 -5
  30. package/latticeai/core/policy.py +1 -6
  31. package/latticeai/core/quiet.py +1 -20
  32. package/latticeai/core/security.py +29 -83
  33. package/latticeai/core/sessions.py +95 -4
  34. package/latticeai/core/users.py +0 -38
  35. package/latticeai/models/router/catalog.py +2 -2
  36. package/latticeai/models/router/generation.py +81 -14
  37. package/latticeai/models/router/loading.py +41 -5
  38. package/latticeai/runtime/access_runtime.py +7 -4
  39. package/latticeai/runtime/build_phases/features.py +8 -31
  40. package/latticeai/runtime/build_phases/foundation.py +7 -16
  41. package/latticeai/runtime/build_phases/web.py +3 -3
  42. package/latticeai/runtime/build_phases/worker_profile.py +21 -28
  43. package/latticeai/runtime/runtime_context.py +0 -2
  44. package/latticeai/services/architecture_readiness.py +18 -19
  45. package/latticeai/services/process_audit.py +1 -22
  46. package/latticeai/services/product_readiness.py +33 -11
  47. package/latticeai/services/voice_capture.py +8 -28
  48. package/latticeai/tools/__init__.py +6 -46
  49. package/latticeai/tools/commands.py +9 -15
  50. package/latticeai/tools/knowledge.py +0 -6
  51. package/package.json +3 -5
  52. package/requirements.txt +0 -1
  53. package/scripts/check_current_release_docs.mjs +1 -1
  54. package/scripts/check_openapi_drift.mjs +3 -2
  55. package/scripts/check_server_i18n.mjs +5 -4
  56. package/scripts/compose_openapi.py +2 -1
  57. package/scripts/export_openapi.py +5 -4
  58. package/scripts/gen_worker_allowlist_fixture.py +2 -2
  59. package/scripts/openapi_route_families.json +14 -73
  60. package/scripts/release_screen_claims.json +151 -14
  61. package/src-tauri/Cargo.lock +11 -10
  62. package/src-tauri/Cargo.toml +1 -1
  63. package/src-tauri/tauri.conf.json +1 -1
  64. package/static/app/asset-manifest.json +41 -41
  65. package/static/app/assets/{Act-CToZnOHz.js → Act-B4WT81kh.js} +1 -1
  66. package/static/app/assets/AdminConsole--Wf71m-o.js +1 -0
  67. package/static/app/assets/{Brain-C6zCdv4S.js → Brain-CtYaa26c.js} +2 -2
  68. package/static/app/assets/BrainHome-Be2VPJEc.js +2 -0
  69. package/static/app/assets/BrainSignals-C0__xgpG.js +1 -0
  70. package/static/app/assets/Capture-DdNi5Peb.js +1 -0
  71. package/static/app/assets/Chronicle-B3hNveeI.js +1 -0
  72. package/static/app/assets/CommandPalette-CIsnSsFL.js +1 -0
  73. package/static/app/assets/Library-Bl5XClFV.js +1 -0
  74. package/static/app/assets/LivingBrain-DjkTB_gh.js +1 -0
  75. package/static/app/assets/{ProductFlow-CBLdmesT.js → ProductFlow-DCUNRNHs.js} +1 -1
  76. package/static/app/assets/ReviewCard-CD3yWvUB.js +3 -0
  77. package/static/app/assets/System-BJ6jQ_SL.js +1 -0
  78. package/static/app/assets/arrow-left-6_28Z0qH.js +1 -0
  79. package/static/app/assets/{bot-C5-XIww2.js → bot-Bc3Q27YR.js} +1 -1
  80. package/static/app/assets/brain-B9BDrMTe.js +1 -0
  81. package/static/app/assets/{button-DI1KcQP-.js → button-D6JcpYcf.js} +1 -1
  82. package/static/app/assets/circle-check-BFu9lD-3.js +1 -0
  83. package/static/app/assets/{circle-pause-C8HHyood.js → circle-pause-BGMiV8UU.js} +1 -1
  84. package/static/app/assets/{circle-play-Cufc235E.js → circle-play-DoanLHnd.js} +1 -1
  85. package/static/app/assets/{cpu-DW2_JVsv.js → cpu-DwzNf82m.js} +1 -1
  86. package/static/app/assets/{download-gbdKTBb8.js → download-Ddw49yCV.js} +1 -1
  87. package/static/app/assets/{folder-open-C9ydyX33.js → folder-open-Brd6Kvto.js} +1 -1
  88. package/static/app/assets/{hard-drive-BxNMzBM3.js → hard-drive-Bu-DTJdB.js} +1 -1
  89. package/static/app/assets/index-CGdg_aq9.css +2 -0
  90. package/static/app/assets/{index-q9XyDY7A.js → index-CWKRRsLW.js} +4 -4
  91. package/static/app/assets/input-CEqsxtil.js +1 -0
  92. package/static/app/assets/{link-2-B4Y0gz1S.js → link-2-DZ4OA5tJ.js} +1 -1
  93. package/static/app/assets/{permissionCopy-CxrV0fvU.js → permissionCopy-D9TR0F8b.js} +1 -1
  94. package/static/app/assets/primitives-DORg7Z_7.js +1 -0
  95. package/static/app/assets/search-0NQ21wXe.js +1 -0
  96. package/static/app/assets/{share-2-DxArfiuI.js → share-2-BC5FirFv.js} +1 -1
  97. package/static/app/assets/{shield-alert-CgftuFFs.js → shield-alert-DUbR2W2s.js} +1 -1
  98. package/static/app/assets/textarea-jtQcRSXo.js +1 -0
  99. package/static/app/assets/{useFocusTrap-Dzq2j_OG.js → useFocusTrap-HRemcWId.js} +1 -1
  100. package/static/app/assets/{useMutation-BcqfMLNq.js → useMutation-DqlFE-Bw.js} +1 -1
  101. package/static/app/assets/{useQuery-DBzLKCOv.js → useQuery-BizqBNGw.js} +1 -1
  102. package/static/app/assets/utils-WgW4V69R.js +4 -0
  103. package/static/app/assets/workspace-DSek3jCY.js +1 -0
  104. package/static/app/index.html +4 -4
  105. package/static/sw.js +1 -1
  106. package/lattice_brain/ingestion/pipeline.py +0 -108
  107. package/latticeai/api/local_files.py +0 -44
  108. package/latticeai/api/tools.py +0 -126
  109. package/latticeai/api/voice_capture.py +0 -32
  110. package/latticeai/core/agent_permission.py +0 -85
  111. package/scripts/agent_eval.py +0 -34
  112. package/scripts/brain_quality_eval.py +0 -37
  113. package/scripts/check_legacy_debt.mjs +0 -91
  114. package/scripts/check_python.py +0 -100
  115. package/scripts/chunking_parity_corpus.py +0 -449
  116. package/scripts/generate_agent_parity_fixtures.py +0 -771
  117. package/scripts/generate_chunking_parity_fixtures.py +0 -259
  118. package/static/app/assets/AdminConsole-D5kbrBu8.js +0 -1
  119. package/static/app/assets/BrainHome-D4n3EDUt.js +0 -2
  120. package/static/app/assets/BrainSignals-CzeZ-vQ9.js +0 -1
  121. package/static/app/assets/Capture-DPcyTczq.js +0 -1
  122. package/static/app/assets/Chronicle-D3Nx-oWS.js +0 -1
  123. package/static/app/assets/CommandPalette-DPPvpp28.js +0 -1
  124. package/static/app/assets/Library-Co2qTu3I.js +0 -1
  125. package/static/app/assets/LivingBrain-Bsmzwy8_.js +0 -1
  126. package/static/app/assets/ReviewCard-CfR6DLs7.js +0 -3
  127. package/static/app/assets/System-Ce-P2YL6.js +0 -1
  128. package/static/app/assets/arrow-left-DD5jFGHV.js +0 -1
  129. package/static/app/assets/brain-CFRJUvdX.js +0 -1
  130. package/static/app/assets/circle-check-CY20XMCh.js +0 -1
  131. package/static/app/assets/index-BovSWRmQ.css +0 -2
  132. package/static/app/assets/input-GLD94Y_K.js +0 -1
  133. package/static/app/assets/primitives-2ANdAsu2.js +0 -1
  134. package/static/app/assets/search-DTxtjQ07.js +0 -1
  135. package/static/app/assets/textarea-BHVBAoCr.js +0 -1
  136. package/static/app/assets/utils-B-Aah1bO.js +0 -4
  137. package/static/app/assets/workspace-B6fFhoko.js +0 -1
package/README.md CHANGED
@@ -11,23 +11,24 @@
11
11
  [![CI Status](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/ci.yml)
12
12
  [![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
13
13
 
14
- ![v11.6.0 Living Brain walkthrough](output/release/v11.6.0/gifs/v11.6.0-living-brain-walkthrough.gif)
14
+ ![v11.9.0 Living Brain walkthrough](output/release/v11.9.0/gifs/v11.9.0-living-brain-walkthrough.gif)
15
15
 
16
16
  Chat, files, folders, notes, and web pages all flow into one durable knowledge
17
- graph on your computer. Any model — local MLX or cloud — can speak with that
18
- memory. Nothing leaves your machine without explicit consent.
17
+ graph on your computer. The default is local. Cloud is optional — an
18
+ OAuth-authenticated CLI (`agy` / `grok`) or an API key you configure — and
19
+ nothing leaves your machine without explicit consent.
19
20
 
20
- 대화·파일·폴더·웹페이지가 전부 내 컴퓨터 안의 지식 그래프로 쌓이고, 어떤
21
- 모델이든 그 기억을 이어받아 대화합니다.
21
+ 대화·파일·폴더·웹페이지가 전부 내 컴퓨터 안의 지식 그래프로 쌓입니다.
22
+ 기본은 로컬이고, 클라우드는 선택입니다 (OAuth CLI 지원).
22
23
 
23
24
  ## What You Can Do
24
25
 
25
26
  | | |
26
27
  | --- | --- |
27
- | **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/v11.6.0/screenshots/13-chronicle.png) | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v11.6.0/screenshots/04-brain-chat-home.png) |
28
- | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v11.6.0/screenshots/05-memory-graph.png) | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v11.6.0/screenshots/06-capture.png) |
29
- | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v11.6.0/screenshots/12-review-center.png) | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v11.6.0/screenshots/02-recommended-models.png) |
30
- | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v11.6.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/v11.6.0/screenshots/08-system.png) |
28
+ | **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/v11.9.0/screenshots/13-chronicle.png) | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v11.9.0/screenshots/04-brain-chat-home.png) |
29
+ | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v11.9.0/screenshots/05-memory-graph.png) | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v11.9.0/screenshots/06-capture.png) |
30
+ | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v11.9.0/screenshots/12-review-center.png) | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v11.9.0/screenshots/02-recommended-models.png) |
31
+ | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v11.9.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/v11.9.0/screenshots/08-system.png) |
31
32
 
32
33
  ## Why Lattice AI
33
34
 
@@ -58,67 +59,49 @@ First-run flow — wake the Brain, pick the owner, load a recommended model:
58
59
 
59
60
  | | | |
60
61
  | --- | --- | --- |
61
- | ![Login](output/release/v11.6.0/screenshots/01-login.png) | ![Model install](output/release/v11.6.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v11.6.0/screenshots/07-model-library.png) |
62
+ | ![Login](output/release/v11.9.0/screenshots/01-login.png) | ![Model install](output/release/v11.9.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v11.9.0/screenshots/07-model-library.png) |
62
63
 
63
64
  Screenshot index and capture notes:
64
- [output/release/v11.6.0/SCREENSHOT_INDEX.md](output/release/v11.6.0/SCREENSHOT_INDEX.md)
65
+ [output/release/v11.9.0/SCREENSHOT_INDEX.md](output/release/v11.9.0/SCREENSHOT_INDEX.md)
65
66
 
66
67
  ## Current Release
67
68
 
68
- The current release is **11.6.0 — One Door**:
69
-
70
- The product now has one front door, and it is Rust. `lattice-host` serves
71
- **420 operations across 41 route families** at the paths they always had,
72
- and the Python package is no longer a web application at all — it is a
73
- pure-compute **AI worker** with **28 routes**: LLM inference and streaming,
74
- embedding, extraction, parsing, four document renderers, speech-to-text,
75
- multimodal description, the model and engine catalog, `sysinfo`, and
76
- `/health`. Nine crates hold the product; the door forwards exactly the 28
77
- and answers `404 {"detail":"Not Found"}` for anything else, from a
78
- committed allowlist that a drift gate regenerates and compares.
79
-
80
- - **Every write is native.** The knowledge-graph write engine moved into
81
- `lattice-core`: ingest, curation, provenance, taxonomy and the vector
82
- queue. It is held to Python's bytes by a **32-step row-parity battery**
83
- that dumps every table after every step with zero tolerated differences,
84
- and by a schema comparison over all **67 objects** in `sqlite_master`
85
- (indexes and FTS shadow tables included). Seventeen graph tables changed
86
- owner from the worker to Rust, and the single-writer invariant is now a
87
- test rather than a convention.
88
- - **The surface is replayed, not re-described.** **1,487 recorded HTTP
89
- cases** across twelve committed fixture files — captured from the real
90
- Python app while it still served them — are replayed against the native
91
- routes, status line and body compared. The retrieval, chunking, agent
92
- kernel and agent-loop golden families are unchanged and still green.
93
- - **298 Python files and 73,617 lines were deleted.** What remains is 127
94
- files and about 20,900 lines, all of it compute, at **100.00% statement
95
- and branch coverage** with `fail_under=100` and no new pragmas.
96
- - **What the port found.** The Python oracle's own bugs are documented
97
- rather than smoothed over: four graph-write divergences (a `kgv2_*` view
98
- that updates `type` on conflict where `nodes` does not; two writers that
99
- serialise without `sort_keys`; a hash computed from CPython's default
100
- JSON separators), a documented redaction rule that never fired, and a
101
- change-proposal kind whitelist that could never approve a folder
102
- reorganization. Three known-wrong behaviours were ported **as they are**
103
- so the surface does not change under users mid-release — they are listed
104
- in [RELEASE_NOTES_v11.6.0.md](RELEASE_NOTES_v11.6.0.md).
105
- - **What was removed, and why.** The **Telegram bridge** is gone: it lived
106
- in the platform code that became the worker, and a bridge with no product
107
- server to bridge to is not a feature. **SSO/OIDC login and callback
108
- flows** are gone with it — the configuration surface remains, and
109
- password login is native. Both are consequences of the worker boundary,
110
- not decisions taken on their own merits.
111
-
112
- Full disclosure of gaps, ported bugs and removed surfaces:
113
- [RELEASE_NOTES_v11.6.0.md](RELEASE_NOTES_v11.6.0.md)
114
-
115
- Expected artifacts for 11.6.0 release must use exact filenames:
116
-
117
- - `dist/ltcai-11.6.0-py3-none-any.whl`
118
- - `dist/ltcai-11.6.0.tar.gz`
119
- - `ltcai-11.6.0.tgz`
120
- - `dist/ltcai-11.6.0.vsix`
121
- - `src-tauri/target/release/bundle/dmg/Lattice AI_11.6.0_aarch64.dmg`
69
+ The current release is **11.9.0 — Working Order**:
70
+
71
+ 11.8.0 took weight off the door. This release puts the remaining Current
72
+ stubs and the half-wired lanes in working order. The door is unchanged:
73
+ `lattice-host` still serves **420 operations across 41 route families**,
74
+ and the AI worker is still **19 routes** (`/worker/sysinfo` gained
75
+ additive `capabilities` and `python_version`). Cloud is optional; the
76
+ default is local; OAuth CLI (`agy` / `grok`) is supported.
77
+
78
+ - **Thirteen documented-Current stubs now answer.** Model
79
+ recommendations probe RAM and the worker catalog. Setup scan/auto are
80
+ real probes; install is real-or-manual (brew/pip stay manual).
81
+ Computer-use status reads worker capabilities. `/agent/eval` is a
82
+ deterministic skill eval. `/agents/api/run` is a live single-agent
83
+ pass. Automation mines `conversation_messages`. Workflow run is a
84
+ per-step executor; `build`/`deploy_project` run governed scripts.
85
+ - **Hybrid cloud is wired.** ReviewSink and a shape-only egress audit
86
+ are bound in production. Dual credentials: `api_key` (mock-verified
87
+ only) and `cli_oauth` (live OAuth E2E at zero billing). Escalation is
88
+ `auto` / `manual` / `always`; `local_only` on the request always wins.
89
+ - **MCP is a real JSON-RPC server** at `POST /mcp`. Chat file generation
90
+ — the v9.2.0 headline deleted in the 11.6.0 port — is restored. The
91
+ 8GB-tier default (gemma-4-e2b) actually runs.
92
+
93
+ What this release does not close — 2B agent-run quality, the mock-only
94
+ `api_key` path, restore needing a restart, brew/pip staying manual,
95
+ `/mcp` outside the OpenAPI contract, the ad-hoc-signed dmg — is listed
96
+ in [RELEASE_NOTES_v11.9.0.md](RELEASE_NOTES_v11.9.0.md).
97
+
98
+ Expected artifacts for 11.9.0 release must use exact filenames:
99
+
100
+ - `dist/ltcai-11.9.0-py3-none-any.whl`
101
+ - `dist/ltcai-11.9.0.tar.gz`
102
+ - `ltcai-11.9.0.tgz`
103
+ - `dist/ltcai-11.9.0.vsix`
104
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_11.9.0_aarch64.dmg`
122
105
 
123
106
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
124
107
 
@@ -131,21 +114,24 @@ every product route, owns every write to the Brain, and supervises a Python
131
114
  **AI worker** it reaches over loopback for the things a model does — inference,
132
115
  embedding, extraction, parsing, rendering, speech-to-text. The React/Vite
133
116
  frontend and the Tauri desktop shell sit on top of that one door. Local-first
134
- by default — cloud model calls, downloads, Brain Network, and update checks are
135
- opt-in.
117
+ by default — cloud is optional (OAuth CLI or an API key you configure),
118
+ and downloads, Brain Network, and update checks are opt-in.
136
119
 
137
120
  See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
138
121
  [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for the developer workflow
139
- (`npm install && npm run dev`, validation via `npm run lint`,
140
- `npm run test:unit`, `npm run test:visual`).
122
+ (`npm start` / `bin/ltcai.js` is the product; `npm run dev` is the
123
+ 19-route worker). Validation via `npm run lint`, `npm run test:unit`,
124
+ `npm run test:visual`.
141
125
 
142
126
  ## Known Limitations
143
127
 
144
128
  - External package registries are owner-published and can lag behind GitHub.
145
129
  - SQLite is the live local Brain store. The optional PostgreSQL/pgvector
146
- migration tooling is not part of the 11.6.0 worker.
130
+ migration tooling is not part of the 11.9.0 worker.
147
131
  - Docker, model downloads, cloud model calls, Brain Network, and update checks
148
- require explicit user action.
132
+ require explicit user action. Cloud is optional: `cli_oauth` (`agy` /
133
+ `grok`) was live-checked at zero billing; the `api_key` path is
134
+ mock-verified only.
149
135
  - **The Telegram bridge was removed in 11.6.0** — it lived in the platform code
150
136
  that became the AI worker. **SSO/OIDC login and callback flows were removed
151
137
  with it**; the configuration surface remains and password login is native.
@@ -157,10 +143,26 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
157
143
  required dependency as of 11.6.0 (it used to be an undeclared lazy import
158
144
  that raised a 500; `ltcai[pdf]` remains as an empty alias for older
159
145
  install instructions).
160
- - Known gaps carried openly into this release — upload extraction enrichment is
161
- UTF-8-text only, supplied vectors cover the primary ingest node, and the
162
- pointer-control tools still execute in the worker — are listed with their
163
- reasons in [RELEASE_NOTES_v11.6.0.md](RELEASE_NOTES_v11.6.0.md).
146
+ - The multimodal image and video analysis functions have no HTTP door as of
147
+ 11.8.0: their only route wrapped a native image ingest that was never
148
+ built. The observation code stays in Brain Core under unit test, and its
149
+ module header says so.
150
+ - The Python coverage gate is a **line floor of 90** since 11.8.0 (the
151
+ 100%-lines-and-branches gate was removed). 11.9.0 measures 99.97%; the
152
+ enforced floor is the smaller claim.
153
+ - **2B agent-run quality is gated honestly.** gemma-4-e2b writes the
154
+ requested file and can still fail the critic on the summary.
155
+ - Restore in a long-lived process may serve pre-restore bytes until
156
+ connections recycle — restart after restore. brew/pip setup items stay
157
+ manual. `/mcp` is a real JSON-RPC server and is outside the OpenAPI
158
+ contract by design.
159
+ - The macOS dmg is ad-hoc signed — effectively unsigned — so first launch
160
+ needs the usual Gatekeeper step.
161
+ - Pointer-control tools still execute in the worker. Remaining honest gaps
162
+ (`open_keys` pending-only, no Self-Model refiner, `PART_OF` left on
163
+ delete, review events silent without an owner, KG-api ingest text-only,
164
+ two store cycles per review mutation) are listed with their reasons in
165
+ [RELEASE_NOTES_v11.9.0.md](RELEASE_NOTES_v11.9.0.md).
164
166
 
165
167
  ## Release History
166
168
 
@@ -171,6 +173,9 @@ same boundary. Earlier notes stay in the tree as `RELEASE_NOTES_v*.md` files.
171
173
 
172
174
  | Version | Theme |
173
175
  | --- | --- |
176
+ | 11.9.0 | Working Order |
177
+ | 11.8.0 | Travel Light |
178
+ | 11.7.0 | Clean Sweep |
174
179
  | 11.6.0 | One Door |
175
180
  | 11.5.2 | Tight Ship |
176
181
  | 11.5.1 | Rust Full Loop |
@@ -1,8 +1,15 @@
1
1
  # Model Robustness Benchmarks
2
2
 
3
3
  > Status: reference 2026-07-21
4
-
5
- Methodology and results for `scripts/bench_models.py`, a harness that measures
4
+ >
5
+ > **Dated snapshot.** The harness this page documents no longer exists in the
6
+ > tree: `scripts/bench_models.py` went with the Python agent loop when 11.5.1
7
+ > ported it to Rust, and `latticeai.core.agent_eval` / `scripts/agent_eval.py`
8
+ > followed (the last of them deleted in 11.8.0). The methodology and the
9
+ > honesty notes below are kept as the record of how these numbers were produced
10
+ > and what they did and did not mean — not as instructions you can run today.
11
+
12
+ Methodology and results for `scripts/bench_models.py`, a harness that measured
6
13
  how well the agent loop turns model output into executable actions across model
7
14
  quality tiers. Companion to [CI & Release Gates](CI_AND_RELEASE_GATES.md).
8
15
 
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,207 @@ 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
+ ## [11.9.0] - 2026-08-17 — Working Order
8
+
9
+ ### Added
10
+ - 이중 클라우드 자격증명: `<data_dir>/cloud_provider.json` →
11
+ `LATTICEAI_CLOUD_API_KEY` → CLI 자동감지(`agy` / `grok`). `api_key`는
12
+ OpenAI 호환 어댑터(모의 서버만 검증, 실과금 없음). `cli_oauth`는 로컬
13
+ OAuth CLI(`agy` → gemini-3.7-flash, `grok` → grok-4.6). 중립 temp cwd,
14
+ 120초 타임아웃.
15
+ - `GET /api/cloud/status` — `{configured, mode, provider, model, detail}`.
16
+ - 하이브리드 에스컬레이션 `always` / `auto`(기본) / `manual`
17
+ (`hybrid_policy.json`). `auto`는 로컬 모델 없음 / 로컬 컨텍스트가 얇음
18
+ / 명시적 `/cloud `·`클라우드:` 접두사일 때만. 요청
19
+ `network_mode:"local_only"`가 항상 이김.
20
+ - 호스트가 Review Center + egress 감사 싱크를 바인딩. 클라우드 턴이
21
+ `kg_cloud_expansion` 제안을 올리고 형태만 있는 egress 레코드를 남김
22
+ (provider / model / reason, 내용 없음).
23
+ - `POST /mcp` streamable-HTTP JSON-RPC 실서버(`initialize` /
24
+ `tools/list` / `tools/call`). 큐레이트된 안전 도구 + 스키마가 파싱된
25
+ 스킬 7개. `/mcp/call`이 실제로 디스패치. `/mcp/install`은 정직
26
+ (스킬/플러그인 활성화, 원격은 수동).
27
+ - SPA 클라우드 투명성: ☁️ 클라우드 답변 칩, 컴포저 경계 힌트, 「이번
28
+ 대화는 로컬만」 토글, System 패널 provider 상태 행.
29
+ - 채팅 파일 생성 복원(v9.2.0 헤드라인, 11.6.0 포트에서 삭제됨). 확장자별
30
+ 앵커 프롬프트, judge + 1회 교정, 정직한 sanitize 배지, 프로젝트는
31
+ 최대 3파일 순차, 워커 렌더 시임의 실제 docx/pdf.
32
+ - `/worker/sysinfo`에 `capabilities`(pointer_tools)와 `python_version`
33
+ (가산, 라우트 수는 19 유지).
34
+ - 통합 로컬 승인 토큰(`LocalApprovals`) — `/permissions/approve`에서
35
+ 상환.
36
+
37
+ ### Changed
38
+ - 문서에만 있던 13개 Current 스텁이 실동작: `/models/recommendations`,
39
+ `/setup/scan`+`auto`, `/setup/install`, computer-use 상태,
40
+ `/agent/eval`, `/agents/api/run`, 자동화 패턴/제안, 워크플로 run·
41
+ resume, 리뷰 `run_now`, `build`/`deploy_project`, 백업 blob.
42
+ - 클라우드 모델은 provider 설정에서 오고, 로컬 MLX id를 쓰지 않음.
43
+ 로컬 모델이 없어도 클라우드 턴이 가능.
44
+ - 하이브리드 토큰 프레임은 도착하는 대로 스트림. `stream: false`는
45
+ JSON.
46
+ - 채팅 쓰기의 스코프가 비면 `workspace_id = personal`. null workspace
47
+ 읽기는 personal 가시성.
48
+ - 2B(gemma-4-e2b-it-4bit) compact 프로파일: 태그 스트립·balanced·
49
+ truncated_close·labeled·fence_rescue 파서, v10.8.0 salvage 삼종
50
+ 복원, COMPACT 컨텍스트 <2k, EXECUTE 온도 고정(compact 0.1 /
51
+ standard 0.2). MLX가 temperature + stop string을 존중.
52
+ - 백업 = `VACUUM INTO` 스냅샷 + blob + 정직한 매니페스트 + 원자적 복원.
53
+ export가 edges/chunks를 실음.
54
+ - `POST /agent`가 네이티브 루프에 닿고 제품 정책 표를 실음.
55
+
56
+ ### Fixed
57
+ - 라이브 감사 N1–N9: 에이전트 루프 호스트 바인딩, 빈 Brain 메모리
58
+ API 500(`conversation_messages` 부트스트랩), chat/memory/chronicle/
59
+ command가 지식을 봄, brain health의 빈 100점, 백업/복원 정직성,
60
+ export의 없는 컬럼 조회, 폴더 ingest 승인, 보이스 메모 텍스트 저장.
61
+ - 워크플로 resume 승인 게이트. `write_file`이 비어 있는 content를
62
+ 교정 에러로 거절. critic 판정 복구(verdict-shape + 보수적 토큰,
63
+ fail-closed 유지).
64
+ - 이전에 고장 나 있던 22항목을 신선한 Brain·실모델로 재검증.
65
+
66
+ ### Known issues
67
+ - 2B 에이전트 루프의 *내용 품질*은 정직하게 게이트된다. gemma-4-e2b는
68
+ 요청한 파일을 기계적으로 쓰지만(마감 테이프 5/5) 요약이 critic에서
69
+ 떨어져 FAILED/NEEDS_REVIEW로 끝날 수 있다. 퍼널은 에이전트 런에 더
70
+ 큰 모델을 권한다.
71
+ - `api_key` 클라우드 경로는 모의 서버만 검증했다. 계약 테스트는 있고
72
+ 실호출은 없다(과금 예산 없음).
73
+ - 오래 떠 있는 프로세스에서 복원하면 커넥션이 재활용되기 전까지
74
+ 복원 전 바이트를 줄 수 있다 — 재시작이 필요하다.
75
+ - brew/pip 셋업 항목은 설계상 수동이다.
76
+ - `/mcp`는 설계상 OpenAPI 제품 계약 밖이다.
77
+ - DMG는 ad-hoc 서명(미서명)이다.
78
+ - 11.8.0이 열어 둔 항목(커버리지 바닥 라인 90, 멀티모달 이미지/비디오
79
+ HTTP 문 없음, 11.7.0 leftover)은 그대로다. 전문은
80
+ [RELEASE_NOTES_v11.9.0.md](../RELEASE_NOTES_v11.9.0.md).
81
+
82
+ ## [11.8.0] - 2026-08-16 — Travel Light
83
+
84
+ ### Added
85
+ - 골든 드리프트 가드: 축소된 agent 대표행 세트가 커널의 새 판정 클래스를
86
+ 덮지 않으면 실패. 축소가 조용한 커버리지 손실이 되지 않게 하는 장치.
87
+ - 삭제된 아홉 워커 라우트에 대한 네거티브 테스트 — 게이트웨이가 더 이상
88
+ 전달하지 않음을 Rust KEEP 표와 allowlist 양쪽에서 고정.
89
+ - `rust/fixtures/chunking/FROZEN.md`. 이제 모든 픽스처 계열이 FROZEN.md를
90
+ 가짐.
91
+ - `PhaseBudgets` 토큰 상한(MIN 128 / MAX 8192). 이전에는 하한만 있었음.
92
+ - 모든 GitHub Actions 워크플로에 `concurrency` 그룹과 `timeout-minutes`.
93
+ - Brain Chat Home 재설계: 히어로 컴포저, 3배 커진 LivingBrain(1440에서
94
+ 60px → 179px)과 금빛/옥빛 성장 링, 준비도에 묶인 '기억이 자라고 있어요'
95
+ 캡션, 풀캔버스 그리드, 바닥 연속성 바(지난 대화·현황·기억 지도·기능),
96
+ `prefers-reduced-motion` 폴백.
97
+
98
+ ### Changed
99
+ - 워커 표면 **28 → 19 라우트**. `rust/fixtures/worker_allowlist.json`도 19.
100
+ - 로컬 lint 체인 **13 → 10 게이트**. 순서와 남은 열 개는 그대로.
101
+ - Python 커버리지 게이트가 `fail_under = 100`(문+분기) → **라인 90**.
102
+ 분기 측정은 꺼짐. 실측은 이번 릴리스에서도 100%.
103
+ - `ci.yml` 중복 스텝 제거 — 4레그 매트릭스는 유지하되 OpenAPI ·
104
+ product-readiness · 확장 테스트는 3.11+ubuntu 레그에서만, 커버리지 레그는
105
+ `pytest tests/`를 두 번 돌리지 않음. `release.yml`은 릴리스 스텝만.
106
+ dependency-audit은 cron 전용, visual은 push+nightly(PR 제외),
107
+ e2e-sidecar는 nightly 전용.
108
+ - Rust: `lattice-{platform,retrieval,ingest,jobs}`의 약 191개 파일 blanket
109
+ `#![allow]` 헤더 제거, 약 650건의 clippy/rustc 진단을 원인에서 수정.
110
+ 워크스페이스 수준 허용 0건 추가, 남긴 억제는 이유가 붙은 지역
111
+ `#[allow(clippy::too_many_arguments)]` 8개.
112
+ - 통합 테스트 파일(= 링크되는 테스트 바이너리) **98 → 56**
113
+ (lattice-platform 43 → 11). 테스트 함수 삭제 없이 주제별 통합.
114
+ - `ROLE_CAPABILITIES`가 `lattice-auth` 단일 출처. `lattice-agent`가 의존.
115
+ - agent 골든 `decisions__strict` · `calls`가 702 → **171 대표행**
116
+ (등가류당 한 행).
117
+ - product-readiness 증거를 Rust 픽스처로 재지정. 판정은 COMPLETE 10/10.
118
+
119
+ ### Fixed
120
+ - `SessionStore`가 조회 미스 시 `sessions.json`을 다시 읽음. v11.6.0부터
121
+ writer는 `lattice-auth`인데 워커는 `__init__`에서 한 번만 읽어, **워커
122
+ 기동 이후의 로그인이 워커에게 보이지 않았음** —
123
+ `trusted_local_owner`에서는 조용히, `LATTICEAI_REQUIRE_AUTH=true`에서는
124
+ 파일 안에 있는 토큰에 대해 401. `mtime_ns`/`size` 가드 + 1초 throttle을
125
+ 같은 락 아래에서 적용해 추측 버스트가 읽기 버스트가 되지 않게 함.
126
+ 테스트 9개 추가.
127
+
128
+ ### Removed
129
+ - 호출자 0인 워커 라우트 아홉 개: `GET /api/embeddings/providers`,
130
+ `POST /tools/read_document`, `GET /tools/pdf_pages`,
131
+ `POST /worker/multimodal/describe`, `GET /api/ingestion/multimodal`,
132
+ `POST /models/switch/{model_id}`, `DELETE /models/unload-all`,
133
+ `POST /engines/pull-model`, `GET /api/capture/voice/status`. 파일로는
134
+ `latticeai/api/{tools,local_files,voice_capture}.py`와
135
+ `lattice_brain/ingestion/pipeline.py`. `pypdfium2` 의존성도 함께.
136
+ - `latticeai/core/agent_permission.py`; 죽은 보안 헬퍼(`hash_password` /
137
+ `verify_password`, `check_ip_rate_limit`, `configure_trusted_proxies`,
138
+ `client_ip`, `bytes_match_extension`); `_kg_common/text.py`의 죽은 청커와
139
+ 호출자 0 함수 9개; 렌더 시임의 `_safe_filename` 이중 살균.
140
+ - 얼어붙은 픽스처의 생성기 2종(`generate_agent_parity_fixtures.py`,
141
+ `generate_chunking_parity_fixtures.py`),
142
+ `scripts/{brain_quality_eval,agent_eval,check_python,bench_agent_smoke}.py`,
143
+ `scripts/check_legacy_debt.mjs`(드리프트한 거울 — 파이썬 테스트가 권위).
144
+ - `.github/workflows/agent-smoke.yml` — 모델 없는 러너에서 이중 fail-open.
145
+ - Rust 죽은 코드: `workspace_scope` 모듈, `WORKSPACE_OS_VERSION` 상수,
146
+ 호출자 0 항목 16개.
147
+ - agent 골든 `decisions__trusted` · `decisions__bypass` 그리드(각 702행) —
148
+ 모든 판정 클래스를 덮는 이름 붙은 단위 테스트로 대체.
149
+ - 죽은 프론트 컴포넌트 `FeedbackState.tsx`, `DepthEmergence.tsx`.
150
+
151
+ ### Known issues
152
+ - 커버리지 **강제 바닥이 100 → 90(라인)** 으로 내려갔고 분기 게이트가
153
+ 없어졌습니다. 실측은 100%지만 게이트가 지키는 것은 바닥입니다.
154
+ - `lattice_brain` 멀티모달의 이미지/비디오 절반에 HTTP 문이 없습니다
155
+ (관찰 함수는 Brain Core에 남아 단위 테스트를 받고, 모듈 헤더에 명시).
156
+ - DMG는 ad-hoc 서명(미서명)입니다.
157
+ - 삭제된 라우트의 메시지 카탈로그 키는 얼어붙은 패리티 픽스처에 의도적으로
158
+ 남습니다 — 픽스처는 녹화 당시의 표면을 고정하는 기록입니다.
159
+ - `tests/visual/mock_server`가 고아 mock 라우트 하나를 아직 서빙합니다
160
+ (현재 증거가 해시로 묶여 있어 다음 캡처 사이클에 정리).
161
+ - 11.7.0이 열어 둔 항목은 그대로입니다. 전문은
162
+ [RELEASE_NOTES_v11.8.0.md](../RELEASE_NOTES_v11.8.0.md).
163
+
164
+ ## [11.7.0] - 2026-08-15 — Clean Sweep
165
+
166
+ ### Added
167
+ - 네이티브 훅 싱크(`HooksStore` → `HookSink`): 사용자 `pre_tool` /
168
+ `post_tool`이 네이티브 도구에서 발화하고 `hooks_runs.json`에 같은
169
+ 13키 레코드를 남김(상한 100).
170
+ - `review_item_created` / `review_item_updated` 타임라인 이벤트 —
171
+ 모든 변이 리뷰 경로에서 저장 후 1회. `run_now`는 쓰기가 없어 무발화.
172
+ - vault-watch 폴러: enable 시 기동, 마지막 watch disable 시 정지,
173
+ 재시작 시 resume. 감시 `.pdf`/`.docx`는 `/worker/parse`.
174
+ - 좌초 워커 경로 정적 게이트(디코이 증명). 부채 레지스터 비움.
175
+ - 전면 시각 재설계: elevation 사다리, gradient/border 토큰, 유리 제거,
176
+ 토큰 네이티브 cytoscape. 13 스크린 클레임.
177
+
178
+ ### Changed
179
+ - `workspace_os.json` writer 통합 — `WorkspaceOsStore` 하나 +
180
+ 디렉터리 키 레지스트리 + retrieval/agent 포트. 스탬프는
181
+ `CARGO_PKG_VERSION`.
182
+ - 네 ingest 문(upload / browser-tab / garden note / chat turn)이
183
+ 청크 배치 임베드를 붙임. `(model_id, dim)` 불일치 시 벡터 없음.
184
+ - `/upload/document`가 바이너리 본문을 `/worker/parse`로 보냄.
185
+ - 보안보내기 xlsx가 `/worker/render/xlsx`를 사용.
186
+ - UI 표면이 먹빛 밤 / 한지 낮 elevation 언어. 번들 ~103 KiB gzip.
187
+
188
+ ### Fixed
189
+ - command-search knowledge 그룹이 `matches`를 읽어 결과를 반환
190
+ (오라클은 `results`를 읽어 항상 비었음).
191
+ - 리뷰 스누즈 offset-aware datetime → 200, 잘못된 `until` → 422.
192
+ - 이중 거절 → 409 (형제 dismiss와 바이트 동일).
193
+ - Self-Model 쓰기 5경로가 은퇴 시임으로 전면 정지 — 네이티브 복구,
194
+ 녹화된 본문 9건 바이트 동일. `resolve_contradiction`이 빈 stamps로
195
+ "적용됨"을 주장하던 거짓말 포함.
196
+ - chat `ingest_generated` 스키마 400 (11.5.2에서도 깨져 있었음)과
197
+ vault-watch 미배선.
198
+ - chronicle `@today` 달력 결합, briefing/insights/garden/proactive/
199
+ health/quality 신선도 퓨즈. 시계 시임 + falsifier + 4시간대.
200
+
201
+ ### Known issues
202
+ - `open_keys`는 `pending`만 (Python은 snoozed도). 추출 refiner 없음.
203
+ `delete_node`는 `PART_OF`를 남김. owner 없는 리뷰 이벤트는 침묵.
204
+ KG-api ingest는 텍스트 전용. 리뷰 변이 = 스토어 사이클 2회.
205
+ snooze 422 detail은 영문 리터럴. 전문은
206
+ [RELEASE_NOTES_v11.7.0.md](../RELEASE_NOTES_v11.7.0.md).
207
+
7
208
  ## [11.6.0] - 2026-08-15 — One Door
8
209
 
9
210
  ### Added