ltcai 11.6.0 → 11.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +80 -75
  2. package/docs/BENCHMARKS.md +9 -2
  3. package/docs/CHANGELOG.md +201 -0
  4. package/docs/CI_AND_RELEASE_GATES.md +126 -41
  5. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  6. package/docs/DEVELOPMENT.md +34 -14
  7. package/docs/LEGACY_COMPATIBILITY.md +10 -6
  8. package/docs/ONBOARDING.md +5 -3
  9. package/docs/OPERATIONS.md +5 -1
  10. package/docs/PERMISSION_MODE.md +14 -9
  11. package/docs/TRUST_MODEL.md +13 -6
  12. package/docs/USABILITY_AUDIT.md +5 -0
  13. package/docs/WHY_LATTICE.md +6 -4
  14. package/docs/kg-schema.md +7 -3
  15. package/docs/mcp-tools.md +73 -79
  16. package/docs/security-model.md +6 -3
  17. package/lattice_brain/__init__.py +1 -1
  18. package/lattice_brain/graph/_kg_common/__init__.py +1 -54
  19. package/lattice_brain/graph/_kg_common/text.py +14 -450
  20. package/lattice_brain/ingestion/__init__.py +6 -3
  21. package/lattice_brain/multimodal/__init__.py +9 -3
  22. package/latticeai/__init__.py +1 -1
  23. package/latticeai/api/agent_worker_seam.py +12 -1
  24. package/latticeai/api/models.py +18 -110
  25. package/latticeai/api/search.py +7 -30
  26. package/latticeai/api/worker_compute.py +53 -107
  27. package/latticeai/api/worker_seams.py +17 -2
  28. package/latticeai/core/http_origin.py +3 -3
  29. package/latticeai/core/messages.py +0 -5
  30. package/latticeai/core/policy.py +1 -6
  31. package/latticeai/core/quiet.py +1 -20
  32. package/latticeai/core/security.py +29 -83
  33. package/latticeai/core/sessions.py +95 -4
  34. package/latticeai/core/users.py +0 -38
  35. package/latticeai/models/router/catalog.py +2 -2
  36. package/latticeai/models/router/generation.py +81 -14
  37. package/latticeai/models/router/loading.py +41 -5
  38. package/latticeai/runtime/access_runtime.py +7 -4
  39. package/latticeai/runtime/build_phases/features.py +8 -31
  40. package/latticeai/runtime/build_phases/foundation.py +7 -16
  41. package/latticeai/runtime/build_phases/web.py +3 -3
  42. package/latticeai/runtime/build_phases/worker_profile.py +21 -28
  43. package/latticeai/runtime/runtime_context.py +0 -2
  44. package/latticeai/services/architecture_readiness.py +18 -19
  45. package/latticeai/services/process_audit.py +1 -22
  46. package/latticeai/services/product_readiness.py +33 -11
  47. package/latticeai/services/voice_capture.py +8 -28
  48. package/latticeai/tools/__init__.py +6 -46
  49. package/latticeai/tools/commands.py +9 -15
  50. package/latticeai/tools/knowledge.py +0 -6
  51. package/package.json +3 -5
  52. package/requirements.txt +0 -1
  53. package/scripts/check_current_release_docs.mjs +1 -1
  54. package/scripts/check_openapi_drift.mjs +3 -2
  55. package/scripts/check_server_i18n.mjs +5 -4
  56. package/scripts/compose_openapi.py +2 -1
  57. package/scripts/export_openapi.py +5 -4
  58. package/scripts/gen_worker_allowlist_fixture.py +2 -2
  59. package/scripts/openapi_route_families.json +14 -73
  60. package/scripts/release_screen_claims.json +151 -14
  61. package/src-tauri/Cargo.lock +11 -10
  62. package/src-tauri/Cargo.toml +1 -1
  63. package/src-tauri/tauri.conf.json +1 -1
  64. package/static/app/asset-manifest.json +41 -41
  65. package/static/app/assets/{Act-CToZnOHz.js → Act-B4WT81kh.js} +1 -1
  66. package/static/app/assets/AdminConsole--Wf71m-o.js +1 -0
  67. package/static/app/assets/{Brain-C6zCdv4S.js → Brain-CtYaa26c.js} +2 -2
  68. package/static/app/assets/BrainHome-Be2VPJEc.js +2 -0
  69. package/static/app/assets/BrainSignals-C0__xgpG.js +1 -0
  70. package/static/app/assets/Capture-DdNi5Peb.js +1 -0
  71. package/static/app/assets/Chronicle-B3hNveeI.js +1 -0
  72. package/static/app/assets/CommandPalette-CIsnSsFL.js +1 -0
  73. package/static/app/assets/Library-Bl5XClFV.js +1 -0
  74. package/static/app/assets/LivingBrain-DjkTB_gh.js +1 -0
  75. package/static/app/assets/{ProductFlow-CBLdmesT.js → ProductFlow-DCUNRNHs.js} +1 -1
  76. package/static/app/assets/ReviewCard-CD3yWvUB.js +3 -0
  77. package/static/app/assets/System-BJ6jQ_SL.js +1 -0
  78. package/static/app/assets/arrow-left-6_28Z0qH.js +1 -0
  79. package/static/app/assets/{bot-C5-XIww2.js → bot-Bc3Q27YR.js} +1 -1
  80. package/static/app/assets/brain-B9BDrMTe.js +1 -0
  81. package/static/app/assets/{button-DI1KcQP-.js → button-D6JcpYcf.js} +1 -1
  82. package/static/app/assets/circle-check-BFu9lD-3.js +1 -0
  83. package/static/app/assets/{circle-pause-C8HHyood.js → circle-pause-BGMiV8UU.js} +1 -1
  84. package/static/app/assets/{circle-play-Cufc235E.js → circle-play-DoanLHnd.js} +1 -1
  85. package/static/app/assets/{cpu-DW2_JVsv.js → cpu-DwzNf82m.js} +1 -1
  86. package/static/app/assets/{download-gbdKTBb8.js → download-Ddw49yCV.js} +1 -1
  87. package/static/app/assets/{folder-open-C9ydyX33.js → folder-open-Brd6Kvto.js} +1 -1
  88. package/static/app/assets/{hard-drive-BxNMzBM3.js → hard-drive-Bu-DTJdB.js} +1 -1
  89. package/static/app/assets/index-CGdg_aq9.css +2 -0
  90. package/static/app/assets/{index-q9XyDY7A.js → index-CWKRRsLW.js} +4 -4
  91. package/static/app/assets/input-CEqsxtil.js +1 -0
  92. package/static/app/assets/{link-2-B4Y0gz1S.js → link-2-DZ4OA5tJ.js} +1 -1
  93. package/static/app/assets/{permissionCopy-CxrV0fvU.js → permissionCopy-D9TR0F8b.js} +1 -1
  94. package/static/app/assets/primitives-DORg7Z_7.js +1 -0
  95. package/static/app/assets/search-0NQ21wXe.js +1 -0
  96. package/static/app/assets/{share-2-DxArfiuI.js → share-2-BC5FirFv.js} +1 -1
  97. package/static/app/assets/{shield-alert-CgftuFFs.js → shield-alert-DUbR2W2s.js} +1 -1
  98. package/static/app/assets/textarea-jtQcRSXo.js +1 -0
  99. package/static/app/assets/{useFocusTrap-Dzq2j_OG.js → useFocusTrap-HRemcWId.js} +1 -1
  100. package/static/app/assets/{useMutation-BcqfMLNq.js → useMutation-DqlFE-Bw.js} +1 -1
  101. package/static/app/assets/{useQuery-DBzLKCOv.js → useQuery-BizqBNGw.js} +1 -1
  102. package/static/app/assets/utils-WgW4V69R.js +4 -0
  103. package/static/app/assets/workspace-DSek3jCY.js +1 -0
  104. package/static/app/index.html +4 -4
  105. package/static/sw.js +1 -1
  106. package/lattice_brain/ingestion/pipeline.py +0 -108
  107. package/latticeai/api/local_files.py +0 -44
  108. package/latticeai/api/tools.py +0 -126
  109. package/latticeai/api/voice_capture.py +0 -32
  110. package/latticeai/core/agent_permission.py +0 -85
  111. package/scripts/agent_eval.py +0 -34
  112. package/scripts/brain_quality_eval.py +0 -37
  113. package/scripts/check_legacy_debt.mjs +0 -91
  114. package/scripts/check_python.py +0 -100
  115. package/scripts/chunking_parity_corpus.py +0 -449
  116. package/scripts/generate_agent_parity_fixtures.py +0 -771
  117. package/scripts/generate_chunking_parity_fixtures.py +0 -259
  118. package/static/app/assets/AdminConsole-D5kbrBu8.js +0 -1
  119. package/static/app/assets/BrainHome-D4n3EDUt.js +0 -2
  120. package/static/app/assets/BrainSignals-CzeZ-vQ9.js +0 -1
  121. package/static/app/assets/Capture-DPcyTczq.js +0 -1
  122. package/static/app/assets/Chronicle-D3Nx-oWS.js +0 -1
  123. package/static/app/assets/CommandPalette-DPPvpp28.js +0 -1
  124. package/static/app/assets/Library-Co2qTu3I.js +0 -1
  125. package/static/app/assets/LivingBrain-Bsmzwy8_.js +0 -1
  126. package/static/app/assets/ReviewCard-CfR6DLs7.js +0 -3
  127. package/static/app/assets/System-Ce-P2YL6.js +0 -1
  128. package/static/app/assets/arrow-left-DD5jFGHV.js +0 -1
  129. package/static/app/assets/brain-CFRJUvdX.js +0 -1
  130. package/static/app/assets/circle-check-CY20XMCh.js +0 -1
  131. package/static/app/assets/index-BovSWRmQ.css +0 -2
  132. package/static/app/assets/input-GLD94Y_K.js +0 -1
  133. package/static/app/assets/primitives-2ANdAsu2.js +0 -1
  134. package/static/app/assets/search-DTxtjQ07.js +0 -1
  135. package/static/app/assets/textarea-BHVBAoCr.js +0 -1
  136. package/static/app/assets/utils-B-Aah1bO.js +0 -4
  137. package/static/app/assets/workspace-B6fFhoko.js +0 -1
@@ -1,6 +1,6 @@
1
1
  # CI & Release Gates
2
2
 
3
- > Status: reference 2026-07-21
3
+ > Status: reference 2026-08-16
4
4
 
5
5
  Reference for the GitHub Actions workflows that guard `main` and releases, the
6
6
  supply-chain hardening applied to them, and the recommended branch-protection
@@ -11,13 +11,79 @@ configuration. Companion to [SECURITY_AUDIT.md](SECURITY_AUDIT.md) and
11
11
 
12
12
  | Workflow | File | Triggers | Purpose |
13
13
  |----------|------|----------|---------|
14
- | CI | `.github/workflows/ci.yml` | push/PR to `main` | Lint, typecheck, unit + integration tests, brain/agent eval gates, build + wheel smoke |
15
- | Release | `.github/workflows/release.yml` | tags `v*` / `[0-9]*` | Build & validate all artifacts (no publish) |
16
- | Visual Smoke | `.github/workflows/visual.yml` | push/PR, nightly cron, dispatch | Playwright visual smoke |
17
- | **Dependency Audit** | `.github/workflows/dependency-audit.yml` | push/PR, weekly cron, dispatch | pip-audit + npm audit + CycloneDX SBOMs |
18
- | **Postgres Integration** | `.github/workflows/postgres-integration.yml` | weekly cron, dispatch | Live SQLite→Postgres/pgvector migration test |
14
+ | CI | `.github/workflows/ci.yml` | push/PR to `main` | Lint, typecheck, unit + coverage + integration tests, product-readiness, build + wheel smoke, Rust workspace |
15
+ | Release | `.github/workflows/release.yml` | tags `v*` / `[0-9]*` | Build & validate artifacts (no publish; does not re-run CI lint/tests) |
16
+ | Visual Smoke | `.github/workflows/visual.yml` | push to `main`, nightly cron, dispatch | Playwright visual smoke (not on PRs) |
17
+ | Sidecar E2E | `.github/workflows/e2e-sidecar.yml` | nightly cron, dispatch | Live sidecar Playwright first-value loop |
18
+ | Dependency Audit | `.github/workflows/dependency-audit.yml` | weekly cron, dispatch | pip-audit + npm audit + CycloneDX SBOMs |
19
+ | Postgres Integration | `.github/workflows/postgres-integration.yml` | weekly cron, dispatch | Live SQLite→Postgres/pgvector migration test |
19
20
 
20
- The last two were added for the P2 deployment-trust / supply-chain workstream.
21
+ There is no `agent-smoke.yml`. Hosted runners have no MLX models; a fail-open
22
+ weekly smoke cannot report anything actionable.
23
+
24
+ Every workflow sets `concurrency.group` to `<workflow-file-stem>-${{ github.ref }}`
25
+ and cancels in-progress runs except on `main` (`cancel-in-progress: false` on
26
+ `release.yml`, which runs on tags). Job timeouts: test 40, integration 25,
27
+ build 20, rust 40, visual 15, sidecar 20, audit 15, release build 40,
28
+ postgres 20.
29
+
30
+ ## CI matrix (`ci.yml`)
31
+
32
+ Four legs. Job names are `Test (Python <ver> on <os>)`:
33
+
34
+ | Leg | OpenAPI generate + upload | Full lint + typecheck + docs | Extension tests | Vitest | `pytest tests/unit/` | Coverage pytest (`tests/` + `--cov`) | Product readiness |
35
+ |-----|---------------------------|------------------------------|-----------------|--------|----------------------|--------------------------------------|-------------------|
36
+ | 3.11 + ubuntu-latest | yes | yes (`npm run lint`, `typecheck`, `docs:check-current`, `docs:check-links`) | yes (`test:browser-extension` && `test:vscode-extension`) | yes | yes | no | yes |
37
+ | 3.12 + ubuntu-latest | no | Python only (`lint:python`) | no | yes | yes | no | no |
38
+ | 3.14 + ubuntu-latest | no | Python only | no | yes | **no** (coverage invocation is the only pytest) | yes, line floor ≥90 | no |
39
+ | 3.11 + macos-latest | no | Python only | no | yes | yes | no | no |
40
+
41
+ Downstream jobs (after `test`): `Integration smoke test` (25 min), then
42
+ `Build package` (20 min). `Rust workspace` is independent (40 min).
43
+
44
+ Removed from CI **and deleted from the tree** in 11.8.0 — a script that is not
45
+ a gate is a script that looks like one:
46
+
47
+ - `scripts/check_python.py` — ruff parses every file on every test leg
48
+ - `scripts/brain_quality_eval.py`
49
+ - `scripts/agent_eval.py`
50
+ - `scripts/bench_agent_smoke.py`
51
+
52
+ ## Local lint chain (`npm run lint`)
53
+
54
+ Ten members, in order:
55
+
56
+ 1. `lint:python` (ruff + mypy)
57
+ 2. `lint:visual`
58
+ 3. `lint:frontend`
59
+ 4. `frontend:openapi:check`
60
+ 5. `scripts/check_i18n_literals.mjs`
61
+ 6. `check:i18n-namespaces`
62
+ 7. `check:bundle`
63
+ 8. `check:server-i18n`
64
+ 9. `scripts/check_release_evidence_bound.mjs`
65
+ 10. `check:max-file-lines`
66
+
67
+ Not in the lint chain (CI calls the extension tests directly on the 3.11+ubuntu
68
+ leg; the Python legacy-shim test is authoritative):
69
+
70
+ - `test:browser-extension` / `test:vscode-extension` (script entries remain)
71
+ - `check:legacy-debt` (script entry and `scripts/check_legacy_debt.mjs` both
72
+ removed — the mjs mirror had drifted from the Python test)
73
+ - `check:python` (script entry and `scripts/check_python.py` both removed)
74
+
75
+ `npm run typecheck` is frontend-only (`typecheck:frontend`). The VS Code
76
+ extension is built by `test:vscode-extension` in CI and by `build_vsix.mjs`
77
+ at release.
78
+
79
+ ## Coverage floor
80
+
81
+ Python: `[tool.coverage.report] fail_under = 90` (line coverage). Branch
82
+ measurement is off (`branch` is not set under `[tool.coverage.run]`). The
83
+ coverage step runs only on 3.14 + ubuntu-latest.
84
+
85
+ Frontend: `vitest.config.ts` still pins 100% thresholds on all four metrics;
86
+ that is unchanged and still runs on every CI test leg.
21
87
 
22
88
  ## Supply-chain hardening: pinned actions
23
89
 
@@ -36,30 +102,22 @@ from the authoritative upstream refs via `git ls-remote --tags` on 2026-07-21.
36
102
  | actions/upload-artifact | v4.6.2 | `ea165f8d65b6e75b540449e92b4886f43607fa02` |
37
103
 
38
104
  Pinning coverage: **100% of current `uses:` entries** across `ci.yml`,
39
- `release.yml`, `visual.yml`, `dependency-audit.yml`, and
40
- `postgres-integration.yml`. All are first-party `actions/*`. If a third-party
41
- action is added later, resolve and pin its SHA the same way before merge.
105
+ `release.yml`, `visual.yml`, `e2e-sidecar.yml`, `dependency-audit.yml`, and
106
+ `postgres-integration.yml`. First-party `actions/*` plus pinned
107
+ `Swatinem/rust-cache` and `dtolnay/rust-toolchain` on the Rust/integration
108
+ legs. If a third-party action is added later, resolve and pin its SHA the same
109
+ way before merge.
42
110
 
43
- ## Dependency-audit gate posture (conservative)
111
+ ## Dependency-audit gate posture
44
112
 
45
- The audit workflow is intentionally **non-blocking on day-to-day PRs** and
46
- **strict on the scheduled/dispatch run**:
47
-
48
- - `push` / `pull_request`: `pip-audit` and `npm audit` run with
49
- `continue-on-error` keyed on the event name, so a newly-disclosed CVE in a
50
- transitive dependency never reddens an unrelated PR. Findings still appear in
51
- the job summary and uploaded report artifacts.
52
- - `schedule` (weekly) / `workflow_dispatch`: the same steps run **strict** —
53
- `pip-audit --strict` fails on any known vuln; `npm audit --audit-level=high`
54
- fails on high/critical. This is the loud channel for triage.
113
+ The audit workflow is **schedule + dispatch only** (not on push/PR). Both
114
+ `pip-audit --strict` and `npm audit --audit-level=high` fail the job on
115
+ findings. This is the loud channel for triage; a newly-disclosed CVE cannot
116
+ redden an unrelated change.
55
117
 
56
118
  CycloneDX SBOMs (`sbom-python.json`, `sbom-npm.json`) are produced every run and
57
119
  uploaded as artifacts. Regenerate locally with `scripts/generate_sbom.py`.
58
120
 
59
- **To promote to a required blocking PR check:** remove the `continue-on-error`
60
- expressions in `dependency-audit.yml` and add `python-audit` / `npm-audit` to
61
- the required-checks list below.
62
-
63
121
  ## Postgres integration gate
64
122
 
65
123
  `postgres-integration.yml` runs the migration-integrity suite
@@ -70,31 +128,58 @@ the workflow sets that variable, and the test itself starts and tears down a
70
128
  GitHub-hosted `ubuntu-latest`). It is deliberately kept off the PR path (slow,
71
129
  image pull, needs Docker) and runs weekly + on demand.
72
130
 
131
+ ## Visual smoke and sidecar E2E
132
+
133
+ This repository typically commits straight to `main`.
134
+
135
+ - `visual.yml` runs on push to `main`, the nightly cron, and dispatch. It does
136
+ **not** run on pull requests.
137
+ - `e2e-sidecar.yml` is nightly + dispatch only (no push, no PR).
138
+
73
139
  ## Recommended branch protection for `main`
74
140
 
75
- Required status checks (blocking):
141
+ Required status checks (blocking). Names match the job `name:` fields:
142
+
143
+ - `Test (Python 3.11 on ubuntu-latest)`
144
+ - `Test (Python 3.12 on ubuntu-latest)`
145
+ - `Test (Python 3.14 on ubuntu-latest)`
146
+ - `Test (Python 3.11 on macos-latest)`
147
+ - `Integration smoke test`
148
+ - `Build package`
149
+ - `Rust workspace`
76
150
 
77
- - `CI / Test (Python 3.11)`
78
- - `CI / Test (Python 3.12)`
79
- - `CI / Integration smoke test`
80
- - `CI / Build package`
81
- - `Visual Smoke / Playwright visual smoke`
151
+ `Playwright visual smoke` is **not** a PR-blocking check: `visual.yml` no
152
+ longer has a `pull_request` trigger. It still runs on every push to `main`.
82
153
 
83
- Advisory / non-blocking today (promote when the team is ready):
154
+ Advisory / non-blocking (schedule + dispatch only):
84
155
 
85
- - `Dependency Audit / Python dependency audit (pip-audit)`
86
- - `Dependency Audit / npm dependency audit`
156
+ - `Python dependency audit (pip-audit)`
157
+ - `npm dependency audit`
87
158
 
88
- Additional recommended settings: require PRs before merge, require branches to
89
- be up to date, require linear history, and dismiss stale approvals on new
90
- commits.
159
+ Additional recommended settings if pull requests are used: require PRs before
160
+ merge, require branches to be up to date, require linear history, and dismiss
161
+ stale approvals on new commits.
91
162
 
92
163
  ## Release gate (publication safety)
93
164
 
94
- `release.yml` builds and validates artifacts only — it never publishes. Package
95
- publication (PyPI / npm / VS Code Marketplace / Open VSX) is a manual step
96
- (`npm run publish:*`) using **exact version filenames**, never a `dist/*` glob,
97
- so pushing a tag can never publish by accident. See
165
+ `release.yml` builds and validates artifacts only — it never publishes. A tag
166
+ is only pushed on a commit that already passed CI, so the workflow does **not**
167
+ re-run `npm run lint`, `npm run typecheck`, `docs:check-links`, frontend tests,
168
+ or `pytest tests/unit/`.
169
+
170
+ It still runs:
171
+
172
+ - checkout / setup / installs
173
+ - `npm run docs:check-current` (release-specific current-version docs gate)
174
+ - `npm run build:assets`
175
+ - `python scripts/product_readiness.py` (safety net)
176
+ - `python -m build`, `wheel_smoke.py`, `twine check`
177
+ - `npm pack`, vsce package
178
+ - `validate_release_artifacts.py <v> --require-vsix --require-tgz`
179
+
180
+ Package publication (PyPI / npm / VS Code Marketplace / Open VSX) is a manual
181
+ step (`npm run publish:*`) using **exact version filenames**, never a `dist/*`
182
+ glob, so pushing a tag can never publish by accident. See
98
183
  [../RELEASE.md](../RELEASE.md) for the full procedure.
99
184
 
100
185
  ## Limitations (honest)
@@ -1,6 +1,6 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **11.6.0 — One Door**.
3
+ Current release: **11.9.0 — Working Order**.
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: **11.6.0 — One Door**.
6
+ Current release: **11.9.0 — Working Order**.
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`; supported
@@ -32,15 +32,20 @@ Engineering work should preserve these boundaries:
32
32
 
33
33
  ```bash
34
34
  npm install
35
- npm run dev
35
+ npm start
36
36
  ```
37
37
 
38
- The local app is served through the FastAPI sidecar at:
38
+ `npm start` (or `bin/ltcai.js` / the `LTCAI` binary) is the product: it
39
+ boots `lattice-host` and serves the SPA at:
39
40
 
40
41
  ```text
41
42
  http://127.0.0.1:4825/app
42
43
  ```
43
44
 
45
+ `npm run dev` is **not** the product. It starts the 19-route Python AI
46
+ worker with `--reload` (`latticeai.cli.entrypoint`). Use it when iterating
47
+ on worker compute seams, not to serve the app.
48
+
44
49
  Apple Silicon local model extras:
45
50
 
46
51
  ```bash
@@ -53,7 +58,6 @@ Run the smallest affected gate while iterating. Before committing broad runtime,
53
58
  API, UI, or release work, run:
54
59
 
55
60
  ```bash
56
- npm run check:python
57
61
  npm run lint
58
62
  npm run typecheck
59
63
  npm run test:frontend
@@ -61,9 +65,21 @@ npm run test:unit
61
65
  npm run docs:check-links
62
66
  ```
63
67
 
64
- `npm run lint` runs the Python Ruff baseline, frontend TypeScript lint gate,
65
- visual smoke syntax checks, an exact generated-OpenAPI drift check, i18n literal
66
- checks, and browser-extension syntax/behavior tests.
68
+ `npm run lint` is **ten** gates since 11.8.0, in order: `lint:python`
69
+ (ruff + mypy), `lint:visual`, `lint:frontend`, `frontend:openapi:check`,
70
+ `check_i18n_literals.mjs`, `check:i18n-namespaces`, `check:bundle`,
71
+ `check:server-i18n`, `check_release_evidence_bound.mjs`, and
72
+ `check:max-file-lines`. Three left in 11.8.0: `check:python` (ruff already
73
+ parses every file on every CI test leg), `check:legacy-debt` (the mjs mirror had
74
+ drifted from the Python test that states the same rule — the Python test is
75
+ authoritative), and the extension tests, which CI now invokes directly on the
76
+ 3.11 + ubuntu leg.
77
+
78
+ Coverage floors are not symmetrical, and the difference is deliberate rather
79
+ than an oversight: **Python is a line-coverage floor of 90**
80
+ (`[tool.coverage.report] fail_under = 90`, branch measurement off) and the
81
+ frontend still pins **100% on all four vitest metrics**. Run
82
+ `npm run test:coverage` / `npm run test:frontend:coverage` to see either.
67
83
 
68
84
  Use these when the change touches the relevant surface:
69
85
 
@@ -140,7 +156,8 @@ pre-tool/post-tool lifecycle:
140
156
 
141
157
  - browser `read-url` ingestion dispatches `tool.kg_ingest.*` events;
142
158
  - browser `ingest-current-tab` ingestion dispatches the same lifecycle;
143
- - `IngestionPipeline` remains the common ingestion boundary behind those routes.
159
+ - the native ingest door in `lattice-ingest` (writing through `graph_write`)
160
+ remains the single ingestion boundary behind those routes.
144
161
 
145
162
  ## Documentation Sync
146
163
 
@@ -158,10 +175,13 @@ For user-facing, API, runtime, release, or packaging changes, check:
158
175
  Release/publish examples must use exact target-version filenames. Do not
159
176
  document wildcard artifact upload commands.
160
177
 
161
- For 9.9.0 release work, exact artifacts are:
178
+ For 11.9.0 release work, exact artifacts are:
179
+
180
+ - `dist/ltcai-11.9.0-py3-none-any.whl`
181
+ - `dist/ltcai-11.9.0.tar.gz`
182
+ - `ltcai-11.9.0.tgz`
183
+ - `dist/ltcai-11.9.0.vsix`
184
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_11.9.0_aarch64.dmg`
162
185
 
163
- - `dist/ltcai-9.9.0-py3-none-any.whl`
164
- - `dist/ltcai-9.9.0.tar.gz`
165
- - `ltcai-9.9.0.tgz`
166
- - `dist/ltcai-9.9.0.vsix`
167
- - `src-tauri/target/release/bundle/dmg/Lattice AI_9.9.0_aarch64.dmg`
186
+ The dmg is ad-hoc signed (effectively unsigned); `npm run release:validate`
187
+ checks the names and presence, not a Developer ID signature.
@@ -26,14 +26,18 @@ Removed layers stay listed in `legacy_compatibility.REMOVED_SHIMS` and in the
26
26
 
27
27
  ## Legacy Debt Gate
28
28
 
29
- Two gates keep the debt paid down:
29
+ **One** gate keeps the debt paid down:
30
30
 
31
- - `scripts/check_legacy_debt.mjs` (part of `npm run lint`) — fails if a
32
- disallowed root-level Python module reappears, or if any source tree imports
33
- a removed root shim.
34
31
  - `tests/unit/test_legacy_root_shims.py` — asserts removed shims stay
35
- unimportable, canonical replacements import, and the registry in
36
- `latticeai.core.legacy_compatibility` matches reality.
32
+ unimportable and canonical replacements import.
33
+
34
+ There used to be two. `scripts/check_legacy_debt.mjs` stated the same rule in
35
+ JavaScript as part of `npm run lint`, and by 11.8.0 the two implementations had
36
+ drifted apart — at which point having both was worse than having one, because
37
+ neither could be trusted as the answer. The Python test is authoritative and the
38
+ mjs mirror was deleted. `latticeai.core.legacy_compatibility` went with the
39
+ platform code in 11.6.0; the registry it held described modules that no longer
40
+ exist to shim.
37
41
 
38
42
  ## Root Module Map (removed in 9.9.1)
39
43
 
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Onboarding
2
2
 
3
- Current release: **11.6.0 — One Door**.
3
+ Current release: **11.9.0 — Working Order**.
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
@@ -10,8 +10,10 @@ read the docs first.
10
10
  ## Five-Minute Flow
11
11
 
12
12
  1. Wake the Brain and confirm the local owner profile.
13
- 2. Let Lattice inspect local model/runtime readiness.
14
- 3. Pick the recommended Brain voice or skip model loading.
13
+ 2. Let Lattice inspect local model/runtime readiness (`/setup/scan` is a
14
+ real probe; brew/pip items stay manual).
15
+ 3. Pick the recommended Brain voice (`/models/recommendations` probes RAM
16
+ and the worker catalog) or skip model loading.
15
17
  4. Add one source: upload a file, choose and scan a folder, save a note, or
16
18
  capture a browser/source event.
17
19
  5. Ask one grounded question and inspect the answer proof.
@@ -1,4 +1,4 @@
1
- # Lattice AI — Operations Guide (v11.6.0)
1
+ # Lattice AI — Operations Guide (v11.9.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
@@ -29,6 +29,10 @@ tar -czf ltcai-backup-$(date +%Y%m%d).tar.gz ~/.ltcai ~/ltcai-agent
29
29
  tar -xzf ltcai-backup-YYYYMMDD.tar.gz -C ~
30
30
  ```
31
31
 
32
+ 인앱 복원(`.latticebrain` / `VACUUM INTO` 스냅샷)은 원자적입니다. **오래
33
+ 떠 있는 프로세스에서 복원하면 커넥션이 재활용되기 전까지 복원 전
34
+ 바이트를 줄 수 있습니다.** 복원 뒤에는 호스트를 재시작하십시오.
35
+
32
36
  ### 2.3 히스토리만 초기화
33
37
  ```bash
34
38
  rm ~/.ltcai/history.json
@@ -97,18 +97,23 @@ before routers are mounted would otherwise pin the store to the fallback
97
97
 
98
98
  ## Code map
99
99
 
100
+ The dial is native. v11.6.0 moved the agent loop into `lattice-agent` and the
101
+ routes into `lattice-platform`; v11.8.0 deleted the last Python module that
102
+ still carried a copy of the gate helpers (`latticeai/core/agent_permission.py`,
103
+ whose only readers were already ported).
104
+
100
105
  | Module | Role |
101
106
  |--------|------|
102
- | `latticeai/core/permission_mode.py` | Pure decision table |
103
- | `latticeai/core/agent_permission.py` | Agent plan/tool gate helpers |
104
- | `latticeai/core/agent/` | `SingleAgentRuntime` gates (mode-aware in-line: `planning.py` for the plan gate, `execution.py` for the per-tool gates) |
107
+ | `rust/lattice-agent/src/mode.rs` | Pure decision table (port of `latticeai.core.permission_mode`) |
108
+ | `rust/lattice-agent/src/permission.rs` | Plan/tool gate helpers — the ordered block-reason chain |
109
+ | `rust/lattice-agent/src/breaker.rs` | Mode-invariant circuit breakers |
110
+ | `rust/lattice-agent/src/agentloop/gates.rs` | The gates one executor step passes, in the order that decides it |
111
+ | `rust/lattice-agent/src/agentloop/planning.rs` | The plan gate |
112
+ | `rust/lattice-platform/src/permission_mode.rs` | HTTP routes + persistence (`permission_mode.json`, atomic replace) |
113
+ | `rust/lattice-auth/src/policy.rs` | The tool policy table the gates read |
105
114
  | `frontend/src/components/PermissionModePanel.tsx` | Settings selector |
106
- | `latticeai/services/permission_mode_service.py` | Persistence |
107
- | `latticeai/runtime/permission_mode_wiring.py` | Process-wide service + router mount |
108
- | `latticeai/runtime/chat_wiring.py` | Agent runtime injection |
109
- | `latticeai/runtime/router_registration.py` | HTTP mount |
110
- | `latticeai/services/tool_dispatch.py` | `enforce_policy` + `build_agent_runtime` |
111
- | `latticeai/api/permission_mode.py` | HTTP routes |
115
+ | `frontend/src/lib/permissionCopy.ts` | The plain-language wording for each mode |
116
+ | `latticeai/core/permission_mode.py` | The worker's own `is_circuit_breaker`, asked by `POST /agent/tool` — the mode-invariant refusal holds on the executing side too, not only at the gate that dispatched |
112
117
 
113
118
  ## AGENTS.md note
114
119
 
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **11.6.0 — One Door**.
3
+ Current release: **11.9.0 — Working Order**.
4
4
 
5
5
  Lattice AI is local-first, explicit about external communication, and honest
6
6
  when a capability is unavailable.
@@ -24,10 +24,14 @@ Local data can include:
24
24
 
25
25
  External communication requires configuration plus a user/admin action:
26
26
 
27
- - cloud model calls after keys are configured and a cloud model is selected;
27
+ - cloud model calls after credentials resolve (`cloud_provider.json` / env
28
+ key / locally OAuth-authenticated `agy` or `grok`) and the escalation
29
+ policy — or an explicit `/cloud` prefix — uses them. Every such turn
30
+ writes a shape-only egress audit (provider / model / reason, never
31
+ content) and stages extracted knowledge as a Review Center proposal;
28
32
  - model downloads from registries after install consent;
29
- - Telegram bridge after the integration is enabled, the chat is allowlisted,
30
- and a dedicated server session bearer is configured;
33
+ - Telegram bridge — removed in 11.6.0 with the platform code that became
34
+ the AI worker; nothing replaces it;
31
35
  - Brain Network peer actions after pairing;
32
36
  - Docker/Postgres setup after opt-in scale configuration;
33
37
  - update checks only when enabled;
@@ -51,7 +55,7 @@ Lattice AI should fail closed or show an unavailable state for:
51
55
  - no graph/context evidence available;
52
56
  - unavailable external integration;
53
57
  - unknown or unreadable Knowledge Graph workspace scope;
54
- - missing Telegram chat allowlist or dedicated server session token;
58
+ - Telegram inbound (the bridge was removed in 11.6.0; nothing replaces it);
55
59
  - wrong archive passphrase;
56
60
  - archive tampering, unsupported archive versions, or path traversal.
57
61
 
@@ -67,7 +71,10 @@ does not mean secrets should appear in clear text.
67
71
  - Local files are only as protected as the user's machine, OS account, backups,
68
72
  and disk encryption.
69
73
  - Cloud model prompts follow the selected provider's policy once the user
70
- explicitly chooses that provider.
74
+ explicitly chooses that provider (or the `auto`/`always` escalation
75
+ policy does, behind `cloud_allowed`). The `api_key` path is
76
+ mock-verified only in this release; live OAuth used `cli_oauth` at
77
+ zero billing. Extracted cloud knowledge is proposal-first.
71
78
  - A local admin can inspect local files and process memory outside Lattice AI.
72
79
  - Marketplace and model registries are third-party services when explicitly
73
80
  contacted.
@@ -86,6 +86,11 @@ Heuristics:
86
86
 
87
87
  ## Journey 4 — Brain hierarchy
88
88
 
89
+ > **Dated snapshot (2026-07-21).** `DepthEmergence.tsx` was deleted in v11.8.0
90
+ > when the Brain home was redesigned; the depth-tiered reveal it describes is no
91
+ > longer how the home discloses structure. The findings below are kept as the
92
+ > record of what was evaluated at the time, not as current-truth surface notes.
93
+
89
94
  Surface: `frontend/src/features/brain/DepthEmergence.tsx`,
90
95
  `.../BrainMemoryLayer.tsx`.
91
96
 
@@ -1,6 +1,6 @@
1
1
  # Why Lattice AI Exists
2
2
 
3
- Current release: **11.6.0 — One Door**.
3
+ Current release: **11.9.0 — Working Order**.
4
4
 
5
5
  **Lattice AI is a local-first Digital Brain that keeps your knowledge durable
6
6
  across any AI model.**
@@ -25,8 +25,9 @@ material. That breaks down for real work:
25
25
  ## The Lattice Answer
26
26
 
27
27
  Lattice AI keeps conversations, documents, memories, decisions, relationships,
28
- and source provenance in a private local Brain. Models can be local, cloud,
29
- current, or future. The Brain remains.
28
+ and source provenance in a private local Brain. Models can be local, or an
29
+ optional cloud worker you hire (OAuth CLI or an API key). Default is local.
30
+ The Brain remains.
30
31
 
31
32
  The graph matters as visible proof, but a graph editor is not the product
32
33
  identity. The product identity is a local-first Digital Brain: the user talks or
@@ -48,7 +49,8 @@ secondary.
48
49
  - Ask what the team decided and see the source.
49
50
  - Add documents and build a searchable private memory.
50
51
  - Prepare from old notes, project decisions, and files.
51
- - Preserve context when moving between models.
52
+ - Preserve context when moving between models. Cloud is optional; default
53
+ is local.
52
54
  - Export or restore the Brain as an encrypted `.latticebrain` archive.
53
55
  - Use Korean or English without changing the underlying Brain.
54
56
  - Avoid fake answers when no model or evidence is available.
package/docs/kg-schema.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Knowledge Graph Schema
2
2
 
3
- Current release: **11.6.0 — One Door**.
3
+ Current release: **11.9.0 — Working Order**.
4
4
 
5
5
  명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
6
6
  구현: `lattice_brain/graph/schema.py`
@@ -142,8 +142,12 @@ provenance(source_type, source_uri, content_hash, captured_at, modified_at,
142
142
  범위 없는 로컬 폴더는 개인 Brain으로 재투영하되 기존 노드 ID는 보존하며,
143
143
  같은 폴더를 다른 워크스페이스로 조용히 재할당하지 않는다.
144
144
 
145
- 구현: `lattice_brain/ingestion/` (`IngestionPipeline`) 가 단일 진입점이며,
146
- 파일/로컬폴더/URL/브라우저 탭/텍스트를 모두 이 형태로 정규화한다.
145
+ 구현: 단일 진입점은 v11.6.0부터 Rust의 네이티브 ingest 문
146
+ (`lattice-ingest` → `lattice_core::graph_write`)이며, 파일/로컬폴더/URL/
147
+ 브라우저 탭/텍스트를 모두 이 형태로 정규화한다. `lattice_brain/ingestion/`은
148
+ 양쪽이 공유하는 어휘 — 라우팅 상수, DTO, 콘텐츠 해시, 추출 품질 점수 — 만
149
+ 남았고, v11.8.0이 마지막 잔재였던 `IngestionPipeline` 능력 프로브 클래스를
150
+ 그 유일한 호출 라우트와 함께 삭제했다.
147
151
 
148
152
  ---
149
153