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.
Files changed (138) hide show
  1. package/README.md +43 -42
  2. package/docs/CHANGELOG.md +228 -0
  3. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  4. package/docs/DEVELOPMENT.md +1 -1
  5. package/docs/ONBOARDING.md +1 -1
  6. package/docs/OPERATIONS.md +3 -1
  7. package/docs/PERMISSION_MODE.md +107 -0
  8. package/docs/SURFACE_PARITY.md +45 -9
  9. package/docs/TRUST_MODEL.md +1 -1
  10. package/docs/WHY_LATTICE.md +1 -1
  11. package/docs/kg-schema.md +1 -1
  12. package/lattice_brain/__init__.py +1 -1
  13. package/lattice_brain/context.py +39 -4
  14. package/lattice_brain/graph/_kg_common.py +189 -14
  15. package/lattice_brain/graph/curator.py +62 -0
  16. package/lattice_brain/graph/discovery.py +76 -0
  17. package/lattice_brain/graph/ingest.py +37 -7
  18. package/lattice_brain/graph/rerank.py +160 -0
  19. package/lattice_brain/graph/retrieval.py +28 -442
  20. package/lattice_brain/graph/retrieval_reads.py +459 -0
  21. package/lattice_brain/graph/retrieval_vector.py +10 -0
  22. package/lattice_brain/graph/store.py +2 -0
  23. package/lattice_brain/ingestion.py +9 -106
  24. package/lattice_brain/ingestion_jobs.py +133 -0
  25. package/lattice_brain/quality.py +26 -6
  26. package/lattice_brain/runtime/multi_agent.py +1 -1
  27. package/latticeai/__init__.py +1 -1
  28. package/latticeai/api/brain_intelligence.py +8 -0
  29. package/latticeai/api/chat.py +9 -0
  30. package/latticeai/api/chat_agent_http.py +206 -48
  31. package/latticeai/api/chat_contracts.py +10 -1
  32. package/latticeai/api/chat_documents.py +16 -0
  33. package/latticeai/api/evidence_actions.py +48 -0
  34. package/latticeai/api/permission_mode.py +61 -0
  35. package/latticeai/api/project_sessions.py +112 -0
  36. package/latticeai/api/voice_capture.py +89 -0
  37. package/latticeai/app_factory.py +53 -0
  38. package/latticeai/core/agent.py +536 -60
  39. package/latticeai/core/agent_permission.py +160 -0
  40. package/latticeai/core/agent_profiles.py +110 -0
  41. package/latticeai/core/artifact_ledger.py +109 -0
  42. package/latticeai/core/context_builder.py +101 -2
  43. package/latticeai/core/legacy_compatibility.py +1 -1
  44. package/latticeai/core/marketplace.py +1 -1
  45. package/latticeai/core/permission_mode.py +296 -0
  46. package/latticeai/core/project_sessions.py +337 -0
  47. package/latticeai/core/run_explain.py +421 -0
  48. package/latticeai/core/run_store.py +7 -0
  49. package/latticeai/core/workspace_os.py +15 -80
  50. package/latticeai/core/workspace_review_items.py +107 -0
  51. package/latticeai/integrations/telegram_bot.py +270 -23
  52. package/latticeai/runtime/chat_wiring.py +8 -0
  53. package/latticeai/runtime/context_runtime.py +11 -0
  54. package/latticeai/runtime/permission_mode_wiring.py +116 -0
  55. package/latticeai/runtime/router_registration.py +9 -0
  56. package/latticeai/services/app_context.py +3 -0
  57. package/latticeai/services/architecture_readiness.py +1 -1
  58. package/latticeai/services/brain_intelligence.py +105 -0
  59. package/latticeai/services/evidence_actions.py +254 -0
  60. package/latticeai/services/funnel_metrics.py +111 -16
  61. package/latticeai/services/local_knowledge.py +26 -0
  62. package/latticeai/services/memory_service.py +12 -0
  63. package/latticeai/services/permission_mode_service.py +170 -0
  64. package/latticeai/services/product_readiness.py +1 -1
  65. package/latticeai/services/tool_dispatch.py +129 -4
  66. package/latticeai/services/voice_capture.py +189 -0
  67. package/package.json +6 -3
  68. package/scripts/check_bundle_budget.mjs +11 -0
  69. package/scripts/check_current_release_docs.mjs +1 -1
  70. package/scripts/check_i18n_namespace_coverage.mjs +148 -0
  71. package/scripts/run_sidecar_e2e.mjs +159 -0
  72. package/skills/meeting_notes/SKILL.md +82 -0
  73. package/skills/meeting_notes/examples.md +41 -0
  74. package/skills/meeting_notes/risk.json +9 -0
  75. package/skills/meeting_notes/schema.json +55 -0
  76. package/skills/weekly_review/SKILL.md +75 -0
  77. package/skills/weekly_review/examples.md +39 -0
  78. package/skills/weekly_review/risk.json +9 -0
  79. package/skills/weekly_review/schema.json +55 -0
  80. package/src-tauri/Cargo.lock +1 -1
  81. package/src-tauri/Cargo.toml +1 -1
  82. package/src-tauri/tauri.conf.json +1 -1
  83. package/static/app/asset-manifest.json +37 -29
  84. package/static/app/assets/Act-BFbpl2_Y.js +1 -0
  85. package/static/app/assets/AdminConsole-DaZPha9Y.js +1 -0
  86. package/static/app/assets/Brain-DGrV0heZ.js +321 -0
  87. package/static/app/assets/BrainHome-Re6Zxh_W.js +2 -0
  88. package/static/app/assets/BrainSignals-BQ11jDpJ.js +1 -0
  89. package/static/app/assets/Capture-DRaf1zLH.js +1 -0
  90. package/static/app/assets/CommandPalette-DAKPm4uJ.js +1 -0
  91. package/static/app/assets/LanguageSwitcher-BgTwHoWv.js +1 -0
  92. package/static/app/assets/Library-BVtrSt12.js +1 -0
  93. package/static/app/assets/LivingBrain-7glOmK0R.js +1 -0
  94. package/static/app/assets/ProductFlow-cB3EFinZ.js +1 -0
  95. package/static/app/assets/ReviewCard-CShhHS-w.js +3 -0
  96. package/static/app/assets/System-B4nQDy8a.js +1 -0
  97. package/static/app/assets/{bot-nB_buEZD.js → bot-DtKkLfXj.js} +1 -1
  98. package/static/app/assets/brain-wVV63_1z.js +1 -0
  99. package/static/app/assets/button-BTxZDMFJ.js +1 -0
  100. package/static/app/assets/{circle-pause-DLNw6Ucp.js → circle-pause--qxF9-EO.js} +1 -1
  101. package/static/app/assets/{circle-play-B-IsFL1y.js → circle-play-89x3S6jm.js} +1 -1
  102. package/static/app/assets/{cpu-CEPBHaBl.js → cpu-DTUI63vo.js} +1 -1
  103. package/static/app/assets/download-EJS5_O0f.js +1 -0
  104. package/static/app/assets/{folder-open-hmN0N9cX.js → folder-open-BL9zYTnc.js} +1 -1
  105. package/static/app/assets/{hard-drive-CBV_B_Yd.js → hard-drive-BFnwi1Lu.js} +1 -1
  106. package/static/app/assets/index-BFtDYI6l.js +10 -0
  107. package/static/app/assets/index-BY9bpxyx.css +2 -0
  108. package/static/app/assets/input-DEz5UjBz.js +1 -0
  109. package/static/app/assets/{network-jE42eKfT.js → network-zKa3jAwl.js} +1 -1
  110. package/static/app/assets/primitives-jNrZm2O9.js +1 -0
  111. package/static/app/assets/search-ku6-_6wY.js +1 -0
  112. package/static/app/assets/shield-alert-CpHeCsaF.js +1 -0
  113. package/static/app/assets/textarea-DpcQkn75.js +1 -0
  114. package/static/app/assets/{useFocusTrap-B7RPGfFy.js → useFocusTrap-58TNCONM.js} +1 -1
  115. package/static/app/assets/{navigation-Bot0hvuv.js → useQuery-CcVlXlBd.js} +1 -1
  116. package/static/app/assets/users-C0cFMj6o.js +1 -0
  117. package/static/app/assets/utils-DYf7pqrR.js +7 -0
  118. package/static/app/assets/workspace-CjthHsLN.js +1 -0
  119. package/static/app/index.html +4 -4
  120. package/static/sw.js +1 -1
  121. package/static/app/assets/Act-BCmTU0E2.js +0 -1
  122. package/static/app/assets/Brain-CTnjox7w.js +0 -321
  123. package/static/app/assets/BrainHome-BJ3sFNX0.js +0 -2
  124. package/static/app/assets/BrainSignals-C52lwZVD.js +0 -1
  125. package/static/app/assets/Capture-B6vBhFa3.js +0 -1
  126. package/static/app/assets/CommandPalette-90u9FWFH.js +0 -1
  127. package/static/app/assets/Library-pKCK0_tk.js +0 -1
  128. package/static/app/assets/LivingBrain-Jlf2wFqI.js +0 -1
  129. package/static/app/assets/ProductFlow-yg1fKP1P.js +0 -1
  130. package/static/app/assets/ReviewCard-DWvD7n9h.js +0 -3
  131. package/static/app/assets/System-BAEuHqNY.js +0 -1
  132. package/static/app/assets/index-7FAfYm4v.css +0 -2
  133. package/static/app/assets/index-DrmOCySv.js +0 -10
  134. package/static/app/assets/input-gtVCg-ll.js +0 -1
  135. package/static/app/assets/primitives-CX2Komon.js +0 -1
  136. package/static/app/assets/shield-alert-BftATuAA.js +0 -1
  137. package/static/app/assets/textarea-CiMJfOSI.js +0 -1
  138. package/static/app/assets/utils-SJUNVOj5.js +0 -7
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![CI Status](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/ci.yml)
12
12
  [![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
13
13
 
14
- ![v9.9.4 Living Brain walkthrough](output/release/v9.9.4/gifs/v9.9.4-living-brain-walkthrough.gif)
14
+ ![v9.9.9 Living Brain walkthrough](output/release/v9.9.9/gifs/v9.9.9-living-brain-walkthrough.gif)
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 ![Brain Chat](output/release/v9.9.4/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v9.9.4/screenshots/05-memory-graph.png) |
28
- | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v9.9.4/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v9.9.4/screenshots/12-review-center.png) |
29
- | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v9.9.4/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v9.9.4/screenshots/10-admin-console.png) |
27
+ | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v9.9.9/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v9.9.9/screenshots/05-memory-graph.png) |
28
+ | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v9.9.9/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v9.9.9/screenshots/12-review-center.png) |
29
+ | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v9.9.9/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v9.9.9/screenshots/10-admin-console.png) |
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
- | ![Login](output/release/v9.9.4/screenshots/01-login.png) | ![Model install](output/release/v9.9.4/screenshots/03-install-load-progress.png) | ![Model library](output/release/v9.9.4/screenshots/07-model-library.png) |
60
+ | ![Login](output/release/v9.9.9/screenshots/01-login.png) | ![Model install](output/release/v9.9.9/screenshots/03-install-load-progress.png) | ![Model library](output/release/v9.9.9/screenshots/07-model-library.png) |
61
61
 
62
62
  Screenshot index and capture notes:
63
- [output/release/v9.9.4/SCREENSHOT_INDEX.md](output/release/v9.9.4/SCREENSHOT_INDEX.md)
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.4Durable Loops**:
68
-
69
- - **Loops that survive restarts.** Paused `awaiting_approval` runs are
70
- persisted to disk (hashed tokens, wall-clock expiry) and resume after a
71
- server restart; expired approvals answer with a one-click replan hint, and
72
- `GET /agent/approvals` re-surfaces pending runs. Approval cards show a live
73
- TTL countdown.
74
- - **You can watch the loop work.** Streamed agent runs emit named
75
- `agent_step` SSE events (plan tools verify terminal) rendered as a
76
- live step timeline; weak-model parse repairs are counted and surfaced
77
- honestly ("모델 응답을 N회 보정했어요").
78
- - **One retrieval policy.** A single `RetrievalPolicy` module (rule-based
79
- query rewrite, query-class weights, 14-day recency age-decay in a
80
- [0.5, 1.0] band) feeds both the service and graph fusion layers, gated by
81
- the benchmark CI test; embedder swaps now report `stale_embedder` instead
82
- of silently emptying the vector channel.
83
- - **Retrieval quality at the chunk level.** Markdown chunks at heading
84
- boundaries (with `heading_path` provenance), code at function boundaries,
85
- PDF chunks carry page numbers, plain text stays byte-identical — and
86
- cited source cards click through to the stored chunk text.
87
- - **Grounded answers, cited sources.** When retrieved context exists the
88
- answer prompt instructs [1]-style citations; a synthetic grounding bench
89
- gates the verdict heuristic in CI; briefings suggest periodic graph noise
90
- curation, and an opt-in review mode stages curator promotions for human
91
- approval.
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.9Lean 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.4 release must use exact filenames:
95
+ Expected artifacts for 9.9.9 release must use exact filenames:
100
96
 
101
- - `dist/ltcai-9.9.4-py3-none-any.whl`
102
- - `dist/ltcai-9.9.4.tar.gz`
103
- - `ltcai-9.9.4.tgz`
104
- - `dist/ltcai-9.9.4.vsix`
105
- - `src-tauri/target/release/bundle/dmg/Lattice AI_9.9.4_aarch64.dmg`
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.4.
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
@@ -1,6 +1,6 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **9.9.4Durable Loops**.
3
+ Current release: **9.9.9Lean Shell**.
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
@@ -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.4Durable Loops**.
6
+ Current release: **9.9.9Lean 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
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Onboarding
2
2
 
3
- Current release: **9.9.4Durable Loops**.
3
+ Current release: **9.9.9Lean 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
@@ -1,4 +1,4 @@
1
- # Lattice AI — Operations Guide (v9.9.4)
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.
@@ -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/` (Send to Lattice) | 캡처 전용 표면 |
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 배지 + 출처→청크 | ✅ (동일) | `askCurrentFile` — 배지 없음 | | 답변만, 배지 없음 |
26
- | 첫 산출물 (Artifact) | ✅ artifacts[] 카드·미리보기·Brain 기억 칩 | ✅ (동일) | ◐ `createFile` 검증 파이프라인 경유, 카드 UI 없음 | — | ◐ 파일 전송만 |
27
- | 첫 보호 (Approval) | ✅ 승인 카드 + TTL 카운트다운 + 재시작 생존 | ✅ (동일) | 승인 UI 없음 웹으로 유도 | | 승인 불가 웹으로 유도 |
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
- | 승인 재개 (`/agent/resume`) | ✅ | ✅ | | — | |
35
- | 대기 승인 목록 (`GET /agent/approvals`, v9.9.4) | ✅ | ✅ | | — | — |
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 후보다.** 현재 갭: VS Code/Telegram 승인 흐름(웹으로 유도하는 안내만 존재), VS Code 회상 배지.
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
+ "근거 확인 불가"이며 절대 "근거 있음"으로 승격하지 않는다.
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **9.9.4Durable Loops**.
3
+ Current release: **9.9.9Lean Shell**.
4
4
 
5
5
  Lattice AI is local-first, explicit about external communication, and honest
6
6
  when a capability is unavailable.
@@ -1,6 +1,6 @@
1
1
  # Why Lattice AI Exists
2
2
 
3
- Current release: **9.9.4Durable Loops**.
3
+ Current release: **9.9.9Lean Shell**.
4
4
 
5
5
  **Lattice AI is a local-first Digital Brain that keeps your knowledge durable
6
6
  across any AI model.**
package/docs/kg-schema.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Knowledge Graph Schema
2
2
 
3
- Current release: **9.9.4Durable Loops**.
3
+ Current release: **9.9.9Lean Shell**.
4
4
 
5
5
  명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
6
6
  구현: `lattice_brain/graph/schema.py`