ltcai 10.0.0 → 10.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 (214) hide show
  1. package/README.md +43 -32
  2. package/docs/CHANGELOG.md +204 -0
  3. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  4. package/docs/DEVELOPMENT.md +1 -1
  5. package/docs/HYBRID_CLOUD_KG_STREAMING.md +101 -0
  6. package/docs/MYPY_BACKLOG.md +98 -0
  7. package/docs/ONBOARDING.md +1 -1
  8. package/docs/OPERATIONS.md +1 -1
  9. package/docs/TRUST_MODEL.md +1 -1
  10. package/docs/WHY_LATTICE.md +1 -1
  11. package/docs/kg-schema.md +1 -1
  12. package/lattice_brain/__init__.py +1 -1
  13. package/lattice_brain/archive.py +5 -4
  14. package/lattice_brain/conversations.py +14 -3
  15. package/lattice_brain/embeddings.py +12 -2
  16. package/lattice_brain/graph/_kg_common.py +5 -5
  17. package/lattice_brain/graph/_kg_fsutil.py +5 -4
  18. package/lattice_brain/graph/discovery.py +4 -3
  19. package/lattice_brain/graph/discovery_index.py +0 -1
  20. package/lattice_brain/graph/documents.py +3 -2
  21. package/lattice_brain/graph/fusion.py +4 -0
  22. package/lattice_brain/graph/ingest.py +12 -2
  23. package/lattice_brain/graph/projection.py +3 -2
  24. package/lattice_brain/graph/provenance.py +5 -3
  25. package/lattice_brain/graph/rerank.py +4 -1
  26. package/lattice_brain/graph/retrieval.py +0 -1
  27. package/lattice_brain/graph/retrieval_docgen.py +0 -1
  28. package/lattice_brain/graph/retrieval_reads.py +0 -1
  29. package/lattice_brain/graph/retrieval_vector.py +0 -1
  30. package/lattice_brain/graph/schema.py +4 -3
  31. package/lattice_brain/graph/store.py +18 -4
  32. package/lattice_brain/graph/write_master.py +46 -1
  33. package/lattice_brain/ingestion.py +4 -1
  34. package/lattice_brain/portability.py +5 -2
  35. package/lattice_brain/quality.py +12 -5
  36. package/lattice_brain/quiet.py +43 -0
  37. package/lattice_brain/runtime/agent_runtime.py +19 -10
  38. package/lattice_brain/runtime/hooks.py +3 -2
  39. package/lattice_brain/runtime/multi_agent.py +2 -3
  40. package/lattice_brain/sensitivity.py +94 -0
  41. package/lattice_brain/storage/base.py +30 -2
  42. package/lattice_brain/storage/migration.py +3 -2
  43. package/lattice_brain/storage/postgres.py +2 -2
  44. package/lattice_brain/storage/sqlite.py +6 -4
  45. package/lattice_brain/workflow.py +4 -2
  46. package/latticeai/__init__.py +1 -1
  47. package/latticeai/api/admin.py +1 -1
  48. package/latticeai/api/agents.py +4 -2
  49. package/latticeai/api/auth.py +5 -1
  50. package/latticeai/api/automation_intelligence.py +2 -1
  51. package/latticeai/api/browser.py +3 -2
  52. package/latticeai/api/chat.py +28 -17
  53. package/latticeai/api/chat_agent_http.py +22 -8
  54. package/latticeai/api/chat_contracts.py +4 -0
  55. package/latticeai/api/chat_documents.py +6 -2
  56. package/latticeai/api/chat_hybrid.py +82 -0
  57. package/latticeai/api/computer_use.py +8 -3
  58. package/latticeai/api/knowledge_graph.py +1 -1
  59. package/latticeai/api/mcp.py +4 -4
  60. package/latticeai/api/models.py +5 -2
  61. package/latticeai/api/network_boundary.py +220 -0
  62. package/latticeai/api/permissions.py +0 -1
  63. package/latticeai/api/realtime.py +1 -1
  64. package/latticeai/api/security_dashboard.py +1 -1
  65. package/latticeai/api/setup.py +16 -3
  66. package/latticeai/api/static_routes.py +2 -1
  67. package/latticeai/api/tools.py +12 -8
  68. package/latticeai/api/voice_capture.py +3 -1
  69. package/latticeai/api/workflow_designer.py +1 -1
  70. package/latticeai/api/workspace.py +1 -2
  71. package/latticeai/app_factory.py +174 -145
  72. package/latticeai/cli/entrypoint.py +6 -4
  73. package/latticeai/core/agent.py +55 -495
  74. package/latticeai/core/agent_eval.py +2 -2
  75. package/latticeai/core/agent_helpers.py +493 -0
  76. package/latticeai/core/agent_prompts.py +0 -1
  77. package/latticeai/core/agent_registry.py +3 -1
  78. package/latticeai/core/agent_state.py +41 -0
  79. package/latticeai/core/audit.py +1 -1
  80. package/latticeai/core/builtin_hooks.py +2 -1
  81. package/latticeai/core/config.py +0 -1
  82. package/latticeai/core/embedding_providers.py +12 -1
  83. package/latticeai/core/file_generation.py +3 -0
  84. package/latticeai/core/invitations.py +4 -1
  85. package/latticeai/core/io_utils.py +3 -1
  86. package/latticeai/core/legacy_compatibility.py +1 -2
  87. package/latticeai/core/local_embeddings.py +12 -1
  88. package/latticeai/core/marketplace.py +1 -2
  89. package/latticeai/core/mcp_registry.py +0 -1
  90. package/latticeai/core/model_compat.py +1 -1
  91. package/latticeai/core/model_resolution.py +1 -1
  92. package/latticeai/core/network_boundary.py +168 -0
  93. package/latticeai/core/oidc.py +3 -0
  94. package/latticeai/core/permission_mode.py +6 -6
  95. package/latticeai/core/plugins.py +3 -2
  96. package/latticeai/core/policy.py +0 -1
  97. package/latticeai/core/quiet.py +84 -0
  98. package/latticeai/core/realtime.py +3 -2
  99. package/latticeai/core/run_store.py +4 -2
  100. package/latticeai/core/security.py +4 -0
  101. package/latticeai/core/users.py +5 -3
  102. package/latticeai/core/workspace_graph_trace.py +3 -0
  103. package/latticeai/core/workspace_os.py +65 -273
  104. package/latticeai/core/workspace_os_constants.py +126 -0
  105. package/latticeai/core/workspace_os_state.py +180 -0
  106. package/latticeai/core/workspace_os_utils.py +3 -1
  107. package/latticeai/core/workspace_permissions.py +1 -0
  108. package/latticeai/core/workspace_snapshots.py +3 -1
  109. package/latticeai/core/workspace_timeline.py +3 -1
  110. package/latticeai/integrations/telegram_bot.py +25 -16
  111. package/latticeai/models/router.py +6 -3
  112. package/latticeai/runtime/access_runtime.py +3 -1
  113. package/latticeai/runtime/audit_runtime.py +3 -2
  114. package/latticeai/runtime/chat_wiring.py +4 -1
  115. package/latticeai/runtime/history_runtime.py +1 -1
  116. package/latticeai/runtime/history_writer.py +138 -0
  117. package/latticeai/runtime/lifespan_runtime.py +3 -1
  118. package/latticeai/runtime/network_boundary_wiring.py +124 -0
  119. package/latticeai/runtime/persistence_runtime.py +3 -1
  120. package/latticeai/runtime/router_registration.py +11 -1
  121. package/latticeai/services/architecture_readiness.py +1 -2
  122. package/latticeai/services/change_proposals.py +2 -1
  123. package/latticeai/services/cloud_egress_audit.py +85 -0
  124. package/latticeai/services/cloud_extraction.py +129 -0
  125. package/latticeai/services/cloud_streaming.py +266 -0
  126. package/latticeai/services/cloud_token_guard.py +84 -0
  127. package/latticeai/services/command_center.py +2 -1
  128. package/latticeai/services/folder_watch.py +3 -0
  129. package/latticeai/services/funnel_metrics.py +3 -1
  130. package/latticeai/services/hybrid_chat.py +265 -0
  131. package/latticeai/services/hybrid_context.py +228 -0
  132. package/latticeai/services/hybrid_policy.py +178 -0
  133. package/latticeai/services/memory_service.py +1 -1
  134. package/latticeai/services/model_catalog.py +10 -1
  135. package/latticeai/services/model_engines.py +35 -14
  136. package/latticeai/services/model_loading.py +3 -2
  137. package/latticeai/services/model_runtime.py +68 -17
  138. package/latticeai/services/multimodal_streaming.py +123 -0
  139. package/latticeai/services/network_boundary_service.py +154 -0
  140. package/latticeai/services/openai_compatible_adapter.py +100 -0
  141. package/latticeai/services/p_reinforce.py +4 -0
  142. package/latticeai/services/platform_runtime.py +9 -4
  143. package/latticeai/services/process_audit.py +0 -1
  144. package/latticeai/services/product_readiness.py +1 -1
  145. package/latticeai/services/run_executor.py +3 -2
  146. package/latticeai/services/search_service.py +1 -4
  147. package/latticeai/services/setup_detection.py +2 -1
  148. package/latticeai/services/tool_dispatch.py +7 -2
  149. package/latticeai/services/upload_service.py +2 -1
  150. package/latticeai/setup/auto_setup.py +10 -7
  151. package/latticeai/setup/wizard.py +15 -11
  152. package/latticeai/tools/__init__.py +3 -3
  153. package/latticeai/tools/commands.py +7 -7
  154. package/latticeai/tools/computer.py +3 -2
  155. package/latticeai/tools/documents.py +10 -9
  156. package/latticeai/tools/filesystem.py +7 -4
  157. package/latticeai/tools/knowledge.py +2 -0
  158. package/latticeai/tools/local_files.py +1 -1
  159. package/latticeai/tools/network.py +2 -1
  160. package/package.json +7 -3
  161. package/scripts/bench_agent_smoke.py +0 -1
  162. package/scripts/bench_models.py +0 -1
  163. package/scripts/brain_quality_eval.py +7 -2
  164. package/scripts/bump_version.py +2 -1
  165. package/scripts/check_current_release_docs.mjs +1 -1
  166. package/scripts/migrate_brain_storage.py +5 -1
  167. package/scripts/profile_kg.py +2 -7
  168. package/scripts/verify_hf_model_registry.py +2 -2
  169. package/src-tauri/Cargo.lock +1 -1
  170. package/src-tauri/Cargo.toml +1 -1
  171. package/src-tauri/tauri.conf.json +1 -1
  172. package/static/app/asset-manifest.json +37 -37
  173. package/static/app/assets/{Act-BtCREeN1.js → Act-DrKIGZeJ.js} +1 -1
  174. package/static/app/assets/{AdminConsole-TPeeN18T.js → AdminConsole-CEV1VefA.js} +1 -1
  175. package/static/app/assets/{Brain-BKs6JAp0.js → Brain-BZSXnwWU.js} +1 -1
  176. package/static/app/assets/{BrainHome-BPGOvSd6.js → BrainHome-CEBd86k6.js} +1 -1
  177. package/static/app/assets/{BrainSignals-CtzQZ15J.js → BrainSignals-O4s6R7av.js} +1 -1
  178. package/static/app/assets/{Capture-1_NaHWqB.js → Capture-AGbOxsg-.js} +1 -1
  179. package/static/app/assets/{CommandPalette-pqvQOXe4.js → CommandPalette-CeqBjCn2.js} +1 -1
  180. package/static/app/assets/Library-CXnbNiQW.js +1 -0
  181. package/static/app/assets/{LivingBrain-DlQ20Q75.js → LivingBrain-D9Iei2ZJ.js} +1 -1
  182. package/static/app/assets/{ProductFlow-BZvGDRi_.js → ProductFlow-JlXiDfMM.js} +1 -1
  183. package/static/app/assets/{ReviewCard-BWgI0D2s.js → ReviewCard-QQly2bTV.js} +1 -1
  184. package/static/app/assets/System-Bp9ZY4ER.js +1 -0
  185. package/static/app/assets/{activity-Dlfk8YC7.js → activity-CxRPOQ2F.js} +1 -1
  186. package/static/app/assets/{bot-CDvUB76P.js → bot-1bcsWB2s.js} +1 -1
  187. package/static/app/assets/{brain-xczrohrt.js → brain-CxaeKCRM.js} +1 -1
  188. package/static/app/assets/{button-SOdH3Oyf.js → button-ZYFqGan7.js} +1 -1
  189. package/static/app/assets/{circle-pause-CG1ythH4.js → circle-pause-B5NOIqvk.js} +1 -1
  190. package/static/app/assets/{circle-play-HXwvjS6W.js → circle-play-BiJVFXf7.js} +1 -1
  191. package/static/app/assets/{cpu-B0d-rGyk.js → cpu-Vvq0OKTr.js} +1 -1
  192. package/static/app/assets/{download-BGIkTQL6.js → download-SEcXzkx1.js} +1 -1
  193. package/static/app/assets/{folder-open-Dst_Z0_K.js → folder-open-Dw1ff_Qa.js} +1 -1
  194. package/static/app/assets/{hard-drive-D53MsWkV.js → hard-drive-B00fR7_r.js} +1 -1
  195. package/static/app/assets/index-CEkL4_M-.css +2 -0
  196. package/static/app/assets/{index-C_IrlQMV.js → index-Dm9VXl1o.js} +3 -3
  197. package/static/app/assets/{input-C5m0riF6.js → input-DtdWYQEa.js} +1 -1
  198. package/static/app/assets/{network-C5a-E5iS.js → network-CpjBu0kI.js} +1 -1
  199. package/static/app/assets/{primitives-vNXYf58F.js → primitives-CwsudBwc.js} +1 -1
  200. package/static/app/assets/search-CwEJWBEA.js +1 -0
  201. package/static/app/assets/{shield-alert-Cc-WVXqN.js → shield-alert-CpjBc-gQ.js} +1 -1
  202. package/static/app/assets/{textarea-BkZ0EqVO.js → textarea-DUPyjHQs.js} +1 -1
  203. package/static/app/assets/{useFocusTrap-CTtKbAOU.js → useFocusTrap-BWcMtCWH.js} +1 -1
  204. package/static/app/assets/{useQuery-Dx1fi4Wu.js → useQuery-Dg5fPqTS.js} +1 -1
  205. package/static/app/assets/{users-BFpQXtEF.js → users-BgcdTQGM.js} +1 -1
  206. package/static/app/assets/{utils-BA_lmW3J.js → utils-a3YXFtEO.js} +2 -2
  207. package/static/app/assets/workspace-BMUEiXUm.js +1 -0
  208. package/static/app/index.html +4 -4
  209. package/static/sw.js +1 -1
  210. package/static/app/assets/Library-DhvoPvC7.js +0 -1
  211. package/static/app/assets/System-CSMdYLMy.js +0 -1
  212. package/static/app/assets/index-FxDusbr0.css +0 -2
  213. package/static/app/assets/search-DhbSgW6m.js +0 -1
  214. package/static/app/assets/workspace-DBPB0jkX.js +0 -1
package/README.md CHANGED
@@ -11,7 +11,7 @@
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
- ![v10.0.0 Living Brain walkthrough](output/release/v10.0.0/gifs/v10.0.0-living-brain-walkthrough.gif)
14
+ ![v10.3.0 Living Brain walkthrough](output/release/v10.3.0/gifs/v10.3.0-living-brain-walkthrough.gif)
15
15
 
16
16
  Chat, files, folders, notes, and web pages all flow into one durable knowledge
17
17
  graph on your computer. Any model — local MLX or cloud — can speak with that
@@ -24,9 +24,9 @@ memory. Nothing leaves your machine without explicit consent.
24
24
 
25
25
  | | |
26
26
  | --- | --- |
27
- | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v10.0.0/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v10.0.0/screenshots/05-memory-graph.png) |
28
- | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v10.0.0/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v10.0.0/screenshots/12-review-center.png) |
29
- | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v10.0.0/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v10.0.0/screenshots/10-admin-console.png) |
27
+ | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v10.3.0/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v10.3.0/screenshots/05-memory-graph.png) |
28
+ | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v10.3.0/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v10.3.0/screenshots/12-review-center.png) |
29
+ | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v10.3.0/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v10.3.0/screenshots/10-admin-console.png) |
30
30
 
31
31
  ## Why Lattice AI
32
32
 
@@ -57,41 +57,47 @@ First-run flow — wake the Brain, pick the owner, load a recommended model:
57
57
 
58
58
  | | | |
59
59
  | --- | --- | --- |
60
- | ![Login](output/release/v10.0.0/screenshots/01-login.png) | ![Model install](output/release/v10.0.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v10.0.0/screenshots/07-model-library.png) |
60
+ | ![Login](output/release/v10.3.0/screenshots/01-login.png) | ![Model install](output/release/v10.3.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v10.3.0/screenshots/07-model-library.png) |
61
61
 
62
62
  Screenshot index and capture notes:
63
- [output/release/v10.0.0/SCREENSHOT_INDEX.md](output/release/v10.0.0/SCREENSHOT_INDEX.md)
63
+ [output/release/v10.3.0/SCREENSHOT_INDEX.md](output/release/v10.3.0/SCREENSHOT_INDEX.md)
64
64
 
65
65
  ## Current Release
66
66
 
67
- The current release is **10.0.0 — Plain Language**:
68
-
69
- - **The first screen is four things.** Your Brain, one input box, the autonomy
70
- dial, and the capture controls file, folder, note, web now sit inside the
71
- composer instead of a separate panel. The knowledge graph opens by clicking
72
- the Brain, so the home shows no diagram at all.
73
- - **Korean and English, everywhere.** A language switch sits in the top bar on
74
- every screen, and the interface is fully translated in both directions:
75
- memory tiers, agent roles, automation recipes, entity types, and every
76
- backend payload label read in the language you picked.
77
- - **Numbers say what they counted.** "출처 반영률 12%" is now "출처가 남은
78
- 기억 · 35 / 291개" with the sentence that explains it. Model names read
79
- "Gemma 4 26B A4B Instruct", never `mlx-community/gemma-4-26b-a4b-it-4bit`.
80
- - **Defects found by using it with a model loaded.** The conversation header
81
- Brain rendered at 311px and covered 46% of the viewport; the sticky composer
82
- hid the end of every answer; a nested payload printed its field names where
83
- its values belonged; the folder button never opened a picker in a browser.
84
- All fixed, each with a test.
67
+ The current release is **10.3.0 — Measured Ground**:
68
+
69
+ 10.2.0 answered a code review. 10.3.0 is about knowing where things actually
70
+ stand: several numbers this project reported about itself turned out to be
71
+ wrong, and those corrections matter more than the features around them.
72
+
73
+ - **Frontend coverage was never really measured.** Vitest only reports files a
74
+ test already imports, so every untested module quietly left the denominator
75
+ and the tool read 54%. With `all: true` the honest figure is **28.5%** — and
76
+ 208 tests now cover pages that had none, including every settings and memory
77
+ screen.
78
+ - **Python coverage was reported as 80%. It is 71.6%.** The `omit` pattern did
79
+ not match the paths coverage records, so the suite was counting itself — and
80
+ test files run start to finish by construction.
81
+ - **mypy went from 13 modules to 193 of 270**, finding three real defects on
82
+ the way: a log line inside an error handler referenced an attribute that does
83
+ not exist (turning a recoverable failure into a crash), an annotation used a
84
+ name that was never imported, and one call could dereference `None`.
85
+ - **The chat-turn writer left the composition root.** 66 lines that decide what
86
+ a message looks like after redaction, and what the audit log records about
87
+ it, are now a module with 14 tests instead of a closure nothing could reach.
88
+ - **What is not measured is written down.** `docs/MYPY_BACKLOG.md` lists the 77
89
+ modules still outside type checking with their error counts, so the boundary
90
+ is a fact rather than an intention.
85
91
 
86
92
  Release notes: [RELEASE.md](RELEASE.md) · Full history: [docs/CHANGELOG.md](docs/CHANGELOG.md)
87
93
 
88
- Expected artifacts for 10.0.0 release must use exact filenames:
94
+ Expected artifacts for 10.3.0 release must use exact filenames:
89
95
 
90
- - `dist/ltcai-10.0.0-py3-none-any.whl`
91
- - `dist/ltcai-10.0.0.tar.gz`
92
- - `ltcai-10.0.0.tgz`
93
- - `dist/ltcai-10.0.0.vsix`
94
- - `src-tauri/target/release/bundle/dmg/Lattice AI_10.0.0_aarch64.dmg`
96
+ - `dist/ltcai-10.3.0-py3-none-any.whl`
97
+ - `dist/ltcai-10.3.0.tar.gz`
98
+ - `ltcai-10.3.0.tgz`
99
+ - `dist/ltcai-10.3.0.vsix`
100
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_10.3.0_aarch64.dmg`
95
101
 
96
102
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
97
103
 
@@ -111,7 +117,7 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
111
117
 
112
118
  - External package registries are owner-published and can lag behind GitHub.
113
119
  - PostgreSQL/pgvector is optional scale/migration tooling. SQLite remains the
114
- live local Brain store in 10.0.0.
120
+ live local Brain store in 10.3.0.
115
121
  - Docker, model downloads, cloud model calls, Telegram, Brain Network, and
116
122
  update checks require explicit user action.
117
123
  - Conversation does not fabricate answers when no model is loaded. Agent and
@@ -120,12 +126,17 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
120
126
  model success.
121
127
  - Some backend-generated messages (for example the Postgres DSN notice) are
122
128
  produced server-side in English and are shown as-is; server-side i18n is not
123
- part of 10.0.0.
129
+ part of 10.3.0.
124
130
 
125
131
  ## Release History
126
132
 
127
133
  | Version | Theme |
128
134
  | --- | --- |
135
+ | 10.3.0 | Measured Ground |
136
+ | 10.2.0 | Load-Bearing Fixes |
137
+ | 10.1.1 | Reachable Boundary |
138
+ | 10.1.0 | Hybrid Brain |
139
+ | 10.0.1 | One Source of Truth |
129
140
  | 10.0.0 | Plain Language |
130
141
  | 9.9.9 | Lean Shell |
131
142
  | 9.9.8 | Autonomy Dial |
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,210 @@ 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
+ ## [10.3.0] - 2026-07-29
8
+
9
+ ### Fixed
10
+ - **Frontend coverage was not being measured.** Vitest reports only files a
11
+ test imports unless `all: true`; untested modules left the denominator
12
+ instead of counting against it. Reported 54%, actual **28.5%**.
13
+ - **Python coverage was over-reported.** `omit = ["*/tests/*"]` does not match
14
+ the repo-relative `tests/...` paths coverage records, so the suite counted
15
+ itself. Reported 80%, actual **71.6%**.
16
+ - `lattice_brain/runtime/hooks.py` referenced `self._path` (does not exist)
17
+ inside the handler for an unreadable registry, turning a recoverable failure
18
+ into `AttributeError`.
19
+ - `lattice_brain/graph/_kg_fsutil.py` used `Iterable` in an annotation without
20
+ importing it.
21
+ - `lattice_brain/runtime/agent_runtime.py` could call `.get` on `None`.
22
+ - `pages/Library.tsx` printed the raw registry coordinate
23
+ (`mlx-community/gemma-4-…`) when a catalog entry had no display name; it now
24
+ falls through `humanizeModelId` like every other model surface.
25
+
26
+ ### Added
27
+ - `latticeai/runtime/history_writer.py` — `save_to_history` extracted from the
28
+ `app_factory._build` closure with its ordering contract documented, plus 14
29
+ tests (`tests/unit/test_history_writer.py`).
30
+ - `frontend/src/test/renderPage.tsx` — a page-level harness that stubs the
31
+ whole `latticeApi` surface, making error states, empty states and both
32
+ languages reachable in unit tests.
33
+ - First unit tests for every page: `System` (11), `Library` (7), `Capture` (6),
34
+ `Act` (8), `Brain` (8). Frontend suite 154 → 208 tests.
35
+ - Python tests for boundaries that had none: Telegram allowlist (26),
36
+ `run_command` containment (34), audit log and sensitivity report (22),
37
+ model-load consent gates (14), connection lifecycle guards. 1,786 → 1,896.
38
+ - `docs/MYPY_BACKLOG.md` — the 77 modules still outside type checking with
39
+ per-module error counts, smallest first.
40
+ - ARCHITECTURE.md "Verification Surface" diagram: which figures gate CI and
41
+ which are only reported.
42
+
43
+ ### Changed
44
+ - mypy adopted set: 13 → **193 of 270** modules.
45
+ - `vitest.config.ts` gains a coverage block with `all: true`.
46
+ - `npm run test:frontend:coverage` added.
47
+
48
+ ### Known
49
+ - `app_factory._build` remains ~1,300 lines; only the history writer was
50
+ extracted this release.
51
+ - Frontend coverage (28.5%) is reported but not gated — flooring it at today's
52
+ figure would freeze it there.
53
+ - 77 modules remain outside mypy; see the backlog.
54
+
55
+ ## [10.2.0] - 2026-07-29
56
+
57
+ Response to a full code review of 10.1.1 (71/100). All twelve findings.
58
+
59
+ ### Fixed
60
+ - **SQLite connections were committed but never closed** at 70+ sites.
61
+ `sqlite3.Connection.__exit__` commits or rolls back and leaves the connection
62
+ open; `KnowledgeGraphStore._connect`, `ConversationStore._connect`,
63
+ `WorkspaceOSStore._connect_state_db`, both storage engines, `portability`,
64
+ `archive`, `migration` and `users` all relied on it. Refcounting hid the leak
65
+ until something held a frame alive (profiler, logged traceback, coverage
66
+ tracer), at which point the process hit `EMFILE`. Added
67
+ `StorageEngine.session()` and made the store helpers closing context
68
+ managers; `tests/unit/test_connection_lifecycle.py` asserts it.
69
+ - **The cloud sensitivity guard could not fire.** `HARD_BLOCK_NODE_TYPES` was
70
+ an empty set and nothing in the product could set the metadata flags
71
+ `is_node_blocked_for_cloud` matches on, so "sensitive memories are never
72
+ sent" was unfalsifiable. Populated the type list, added
73
+ `lattice_brain/sensitivity.py` (path rules, stamped at ingestion), added
74
+ `KnowledgeGraphStore.set_node_sensitivity` and
75
+ `POST /api/network-boundary/node-sensitivity`, and a per-memory hold-back
76
+ control in the boundary panel.
77
+ - **Outbound cloud text was not redacted.** `redact_secret_text` ran on logs,
78
+ audit records and API previews but not on the payload that actually leaves.
79
+ - **Vector similarity truncated silently on a dimension mismatch**, producing a
80
+ plausible but meaningless score. Now raises with both dimensions named.
81
+ - **`tempfile.mktemp()` (TOCTOU race) in the Telegram bridge** replaced with
82
+ `mkstemp` at two sites.
83
+ - **Three closures captured loop variables by reference** (`chat_agent_http`,
84
+ `computer_use`, `model_runtime`). Safe today because each is invoked within
85
+ its iteration; bound explicitly so deferring the call cannot break them.
86
+ - **The cloud turn ran retrieval twice**, discarding the first result except
87
+ for its quality dict.
88
+
89
+ ### Added
90
+ - `latticeai/services/cloud_egress_audit.py` — every cloud send and every
91
+ refusal writes an audit entry *before* the provider call, naming node ids,
92
+ count, token estimate, provider and mode. Shape, never content.
93
+ - `latticeai/core/quiet.py` + `lattice_brain/quiet.py` — `quiet()` keeps the
94
+ behaviour of `except: pass` and records the exception with its file,
95
+ function and line at DEBUG. 112 handlers converted; `except: pass` is now a
96
+ lint error (S110/S112).
97
+ - Coverage measurement: `pytest-cov` in the `dev` extra, `[tool.coverage]`
98
+ config, a **70% floor** in CI. Measured **71%** — the first known figure.
99
+ - `tests/unit/test_cloud_egress_guard.py` — end-to-end proof that a flagged
100
+ memory never reaches the payload, that retrieval still carries `metadata`
101
+ (whose loss would silently disable the filter), and that egress is audited.
102
+ - mypy over 13 trust-critical modules (`npm run typecheck:python`), wired into
103
+ `npm run lint:python`.
104
+ - CI matrix: macOS runner (the platform the `.dmg` ships for, previously
105
+ untested) and Python 3.14 (the version this is developed on).
106
+
107
+ ### Changed
108
+ - ruff widened from pyflakes-only to `E4,E7,E9,F,B,S,I,SIM,RET,C901`. Every
109
+ remaining finding is either fixed or carries a written reason; complexity
110
+ ceiling set to 30 with named exemptions.
111
+ - `latticeai/core/workspace_os.py` 1354 → 1130 lines; vocabulary moved to
112
+ `workspace_os_constants.py` and state/migration to `workspace_os_state.py`,
113
+ with delegating methods so the public surface is unchanged.
114
+ - Package classifiers now advertise Python 3.13 and 3.14, matching what CI tests.
115
+
116
+ ### Known
117
+ - `app_factory._build` remains one 1,343-line function. Its sections share ~34
118
+ local bindings, so decomposition requires a runtime-context object rather
119
+ than a mechanical extraction; deferred rather than rushed, and named in the
120
+ C901 exemptions so the choice is visible.
121
+
122
+ ## [10.1.1] - 2026-07-28
123
+
124
+ ### Added
125
+ - `NetworkBoundaryPanel` (`frontend/src/components/NetworkBoundaryPanel.tsx`),
126
+ mounted in the System settings tab beside `PermissionModePanel`. Renders the
127
+ server's mode catalog, gates `cloud_allowed` behind the acknowledgement the
128
+ server requires, and exposes the hybrid write-back policy switches only while
129
+ the boundary permits cloud.
130
+ - Context preview in that panel: a question is sent to
131
+ `POST /api/network-boundary/preview` and the panel lists the actual node
132
+ titles that would leave, the token estimate, and the token guard's verdict.
133
+ Available in `local_only` too, labelled as hypothetical.
134
+ - API client bindings and types: `networkBoundary`, `setNetworkBoundary`,
135
+ `setHybridPolicy`, `previewCloudContext`; `NetworkBoundaryOption`,
136
+ `NetworkBoundaryState`, `HybridPolicy`, `CloudContextPreview`,
137
+ `CloudTokenBudget`. The `networkBoundary` fallback is `local_only`, so a
138
+ failed read never renders as if cloud were already permitted.
139
+ - 22 `system.network.*` copy keys in the `workspace` i18n namespace (ko + en).
140
+ - `/api/network-boundary*` routes in `tests/visual/mock_server.cjs` so release
141
+ evidence shows the panel working rather than an unavailable state.
142
+ - `NetworkBoundaryPanel.test.tsx` (12 tests) and two Playwright specs covering
143
+ the settings-tab route, the acknowledgement gate, and the preview.
144
+
145
+ ### Removed
146
+ - `static/app/network-boundary-panel.js` — the unmounted standalone module
147
+ 10.1.0 shipped as this feature's UI. Nothing referenced it, it was absent
148
+ from the asset manifest, and it lived in Vite's output directory, which
149
+ `npm run build:assets` wipes; it had in fact already been deleted by the
150
+ previous release's asset rebuild. The React panel replaces it.
151
+
152
+ ### Changed
153
+ - ARCHITECTURE, FEATURE_STATUS, README, and the hybrid design doc no longer
154
+ carry the "API-only surface" caveat, and describe the in-app control instead.
155
+
156
+ ## [10.1.0] - 2026-07-28
157
+
158
+ ### Added
159
+ - Local-first hybrid path: the Knowledge Graph stays on-device and cloud LLMs
160
+ are an opt-in worker. `NetworkBoundaryMode` and `MinimalContext` contracts
161
+ (`latticeai/core/network_boundary.py`, `latticeai/api/network_boundary.py`)
162
+ with a persisted dial wired via `latticeai/runtime/network_boundary_wiring.py`.
163
+ - Cloud streaming worker: `latticeai/services/cloud_streaming.py`,
164
+ `cloud_extraction.py`, `cloud_token_guard.py`, and an OpenAI-compatible stream
165
+ adapter (`openai_compatible_adapter.py`) with token budgets and guardrails.
166
+ - Hybrid chat pipeline: `latticeai/api/chat_hybrid.py` plus
167
+ `services/hybrid_chat.py`, `hybrid_context.py`, and `hybrid_policy.py`; the
168
+ `/chat` route branches through it and writes back through the Review Queue.
169
+ - Multimodal streaming contracts (`services/multimodal_streaming.py`) and a
170
+ network-boundary control panel (`static/app/network-boundary-panel.js`).
171
+ - Tests: `test_network_boundary.py`, `test_hybrid_phase2.py`,
172
+ `test_hybrid_phase3.py`.
173
+
174
+ ### Notes
175
+ - Default network boundary is `local_only`; cloud requires explicit
176
+ acknowledgement. Minimal related nodes only leave the machine; streamed
177
+ answers expand the local Brain with provenance.
178
+
179
+ ## [10.0.1] - 2026-07-28
180
+
181
+ ### Changed
182
+ - `latticeai/core/agent.py` holds only the state machine (1769 → 1326 lines).
183
+ Its pure functions move to `latticeai/core/agent_helpers.py`: action parsing
184
+ (`extract_action`, `extract_action_details`), plan normalization
185
+ (`normalize_plan`), learning filters, transcript compaction, artifact and
186
+ requirement reporting, and the `TranscriptBudget` / `PhaseBudgets` dataclasses.
187
+ - `AgentState` and `AGENT_TERMINAL_STATES` move to a new
188
+ `latticeai/core/agent_state.py`. Both `agent.py` and `agent_helpers.py` import
189
+ from it, which is what lets the helpers reference the enum instead of a
190
+ literal state string.
191
+ - `latticeai.core.agent` re-exports every moved name as the same object and
192
+ declares the set in `__all__`. No caller changed: the HTTP layer, `run_store`,
193
+ `computer_use`, `bench_agent_smoke`, `bench_models`, and eight test modules
194
+ import exactly as before.
195
+ - The home's secondary control row is visually demoted (opacity, tighter gaps,
196
+ softer divider) and gets larger touch spacing under 640px. The sticky top bar
197
+ border is softened. CSS only.
198
+
199
+ ### Fixed
200
+ - `files_written` and `artifact_checklist` matched transcript steps against the
201
+ literal `"EXECUTING"` instead of `AgentState.EXECUTING.value`. A rename of the
202
+ enum value would have made both silently return empty results with no failing
203
+ test. Both now reference the enum.
204
+
205
+ ### Verification
206
+ - pytest 1747 passed / 11 skipped; `scripts/agent_eval.py` 23/23 (100%); ruff
207
+ clean across `latticeai/`, `lattice_brain/`, `scripts/`, `tests/`.
208
+ - All 18 extracted symbols were AST-compared against their originals before the
209
+ originals were removed.
210
+
7
211
  ## [10.0.0] - 2026-07-28
8
212
 
9
213
  ### Changed
@@ -1,6 +1,6 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **10.0.0 — Plain Language**.
3
+ Current release: **10.3.0 — Measured Ground**.
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: **10.0.0 — Plain Language**.
6
+ Current release: **10.3.0 — Measured Ground**.
7
7
 
8
8
  This document is for contributors working on the local-first Digital Brain
9
9
  codebase. Product positioning and quick start stay in `README.md`; release
@@ -0,0 +1,101 @@
1
+ # Hybrid Cloud + Local Knowledge Graph Streaming
2
+
3
+ > Status: **shipped in 10.1.0**; in-app control added in **10.1.1**
4
+ > Principle: **Local Brain is the asset. Cloud is an opt-in worker.**
5
+ > Surface: `환경설정 → 내 지식이 나가는 범위`
6
+ > (`frontend/src/components/NetworkBoundaryPanel.tsx`), plus
7
+ > `/api/network-boundary` and `LATTICEAI_NETWORK_MODE`.
8
+
9
+ ## Goal
10
+
11
+ Local Knowledge Graph stays on-device. Cloud LLMs (and optional multimodal) are opt-in workers. Minimal related nodes leave the machine; streamed answers expand the local Brain with provenance and review gates.
12
+
13
+ ## Phase summary
14
+
15
+ | Phase | Branch | Delivered |
16
+ |-------|--------|-----------|
17
+ | 0 | `feature/hybrid-cloud-kg-streaming` | Architecture + core contracts |
18
+ | 1 | `…-phase1` | Dial, OpenAI adapter, hybrid helpers, basic expansion |
19
+ | 2 | `…-phase2` | `/chat` branch, token guardrails, extraction, preview API |
20
+ | **3** | `…-phase3` | **Policy, Review Queue write path, multimodal contracts, UI panel module** |
21
+
22
+ ## Phase 3 details
23
+
24
+ ### Hybrid policy (`HybridPolicyService`)
25
+ Persisted dial for:
26
+ - `blocked_node_types` / `blocked_metadata_flags` (unioned with hard circuit breakers)
27
+ - `auto_commit` (default **false**)
28
+ - `allow_multimodal` (default **false**)
29
+ - `min_extraction_confidence`
30
+
31
+ API:
32
+ ```
33
+ GET /api/network-boundary/policy
34
+ POST /api/network-boundary/policy
35
+ { "auto_commit": false, "allow_multimodal": false, "blocked_node_types": ["Secret"] }
36
+ ```
37
+
38
+ ### Review Queue write path
39
+ `CloudResponseIngestor` now:
40
+ 1. Always enqueues a `change_proposal` review item when a ReviewQueueService is bound
41
+ 2. Only auto-writes to the graph when `plan.auto_commit` is true **and** a store write API exists
42
+
43
+ Users approve cloud-derived memory growth in the existing Review Center.
44
+
45
+ ### Multimodal / video
46
+ `latticeai/services/multimodal_streaming.py`:
47
+ - Same `NetworkBoundaryMode.CLOUD_ALLOWED` gate
48
+ - Additional `allow_multimodal` policy flag
49
+ - Adapter protocol for future Runway/Luma/Veo-compatible providers
50
+
51
+ ### UI
52
+ `NetworkBoundaryPanel` (React) + `GET /api/network-boundary/ui-state`:
53
+ - Toggle local ↔ cloud (with ack)
54
+ - Transparency preview of nodes about to be sent
55
+ - Shows current policy flags
56
+
57
+ Mounted in `frontend/src/pages/System.tsx` beside `PermissionModePanel`, so it
58
+ appears on the settings tab of every install. The standalone
59
+ `static/app/network-boundary-panel.js` module 10.1.0 shipped was removed in
60
+ 10.1.1: nothing mounted it, and it lived in Vite's build output directory,
61
+ which `npm run build:assets` wipes.
62
+
63
+ ## End-to-end flow (Phase 3)
64
+
65
+ ```
66
+ User toggles cloud_allowed (UI panel or API)
67
+ → optional policy: auto_commit / multimodal / sensitivity
68
+ User sends chat message
69
+ → /chat resolves mode
70
+ → if cloud_allowed: minimal KG context + token budget check
71
+ → cloud stream (SSE)
72
+ → rich extraction (Decision/Task/Concept)
73
+ → Review Queue item (change_proposal)
74
+ → optional auto-commit when policy allows
75
+ ```
76
+
77
+ ## Configuration
78
+
79
+ ```bash
80
+ export LATTICEAI_CLOUD_API_KEY=sk-...
81
+ export LATTICEAI_CLOUD_MODEL=gpt-4o-mini
82
+ export LATTICEAI_NETWORK_MODE=local_only
83
+ export LATTICEAI_CLOUD_MAX_TOKENS_PER_TURN=2500
84
+ export LATTICEAI_CLOUD_MAX_TOKENS_PER_SESSION=50000
85
+ ```
86
+
87
+ ## Privacy (unchanged core rules)
88
+
89
+ 1. Default `local_only`
90
+ 2. Cloud requires explicit ack
91
+ 3. Only minimal compact context leaves the host
92
+ 4. Hard + user sensitivity filters
93
+ 5. Cloud-derived nodes go through Review Queue unless user opts into auto_commit
94
+ 6. Multimodal is off unless policy explicitly enables it
95
+
96
+ ## Success criteria (Phase 3)
97
+
98
+ - User can configure sensitivity and auto-commit without code changes
99
+ - Cloud KG growth appears in Review Center as actionable proposals
100
+ - Multimodal path cannot fire without both cloud mode and policy flag
101
+ - UI panel works without rebuilding the main React bundle
@@ -0,0 +1,98 @@
1
+ # mypy backlog
2
+
3
+ `[tool.mypy] files` in `pyproject.toml` lists every module that type-checks
4
+ today — **193 of 270** as of 10.3.0, up from 13 in 10.2.0.
5
+ This file is the remainder, smallest first, so the boundary is a measured
6
+ fact rather than an open-ended intention.
7
+
8
+ Adding a module to the checked set is a decision to fix that module, not its
9
+ dependencies (`follow_imports = silent`). Work from the top: the short ones
10
+ are usually one missing annotation.
11
+
12
+ Three of these turned out to be real defects when 10.3.0 measured them:
13
+ `hooks.py` referenced a non-existent `self._path` inside the handler for an
14
+ unreadable registry, `_kg_fsutil.py` used `Iterable` without importing it,
15
+ and `agent_runtime.py` called `.get` on a value that could be `None`. Those
16
+ are fixed; the list below is what is left.
17
+
18
+ | errors | module | dominant codes |
19
+ | ---: | --- | --- |
20
+ | 1 | `lattice_brain/graph/_kg_fsutil.py` | `union-attr` ×1 |
21
+ | 1 | `latticeai/api/admin.py` | `call-overload` ×1 |
22
+ | 1 | `latticeai/api/computer_use.py` | `var-annotated` ×1 |
23
+ | 1 | `latticeai/api/hooks.py` | `unreachable` ×1 |
24
+ | 1 | `latticeai/api/local_files.py` | `arg-type` ×1 |
25
+ | 1 | `latticeai/api/static_routes.py` | `assignment` ×1 |
26
+ | 1 | `latticeai/core/marketplace.py` | `arg-type` ×1 |
27
+ | 1 | `latticeai/core/model_compat.py` | `unreachable` ×1 |
28
+ | 1 | `latticeai/core/plugins.py` | `unreachable` ×1 |
29
+ | 1 | `latticeai/core/project_sessions.py` | `var-annotated` ×1 |
30
+ | 1 | `latticeai/core/workspace_os.py` | `unreachable` ×1 |
31
+ | 1 | `latticeai/core/workspace_os_state.py` | `arg-type` ×1 |
32
+ | 1 | `latticeai/runtime/sso_config_runtime.py` | `arg-type` ×1 |
33
+ | 1 | `latticeai/services/command_center.py` | `assignment` ×1 |
34
+ | 1 | `latticeai/services/search_service.py` | `assignment` ×1 |
35
+ | 1 | `latticeai/services/triggers.py` | `truthy-function` ×1 |
36
+ | 1 | `latticeai/setup/auto_setup.py` | `attr-defined` ×1 |
37
+ | 2 | `lattice_brain/ingestion.py` | `assignment` ×2 |
38
+ | 2 | `latticeai/api/chat_stream.py` | `var-annotated` ×1, `arg-type` ×1 |
39
+ | 2 | `latticeai/api/mcp.py` | `var-annotated` ×2 |
40
+ | 2 | `latticeai/core/mcp_registry.py` | `index` ×1, `return-value` ×1 |
41
+ | 2 | `latticeai/core/run_explain.py` | `union-attr` ×1, `call-overload` ×1 |
42
+ | 2 | `latticeai/core/workspace_snapshots.py` | `var-annotated` ×2 |
43
+ | 2 | `latticeai/runtime/review_wiring.py` | `call-arg` ×2 |
44
+ | 2 | `latticeai/services/brain_intelligence.py` | `operator` ×1, `index` ×1 |
45
+ | 2 | `latticeai/services/memory_service.py` | `misc` ×1, `index` ×1 |
46
+ | 2 | `latticeai/services/model_loading.py` | `arg-type` ×1, `call-overload` ×1 |
47
+ | 2 | `latticeai/services/multimodal_streaming.py` | `attr-defined` ×1, `arg-type` ×1 |
48
+ | 2 | `latticeai/setup/wizard.py` | `attr-defined` ×1, `dict-item` ×1 |
49
+ | 2 | `latticeai/tools/documents.py` | `arg-type` ×2 |
50
+ | 3 | `lattice_brain/quality.py` | `var-annotated` ×2, `return-value` ×1 |
51
+ | 3 | `latticeai/api/models.py` | `call-overload` ×2, `attr-defined` ×1 |
52
+ | 3 | `latticeai/cli/entrypoint.py` | `operator` ×1, `union-attr` ×1, `arg-type` ×1 |
53
+ | 3 | `latticeai/core/audit.py` | `assignment` ×1, `index` ×1, `operator` ×1 |
54
+ | 3 | `latticeai/integrations/telegram_bot.py` | `union-attr` ×2, `arg-type` ×1 |
55
+ | 3 | `latticeai/runtime/stages.py` | `arg-type` ×3 |
56
+ | 3 | `latticeai/services/cloud_streaming.py` | `arg-type` ×2, `attr-defined` ×1 |
57
+ | 3 | `latticeai/services/hybrid_chat.py` | `arg-type` ×3 |
58
+ | 3 | `latticeai/services/tool_dispatch.py` | `arg-type` ×3 |
59
+ | 4 | `lattice_brain/graph/_kg_common.py` | `misc` ×3, `return-value` ×1 |
60
+ | 4 | `latticeai/api/chat_agent_http.py` | `arg-type` ×2, `misc` ×1, `assignment` ×1 |
61
+ | 4 | `latticeai/api/chat_helpers.py` | `call-overload` ×2, `union-attr` ×1, `arg-type` ×1 |
62
+ | 4 | `latticeai/api/security_dashboard.py` | `assignment` ×3, `unreachable` ×1 |
63
+ | 4 | `latticeai/services/evidence_actions.py` | `union-attr` ×4 |
64
+ | 5 | `lattice_brain/context.py` | `arg-type` ×4, `misc` ×1 |
65
+ | 5 | `latticeai/api/permissions.py` | `arg-type` ×5 |
66
+ | 5 | `latticeai/services/model_engines.py` | `attr-defined` ×2, `call-overload` ×2, `unreachable` ×1 |
67
+ | 5 | `latticeai/services/run_executor.py` | `unreachable` ×3, `arg-type` ×1, `return-value` ×1 |
68
+ | 6 | `lattice_brain/runtime/contracts.py` | `union-attr` ×6 |
69
+ | 6 | `latticeai/core/agent.py` | `arg-type` ×4, `return-value` ×2 |
70
+ | 7 | `lattice_brain/graph/proactive.py` | `assignment` ×2, `arg-type` ×2, `index` ×1 |
71
+ | 7 | `latticeai/app_factory.py` | `arg-type` ×3, `assignment` ×2, `attr-defined` ×2 |
72
+ | 7 | `latticeai/core/embedding_providers.py` | `unreachable` ×2, `assignment` ×2, `union-attr` ×2 |
73
+ | 7 | `latticeai/services/openai_compatible_adapter.py` | `arg-type` ×7 |
74
+ | 8 | `lattice_brain/graph/curator.py` | `operator` ×8 |
75
+ | 8 | `lattice_brain/workflow.py` | `arg-type` ×5, `index` ×2, `assignment` ×1 |
76
+ | 8 | `latticeai/api/setup.py` | `index` ×5, `attr-defined` ×3 |
77
+ | 8 | `latticeai/services/local_knowledge.py` | `union-attr` ×3, `misc` ×2, `operator` ×2 |
78
+ | 10 | `latticeai/api/tools.py` | `arg-type` ×10 |
79
+ | 13 | `latticeai/api/search.py` | `return` ×12, `return-value` ×1 |
80
+ | 15 | `lattice_brain/graph/store.py` | `name-defined` ×15 |
81
+ | 16 | `latticeai/api/chat.py` | `arg-type` ×12, `misc` ×3, `call-overload` ×1 |
82
+ | 16 | `latticeai/tools/computer.py` | `union-attr` ×16 |
83
+ | 19 | `lattice_brain/graph/retrieval_docgen.py` | `name-defined` ×12, `attr-defined` ×7 |
84
+ | 35 | `latticeai/services/model_runtime.py` | `index` ×15, `arg-type` ×8, `attr-defined` ×6 |
85
+ | 45 | `lattice_brain/graph/retrieval_reads.py` | `name-defined` ×30, `attr-defined` ×15 |
86
+ | 46 | `latticeai/models/router.py` | `arg-type` ×26, `assignment` ×7, `attr-defined` ×4 |
87
+ | 57 | `lattice_brain/graph/write_master.py` | `name-defined` ×48, `attr-defined` ×9 |
88
+ | 64 | `lattice_brain/graph/documents.py` | `name-defined` ×45, `attr-defined` ×19 |
89
+ | 71 | `lattice_brain/graph/provenance.py` | `name-defined` ×59, `attr-defined` ×12 |
90
+ | 77 | `lattice_brain/graph/retrieval.py` | `name-defined` ×61, `attr-defined` ×16 |
91
+ | 79 | `lattice_brain/graph/discovery.py` | `name-defined` ×72, `attr-defined` ×7 |
92
+ | 107 | `lattice_brain/graph/retrieval_vector.py` | `name-defined` ×68, `attr-defined` ×39 |
93
+ | 108 | `latticeai/api/workspace.py` | `misc` ×105, `arg-type` ×2, `call-overload` ×1 |
94
+ | 127 | `lattice_brain/graph/discovery_index.py` | `name-defined` ×98, `attr-defined` ×29 |
95
+ | 143 | `lattice_brain/graph/projection.py` | `name-defined` ×122, `attr-defined` ×21 |
96
+ | 177 | `lattice_brain/graph/ingest.py` | `name-defined` ×122, `attr-defined` ×55 |
97
+
98
+ Total outstanding: **1407** errors across **77** modules.
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Onboarding
2
2
 
3
- Current release: **10.0.0 — Plain Language**.
3
+ Current release: **10.3.0 — Measured Ground**.
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 (v10.0.0)
1
+ # Lattice AI — Operations Guide (v10.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
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **10.0.0 — Plain Language**.
3
+ Current release: **10.3.0 — Measured Ground**.
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: **10.0.0 — Plain Language**.
3
+ Current release: **10.3.0 — Measured Ground**.
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: **10.0.0 — Plain Language**.
3
+ Current release: **10.3.0 — Measured Ground**.
4
4
 
5
5
  명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
6
6
  구현: `lattice_brain/graph/schema.py`
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "10.0.0"
29
+ __version__ = "10.3.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -16,17 +16,18 @@ import shutil
16
16
  import sqlite3
17
17
  import tempfile
18
18
  import zipfile
19
+ from contextlib import closing
19
20
  from dataclasses import dataclass
20
21
  from pathlib import Path, PurePosixPath
21
22
  from typing import Any, Dict, Iterable, List, Optional
22
23
 
24
+ from cryptography.exceptions import InvalidTag
23
25
  from cryptography.hazmat.primitives import hashes
24
26
  from cryptography.hazmat.primitives.ciphers.aead import AESGCM
25
- from cryptography.exceptions import InvalidTag
26
27
  from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
27
28
 
28
- from .utils import sha256_file as _sha256_file, utc_now_iso as _now
29
-
29
+ from .utils import sha256_file as _sha256_file
30
+ from .utils import utc_now_iso as _now
30
31
 
31
32
  ARCHIVE_FORMAT = "latticebrain.encrypted"
32
33
  ARCHIVE_VERSION = 2
@@ -106,7 +107,7 @@ def _checkpoint_sqlite(db_path: Path) -> None:
106
107
  if not db_path.exists():
107
108
  return
108
109
  try:
109
- with sqlite3.connect(str(db_path)) as conn:
110
+ with closing(sqlite3.connect(str(db_path))) as conn, conn:
110
111
  conn.execute("PRAGMA wal_checkpoint(FULL)")
111
112
  except sqlite3.Error:
112
113
  return