ltcai 9.9.5 → 10.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 +39 -37
- package/docs/CHANGELOG.md +234 -0
- package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
- package/docs/DEVELOPMENT.md +1 -1
- package/docs/ONBOARDING.md +1 -1
- package/docs/OPERATIONS.md +3 -1
- package/docs/PERMISSION_MODE.md +107 -0
- package/docs/SURFACE_PARITY.md +38 -8
- package/docs/TRUST_MODEL.md +1 -1
- package/docs/WHY_LATTICE.md +1 -1
- package/docs/kg-schema.md +1 -1
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/context.py +39 -4
- package/lattice_brain/graph/_kg_common.py +189 -14
- package/lattice_brain/graph/curator.py +62 -0
- package/lattice_brain/graph/discovery.py +76 -0
- package/lattice_brain/graph/ingest.py +37 -7
- package/lattice_brain/graph/retrieval_vector.py +10 -0
- package/lattice_brain/ingestion.py +9 -106
- package/lattice_brain/ingestion_jobs.py +133 -0
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/brain_intelligence.py +8 -0
- package/latticeai/api/chat.py +9 -0
- package/latticeai/api/chat_agent_http.py +119 -2
- package/latticeai/api/chat_contracts.py +9 -0
- package/latticeai/api/chat_documents.py +16 -0
- package/latticeai/api/evidence_actions.py +48 -0
- package/latticeai/api/permission_mode.py +61 -0
- package/latticeai/api/project_sessions.py +112 -0
- package/latticeai/api/voice_capture.py +89 -0
- package/latticeai/app_factory.py +53 -0
- package/latticeai/core/agent.py +381 -43
- package/latticeai/core/agent_permission.py +160 -0
- package/latticeai/core/agent_profiles.py +110 -0
- package/latticeai/core/artifact_ledger.py +109 -0
- package/latticeai/core/context_builder.py +101 -2
- package/latticeai/core/legacy_compatibility.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/permission_mode.py +296 -0
- package/latticeai/core/project_sessions.py +337 -0
- package/latticeai/core/run_explain.py +421 -0
- package/latticeai/core/run_store.py +5 -0
- package/latticeai/core/workspace_os.py +15 -80
- package/latticeai/core/workspace_review_items.py +107 -0
- package/latticeai/integrations/telegram_bot.py +188 -0
- package/latticeai/runtime/chat_wiring.py +8 -0
- package/latticeai/runtime/context_runtime.py +11 -0
- package/latticeai/runtime/permission_mode_wiring.py +116 -0
- package/latticeai/runtime/router_registration.py +9 -0
- package/latticeai/services/app_context.py +3 -0
- package/latticeai/services/architecture_readiness.py +1 -1
- package/latticeai/services/brain_intelligence.py +105 -0
- package/latticeai/services/evidence_actions.py +254 -0
- package/latticeai/services/funnel_metrics.py +111 -16
- package/latticeai/services/local_knowledge.py +26 -0
- package/latticeai/services/memory_service.py +12 -0
- package/latticeai/services/permission_mode_service.py +170 -0
- package/latticeai/services/product_readiness.py +1 -1
- package/latticeai/services/tool_dispatch.py +73 -4
- package/latticeai/services/voice_capture.py +189 -0
- package/package.json +6 -4
- package/scripts/check_bundle_budget.mjs +11 -0
- package/scripts/check_current_release_docs.mjs +1 -1
- package/scripts/check_i18n_namespace_coverage.mjs +148 -0
- package/skills/meeting_notes/SKILL.md +82 -0
- package/skills/meeting_notes/examples.md +41 -0
- package/skills/meeting_notes/risk.json +9 -0
- package/skills/meeting_notes/schema.json +55 -0
- package/skills/weekly_review/SKILL.md +75 -0
- package/skills/weekly_review/examples.md +39 -0
- package/skills/weekly_review/risk.json +9 -0
- package/skills/weekly_review/schema.json +55 -0
- 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 +37 -29
- package/static/app/assets/Act-BtCREeN1.js +1 -0
- package/static/app/assets/AdminConsole-TPeeN18T.js +1 -0
- package/static/app/assets/Brain-BKs6JAp0.js +321 -0
- package/static/app/assets/BrainHome-BPGOvSd6.js +2 -0
- package/static/app/assets/BrainSignals-CtzQZ15J.js +1 -0
- package/static/app/assets/Capture-1_NaHWqB.js +1 -0
- package/static/app/assets/CommandPalette-pqvQOXe4.js +1 -0
- package/static/app/assets/Library-DhvoPvC7.js +1 -0
- package/static/app/assets/{LivingBrain-BVWk58MW.js → LivingBrain-DlQ20Q75.js} +1 -1
- package/static/app/assets/ProductFlow-BZvGDRi_.js +1 -0
- package/static/app/assets/ReviewCard-BWgI0D2s.js +3 -0
- package/static/app/assets/System-CSMdYLMy.js +1 -0
- package/static/app/assets/activity-Dlfk8YC7.js +1 -0
- package/static/app/assets/{bot-VmP0kkeA.js → bot-CDvUB76P.js} +1 -1
- package/static/app/assets/brain-xczrohrt.js +1 -0
- package/static/app/assets/button-SOdH3Oyf.js +1 -0
- package/static/app/assets/{circle-pause-T9POo4qy.js → circle-pause-CG1ythH4.js} +1 -1
- package/static/app/assets/{circle-play-Bz5iTD0p.js → circle-play-HXwvjS6W.js} +1 -1
- package/static/app/assets/{cpu-CJhjRtNq.js → cpu-B0d-rGyk.js} +1 -1
- package/static/app/assets/download-BGIkTQL6.js +1 -0
- package/static/app/assets/{folder-open-B2K_22VI.js → folder-open-Dst_Z0_K.js} +1 -1
- package/static/app/assets/{hard-drive-CjJtYqHf.js → hard-drive-D53MsWkV.js} +1 -1
- package/static/app/assets/index-C_IrlQMV.js +10 -0
- package/static/app/assets/index-FxDusbr0.css +2 -0
- package/static/app/assets/{input-CSi6OBJ9.js → input-C5m0riF6.js} +1 -1
- package/static/app/assets/{network-Ck1nqc-v.js → network-C5a-E5iS.js} +1 -1
- package/static/app/assets/primitives-vNXYf58F.js +1 -0
- package/static/app/assets/search-DhbSgW6m.js +1 -0
- package/static/app/assets/shield-alert-Cc-WVXqN.js +1 -0
- package/static/app/assets/{textarea-C4wM0D-Z.js → textarea-BkZ0EqVO.js} +1 -1
- package/static/app/assets/{useFocusTrap-CsnIhsDJ.js → useFocusTrap-CTtKbAOU.js} +1 -1
- package/static/app/assets/{navigation-BPQqEQwr.js → useQuery-Dx1fi4Wu.js} +1 -1
- package/static/app/assets/users-BFpQXtEF.js +1 -0
- package/static/app/assets/utils-BA_lmW3J.js +7 -0
- package/static/app/assets/workspace-DBPB0jkX.js +1 -0
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/static/app/assets/Act-DmxfbqBp.js +0 -1
- package/static/app/assets/Brain-DK_zKCda.js +0 -321
- package/static/app/assets/BrainHome-CCE_0hni.js +0 -2
- package/static/app/assets/BrainSignals-r_J68_zh.js +0 -1
- package/static/app/assets/Capture-CvxwzpJZ.js +0 -1
- package/static/app/assets/CommandPalette-CVLiFIQC.js +0 -1
- package/static/app/assets/Library-4As9VUvy.js +0 -1
- package/static/app/assets/ProductFlow-B-Tz0Um4.js +0 -1
- package/static/app/assets/ReviewCard-Va3fPQuj.js +0 -3
- package/static/app/assets/System-DSR2zKWd.js +0 -1
- package/static/app/assets/index-7FAfYm4v.css +0 -2
- package/static/app/assets/index-CEu0Wqjl.js +0 -10
- package/static/app/assets/primitives-B2f9N7Dh.js +0 -1
- package/static/app/assets/shield-alert-yA_Y8lOB.js +0 -1
- package/static/app/assets/utils-BqoznzGP.js +0 -7
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,9 +24,9 @@ memory. Nothing leaves your machine without explicit consent.
|
|
|
24
24
|
|
|
25
25
|
| | |
|
|
26
26
|
| --- | --- |
|
|
27
|
-
| **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory  | **See how knowledge connects** — a real relationship graph, not a file list  |
|
|
28
|
+
| **Capture anything** — files, whole folders, notes, screenshots, web pages  | **Automate with review** — agent changes become proposals you approve first  |
|
|
29
|
+
| **Pick a model in one click** — recommended local models for your hardware  | **Stay in control** — audit, roles, retention in a separate admin surface  |
|
|
30
30
|
|
|
31
31
|
## Why Lattice AI
|
|
32
32
|
|
|
@@ -57,47 +57,41 @@ First-run flow — wake the Brain, pick the owner, load a recommended model:
|
|
|
57
57
|
|
|
58
58
|
| | | |
|
|
59
59
|
| --- | --- | --- |
|
|
60
|
-
|  |  |  |
|
|
61
61
|
|
|
62
62
|
Screenshot index and capture notes:
|
|
63
|
-
[output/release/
|
|
63
|
+
[output/release/v10.0.0/SCREENSHOT_INDEX.md](output/release/v10.0.0/SCREENSHOT_INDEX.md)
|
|
64
64
|
|
|
65
65
|
## Current Release
|
|
66
66
|
|
|
67
|
-
The current release is **
|
|
68
|
-
|
|
69
|
-
- **
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- **
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
- **Surface parity for approvals.** VS Code gains List/Approve/Reject
|
|
86
|
-
commands with token cache; Telegram handles both `waiting_approval` and
|
|
87
|
-
`awaiting_approval` with token-first resume.
|
|
88
|
-
- **Live sidecar E2E.** Nightly Playwright first-value tests hit a real
|
|
89
|
-
FastAPI sidecar (`npm run test:e2e:sidecar`), not only the visual mock
|
|
90
|
-
server.
|
|
67
|
+
The current release is **10.0.0 — Plain Language**:
|
|
68
|
+
|
|
69
|
+
- **The first screen is four things.** Your Brain, one input box, the autonomy
|
|
70
|
+
dial, and the capture controls — file, folder, note, web — now sit inside the
|
|
71
|
+
composer instead of a separate panel. The knowledge graph opens by clicking
|
|
72
|
+
the Brain, so the home shows no diagram at all.
|
|
73
|
+
- **Korean and English, everywhere.** A language switch sits in the top bar on
|
|
74
|
+
every screen, and the interface is fully translated in both directions:
|
|
75
|
+
memory tiers, agent roles, automation recipes, entity types, and every
|
|
76
|
+
backend payload label read in the language you picked.
|
|
77
|
+
- **Numbers say what they counted.** "출처 반영률 12%" is now "출처가 남은
|
|
78
|
+
기억 · 35 / 291개" with the sentence that explains it. Model names read
|
|
79
|
+
"Gemma 4 26B A4B Instruct", never `mlx-community/gemma-4-26b-a4b-it-4bit`.
|
|
80
|
+
- **Defects found by using it with a model loaded.** The conversation header
|
|
81
|
+
Brain rendered at 311px and covered 46% of the viewport; the sticky composer
|
|
82
|
+
hid the end of every answer; a nested payload printed its field names where
|
|
83
|
+
its values belonged; the folder button never opened a picker in a browser.
|
|
84
|
+
All fixed, each with a test.
|
|
91
85
|
|
|
92
86
|
Release notes: [RELEASE.md](RELEASE.md) · Full history: [docs/CHANGELOG.md](docs/CHANGELOG.md)
|
|
93
87
|
|
|
94
|
-
Expected artifacts for
|
|
88
|
+
Expected artifacts for 10.0.0 release must use exact filenames:
|
|
95
89
|
|
|
96
|
-
- `dist/ltcai-
|
|
97
|
-
- `dist/ltcai-
|
|
98
|
-
- `ltcai-
|
|
99
|
-
- `dist/ltcai-
|
|
100
|
-
- `src-tauri/target/release/bundle/dmg/Lattice
|
|
90
|
+
- `dist/ltcai-10.0.0-py3-none-any.whl`
|
|
91
|
+
- `dist/ltcai-10.0.0.tar.gz`
|
|
92
|
+
- `ltcai-10.0.0.tgz`
|
|
93
|
+
- `dist/ltcai-10.0.0.vsix`
|
|
94
|
+
- `src-tauri/target/release/bundle/dmg/Lattice AI_10.0.0_aarch64.dmg`
|
|
101
95
|
|
|
102
96
|
Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
|
|
103
97
|
|
|
@@ -117,18 +111,26 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
|
|
|
117
111
|
|
|
118
112
|
- External package registries are owner-published and can lag behind GitHub.
|
|
119
113
|
- PostgreSQL/pgvector is optional scale/migration tooling. SQLite remains the
|
|
120
|
-
live local Brain store in
|
|
114
|
+
live local Brain store in 10.0.0.
|
|
121
115
|
- Docker, model downloads, cloud model calls, Telegram, Brain Network, and
|
|
122
116
|
update checks require explicit user action.
|
|
123
117
|
- Conversation does not fabricate answers when no model is loaded. Agent and
|
|
124
118
|
workflow simulation without a loaded LLM is deterministic and LLM-free (it
|
|
125
119
|
does not call a model) — labeled as such, never presented as autonomous
|
|
126
120
|
model success.
|
|
121
|
+
- Some backend-generated messages (for example the Postgres DSN notice) are
|
|
122
|
+
produced server-side in English and are shown as-is; server-side i18n is not
|
|
123
|
+
part of 10.0.0.
|
|
127
124
|
|
|
128
125
|
## Release History
|
|
129
126
|
|
|
130
127
|
| Version | Theme |
|
|
131
128
|
| --- | --- |
|
|
129
|
+
| 10.0.0 | Plain Language |
|
|
130
|
+
| 9.9.9 | Lean Shell |
|
|
131
|
+
| 9.9.8 | Autonomy Dial |
|
|
132
|
+
| 9.9.7 | No Gaps Left |
|
|
133
|
+
| 9.9.6 | Same Brain Everywhere |
|
|
132
134
|
| 9.9.5 | Closed Gaps |
|
|
133
135
|
| 9.9.4 | Durable Loops |
|
|
134
136
|
| 9.9.3 | Closed Loops |
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,240 @@ 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
|
+
## [10.0.0] - 2026-07-28
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- The Brain home is four zones: the living Brain, one composer, the autonomy
|
|
11
|
+
dial, and capture. `BrainHomeHero` replaces the knowledge-flow canvas on the
|
|
12
|
+
home; the graph is reached by clicking the Brain.
|
|
13
|
+
- File / folder / note / web capture render inside the composer toolbar
|
|
14
|
+
(`BrainIngestionDock variant="inline"`), on both the home and the active
|
|
15
|
+
conversation. The standalone "Brain에게 가르치기" panel is removed.
|
|
16
|
+
- The top bar carries the language switch and the appearance toggle, so both
|
|
17
|
+
are reachable from every screen.
|
|
18
|
+
- Provenance coverage is reported as counts with an explanation
|
|
19
|
+
(`CoverageMeter`) instead of a bare percentage.
|
|
20
|
+
- Model identifiers are humanized for display (`humanizeModelId`); the catalog
|
|
21
|
+
display name wins when the id is known.
|
|
22
|
+
- Settings splits appearance (light/dark) from detail level (basic/advanced/
|
|
23
|
+
admin); they were one card labeled "화면 모양".
|
|
24
|
+
- Model list is ordered by what can be used now: loaded, ready, downloaded,
|
|
25
|
+
then the rest.
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
- The folder button did nothing in a browser: `pickFolder` called the
|
|
29
|
+
desktop-only `selectFolder`. `frontend/src/lib/folderPicker.ts` now owns the
|
|
30
|
+
desktop / File System Access / file-input decision for every surface.
|
|
31
|
+
- The conversation header Brain rendered at 311px — `size="trace"` had no size
|
|
32
|
+
rule and inherited the base `clamp(220px, 28vw, 320px)`.
|
|
33
|
+
- The sticky composer covered the end of the newest answer; the stream now
|
|
34
|
+
reserves room, and nothing renders after the composer.
|
|
35
|
+
- `ValuePreview` printed a nested object's field names as its value
|
|
36
|
+
("Runtime → Ready, Version, Execution Mode, Mode +4").
|
|
37
|
+
- `white-space: nowrap` on controls was inherited by descriptive text inside
|
|
38
|
+
them, clipping a 347px sentence to 288px in the autonomy panel.
|
|
39
|
+
- Markdown written by a model leaked into search-result titles and graph node
|
|
40
|
+
labels; `plainText` strips it.
|
|
41
|
+
- Duplicate `ui.field.health` keys in the shell namespace.
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
- ko/en parity across memory tiers, agent roles, automation recipes and their
|
|
45
|
+
outputs, entity types, status badges, and backend payload field labels.
|
|
46
|
+
- `plainText` and `humanizeModelId` in `frontend/src/lib/utils.ts`, with tests.
|
|
47
|
+
|
|
48
|
+
## [9.9.9] - 2026-07-27
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
- i18n is split per lazy route. `frontend/src/i18n/registry.ts` holds a shared
|
|
52
|
+
mutable table; `shell` registers eagerly (app frame, language switcher,
|
|
53
|
+
generic `ui.*`) and `brain` / `workspace` / `onboarding` register themselves
|
|
54
|
+
when their module is imported, which happens inside the lazy chunk of the
|
|
55
|
+
route that needs them. Initial static JS drops from 150.0 KiB to 99.3 KiB
|
|
56
|
+
gzip (505.1 KiB → 317.3 KiB raw), and lazy chunks kept off first paint go
|
|
57
|
+
from 25 to 32.
|
|
58
|
+
- The bundle budget returns to its original 150 KiB. 9.9.8 raised it to 152 KiB
|
|
59
|
+
because the shared i18n table made the ceiling unreachable without one; that
|
|
60
|
+
cause is gone.
|
|
61
|
+
- The admin console is behind a `React.lazy` boundary. It is a rare, separate
|
|
62
|
+
surface and it was pulling the whole workspace copy namespace onto first
|
|
63
|
+
paint.
|
|
64
|
+
- `brain.title` (the product wordmark) moved from the `brain` namespace to
|
|
65
|
+
`shell` — it renders in the app frame before any route resolves.
|
|
66
|
+
|
|
67
|
+
### Added
|
|
68
|
+
- `scripts/check_i18n_namespace_coverage.mjs`, wired into `npm run lint`. It
|
|
69
|
+
walks the real module graph and, for the eager root and every `React.lazy`
|
|
70
|
+
boundary, verifies each `t(lang, "key")` in that chunk's static closure is
|
|
71
|
+
covered by a namespace the chunk imports. Without it the split fails
|
|
72
|
+
silently: `t()` returns the raw key, so the UI shows `system.permission.title`
|
|
73
|
+
instead of Korean text with no error raised. Type-only imports are not
|
|
74
|
+
counted as runtime edges.
|
|
75
|
+
- `frontend/src/test/setup.ts` registers every namespace, because a unit test
|
|
76
|
+
renders a component without its route. Production coverage is proven by the
|
|
77
|
+
script above, not by this file.
|
|
78
|
+
|
|
79
|
+
## [9.9.8] - 2026-07-27
|
|
80
|
+
|
|
81
|
+
### Added
|
|
82
|
+
- Permission modes (`latticeai/core/permission_mode.py`): a `strict` /
|
|
83
|
+
`trusted` / `bypass` autonomy dial layered over ToolRegistry + Change
|
|
84
|
+
Governor. `strict` is the default and matches 9.9.7 behavior exactly.
|
|
85
|
+
- `GET/POST /api/permission-mode` and `GET /api/permission-mode/catalog`,
|
|
86
|
+
backed by `PermissionModeService` (per-workspace > per-user > process
|
|
87
|
+
default, `LATTICEAI_PERMISSION_MODE` for the default). Switching to
|
|
88
|
+
`bypass` requires `acknowledge_risk=true` and is audited.
|
|
89
|
+
- Mode-invariant circuit breakers: destructive risk, root/home paths,
|
|
90
|
+
`rm -rf /` style commands, and binary overwrites are denied in every mode.
|
|
91
|
+
- `AgentRunContext.permission_mode`: the mode is resolved once per run and
|
|
92
|
+
persisted with a paused approval, so a plan and its execution are judged by
|
|
93
|
+
one dial even if the stored preference changes mid-run.
|
|
94
|
+
- `PermissionModePanel` in 환경설정 → 에이전트 자율성: the dial is set from the
|
|
95
|
+
product, not only from the API. The selector renders the server's own
|
|
96
|
+
catalog instead of a hardcoded mode list and will not send a `bypass`
|
|
97
|
+
switch until the acknowledgement the server requires is ticked.
|
|
98
|
+
|
|
99
|
+
### Fixed
|
|
100
|
+
- Stored per-user and per-workspace modes never reached enforcement: the
|
|
101
|
+
bound resolver was called without a scope, so every caller collapsed onto
|
|
102
|
+
the process default and the dial had no effect. `enforce_policy` and the
|
|
103
|
+
agent tool gate now resolve with `user_email` / `workspace_id`.
|
|
104
|
+
- Orphan change proposals under `trusted` / `bypass`: the gate called
|
|
105
|
+
`ChangeGovernor.review()` — which persists a proposal as a side effect —
|
|
106
|
+
and then discarded the verdict, applying the change *and* leaving a pending
|
|
107
|
+
proposal in the Review Center. The mode is now decided before the governor
|
|
108
|
+
is consulted.
|
|
109
|
+
- `AgentRunContext` used `__slots__` with no `permission_mode` slot, making
|
|
110
|
+
the documented per-run override unreachable dead code.
|
|
111
|
+
- `PermissionModeService.set_mode()` deadlocked: it held a non-reentrant
|
|
112
|
+
`threading.Lock` while calling `resolve()`, which takes the same lock, so
|
|
113
|
+
every mode change hung its worker thread forever.
|
|
114
|
+
|
|
115
|
+
### Changed
|
|
116
|
+
- `enforce_policy`: the two `fail_closed` branches that both raised 409 are
|
|
117
|
+
one branch again — a binary overwrite has no safe apply path in any mode.
|
|
118
|
+
- `PermissionModeService.rebind_data_dir()` / `rebind_audit()`: explicit
|
|
119
|
+
wiring now rebinds an already-created singleton instead of being dropped,
|
|
120
|
+
so an early lazy caller cannot pin the store to `~/.ltcai` with no audit
|
|
121
|
+
sink.
|
|
122
|
+
- Initial-JS bundle budget raised 150 KiB → 152 KiB gzip. The 9.9.7 tree sat
|
|
123
|
+
at 149.3 KiB and the new settings panel needed ~1.0 KiB, nearly all of it
|
|
124
|
+
bilingual copy: page components are lazy, but `frontend/src/i18n/*` is one
|
|
125
|
+
synchronous table, so every surface's copy is on the first-paint path by
|
|
126
|
+
construction. Splitting i18n per lazy route is the durable fix and is not in
|
|
127
|
+
this release.
|
|
128
|
+
- The permission gates live in `SingleAgentRuntime` itself. `permission_mode`
|
|
129
|
+
is a real `AgentDeps` field, and `approval_requirements` /
|
|
130
|
+
`_blocked_by_gates` / `_governor_review` are mode-aware in place instead of
|
|
131
|
+
being replaced at construction time by a monkey-patch that would break
|
|
132
|
+
silently if those signatures changed.
|
|
133
|
+
|
|
134
|
+
### Removed
|
|
135
|
+
- `latticeai/core/agent_mode_patch.py` — the monkey-patch layer, folded into
|
|
136
|
+
`agent.py`.
|
|
137
|
+
- Dead no-op `if ... pass` block in `is_circuit_breaker`.
|
|
138
|
+
- `filter_governor_verdict`, unused after the governor fix.
|
|
139
|
+
|
|
140
|
+
## [9.9.7] - 2026-07-27
|
|
141
|
+
|
|
142
|
+
### Added
|
|
143
|
+
- `POST /agent` accepts `stream: true` and emits the same named `agent_step`
|
|
144
|
+
SSE frames the web chat route already produced; the terminal payload is
|
|
145
|
+
identical to the JSON response (`tests/unit/test_agent_stream_parity.py`).
|
|
146
|
+
- VS Code: `ltcai.runAgentLive` (live step timeline) and
|
|
147
|
+
`ltcai.evidenceActions` (one-click follow-ups from the last recall's cited
|
|
148
|
+
sources, file actions routed through the agent).
|
|
149
|
+
- Telegram: grounding badge on every answer plus `/review` — a Review Center
|
|
150
|
+
over `/api/proposals` with inline approve/reject and honest 409 reporting.
|
|
151
|
+
- Browser extension: "Ask your Brain" with the server's grounding verdict, and
|
|
152
|
+
pending-approval visibility. Still posts only to `127.0.0.1`.
|
|
153
|
+
- `GET /api/brain/garden` + `KnowledgeGardenPanel`: the knowledge garden in
|
|
154
|
+
four beds (recent / contradictions / stale / frequent), where "frequent" is
|
|
155
|
+
real graph degree and Chunk nodes are excluded.
|
|
156
|
+
- `latticeai/core/agent_profiles.py`: `standard` / `compact` agent profiles
|
|
157
|
+
selected from the model id (or `LATTICEAI_AGENT_PROFILE`), with a
|
|
158
|
+
direct-path fallback that writes the plan's files without any JSON tool call
|
|
159
|
+
when a small model cannot hold the protocol.
|
|
160
|
+
- `GET /knowledge-graph/local/health` + `FolderMemoryHealthCard`: per-folder
|
|
161
|
+
indexing coverage, failures with their stored reasons, and one explicitly
|
|
162
|
+
global vector-freshness figure.
|
|
163
|
+
- Skills `meeting_notes` and `weekly_review`, with a contract test that rejects
|
|
164
|
+
a skill whose `action` is not a registered tool.
|
|
165
|
+
- `POST /api/capture/voice` + `GET /api/capture/voice/status`
|
|
166
|
+
(`latticeai/services/voice_capture.py`): voice memo ingestion with an
|
|
167
|
+
optional local transcriber and honest degradation when none exists.
|
|
168
|
+
|
|
169
|
+
### Changed
|
|
170
|
+
- `docs/SURFACE_PARITY.md` contains no `✖` entries; every remaining `—` states
|
|
171
|
+
why it is a design boundary.
|
|
172
|
+
- The browser extension is no longer described as capture-only (manifest name,
|
|
173
|
+
popup, README).
|
|
174
|
+
|
|
175
|
+
### Fixed
|
|
176
|
+
- The VS Code SSE reader kept the `event:` name, so named `agent_step` frames
|
|
177
|
+
are no longer misread as chat chunks.
|
|
178
|
+
- `garden_overview` clamps an explicit `limit=0` to 1 instead of silently
|
|
179
|
+
re-expanding it to the default.
|
|
180
|
+
|
|
181
|
+
## [9.9.6] - 2026-07-27
|
|
182
|
+
|
|
183
|
+
### Added
|
|
184
|
+
- Surface parity for VS Code: `ltcai.askBrain` (grounding badge on recall),
|
|
185
|
+
`ltcai.reviewCenter` (list/approve/reject staged change proposals via
|
|
186
|
+
`/api/proposals`, 409 conflicts reported honestly), `ltcai.runAgent`
|
|
187
|
+
(post-run step + outcome summary). Parity logic lives in
|
|
188
|
+
`vscode-extension/surface.ts`, asserted by `tests/vscode-extension.test.cjs`
|
|
189
|
+
(wired into `npm run lint`).
|
|
190
|
+
- `POST /api/evidence/actions` + `latticeai/services/evidence_actions.py`:
|
|
191
|
+
deterministic, model-free composition of evidence-scoped follow-up prompts
|
|
192
|
+
(summary / checklist / document / one-page) from an answer's citations.
|
|
193
|
+
- `latticeai/core/run_explain.py`: deterministic plain-language run outcome
|
|
194
|
+
(`code`, `headline`, `details`, `model_strain`, `next_step`), returned as
|
|
195
|
+
`explanation` on `/agent` and rendered in the web app, VS Code, and Telegram.
|
|
196
|
+
- `prose` chunking strategy (`lattice_brain/graph/_kg_common.py`): sentence and
|
|
197
|
+
paragraph-aware boundaries for `.txt/.pdf/.docx/.html/…`; `plain` stays
|
|
198
|
+
byte-identical to the legacy walk.
|
|
199
|
+
- `citation_locator()` + chunk metadata on vector hits: citations name the
|
|
200
|
+
section/page they came from (`Guide > Setup · p.4`, `p.4–5` across a page
|
|
201
|
+
break) and stay silent when the chunk cannot prove it.
|
|
202
|
+
- `infer_edge_relation()` + `plan_relation_noise_reduction()`: relations carry
|
|
203
|
+
an evidence class (`verb` | `cooccurrence`) with matching weights; the
|
|
204
|
+
curator can demote weak/hub co-occurrence edges without touching verb-backed
|
|
205
|
+
or legacy ones.
|
|
206
|
+
- Project sessions: `latticeai/core/project_sessions.py` + `/api/projects`
|
|
207
|
+
(files produced, open TODOs, last honest verification, run history). `/agent`
|
|
208
|
+
accepts `project_id`, injects the project state into planning/execution, and
|
|
209
|
+
folds the run's outcome back in.
|
|
210
|
+
- `latticeai/core/artifact_ledger.py` + a `Files created in this conversation`
|
|
211
|
+
context section: files a run just wrote are recallable before asynchronous
|
|
212
|
+
indexing catches up.
|
|
213
|
+
- `requirement_coverage()`: a critic `PASS` that left a declared manifest file
|
|
214
|
+
unwritten now ends as `NEEDS_REVIEW`.
|
|
215
|
+
- `funnel_alerts()`: `GET /api/admin/funnel-metrics` returns named, actionable
|
|
216
|
+
alerts with the triggering value; silent below 10 samples.
|
|
217
|
+
- Stale-embedder recovery UI: names the problem and offers a one-click
|
|
218
|
+
re-index, with an honest failure message.
|
|
219
|
+
- `lattice_brain/ingestion_jobs.py` and
|
|
220
|
+
`latticeai/core/workspace_review_items.py`: behaviour-preserving extractions.
|
|
221
|
+
- Six additional multi-agent/workflow scenarios (retry exhaustion, recovery,
|
|
222
|
+
two-gate pause/resume, stale resume cursor, per-role observability, cross-run
|
|
223
|
+
role isolation).
|
|
224
|
+
|
|
225
|
+
### Changed
|
|
226
|
+
- Document generation shares chat's context contract: same `approx_tokens`
|
|
227
|
+
budget, same `context_quality` signal, same assembly `trace` shape.
|
|
228
|
+
- `chunk_strategy_for()` routes prose document formats to the new `prose`
|
|
229
|
+
strategy (newly ingested `.txt/.pdf/.docx/.html` content gets different chunk
|
|
230
|
+
ids; existing indexed content is untouched).
|
|
231
|
+
- The VS Code HTTP client rejects on 4xx/5xx instead of resolving an error body
|
|
232
|
+
as success.
|
|
233
|
+
|
|
234
|
+
### Fixed
|
|
235
|
+
- A verb-less sentence listing more than four concepts no longer manufactures
|
|
236
|
+
a chain of `관련됨` relations.
|
|
237
|
+
- `stale_embedder` was computed but never surfaced in the UI.
|
|
238
|
+
- PDF chunks that span a page break are labelled with the page range they
|
|
239
|
+
actually cover instead of only their starting page.
|
|
240
|
+
|
|
7
241
|
## [9.9.5] - 2026-07-26
|
|
8
242
|
|
|
9
243
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Community And Plugins
|
|
2
2
|
|
|
3
|
-
Current release: **
|
|
3
|
+
Current release: **10.0.0 — Plain Language**.
|
|
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: **
|
|
6
|
+
Current release: **10.0.0 — Plain Language**.
|
|
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
|
package/docs/ONBOARDING.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lattice AI Onboarding
|
|
2
2
|
|
|
3
|
-
Current release: **
|
|
3
|
+
Current release: **10.0.0 — Plain Language**.
|
|
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 (
|
|
1
|
+
# Lattice AI — Operations Guide (v10.0.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
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
| `~/.ltcai/audit.json` | 감사 로그 (agent 실행, 사용자 변경 등) |
|
|
15
15
|
| `~/.ltcai/chat_history.json` | 레거시 대화 히스토리 — 최초 1회 SQLite로 idempotent 임포트 후 미사용 |
|
|
16
16
|
| `~/ltcai-agent/` | Agent workspace (agent가 생성한 파일) |
|
|
17
|
+
| `~/.ltcai/agent_runs/` | 승인 대기 중인 에이전트 런 (재시작 생존, 토큰은 해시로만 저장) |
|
|
18
|
+
| `~/.ltcai/project_sessions/` | 프로젝트 세션 (v9.9.6) — 프로젝트가 만든 파일, 남은 할 일, 마지막 검증 결과 |
|
|
17
19
|
|
|
18
20
|
## 2. 백업 및 복구
|
|
19
21
|
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Permission Mode (v9.9.8)
|
|
2
|
+
|
|
3
|
+
Frontier agents expose an autonomy dial. LatticeAI maps the same idea onto
|
|
4
|
+
ToolRegistry + Change Governor without discarding fail-closed defaults.
|
|
5
|
+
|
|
6
|
+
## Modes
|
|
7
|
+
|
|
8
|
+
| Mode | Workspace writes | Knowledge reads | Exec / desktop control | Mutations |
|
|
9
|
+
|------|------------------|-----------------|------------------------|-----------|
|
|
10
|
+
| **strict** (default) | approval / proposal | gated | gated | Review proposals |
|
|
11
|
+
| **trusted** | auto | auto | gated | auto-apply + audit |
|
|
12
|
+
| **bypass** | auto | auto | auto (workspace) | auto-apply + audit |
|
|
13
|
+
|
|
14
|
+
Hard circuit breakers always apply: destructive risk, `rm -rf /` / `~`,
|
|
15
|
+
blocked path prefixes, binary overwrite without proposal support.
|
|
16
|
+
|
|
17
|
+
Under **trusted** / **bypass** the governed mutation path is decided *before*
|
|
18
|
+
`ChangeGovernor.review` runs. That call persists a proposal as a side effect, so
|
|
19
|
+
reviewing first and discarding the verdict afterwards would apply the change
|
|
20
|
+
*and* leave an orphan proposal pending in the Review Center.
|
|
21
|
+
|
|
22
|
+
## API
|
|
23
|
+
|
|
24
|
+
```http
|
|
25
|
+
GET /api/permission-mode
|
|
26
|
+
GET /api/permission-mode/catalog
|
|
27
|
+
POST /api/permission-mode
|
|
28
|
+
{"mode": "trusted"}
|
|
29
|
+
{"mode": "bypass", "acknowledge_risk": true}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Scope: optional `workspace_id` query/body or `X-Workspace-Id` header.
|
|
33
|
+
Per-workspace overrides per-user; both override the process default.
|
|
34
|
+
|
|
35
|
+
Env default: `LATTICEAI_PERMISSION_MODE=strict|trusted|bypass`.
|
|
36
|
+
|
|
37
|
+
## UI
|
|
38
|
+
|
|
39
|
+
`PermissionModePanel` renders in **환경설정 → 에이전트 자율성** (`SystemPage`
|
|
40
|
+
settings tab). It renders the catalog `/api/permission-mode` returns rather
|
|
41
|
+
than a hardcoded mode list, so adding or renaming a mode server-side needs no
|
|
42
|
+
frontend change, and it keeps the apply button disabled until
|
|
43
|
+
|
|
44
|
+
* a *different* mode is selected, and
|
|
45
|
+
* for a mode whose catalog entry sets `requires_ack`, the risk acknowledgement
|
|
46
|
+
is ticked — the same condition the server enforces, so the UI never sends a
|
|
47
|
+
request it knows will be refused.
|
|
48
|
+
|
|
49
|
+
A failed change is surfaced with the server's own message; the panel never
|
|
50
|
+
reports success it did not get.
|
|
51
|
+
|
|
52
|
+
## Scope resolution
|
|
53
|
+
|
|
54
|
+
Scope is not cosmetic — it is what makes a stored override take effect. Every
|
|
55
|
+
enforcement point resolves the dial *with the caller's identity*:
|
|
56
|
+
|
|
57
|
+
| Enforcement point | Scope passed |
|
|
58
|
+
|-------------------|--------------|
|
|
59
|
+
| `ToolDispatchService.enforce_policy` | `current_user` + `workspace_id` |
|
|
60
|
+
| `SingleAgentRuntime` tool gate | `current_user` + `req.workspace_id` |
|
|
61
|
+
| Agent plan gate | the run's stamped mode (see below) |
|
|
62
|
+
|
|
63
|
+
`chat_agent_http` resolves the mode **once per run** and stamps it on
|
|
64
|
+
`AgentRunContext.permission_mode`, so the plan the user approved and every tool
|
|
65
|
+
step in that run are judged by the same dial even if the stored preference
|
|
66
|
+
changes mid-run. A paused approval run persists that stamp, so it resumes under
|
|
67
|
+
the mode it was approved with.
|
|
68
|
+
|
|
69
|
+
A resolver bound into `ToolDispatchService.permission_mode` may accept
|
|
70
|
+
`user_email`/`workspace_id` kwargs (preferred) or take no arguments; see
|
|
71
|
+
`call_mode_source`. An unscoped resolver always returns the process default —
|
|
72
|
+
which would make per-user and per-workspace overrides silently inert.
|
|
73
|
+
|
|
74
|
+
## Wiring (automatic)
|
|
75
|
+
|
|
76
|
+
No manual `app_factory` edits required. On startup:
|
|
77
|
+
|
|
78
|
+
1. `build_chat_agent_runtime_from_context` binds dispatch + agent to the
|
|
79
|
+
shared mode resolver.
|
|
80
|
+
2. `register_review_and_brain_tail_routers` mounts `/api/permission-mode`
|
|
81
|
+
and rebinds `PermissionModeService` onto the real `data_dir` + audit sink.
|
|
82
|
+
|
|
83
|
+
Step 2 *rebinds* rather than "first caller wins": a tool dispatch that happens
|
|
84
|
+
before routers are mounted would otherwise pin the store to the fallback
|
|
85
|
+
`~/.ltcai` path with no audit sink.
|
|
86
|
+
|
|
87
|
+
## Code map
|
|
88
|
+
|
|
89
|
+
| Module | Role |
|
|
90
|
+
|--------|------|
|
|
91
|
+
| `latticeai/core/permission_mode.py` | Pure decision table |
|
|
92
|
+
| `latticeai/core/agent_permission.py` | Agent plan/tool gate helpers |
|
|
93
|
+
| `latticeai/core/agent.py` | `SingleAgentRuntime` gates (mode-aware in-line) |
|
|
94
|
+
| `frontend/src/components/PermissionModePanel.tsx` | Settings selector |
|
|
95
|
+
| `latticeai/services/permission_mode_service.py` | Persistence |
|
|
96
|
+
| `latticeai/runtime/permission_mode_wiring.py` | Process-wide service + router mount |
|
|
97
|
+
| `latticeai/runtime/chat_wiring.py` | Agent runtime injection |
|
|
98
|
+
| `latticeai/runtime/router_registration.py` | HTTP mount |
|
|
99
|
+
| `latticeai/services/tool_dispatch.py` | `enforce_policy` + `build_agent_runtime` |
|
|
100
|
+
| `latticeai/api/permission_mode.py` | HTTP routes |
|
|
101
|
+
|
|
102
|
+
## AGENTS.md note
|
|
103
|
+
|
|
104
|
+
Under **strict**, the existing rule holds: never mutate existing user content
|
|
105
|
+
directly — stage proposals. Under **trusted** / **bypass**, the user has
|
|
106
|
+
explicitly raised autonomy; mutations auto-apply with audit, circuit breakers
|
|
107
|
+
still deny destructive system actions.
|
package/docs/SURFACE_PARITY.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Status: reference**
|
|
4
4
|
> 도입: v9.9.4 (2026-07-25, 리뷰 Wave 1.4 "표면 패리티 체크리스트").
|
|
5
|
-
> 갱신: v9.9.
|
|
5
|
+
> 갱신: v9.9.7 — 표에 남아 있던 ✖ 갭을 **전부** 해소. Browser 확장도 캡처 전용 경계를 넘어 회상/승인 가시성을 갖췄다.
|
|
6
6
|
> 목적: 각 표면(서피스)이 Brain 계약의 어디까지를 제공하는지 **정직하게** 기록한다.
|
|
7
7
|
> "앱마다 다른 Lattice"를 방지하는 기준표이며, 기능을 과장하지 않는다.
|
|
8
8
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
| Web `/app` | FastAPI sidecar가 서빙하는 SPA (`static/app`) | 1차 표면 — 모든 기능의 기준 |
|
|
14
14
|
| Desktop | Tauri 셸 (`src-tauri/`) | 동일 SPA를 감싸는 셸 — 웹과 구조적 동일 |
|
|
15
15
|
| VS Code | `vscode-extension/` (`ltcai.*` 커맨드) | 에디터 보조 표면 |
|
|
16
|
-
| Browser | `browser-extension/`
|
|
16
|
+
| Browser | `browser-extension/` | 캡처 + 회상 + 승인 가시성 (v9.9.7) |
|
|
17
17
|
| Telegram | 봇 어댑터 | 대화 전용 표면 |
|
|
18
18
|
|
|
19
19
|
## 네 가지 루프 순간 × 표면
|
|
@@ -23,19 +23,24 @@
|
|
|
23
23
|
| 루프 순간 | Web `/app` | Desktop | VS Code | Browser | Telegram |
|
|
24
24
|
| --- | --- | --- | --- | --- | --- |
|
|
25
25
|
| 첫 저장 (Capture) | ✅ DnD·폴더·웹 수집, 품질 경고 | ✅ (웹과 동일) | ◐ `sendToLattice` 선택 영역 전송 | ✅ 페이지 캡처 (단일 목적) | ◐ 메시지 수집 |
|
|
26
|
-
| 첫 회상 (Recall) | ✅ 하이브리드 검색 + grounding 배지 + 출처→청크 | ✅ (동일) |
|
|
27
|
-
| 첫 산출물 (Artifact) | ✅ artifacts[] 카드·미리보기·Brain 기억 칩 | ✅ (동일) | ◐ `createFile`
|
|
28
|
-
| 첫 보호 (Approval) | ✅ 승인 카드 + TTL 카운트다운 + 재시작 생존 | ✅ (동일) | ✅ List/Approve/Reject 커맨드 + 토큰 캐시 |
|
|
26
|
+
| 첫 회상 (Recall) | ✅ 하이브리드 검색 + grounding 배지 + 출처→청크 | ✅ (동일) | ✅ `askCurrentFile`/`askBrain` — 동일 `/chat` grounding 배지 | ✅ 팝업 질문 + 동일 grounding 배지 (v9.9.7) | ✅ 답변 + grounding 배지 (v9.9.7) |
|
|
27
|
+
| 첫 산출물 (Artifact) | ✅ artifacts[] 카드·미리보기·Brain 기억 칩 | ✅ (동일) | ◐ `createFile` + `runAgent`/`runAgentLive` 스텝·파일 요약, 카드 UI 없음 | — (의도: 브라우저에서 파일 쓰기 없음) | ◐ 파일 전송만 |
|
|
28
|
+
| 첫 보호 (Approval) | ✅ 승인 카드 + TTL 카운트다운 + 재시작 생존 | ✅ (동일) | ✅ List/Approve/Reject 커맨드 + 토큰 캐시 | ✅ 대기 건수 표시 (승인은 웹에서, v9.9.7) | ✅ 인라인 Done/Cancel + run_id/token 재개 |
|
|
29
29
|
|
|
30
30
|
## 기능 상세 × 표면
|
|
31
31
|
|
|
32
32
|
| 기능 | Web `/app` | Desktop | VS Code | Browser | Telegram |
|
|
33
33
|
| --- | --- | --- | --- | --- | --- |
|
|
34
|
-
| 에이전트 스텝 타임라인 (v9.9.4) | ✅ 라이브 SSE | ✅ | — | — | — |
|
|
34
|
+
| 에이전트 스텝 타임라인 (v9.9.4) | ✅ 라이브 SSE | ✅ | ✅ `runAgentLive` — `POST /agent` `stream:true`의 동일 `agent_step` 프레임 (v9.9.7) | — (의도) | — (의도) |
|
|
35
|
+
| 실행 결과 평문 설명 (v9.9.6) | ✅ 메시지 하단 노트 | ✅ | ✅ `runAgent` 출력 채널 | — | ✅ 답변 뒤 요약 메시지 |
|
|
36
|
+
| 근거 → 행동 원클릭 (v9.9.6) | ✅ 답변 근거 카드 | ✅ | ✅ `ltcai.evidenceActions` (v9.9.7) | — (의도) | — (의도) |
|
|
37
|
+
| 지식 정원 4화단 (v9.9.7) | ✅ 홈 패널 | ✅ | — (의도) | — (의도) | — (의도) |
|
|
38
|
+
| 폴더별 기억 상태 (v9.9.7) | ✅ Capture 카드 | ✅ | — (의도) | — (의도) | — (의도) |
|
|
39
|
+
| 음성 메모 캡처 (v9.9.7) | ✅ `POST /api/capture/voice` | ✅ | — (의도) | — (의도) | — (의도) |
|
|
35
40
|
| 승인 재개 (`/agent/resume`) | ✅ | ✅ | ✅ `ltcai.approveAgent` / `rejectAgent` | — | ✅ callback → resume |
|
|
36
41
|
| 대기 중 승인 목록 (`GET /agent/approvals`, v9.9.4) | ✅ | ✅ | ✅ `ltcai.listApprovals` | — | — (봇 로컬 pending map) |
|
|
37
42
|
| Watch 상태 신호 (v9.9.4) | ✅ 홈 카드 | ✅ | — | — | — |
|
|
38
|
-
| Review Center (제안 승인/거절) | ✅ | ✅ |
|
|
43
|
+
| Review Center (제안 승인/거절) | ✅ | ✅ | ✅ `ltcai.reviewCenter` (409 충돌 정직 보고) | — (의도: 승인은 웹/에디터/봇에서) | ✅ `/review` + 인라인 승인/거절 (v9.9.7) |
|
|
39
44
|
| 데모 코퍼스 First Value Loop | ✅ | ✅ | — | — | — |
|
|
40
45
|
| 모델 로드/추천 | ✅ | ✅ | ◐ `loadModel` | — | — |
|
|
41
46
|
| 코드 편집 보조 (edit/explain/refactor/tests) | — | — | ✅ | — | — |
|
|
@@ -44,10 +49,35 @@
|
|
|
44
49
|
|
|
45
50
|
1. **API 계약이 기준이다.** 모든 표면은 동일한 sidecar API를 소비한다. 표면별 전용 API를 만들지 않는다.
|
|
46
51
|
2. **◐/✖ 는 문서화된 상태로만 존재한다.** 새 기능을 Web에 추가할 때 이 표를 갱신하고, 다른 표면에 제공하지 않을 경우 "—(의도)" 인지 "✖(갭)" 인지 명시한다.
|
|
47
|
-
3. **✖ 갭은 릴리스 노트의 Honest Limitations 후보다.**
|
|
52
|
+
3. **✖ 갭은 릴리스 노트의 Honest Limitations 후보다.** v9.9.7 기준 표에 남은 ✖는 **없다**.
|
|
53
|
+
- 남은 "—"는 전부 **설계 경계**이며, 각 항목에 이유를 함께 적는다. 예: 브라우저 확장은 파일을 쓰지 않으므로 산출물 생성이 없고, 승인 *결정*은 서명된 토큰이 필요한 흐름이라 대기 건수만 보여 주고 승인은 웹/에디터/봇에서 한다.
|
|
54
|
+
- 경계를 새로 만들 때는 "왜 제공하지 않는가"를 이 문서에 남긴다. 이유 없는 "—"는 갭이지 경계가 아니다.
|
|
48
55
|
4. 릴리스마다 이 표를 검토한다 (release checklist의 docs 단계).
|
|
49
56
|
|
|
50
57
|
## VS Code / Telegram 승인 메모 (v9.9.5)
|
|
51
58
|
|
|
52
59
|
- **토큰은 GET `/agent/approvals`에 다시 내려가지 않는다** (보안). Web은 일시 중지 응답의 토큰을 클라이언트에 보관하고, VS Code도 동일하게 pause 응답의 토큰을 확장 세션 캐시에 둔다. 캐시에 없으면 붙여넣기 또는 웹 UI로 유도한다.
|
|
53
60
|
- **Telegram**은 `waiting_approval`(레거시 `human_in_loop`)과 `awaiting_approval`(토큰) 둘 다 인라인 키보드로 처리하며, resume 시 run_id+token을 우선한다.
|
|
61
|
+
|
|
62
|
+
## VS Code 회상·검토 메모 (v9.9.6)
|
|
63
|
+
|
|
64
|
+
- **회상 배지**: `askCurrentFile` / `askBrain`은 웹과 동일한 `POST /chat` 응답의 `grounding` 판정을 그대로 읽는다. 판정이 없으면 "근거 있음"으로 승격하지 않고 `unknown`으로 보고한다 (`vscode-extension/surface.ts::groundingBadge`).
|
|
65
|
+
- **Review Center**: `ltcai.reviewCenter`는 웹과 같은 `/api/proposals` 표면을 쓴다. 승인은 검토한 내용 그대로 적용하고, 409(스테이징 이후 파일 변경)는 "아무것도 쓰지 않았다"고 정직하게 알린다.
|
|
66
|
+
- **스텝 요약**: `ltcai.runAgent`는 실행 후 `steps`/`created_files`/`explanation`을 출력 채널에 요약한다. 라이브 SSE 타임라인은 아직 웹 전용이다 (◐).
|
|
67
|
+
- 파싱 계약은 `tests/vscode-extension.test.cjs`가 sidecar 페이로드 모양 그대로 검증한다.
|
|
68
|
+
|
|
69
|
+
## v9.9.7 — 남은 갭을 닫은 방법
|
|
70
|
+
|
|
71
|
+
- **VS Code 라이브 스텝**: `POST /agent`에 `stream: true`가 생겼다. 웹이 채팅
|
|
72
|
+
경로로 받던 것과 **같은** `agent_step` 프레임을 그대로 내보내고, 마지막 프레임의
|
|
73
|
+
터미널 페이로드는 JSON 응답과 동일하다 (`tests/unit/test_agent_stream_parity.py`가
|
|
74
|
+
두 경로의 동등성을 고정한다).
|
|
75
|
+
- **VS Code 근거→행동**: 회상 응답의 `grounding.cited`를 확장이 기억했다가
|
|
76
|
+
`/api/evidence/actions`로 보낸다. 파일을 만드는 액션은 에이전트로 흘려보내
|
|
77
|
+
실제 산출물이 나오게 하고, 대화 액션은 채팅 패널로 보낸다.
|
|
78
|
+
- **Telegram 회상 배지 / Review Center**: 서버가 낸 판정을 그대로 렌더하고,
|
|
79
|
+
`/review`가 `/api/proposals`를 그대로 소비한다. 409는 "아무것도 쓰지 않았다"로
|
|
80
|
+
보고한다.
|
|
81
|
+
- **Browser 확장**: 캡처 전용 경계를 넘어 `/chat` 질문과 `agent/approvals` 대기
|
|
82
|
+
건수를 보여 준다. **판정을 로컬에서 계산하지 않는다** — 판정이 없으면
|
|
83
|
+
"근거 확인 불가"이며 절대 "근거 있음"으로 승격하지 않는다.
|
package/docs/TRUST_MODEL.md
CHANGED
package/docs/WHY_LATTICE.md
CHANGED