ltcai 9.9.4 → 9.9.9
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 +43 -42
- package/docs/CHANGELOG.md +228 -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 +45 -9
- 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/rerank.py +160 -0
- package/lattice_brain/graph/retrieval.py +28 -442
- package/lattice_brain/graph/retrieval_reads.py +459 -0
- package/lattice_brain/graph/retrieval_vector.py +10 -0
- package/lattice_brain/graph/store.py +2 -0
- package/lattice_brain/ingestion.py +9 -106
- package/lattice_brain/ingestion_jobs.py +133 -0
- package/lattice_brain/quality.py +26 -6
- 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 +206 -48
- package/latticeai/api/chat_contracts.py +10 -1
- 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 +536 -60
- 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 +7 -0
- package/latticeai/core/workspace_os.py +15 -80
- package/latticeai/core/workspace_review_items.py +107 -0
- package/latticeai/integrations/telegram_bot.py +270 -23
- 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 +129 -4
- package/latticeai/services/voice_capture.py +189 -0
- package/package.json +6 -3
- 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/scripts/run_sidecar_e2e.mjs +159 -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-BFbpl2_Y.js +1 -0
- package/static/app/assets/AdminConsole-DaZPha9Y.js +1 -0
- package/static/app/assets/Brain-DGrV0heZ.js +321 -0
- package/static/app/assets/BrainHome-Re6Zxh_W.js +2 -0
- package/static/app/assets/BrainSignals-BQ11jDpJ.js +1 -0
- package/static/app/assets/Capture-DRaf1zLH.js +1 -0
- package/static/app/assets/CommandPalette-DAKPm4uJ.js +1 -0
- package/static/app/assets/LanguageSwitcher-BgTwHoWv.js +1 -0
- package/static/app/assets/Library-BVtrSt12.js +1 -0
- package/static/app/assets/LivingBrain-7glOmK0R.js +1 -0
- package/static/app/assets/ProductFlow-cB3EFinZ.js +1 -0
- package/static/app/assets/ReviewCard-CShhHS-w.js +3 -0
- package/static/app/assets/System-B4nQDy8a.js +1 -0
- package/static/app/assets/{bot-nB_buEZD.js → bot-DtKkLfXj.js} +1 -1
- package/static/app/assets/brain-wVV63_1z.js +1 -0
- package/static/app/assets/button-BTxZDMFJ.js +1 -0
- package/static/app/assets/{circle-pause-DLNw6Ucp.js → circle-pause--qxF9-EO.js} +1 -1
- package/static/app/assets/{circle-play-B-IsFL1y.js → circle-play-89x3S6jm.js} +1 -1
- package/static/app/assets/{cpu-CEPBHaBl.js → cpu-DTUI63vo.js} +1 -1
- package/static/app/assets/download-EJS5_O0f.js +1 -0
- package/static/app/assets/{folder-open-hmN0N9cX.js → folder-open-BL9zYTnc.js} +1 -1
- package/static/app/assets/{hard-drive-CBV_B_Yd.js → hard-drive-BFnwi1Lu.js} +1 -1
- package/static/app/assets/index-BFtDYI6l.js +10 -0
- package/static/app/assets/index-BY9bpxyx.css +2 -0
- package/static/app/assets/input-DEz5UjBz.js +1 -0
- package/static/app/assets/{network-jE42eKfT.js → network-zKa3jAwl.js} +1 -1
- package/static/app/assets/primitives-jNrZm2O9.js +1 -0
- package/static/app/assets/search-ku6-_6wY.js +1 -0
- package/static/app/assets/shield-alert-CpHeCsaF.js +1 -0
- package/static/app/assets/textarea-DpcQkn75.js +1 -0
- package/static/app/assets/{useFocusTrap-B7RPGfFy.js → useFocusTrap-58TNCONM.js} +1 -1
- package/static/app/assets/{navigation-Bot0hvuv.js → useQuery-CcVlXlBd.js} +1 -1
- package/static/app/assets/users-C0cFMj6o.js +1 -0
- package/static/app/assets/utils-DYf7pqrR.js +7 -0
- package/static/app/assets/workspace-CjthHsLN.js +1 -0
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/static/app/assets/Act-BCmTU0E2.js +0 -1
- package/static/app/assets/Brain-CTnjox7w.js +0 -321
- package/static/app/assets/BrainHome-BJ3sFNX0.js +0 -2
- package/static/app/assets/BrainSignals-C52lwZVD.js +0 -1
- package/static/app/assets/Capture-B6vBhFa3.js +0 -1
- package/static/app/assets/CommandPalette-90u9FWFH.js +0 -1
- package/static/app/assets/Library-pKCK0_tk.js +0 -1
- package/static/app/assets/LivingBrain-Jlf2wFqI.js +0 -1
- package/static/app/assets/ProductFlow-yg1fKP1P.js +0 -1
- package/static/app/assets/ReviewCard-DWvD7n9h.js +0 -3
- package/static/app/assets/System-BAEuHqNY.js +0 -1
- package/static/app/assets/index-7FAfYm4v.css +0 -2
- package/static/app/assets/index-DrmOCySv.js +0 -10
- package/static/app/assets/input-gtVCg-ll.js +0 -1
- package/static/app/assets/primitives-CX2Komon.js +0 -1
- package/static/app/assets/shield-alert-BftATuAA.js +0 -1
- package/static/app/assets/textarea-CiMJfOSI.js +0 -1
- package/static/app/assets/utils-SJUNVOj5.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,52 +57,48 @@ 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/v9.9.
|
|
63
|
+
[output/release/v9.9.9/SCREENSHOT_INDEX.md](output/release/v9.9.9/SCREENSHOT_INDEX.md)
|
|
64
64
|
|
|
65
65
|
## Current Release
|
|
66
66
|
|
|
67
|
-
The current release is **9.9.
|
|
68
|
-
|
|
69
|
-
- **
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
- **
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
- **
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- **A wider harness.** Manifest-aware plan rewriting plus React/Vite and
|
|
93
|
-
Python-package manifests, a bounded executor context window, five
|
|
94
|
-
deterministic workflow scenarios, a funnel soft gate, and a weekly
|
|
95
|
-
fail-open real-model agent smoke with a report artifact.
|
|
67
|
+
The current release is **9.9.9 — Lean Shell**:
|
|
68
|
+
|
|
69
|
+
- **No `✖` left in the parity matrix.** Every gap 9.9.6 wrote down is closed,
|
|
70
|
+
and every remaining `—` states *why* it is a boundary
|
|
71
|
+
([docs/SURFACE_PARITY.md](docs/SURFACE_PARITY.md)).
|
|
72
|
+
- **VS Code watches the loop live.** `POST /agent` streams the same
|
|
73
|
+
`agent_step` frames the web app gets, and cited evidence turns into one-click
|
|
74
|
+
follow-ups in the editor.
|
|
75
|
+
- **Telegram badges its recall and reviews changes.** The server's grounding
|
|
76
|
+
verdict is shown as-is, and `/review` approves or rejects staged proposals
|
|
77
|
+
inline.
|
|
78
|
+
- **The browser extension recalls, not just captures.** Ask your Brain from the
|
|
79
|
+
popup with the same badge, and see how many runs await approval — still
|
|
80
|
+
posting only to `127.0.0.1`.
|
|
81
|
+
- **A knowledge garden in four beds** — what arrived, what disagrees, what went
|
|
82
|
+
stale, what the rest leans on.
|
|
83
|
+
- **A profile for small local models.** Under 4B, the loop shortens its window,
|
|
84
|
+
escalates sooner, and — when JSON tool calls keep failing — writes the
|
|
85
|
+
planned files directly instead of ending empty-handed.
|
|
86
|
+
- **Folder memory state.** How much of each connected folder is really in your
|
|
87
|
+
Brain, what failed, and the reason it failed.
|
|
88
|
+
- **Two skills that pay off on install** — meeting notes and a weekly review
|
|
89
|
+
written only from what the Brain actually recorded.
|
|
90
|
+
- **Voice memos** go straight into the Brain; when no local transcriber exists
|
|
91
|
+
the memo is still stored and honestly marked not-searchable.
|
|
96
92
|
|
|
97
93
|
Release notes: [RELEASE.md](RELEASE.md) · Full history: [docs/CHANGELOG.md](docs/CHANGELOG.md)
|
|
98
94
|
|
|
99
|
-
Expected artifacts for 9.9.
|
|
95
|
+
Expected artifacts for 9.9.9 release must use exact filenames:
|
|
100
96
|
|
|
101
|
-
- `dist/ltcai-9.9.
|
|
102
|
-
- `dist/ltcai-9.9.
|
|
103
|
-
- `ltcai-9.9.
|
|
104
|
-
- `dist/ltcai-9.9.
|
|
105
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_9.9.
|
|
97
|
+
- `dist/ltcai-9.9.9-py3-none-any.whl`
|
|
98
|
+
- `dist/ltcai-9.9.9.tar.gz`
|
|
99
|
+
- `ltcai-9.9.9.tgz`
|
|
100
|
+
- `dist/ltcai-9.9.9.vsix`
|
|
101
|
+
- `src-tauri/target/release/bundle/dmg/Lattice AI_9.9.9_aarch64.dmg`
|
|
106
102
|
|
|
107
103
|
Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
|
|
108
104
|
|
|
@@ -122,7 +118,7 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
|
|
|
122
118
|
|
|
123
119
|
- External package registries are owner-published and can lag behind GitHub.
|
|
124
120
|
- PostgreSQL/pgvector is optional scale/migration tooling. SQLite remains the
|
|
125
|
-
live local Brain store in 9.9.
|
|
121
|
+
live local Brain store in 9.9.5.
|
|
126
122
|
- Docker, model downloads, cloud model calls, Telegram, Brain Network, and
|
|
127
123
|
update checks require explicit user action.
|
|
128
124
|
- Conversation does not fabricate answers when no model is loaded. Agent and
|
|
@@ -134,6 +130,11 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
|
|
|
134
130
|
|
|
135
131
|
| Version | Theme |
|
|
136
132
|
| --- | --- |
|
|
133
|
+
| 9.9.9 | Lean Shell |
|
|
134
|
+
| 9.9.8 | Autonomy Dial |
|
|
135
|
+
| 9.9.7 | No Gaps Left |
|
|
136
|
+
| 9.9.6 | Same Brain Everywhere |
|
|
137
|
+
| 9.9.5 | Closed Gaps |
|
|
137
138
|
| 9.9.4 | Durable Loops |
|
|
138
139
|
| 9.9.3 | Closed Loops |
|
|
139
140
|
| 9.9.2 | Artifact Trust |
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,234 @@ 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
|
+
## [9.9.9] - 2026-07-27
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- i18n is split per lazy route. `frontend/src/i18n/registry.ts` holds a shared
|
|
11
|
+
mutable table; `shell` registers eagerly (app frame, language switcher,
|
|
12
|
+
generic `ui.*`) and `brain` / `workspace` / `onboarding` register themselves
|
|
13
|
+
when their module is imported, which happens inside the lazy chunk of the
|
|
14
|
+
route that needs them. Initial static JS drops from 150.0 KiB to 99.3 KiB
|
|
15
|
+
gzip (505.1 KiB → 317.3 KiB raw), and lazy chunks kept off first paint go
|
|
16
|
+
from 25 to 32.
|
|
17
|
+
- The bundle budget returns to its original 150 KiB. 9.9.8 raised it to 152 KiB
|
|
18
|
+
because the shared i18n table made the ceiling unreachable without one; that
|
|
19
|
+
cause is gone.
|
|
20
|
+
- The admin console is behind a `React.lazy` boundary. It is a rare, separate
|
|
21
|
+
surface and it was pulling the whole workspace copy namespace onto first
|
|
22
|
+
paint.
|
|
23
|
+
- `brain.title` (the product wordmark) moved from the `brain` namespace to
|
|
24
|
+
`shell` — it renders in the app frame before any route resolves.
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
- `scripts/check_i18n_namespace_coverage.mjs`, wired into `npm run lint`. It
|
|
28
|
+
walks the real module graph and, for the eager root and every `React.lazy`
|
|
29
|
+
boundary, verifies each `t(lang, "key")` in that chunk's static closure is
|
|
30
|
+
covered by a namespace the chunk imports. Without it the split fails
|
|
31
|
+
silently: `t()` returns the raw key, so the UI shows `system.permission.title`
|
|
32
|
+
instead of Korean text with no error raised. Type-only imports are not
|
|
33
|
+
counted as runtime edges.
|
|
34
|
+
- `frontend/src/test/setup.ts` registers every namespace, because a unit test
|
|
35
|
+
renders a component without its route. Production coverage is proven by the
|
|
36
|
+
script above, not by this file.
|
|
37
|
+
|
|
38
|
+
## [9.9.8] - 2026-07-27
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
- Permission modes (`latticeai/core/permission_mode.py`): a `strict` /
|
|
42
|
+
`trusted` / `bypass` autonomy dial layered over ToolRegistry + Change
|
|
43
|
+
Governor. `strict` is the default and matches 9.9.7 behavior exactly.
|
|
44
|
+
- `GET/POST /api/permission-mode` and `GET /api/permission-mode/catalog`,
|
|
45
|
+
backed by `PermissionModeService` (per-workspace > per-user > process
|
|
46
|
+
default, `LATTICEAI_PERMISSION_MODE` for the default). Switching to
|
|
47
|
+
`bypass` requires `acknowledge_risk=true` and is audited.
|
|
48
|
+
- Mode-invariant circuit breakers: destructive risk, root/home paths,
|
|
49
|
+
`rm -rf /` style commands, and binary overwrites are denied in every mode.
|
|
50
|
+
- `AgentRunContext.permission_mode`: the mode is resolved once per run and
|
|
51
|
+
persisted with a paused approval, so a plan and its execution are judged by
|
|
52
|
+
one dial even if the stored preference changes mid-run.
|
|
53
|
+
- `PermissionModePanel` in 환경설정 → 에이전트 자율성: the dial is set from the
|
|
54
|
+
product, not only from the API. The selector renders the server's own
|
|
55
|
+
catalog instead of a hardcoded mode list and will not send a `bypass`
|
|
56
|
+
switch until the acknowledgement the server requires is ticked.
|
|
57
|
+
|
|
58
|
+
### Fixed
|
|
59
|
+
- Stored per-user and per-workspace modes never reached enforcement: the
|
|
60
|
+
bound resolver was called without a scope, so every caller collapsed onto
|
|
61
|
+
the process default and the dial had no effect. `enforce_policy` and the
|
|
62
|
+
agent tool gate now resolve with `user_email` / `workspace_id`.
|
|
63
|
+
- Orphan change proposals under `trusted` / `bypass`: the gate called
|
|
64
|
+
`ChangeGovernor.review()` — which persists a proposal as a side effect —
|
|
65
|
+
and then discarded the verdict, applying the change *and* leaving a pending
|
|
66
|
+
proposal in the Review Center. The mode is now decided before the governor
|
|
67
|
+
is consulted.
|
|
68
|
+
- `AgentRunContext` used `__slots__` with no `permission_mode` slot, making
|
|
69
|
+
the documented per-run override unreachable dead code.
|
|
70
|
+
- `PermissionModeService.set_mode()` deadlocked: it held a non-reentrant
|
|
71
|
+
`threading.Lock` while calling `resolve()`, which takes the same lock, so
|
|
72
|
+
every mode change hung its worker thread forever.
|
|
73
|
+
|
|
74
|
+
### Changed
|
|
75
|
+
- `enforce_policy`: the two `fail_closed` branches that both raised 409 are
|
|
76
|
+
one branch again — a binary overwrite has no safe apply path in any mode.
|
|
77
|
+
- `PermissionModeService.rebind_data_dir()` / `rebind_audit()`: explicit
|
|
78
|
+
wiring now rebinds an already-created singleton instead of being dropped,
|
|
79
|
+
so an early lazy caller cannot pin the store to `~/.ltcai` with no audit
|
|
80
|
+
sink.
|
|
81
|
+
- Initial-JS bundle budget raised 150 KiB → 152 KiB gzip. The 9.9.7 tree sat
|
|
82
|
+
at 149.3 KiB and the new settings panel needed ~1.0 KiB, nearly all of it
|
|
83
|
+
bilingual copy: page components are lazy, but `frontend/src/i18n/*` is one
|
|
84
|
+
synchronous table, so every surface's copy is on the first-paint path by
|
|
85
|
+
construction. Splitting i18n per lazy route is the durable fix and is not in
|
|
86
|
+
this release.
|
|
87
|
+
- The permission gates live in `SingleAgentRuntime` itself. `permission_mode`
|
|
88
|
+
is a real `AgentDeps` field, and `approval_requirements` /
|
|
89
|
+
`_blocked_by_gates` / `_governor_review` are mode-aware in place instead of
|
|
90
|
+
being replaced at construction time by a monkey-patch that would break
|
|
91
|
+
silently if those signatures changed.
|
|
92
|
+
|
|
93
|
+
### Removed
|
|
94
|
+
- `latticeai/core/agent_mode_patch.py` — the monkey-patch layer, folded into
|
|
95
|
+
`agent.py`.
|
|
96
|
+
- Dead no-op `if ... pass` block in `is_circuit_breaker`.
|
|
97
|
+
- `filter_governor_verdict`, unused after the governor fix.
|
|
98
|
+
|
|
99
|
+
## [9.9.7] - 2026-07-27
|
|
100
|
+
|
|
101
|
+
### Added
|
|
102
|
+
- `POST /agent` accepts `stream: true` and emits the same named `agent_step`
|
|
103
|
+
SSE frames the web chat route already produced; the terminal payload is
|
|
104
|
+
identical to the JSON response (`tests/unit/test_agent_stream_parity.py`).
|
|
105
|
+
- VS Code: `ltcai.runAgentLive` (live step timeline) and
|
|
106
|
+
`ltcai.evidenceActions` (one-click follow-ups from the last recall's cited
|
|
107
|
+
sources, file actions routed through the agent).
|
|
108
|
+
- Telegram: grounding badge on every answer plus `/review` — a Review Center
|
|
109
|
+
over `/api/proposals` with inline approve/reject and honest 409 reporting.
|
|
110
|
+
- Browser extension: "Ask your Brain" with the server's grounding verdict, and
|
|
111
|
+
pending-approval visibility. Still posts only to `127.0.0.1`.
|
|
112
|
+
- `GET /api/brain/garden` + `KnowledgeGardenPanel`: the knowledge garden in
|
|
113
|
+
four beds (recent / contradictions / stale / frequent), where "frequent" is
|
|
114
|
+
real graph degree and Chunk nodes are excluded.
|
|
115
|
+
- `latticeai/core/agent_profiles.py`: `standard` / `compact` agent profiles
|
|
116
|
+
selected from the model id (or `LATTICEAI_AGENT_PROFILE`), with a
|
|
117
|
+
direct-path fallback that writes the plan's files without any JSON tool call
|
|
118
|
+
when a small model cannot hold the protocol.
|
|
119
|
+
- `GET /knowledge-graph/local/health` + `FolderMemoryHealthCard`: per-folder
|
|
120
|
+
indexing coverage, failures with their stored reasons, and one explicitly
|
|
121
|
+
global vector-freshness figure.
|
|
122
|
+
- Skills `meeting_notes` and `weekly_review`, with a contract test that rejects
|
|
123
|
+
a skill whose `action` is not a registered tool.
|
|
124
|
+
- `POST /api/capture/voice` + `GET /api/capture/voice/status`
|
|
125
|
+
(`latticeai/services/voice_capture.py`): voice memo ingestion with an
|
|
126
|
+
optional local transcriber and honest degradation when none exists.
|
|
127
|
+
|
|
128
|
+
### Changed
|
|
129
|
+
- `docs/SURFACE_PARITY.md` contains no `✖` entries; every remaining `—` states
|
|
130
|
+
why it is a design boundary.
|
|
131
|
+
- The browser extension is no longer described as capture-only (manifest name,
|
|
132
|
+
popup, README).
|
|
133
|
+
|
|
134
|
+
### Fixed
|
|
135
|
+
- The VS Code SSE reader kept the `event:` name, so named `agent_step` frames
|
|
136
|
+
are no longer misread as chat chunks.
|
|
137
|
+
- `garden_overview` clamps an explicit `limit=0` to 1 instead of silently
|
|
138
|
+
re-expanding it to the default.
|
|
139
|
+
|
|
140
|
+
## [9.9.6] - 2026-07-27
|
|
141
|
+
|
|
142
|
+
### Added
|
|
143
|
+
- Surface parity for VS Code: `ltcai.askBrain` (grounding badge on recall),
|
|
144
|
+
`ltcai.reviewCenter` (list/approve/reject staged change proposals via
|
|
145
|
+
`/api/proposals`, 409 conflicts reported honestly), `ltcai.runAgent`
|
|
146
|
+
(post-run step + outcome summary). Parity logic lives in
|
|
147
|
+
`vscode-extension/surface.ts`, asserted by `tests/vscode-extension.test.cjs`
|
|
148
|
+
(wired into `npm run lint`).
|
|
149
|
+
- `POST /api/evidence/actions` + `latticeai/services/evidence_actions.py`:
|
|
150
|
+
deterministic, model-free composition of evidence-scoped follow-up prompts
|
|
151
|
+
(summary / checklist / document / one-page) from an answer's citations.
|
|
152
|
+
- `latticeai/core/run_explain.py`: deterministic plain-language run outcome
|
|
153
|
+
(`code`, `headline`, `details`, `model_strain`, `next_step`), returned as
|
|
154
|
+
`explanation` on `/agent` and rendered in the web app, VS Code, and Telegram.
|
|
155
|
+
- `prose` chunking strategy (`lattice_brain/graph/_kg_common.py`): sentence and
|
|
156
|
+
paragraph-aware boundaries for `.txt/.pdf/.docx/.html/…`; `plain` stays
|
|
157
|
+
byte-identical to the legacy walk.
|
|
158
|
+
- `citation_locator()` + chunk metadata on vector hits: citations name the
|
|
159
|
+
section/page they came from (`Guide > Setup · p.4`, `p.4–5` across a page
|
|
160
|
+
break) and stay silent when the chunk cannot prove it.
|
|
161
|
+
- `infer_edge_relation()` + `plan_relation_noise_reduction()`: relations carry
|
|
162
|
+
an evidence class (`verb` | `cooccurrence`) with matching weights; the
|
|
163
|
+
curator can demote weak/hub co-occurrence edges without touching verb-backed
|
|
164
|
+
or legacy ones.
|
|
165
|
+
- Project sessions: `latticeai/core/project_sessions.py` + `/api/projects`
|
|
166
|
+
(files produced, open TODOs, last honest verification, run history). `/agent`
|
|
167
|
+
accepts `project_id`, injects the project state into planning/execution, and
|
|
168
|
+
folds the run's outcome back in.
|
|
169
|
+
- `latticeai/core/artifact_ledger.py` + a `Files created in this conversation`
|
|
170
|
+
context section: files a run just wrote are recallable before asynchronous
|
|
171
|
+
indexing catches up.
|
|
172
|
+
- `requirement_coverage()`: a critic `PASS` that left a declared manifest file
|
|
173
|
+
unwritten now ends as `NEEDS_REVIEW`.
|
|
174
|
+
- `funnel_alerts()`: `GET /api/admin/funnel-metrics` returns named, actionable
|
|
175
|
+
alerts with the triggering value; silent below 10 samples.
|
|
176
|
+
- Stale-embedder recovery UI: names the problem and offers a one-click
|
|
177
|
+
re-index, with an honest failure message.
|
|
178
|
+
- `lattice_brain/ingestion_jobs.py` and
|
|
179
|
+
`latticeai/core/workspace_review_items.py`: behaviour-preserving extractions.
|
|
180
|
+
- Six additional multi-agent/workflow scenarios (retry exhaustion, recovery,
|
|
181
|
+
two-gate pause/resume, stale resume cursor, per-role observability, cross-run
|
|
182
|
+
role isolation).
|
|
183
|
+
|
|
184
|
+
### Changed
|
|
185
|
+
- Document generation shares chat's context contract: same `approx_tokens`
|
|
186
|
+
budget, same `context_quality` signal, same assembly `trace` shape.
|
|
187
|
+
- `chunk_strategy_for()` routes prose document formats to the new `prose`
|
|
188
|
+
strategy (newly ingested `.txt/.pdf/.docx/.html` content gets different chunk
|
|
189
|
+
ids; existing indexed content is untouched).
|
|
190
|
+
- The VS Code HTTP client rejects on 4xx/5xx instead of resolving an error body
|
|
191
|
+
as success.
|
|
192
|
+
|
|
193
|
+
### Fixed
|
|
194
|
+
- A verb-less sentence listing more than four concepts no longer manufactures
|
|
195
|
+
a chain of `관련됨` relations.
|
|
196
|
+
- `stale_embedder` was computed but never surfaced in the UI.
|
|
197
|
+
- PDF chunks that span a page break are labelled with the page range they
|
|
198
|
+
actually cover instead of only their starting page.
|
|
199
|
+
|
|
200
|
+
## [9.9.5] - 2026-07-26
|
|
201
|
+
|
|
202
|
+
### Added
|
|
203
|
+
- Optional cross-encoder rerank (`lattice_brain/graph/rerank.py`): env
|
|
204
|
+
`LATTICEAI_CROSS_ENCODER_RERANK=1` (model via
|
|
205
|
+
`LATTICEAI_CROSS_ENCODER_MODEL`); hybrid_search returns additive `rerank`
|
|
206
|
+
meta; default path is identity with no model download.
|
|
207
|
+
- Sidecar-backed Playwright first-value E2E: `tests/e2e/`,
|
|
208
|
+
`scripts/run_sidecar_e2e.mjs`, `npm run test:e2e:sidecar`, nightly
|
|
209
|
+
`.github/workflows/e2e-sidecar.yml`.
|
|
210
|
+
- VS Code approval commands: `ltcai.listApprovals`, `ltcai.approveAgent`,
|
|
211
|
+
`ltcai.rejectAgent` with pause-token session cache.
|
|
212
|
+
- Telegram approval handles both `waiting_approval` and `awaiting_approval`
|
|
213
|
+
with run_id+token resume preferred.
|
|
214
|
+
- Agent loop L4/L5/L7 helpers: `artifact_checklist`, `files_written`,
|
|
215
|
+
snapshot rollback ports (`snapshot_file` / `restore_snapshot`) with
|
|
216
|
+
mode-tagged results (`git` | `snapshot` | `none`).
|
|
217
|
+
- Knowledge-graph read surface decomposition:
|
|
218
|
+
`lattice_brain/graph/retrieval_reads.py` (`KnowledgeGraphReadsMixin`).
|
|
219
|
+
|
|
220
|
+
### Changed
|
|
221
|
+
- Legacy `human_in_loop` pauses now use the durable `AgentRunStore` path
|
|
222
|
+
(`legacy_context=True`); the separate in-memory `_pending` map is removed.
|
|
223
|
+
Wire contract (`status=waiting_approval`, `context_id`) is preserved.
|
|
224
|
+
- Rollback recovers file-create actions via pre-write snapshots when git is
|
|
225
|
+
unavailable or not governed.
|
|
226
|
+
- Critic verify prompts include a deterministic artifact checklist derived
|
|
227
|
+
from transcript sanitize/repair flags.
|
|
228
|
+
- Executor prompts list files already written in the current run.
|
|
229
|
+
- `docs/SURFACE_PARITY.md` marks VS Code/Telegram approval as provided.
|
|
230
|
+
|
|
231
|
+
### Tests
|
|
232
|
+
- `test_agent_loop_l4_l5_l7.py`, `test_cross_encoder_rerank.py`,
|
|
233
|
+
`test_snapshot_rollback_ports.py`, L1 approval flow extensions.
|
|
234
|
+
|
|
7
235
|
## [9.9.4] - 2026-07-26
|
|
8
236
|
|
|
9
237
|
### Added
|
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: **9.9.
|
|
6
|
+
Current release: **9.9.9 — Lean Shell**.
|
|
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: **9.9.
|
|
3
|
+
Current release: **9.9.9 — Lean Shell**.
|
|
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 (v9.9.
|
|
1
|
+
# Lattice AI — Operations Guide (v9.9.9)
|
|
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,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Status: reference**
|
|
4
4
|
> 도입: v9.9.4 (2026-07-25, 리뷰 Wave 1.4 "표면 패리티 체크리스트").
|
|
5
|
+
> 갱신: v9.9.7 — 표에 남아 있던 ✖ 갭을 **전부** 해소. Browser 확장도 캡처 전용 경계를 넘어 회상/승인 가시성을 갖췄다.
|
|
5
6
|
> 목적: 각 표면(서피스)이 Brain 계약의 어디까지를 제공하는지 **정직하게** 기록한다.
|
|
6
7
|
> "앱마다 다른 Lattice"를 방지하는 기준표이며, 기능을 과장하지 않는다.
|
|
7
8
|
|
|
@@ -12,7 +13,7 @@
|
|
|
12
13
|
| Web `/app` | FastAPI sidecar가 서빙하는 SPA (`static/app`) | 1차 표면 — 모든 기능의 기준 |
|
|
13
14
|
| Desktop | Tauri 셸 (`src-tauri/`) | 동일 SPA를 감싸는 셸 — 웹과 구조적 동일 |
|
|
14
15
|
| VS Code | `vscode-extension/` (`ltcai.*` 커맨드) | 에디터 보조 표면 |
|
|
15
|
-
| Browser | `browser-extension/`
|
|
16
|
+
| Browser | `browser-extension/` | 캡처 + 회상 + 승인 가시성 (v9.9.7) |
|
|
16
17
|
| Telegram | 봇 어댑터 | 대화 전용 표면 |
|
|
17
18
|
|
|
18
19
|
## 네 가지 루프 순간 × 표면
|
|
@@ -22,19 +23,24 @@
|
|
|
22
23
|
| 루프 순간 | Web `/app` | Desktop | VS Code | Browser | Telegram |
|
|
23
24
|
| --- | --- | --- | --- | --- | --- |
|
|
24
25
|
| 첫 저장 (Capture) | ✅ DnD·폴더·웹 수집, 품질 경고 | ✅ (웹과 동일) | ◐ `sendToLattice` 선택 영역 전송 | ✅ 페이지 캡처 (단일 목적) | ◐ 메시지 수집 |
|
|
25
|
-
| 첫 회상 (Recall) | ✅ 하이브리드 검색 + grounding 배지 + 출처→청크 | ✅ (동일) |
|
|
26
|
-
| 첫 산출물 (Artifact) | ✅ artifacts[] 카드·미리보기·Brain 기억 칩 | ✅ (동일) | ◐ `createFile`
|
|
27
|
-
| 첫 보호 (Approval) | ✅ 승인 카드 + TTL 카운트다운 + 재시작 생존 | ✅ (동일) |
|
|
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 재개 |
|
|
28
29
|
|
|
29
30
|
## 기능 상세 × 표면
|
|
30
31
|
|
|
31
32
|
| 기능 | Web `/app` | Desktop | VS Code | Browser | Telegram |
|
|
32
33
|
| --- | --- | --- | --- | --- | --- |
|
|
33
|
-
| 에이전트 스텝 타임라인 (v9.9.4) | ✅ 라이브 SSE | ✅ | — | — | — |
|
|
34
|
-
|
|
|
35
|
-
|
|
|
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` | ✅ | — (의도) | — (의도) | — (의도) |
|
|
40
|
+
| 승인 재개 (`/agent/resume`) | ✅ | ✅ | ✅ `ltcai.approveAgent` / `rejectAgent` | — | ✅ callback → resume |
|
|
41
|
+
| 대기 중 승인 목록 (`GET /agent/approvals`, v9.9.4) | ✅ | ✅ | ✅ `ltcai.listApprovals` | — | — (봇 로컬 pending map) |
|
|
36
42
|
| Watch 상태 신호 (v9.9.4) | ✅ 홈 카드 | ✅ | — | — | — |
|
|
37
|
-
| Review Center (제안 승인/거절) | ✅ | ✅ |
|
|
43
|
+
| Review Center (제안 승인/거절) | ✅ | ✅ | ✅ `ltcai.reviewCenter` (409 충돌 정직 보고) | — (의도: 승인은 웹/에디터/봇에서) | ✅ `/review` + 인라인 승인/거절 (v9.9.7) |
|
|
38
44
|
| 데모 코퍼스 First Value Loop | ✅ | ✅ | — | — | — |
|
|
39
45
|
| 모델 로드/추천 | ✅ | ✅ | ◐ `loadModel` | — | — |
|
|
40
46
|
| 코드 편집 보조 (edit/explain/refactor/tests) | — | — | ✅ | — | — |
|
|
@@ -43,5 +49,35 @@
|
|
|
43
49
|
|
|
44
50
|
1. **API 계약이 기준이다.** 모든 표면은 동일한 sidecar API를 소비한다. 표면별 전용 API를 만들지 않는다.
|
|
45
51
|
2. **◐/✖ 는 문서화된 상태로만 존재한다.** 새 기능을 Web에 추가할 때 이 표를 갱신하고, 다른 표면에 제공하지 않을 경우 "—(의도)" 인지 "✖(갭)" 인지 명시한다.
|
|
46
|
-
3. **✖ 갭은 릴리스 노트의 Honest Limitations 후보다.**
|
|
52
|
+
3. **✖ 갭은 릴리스 노트의 Honest Limitations 후보다.** v9.9.7 기준 표에 남은 ✖는 **없다**.
|
|
53
|
+
- 남은 "—"는 전부 **설계 경계**이며, 각 항목에 이유를 함께 적는다. 예: 브라우저 확장은 파일을 쓰지 않으므로 산출물 생성이 없고, 승인 *결정*은 서명된 토큰이 필요한 흐름이라 대기 건수만 보여 주고 승인은 웹/에디터/봇에서 한다.
|
|
54
|
+
- 경계를 새로 만들 때는 "왜 제공하지 않는가"를 이 문서에 남긴다. 이유 없는 "—"는 갭이지 경계가 아니다.
|
|
47
55
|
4. 릴리스마다 이 표를 검토한다 (release checklist의 docs 단계).
|
|
56
|
+
|
|
57
|
+
## VS Code / Telegram 승인 메모 (v9.9.5)
|
|
58
|
+
|
|
59
|
+
- **토큰은 GET `/agent/approvals`에 다시 내려가지 않는다** (보안). Web은 일시 중지 응답의 토큰을 클라이언트에 보관하고, VS Code도 동일하게 pause 응답의 토큰을 확장 세션 캐시에 둔다. 캐시에 없으면 붙여넣기 또는 웹 UI로 유도한다.
|
|
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