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.
- package/README.md +43 -32
- package/docs/CHANGELOG.md +204 -0
- package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
- package/docs/DEVELOPMENT.md +1 -1
- package/docs/HYBRID_CLOUD_KG_STREAMING.md +101 -0
- package/docs/MYPY_BACKLOG.md +98 -0
- package/docs/ONBOARDING.md +1 -1
- package/docs/OPERATIONS.md +1 -1
- package/docs/TRUST_MODEL.md +1 -1
- package/docs/WHY_LATTICE.md +1 -1
- package/docs/kg-schema.md +1 -1
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/archive.py +5 -4
- package/lattice_brain/conversations.py +14 -3
- package/lattice_brain/embeddings.py +12 -2
- package/lattice_brain/graph/_kg_common.py +5 -5
- package/lattice_brain/graph/_kg_fsutil.py +5 -4
- package/lattice_brain/graph/discovery.py +4 -3
- package/lattice_brain/graph/discovery_index.py +0 -1
- package/lattice_brain/graph/documents.py +3 -2
- package/lattice_brain/graph/fusion.py +4 -0
- package/lattice_brain/graph/ingest.py +12 -2
- package/lattice_brain/graph/projection.py +3 -2
- package/lattice_brain/graph/provenance.py +5 -3
- package/lattice_brain/graph/rerank.py +4 -1
- package/lattice_brain/graph/retrieval.py +0 -1
- package/lattice_brain/graph/retrieval_docgen.py +0 -1
- package/lattice_brain/graph/retrieval_reads.py +0 -1
- package/lattice_brain/graph/retrieval_vector.py +0 -1
- package/lattice_brain/graph/schema.py +4 -3
- package/lattice_brain/graph/store.py +18 -4
- package/lattice_brain/graph/write_master.py +46 -1
- package/lattice_brain/ingestion.py +4 -1
- package/lattice_brain/portability.py +5 -2
- package/lattice_brain/quality.py +12 -5
- package/lattice_brain/quiet.py +43 -0
- package/lattice_brain/runtime/agent_runtime.py +19 -10
- package/lattice_brain/runtime/hooks.py +3 -2
- package/lattice_brain/runtime/multi_agent.py +2 -3
- package/lattice_brain/sensitivity.py +94 -0
- package/lattice_brain/storage/base.py +30 -2
- package/lattice_brain/storage/migration.py +3 -2
- package/lattice_brain/storage/postgres.py +2 -2
- package/lattice_brain/storage/sqlite.py +6 -4
- package/lattice_brain/workflow.py +4 -2
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/admin.py +1 -1
- package/latticeai/api/agents.py +4 -2
- package/latticeai/api/auth.py +5 -1
- package/latticeai/api/automation_intelligence.py +2 -1
- package/latticeai/api/browser.py +3 -2
- package/latticeai/api/chat.py +28 -17
- package/latticeai/api/chat_agent_http.py +22 -8
- package/latticeai/api/chat_contracts.py +4 -0
- package/latticeai/api/chat_documents.py +6 -2
- package/latticeai/api/chat_hybrid.py +82 -0
- package/latticeai/api/computer_use.py +8 -3
- package/latticeai/api/knowledge_graph.py +1 -1
- package/latticeai/api/mcp.py +4 -4
- package/latticeai/api/models.py +5 -2
- package/latticeai/api/network_boundary.py +220 -0
- package/latticeai/api/permissions.py +0 -1
- package/latticeai/api/realtime.py +1 -1
- package/latticeai/api/security_dashboard.py +1 -1
- package/latticeai/api/setup.py +16 -3
- package/latticeai/api/static_routes.py +2 -1
- package/latticeai/api/tools.py +12 -8
- package/latticeai/api/voice_capture.py +3 -1
- package/latticeai/api/workflow_designer.py +1 -1
- package/latticeai/api/workspace.py +1 -2
- package/latticeai/app_factory.py +174 -145
- package/latticeai/cli/entrypoint.py +6 -4
- package/latticeai/core/agent.py +55 -495
- package/latticeai/core/agent_eval.py +2 -2
- package/latticeai/core/agent_helpers.py +493 -0
- package/latticeai/core/agent_prompts.py +0 -1
- package/latticeai/core/agent_registry.py +3 -1
- package/latticeai/core/agent_state.py +41 -0
- package/latticeai/core/audit.py +1 -1
- package/latticeai/core/builtin_hooks.py +2 -1
- package/latticeai/core/config.py +0 -1
- package/latticeai/core/embedding_providers.py +12 -1
- package/latticeai/core/file_generation.py +3 -0
- package/latticeai/core/invitations.py +4 -1
- package/latticeai/core/io_utils.py +3 -1
- package/latticeai/core/legacy_compatibility.py +1 -2
- package/latticeai/core/local_embeddings.py +12 -1
- package/latticeai/core/marketplace.py +1 -2
- package/latticeai/core/mcp_registry.py +0 -1
- package/latticeai/core/model_compat.py +1 -1
- package/latticeai/core/model_resolution.py +1 -1
- package/latticeai/core/network_boundary.py +168 -0
- package/latticeai/core/oidc.py +3 -0
- package/latticeai/core/permission_mode.py +6 -6
- package/latticeai/core/plugins.py +3 -2
- package/latticeai/core/policy.py +0 -1
- package/latticeai/core/quiet.py +84 -0
- package/latticeai/core/realtime.py +3 -2
- package/latticeai/core/run_store.py +4 -2
- package/latticeai/core/security.py +4 -0
- package/latticeai/core/users.py +5 -3
- package/latticeai/core/workspace_graph_trace.py +3 -0
- package/latticeai/core/workspace_os.py +65 -273
- package/latticeai/core/workspace_os_constants.py +126 -0
- package/latticeai/core/workspace_os_state.py +180 -0
- package/latticeai/core/workspace_os_utils.py +3 -1
- package/latticeai/core/workspace_permissions.py +1 -0
- package/latticeai/core/workspace_snapshots.py +3 -1
- package/latticeai/core/workspace_timeline.py +3 -1
- package/latticeai/integrations/telegram_bot.py +25 -16
- package/latticeai/models/router.py +6 -3
- package/latticeai/runtime/access_runtime.py +3 -1
- package/latticeai/runtime/audit_runtime.py +3 -2
- package/latticeai/runtime/chat_wiring.py +4 -1
- package/latticeai/runtime/history_runtime.py +1 -1
- package/latticeai/runtime/history_writer.py +138 -0
- package/latticeai/runtime/lifespan_runtime.py +3 -1
- package/latticeai/runtime/network_boundary_wiring.py +124 -0
- package/latticeai/runtime/persistence_runtime.py +3 -1
- package/latticeai/runtime/router_registration.py +11 -1
- package/latticeai/services/architecture_readiness.py +1 -2
- package/latticeai/services/change_proposals.py +2 -1
- package/latticeai/services/cloud_egress_audit.py +85 -0
- package/latticeai/services/cloud_extraction.py +129 -0
- package/latticeai/services/cloud_streaming.py +266 -0
- package/latticeai/services/cloud_token_guard.py +84 -0
- package/latticeai/services/command_center.py +2 -1
- package/latticeai/services/folder_watch.py +3 -0
- package/latticeai/services/funnel_metrics.py +3 -1
- package/latticeai/services/hybrid_chat.py +265 -0
- package/latticeai/services/hybrid_context.py +228 -0
- package/latticeai/services/hybrid_policy.py +178 -0
- package/latticeai/services/memory_service.py +1 -1
- package/latticeai/services/model_catalog.py +10 -1
- package/latticeai/services/model_engines.py +35 -14
- package/latticeai/services/model_loading.py +3 -2
- package/latticeai/services/model_runtime.py +68 -17
- package/latticeai/services/multimodal_streaming.py +123 -0
- package/latticeai/services/network_boundary_service.py +154 -0
- package/latticeai/services/openai_compatible_adapter.py +100 -0
- package/latticeai/services/p_reinforce.py +4 -0
- package/latticeai/services/platform_runtime.py +9 -4
- package/latticeai/services/process_audit.py +0 -1
- package/latticeai/services/product_readiness.py +1 -1
- package/latticeai/services/run_executor.py +3 -2
- package/latticeai/services/search_service.py +1 -4
- package/latticeai/services/setup_detection.py +2 -1
- package/latticeai/services/tool_dispatch.py +7 -2
- package/latticeai/services/upload_service.py +2 -1
- package/latticeai/setup/auto_setup.py +10 -7
- package/latticeai/setup/wizard.py +15 -11
- package/latticeai/tools/__init__.py +3 -3
- package/latticeai/tools/commands.py +7 -7
- package/latticeai/tools/computer.py +3 -2
- package/latticeai/tools/documents.py +10 -9
- package/latticeai/tools/filesystem.py +7 -4
- package/latticeai/tools/knowledge.py +2 -0
- package/latticeai/tools/local_files.py +1 -1
- package/latticeai/tools/network.py +2 -1
- package/package.json +7 -3
- package/scripts/bench_agent_smoke.py +0 -1
- package/scripts/bench_models.py +0 -1
- package/scripts/brain_quality_eval.py +7 -2
- package/scripts/bump_version.py +2 -1
- package/scripts/check_current_release_docs.mjs +1 -1
- package/scripts/migrate_brain_storage.py +5 -1
- package/scripts/profile_kg.py +2 -7
- package/scripts/verify_hf_model_registry.py +2 -2
- package/src-tauri/Cargo.lock +1 -1
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +37 -37
- package/static/app/assets/{Act-BtCREeN1.js → Act-DrKIGZeJ.js} +1 -1
- package/static/app/assets/{AdminConsole-TPeeN18T.js → AdminConsole-CEV1VefA.js} +1 -1
- package/static/app/assets/{Brain-BKs6JAp0.js → Brain-BZSXnwWU.js} +1 -1
- package/static/app/assets/{BrainHome-BPGOvSd6.js → BrainHome-CEBd86k6.js} +1 -1
- package/static/app/assets/{BrainSignals-CtzQZ15J.js → BrainSignals-O4s6R7av.js} +1 -1
- package/static/app/assets/{Capture-1_NaHWqB.js → Capture-AGbOxsg-.js} +1 -1
- package/static/app/assets/{CommandPalette-pqvQOXe4.js → CommandPalette-CeqBjCn2.js} +1 -1
- package/static/app/assets/Library-CXnbNiQW.js +1 -0
- package/static/app/assets/{LivingBrain-DlQ20Q75.js → LivingBrain-D9Iei2ZJ.js} +1 -1
- package/static/app/assets/{ProductFlow-BZvGDRi_.js → ProductFlow-JlXiDfMM.js} +1 -1
- package/static/app/assets/{ReviewCard-BWgI0D2s.js → ReviewCard-QQly2bTV.js} +1 -1
- package/static/app/assets/System-Bp9ZY4ER.js +1 -0
- package/static/app/assets/{activity-Dlfk8YC7.js → activity-CxRPOQ2F.js} +1 -1
- package/static/app/assets/{bot-CDvUB76P.js → bot-1bcsWB2s.js} +1 -1
- package/static/app/assets/{brain-xczrohrt.js → brain-CxaeKCRM.js} +1 -1
- package/static/app/assets/{button-SOdH3Oyf.js → button-ZYFqGan7.js} +1 -1
- package/static/app/assets/{circle-pause-CG1ythH4.js → circle-pause-B5NOIqvk.js} +1 -1
- package/static/app/assets/{circle-play-HXwvjS6W.js → circle-play-BiJVFXf7.js} +1 -1
- package/static/app/assets/{cpu-B0d-rGyk.js → cpu-Vvq0OKTr.js} +1 -1
- package/static/app/assets/{download-BGIkTQL6.js → download-SEcXzkx1.js} +1 -1
- package/static/app/assets/{folder-open-Dst_Z0_K.js → folder-open-Dw1ff_Qa.js} +1 -1
- package/static/app/assets/{hard-drive-D53MsWkV.js → hard-drive-B00fR7_r.js} +1 -1
- package/static/app/assets/index-CEkL4_M-.css +2 -0
- package/static/app/assets/{index-C_IrlQMV.js → index-Dm9VXl1o.js} +3 -3
- package/static/app/assets/{input-C5m0riF6.js → input-DtdWYQEa.js} +1 -1
- package/static/app/assets/{network-C5a-E5iS.js → network-CpjBu0kI.js} +1 -1
- package/static/app/assets/{primitives-vNXYf58F.js → primitives-CwsudBwc.js} +1 -1
- package/static/app/assets/search-CwEJWBEA.js +1 -0
- package/static/app/assets/{shield-alert-Cc-WVXqN.js → shield-alert-CpjBc-gQ.js} +1 -1
- package/static/app/assets/{textarea-BkZ0EqVO.js → textarea-DUPyjHQs.js} +1 -1
- package/static/app/assets/{useFocusTrap-CTtKbAOU.js → useFocusTrap-BWcMtCWH.js} +1 -1
- package/static/app/assets/{useQuery-Dx1fi4Wu.js → useQuery-Dg5fPqTS.js} +1 -1
- package/static/app/assets/{users-BFpQXtEF.js → users-BgcdTQGM.js} +1 -1
- package/static/app/assets/{utils-BA_lmW3J.js → utils-a3YXFtEO.js} +2 -2
- package/static/app/assets/workspace-BMUEiXUm.js +1 -0
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/static/app/assets/Library-DhvoPvC7.js +0 -1
- package/static/app/assets/System-CSMdYLMy.js +0 -1
- package/static/app/assets/index-FxDusbr0.css +0 -2
- package/static/app/assets/search-DhbSgW6m.js +0 -1
- package/static/app/assets/workspace-DBPB0jkX.js +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/ci.yml)
|
|
12
12
|
[](LICENSE)
|
|
13
13
|
|
|
14
|
-

|
|
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  | **See how knowledge connects** — a real relationship graph, not a file list  |
|
|
28
|
+
| **Capture anything** — files, whole folders, notes, screenshots, web pages  | **Automate with review** — agent changes become proposals you approve first  |
|
|
29
|
+
| **Pick a model in one click** — recommended local models for your hardware  | **Stay in control** — audit, roles, retention in a separate admin surface  |
|
|
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
|
-
|  |  |  |
|
|
61
61
|
|
|
62
62
|
Screenshot index and capture notes:
|
|
63
|
-
[output/release/v10.
|
|
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.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- **
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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.
|
|
94
|
+
Expected artifacts for 10.3.0 release must use exact filenames:
|
|
89
95
|
|
|
90
|
-
- `dist/ltcai-10.
|
|
91
|
-
- `dist/ltcai-10.
|
|
92
|
-
- `ltcai-10.
|
|
93
|
-
- `dist/ltcai-10.
|
|
94
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_10.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -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.
|
|
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.
|
package/docs/ONBOARDING.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lattice AI Onboarding
|
|
2
2
|
|
|
3
|
-
Current release: **10.
|
|
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
|
package/docs/OPERATIONS.md
CHANGED
package/docs/TRUST_MODEL.md
CHANGED
package/docs/WHY_LATTICE.md
CHANGED
package/docs/kg-schema.md
CHANGED
package/lattice_brain/archive.py
CHANGED
|
@@ -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
|
|
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
|