ltcai 11.7.0 → 12.0.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 (174) hide show
  1. package/README.md +100 -76
  2. package/docs/BENCHMARKS.md +9 -2
  3. package/docs/CHANGELOG.md +249 -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 +271 -103
  7. package/docs/ENTERPRISE.md +1 -1
  8. package/docs/LEGACY_COMPATIBILITY.md +10 -6
  9. package/docs/MULTI_AGENT_RUNTIME.md +4 -4
  10. package/docs/ONBOARDING.md +16 -4
  11. package/docs/OPERATIONS.md +14 -1
  12. package/docs/PERMISSION_MODE.md +14 -9
  13. package/docs/REALTIME_COLLABORATION.md +1 -1
  14. package/docs/ROADMAP.md +113 -0
  15. package/docs/TRUST_MODEL.md +28 -7
  16. package/docs/USABILITY_AUDIT.md +5 -0
  17. package/docs/WHY_LATTICE.md +13 -5
  18. package/docs/WORKFLOW_DESIGNER.md +2 -2
  19. package/docs/kg-schema.md +57 -7
  20. package/docs/mcp-tools.md +93 -82
  21. package/docs/security-model.md +6 -3
  22. package/lattice_brain/__init__.py +1 -1
  23. package/lattice_brain/graph/_kg_common/__init__.py +1 -54
  24. package/lattice_brain/graph/_kg_common/extraction.py +459 -105
  25. package/lattice_brain/graph/_kg_common/normalize.py +305 -0
  26. package/lattice_brain/graph/_kg_common/patterns.py +275 -0
  27. package/lattice_brain/graph/_kg_common/relations.py +12 -3
  28. package/lattice_brain/graph/_kg_common/sections.py +107 -0
  29. package/lattice_brain/graph/_kg_common/text.py +14 -450
  30. package/lattice_brain/graph/_kg_constants.py +7 -0
  31. package/lattice_brain/ingestion/__init__.py +6 -3
  32. package/lattice_brain/multimodal/__init__.py +9 -3
  33. package/latticeai/__init__.py +1 -1
  34. package/latticeai/api/agent_worker_seam.py +44 -1
  35. package/latticeai/api/models.py +18 -110
  36. package/latticeai/api/search.py +7 -30
  37. package/latticeai/api/worker_compute.py +127 -106
  38. package/latticeai/api/worker_seams.py +17 -2
  39. package/latticeai/core/embedding_providers/__init__.py +16 -0
  40. package/latticeai/core/embedding_providers/autodetect.py +302 -0
  41. package/latticeai/core/embedding_providers/base.py +25 -0
  42. package/latticeai/core/embedding_providers/profiles.py +44 -0
  43. package/latticeai/core/embedding_providers/text.py +74 -8
  44. package/latticeai/core/http_origin.py +3 -3
  45. package/latticeai/core/messages.py +0 -5
  46. package/latticeai/core/policy.py +1 -6
  47. package/latticeai/core/quiet.py +1 -20
  48. package/latticeai/core/security.py +29 -83
  49. package/latticeai/core/sessions.py +95 -4
  50. package/latticeai/core/users.py +0 -38
  51. package/latticeai/core/vector_index/__init__.py +61 -0
  52. package/latticeai/core/vector_index/hnsw.py +383 -0
  53. package/latticeai/core/vector_index/sidecar.py +329 -0
  54. package/latticeai/models/router/catalog.py +2 -2
  55. package/latticeai/models/router/generation.py +176 -30
  56. package/latticeai/models/router/loading.py +150 -9
  57. package/latticeai/runtime/access_runtime.py +7 -4
  58. package/latticeai/runtime/brain_runtime.py +43 -9
  59. package/latticeai/runtime/build_phases/features.py +8 -31
  60. package/latticeai/runtime/build_phases/foundation.py +7 -16
  61. package/latticeai/runtime/build_phases/web.py +3 -3
  62. package/latticeai/runtime/build_phases/worker_profile.py +29 -27
  63. package/latticeai/runtime/runtime_context.py +0 -2
  64. package/latticeai/services/architecture_readiness.py +18 -19
  65. package/latticeai/services/process_audit.py +1 -22
  66. package/latticeai/services/product_readiness.py +39 -12
  67. package/latticeai/services/search_service.py +7 -0
  68. package/latticeai/services/voice_capture.py +8 -28
  69. package/latticeai/tools/__init__.py +12 -47
  70. package/latticeai/tools/commands.py +9 -15
  71. package/latticeai/tools/documents.py +12 -0
  72. package/latticeai/tools/knowledge.py +0 -6
  73. package/latticeai/tools/markup.py +152 -0
  74. package/package.json +4 -5
  75. package/requirements.txt +0 -1
  76. package/scripts/check_current_release_docs.mjs +1 -1
  77. package/scripts/check_openapi_drift.mjs +3 -2
  78. package/scripts/check_server_i18n.mjs +5 -4
  79. package/scripts/compose_openapi.py +4 -1
  80. package/scripts/export_openapi.py +5 -4
  81. package/scripts/gen_worker_allowlist_fixture.py +2 -2
  82. package/scripts/openapi_route_families.json +19 -74
  83. package/scripts/publish_release.mjs +157 -0
  84. package/scripts/release_screen_claims.json +144 -28
  85. package/src-tauri/Cargo.lock +45 -10
  86. package/src-tauri/Cargo.toml +1 -1
  87. package/src-tauri/tauri.conf.json +1 -1
  88. package/static/app/asset-manifest.json +47 -41
  89. package/static/app/assets/Act-Cf1L2709.js +2 -0
  90. package/static/app/assets/AdminConsole-DPAbLTYV.js +1 -0
  91. package/static/app/assets/Brain-DqamGrj-.js +2 -0
  92. package/static/app/assets/BrainHome-MHe2_RYs.js +2 -0
  93. package/static/app/assets/BrainSignals-CQPPfyyH.js +1 -0
  94. package/static/app/assets/Capture-DGdIH_Zc.js +1 -0
  95. package/static/app/assets/Chronicle-C-UlCJoJ.js +1 -0
  96. package/static/app/assets/CommandPalette-WNT4EqUX.js +1 -0
  97. package/static/app/assets/DigitalBrainExplorer-CEBH5Cwc.js +321 -0
  98. package/static/app/assets/Library-C6xd1dlf.js +1 -0
  99. package/static/app/assets/LivingBrain-BEk-0ohw.js +1 -0
  100. package/static/app/assets/ProductFlow-CZLm5iXh.js +1 -0
  101. package/static/app/assets/QueryClientProvider-B3OjqSyJ.js +1 -0
  102. package/static/app/assets/{ReviewCard-HXRle3qq.js → ReviewCard-CEHG6evf.js} +2 -2
  103. package/static/app/assets/RunsListPanel-CLtEJSRW.js +1 -0
  104. package/static/app/assets/System-CAxwBUXw.js +1 -0
  105. package/static/app/assets/WorkflowGraph-Dj10RuGE.js +1 -0
  106. package/static/app/assets/WorkflowsPanel-Kyeh_LIT.js +2 -0
  107. package/static/app/assets/actHelpers-CtSmK9Dw.js +1 -0
  108. package/static/app/assets/arrow-left-CRl5EO4D.js +1 -0
  109. package/static/app/assets/{bot-Cn8bWRuq.js → bot-DhUGRel2.js} +1 -1
  110. package/static/app/assets/brain-CLkhHsHF.js +1 -0
  111. package/static/app/assets/button-CmaEqG1T.js +1 -0
  112. package/static/app/assets/circle-check-CFgejkOS.js +1 -0
  113. package/static/app/assets/{circle-pause-CmzC_apg.js → circle-pause-l96izbxj.js} +1 -1
  114. package/static/app/assets/{circle-play-D8mW2aQ7.js → circle-play-CrZa25_q.js} +1 -1
  115. package/static/app/assets/{cpu-DZcdd0PZ.js → cpu-BaXudqwl.js} +1 -1
  116. package/static/app/assets/{download-bv1KEPGQ.js → download-hCVFPiyc.js} +1 -1
  117. package/static/app/assets/{folder-open-d-Pip5gr.js → folder-open-CHL82Yp7.js} +1 -1
  118. package/static/app/assets/{hard-drive-D20iavUb.js → hard-drive-DDzET7lk.js} +1 -1
  119. package/static/app/assets/index-CB93CZWW.css +2 -0
  120. package/static/app/assets/index-D2H-wSl6.js +13 -0
  121. package/static/app/assets/input-Df1CAY_I.js +1 -0
  122. package/static/app/assets/jsx-runtime-bzQ4Vb5N.js +1 -0
  123. package/static/app/assets/{link-2-BPJOFlAy.js → link-2-xNnTIX1_.js} +1 -1
  124. package/static/app/assets/{permissionCopy-ChdJd493.js → permissionCopy-D3aWHco-.js} +1 -1
  125. package/static/app/assets/primitives-BioD2slS.js +1 -0
  126. package/static/app/assets/search-BzBw8YcW.js +1 -0
  127. package/static/app/assets/{share-2-YNX_NtMU.js → share-2-FkzGf8Df.js} +1 -1
  128. package/static/app/assets/{shield-alert-DuQ3zrVL.js → shield-alert-B3dwzik4.js} +1 -1
  129. package/static/app/assets/sourceMeta-DQSY_tah.js +1 -0
  130. package/static/app/assets/textarea-P8o6pvOP.js +1 -0
  131. package/static/app/assets/useFocusTrap-hswOIkXE.js +1 -0
  132. package/static/app/assets/useMutation-OJLrYSRA.js +1 -0
  133. package/static/app/assets/workspace-BCuk3Ku9.js +1 -0
  134. package/static/app/index.html +4 -4
  135. package/static/sw.js +1 -1
  136. package/lattice_brain/ingestion/pipeline.py +0 -108
  137. package/latticeai/api/local_files.py +0 -44
  138. package/latticeai/api/tools.py +0 -126
  139. package/latticeai/api/voice_capture.py +0 -32
  140. package/latticeai/core/agent_permission.py +0 -85
  141. package/scripts/agent_eval.py +0 -34
  142. package/scripts/brain_quality_eval.py +0 -37
  143. package/scripts/check_legacy_debt.mjs +0 -91
  144. package/scripts/check_python.py +0 -100
  145. package/scripts/chunking_parity_corpus.py +0 -449
  146. package/scripts/generate_agent_parity_fixtures.py +0 -771
  147. package/scripts/generate_chunking_parity_fixtures.py +0 -259
  148. package/static/app/assets/Act-BPcVAbOL.js +0 -1
  149. package/static/app/assets/AdminConsole-Bw1ATQL0.js +0 -1
  150. package/static/app/assets/Brain-CT92Kos0.js +0 -321
  151. package/static/app/assets/BrainHome-CFBkt1K_.js +0 -2
  152. package/static/app/assets/BrainSignals-ReLWF2H8.js +0 -1
  153. package/static/app/assets/Capture-BsTokYkk.js +0 -1
  154. package/static/app/assets/Chronicle-B6f0T9id.js +0 -1
  155. package/static/app/assets/CommandPalette-CuvjTv1u.js +0 -1
  156. package/static/app/assets/Library-BGJbG9Hd.js +0 -1
  157. package/static/app/assets/LivingBrain-DGYK_Jsa.js +0 -1
  158. package/static/app/assets/ProductFlow-DXBC6brE.js +0 -1
  159. package/static/app/assets/System-CMHSO9qM.js +0 -1
  160. package/static/app/assets/arrow-left-BfmkskWx.js +0 -1
  161. package/static/app/assets/brain-CQJberbE.js +0 -1
  162. package/static/app/assets/button-Ct9f2_oT.js +0 -1
  163. package/static/app/assets/circle-check-DruOxB-4.js +0 -1
  164. package/static/app/assets/index-D9x-kSNy.css +0 -2
  165. package/static/app/assets/index-Do83hDzJ.js +0 -10
  166. package/static/app/assets/input-BLXVNmj1.js +0 -1
  167. package/static/app/assets/primitives-Cv5tbZBY.js +0 -1
  168. package/static/app/assets/search-CT9aho2j.js +0 -1
  169. package/static/app/assets/textarea-DqwLnli4.js +0 -1
  170. package/static/app/assets/useFocusTrap-ZVI98jaW.js +0 -1
  171. package/static/app/assets/useMutation-CVC4qv_D.js +0 -1
  172. package/static/app/assets/useQuery-C7BeG4HU.js +0 -1
  173. package/static/app/assets/utils-CiFtIdZq.js +0 -4
  174. package/static/app/assets/workspace-DQz9vIId.js +0 -1
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ // One-command publish for a built release: npm, PyPI, VS Code Marketplace, OpenVSX.
3
+ //
4
+ // node scripts/publish_release.mjs # publish every target not yet at this version
5
+ // node scripts/publish_release.mjs --dry-run # report what would happen, publish nothing
6
+ //
7
+ // Run it from anywhere — the script cd's to the repo root itself. It publishes the
8
+ // artifacts `npm run release:artifacts` already built and never rebuilds them.
9
+ // Each registry is checked first, so re-running after a partial failure only
10
+ // retries what is actually missing.
11
+ //
12
+ // Credentials (never passed as argv — argv leaks into shell history and npm logs):
13
+ // npm — `npm login` session;每 publish마다 브라우저 2FA 승인이 뜬다.
14
+ // PyPI — ~/.pypirc, TWINE_USERNAME/TWINE_PASSWORD, or interactive prompt.
15
+ // Marketplace — VSCE_PAT environment variable.
16
+ // OpenVSX — OVSX_PAT environment variable.
17
+ import { spawnSync } from "node:child_process";
18
+ import { existsSync, readFileSync } from "node:fs";
19
+ import path from "node:path";
20
+ import { fileURLToPath } from "node:url";
21
+
22
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
23
+ process.chdir(ROOT);
24
+
25
+ const DRY = process.argv.includes("--dry-run");
26
+ const pkg = JSON.parse(readFileSync(path.join(ROOT, "package.json"), "utf8"));
27
+ const V = pkg.version;
28
+ const PUBLISHER = JSON.parse(
29
+ readFileSync(path.join(ROOT, "vscode-extension", "package.json"), "utf8"),
30
+ ).publisher;
31
+
32
+ const TGZ = path.join(ROOT, `ltcai-${V}.tgz`);
33
+ const WHEEL = path.join(ROOT, "dist", `ltcai-${V}-py3-none-any.whl`);
34
+ const SDIST = path.join(ROOT, "dist", `ltcai-${V}.tar.gz`);
35
+ const VSIX = path.join(ROOT, "dist", `ltcai-${V}.vsix`);
36
+
37
+ function run(cmd, args, env = {}) {
38
+ const r = spawnSync(cmd, args, {
39
+ stdio: "inherit",
40
+ cwd: ROOT,
41
+ env: { ...process.env, ...env },
42
+ });
43
+ return r.status === 0;
44
+ }
45
+
46
+ async function json(url, init) {
47
+ try {
48
+ const res = await fetch(url, init);
49
+ if (!res.ok) return null;
50
+ return await res.json();
51
+ } catch {
52
+ return null;
53
+ }
54
+ }
55
+
56
+ const checks = {
57
+ async npm() {
58
+ const d = await json(`https://registry.npmjs.org/ltcai/${V}`);
59
+ return d?.version === V;
60
+ },
61
+ async pypi() {
62
+ return (await json(`https://pypi.org/pypi/ltcai/${V}/json`)) !== null;
63
+ },
64
+ async marketplace() {
65
+ const d = await json(
66
+ "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery",
67
+ {
68
+ method: "POST",
69
+ headers: {
70
+ "Content-Type": "application/json",
71
+ Accept: "application/json;api-version=3.0-preview.1",
72
+ },
73
+ body: JSON.stringify({
74
+ filters: [{ criteria: [{ filterType: 7, value: `${PUBLISHER}.ltcai` }] }],
75
+ flags: 1,
76
+ }),
77
+ },
78
+ );
79
+ const ext = d?.results?.[0]?.extensions?.[0];
80
+ return ext?.versions?.some((x) => x.version === V) ?? false;
81
+ },
82
+ async openvsx() {
83
+ return (await json(`https://open-vsx.org/api/${PUBLISHER}/ltcai/${V}`)) !== null;
84
+ },
85
+ };
86
+
87
+ const targets = [
88
+ {
89
+ name: "npm",
90
+ artifacts: [TGZ],
91
+ credsMissing: () => null, // npm prompts its own browser 2FA
92
+ publish: () => run("npm", ["publish", TGZ]),
93
+ note: "브라우저 2FA 승인 창이 뜨면 승인해야 완료됩니다.",
94
+ },
95
+ {
96
+ name: "pypi",
97
+ artifacts: [SDIST, WHEEL],
98
+ credsMissing: () => null, // twine falls back to ~/.pypirc or an interactive prompt
99
+ publish: () =>
100
+ run("node", [
101
+ "scripts/run_python.mjs",
102
+ "-m",
103
+ "twine",
104
+ "upload",
105
+ "--skip-existing",
106
+ SDIST,
107
+ WHEEL,
108
+ ]),
109
+ },
110
+ {
111
+ name: "marketplace",
112
+ artifacts: [VSIX],
113
+ credsMissing: () => (process.env.VSCE_PAT ? null : "VSCE_PAT 환경변수가 필요합니다"),
114
+ publish: () => run("npx", ["--yes", "@vscode/vsce", "publish", "--packagePath", VSIX]),
115
+ note: "게시 후 마켓플레이스 검증에 몇 분 걸릴 수 있습니다.",
116
+ },
117
+ {
118
+ name: "openvsx",
119
+ artifacts: [VSIX],
120
+ credsMissing: () => (process.env.OVSX_PAT ? null : "OVSX_PAT 환경변수가 필요합니다"),
121
+ publish: () => run("npx", ["--yes", "ovsx", "publish", VSIX]),
122
+ },
123
+ ];
124
+
125
+ const results = [];
126
+ for (const t of targets) {
127
+ const already = await checks[t.name]();
128
+ if (already) {
129
+ results.push([t.name, "already-published"]);
130
+ continue;
131
+ }
132
+ const missing = t.artifacts.filter((a) => !existsSync(a));
133
+ if (missing.length) {
134
+ results.push([t.name, `artifact missing: ${missing.map((m) => path.basename(m)).join(", ")}`]);
135
+ continue;
136
+ }
137
+ const creds = t.credsMissing();
138
+ if (creds) {
139
+ results.push([t.name, `skipped: ${creds}`]);
140
+ continue;
141
+ }
142
+ if (DRY) {
143
+ results.push([t.name, "would publish"]);
144
+ continue;
145
+ }
146
+ if (t.note) console.log(`\n[${t.name}] ${t.note}`);
147
+ console.log(`[${t.name}] publishing v${V}…`);
148
+ results.push([t.name, t.publish() ? "published" : "FAILED"]);
149
+ }
150
+
151
+ console.log(`\n=== publish report — ltcai v${V} ===`);
152
+ for (const [name, status] of results) console.log(` ${name.padEnd(12)} ${status}`);
153
+
154
+ const bad = results.filter(
155
+ ([, s]) => s === "FAILED" || s.startsWith("artifact missing") || s.startsWith("skipped"),
156
+ );
157
+ process.exit(bad.length ? 1 : 0);
@@ -20,7 +20,107 @@
20
20
  "whole-image delta: naming where the change is makes the claim more",
21
21
  "specific, not less."
22
22
  ],
23
-
23
+ "12.0.0": {
24
+ "_why": [
25
+ "Open House brings component and resilience updates across the frontend:",
26
+ "FolderMemoryHealth gained the 「삭제된 파일 정리 (N)」 button + preview dialog,",
27
+ "error boundaries added around views, preview pattern extended, and code",
28
+ "splitting (lazy view chunks).",
29
+ "",
30
+ "Brain/Chat home is unchanged since 11.8.0. Screens not touched are claimed",
31
+ "unchanged. The prune button renders conditionally and preview is user-triggered,",
32
+ "so static baseline captures remain unchanged. Empty claim set on purpose."
33
+ ]
34
+ },
35
+ "11.9.0": {
36
+ "_why": [
37
+ "Working Order is a backend-truth release. The product work is live",
38
+ "routes, hybrid cloud wiring, MCP, the 2B parse chain, and chat file",
39
+ "generation — none of that is a screen redesign.",
40
+ "",
41
+ "The SPA did gain CloudAnswerChip, CloudBoundaryHint, and a System-panel",
42
+ "cloud-status row. All three are conditional and stay off the capture",
43
+ "fixture: the mock server's network-boundary default is local_only",
44
+ "(allows_cloud: false), CloudBoundaryHint and the status row only render",
45
+ "inside that allows_cloud block, and CloudAnswerChip only mounts on a",
46
+ "cloud-answered message that 04-brain-chat-home does not have. Claiming",
47
+ "04 or 08 would fail the pixel gate when the pixels do not move.",
48
+ "",
49
+ "Empty claim set on purpose. Unclaimed screens are still measured and",
50
+ "printed; they are not gated. Do not guess-claim after the first capture."
51
+ ]
52
+ },
53
+ "11.8.0": {
54
+ "_why": [
55
+ "Travel Light changes two things on screen, and only two.",
56
+ "",
57
+ "1. Brain Chat home is redesigned end to end: the chat composer becomes",
58
+ " the hero, the Living Brain grows about 3x (60px → 179px at 1440) and",
59
+ " accretes gold/jade growth rings with a '기억이 자라고 있어요' caption",
60
+ " tied to readiness, the page becomes a full-canvas grid (brain left,",
61
+ " composer + starter pills centre, suggestion panel right) and a floor",
62
+ " continuity bar carries 지난 대화 · 현황 · 기억 지도 · 기능. Everything",
63
+ " inside the shell is repainted.",
64
+ "",
65
+ "2. The Living Brain organism's palette is harmonised to ink + jade +",
66
+ " gold: the right-lobe, bridge and stem gradients, the orbit ring and",
67
+ " the right-lobe stroke move off --connection/--knowledge and onto",
68
+ " --primary/--memory/--brain-core/--brain-halo. That reaches every",
69
+ " screen that draws the organism — the three onboarding steps as well",
70
+ " as home.",
71
+ "",
72
+ "Nothing else in the release is visual: CI gates, Rust lint headers,",
73
+ "golden trimming, dead-code deletion and nine caller-less routes leaving",
74
+ "the worker. 05-13 are expected not to move and stay unclaimed.",
75
+ "",
76
+ "Why 01/02/03 are gated so low, honestly. Since 11.5.0 the organism on",
77
+ "those steps is 104px ('.ritual-brain[data-scale=\"mark\"]'), about 0.8%",
78
+ "of a 1440x920 full-page shot; recolouring roughly half of its drawn",
79
+ "pixels is ~0.3% of the image. That is under the 1.5% static floor and",
80
+ "nowhere near the 8% live floor those screens carry by default, so the",
81
+ "honest floor is a fraction of a percent — not because the gate is being",
82
+ "loosened, but because a 104px mark is all that changed there. The",
83
+ "numbers below sit under that estimate on purpose: the first capture has",
84
+ "not happened yet. Once it has, tighten them to just under the measured",
85
+ "deltas, or better, replace them with a 'region' box around the organism",
86
+ "— the box differs per step, because ritual-shell centres content of",
87
+ "three different heights, which is why one is not guessed here.",
88
+ "",
89
+ "Also worth stating plainly: the organism animates. On these three",
90
+ "screens a whole-image pixel gate cannot fully separate 'recoloured'",
91
+ "from 'caught at a different animation phase'. The load-bearing evidence",
92
+ "for the palette is the CSS/SVG diff and the component tests; this gate",
93
+ "only proves the screens are not byte-identical.",
94
+ "",
95
+ "05-memory-graph moved 2.96% in the first capture — the organism palette",
96
+ "harmonisation reaches the graph screen's brain marker/tokens too, so it",
97
+ "is claimed at the static default rather than left as an unclaimed drift."
98
+ ],
99
+ "01-login.png": {
100
+ "min_pct": 0.2
101
+ },
102
+ "02-recommended-models.png": {
103
+ "min_pct": 0.2
104
+ },
105
+ "03-install-load-progress.png": {
106
+ "min_pct": 0.2
107
+ },
108
+ "04-brain-chat-home.png": {
109
+ "_why": [
110
+ "The redesign itself. Full-canvas grid, 3x brain with growth rings, a",
111
+ "new right-hand suggestion panel and the floor continuity bar: every",
112
+ "region inside the shell is repainted, so this is gated far above both",
113
+ "the 1.5% static floor and the 8% live-animation floor it would",
114
+ "otherwise get. 25% is a floor, not a prediction — a shell-preserving",
115
+ "full-page redesign should land well above it. Tighten it to just",
116
+ "under the measured delta after the first capture."
117
+ ],
118
+ "min_pct": 25.0
119
+ },
120
+ "05-memory-graph.png": {
121
+ "min_pct": 1.5
122
+ }
123
+ },
24
124
  "11.7.0": {
25
125
  "_why": [
26
126
  "Full visual redesign of the SPA. Tokens gained a surface ladder,",
@@ -30,8 +130,12 @@
30
130
  "conversation and onboarding restyle against that language; every",
31
131
  "captured screen inherits the new field, type, and shadow."
32
132
  ],
33
- "01-login.png": { "min_pct": 1.5 },
34
- "02-recommended-models.png": { "min_pct": 1.5 },
133
+ "01-login.png": {
134
+ "min_pct": 1.5
135
+ },
136
+ "02-recommended-models.png": {
137
+ "min_pct": 1.5
138
+ },
35
139
  "03-install-load-progress.png": {
36
140
  "_why": [
37
141
  "Onboarding progress chrome inherited the Clean Sweep tokens/type.",
@@ -42,18 +146,37 @@
42
146
  ],
43
147
  "min_pct": 1.5
44
148
  },
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 }
55
- },
56
-
149
+ "04-brain-chat-home.png": {
150
+ "min_pct": 8.0
151
+ },
152
+ "05-memory-graph.png": {
153
+ "min_pct": 1.5
154
+ },
155
+ "06-capture.png": {
156
+ "min_pct": 1.5
157
+ },
158
+ "07-model-library.png": {
159
+ "min_pct": 1.5
160
+ },
161
+ "08-system.png": {
162
+ "min_pct": 1.5
163
+ },
164
+ "09-automation-runs.png": {
165
+ "min_pct": 1.5
166
+ },
167
+ "10-admin-console.png": {
168
+ "min_pct": 1.5
169
+ },
170
+ "11-knowledge-journey.png": {
171
+ "min_pct": 1.5
172
+ },
173
+ "12-review-center.png": {
174
+ "min_pct": 1.5
175
+ },
176
+ "13-chronicle.png": {
177
+ "min_pct": 1.5
178
+ }
179
+ },
57
180
  "11.6.0": {
58
181
  "_why": [
59
182
  "One Door release: the product server moved from Python/FastAPI to the",
@@ -74,7 +197,6 @@
74
197
  "cytoscape layout (11.3.0-11.5.2 observed)."
75
198
  ]
76
199
  },
77
-
78
200
  "11.5.2": {
79
201
  "_why": [
80
202
  "Tight Ship release: deletions, consolidation and front-door fixes —",
@@ -84,7 +206,6 @@
84
206
  "cytoscape layout (11.3.0-11.5.1 observed)."
85
207
  ]
86
208
  },
87
-
88
209
  "11.5.1": {
89
210
  "_why": [
90
211
  "Rust Full Loop release: agent-loop orchestrator port, worker seams,",
@@ -94,7 +215,6 @@
94
215
  "between captures from the cytoscape layout (11.3.0-11.5.0 observed)."
95
216
  ]
96
217
  },
97
-
98
218
  "11.5.0": {
99
219
  "_why": [
100
220
  "Rust Complete release: backend/desktop-topology architecture only",
@@ -105,7 +225,6 @@
105
225
  "11.3.0 and 11.4.0 with zero source change)."
106
226
  ]
107
227
  },
108
-
109
228
  "11.4.0": {
110
229
  "_why": [
111
230
  "Rust Foundation release: backend architecture only (rust/ workspace,",
@@ -116,7 +235,6 @@
116
235
  "cytoscape layout, with zero source change (also observed at 11.3.0)."
117
236
  ]
118
237
  },
119
-
120
238
  "11.3.0": {
121
239
  "_why": [
122
240
  "Chronicle release. 13-chronicle.png is NEW this release (no baseline",
@@ -132,7 +250,6 @@
132
250
  "min_pct": 1.5
133
251
  }
134
252
  },
135
-
136
253
  "11.2.0": {
137
254
  "04-brain-chat-home.png": {
138
255
  "_why": [
@@ -141,11 +258,15 @@
141
258
  "noise threshold (8%) may exceed it, so the screen is claimed with the",
142
259
  "rail region only."
143
260
  ],
144
- "region": [0.0, 0.25, 0.12, 0.85],
261
+ "region": [
262
+ 0.0,
263
+ 0.25,
264
+ 0.12,
265
+ 0.85
266
+ ],
145
267
  "min_pct": 0.5
146
268
  }
147
269
  },
148
-
149
270
  "11.1.0": {
150
271
  "_why": [
151
272
  "Feature release with no intentional change to the twelve captured",
@@ -154,7 +275,6 @@
154
275
  "All twelve measured but not gated."
155
276
  ]
156
277
  },
157
-
158
278
  "11.0.1": {
159
279
  "_why": [
160
280
  "Defect-fix and branch-coverage release: no intentional UI change.",
@@ -162,7 +282,6 @@
162
282
  "gated. Visible pixels may drift only where the version renders."
163
283
  ]
164
284
  },
165
-
166
285
  "11.0.0": {
167
286
  "_why": [
168
287
  "A verification-and-docs release: Python coverage 72.80% -> 100.00%",
@@ -171,14 +290,12 @@
171
290
  "where the version string renders."
172
291
  ]
173
292
  },
174
-
175
293
  "10.8.0": {
176
294
  "04-brain-chat-home.png": {
177
295
  "_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
296
  "min_pct": 1.5
179
297
  }
180
298
  },
181
-
182
299
  "10.10.0": {
183
300
  "04-brain-chat-home.png": {
184
301
  "_why": [
@@ -192,7 +309,6 @@
192
309
  "min_pct": 3.0
193
310
  }
194
311
  },
195
-
196
312
  "10.9.0": {
197
313
  "_why": [
198
314
  "This release claims no screen redesign, and the empty claim is the",
@@ -1863,13 +1863,14 @@ dependencies = [
1863
1863
 
1864
1864
  [[package]]
1865
1865
  name = "lattice-agent"
1866
- version = "11.7.0"
1866
+ version = "12.0.0"
1867
1867
  dependencies = [
1868
1868
  "axum",
1869
1869
  "base64 0.22.1",
1870
1870
  "fancy-regex",
1871
1871
  "futures-core",
1872
1872
  "getrandom 0.4.3",
1873
+ "lattice-auth",
1873
1874
  "reqwest 0.12.28",
1874
1875
  "serde",
1875
1876
  "serde_json",
@@ -1879,7 +1880,7 @@ dependencies = [
1879
1880
 
1880
1881
  [[package]]
1881
1882
  name = "lattice-ai-desktop"
1882
- version = "11.7.0"
1883
+ version = "12.0.0"
1883
1884
  dependencies = [
1884
1885
  "lattice-host",
1885
1886
  "lattice-jobs",
@@ -1894,7 +1895,7 @@ dependencies = [
1894
1895
 
1895
1896
  [[package]]
1896
1897
  name = "lattice-auth"
1897
- version = "11.7.0"
1898
+ version = "12.0.0"
1898
1899
  dependencies = [
1899
1900
  "axum",
1900
1901
  "base64 0.22.1",
@@ -1911,7 +1912,7 @@ dependencies = [
1911
1912
 
1912
1913
  [[package]]
1913
1914
  name = "lattice-chat"
1914
- version = "11.7.0"
1915
+ version = "12.0.0"
1915
1916
  dependencies = [
1916
1917
  "axum",
1917
1918
  "bytes",
@@ -1927,12 +1928,13 @@ dependencies = [
1927
1928
  "serde",
1928
1929
  "serde_json",
1929
1930
  "sha2",
1931
+ "tempfile",
1930
1932
  "tokio",
1931
1933
  ]
1932
1934
 
1933
1935
  [[package]]
1934
1936
  name = "lattice-core"
1935
- version = "11.7.0"
1937
+ version = "12.0.0"
1936
1938
  dependencies = [
1937
1939
  "blake2",
1938
1940
  "bytes",
@@ -1948,7 +1950,7 @@ dependencies = [
1948
1950
 
1949
1951
  [[package]]
1950
1952
  name = "lattice-host"
1951
- version = "11.7.0"
1953
+ version = "12.0.0"
1952
1954
  dependencies = [
1953
1955
  "axum",
1954
1956
  "lattice-agent",
@@ -1964,11 +1966,12 @@ dependencies = [
1964
1966
  "serde",
1965
1967
  "serde_json",
1966
1968
  "tokio",
1969
+ "tower",
1967
1970
  ]
1968
1971
 
1969
1972
  [[package]]
1970
1973
  name = "lattice-ingest"
1971
- version = "11.7.0"
1974
+ version = "12.0.0"
1972
1975
  dependencies = [
1973
1976
  "axum",
1974
1977
  "lattice-auth",
@@ -1983,7 +1986,7 @@ dependencies = [
1983
1986
 
1984
1987
  [[package]]
1985
1988
  name = "lattice-jobs"
1986
- version = "11.7.0"
1989
+ version = "12.0.0"
1987
1990
  dependencies = [
1988
1991
  "axum",
1989
1992
  "lattice-auth",
@@ -1998,7 +2001,7 @@ dependencies = [
1998
2001
 
1999
2002
  [[package]]
2000
2003
  name = "lattice-platform"
2001
- version = "11.7.0"
2004
+ version = "12.0.0"
2002
2005
  dependencies = [
2003
2006
  "axum",
2004
2007
  "base64 0.22.1",
@@ -2021,7 +2024,7 @@ dependencies = [
2021
2024
 
2022
2025
  [[package]]
2023
2026
  name = "lattice-retrieval"
2024
- version = "11.7.0"
2027
+ version = "12.0.0"
2025
2028
  dependencies = [
2026
2029
  "axum",
2027
2030
  "fancy-regex",
@@ -2104,6 +2107,12 @@ dependencies = [
2104
2107
  "vcpkg",
2105
2108
  ]
2106
2109
 
2110
+ [[package]]
2111
+ name = "linux-raw-sys"
2112
+ version = "0.12.1"
2113
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2114
+ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
2115
+
2107
2116
  [[package]]
2108
2117
  name = "litemap"
2109
2118
  version = "0.8.2"
@@ -2962,6 +2971,19 @@ dependencies = [
2962
2971
  "semver",
2963
2972
  ]
2964
2973
 
2974
+ [[package]]
2975
+ name = "rustix"
2976
+ version = "1.1.4"
2977
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2978
+ checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
2979
+ dependencies = [
2980
+ "bitflags 2.13.0",
2981
+ "errno",
2982
+ "libc",
2983
+ "linux-raw-sys",
2984
+ "windows-sys 0.61.2",
2985
+ ]
2986
+
2965
2987
  [[package]]
2966
2988
  name = "rustversion"
2967
2989
  version = "1.0.22"
@@ -3797,6 +3819,19 @@ dependencies = [
3797
3819
  "toml 1.1.2+spec-1.1.0",
3798
3820
  ]
3799
3821
 
3822
+ [[package]]
3823
+ name = "tempfile"
3824
+ version = "3.27.0"
3825
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3826
+ checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
3827
+ dependencies = [
3828
+ "fastrand",
3829
+ "getrandom 0.4.3",
3830
+ "once_cell",
3831
+ "rustix",
3832
+ "windows-sys 0.61.2",
3833
+ ]
3834
+
3800
3835
  [[package]]
3801
3836
  name = "tendril"
3802
3837
  version = "0.5.0"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lattice-ai-desktop"
3
- version = "11.7.0"
3
+ version = "12.0.0"
4
4
  description = "Lattice AI Digital Brain desktop shell"
5
5
  authors = ["TaeSoo Park"]
6
6
  edition = "2021"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://schema.tauri.app/config/2",
3
3
  "productName": "Lattice AI",
4
- "version": "11.7.0",
4
+ "version": "12.0.0",
5
5
  "identifier": "ai.lattice.desktop",
6
6
  "build": {
7
7
  "beforeDevCommand": "npm run frontend:dev",