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.
Files changed (129) hide show
  1. package/README.md +39 -37
  2. package/docs/CHANGELOG.md +234 -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 +38 -8
  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/retrieval_vector.py +10 -0
  19. package/lattice_brain/ingestion.py +9 -106
  20. package/lattice_brain/ingestion_jobs.py +133 -0
  21. package/lattice_brain/runtime/multi_agent.py +1 -1
  22. package/latticeai/__init__.py +1 -1
  23. package/latticeai/api/brain_intelligence.py +8 -0
  24. package/latticeai/api/chat.py +9 -0
  25. package/latticeai/api/chat_agent_http.py +119 -2
  26. package/latticeai/api/chat_contracts.py +9 -0
  27. package/latticeai/api/chat_documents.py +16 -0
  28. package/latticeai/api/evidence_actions.py +48 -0
  29. package/latticeai/api/permission_mode.py +61 -0
  30. package/latticeai/api/project_sessions.py +112 -0
  31. package/latticeai/api/voice_capture.py +89 -0
  32. package/latticeai/app_factory.py +53 -0
  33. package/latticeai/core/agent.py +381 -43
  34. package/latticeai/core/agent_permission.py +160 -0
  35. package/latticeai/core/agent_profiles.py +110 -0
  36. package/latticeai/core/artifact_ledger.py +109 -0
  37. package/latticeai/core/context_builder.py +101 -2
  38. package/latticeai/core/legacy_compatibility.py +1 -1
  39. package/latticeai/core/marketplace.py +1 -1
  40. package/latticeai/core/permission_mode.py +296 -0
  41. package/latticeai/core/project_sessions.py +337 -0
  42. package/latticeai/core/run_explain.py +421 -0
  43. package/latticeai/core/run_store.py +5 -0
  44. package/latticeai/core/workspace_os.py +15 -80
  45. package/latticeai/core/workspace_review_items.py +107 -0
  46. package/latticeai/integrations/telegram_bot.py +188 -0
  47. package/latticeai/runtime/chat_wiring.py +8 -0
  48. package/latticeai/runtime/context_runtime.py +11 -0
  49. package/latticeai/runtime/permission_mode_wiring.py +116 -0
  50. package/latticeai/runtime/router_registration.py +9 -0
  51. package/latticeai/services/app_context.py +3 -0
  52. package/latticeai/services/architecture_readiness.py +1 -1
  53. package/latticeai/services/brain_intelligence.py +105 -0
  54. package/latticeai/services/evidence_actions.py +254 -0
  55. package/latticeai/services/funnel_metrics.py +111 -16
  56. package/latticeai/services/local_knowledge.py +26 -0
  57. package/latticeai/services/memory_service.py +12 -0
  58. package/latticeai/services/permission_mode_service.py +170 -0
  59. package/latticeai/services/product_readiness.py +1 -1
  60. package/latticeai/services/tool_dispatch.py +73 -4
  61. package/latticeai/services/voice_capture.py +189 -0
  62. package/package.json +6 -4
  63. package/scripts/check_bundle_budget.mjs +11 -0
  64. package/scripts/check_current_release_docs.mjs +1 -1
  65. package/scripts/check_i18n_namespace_coverage.mjs +148 -0
  66. package/skills/meeting_notes/SKILL.md +82 -0
  67. package/skills/meeting_notes/examples.md +41 -0
  68. package/skills/meeting_notes/risk.json +9 -0
  69. package/skills/meeting_notes/schema.json +55 -0
  70. package/skills/weekly_review/SKILL.md +75 -0
  71. package/skills/weekly_review/examples.md +39 -0
  72. package/skills/weekly_review/risk.json +9 -0
  73. package/skills/weekly_review/schema.json +55 -0
  74. package/src-tauri/Cargo.lock +1 -1
  75. package/src-tauri/Cargo.toml +1 -1
  76. package/src-tauri/tauri.conf.json +1 -1
  77. package/static/app/asset-manifest.json +37 -29
  78. package/static/app/assets/Act-BtCREeN1.js +1 -0
  79. package/static/app/assets/AdminConsole-TPeeN18T.js +1 -0
  80. package/static/app/assets/Brain-BKs6JAp0.js +321 -0
  81. package/static/app/assets/BrainHome-BPGOvSd6.js +2 -0
  82. package/static/app/assets/BrainSignals-CtzQZ15J.js +1 -0
  83. package/static/app/assets/Capture-1_NaHWqB.js +1 -0
  84. package/static/app/assets/CommandPalette-pqvQOXe4.js +1 -0
  85. package/static/app/assets/Library-DhvoPvC7.js +1 -0
  86. package/static/app/assets/{LivingBrain-BVWk58MW.js → LivingBrain-DlQ20Q75.js} +1 -1
  87. package/static/app/assets/ProductFlow-BZvGDRi_.js +1 -0
  88. package/static/app/assets/ReviewCard-BWgI0D2s.js +3 -0
  89. package/static/app/assets/System-CSMdYLMy.js +1 -0
  90. package/static/app/assets/activity-Dlfk8YC7.js +1 -0
  91. package/static/app/assets/{bot-VmP0kkeA.js → bot-CDvUB76P.js} +1 -1
  92. package/static/app/assets/brain-xczrohrt.js +1 -0
  93. package/static/app/assets/button-SOdH3Oyf.js +1 -0
  94. package/static/app/assets/{circle-pause-T9POo4qy.js → circle-pause-CG1ythH4.js} +1 -1
  95. package/static/app/assets/{circle-play-Bz5iTD0p.js → circle-play-HXwvjS6W.js} +1 -1
  96. package/static/app/assets/{cpu-CJhjRtNq.js → cpu-B0d-rGyk.js} +1 -1
  97. package/static/app/assets/download-BGIkTQL6.js +1 -0
  98. package/static/app/assets/{folder-open-B2K_22VI.js → folder-open-Dst_Z0_K.js} +1 -1
  99. package/static/app/assets/{hard-drive-CjJtYqHf.js → hard-drive-D53MsWkV.js} +1 -1
  100. package/static/app/assets/index-C_IrlQMV.js +10 -0
  101. package/static/app/assets/index-FxDusbr0.css +2 -0
  102. package/static/app/assets/{input-CSi6OBJ9.js → input-C5m0riF6.js} +1 -1
  103. package/static/app/assets/{network-Ck1nqc-v.js → network-C5a-E5iS.js} +1 -1
  104. package/static/app/assets/primitives-vNXYf58F.js +1 -0
  105. package/static/app/assets/search-DhbSgW6m.js +1 -0
  106. package/static/app/assets/shield-alert-Cc-WVXqN.js +1 -0
  107. package/static/app/assets/{textarea-C4wM0D-Z.js → textarea-BkZ0EqVO.js} +1 -1
  108. package/static/app/assets/{useFocusTrap-CsnIhsDJ.js → useFocusTrap-CTtKbAOU.js} +1 -1
  109. package/static/app/assets/{navigation-BPQqEQwr.js → useQuery-Dx1fi4Wu.js} +1 -1
  110. package/static/app/assets/users-BFpQXtEF.js +1 -0
  111. package/static/app/assets/utils-BA_lmW3J.js +7 -0
  112. package/static/app/assets/workspace-DBPB0jkX.js +1 -0
  113. package/static/app/index.html +4 -4
  114. package/static/sw.js +1 -1
  115. package/static/app/assets/Act-DmxfbqBp.js +0 -1
  116. package/static/app/assets/Brain-DK_zKCda.js +0 -321
  117. package/static/app/assets/BrainHome-CCE_0hni.js +0 -2
  118. package/static/app/assets/BrainSignals-r_J68_zh.js +0 -1
  119. package/static/app/assets/Capture-CvxwzpJZ.js +0 -1
  120. package/static/app/assets/CommandPalette-CVLiFIQC.js +0 -1
  121. package/static/app/assets/Library-4As9VUvy.js +0 -1
  122. package/static/app/assets/ProductFlow-B-Tz0Um4.js +0 -1
  123. package/static/app/assets/ReviewCard-Va3fPQuj.js +0 -3
  124. package/static/app/assets/System-DSR2zKWd.js +0 -1
  125. package/static/app/assets/index-7FAfYm4v.css +0 -2
  126. package/static/app/assets/index-CEu0Wqjl.js +0 -10
  127. package/static/app/assets/primitives-B2f9N7Dh.js +0 -1
  128. package/static/app/assets/shield-alert-yA_Y8lOB.js +0 -1
  129. package/static/app/assets/utils-BqoznzGP.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.5 Living Brain walkthrough](output/release/v9.9.5/gifs/v9.9.5-living-brain-walkthrough.gif)
14
+ ![v10.0.0 Living Brain walkthrough](output/release/v10.0.0/gifs/v10.0.0-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.5/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v9.9.5/screenshots/05-memory-graph.png) |
28
- | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v9.9.5/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v9.9.5/screenshots/12-review-center.png) |
29
- | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v9.9.5/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v9.9.5/screenshots/10-admin-console.png) |
27
+ | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v10.0.0/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v10.0.0/screenshots/05-memory-graph.png) |
28
+ | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v10.0.0/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v10.0.0/screenshots/12-review-center.png) |
29
+ | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v10.0.0/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v10.0.0/screenshots/10-admin-console.png) |
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
- | ![Login](output/release/v9.9.5/screenshots/01-login.png) | ![Model install](output/release/v9.9.5/screenshots/03-install-load-progress.png) | ![Model library](output/release/v9.9.5/screenshots/07-model-library.png) |
60
+ | ![Login](output/release/v10.0.0/screenshots/01-login.png) | ![Model install](output/release/v10.0.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v10.0.0/screenshots/07-model-library.png) |
61
61
 
62
62
  Screenshot index and capture notes:
63
- [output/release/v9.9.5/SCREENSHOT_INDEX.md](output/release/v9.9.5/SCREENSHOT_INDEX.md)
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 **9.9.5Closed Gaps**:
68
-
69
- - **One approval path.** Legacy `human_in_loop` now rides the same durable
70
- approval store as `awaiting_approval` (hashed tokens, restart-safe). The
71
- old wire contract (`waiting_approval` + `context_id`) still works; the
72
- separate in-memory `_pending` map is gone.
73
- - **Rollback that is honest.** File recovery is `git` pre-write `snapshot`
74
- `none`, so non-git workspaces and newly created files can still be
75
- restored. Each rollback entry reports its mode.
76
- - **Critic sees artifact truth.** Before judging file work, the critic gets a
77
- deterministic checklist of written paths with sanitize/repair flags an
78
- auto-repaired scaffold cannot pass as fulfillment unchecked.
79
- - **Mid-run workspace awareness.** Later executor steps see files this run
80
- already wrote, so multi-step "create then explain" work is not blind.
81
- - **Optional cross-encoder rerank.** Off by default; set
82
- `LATTICEAI_CROSS_ENCODER_RERANK=1` to reorder hybrid matches (identity
83
- fallback when the model is missing). Hybrid responses carry a `rerank`
84
- meta block.
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.0Plain 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 9.9.5 release must use exact filenames:
88
+ Expected artifacts for 10.0.0 release must use exact filenames:
95
89
 
96
- - `dist/ltcai-9.9.5-py3-none-any.whl`
97
- - `dist/ltcai-9.9.5.tar.gz`
98
- - `ltcai-9.9.5.tgz`
99
- - `dist/ltcai-9.9.5.vsix`
100
- - `src-tauri/target/release/bundle/dmg/Lattice AI_9.9.5_aarch64.dmg`
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 9.9.5.
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: **9.9.5Closed Gaps**.
3
+ Current release: **10.0.0Plain 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
@@ -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.5Closed Gaps**.
6
+ Current release: **10.0.0Plain 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
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Onboarding
2
2
 
3
- Current release: **9.9.5Closed Gaps**.
3
+ Current release: **10.0.0Plain 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
@@ -1,4 +1,4 @@
1
- # Lattice AI — Operations Guide (v9.9.5)
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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **Status: reference**
4
4
  > 도입: v9.9.4 (2026-07-25, 리뷰 Wave 1.4 "표면 패리티 체크리스트").
5
- > 갱신: v9.9.5VS Code/Telegram 승인 흐름 해소.
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/` (Send to Lattice) | 캡처 전용 표면 |
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 배지 + 출처→청크 | ✅ (동일) | `askCurrentFile` — 배지 없음 | | 답변만, 배지 없음 |
27
- | 첫 산출물 (Artifact) | ✅ artifacts[] 카드·미리보기·Brain 기억 칩 | ✅ (동일) | ◐ `createFile` 검증 파이프라인 경유, 카드 UI 없음 | — | ◐ 파일 전송만 |
28
- | 첫 보호 (Approval) | ✅ 승인 카드 + TTL 카운트다운 + 재시작 생존 | ✅ (동일) | ✅ List/Approve/Reject 커맨드 + 토큰 캐시 | | ✅ 인라인 Done/Cancel + run_id/token 재개 |
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 후보다.** 현재 갭: VS Code 회상 배지, VS Code Review Center.
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
+ "근거 확인 불가"이며 절대 "근거 있음"으로 승격하지 않는다.
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **9.9.5Closed Gaps**.
3
+ Current release: **10.0.0Plain Language**.
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.5Closed Gaps**.
3
+ Current release: **10.0.0Plain Language**.
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.5Closed Gaps**.
3
+ Current release: **10.0.0Plain Language**.
4
4
 
5
5
  명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
6
6
  구현: `lattice_brain/graph/schema.py`