ltcai 7.9.0 → 8.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Lattice AI
2
2
 
3
- **Lattice AI 7.9 is the local-first Digital Brain product with cleaner runtime boundaries. It keeps your knowledge durable across any AI model, with Brain Chat Home ready for immediate use and agent execution hardened behind explicit runtime ports.**
3
+ **Lattice AI 8.0 is the local-first Digital Brain platform with hardened runtime architecture. It keeps your knowledge durable across any AI model, with AgentRuntime, ToolRegistry, central Config, and Knowledge Graph stability tracked by explicit release contracts.**
4
4
 
5
5
  **Lattice AI는 모델이 바뀌어도 내 지식과 맥락을 보존하는 로컬 우선 AI 브레인입니다.**
6
6
 
@@ -11,7 +11,7 @@ downloads, update checks, and other external communication happen only after
11
11
  explicit consent.
12
12
 
13
13
  It is not a ChatGPT clone, a model launcher, a graph database, or a note app.
14
- It is the finished private AI memory layer wrapped in a Living Brain experience — now with a clearer 7.9 agent-runtime boundary.
14
+ It is the finished private AI memory layer wrapped in a Living Brain experience — now with the 8.0 runtime architecture contract behind it.
15
15
 
16
16
  [![PyPI Version](https://img.shields.io/pypi/v/ltcai?label=PyPI)](https://pypi.org/project/ltcai/)
17
17
  [![npm Version](https://img.shields.io/npm/v/ltcai?label=npm)](https://www.npmjs.com/package/ltcai)
@@ -64,7 +64,7 @@ You need Lattice AI when:
64
64
 
65
65
  ## Living Brain Flow
66
66
 
67
- The screenshots below are release evidence captures. The 7.9 line keeps the
67
+ The screenshots below are release evidence captures. The 8.0 line keeps the
68
68
  same first-run flow and rebuilds the Brain Chat Home layout so chat and the
69
69
  composer are the first visible action.
70
70
 
@@ -210,36 +210,39 @@ See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for developer workflow details.
210
210
 
211
211
  ## Current Release
212
212
 
213
- The current release is **7.9.0 — Agent Runtime Boundary Hardening**:
213
+ The current release is **8.0.0 — Runtime Architecture Contract**:
214
214
 
215
- - The single-agent state machine is now named `SingleAgentRuntime`, while the
216
- historical `AgentRuntime` import remains as a compatibility alias.
215
+ - `architecture_readiness()` now emits `lattice-architecture-contract/v1`,
216
+ including the preferred refactoring order and concrete ownership for
217
+ AgentRuntime, ToolRegistry, central Config, server decomposition, and KG
218
+ hardening.
217
219
  - The product AgentRuntime facade in `lattice_brain.runtime.agent_runtime`
218
220
  remains the unambiguous `/agents` execution and observability boundary.
219
- - Agent rollback is now an injected runtime port wired through
220
- `ToolDispatchService`, so the core state machine no longer shells out directly.
221
- - Both runtime surfaces expose a `runtime-boundary/v1` descriptor so tests and
222
- API clients can identify the owning execution boundary without relying on
223
- ambiguous class names.
224
- - A shared `RuntimeBoundaryProtocol` now fixes the common inspection surface
225
- while letting each runtime keep its own execution methods.
221
+ - ToolRegistry manifest output now carries `tool-registry-contract/v1` with
222
+ dispatch, policy, and permission ownership, so runtime/admin surfaces can
223
+ detect catalog drift from one source of truth.
224
+ - Knowledge Graph hardening is represented as an additive reprojection strategy
225
+ with legacy read compatibility and non-destructive rollback/export paths.
226
+ - KG v2 read-equivalence is locked for document listing, node lookup,
227
+ relationship search, and traversal, while logical imports preserve colliding
228
+ legacy edge labels without breaking native canonical dedupe.
226
229
  - Product readiness is machine-checkable through `product_readiness()`, which
227
230
  composes the architecture contract with exact artifact/docs/workflow evidence.
228
- - CI and release workflows now run frontend lint/typecheck/build gates plus the
229
- 7.9 product readiness score before a tag can be treated as release-safe.
231
+ - CI and release workflows continue to run frontend lint/typecheck/build gates
232
+ plus the 8.0 product readiness score before a tag can be treated as release-safe.
230
233
 
231
- Expected artifacts for 7.9.0 release must use exact filenames:
234
+ Expected artifacts for 8.0.0 release must use exact filenames:
232
235
 
233
- - `dist/ltcai-7.9.0-py3-none-any.whl`
234
- - `dist/ltcai-7.9.0.tar.gz`
235
- - `ltcai-7.9.0.tgz`
236
- - `dist/ltcai-7.9.0.vsix`
237
- - `src-tauri/target/release/bundle/dmg/Lattice AI_7.9.0_aarch64.dmg`
236
+ - `dist/ltcai-8.0.0-py3-none-any.whl`
237
+ - `dist/ltcai-8.0.0.tar.gz`
238
+ - `ltcai-8.0.0.tgz`
239
+ - `dist/ltcai-8.0.0.vsix`
240
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_8.0.0_aarch64.dmg`
238
241
 
239
242
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
240
243
 
241
244
  See [docs/ROADMAP_RECOMMENDATIONS.md](docs/ROADMAP_RECOMMENDATIONS.md) for the
242
- strategic roadmap slices applied through 7.9.0 and the follow-up tracks.
245
+ strategic roadmap slices applied through 8.0.0 and the follow-up tracks.
243
246
 
244
247
  ## Known Limitations
245
248
 
@@ -256,6 +259,7 @@ strategic roadmap slices applied through 7.9.0 and the follow-up tracks.
256
259
 
257
260
  | Version | Theme |
258
261
  | --- | --- |
262
+ | 8.0.0 | Runtime Architecture Contract: AgentRuntime, ToolRegistry, central Config, server decomposition, and KG hardening are captured as machine-checkable release boundaries with exact 8.0.0 artifacts |
259
263
  | 7.9.0 | Agent Runtime Boundary Hardening: explicit `SingleAgentRuntime`, compatibility alias preservation, injected rollback port, and release/readiness docs aligned to the product AgentRuntime facade |
260
264
  | 7.8.0 | Brain Chat Home UX Simplification: chat-first first viewport, visible workspace navigation, collapsed source/status utilities, hidden default depth controls, and removal of obsolete Brain UX components |
261
265
  | 7.7.0 | Complete Product Polish: command-center Brain Home, repaired Review Center evidence, exact 7.7 docs/artifacts, product readiness gate, and stronger CI/release checks |
package/docs/CHANGELOG.md CHANGED
@@ -6,6 +6,27 @@ existed at that release.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [8.0.0] - 2026-06-24
10
+
11
+ ### Changed
12
+ - Added `lattice-architecture-contract/v1` to make the AgentRuntime,
13
+ ToolRegistry, Config, server decomposition, and Knowledge Graph stabilization
14
+ boundaries explicit and testable for the major architecture line.
15
+ - Added `tool-registry-contract/v1` to the ToolRegistry manifest, including
16
+ dispatch, policy, and permission ownership.
17
+ - Updated architecture and product readiness targets to 8.0.0.
18
+ - Synchronized package/runtime/static/Tauri metadata to 8.0.0.
19
+ - Updated current-release docs and exact artifact names to 8.0.0 while
20
+ preserving historical 7.x entries.
21
+
22
+ ### Fixed
23
+ - Made logical Knowledge Graph `replace` imports transactional so malformed
24
+ imports roll back without clearing the existing graph.
25
+ - Locked v2 read-equivalence coverage for `list_documents`, `get_node`,
26
+ `relationship_search`, and `traverse`.
27
+ - Preserved colliding legacy edge labels during logical import/backfill while
28
+ keeping native write-door synonym dedupe canonical.
29
+
9
30
  ## [7.9.0] - 2026-06-23
10
31
 
11
32
  ### Changed
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "7.9.0"
29
+ __version__ = "8.0.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -331,17 +331,31 @@ class KnowledgeGraphProjectionMixin:
331
331
  edge_id: Optional[str] = None,
332
332
  created_at: Optional[str] = None,
333
333
  strict: bool = False,
334
+ legacy_type: Optional[str] = None,
334
335
  ) -> None:
335
336
  if KGStoreV2 is None:
336
337
  if strict:
337
338
  raise RuntimeError("Knowledge Graph v2 schema is unavailable")
338
339
  return
339
- eid = (
340
- edge_id or f"edge:{_sha256_text(f'{from_node}|{edge_type}|{to_node}')[:24]}"
341
- )
340
+ explicit_legacy_type = legacy_type is not None
341
+ leg_type = legacy_type if explicit_legacy_type else edge_type
342
+ # Native canonical writes (and write-door dedupes) use legacy_type=''
343
+ # so (source,target,type) is the effective key.
344
+ # Import paths can pass distinct legacy_type to keep colliding legacy
345
+ # labels as separate rows (lossless for old data).
346
+ if leg_type and EdgeType is not None:
347
+ try:
348
+ if EdgeType.from_legacy(leg_type).value == leg_type:
349
+ leg_type = ""
350
+ except ValueError:
351
+ pass
342
352
  norm_type = (
343
353
  EdgeType.from_legacy(edge_type).value if EdgeType is not None else edge_type
344
354
  )
355
+ if explicit_legacy_type and leg_type:
356
+ eid = f"edge:{_sha256_text(f'{from_node}|{norm_type}|{to_node}|{leg_type}')[:24]}"
357
+ else:
358
+ eid = edge_id or f"edge:{_sha256_text(f'{from_node}|{norm_type}|{to_node}')[:24]}"
345
359
  meta_str = metadata_json if metadata_json is not None else "{}"
346
360
  confidence = float(_safe_loads(meta_str).get("confidence", 1.0))
347
361
  try:
@@ -360,7 +374,7 @@ class KnowledgeGraphProjectionMixin:
360
374
  from_node,
361
375
  to_node,
362
376
  norm_type,
363
- edge_type,
377
+ leg_type,
364
378
  float(weight),
365
379
  confidence,
366
380
  meta_str,
@@ -371,7 +385,7 @@ class KnowledgeGraphProjectionMixin:
371
385
  # (the UNIQUE upsert + weight=max alone would erase recurrence).
372
386
  row = conn.execute(
373
387
  "SELECT id FROM edges_v2 WHERE source=? AND target=? AND type=? AND legacy_type=?",
374
- (from_node, to_node, norm_type, edge_type),
388
+ (from_node, to_node, norm_type, leg_type),
375
389
  ).fetchone()
376
390
  if row is not None:
377
391
  conn.execute(
@@ -292,10 +292,24 @@ class KnowledgeGraphProvenanceMixin:
292
292
  plan["dry_run"] = True
293
293
  return plan
294
294
 
295
- if mode == "replace":
296
- self.clear_all()
297
-
298
295
  with self._connect() as conn:
296
+ if mode == "replace":
297
+ # Keep replacement imports transactional. The old clear_all()
298
+ # path committed before the import started, so a malformed
299
+ # artifact could leave a cleared or partially rebuilt graph.
300
+ # These deletes roll back with the rest of the import.
301
+ for table in (
302
+ "local_file_index",
303
+ "knowledge_sources",
304
+ "chunks",
305
+ "edges",
306
+ "nodes",
307
+ "vector_embeddings",
308
+ ):
309
+ conn.execute(f"DELETE FROM {table}")
310
+ if KGStoreV2 is not None:
311
+ conn.execute("DELETE FROM edges_v2")
312
+ conn.execute("DELETE FROM nodes_v2")
299
313
  for n in nodes:
300
314
  self._upsert_node(
301
315
  conn,
@@ -315,13 +329,21 @@ class KnowledgeGraphProvenanceMixin:
315
329
  metadata=_safe_loads(c.get("metadata_json")),
316
330
  )
317
331
  for e in edges:
332
+ e_meta = _safe_loads(e.get("metadata_json")) or {}
333
+ leg_label = e_meta.get("legacy_label")
334
+ if not leg_label:
335
+ orig = e.get("type") or ""
336
+ if orig:
337
+ # preserve whatever label came from export (legacy or canon)
338
+ leg_label = orig
318
339
  self._upsert_edge(
319
340
  conn,
320
341
  e["from_node"],
321
342
  e["to_node"],
322
343
  e["type"],
323
344
  weight=float(e.get("weight") or 1.0),
324
- metadata=_safe_loads(e.get("metadata_json")),
345
+ metadata=e_meta,
346
+ legacy_label=leg_label,
325
347
  )
326
348
  for s in sources:
327
349
  conn.execute(
@@ -73,20 +73,46 @@ class KnowledgeGraphWriteMixin:
73
73
  edge_type: str,
74
74
  weight: float = 1.0,
75
75
  metadata: Optional[Dict[str, Any]] = None,
76
+ *,
77
+ legacy_label: Optional[str] = None,
76
78
  ) -> str:
77
79
  # v4 write door: every new edge stores the canonical EdgeType value —
78
80
  # free-string types (e.g. '포함함', '언급함') are normalized here, so no
79
81
  # caller can mint new legacy taxonomy. The original label survives in
80
82
  # metadata.legacy_label for traceability.
83
+ #
84
+ # legacy_type in edges_v2:
85
+ # - normal write door: synonyms always dedupe to ONE row with legacy_type=''
86
+ # - import (passes legacy_label=) : preserves distinct legacy labels as
87
+ # separate v2 rows (lossless collision for old artifacts / backfill)
88
+ passed_for_legacy = legacy_label or edge_type
81
89
  if EdgeType is not None:
82
90
  canonical = EdgeType.from_legacy(edge_type).value
83
- if canonical != edge_type:
91
+ if canonical != edge_type or (legacy_label and legacy_label != canonical):
84
92
  metadata = dict(metadata or {})
85
- metadata.setdefault("legacy_label", edge_type)
93
+ ll = legacy_label or edge_type
94
+ if ll != canonical:
95
+ metadata.setdefault("legacy_label", ll)
86
96
  edge_type = canonical
87
97
  edge_id = f"edge:{_sha256_text(f'{from_node}|{edge_type}|{to_node}')[:24]}"
88
98
  now = _now()
89
99
  meta_json = _json(metadata) # canonical string shared with the projection
100
+ v2_legacy = ""
101
+ if passed_for_legacy and passed_for_legacy != edge_type:
102
+ if legacy_label is not None:
103
+ # explicit legacy_label from import path forces distinct legacy_type
104
+ # rows in v2 for collision preservation
105
+ v2_legacy = passed_for_legacy
106
+ else:
107
+ # normal write-door dedupes even for synonym labels (legacy_type='')
108
+ v2_legacy = ""
109
+ # v2 may use distinct eid when preserving legacy collisions (different from
110
+ # the canon-based edge_id used for legacy edges table which always dedupes)
111
+ v2_eid = (
112
+ f"edge:{_sha256_text(f'{from_node}|{edge_type}|{to_node}|{v2_legacy}')[:24]}"
113
+ if v2_legacy
114
+ else edge_id
115
+ )
90
116
  self._v2_project_edge(
91
117
  conn,
92
118
  from_node,
@@ -94,9 +120,10 @@ class KnowledgeGraphWriteMixin:
94
120
  edge_type,
95
121
  float(weight),
96
122
  meta_json,
97
- edge_id=edge_id,
123
+ edge_id=v2_eid,
98
124
  created_at=now,
99
125
  strict=True,
126
+ legacy_type=v2_legacy,
100
127
  )
101
128
  conn.execute(
102
129
  """
@@ -21,7 +21,7 @@ from typing import Any, Callable, Dict, List, Optional
21
21
  from .contracts import multi_agent_contract
22
22
 
23
23
 
24
- MULTI_AGENT_VERSION = "7.9.0"
24
+ MULTI_AGENT_VERSION = "8.0.0"
25
25
 
26
26
  AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
27
27
  CORE_PIPELINE = ("planner", "executor", "reviewer")
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "7.9.0"
3
+ __version__ = "8.0.0"
@@ -11,7 +11,7 @@ from copy import deepcopy
11
11
  from typing import Any, Dict, List, Optional
12
12
 
13
13
 
14
- MARKETPLACE_VERSION = "7.9.0"
14
+ MARKETPLACE_VERSION = "8.0.0"
15
15
  TEMPLATE_KINDS = ("plugin", "workflow", "agent")
16
16
 
17
17
 
@@ -292,7 +292,14 @@ class ToolRegistry:
292
292
  })
293
293
  diagnostics = self.diagnostics()
294
294
  return {
295
+ "schema_version": "tool-registry-contract/v1",
295
296
  "status": "ok" if diagnostics["ready"] else "degraded",
297
+ "boundary": {
298
+ "owner": "latticeai.core.tool_registry.ToolRegistry",
299
+ "dispatch_owner": "tools.DEFAULT_TOOL_REGISTRY",
300
+ "policy_owner": "latticeai.core.tool_registry.ToolRegistry",
301
+ "permission_owner": "latticeai.services.tool_dispatch.ToolDispatchService",
302
+ },
296
303
  "catalog_brief": self.catalog_brief.strip(),
297
304
  "diagnostics": diagnostics,
298
305
  "tools": tools,
@@ -21,7 +21,7 @@ from typing import Any, Callable, Dict, Iterable, List, Optional
21
21
  from lattice_brain.runtime.contracts import realtime_event_contract, run_record_contract, workflow_run_contract
22
22
 
23
23
 
24
- WORKSPACE_OS_VERSION = "7.9.0"
24
+ WORKSPACE_OS_VERSION = "8.0.0"
25
25
 
26
26
  # Workspace types separate single-user Personal workspaces from shared
27
27
  # Organization workspaces. Both keep the same local-first JSON store; the type
@@ -1,10 +1,9 @@
1
1
  """Machine-checkable architecture readiness gates for release work.
2
2
 
3
- The 7.7 complete-product line preserves the 7.6 closure of the two local review
4
- notes by keeping their architectural claims in a small contract: AgentRuntime,
5
- ToolRegistry, central Config,
6
- decomposed API routers, and Knowledge Graph portability must all be discoverable
7
- and testable before the release can be called complete.
3
+ 8.0.0 turns the major architecture priorities into an explicit release
4
+ contract. AgentRuntime, ToolRegistry, central Config, decomposed server runtime,
5
+ and Knowledge Graph stabilization must be discoverable, ordered, and backed by
6
+ tests before the release can be called complete.
8
7
  """
9
8
 
10
9
  from __future__ import annotations
@@ -15,6 +14,19 @@ from pathlib import Path
15
14
  from typing import Any, Dict, List
16
15
 
17
16
 
17
+ ARCHITECTURE_VERSION_TARGET = "8.0.0"
18
+
19
+ PREFERRED_REFACTORING_ORDER = [
20
+ "agent-runtime",
21
+ "tool-registry",
22
+ "config-centralization",
23
+ "server-decomposition",
24
+ "kg-hardening",
25
+ "documentation-sync",
26
+ "ui-enhancements",
27
+ ]
28
+
29
+
18
30
  @dataclass(frozen=True)
19
31
  class ArchitectureGate:
20
32
  id: str
@@ -108,12 +120,43 @@ def architecture_readiness(root: Path | None = None) -> Dict[str, Any]:
108
120
 
109
121
  api_router_count = len(list((root / "latticeai" / "api").glob("*.py")))
110
122
  runtime_module_count = len(list((root / "latticeai" / "runtime").glob("*.py")))
123
+ ordered_gate_ids = [gate.id for gate in gates]
124
+ contract = {
125
+ "schema_version": "lattice-architecture-contract/v1",
126
+ "version_target": ARCHITECTURE_VERSION_TARGET,
127
+ "refactoring_order": list(PREFERRED_REFACTORING_ORDER),
128
+ "boundaries": {
129
+ "agent-runtime": {
130
+ "owner": "lattice_brain.runtime.agent_runtime.AgentRuntime",
131
+ "surface": "/agents",
132
+ "status": "facade",
133
+ },
134
+ "tool-registry": {
135
+ "owner": "latticeai.core.tool_registry.ToolRegistry",
136
+ "surface": "/tools",
137
+ "status": "registry",
138
+ },
139
+ "config-centralization": {
140
+ "owner": "latticeai.core.config.Config",
141
+ "surface": "composition root",
142
+ "status": "typed-config",
143
+ },
144
+ "kg-hardening": {
145
+ "owner": "lattice_brain.graph.store.KnowledgeGraphStore",
146
+ "strategy": "additive reprojection with legacy read compatibility",
147
+ "rollback": "portable export/import and non-destructive migration paths",
148
+ },
149
+ },
150
+ "ordered_gate_ids": ordered_gate_ids,
151
+ }
111
152
  return {
112
153
  "status": "complete" if all(gate.status == "complete" for gate in gates) else "incomplete",
113
- "version_target": "7.9.0",
154
+ "version_target": ARCHITECTURE_VERSION_TARGET,
155
+ "contract": contract,
114
156
  "gates": [gate.__dict__ for gate in gates],
115
157
  "metrics": {
116
158
  "api_router_modules": api_router_count,
117
159
  "runtime_modules": runtime_module_count,
160
+ "architecture_gates": len(gates),
118
161
  },
119
162
  }
@@ -1,12 +1,13 @@
1
- """Machine-checkable *product* readiness gates for the 7.9 line.
1
+ """Machine-checkable *product* readiness gates for the 8.0 line.
2
2
 
3
3
  Where ``architecture_readiness`` proves the internal structure is sound, this
4
- module answers the product question the 7.9 release exists to settle: *are the
5
- runtime boundaries still clear and release-ready after hardening?* It does so honestly — every
6
- gate is backed by evidence that is probed on disk, so a gate only reports
7
- ``complete`` when its evidence actually resolves. The same report can be printed
8
- by ``scripts/product_readiness.py`` and re-run after every change, which is the
9
- point: completeness is something we keep measuring, not a one-time claim.
4
+ module answers the product question the 8.0 release exists to settle: *are the
5
+ runtime boundaries still clear and release-ready after hardening?* It does so
6
+ honestly — every gate is backed by evidence that is probed on disk, so a gate
7
+ only reports ``complete`` when its evidence actually resolves. The same report
8
+ can be printed by ``scripts/product_readiness.py`` and re-run after every
9
+ change, which is the point: completeness is something we keep measuring, not a
10
+ one-time claim.
10
11
  """
11
12
 
12
13
  from __future__ import annotations
@@ -17,7 +18,7 @@ from typing import Any, Dict, List
17
18
 
18
19
  from latticeai.services.architecture_readiness import architecture_readiness
19
20
 
20
- PRODUCT_VERSION_TARGET = "7.9.0"
21
+ PRODUCT_VERSION_TARGET = "8.0.0"
21
22
 
22
23
 
23
24
  @dataclass(frozen=True)
@@ -64,10 +65,10 @@ PRODUCT_GATES: List[ProductGate] = [
64
65
  evidence=[
65
66
  "package.json::release:artifacts",
66
67
  "package.json::release:validate",
67
- "README.md::dist/ltcai-7.9.0-py3-none-any.whl",
68
- "README.md::dist/ltcai-7.9.0.tar.gz",
69
- "README.md::dist/ltcai-7.9.0.vsix",
70
- "README.md::ltcai-7.9.0.tgz",
68
+ "README.md::dist/ltcai-8.0.0-py3-none-any.whl",
69
+ "README.md::dist/ltcai-8.0.0.tar.gz",
70
+ "README.md::dist/ltcai-8.0.0.vsix",
71
+ "README.md::ltcai-8.0.0.tgz",
71
72
  "scripts/validate_release_artifacts.py",
72
73
  "scripts/release_smoke.py",
73
74
  "Dockerfile",
@@ -83,18 +84,19 @@ PRODUCT_GATES: List[ProductGate] = [
83
84
  title="Release story is documented and honest",
84
85
  evidence=[
85
86
  "README.md",
86
- "README.md::The current release is **7.9.0",
87
- "SECURITY.md::7.9.x (latest)",
88
- "vscode-extension/README.md::**7.9.0",
89
- "docs/CHANGELOG.md::## [7.9.0]",
87
+ "README.md::The current release is **8.0.0",
88
+ "SECURITY.md::8.0.x (latest)",
89
+ "vscode-extension/README.md::**8.0.0",
90
+ "docs/CHANGELOG.md::## [8.0.0]",
90
91
  "FEATURE_STATUS.md",
91
- "RELEASE_NOTES_v7.9.0.md",
92
+ "RELEASE_NOTES_v8.0.0.md",
92
93
  "latticeai/core/agent.py::SingleAgentRuntime",
93
94
  "latticeai/core/agent.py::AgentRuntime = SingleAgentRuntime",
94
95
  "lattice_brain/runtime/contracts.py::runtime-boundary/v1",
95
96
  "lattice_brain/runtime/contracts.py::RuntimeBoundaryProtocol",
96
97
  "lattice_brain/runtime/agent_runtime.py::def boundary",
97
98
  "latticeai/core/agent.py::def boundary",
99
+ "latticeai/services/architecture_readiness.py::lattice-architecture-contract/v1",
98
100
  "latticeai/services/tool_dispatch.py::rollback_file",
99
101
  ],
100
102
  ),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "7.9.0",
3
+ "version": "8.0.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": {
@@ -1584,7 +1584,7 @@ dependencies = [
1584
1584
 
1585
1585
  [[package]]
1586
1586
  name = "lattice-ai-desktop"
1587
- version = "7.9.0"
1587
+ version = "8.0.0"
1588
1588
  dependencies = [
1589
1589
  "plist",
1590
1590
  "serde",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lattice-ai-desktop"
3
- version = "7.9.0"
3
+ version = "8.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": "7.9.0",
4
+ "version": "8.0.0",
5
5
  "identifier": "ai.lattice.desktop",
6
6
  "build": {
7
7
  "beforeDevCommand": "npm run frontend:dev",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "7.9.0",
2
+ "version": "8.0.0",
3
3
  "generated_at": "vite",
4
4
  "entrypoints": {
5
5
  "app": "/static/app/index.html"