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 +26 -22
- package/docs/CHANGELOG.md +21 -0
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/graph/projection.py +19 -5
- package/lattice_brain/graph/provenance.py +26 -4
- package/lattice_brain/graph/write_master.py +30 -3
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/tool_registry.py +7 -0
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/services/architecture_readiness.py +49 -6
- package/latticeai/services/product_readiness.py +19 -17
- package/package.json +1 -1
- package/src-tauri/Cargo.lock +1 -1
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lattice AI
|
|
2
2
|
|
|
3
|
-
**Lattice AI
|
|
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
|
|
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
|
[](https://pypi.org/project/ltcai/)
|
|
17
17
|
[](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
|
|
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 **
|
|
213
|
+
The current release is **8.0.0 — Runtime Architecture Contract**:
|
|
214
214
|
|
|
215
|
-
-
|
|
216
|
-
|
|
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
|
-
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
-
|
|
225
|
-
|
|
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
|
|
229
|
-
|
|
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
|
|
234
|
+
Expected artifacts for 8.0.0 release must use exact filenames:
|
|
232
235
|
|
|
233
|
-
- `dist/ltcai-
|
|
234
|
-
- `dist/ltcai-
|
|
235
|
-
- `ltcai-
|
|
236
|
-
- `dist/ltcai-
|
|
237
|
-
- `src-tauri/target/release/bundle/dmg/Lattice
|
|
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
|
|
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
|
|
@@ -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
|
-
|
|
340
|
-
|
|
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
|
-
|
|
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,
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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 = "
|
|
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")
|
package/latticeai/__init__.py
CHANGED
|
@@ -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 = "
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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":
|
|
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
|
|
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
|
|
5
|
-
runtime boundaries still clear and release-ready after hardening?* It does so
|
|
6
|
-
gate is backed by evidence that is probed on disk, so a gate
|
|
7
|
-
``complete`` when its evidence actually resolves. The same report
|
|
8
|
-
by ``scripts/product_readiness.py`` and re-run after every
|
|
9
|
-
point: completeness is something we keep measuring, not a
|
|
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 = "
|
|
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-
|
|
68
|
-
"README.md::dist/ltcai-
|
|
69
|
-
"README.md::dist/ltcai-
|
|
70
|
-
"README.md::ltcai-
|
|
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 **
|
|
87
|
-
"SECURITY.md::
|
|
88
|
-
"vscode-extension/README.md::**
|
|
89
|
-
"docs/CHANGELOG.md::## [
|
|
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
|
-
"
|
|
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
package/src-tauri/Cargo.lock
CHANGED
package/src-tauri/Cargo.toml
CHANGED