ltcai 11.2.0 → 11.5.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 +50 -53
- package/docs/CHANGELOG.md +87 -0
- package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
- package/docs/DEVELOPMENT.md +1 -1
- package/docs/MULTI_AGENT_RUNTIME.md +1 -1
- package/docs/ONBOARDING.md +1 -1
- package/docs/OPERATIONS.md +6 -2
- package/docs/PERMISSION_MODE.md +1 -1
- package/docs/TRUST_MODEL.md +1 -1
- package/docs/WHY_LATTICE.md +1 -1
- package/docs/kg-schema.md +2 -2
- package/docs/v11.3.0_PLAN.md +202 -0
- package/docs/v11.4.0_RUST_FOUNDATION_PLAN.md +181 -0
- package/docs/v11.5.0_RUST_COMPLETE_PLAN.md +145 -0
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/graph/_kg_common/__init__.py +287 -0
- package/lattice_brain/graph/_kg_common/extraction.py +516 -0
- package/lattice_brain/graph/_kg_common/relations.py +161 -0
- package/lattice_brain/graph/_kg_common/text.py +479 -0
- package/lattice_brain/graph/discovery_index/__init__.py +35 -0
- package/lattice_brain/graph/discovery_index/cleanup.py +182 -0
- package/lattice_brain/graph/discovery_index/extract.py +137 -0
- package/lattice_brain/graph/discovery_index/scan.py +411 -0
- package/lattice_brain/graph/discovery_index/upsert.py +495 -0
- package/lattice_brain/graph/projection/__init__.py +42 -0
- package/lattice_brain/graph/projection/curation.py +500 -0
- package/lattice_brain/graph/{projection.py → projection/v2_schema.py} +15 -477
- package/lattice_brain/graph/retrieval/__init__.py +54 -0
- package/lattice_brain/graph/retrieval/context.py +197 -0
- package/lattice_brain/graph/retrieval/graph_view.py +319 -0
- package/lattice_brain/graph/retrieval/hybrid.py +488 -0
- package/lattice_brain/graph/retrieval/maintenance.py +121 -0
- package/lattice_brain/graph/retrieval/signals.py +95 -0
- package/lattice_brain/graph/retrieval_vector/__init__.py +42 -0
- package/lattice_brain/graph/retrieval_vector/fingerprint.py +97 -0
- package/lattice_brain/graph/retrieval_vector/indexing.py +347 -0
- package/lattice_brain/graph/retrieval_vector/search.py +560 -0
- package/lattice_brain/graph/retrieval_vector/status.py +374 -0
- package/lattice_brain/ingestion/__init__.py +130 -0
- package/lattice_brain/ingestion/_contract.py +90 -0
- package/lattice_brain/ingestion/constants.py +127 -0
- package/lattice_brain/ingestion/folder_scan.py +57 -0
- package/lattice_brain/ingestion/folders.py +258 -0
- package/lattice_brain/ingestion/hashing.py +26 -0
- package/lattice_brain/ingestion/jobs_api.py +107 -0
- package/lattice_brain/ingestion/models.py +80 -0
- package/lattice_brain/ingestion/pipeline.py +486 -0
- package/lattice_brain/ingestion/quality.py +209 -0
- package/lattice_brain/ingestion/routing.py +295 -0
- package/lattice_brain/multimodal/__init__.py +164 -0
- package/lattice_brain/multimodal/audio.py +77 -0
- package/lattice_brain/multimodal/common.py +118 -0
- package/lattice_brain/multimodal/images.py +498 -0
- package/lattice_brain/multimodal/ports.py +169 -0
- package/lattice_brain/multimodal/video.py +410 -0
- package/lattice_brain/portability/__init__.py +90 -0
- package/lattice_brain/portability/_contract.py +42 -0
- package/lattice_brain/portability/backups.py +338 -0
- package/lattice_brain/portability/bundles.py +136 -0
- package/lattice_brain/portability/constants.py +93 -0
- package/lattice_brain/portability/fsops.py +138 -0
- package/lattice_brain/portability/service.py +41 -0
- package/lattice_brain/{portability.py → portability/sharing.py} +44 -677
- package/lattice_brain/runtime/__init__.py +1 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/chronicle.py +63 -0
- package/latticeai/api/index_jobs.py +145 -0
- package/latticeai/core/agent/__init__.py +93 -0
- package/latticeai/core/agent/_contract.py +79 -0
- package/latticeai/core/agent/context.py +57 -0
- package/latticeai/core/agent/deps.py +125 -0
- package/latticeai/core/agent/execution.py +622 -0
- package/latticeai/core/agent/planning.py +145 -0
- package/latticeai/core/agent/recovery.py +157 -0
- package/latticeai/core/agent/runtime.py +210 -0
- package/latticeai/core/agent/verification.py +231 -0
- package/latticeai/core/embedding_providers/__init__.py +151 -0
- package/latticeai/core/embedding_providers/base.py +199 -0
- package/latticeai/core/embedding_providers/captions.py +162 -0
- package/latticeai/core/embedding_providers/profiles.py +126 -0
- package/latticeai/core/embedding_providers/text.py +350 -0
- package/latticeai/core/embedding_providers/vision.py +352 -0
- package/latticeai/core/file_generation/__init__.py +115 -0
- package/latticeai/core/file_generation/bundles.py +76 -0
- package/latticeai/core/file_generation/extraction.py +154 -0
- package/latticeai/core/file_generation/inference.py +235 -0
- package/latticeai/core/file_generation/orchestration.py +152 -0
- package/latticeai/core/file_generation/prompting.py +117 -0
- package/latticeai/core/file_generation/repair.py +114 -0
- package/latticeai/core/file_generation/sanitize.py +61 -0
- package/latticeai/core/file_generation/validation.py +201 -0
- package/latticeai/core/legacy_compatibility.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/messages.py +14 -0
- package/latticeai/core/workspace_os_constants.py +1 -1
- package/latticeai/integrations/telegram_bot/__init__.py +123 -0
- package/latticeai/integrations/telegram_bot/__main__.py +17 -0
- package/latticeai/integrations/telegram_bot/config.py +86 -0
- package/latticeai/integrations/telegram_bot/dispatch.py +311 -0
- package/latticeai/integrations/telegram_bot/flows.py +478 -0
- package/latticeai/integrations/telegram_bot/helpers.py +322 -0
- package/latticeai/integrations/telegram_bot/screens.py +394 -0
- package/latticeai/models/router/__init__.py +88 -0
- package/latticeai/models/router/_contract.py +66 -0
- package/latticeai/models/router/branding.py +56 -0
- package/latticeai/models/router/catalog.py +69 -0
- package/latticeai/models/router/documents.py +199 -0
- package/latticeai/models/router/errors.py +37 -0
- package/latticeai/models/router/generation.py +258 -0
- package/latticeai/models/router/loading.py +291 -0
- package/latticeai/models/router/local_models.py +85 -0
- package/latticeai/models/router/registry.py +147 -0
- package/latticeai/runtime/build_phases/__init__.py +82 -0
- package/latticeai/runtime/build_phases/features.py +421 -0
- package/latticeai/runtime/build_phases/foundation.py +555 -0
- package/latticeai/runtime/build_phases/web.py +492 -0
- package/latticeai/runtime/runtime_context.py +1 -0
- package/latticeai/services/architecture_readiness.py +48 -19
- package/latticeai/services/brain_intelligence/__init__.py +58 -0
- package/latticeai/services/brain_intelligence/_contract.py +71 -0
- package/latticeai/services/brain_intelligence/consistency.py +193 -0
- package/latticeai/services/brain_intelligence/constants.py +47 -0
- package/latticeai/services/brain_intelligence/digest.py +258 -0
- package/latticeai/services/brain_intelligence/health.py +331 -0
- package/latticeai/services/brain_intelligence/proposals.py +264 -0
- package/latticeai/services/brain_intelligence/sampling.py +84 -0
- package/latticeai/services/brain_intelligence/service.py +48 -0
- package/latticeai/services/chronicle.py +557 -0
- package/latticeai/services/memory_service/__init__.py +52 -0
- package/latticeai/services/memory_service/_contract.py +100 -0
- package/latticeai/services/memory_service/brief.py +431 -0
- package/latticeai/services/memory_service/constants.py +57 -0
- package/latticeai/services/memory_service/maintenance.py +138 -0
- package/latticeai/services/memory_service/manager.py +186 -0
- package/latticeai/services/memory_service/proof.py +136 -0
- package/latticeai/services/memory_service/recall.py +225 -0
- package/latticeai/services/memory_service/service.py +48 -0
- package/latticeai/services/memory_service/stores.py +110 -0
- package/latticeai/services/model_runtime/__init__.py +322 -0
- package/latticeai/services/model_runtime/cloud.py +87 -0
- package/latticeai/services/model_runtime/download.py +282 -0
- package/latticeai/services/model_runtime/engines.py +341 -0
- package/latticeai/services/model_runtime/loading.py +178 -0
- package/latticeai/services/model_runtime/service.py +129 -0
- package/latticeai/services/model_runtime/state.py +131 -0
- package/latticeai/services/model_runtime/status.py +255 -0
- package/latticeai/services/product_readiness.py +15 -7
- package/latticeai/setup/wizard/__init__.py +126 -0
- package/latticeai/setup/wizard/catalog.py +172 -0
- package/latticeai/setup/wizard/detect.py +323 -0
- package/latticeai/setup/wizard/install.py +348 -0
- package/latticeai/setup/wizard/paths.py +168 -0
- package/latticeai/setup/wizard/plans.py +74 -0
- package/latticeai/setup/wizard/recommend.py +320 -0
- package/package.json +6 -2
- package/scripts/bump_version.py +14 -0
- package/scripts/capture_release_evidence.mjs +33 -21
- package/scripts/check_current_release_docs.mjs +1 -1
- package/scripts/check_i18n_namespace_coverage.mjs +41 -4
- package/scripts/check_max_file_lines.mjs +102 -0
- package/scripts/check_release_evidence_bound.mjs +30 -15
- package/scripts/check_screenshot_pixel_delta.py +34 -4
- package/scripts/check_server_i18n.mjs +2 -0
- package/scripts/chunking_parity_corpus.py +449 -0
- package/scripts/generate_agent_parity_fixtures.py +752 -0
- package/scripts/generate_chunking_parity_fixtures.py +259 -0
- package/scripts/generate_rust_parity_fixtures.py +997 -0
- package/scripts/lib/mock_server_fingerprint.mjs +94 -0
- package/scripts/release_screen_claims.json +42 -2
- package/src-tauri/Cargo.lock +404 -3
- package/src-tauri/Cargo.toml +13 -1
- package/src-tauri/src/backend.rs +460 -0
- package/src-tauri/src/folder.rs +33 -0
- package/src-tauri/src/main.rs +109 -399
- package/src-tauri/src/topology.rs +356 -0
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +41 -37
- package/static/app/assets/Act-CWnxSCgN.js +1 -0
- package/static/app/assets/AdminConsole-BEQYU6kF.js +1 -0
- package/static/app/assets/{Brain-tuhI4sOC.js → Brain-DWu1BhFg.js} +2 -2
- package/static/app/assets/BrainHome-95Hilr9R.js +2 -0
- package/static/app/assets/BrainSignals-QdeqCpAF.js +1 -0
- package/static/app/assets/Capture-BHpCxnzb.js +1 -0
- package/static/app/assets/Chronicle-B4xYKoed.js +1 -0
- package/static/app/assets/CommandPalette-BVXnttSz.js +1 -0
- package/static/app/assets/Library-DgYcHome.js +1 -0
- package/static/app/assets/{LivingBrain-DBwhto14.js → LivingBrain-CrJLDbf7.js} +1 -1
- package/static/app/assets/ProductFlow-DFlScKoJ.js +1 -0
- package/static/app/assets/ReviewCard-Cy5f48Pj.js +3 -0
- package/static/app/assets/System-NF8IfhTa.js +1 -0
- package/static/app/assets/arrow-left-DwkSYrjR.js +1 -0
- package/static/app/assets/{bot-Cia42c2h.js → bot-CucuhLhm.js} +1 -1
- package/static/app/assets/brain-BBnSryW_.js +1 -0
- package/static/app/assets/{button-2j2Ijzgq.js → button-C2GUj2Ai.js} +1 -1
- package/static/app/assets/circle-check-CxOVPwYq.js +1 -0
- package/static/app/assets/{circle-pause-BEFeWpVW.js → circle-pause-CbkWzBmG.js} +1 -1
- package/static/app/assets/{circle-play-ujXMcHxl.js → circle-play-7lEaqHdJ.js} +1 -1
- package/static/app/assets/{cpu-k4awryFq.js → cpu-DAlCXlIy.js} +1 -1
- package/static/app/assets/{download-DFbLJ_ig.js → download-RNhuuJwh.js} +1 -1
- package/static/app/assets/{folder-open-7y_b6xkM.js → folder-open-CLW4odzM.js} +1 -1
- package/static/app/assets/{hard-drive-Bidh02Kr.js → hard-drive-NKEiDIAJ.js} +1 -1
- package/static/app/assets/{index-DwDl9-8Y.css → index-BLPb5lmE.css} +1 -1
- package/static/app/assets/index-DMurvUuR.js +10 -0
- package/static/app/assets/input-D2UhPC1X.js +1 -0
- package/static/app/assets/link-2-6amKbP_P.js +1 -0
- package/static/app/assets/{permissionCopy-Bpb83Hx9.js → permissionCopy-Cu9TZtdR.js} +1 -1
- package/static/app/assets/primitives-gPsccucr.js +1 -0
- package/static/app/assets/search-Cj_TKk_2.js +1 -0
- package/static/app/assets/{share-2-BH1M-WNi.js → share-2-Bau7KkPq.js} +1 -1
- package/static/app/assets/{shield-alert-BlKdBXcG.js → shield-alert-BufNYypi.js} +1 -1
- package/static/app/assets/{textarea-CCWbUfFB.js → textarea-BQnVWhYs.js} +1 -1
- package/static/app/assets/{useFocusTrap-YdHQ7pJ1.js → useFocusTrap-B3_w60si.js} +1 -1
- package/static/app/assets/useMutation-BHhCflT6.js +1 -0
- package/static/app/assets/{useQuery-CXQiwbVT.js → useQuery-rBWfI-5t.js} +1 -1
- package/static/app/assets/utils-V_5-wxr5.js +4 -0
- package/static/app/assets/workspace-K1zjYUHj.js +1 -0
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/lattice_brain/graph/_kg_common.py +0 -1331
- package/lattice_brain/graph/discovery_index.py +0 -1141
- package/lattice_brain/graph/retrieval.py +0 -1120
- package/lattice_brain/graph/retrieval_vector.py +0 -1293
- package/lattice_brain/ingestion.py +0 -1525
- package/lattice_brain/multimodal.py +0 -1258
- package/latticeai/core/agent.py +0 -1465
- package/latticeai/core/embedding_providers.py +0 -1196
- package/latticeai/core/file_generation.py +0 -1047
- package/latticeai/integrations/telegram_bot.py +0 -1390
- package/latticeai/models/router.py +0 -1007
- package/latticeai/runtime/build_phases.py +0 -1450
- package/latticeai/services/brain_intelligence.py +0 -1083
- package/latticeai/services/memory_service.py +0 -1177
- package/latticeai/services/model_runtime.py +0 -1281
- package/latticeai/setup/wizard.py +0 -1310
- package/static/app/assets/Act-AWf0SAKp.js +0 -1
- package/static/app/assets/AdminConsole-D0u8Tiyj.js +0 -1
- package/static/app/assets/BrainHome-Ts7G_Ila.js +0 -2
- package/static/app/assets/BrainSignals-jMYgQ2Ar.js +0 -1
- package/static/app/assets/Capture-CqOSzyPr.js +0 -1
- package/static/app/assets/CommandPalette-DC0Bzh-I.js +0 -1
- package/static/app/assets/Library-CX-bbhmK.js +0 -1
- package/static/app/assets/ProductFlow-BHA2cfKI.js +0 -1
- package/static/app/assets/ReviewCard-BUhCKRNM.js +0 -3
- package/static/app/assets/System-Bu2t5hn1.js +0 -1
- package/static/app/assets/arrow-left-Dzwa5zRb.js +0 -1
- package/static/app/assets/brain-DJMoqrwx.js +0 -1
- package/static/app/assets/index-BpYkzcVm.js +0 -10
- package/static/app/assets/input-DSlJJxRs.js +0 -1
- package/static/app/assets/primitives-BCx6TvfG.js +0 -1
- package/static/app/assets/search-Cgy8cCFJ.js +0 -1
- package/static/app/assets/utils-zqPZJxdx.js +0 -4
- package/static/app/assets/workspace-DXTihhfU.js +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/ci.yml)
|
|
12
12
|
[](LICENSE)
|
|
13
13
|
|
|
14
|
-

|
|
15
15
|
|
|
16
16
|
Chat, files, folders, notes, and web pages all flow into one durable knowledge
|
|
17
17
|
graph on your computer. Any model — local MLX or cloud — can speak with that
|
|
@@ -24,10 +24,10 @@ memory. Nothing leaves your machine without explicit consent.
|
|
|
24
24
|
|
|
25
25
|
| | |
|
|
26
26
|
| --- | --- |
|
|
27
|
-
| **
|
|
28
|
-
| **
|
|
29
|
-
| **
|
|
30
|
-
| **Watch a file become memory** — three named steps, not a pipeline diagram  | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory  |
|
|
28
|
+
| **See how knowledge connects** — a real relationship graph, not a file list  | **Capture anything** — files, whole folders, notes, screenshots, web pages  |
|
|
29
|
+
| **Automate with review** — agent changes become proposals you approve first  | **Pick a model in one click** — recommended local models for your hardware  |
|
|
30
|
+
| **Watch a file become memory** — three named steps, not a pipeline diagram  | **Say how much it may do alone** — one dial in plain words; dangerous actions stay blocked either way  |
|
|
31
31
|
|
|
32
32
|
## Why Lattice AI
|
|
33
33
|
|
|
@@ -58,63 +58,57 @@ First-run flow — wake the Brain, pick the owner, load a recommended model:
|
|
|
58
58
|
|
|
59
59
|
| | | |
|
|
60
60
|
| --- | --- | --- |
|
|
61
|
-
|  |  |  |
|
|
62
62
|
|
|
63
63
|
Screenshot index and capture notes:
|
|
64
|
-
[output/release/v11.
|
|
64
|
+
[output/release/v11.5.0/SCREENSHOT_INDEX.md](output/release/v11.5.0/SCREENSHOT_INDEX.md)
|
|
65
65
|
|
|
66
66
|
## Current Release
|
|
67
67
|
|
|
68
|
-
The current release is **11.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- **The
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
or the docs were lowered to the truth. The audit ships as
|
|
103
|
-
[docs/FEATURE_AUDIT_v11.2.0.md](docs/FEATURE_AUDIT_v11.2.0.md).
|
|
104
|
-
|
|
105
|
-
All of it lands with the floor intact: **6,490 tests, 100.00% of 39,054
|
|
106
|
-
statements and 11,014 branches**, verified on macOS 3.14, a fresh-resolve
|
|
107
|
-
python 3.11 environment, and a clean linux python:3.14 container.
|
|
68
|
+
The current release is **11.5.0 — Rust Complete**:
|
|
69
|
+
|
|
70
|
+
Phases 2–4 of the Rust roadmap land in one release — as **working, proven
|
|
71
|
+
pieces**, with Python converging to its target role: the AI Worker.
|
|
72
|
+
|
|
73
|
+
- **The desktop's front door is now the Rust gateway.** The Tauri shell
|
|
74
|
+
boots the supervisor + gateway topology by default and the webview
|
|
75
|
+
lives at the gateway origin. The one real blocker — a CSRF policy
|
|
76
|
+
bound to the worker's own port — is dissolved by environment
|
|
77
|
+
injection, proven live against the real Python worker (trusted
|
|
78
|
+
origins 200, foreign origins 403). Three escape hatches preserve the
|
|
79
|
+
previous topologies.
|
|
80
|
+
- **The native surface grew fourfold.** `lattice-retrieval` now serves
|
|
81
|
+
the three-channel service search, graph reads (search /
|
|
82
|
+
relationships / traverse), the full history read family, and the
|
|
83
|
+
chat context assembler — **191/191 exact-parity goldens, zero
|
|
84
|
+
epsilon**. `lattice-ingest` carries the typed chunker (332 golden
|
|
85
|
+
chunks, and a 26/26 mutation-test pass proving every constant
|
|
86
|
+
load-bearing) plus the polling folder watcher; writes stay delegated
|
|
87
|
+
to the worker, the single writer. `lattice-agent` carries the
|
|
88
|
+
permission kernel — **2,452 exact decision-table verdicts** — and
|
|
89
|
+
natively executes only validated read-only commands in a replaced
|
|
90
|
+
environment. `lattice-jobs` closes a documented gap: the durable
|
|
91
|
+
embed queue now has a scheduler (60s ticks, honest backoff,
|
|
92
|
+
`/host/jobs` status) driving a new fully-covered drain endpoint.
|
|
93
|
+
- **The honest boundary, stated.** The Python worker keeps the document
|
|
94
|
+
parser matrix, embedding production, LLM inference, mutating tool
|
|
95
|
+
execution, and all graph writes. The agent loop orchestration port
|
|
96
|
+
remains for a future release, for reasons written down in the plan.
|
|
97
|
+
|
|
98
|
+
All of it lands with the floor intact: **6,861 Python + 1,761 frontend
|
|
99
|
+
tests at 100.00% statement and branch coverage, 534 Rust workspace
|
|
100
|
+
tests**, four bidirectional golden families, mypy/ruff/clippy clean,
|
|
101
|
+
verified on macOS 3.14 and a fresh-resolve python 3.11 environment.
|
|
108
102
|
|
|
109
103
|
Release notes: [RELEASE.md](RELEASE.md) · Full history: [docs/CHANGELOG.md](docs/CHANGELOG.md)
|
|
110
104
|
|
|
111
|
-
Expected artifacts for 11.
|
|
105
|
+
Expected artifacts for 11.5.0 release must use exact filenames:
|
|
112
106
|
|
|
113
|
-
- `dist/ltcai-11.
|
|
114
|
-
- `dist/ltcai-11.
|
|
115
|
-
- `ltcai-11.
|
|
116
|
-
- `dist/ltcai-11.
|
|
117
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_11.
|
|
107
|
+
- `dist/ltcai-11.5.0-py3-none-any.whl`
|
|
108
|
+
- `dist/ltcai-11.5.0.tar.gz`
|
|
109
|
+
- `ltcai-11.5.0.tgz`
|
|
110
|
+
- `dist/ltcai-11.5.0.vsix`
|
|
111
|
+
- `src-tauri/target/release/bundle/dmg/Lattice AI_11.5.0_aarch64.dmg`
|
|
118
112
|
|
|
119
113
|
Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
|
|
120
114
|
|
|
@@ -149,6 +143,9 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
|
|
|
149
143
|
|
|
150
144
|
| Version | Theme |
|
|
151
145
|
| --- | --- |
|
|
146
|
+
| 11.5.0 | Rust Complete |
|
|
147
|
+
| 11.4.0 | Rust Foundation |
|
|
148
|
+
| 11.3.0 | Time Remembers |
|
|
152
149
|
| 11.2.0 | All Systems On |
|
|
153
150
|
| 11.1.0 | Product Intelligence |
|
|
154
151
|
| 11.0.1 | Both Branches |
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,93 @@ The top entry is either the current unreleased main-branch work or the current
|
|
|
4
4
|
release line. Older entries are historical and may describe behavior as it
|
|
5
5
|
existed at that release.
|
|
6
6
|
|
|
7
|
+
## [11.5.0] - 2026-08-11 — Rust Complete
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **Phase 2–4 완결** (docs/v11.5.0_RUST_COMPLETE_PLAN.md): 신규 크레이트
|
|
11
|
+
`lattice-ingest`(typed chunking 4전략 1:1 포트 — 골든 332청크 완전
|
|
12
|
+
일치·뮤테이션 26/26, mtime 폴링 워처, 워커 위임 단일 작성자),
|
|
13
|
+
`lattice-jobs`(60s 드레인 스케줄러·백오프·`/host/jobs`·옵트인
|
|
14
|
+
autoresume), `lattice-agent`(권한 커널 — 모드 판정 2,358 + 명령 검증
|
|
15
|
+
59 + shlex 35 완전 일치, 읽기 전용 명령 네이티브 실행, `/rust/agent/*`).
|
|
16
|
+
- `lattice-retrieval` 확장: 3채널 service-hybrid·graph_search·
|
|
17
|
+
relationship_search·traverse·히스토리 전 읽기·Context Assembler —
|
|
18
|
+
신규 패리티 116(총 191/191, 엡실론 0), 계약 pytest 199.
|
|
19
|
+
- Python additive: `POST /api/index/drain` + `GET /api/index/queue`
|
|
20
|
+
(문·분기 100%, ko/en 로컬라이즈 21번째 라우터) — "배경 임베드 큐를
|
|
21
|
+
아무도 몰지 않는다" 한계 해소.
|
|
22
|
+
- 게이트웨이 마운트 맵: `/rust/{search,graph,history,context,ingest,agent}`
|
|
23
|
+
+ `/host/jobs*`; `/host`·`/rust` 네임스페이스는 프록시로 새지 않음.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
- **데스크톱 front-door 기본화**: Tauri가 게이트웨이 토폴로지로 기동
|
|
27
|
+
(웹뷰=게이트웨이 origin), CSRF는 `LATTICEAI_CSRF_TRUSTED_ORIGINS`
|
|
28
|
+
주입으로 해소(실워커 라이브 검증), 안전 밸브
|
|
29
|
+
`LATTICEAI_DESKTOP_DIRECT=1`/`BACKEND_ORIGIN`/`NO_BACKEND` 유지,
|
|
30
|
+
`backend_status`에 topology/worker_origin/gateway_origin/jobs_running
|
|
31
|
+
추가(기존 6필드 보존). SSE 프록시 `X-Accel-Buffering: no` 보강.
|
|
32
|
+
|
|
33
|
+
## [11.4.0] - 2026-08-11 — Rust Foundation
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
- **`rust/` cargo workspace** (Rust 전환 Phase 1,
|
|
37
|
+
docs/v11.4.0_RUST_FOUNDATION_PLAN.md): `lattice-core`(같은
|
|
38
|
+
`knowledge_graph.sqlite` 읽기 전용 층 + 해시 임베더 bit-for-bit 포트,
|
|
39
|
+
FTS5 trigram 프로브), `lattice-retrieval`(hybrid/keyword/vector
|
|
40
|
+
네이티브 엔진 — 커밋된 Python 골든과 25질의×3엔진 **75/75 완전
|
|
41
|
+
일치**, `tests/unit/test_rust_parity_contract.py` 80테스트가 Python
|
|
42
|
+
쪽을 상시 잠금), `lattice-host`(워커 수퍼바이저: HTTP /health 게이팅
|
|
43
|
+
·크래시 백오프 자동 재시작·SIGTERM 유예 종료·포트 통일 4825+스캔;
|
|
44
|
+
axum 게이트웨이: `/host/*`, 네이티브 `/rust/search/*`, 스트리밍
|
|
45
|
+
리버스 프록시 — 옵트인 front-door). Rust 테스트 194개.
|
|
46
|
+
- CI `rust` 잡(ubuntu: cargo fmt --check / clippy -D warnings /
|
|
47
|
+
test --workspace, SHA 핀 액션), `npm run rust:test`/`rust:lint`.
|
|
48
|
+
- `check_max_file_lines.mjs`가 `*.rs` 검사(43파일, 최장 491줄).
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
- Tauri 데스크톱 셸이 `lattice-host` 수퍼바이저에 올라탐: `main.rs`
|
|
52
|
+
451→149줄, IPC 커맨드 5종 계약 보존(+추가 상태 필드), 백엔드 후보
|
|
53
|
+
해석의 `sort()+dedup()` 우선순위 파괴 버그 수정, TCP 프로브 →
|
|
54
|
+
HTTP /health, 포트 기본 8765→4825(+빈 포트 탐색,
|
|
55
|
+
`LATTICEAI_PORT`/`LATTICEAI_DESKTOP_BACKEND_ORIGIN` 존중).
|
|
56
|
+
- `bump_version.py`·`test_version_consistency.py`가 rust workspace
|
|
57
|
+
버전(크레이트 3종 × 락파일 2종 포함)을 동기 — 타깃 18→25.
|
|
58
|
+
|
|
59
|
+
## [11.3.0] - 2026-08-11 — Time Remembers
|
|
60
|
+
|
|
61
|
+
### Added
|
|
62
|
+
- **기억의 연대기 (Brain Chronicle)**: 7번째 주 화면 `#/chronicle`(별칭
|
|
63
|
+
`#/timeline`) — SVG 성장 곡선 + 키보드/터치 시간 핸들, 주×요일 활동
|
|
64
|
+
히트맵, 그날의 이야기 카드(자료·새 개념·대화·달라진 사실, 기존 화면
|
|
65
|
+
딥링크), `store.as_of()` 기반 되감기 패널. 신규 읽기 전용 API 3종:
|
|
66
|
+
`GET /api/chronicle/{overview,day/{date},as-of}` (앱 시간대 일 버킷,
|
|
67
|
+
워크스페이스 스코프, 그룹 200 상한+참값 counts). 서버 메시지 ko/en
|
|
68
|
+
등록(19번째 로컬라이즈 라우터), 신규 i18n 네임스페이스 `chronicle`,
|
|
69
|
+
릴리스 캡처 `13-chronicle.png`, visual mock 라우트 + Playwright 스펙.
|
|
70
|
+
- **`scripts/check_max_file_lines.mjs`**: git 추적 1st-party 소스 전체
|
|
71
|
+
(py/ts/tsx/js/mjs/cjs/css)에 1,000줄 상한을 강제하는 lint 게이트.
|
|
72
|
+
생성물·벤더만 사유 명시 제외. 1,319개 파일 스캔, 초과 0.
|
|
73
|
+
- 픽셀 게이트가 이번 릴리스에 새로 생긴 화면(베이스라인 태그에 없음)을
|
|
74
|
+
"new"로 보고하고 게이트하지 않되, 클레임된 화면의 베이스라인 누락은
|
|
75
|
+
여전히 실패로 처리.
|
|
76
|
+
|
|
77
|
+
### Changed
|
|
78
|
+
- **No Big Files 분해**: 1,000줄 초과 1st-party 파일 28개 전부 분해,
|
|
79
|
+
동작 변화 0 증명 동반 — `frontend/src/styles.css` 10,956→48줄
|
|
80
|
+
엔트리+core/ 20파일(빌드 산출 CSS byte-identical, cmp+sha256),
|
|
81
|
+
i18n `brain`/`workspace` 사전 → 도메인 파트 14개(key→value 맵 동일
|
|
82
|
+
증명), Python 18개 모듈 → 동명 패키지(모든 top-level 심볼 AST 동등성
|
|
83
|
+
증명, monkeypatch 대상 317+ 사이트 실위치 재표적, mypy files 목록·
|
|
84
|
+
setuptools packages 목록 갱신), `vscode-extension/extension.ts` →
|
|
85
|
+
7개 모듈, 대형 테스트 5개 + visual mock 서버 분해(576응답 동등성
|
|
86
|
+
대조). 공개 import 경로 불변.
|
|
87
|
+
- 릴리스 증거 결속이 mock 서버 엔트리+라우트 모듈 전체를 지문화
|
|
88
|
+
(`scripts/lib/mock_server_fingerprint.mjs`, capture/check가 한 코드
|
|
89
|
+
경로 공유). i18n 고아 키 스캔·정의 수집이 네임스페이스 파트 파일
|
|
90
|
+
구조를 인식.
|
|
91
|
+
- everyday 내비 4항목(대화·자료·기억·연대기)에 맞춰 상단바 축약
|
|
92
|
+
분기점 960px→1120px, 모바일 하단바 5탭(캡션 말줄임).
|
|
93
|
+
|
|
7
94
|
## [11.2.0] - 2026-08-11 — All Systems On
|
|
8
95
|
|
|
9
96
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Community And Plugins
|
|
2
2
|
|
|
3
|
-
Current release: **11.
|
|
3
|
+
Current release: **11.5.0 — Rust Complete**.
|
|
4
4
|
|
|
5
5
|
LatticeAI defines the path from a strong local-first framework (8.4.0
|
|
6
6
|
action-aware baseline, 8.5.0 registry+DI hardening, 8.6.0 capture/navigation
|
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> **Status: canonical** — current contributor guidance, kept in sync with the
|
|
4
4
|
> current release.
|
|
5
5
|
|
|
6
|
-
Current release: **11.
|
|
6
|
+
Current release: **11.5.0 — Rust Complete**.
|
|
7
7
|
|
|
8
8
|
This document is for contributors working on the local-first Digital Brain
|
|
9
9
|
codebase. Product positioning and quick start stay in `README.md`; release
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The Multi-Agent Runtime is the **orchestration layer** introduced in v2.0.0 and
|
|
4
4
|
operationalized in v2.2.0. It sits
|
|
5
|
-
*above* the v1.x single-agent state machine ([`SingleAgentRuntime`](../latticeai/core/agent.py))
|
|
5
|
+
*above* the v1.x single-agent state machine ([`SingleAgentRuntime`](../latticeai/core/agent/runtime.py))
|
|
6
6
|
and coordinates a pipeline of named **roles** that hand off work to one another,
|
|
7
7
|
retry on a failing review, and emit a fully observable, replayable timeline.
|
|
8
8
|
|
package/docs/ONBOARDING.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lattice AI Onboarding
|
|
2
2
|
|
|
3
|
-
Current release: **11.
|
|
3
|
+
Current release: **11.5.0 — Rust Complete**.
|
|
4
4
|
|
|
5
5
|
The first-run goal is a five-minute path from "I opened the app" to "my Brain
|
|
6
6
|
has a source, a question, and proof." This page is the product contract behind
|
package/docs/OPERATIONS.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Lattice AI — Operations Guide (v11.
|
|
1
|
+
# Lattice AI — Operations Guide (v11.5.0)
|
|
2
2
|
|
|
3
3
|
> **Status: canonical** — kept in sync with the current release. Storage layout
|
|
4
4
|
> below reflects the SQLite live Brain store and workspace scoping, not the
|
|
@@ -176,7 +176,11 @@ Ctrl+C 또는 kill <pid>
|
|
|
176
176
|
캡처 → 오래된 버전 정리 → **픽셀 델타 검사**까지 한 번에 돈다.
|
|
177
177
|
4. 결속 검사 — `SCREENSHOT_INDEX.md` 의 `asset-manifest.sha256` 과
|
|
178
178
|
`mock-server.sha256` 이 각각 `static/app/asset-manifest.json`,
|
|
179
|
-
`tests/visual/mock_server.cjs`
|
|
179
|
+
그리고 목 API 표면 전체(`tests/visual/mock_server.cjs` +
|
|
180
|
+
`tests/visual/mock_server/*.cjs`) 와 일치해야 `npm run lint` 가 통과한다.
|
|
181
|
+
v11.3.0 부터 지문이 진입 파일 하나가 아니라 라우트 모듈까지 덮으므로,
|
|
182
|
+
v11.3.0 이전에 찍은 증거는 재캡처 전까지 불일치로 보고된다
|
|
183
|
+
(지문 계산은 `scripts/lib/mock_server_fingerprint.mjs` 한 곳에만 있다).
|
|
180
184
|
|
|
181
185
|
레이아웃을 바꿨다고 보고했는데 배치는 그대로인 경우를 잡기 위해 v10.7.0 부터
|
|
182
186
|
`scripts/check_screenshot_pixel_delta.py` 가 12개 캡처를 직전 버전과 대조한다
|
package/docs/PERMISSION_MODE.md
CHANGED
|
@@ -101,7 +101,7 @@ before routers are mounted would otherwise pin the store to the fallback
|
|
|
101
101
|
|--------|------|
|
|
102
102
|
| `latticeai/core/permission_mode.py` | Pure decision table |
|
|
103
103
|
| `latticeai/core/agent_permission.py` | Agent plan/tool gate helpers |
|
|
104
|
-
| `latticeai/core/agent
|
|
104
|
+
| `latticeai/core/agent/` | `SingleAgentRuntime` gates (mode-aware in-line: `planning.py` for the plan gate, `execution.py` for the per-tool gates) |
|
|
105
105
|
| `frontend/src/components/PermissionModePanel.tsx` | Settings selector |
|
|
106
106
|
| `latticeai/services/permission_mode_service.py` | Persistence |
|
|
107
107
|
| `latticeai/runtime/permission_mode_wiring.py` | Process-wide service + router mount |
|
package/docs/TRUST_MODEL.md
CHANGED
package/docs/WHY_LATTICE.md
CHANGED
package/docs/kg-schema.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Knowledge Graph Schema
|
|
2
2
|
|
|
3
|
-
Current release: **11.
|
|
3
|
+
Current release: **11.5.0 — Rust Complete**.
|
|
4
4
|
|
|
5
5
|
명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
|
|
6
6
|
구현: `lattice_brain/graph/schema.py`
|
|
@@ -142,7 +142,7 @@ provenance(source_type, source_uri, content_hash, captured_at, modified_at,
|
|
|
142
142
|
범위 없는 로컬 폴더는 개인 Brain으로 재투영하되 기존 노드 ID는 보존하며,
|
|
143
143
|
같은 폴더를 다른 워크스페이스로 조용히 재할당하지 않는다.
|
|
144
144
|
|
|
145
|
-
구현: `lattice_brain/ingestion
|
|
145
|
+
구현: `lattice_brain/ingestion/` (`IngestionPipeline`) 가 단일 진입점이며,
|
|
146
146
|
파일/로컬폴더/URL/브라우저 탭/텍스트를 모두 이 형태로 정규화한다.
|
|
147
147
|
|
|
148
148
|
---
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# v11.3.0 — Time Remembers (설계 문서)
|
|
2
|
+
|
|
3
|
+
> 상태: 계획 → 구현 → **출하됨(v11.3.0)**. 이 문서가 이번 릴리스의 설계
|
|
4
|
+
> 단일 출처다. 설계·기획: 본 문서. 구현: 트랙별 작업 노트 참조.
|
|
5
|
+
|
|
6
|
+
두 트랙을 하나의 릴리스로 출하한다.
|
|
7
|
+
|
|
8
|
+
- **트랙 A — No Big Files**: 1,000줄 이상인 1st-party 소스 파일 28개를
|
|
9
|
+
전부 응집 단위로 분해하고, 재발을 막는 라인 상한 게이트를 lint에 추가한다.
|
|
10
|
+
동작 변화 0, 화면 변화 0.
|
|
11
|
+
- **트랙 B — 기억의 연대기 (Brain Chronicle)**: v11.1.0이 심어 둔
|
|
12
|
+
bitemporal 데이터(`valid_from`/`valid_to`/`superseded_by`,
|
|
13
|
+
`edge_occurrences.observed_at`, `store.as_of()`)를 처음으로 사용자 앞에
|
|
14
|
+
꺼내는 7번째 주 화면. 두뇌가 자란 과정을 날짜로 보고, 임의 시점으로
|
|
15
|
+
되감는다.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 트랙 A — No Big Files
|
|
20
|
+
|
|
21
|
+
### 왜
|
|
22
|
+
|
|
23
|
+
`frontend/src/styles.css`는 10,956줄이다. 그 아래로도 1,000줄을 넘는
|
|
24
|
+
파일이 27개 있다. 리뷰가 느려지고, 에이전트 컨텍스트가 낭비되고, 충돌이
|
|
25
|
+
잦아진다. "누가 봐도 큰 파일"이 리포에 남지 않게 한다.
|
|
26
|
+
|
|
27
|
+
### 규칙
|
|
28
|
+
|
|
29
|
+
- **상한: 파일당 1,000줄** (git-추적 1st-party `*.py *.ts *.tsx *.js
|
|
30
|
+
*.mjs *.cjs *.css` 전부 — 테스트 포함).
|
|
31
|
+
- **제외(생성물/벤더)**: `frontend/src/api/openapi.ts`, `static/app/**`,
|
|
32
|
+
`static/vendor/**`, `node_modules`, `src-tauri/gen/**`.
|
|
33
|
+
- **게이트**: `scripts/check_max_file_lines.mjs`가 `npm run lint` 체인에
|
|
34
|
+
들어간다. 상한 초과 파일을 경로+줄수로 나열하며 실패한다. 제외 목록은
|
|
35
|
+
스크립트 안에 사유 주석과 함께 명시한다.
|
|
36
|
+
|
|
37
|
+
### 분해 대상 (28)
|
|
38
|
+
|
|
39
|
+
CSS/프론트: `styles.css`(10,956) `graph-home.css`(1,387)
|
|
40
|
+
`i18n/brain.ts`(1,647) `i18n/workspace.ts`(1,522)
|
|
41
|
+
`client.test.ts`(1,131) `useBrainChat.test.tsx`(1,037)
|
|
42
|
+
`vscode-extension/extension.ts`(1,104)
|
|
43
|
+
|
|
44
|
+
Python(lattice_brain): `ingestion.py`(1,525) `portability.py`(1,347)
|
|
45
|
+
`graph/_kg_common.py`(1,331) `graph/retrieval_vector.py`(1,293)
|
|
46
|
+
`multimodal.py`(1,258) `graph/discovery_index.py`(1,141)
|
|
47
|
+
`graph/retrieval.py`(1,120) `graph/projection.py`(1,008)
|
|
48
|
+
|
|
49
|
+
Python(latticeai): `core/agent.py`(1,465) `runtime/build_phases.py`(1,450)
|
|
50
|
+
`integrations/telegram_bot.py`(1,390) `setup/wizard.py`(1,310)
|
|
51
|
+
`services/model_runtime.py`(1,281) `core/embedding_providers.py`(1,196)
|
|
52
|
+
`services/memory_service.py`(1,177) `services/brain_intelligence.py`(1,083)
|
|
53
|
+
`core/file_generation.py`(1,047) `models/router.py`(1,007)
|
|
54
|
+
|
|
55
|
+
테스트/인프라: `tests/unit/test_layout_rebuild_apis.py`(1,685)
|
|
56
|
+
`tests/visual/v3.spec.js`(1,246) `tests/visual/mock_server.cjs`(1,226)
|
|
57
|
+
|
|
58
|
+
### 분해 프로토콜 (v10.0.1 교훈의 성문화)
|
|
59
|
+
|
|
60
|
+
**Python** — 모듈 → 동명 패키지:
|
|
61
|
+
|
|
62
|
+
1. `foo.py` → `foo/` 디렉터리. 내부를 응집 단위 서브모듈로 나눈다
|
|
63
|
+
(각 ≤1,000줄, 목표 ≤700줄).
|
|
64
|
+
2. `foo/__init__.py`가 **모든 공개 이름 + 테스트가 참조하는 모든 이름**을
|
|
65
|
+
재수출한다. 기존 `__all__` 유지. import 경로는 단 하나도 깨지지 않는다.
|
|
66
|
+
3. **monkeypatch 함정**: 테스트가 `patch("pkg.foo.bar")`로 패치하는
|
|
67
|
+
심볼은, `bar`를 사용하는 코드와 같은 서브모듈에 두거나 테스트의 패치
|
|
68
|
+
대상을 실제 위치로 갱신한다. 패키지 `__init__`에 재수출된 이름을
|
|
69
|
+
패치해도 서브모듈 내부의 전역 참조는 바뀌지 않는다.
|
|
70
|
+
4. **모듈 전역 상태**(싱글턴, 캐시, 레지스트리)는 정확히 한 서브모듈에만
|
|
71
|
+
존재한다. 순환은 의존 순서 정리로 풀고, 문자열 리터럴 지연 import로
|
|
72
|
+
우회하지 않는다.
|
|
73
|
+
5. **AST 동등성 증명**: 분해 전(`git show HEAD:<path>`)과 후(서브모듈
|
|
74
|
+
합집합)의 top-level 함수/클래스 각각에 대해 `ast.dump` 비교. import
|
|
75
|
+
문과 위치 이동 외 차이 0을 확인하고 결과를 작업 노트에 남긴다.
|
|
76
|
+
6. `pyproject.toml`의 mypy `files` 목록을 새 경로로 갱신한다(원 모듈이
|
|
77
|
+
채택돼 있던 경우 서브모듈 전부 채택).
|
|
78
|
+
|
|
79
|
+
**CSS** — `styles.css`는 이미 104개 섹션 주석으로 구조화되어 있다.
|
|
80
|
+
섹션 묶음별로 `frontend/src/styles/core/*.css`로 옮기고 `styles.css`
|
|
81
|
+
상단에서 원래 순서 그대로 `@import`한다. Tailwind v4는 unlayered 규칙이
|
|
82
|
+
layered 유틸을 항상 이기므로 캐스케이드는 순서 보존이 전부다.
|
|
83
|
+
**증명: 분해 전후 `vite build` 산출 CSS 번들이 동일해야 한다**
|
|
84
|
+
(해시 제외 byte-diff).
|
|
85
|
+
|
|
86
|
+
**i18n** — `brain.ts`/`workspace.ts`를 도메인별 사전 파일로 나누고 기존
|
|
87
|
+
파일이 병합해 `registerCopy` 한 번만 호출한다. ko/en 키 패리티 테스트와
|
|
88
|
+
`check_i18n_namespace_coverage.mjs`가 그대로 통과해야 한다.
|
|
89
|
+
`vitest.config.ts`의 커버리지 제외 패턴을 `frontend/src/i18n/**`로
|
|
90
|
+
넓힌다(사전은 로직이 아니다 — 기존 사유 그대로).
|
|
91
|
+
|
|
92
|
+
**검증 플로어(불변)**: Python 문·분기 100.00% (`fail_under = 100`),
|
|
93
|
+
프론트 4지표 100%, mypy 0 에러, ruff 클린, `npm run lint` 전 서브게이트,
|
|
94
|
+
전 테스트 그린. 분해는 이 플로어 위에서만 성립한다.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 트랙 B — 기억의 연대기 (Brain Chronicle)
|
|
99
|
+
|
|
100
|
+
### 왜 이것인가
|
|
101
|
+
|
|
102
|
+
v11.1.0이 노드·엣지에 `valid_from`/`valid_to`/`superseded_by`를 심고
|
|
103
|
+
`edge_occurrences(observed_at)`와 `store.as_of()`/`neighbors(as_of=)`까지
|
|
104
|
+
구현했지만, **이 데이터를 노출하는 HTTP 엔드포인트도, 화면도 0개다.**
|
|
105
|
+
"두뇌가 시간을 기억한다"는 이 제품의 약속이 아직 보이지 않는다.
|
|
106
|
+
연대기는 그 약속을 첫 화면급 표면으로 만든다. 전부 읽기 전용이라
|
|
107
|
+
기존 시스템에 지장이 없다.
|
|
108
|
+
|
|
109
|
+
### 사용자에게 보이는 것
|
|
110
|
+
|
|
111
|
+
새 주 화면 **연대기** (라우트 id `chronicle`, 해시 `#/chronicle`,
|
|
112
|
+
everyday 내비 4번째 항목). 위에서 아래로:
|
|
113
|
+
|
|
114
|
+
1. **성장 곡선 + 스크러버** — 누적 기억(자료·개념·연결·대화)의 SVG 영역
|
|
115
|
+
차트. 핸들을 잡고 끌면 아래 전체가 그 시점으로 따라온다.
|
|
116
|
+
2. **활동 히트맵** — 주×요일 격자, 하루의 활동 밀도. 클릭하면 그 날로.
|
|
117
|
+
3. **그날의 이야기** — 선택한 날짜에 두뇌에 들어온 것들을 평이한 한국어
|
|
118
|
+
그룹 카드로: 자료(제목·출처), 새로 생긴 개념, 나눈 대화(첫 줄 미리보기),
|
|
119
|
+
달라진 사실(superseded/모순 해소). 각 카드는 기존 화면(기억 검색,
|
|
120
|
+
그래프, 대화)으로 연결된다.
|
|
121
|
+
4. **그때의 두뇌 (되감기)** — 스크러버가 과거에 있을 때: 그 시점의
|
|
122
|
+
노드·연결 수와 그때 중요했던 개념 목록. `as_of` 읽기의 첫 노출.
|
|
123
|
+
|
|
124
|
+
빈 두뇌엔 정직한 빈 상태: "오늘부터 기록이 쌓입니다." 요약 생성이나
|
|
125
|
+
모델 호출은 없다 — 전부 이미 저장된 사실의 재배열이다(정직성 원칙).
|
|
126
|
+
|
|
127
|
+
### API 계약 (신규 라우터, 전부 read-only)
|
|
128
|
+
|
|
129
|
+
`latticeai/api/chronicle.py` — router-factory 규약(전체 경로, prefix 없음),
|
|
130
|
+
`require_user` + `gate_read`, 워크스페이스 스코프. 서비스는
|
|
131
|
+
`latticeai/services/chronicle.py`의 `ChronicleService`(순수 SQLite 읽기,
|
|
132
|
+
날짜 버킷은 `latticeai/core/timezones.py` 기준).
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
GET /api/chronicle/overview
|
|
136
|
+
→ { first_activity_at, last_activity_at,
|
|
137
|
+
totals: { sources, entities, connections, conversations },
|
|
138
|
+
series: [ { date, sources, entities, connections, conversations } ] }
|
|
139
|
+
|
|
140
|
+
GET /api/chronicle/day/{date} # YYYY-MM-DD, LATTICE_TZ 기준
|
|
141
|
+
→ { date, counts, groups: {
|
|
142
|
+
sources: [ { id, title, source_type, captured_at, node_id } ],
|
|
143
|
+
entities: [ { id, label, type, created_at } ],
|
|
144
|
+
conversations: [ { conversation_id, preview, messages, started_at } ],
|
|
145
|
+
changes: [ { kind, label, at, node_id } ] } }
|
|
146
|
+
|
|
147
|
+
GET /api/chronicle/as-of?ts=<ISO8601>
|
|
148
|
+
→ { ts, stats: { entities, connections },
|
|
149
|
+
top_entities: [ { id, label, type, importance_score } ] }
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
데이터 원천: `ingestion_provenance(created_at, captured_at)`,
|
|
153
|
+
`nodes_v2`/`edges_v2`(`created_at`, temporal 3열),
|
|
154
|
+
`conversation_messages(timestamp)`, `edge_occurrences(observed_at)`.
|
|
155
|
+
`as-of`는 `store.as_of()` 계열을 통해서만 읽는다(중복 구현 금지).
|
|
156
|
+
등록은 `build_phases.py` platform_features 단계에 직접 include.
|
|
157
|
+
스키마 변경 0, 쓰기 0.
|
|
158
|
+
|
|
159
|
+
### 프론트 구조
|
|
160
|
+
|
|
161
|
+
- `frontend/src/pages/Chronicle.tsx` + `frontend/src/features/chronicle/`
|
|
162
|
+
(GrowthScrubber / ActivityHeatmap / DayStory / RewindPanel — 각 ≤1,000줄).
|
|
163
|
+
- `routes.ts`: `productShellRoutes` 7번째 항목, `directProductRoutes`,
|
|
164
|
+
`commandRoutes`(팔레트), 별칭 `timeline` → `chronicle`.
|
|
165
|
+
- `App.tsx`: lazy import + everyday 내비(대화·자료·기억·연대기).
|
|
166
|
+
- i18n: 신규 네임스페이스 `frontend/src/i18n/chronicle.ts`
|
|
167
|
+
(ko/en 패리티, 페이지 청크에서 등록). basic 모드 어휘: 개발 용어 금지.
|
|
168
|
+
- `api/client.ts`에 typed 메서드 3개. OpenAPI 재생성으로 타입 공급.
|
|
169
|
+
- 시각 회귀: `tests/visual/mock_server.cjs`에 chronicle 3 엔드포인트
|
|
170
|
+
픽스처(채워진 상태) 추가 — 릴리스 스크린샷이 빈 화면을 찍지 않게 한다.
|
|
171
|
+
|
|
172
|
+
### 테스트
|
|
173
|
+
|
|
174
|
+
- 백엔드: 서비스 단위(빈 두뇌·단일 일자·다일자·workspace 경계·tz 경계·
|
|
175
|
+
as-of 과거/미래/경계)와 라우터(인증·게이트·404·검증 실패)를 실제
|
|
176
|
+
tmp_path SQLite 스토어로. 문·분기 100%.
|
|
177
|
+
- 프론트: 신규 파일 4지표 100%. routes/parseHash, 팔레트 노출,
|
|
178
|
+
스크러버 드래그 → as-of 반영, 빈 상태.
|
|
179
|
+
|
|
180
|
+
### 릴리스 증거
|
|
181
|
+
|
|
182
|
+
- 신규 스크린샷 `13-chronicle.png` 캡처 목록 추가, README 기능 표에
|
|
183
|
+
연대기 카드 추가.
|
|
184
|
+
- 내비가 화면 전체에 4번째 everyday 항목을 추가하므로
|
|
185
|
+
`scripts/release_screen_claims.json`의 11.3.0 항목은 topbar가 보이는
|
|
186
|
+
화면들을 claim한다.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 릴리스 체크리스트 (11.3.0)
|
|
191
|
+
|
|
192
|
+
1. 트랙 A → 트랙 B 순서로 구현(연대기가 분해된 `build_phases` 위에 얹힘).
|
|
193
|
+
2. 전 게이트 로컬 그린 → fresh venv 재검증(coverage-100 교훈).
|
|
194
|
+
3. `bump_version.py 11.3.0` → OpenAPI 재생성 → 문서 갱신
|
|
195
|
+
(`check_current_release_docs.mjs`의 releaseTheme = "Time Remembers"
|
|
196
|
+
갱신 포함 — README/RELEASE.md/RELEASE_NOTES.md 제목과 일치 필수).
|
|
197
|
+
4. `npm run release:evidence` (스크린샷 12+1, walkthrough GIF).
|
|
198
|
+
5. `npm run release:artifacts` → whl · tar.gz · tgz · vsix ·
|
|
199
|
+
**DMG**(`Lattice AI_11.3.0_aarch64.dmg`) → `release:validate`
|
|
200
|
+
(`--require-vsix --require-tgz --require-dmg`) → `release:smoke`.
|
|
201
|
+
6. main 커밋·푸시 → 태그 `v11.3.0` → GitHub Release(정확한 파일명,
|
|
202
|
+
와일드카드 금지) → main CI 4종(CI·Visual·Sidecar·Audit) 그린 확인.
|