ltcai 11.7.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 (136) hide show
  1. package/README.md +73 -70
  2. package/docs/BENCHMARKS.md +9 -2
  3. package/docs/CHANGELOG.md +157 -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 +131 -27
  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-BPcVAbOL.js → Act-B4WT81kh.js} +1 -1
  66. package/static/app/assets/AdminConsole--Wf71m-o.js +1 -0
  67. package/static/app/assets/{Brain-CT92Kos0.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-DXBC6brE.js → ProductFlow-DCUNRNHs.js} +1 -1
  76. package/static/app/assets/{ReviewCard-HXRle3qq.js → ReviewCard-CD3yWvUB.js} +2 -2
  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-Cn8bWRuq.js → bot-Bc3Q27YR.js} +1 -1
  80. package/static/app/assets/brain-B9BDrMTe.js +1 -0
  81. package/static/app/assets/{button-Ct9f2_oT.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-CmzC_apg.js → circle-pause-BGMiV8UU.js} +1 -1
  84. package/static/app/assets/{circle-play-D8mW2aQ7.js → circle-play-DoanLHnd.js} +1 -1
  85. package/static/app/assets/{cpu-DZcdd0PZ.js → cpu-DwzNf82m.js} +1 -1
  86. package/static/app/assets/{download-bv1KEPGQ.js → download-Ddw49yCV.js} +1 -1
  87. package/static/app/assets/{folder-open-d-Pip5gr.js → folder-open-Brd6Kvto.js} +1 -1
  88. package/static/app/assets/{hard-drive-D20iavUb.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-Do83hDzJ.js → index-CWKRRsLW.js} +4 -4
  91. package/static/app/assets/input-CEqsxtil.js +1 -0
  92. package/static/app/assets/{link-2-BPJOFlAy.js → link-2-DZ4OA5tJ.js} +1 -1
  93. package/static/app/assets/{permissionCopy-ChdJd493.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-YNX_NtMU.js → share-2-BC5FirFv.js} +1 -1
  97. package/static/app/assets/{shield-alert-DuQ3zrVL.js → shield-alert-DUbR2W2s.js} +1 -1
  98. package/static/app/assets/textarea-jtQcRSXo.js +1 -0
  99. package/static/app/assets/{useFocusTrap-ZVI98jaW.js → useFocusTrap-HRemcWId.js} +1 -1
  100. package/static/app/assets/{useMutation-CVC4qv_D.js → useMutation-DqlFE-Bw.js} +1 -1
  101. package/static/app/assets/{useQuery-C7BeG4HU.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-Bw1ATQL0.js +0 -1
  119. package/static/app/assets/BrainHome-CFBkt1K_.js +0 -2
  120. package/static/app/assets/BrainSignals-ReLWF2H8.js +0 -1
  121. package/static/app/assets/Capture-BsTokYkk.js +0 -1
  122. package/static/app/assets/Chronicle-B6f0T9id.js +0 -1
  123. package/static/app/assets/CommandPalette-CuvjTv1u.js +0 -1
  124. package/static/app/assets/Library-BGJbG9Hd.js +0 -1
  125. package/static/app/assets/LivingBrain-DGYK_Jsa.js +0 -1
  126. package/static/app/assets/System-CMHSO9qM.js +0 -1
  127. package/static/app/assets/arrow-left-BfmkskWx.js +0 -1
  128. package/static/app/assets/brain-CQJberbE.js +0 -1
  129. package/static/app/assets/circle-check-DruOxB-4.js +0 -1
  130. package/static/app/assets/index-D9x-kSNy.css +0 -2
  131. package/static/app/assets/input-BLXVNmj1.js +0 -1
  132. package/static/app/assets/primitives-Cv5tbZBY.js +0 -1
  133. package/static/app/assets/search-CT9aho2j.js +0 -1
  134. package/static/app/assets/textarea-DqwLnli4.js +0 -1
  135. package/static/app/assets/utils-CiFtIdZq.js +0 -4
  136. package/static/app/assets/workspace-DQz9vIId.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "11.7.0",
3
+ "version": "11.9.0",
4
4
  "description": "Lattice AI — local-first Digital Brain that keeps your knowledge durable across any AI model.",
5
5
  "homepage": "https://github.com/TaeSooPark-PTS/LatticeAI#readme",
6
6
  "repository": {
@@ -23,12 +23,10 @@
23
23
  "frontend:openapi:check": "node scripts/check_openapi_drift.mjs",
24
24
  "build:assets": "vite build && node scripts/build_frontend_assets.mjs",
25
25
  "build:python": "node scripts/run_python.mjs -m build",
26
- "check:python": "node scripts/run_python.mjs scripts/check_python.py",
27
- "lint": "npm run lint:python && npm run lint:visual && npm run lint:frontend && npm run frontend:openapi:check && node scripts/check_i18n_literals.mjs && npm run check:i18n-namespaces && npm run check:bundle && npm run check:legacy-debt && npm run check:server-i18n && npm run test:browser-extension && npm run test:vscode-extension && node scripts/check_release_evidence_bound.mjs && npm run check:max-file-lines",
26
+ "lint": "npm run lint:python && npm run lint:visual && npm run lint:frontend && npm run frontend:openapi:check && node scripts/check_i18n_literals.mjs && npm run check:i18n-namespaces && npm run check:bundle && npm run check:server-i18n && node scripts/check_release_evidence_bound.mjs && npm run check:max-file-lines",
28
27
  "lint:visual": "for f in tests/visual/*.js tests/visual/*.cjs tests/visual/mock_server/*.cjs; do node --check \"$f\" || exit 1; done && echo 'visual syntax ok'",
29
28
  "check:max-file-lines": "node scripts/check_max_file_lines.mjs",
30
29
  "check:release-evidence-bound": "node scripts/check_release_evidence_bound.mjs",
31
- "check:legacy-debt": "node scripts/check_legacy_debt.mjs",
32
30
  "check:server-i18n": "node scripts/check_server_i18n.mjs",
33
31
  "lint:python": "node scripts/run_python.mjs -m ruff check . && npm run typecheck:python",
34
32
  "lint:frontend": "node scripts/lint_frontend.mjs",
@@ -36,7 +34,7 @@
36
34
  "docs:check-links": "node scripts/check_markdown_links.mjs && node scripts/check_doc_status.mjs",
37
35
  "docs:check-status": "node scripts/check_doc_status.mjs",
38
36
  "docs:check-current": "node scripts/check_current_release_docs.mjs",
39
- "typecheck": "npm run typecheck:frontend && cd vscode-extension && npm run build",
37
+ "typecheck": "npm run typecheck:frontend",
40
38
  "typecheck:frontend": "npx tsc -p tsconfig.json --noEmit",
41
39
  "test": "node scripts/run_python.mjs -m pytest tests/ -v",
42
40
  "test:frontend": "vitest run",
package/requirements.txt CHANGED
@@ -9,4 +9,3 @@ openpyxl>=3.1,<4
9
9
  python-pptx>=0.6.23,<2
10
10
  keyring>=24,<26
11
11
  pdfplumber>=0.11,<0.12
12
- pypdfium2>=4.30,<6
@@ -6,7 +6,7 @@ const root = process.cwd();
6
6
  const pkg = JSON.parse(readFileSync(path.join(root, "package.json"), "utf8"));
7
7
  const version = pkg.version;
8
8
  const releaseDir = `output/release/v${version}`;
9
- const releaseTheme = "Clean Sweep";
9
+ const releaseTheme = "Working Order";
10
10
  const title = `${version} — ${releaseTheme}`;
11
11
  const escapedVersion = version.replaceAll(".", "\\.");
12
12
 
@@ -27,8 +27,9 @@ function matches(left, right) {
27
27
  }
28
28
 
29
29
  try {
30
- // P1 cutover: the worker spec is 28 routes. The committed contract is the
31
- // composition of fragments + that worker spec, not the worker dump itself.
30
+ // P1 cutover: the worker spec is 19 routes since v11.8.0 deleted nine that
31
+ // had no caller. The committed contract is the composition of fragments +
32
+ // that worker spec, not the worker dump itself.
32
33
  const workerSpec = join(tempRoot, "worker.json");
33
34
  runNode(join(repo, "scripts", "run_python.mjs"), [
34
35
  "scripts/export_openapi.py",
@@ -24,13 +24,14 @@ import { join } from "node:path";
24
24
  const API_DIR = "latticeai/api";
25
25
 
26
26
  // Routers whose user-facing details are in the message catalog. Append here
27
- // when a router is migrated — never remove. Module names carry no extension:
28
- // `check_legacy_debt.mjs` rejects a bare "<module>.py" literal in scripts/,
29
- // which is how the removed root shims used to be referenced.
27
+ // when a router is migrated. A name is removed only when the router itself is
28
+ // deleted — never to quiet a failure — and the loop below turns a stale name
29
+ // into an error rather than a skip, so the two cases cannot be confused.
30
+ // `tools` left this list in v11.8.0 with `latticeai/api/tools.py`, whose two
31
+ // routes had no caller anywhere in the tree.
30
32
  const LOCALIZED = [
31
33
  "agent_worker_seam",
32
34
  "models",
33
- "tools",
34
35
  "worker_compute",
35
36
  "worker_seams",
36
37
  ];
@@ -119,7 +119,8 @@ INTERNAL_WORKER_PATHS = frozenset(
119
119
  "/worker/render/pptx",
120
120
  "/worker/render/pdf",
121
121
  "/worker/asr",
122
- "/worker/multimodal/describe",
122
+ # ``/worker/multimodal/describe`` was here until v11.8.0 deleted the
123
+ # seam: it described an image for a native ingest nothing ever built.
123
124
  "/worker/extract",
124
125
  }
125
126
  )
@@ -3,9 +3,10 @@
3
3
 
4
4
  Until v11.6.0 this *was* the contract: it built the 464-route product app and
5
5
  wrote ``frontend/openapi.json``. WP-P1 deleted that app. The committed contract
6
- is unchanged (421 paths / 463 operations — clients still call all of them) but
7
- its source is now ``scripts/compose_openapi.py``, which reassembles the
8
- per-crate fragments in ``rust/fixtures/openapi/``.
6
+ kept describing every route clients call (421 paths / 463 operations through
7
+ v11.7.0; 413 / 455 since v11.8.0 removed eight routes nothing called) but its
8
+ source is now ``scripts/compose_openapi.py``, which reassembles the per-crate
9
+ fragments in ``rust/fixtures/openapi/``.
9
10
 
10
11
  What this script exports is the worker half, to a **scratch** path, so the
11
12
  composer can check it: every operation the worker serves must already be in
@@ -90,7 +91,7 @@ def isolated_runtime_environment(root: Path) -> Iterator[Mapping[str, str]]:
90
91
 
91
92
  def main() -> int:
92
93
  # No default of ``frontend/openapi.json``: that file is the composer's
93
- # output now, and silently overwriting it with the 28-route worker spec is
94
+ # output now, and silently overwriting it with the 19-route worker spec is
94
95
  # exactly the mistake this argument exists to prevent.
95
96
  if len(sys.argv) < 2:
96
97
  print(
@@ -10,10 +10,10 @@ time.
10
10
  Two spellings per route, because the two runtimes disagree about path syntax
11
11
  and only one of them can be the file's:
12
12
 
13
- * ``path`` is FastAPI's, converters included (``/models/switch/{model_id:path}``).
13
+ * ``path`` is FastAPI's, converters included (``/models/unload/{model_id:path}``).
14
14
  It is what ``APIRoute.path`` returns, so the Python side compares without
15
15
  normalisation.
16
- * ``axum`` is the same route as axum 0.7 spells it (``/models/switch/*model_id``).
16
+ * ``axum`` is the same route as axum 0.7 spells it (``/models/unload/*model_id``).
17
17
  A ``{name:path}`` converter matches slashes; a plain ``:name`` capture does
18
18
  not, so an id containing a ``/`` would 404 at the front door while working
19
19
  against the worker directly. WP-I5's ``greedy_path_params`` records the same
@@ -11,13 +11,15 @@
11
11
  "that stays in the Python AI worker and is the gateway's proxy allowlist.",
12
12
  "'greedy_path_params' records the FastAPI '{name:path}' converters the schema",
13
13
  "cannot show: those segments match slashes, so an axum port needs a wildcard",
14
- "('/*name' in axum 0.7) rather than a plain ':name' capture."
14
+ "('/*name' in axum 0.7) rather than a plain ':name' capture.",
15
+ "v11.8.0 deleted eight caller-less worker routes end-to-end; their entries",
16
+ "left this map, the committed spec and every fragment together."
15
17
  ],
16
18
  "source": {
17
19
  "spec": "frontend/openapi.json",
18
- "spec_version": "11.5.2",
19
- "paths": 421,
20
- "operations": 463,
20
+ "spec_version": "11.8.0",
21
+ "paths": 414,
22
+ "operations": 456,
21
23
  "classification": "scout_routes.md (v11.6.0 route inventory) + docs/v11.6.0_ONE_DOOR_PLAN.md",
22
24
  "module_attribution": "FastAPI route.endpoint.__module__ of the app built by scripts/export_openapi.py"
23
25
  },
@@ -56,7 +58,7 @@
56
58
  "wp": "R4",
57
59
  "target": "lattice-chat",
58
60
  "summary": "Chat orchestration, chat history and the agent-loop HTTP surface.",
59
- "operations": 11
61
+ "operations": 12
60
62
  },
61
63
  "memory_brain": {
62
64
  "wp": "R5",
@@ -97,8 +99,8 @@
97
99
  "worker_keep": {
98
100
  "wp": "\u2014",
99
101
  "target": "Python AI worker (proxy allowlist)",
100
- "summary": "The 25 KEEP_WORKER routes from scout_routes.md, the graph single-writer seam, and POST /engines/pull-model: the surface whose handler stays inside the Python worker's interpreter.",
101
- "operations": 27
102
+ "summary": "The surface whose handler stays inside the Python worker's interpreter: scout_routes.md's KEEP_WORKER set and the graph single-writer seam, less the eight caller-less routes v11.8.0 deleted end-to-end (embeddings providers, the two document-tool reads, the multimodal and voice-status probes, model switch/unload-all and engine pull-model).",
103
+ "operations": 19
102
104
  }
103
105
  },
104
106
  "greedy_path_params": {
@@ -114,8 +116,7 @@
114
116
  "GET /knowledge-graph/neighbors/{node_id}": "node_id",
115
117
  "GET /workspace/relationships/{node_id}": "node_id",
116
118
  "PATCH /admin/users/{email}": "email",
117
- "PATCH /agents/api/registry/{agent_id}": "agent_id",
118
- "POST /models/switch/{model_id}": "model_id"
119
+ "PATCH /agents/api/registry/{agent_id}": "agent_id"
119
120
  },
120
121
  "module_family": {
121
122
  "latticeai.api.admin": "admin",
@@ -167,10 +168,6 @@
167
168
  "latticeai.services.local_knowledge": "knowledge_search"
168
169
  },
169
170
  "overrides": {
170
- "DELETE /models/unload-all": {
171
- "family": "worker_keep",
172
- "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
173
- },
174
171
  "DELETE /models/unload/{model_id}": {
175
172
  "family": "worker_keep",
176
173
  "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
@@ -183,22 +180,10 @@
183
180
  "family": "ui_redirects",
184
181
  "reason": "scout_routes.md classifies this route STATIC: an SPA page shell the gateway answers (WP-I4)."
185
182
  },
186
- "GET /api/capture/voice/status": {
187
- "family": "worker_keep",
188
- "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
189
- },
190
- "GET /api/embeddings/providers": {
191
- "family": "worker_keep",
192
- "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
193
- },
194
183
  "GET /api/embeddings/status": {
195
184
  "family": "worker_keep",
196
185
  "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
197
186
  },
198
- "GET /api/ingestion/multimodal": {
199
- "family": "worker_keep",
200
- "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
201
- },
202
187
  "GET /graph": {
203
188
  "family": "ui_redirects",
204
189
  "reason": "scout_routes.md classifies this route STATIC: an SPA page shell the gateway answers (WP-I4)."
@@ -219,10 +204,6 @@
219
204
  "family": "ui_redirects",
220
205
  "reason": "scout_routes.md classifies this route STATIC: an SPA page shell the gateway answers (WP-I4)."
221
206
  },
222
- "GET /tools/pdf_pages": {
223
- "family": "worker_keep",
224
- "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
225
- },
226
207
  "GET /workflows": {
227
208
  "family": "ui_redirects",
228
209
  "reason": "scout_routes.md classifies this route STATIC: an SPA page shell the gateway answers (WP-I4)."
@@ -263,10 +244,6 @@
263
244
  "family": "worker_keep",
264
245
  "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
265
246
  },
266
- "POST /engines/pull-model": {
267
- "family": "worker_keep",
268
- "reason": "The pull itself is huggingface_hub / ollama running inside the worker's interpreter; the gateway proxies it rather than shipping a native 501 (v11.6.0 gateway integration \u00a74a)."
269
- },
270
247
  "POST /knowledge-graph/ingest": {
271
248
  "family": "worker_keep",
272
249
  "reason": "v11.6.0 plan, '\ucd5c\uc885 Python \uc6cc\ucee4 \ud45c\uba74': the graph single-writer seam stays with the worker even though scout_routes.md scores it PORT_ORCH."
@@ -275,10 +252,6 @@
275
252
  "family": "worker_keep",
276
253
  "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
277
254
  },
278
- "POST /models/switch/{model_id}": {
279
- "family": "worker_keep",
280
- "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
281
- },
282
255
  "POST /tools/create_docx": {
283
256
  "family": "worker_keep",
284
257
  "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
@@ -295,10 +268,6 @@
295
268
  "family": "worker_keep",
296
269
  "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
297
270
  },
298
- "POST /tools/read_document": {
299
- "family": "worker_keep",
300
- "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
301
- },
302
271
  "POST /upload/document": {
303
272
  "family": "worker_keep",
304
273
  "reason": "scout_routes.md classifies this route KEEP_WORKER (AI-worker box)."
@@ -345,10 +314,6 @@
345
314
  "module": "latticeai.api.mcp",
346
315
  "family": "mcp_market"
347
316
  },
348
- "DELETE /models/unload-all": {
349
- "module": "latticeai.api.models",
350
- "family": "worker_keep"
351
- },
352
317
  "DELETE /models/unload/{model_id}": {
353
318
  "module": "latticeai.api.models",
354
319
  "family": "worker_keep"
@@ -605,10 +570,6 @@
605
570
  "module": "latticeai.api.brain_intelligence",
606
571
  "family": "memory_brain"
607
572
  },
608
- "GET /api/capture/voice/status": {
609
- "module": "latticeai.api.voice_capture",
610
- "family": "worker_keep"
611
- },
612
573
  "GET /api/chronicle/as-of": {
613
574
  "module": "latticeai.api.chronicle",
614
575
  "family": "memory_brain"
@@ -621,6 +582,10 @@
621
582
  "module": "latticeai.api.chronicle",
622
583
  "family": "memory_brain"
623
584
  },
585
+ "GET /api/cloud/status": {
586
+ "module": "latticeai.api.chat",
587
+ "family": "chat"
588
+ },
624
589
  "GET /api/command/briefing": {
625
590
  "module": "latticeai.api.command_center",
626
591
  "family": "memory_brain"
@@ -629,10 +594,6 @@
629
594
  "module": "latticeai.api.command_center",
630
595
  "family": "memory_brain"
631
596
  },
632
- "GET /api/embeddings/providers": {
633
- "module": "latticeai.api.search",
634
- "family": "worker_keep"
635
- },
636
597
  "GET /api/embeddings/status": {
637
598
  "module": "latticeai.api.search",
638
599
  "family": "worker_keep"
@@ -685,10 +646,6 @@
685
646
  "module": "latticeai.api.local_files",
686
647
  "family": "knowledge_search"
687
648
  },
688
- "GET /api/ingestion/multimodal": {
689
- "module": "latticeai.api.local_files",
690
- "family": "worker_keep"
691
- },
692
649
  "GET /api/ingestion/watch": {
693
650
  "module": "latticeai.api.local_files",
694
651
  "family": "knowledge_search"
@@ -1129,10 +1086,6 @@
1129
1086
  "module": "latticeai.api.tools",
1130
1087
  "family": "mcp_market"
1131
1088
  },
1132
- "GET /tools/pdf_pages": {
1133
- "module": "latticeai.api.tools",
1134
- "family": "worker_keep"
1135
- },
1136
1089
  "GET /tools/permissions": {
1137
1090
  "module": "latticeai.api.tools",
1138
1091
  "family": "mcp_market"
@@ -1709,10 +1662,6 @@
1709
1662
  "module": "latticeai.api.models",
1710
1663
  "family": "worker_keep"
1711
1664
  },
1712
- "POST /engines/pull-model": {
1713
- "module": "latticeai.api.models",
1714
- "family": "worker_keep"
1715
- },
1716
1665
  "POST /engines/verify-cloud": {
1717
1666
  "module": "latticeai.api.models",
1718
1667
  "family": "models_misc"
@@ -1821,10 +1770,6 @@
1821
1770
  "module": "latticeai.api.models",
1822
1771
  "family": "worker_keep"
1823
1772
  },
1824
- "POST /models/switch/{model_id}": {
1825
- "module": "latticeai.api.models",
1826
- "family": "worker_keep"
1827
- },
1828
1773
  "POST /network/peers": {
1829
1774
  "module": "latticeai.api.network",
1830
1775
  "family": "portability_network"
@@ -1985,10 +1930,6 @@
1985
1930
  "module": "latticeai.api.tools",
1986
1931
  "family": "mcp_market"
1987
1932
  },
1988
- "POST /tools/read_document": {
1989
- "module": "latticeai.api.tools",
1990
- "family": "worker_keep"
1991
- },
1992
1933
  "POST /tools/read_file": {
1993
1934
  "module": "latticeai.api.tools",
1994
1935
  "family": "mcp_market"
@@ -20,7 +20,95 @@
20
20
  "whole-image delta: naming where the change is makes the claim more",
21
21
  "specific, not less."
22
22
  ],
23
-
23
+ "11.9.0": {
24
+ "_why": [
25
+ "Working Order is a backend-truth release. The product work is live",
26
+ "routes, hybrid cloud wiring, MCP, the 2B parse chain, and chat file",
27
+ "generation — none of that is a screen redesign.",
28
+ "",
29
+ "The SPA did gain CloudAnswerChip, CloudBoundaryHint, and a System-panel",
30
+ "cloud-status row. All three are conditional and stay off the capture",
31
+ "fixture: the mock server's network-boundary default is local_only",
32
+ "(allows_cloud: false), CloudBoundaryHint and the status row only render",
33
+ "inside that allows_cloud block, and CloudAnswerChip only mounts on a",
34
+ "cloud-answered message that 04-brain-chat-home does not have. Claiming",
35
+ "04 or 08 would fail the pixel gate when the pixels do not move.",
36
+ "",
37
+ "Empty claim set on purpose. Unclaimed screens are still measured and",
38
+ "printed; they are not gated. Do not guess-claim after the first capture."
39
+ ]
40
+ },
41
+ "11.8.0": {
42
+ "_why": [
43
+ "Travel Light changes two things on screen, and only two.",
44
+ "",
45
+ "1. Brain Chat home is redesigned end to end: the chat composer becomes",
46
+ " the hero, the Living Brain grows about 3x (60px → 179px at 1440) and",
47
+ " accretes gold/jade growth rings with a '기억이 자라고 있어요' caption",
48
+ " tied to readiness, the page becomes a full-canvas grid (brain left,",
49
+ " composer + starter pills centre, suggestion panel right) and a floor",
50
+ " continuity bar carries 지난 대화 · 현황 · 기억 지도 · 기능. Everything",
51
+ " inside the shell is repainted.",
52
+ "",
53
+ "2. The Living Brain organism's palette is harmonised to ink + jade +",
54
+ " gold: the right-lobe, bridge and stem gradients, the orbit ring and",
55
+ " the right-lobe stroke move off --connection/--knowledge and onto",
56
+ " --primary/--memory/--brain-core/--brain-halo. That reaches every",
57
+ " screen that draws the organism — the three onboarding steps as well",
58
+ " as home.",
59
+ "",
60
+ "Nothing else in the release is visual: CI gates, Rust lint headers,",
61
+ "golden trimming, dead-code deletion and nine caller-less routes leaving",
62
+ "the worker. 05-13 are expected not to move and stay unclaimed.",
63
+ "",
64
+ "Why 01/02/03 are gated so low, honestly. Since 11.5.0 the organism on",
65
+ "those steps is 104px ('.ritual-brain[data-scale=\"mark\"]'), about 0.8%",
66
+ "of a 1440x920 full-page shot; recolouring roughly half of its drawn",
67
+ "pixels is ~0.3% of the image. That is under the 1.5% static floor and",
68
+ "nowhere near the 8% live floor those screens carry by default, so the",
69
+ "honest floor is a fraction of a percent — not because the gate is being",
70
+ "loosened, but because a 104px mark is all that changed there. The",
71
+ "numbers below sit under that estimate on purpose: the first capture has",
72
+ "not happened yet. Once it has, tighten them to just under the measured",
73
+ "deltas, or better, replace them with a 'region' box around the organism",
74
+ "— the box differs per step, because ritual-shell centres content of",
75
+ "three different heights, which is why one is not guessed here.",
76
+ "",
77
+ "Also worth stating plainly: the organism animates. On these three",
78
+ "screens a whole-image pixel gate cannot fully separate 'recoloured'",
79
+ "from 'caught at a different animation phase'. The load-bearing evidence",
80
+ "for the palette is the CSS/SVG diff and the component tests; this gate",
81
+ "only proves the screens are not byte-identical.",
82
+ "",
83
+ "05-memory-graph moved 2.96% in the first capture — the organism palette",
84
+ "harmonisation reaches the graph screen's brain marker/tokens too, so it",
85
+ "is claimed at the static default rather than left as an unclaimed drift."
86
+ ],
87
+ "01-login.png": {
88
+ "min_pct": 0.2
89
+ },
90
+ "02-recommended-models.png": {
91
+ "min_pct": 0.2
92
+ },
93
+ "03-install-load-progress.png": {
94
+ "min_pct": 0.2
95
+ },
96
+ "04-brain-chat-home.png": {
97
+ "_why": [
98
+ "The redesign itself. Full-canvas grid, 3x brain with growth rings, a",
99
+ "new right-hand suggestion panel and the floor continuity bar: every",
100
+ "region inside the shell is repainted, so this is gated far above both",
101
+ "the 1.5% static floor and the 8% live-animation floor it would",
102
+ "otherwise get. 25% is a floor, not a prediction — a shell-preserving",
103
+ "full-page redesign should land well above it. Tighten it to just",
104
+ "under the measured delta after the first capture."
105
+ ],
106
+ "min_pct": 25.0
107
+ },
108
+ "05-memory-graph.png": {
109
+ "min_pct": 1.5
110
+ }
111
+ },
24
112
  "11.7.0": {
25
113
  "_why": [
26
114
  "Full visual redesign of the SPA. Tokens gained a surface ladder,",
@@ -30,8 +118,12 @@
30
118
  "conversation and onboarding restyle against that language; every",
31
119
  "captured screen inherits the new field, type, and shadow."
32
120
  ],
33
- "01-login.png": { "min_pct": 1.5 },
34
- "02-recommended-models.png": { "min_pct": 1.5 },
121
+ "01-login.png": {
122
+ "min_pct": 1.5
123
+ },
124
+ "02-recommended-models.png": {
125
+ "min_pct": 1.5
126
+ },
35
127
  "03-install-load-progress.png": {
36
128
  "_why": [
37
129
  "Onboarding progress chrome inherited the Clean Sweep tokens/type.",
@@ -42,18 +134,37 @@
42
134
  ],
43
135
  "min_pct": 1.5
44
136
  },
45
- "04-brain-chat-home.png": { "min_pct": 8.0 },
46
- "05-memory-graph.png": { "min_pct": 1.5 },
47
- "06-capture.png": { "min_pct": 1.5 },
48
- "07-model-library.png": { "min_pct": 1.5 },
49
- "08-system.png": { "min_pct": 1.5 },
50
- "09-automation-runs.png": { "min_pct": 1.5 },
51
- "10-admin-console.png": { "min_pct": 1.5 },
52
- "11-knowledge-journey.png": { "min_pct": 1.5 },
53
- "12-review-center.png": { "min_pct": 1.5 },
54
- "13-chronicle.png": { "min_pct": 1.5 }
137
+ "04-brain-chat-home.png": {
138
+ "min_pct": 8.0
139
+ },
140
+ "05-memory-graph.png": {
141
+ "min_pct": 1.5
142
+ },
143
+ "06-capture.png": {
144
+ "min_pct": 1.5
145
+ },
146
+ "07-model-library.png": {
147
+ "min_pct": 1.5
148
+ },
149
+ "08-system.png": {
150
+ "min_pct": 1.5
151
+ },
152
+ "09-automation-runs.png": {
153
+ "min_pct": 1.5
154
+ },
155
+ "10-admin-console.png": {
156
+ "min_pct": 1.5
157
+ },
158
+ "11-knowledge-journey.png": {
159
+ "min_pct": 1.5
160
+ },
161
+ "12-review-center.png": {
162
+ "min_pct": 1.5
163
+ },
164
+ "13-chronicle.png": {
165
+ "min_pct": 1.5
166
+ }
55
167
  },
56
-
57
168
  "11.6.0": {
58
169
  "_why": [
59
170
  "One Door release: the product server moved from Python/FastAPI to the",
@@ -74,7 +185,6 @@
74
185
  "cytoscape layout (11.3.0-11.5.2 observed)."
75
186
  ]
76
187
  },
77
-
78
188
  "11.5.2": {
79
189
  "_why": [
80
190
  "Tight Ship release: deletions, consolidation and front-door fixes —",
@@ -84,7 +194,6 @@
84
194
  "cytoscape layout (11.3.0-11.5.1 observed)."
85
195
  ]
86
196
  },
87
-
88
197
  "11.5.1": {
89
198
  "_why": [
90
199
  "Rust Full Loop release: agent-loop orchestrator port, worker seams,",
@@ -94,7 +203,6 @@
94
203
  "between captures from the cytoscape layout (11.3.0-11.5.0 observed)."
95
204
  ]
96
205
  },
97
-
98
206
  "11.5.0": {
99
207
  "_why": [
100
208
  "Rust Complete release: backend/desktop-topology architecture only",
@@ -105,7 +213,6 @@
105
213
  "11.3.0 and 11.4.0 with zero source change)."
106
214
  ]
107
215
  },
108
-
109
216
  "11.4.0": {
110
217
  "_why": [
111
218
  "Rust Foundation release: backend architecture only (rust/ workspace,",
@@ -116,7 +223,6 @@
116
223
  "cytoscape layout, with zero source change (also observed at 11.3.0)."
117
224
  ]
118
225
  },
119
-
120
226
  "11.3.0": {
121
227
  "_why": [
122
228
  "Chronicle release. 13-chronicle.png is NEW this release (no baseline",
@@ -132,7 +238,6 @@
132
238
  "min_pct": 1.5
133
239
  }
134
240
  },
135
-
136
241
  "11.2.0": {
137
242
  "04-brain-chat-home.png": {
138
243
  "_why": [
@@ -141,11 +246,15 @@
141
246
  "noise threshold (8%) may exceed it, so the screen is claimed with the",
142
247
  "rail region only."
143
248
  ],
144
- "region": [0.0, 0.25, 0.12, 0.85],
249
+ "region": [
250
+ 0.0,
251
+ 0.25,
252
+ 0.12,
253
+ 0.85
254
+ ],
145
255
  "min_pct": 0.5
146
256
  }
147
257
  },
148
-
149
258
  "11.1.0": {
150
259
  "_why": [
151
260
  "Feature release with no intentional change to the twelve captured",
@@ -154,7 +263,6 @@
154
263
  "All twelve measured but not gated."
155
264
  ]
156
265
  },
157
-
158
266
  "11.0.1": {
159
267
  "_why": [
160
268
  "Defect-fix and branch-coverage release: no intentional UI change.",
@@ -162,7 +270,6 @@
162
270
  "gated. Visible pixels may drift only where the version renders."
163
271
  ]
164
272
  },
165
-
166
273
  "11.0.0": {
167
274
  "_why": [
168
275
  "A verification-and-docs release: Python coverage 72.80% -> 100.00%",
@@ -171,14 +278,12 @@
171
278
  "where the version string renders."
172
279
  ]
173
280
  },
174
-
175
281
  "10.8.0": {
176
282
  "04-brain-chat-home.png": {
177
283
  "_why": "Elevated brain-chat-home visual layout with glassmorphic station card, ambient radial mesh aura, gradient title, glowing dot prompt cards, and refined toolbar styling.",
178
284
  "min_pct": 1.5
179
285
  }
180
286
  },
181
-
182
287
  "10.10.0": {
183
288
  "04-brain-chat-home.png": {
184
289
  "_why": [
@@ -192,7 +297,6 @@
192
297
  "min_pct": 3.0
193
298
  }
194
299
  },
195
-
196
300
  "10.9.0": {
197
301
  "_why": [
198
302
  "This release claims no screen redesign, and the empty claim is the",