ltcai 10.4.0 → 10.6.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 (77) hide show
  1. package/README.md +54 -36
  2. package/docs/CHANGELOG.md +153 -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 +1 -1
  7. package/docs/PERMISSION_MODE.md +15 -4
  8. package/docs/TRUST_MODEL.md +1 -1
  9. package/docs/WHY_LATTICE.md +1 -1
  10. package/docs/kg-schema.md +1 -1
  11. package/lattice_brain/__init__.py +1 -1
  12. package/lattice_brain/runtime/multi_agent.py +1 -1
  13. package/latticeai/__init__.py +1 -1
  14. package/latticeai/core/legacy_compatibility.py +1 -1
  15. package/latticeai/core/marketplace.py +1 -1
  16. package/latticeai/core/workspace_os_constants.py +1 -1
  17. package/latticeai/services/architecture_readiness.py +1 -1
  18. package/latticeai/services/product_readiness.py +1 -1
  19. package/package.json +1 -1
  20. package/scripts/capture_release_evidence.mjs +40 -8
  21. package/scripts/check_current_release_docs.mjs +1 -1
  22. package/src-tauri/Cargo.lock +1 -1
  23. package/src-tauri/Cargo.toml +1 -1
  24. package/src-tauri/tauri.conf.json +1 -1
  25. package/static/app/asset-manifest.json +39 -37
  26. package/static/app/assets/{Act-BK__Y5VE.js → Act-B3MSgNsJ.js} +1 -1
  27. package/static/app/assets/AdminConsole-Ds8u36lf.js +1 -0
  28. package/static/app/assets/Brain-XdHCIB6a.js +321 -0
  29. package/static/app/assets/BrainHome-Dp8gzQoF.js +2 -0
  30. package/static/app/assets/{BrainSignals-CesSPtUP.js → BrainSignals-D4yZflVt.js} +1 -1
  31. package/static/app/assets/Capture-BwSZmiZ8.js +1 -0
  32. package/static/app/assets/CommandPalette-Ds0DnRSC.js +1 -0
  33. package/static/app/assets/Library-SqzHjyfx.js +1 -0
  34. package/static/app/assets/{LivingBrain-Bz-h6LBH.js → LivingBrain-DpKt-NKE.js} +1 -1
  35. package/static/app/assets/{ProductFlow-DAZ7DJCE.js → ProductFlow-BimeVtWH.js} +1 -1
  36. package/static/app/assets/{ReviewCard-Bv0WGbY6.js → ReviewCard-DVPi1LPZ.js} +1 -1
  37. package/static/app/assets/System-w-9miIG8.js +1 -0
  38. package/static/app/assets/{activity-AolpZJCH.js → activity-C0QavXjd.js} +1 -1
  39. package/static/app/assets/arrow-left-TsAKz-s_.js +1 -0
  40. package/static/app/assets/{bot-CsVsT2nd.js → bot-C1-MbzCF.js} +1 -1
  41. package/static/app/assets/brain-CeRqzJVc.js +1 -0
  42. package/static/app/assets/{button-1BP1PJZ3.js → button-Z-2N8PUb.js} +1 -1
  43. package/static/app/assets/{circle-pause-5paeCOtq.js → circle-pause-CgjCLdmO.js} +1 -1
  44. package/static/app/assets/{circle-play-By8mFYRV.js → circle-play-Bj45uClm.js} +1 -1
  45. package/static/app/assets/{cpu-DvUQxdKe.js → cpu-B-2Chwfy.js} +1 -1
  46. package/static/app/assets/{download-CFqYG90a.js → download-CKmiOG3C.js} +1 -1
  47. package/static/app/assets/{folder-open-CVSnp-Dp.js → folder-open-fE7lLvhZ.js} +1 -1
  48. package/static/app/assets/{hard-drive-Ckr4Vd6-.js → hard-drive-rDl1xsJ1.js} +1 -1
  49. package/static/app/assets/index-AEIqmjwZ.js +10 -0
  50. package/static/app/assets/index-DcMODGjM.css +2 -0
  51. package/static/app/assets/{input-D-JKquXU.js → input-BflJYT5-.js} +1 -1
  52. package/static/app/assets/permissionCopy-BNNvkXSX.js +1 -0
  53. package/static/app/assets/{primitives-D8U9OaIo.js → primitives-CP68OWk2.js} +1 -1
  54. package/static/app/assets/search-B4O4iIgg.js +1 -0
  55. package/static/app/assets/share-2-CyjG2_yY.js +1 -0
  56. package/static/app/assets/{shield-alert-DnsvO79P.js → shield-alert-C_JBPWYd.js} +1 -1
  57. package/static/app/assets/{textarea-4RchwbTa.js → textarea-Ds1Exelb.js} +1 -1
  58. package/static/app/assets/{useFocusTrap-CFJjy7cS.js → useFocusTrap-BgIZQ4if.js} +1 -1
  59. package/static/app/assets/{useQuery-3Reu-A4a.js → useQuery-6Bu27NQe.js} +1 -1
  60. package/static/app/assets/{users-BTxYksxa.js → users-31lxlciQ.js} +1 -1
  61. package/static/app/assets/{utils-D02Vf-fw.js → utils-C0-C5mZc.js} +1 -1
  62. package/static/app/assets/workspace-DAB-urHL.js +1 -0
  63. package/static/app/index.html +4 -4
  64. package/static/sw.js +1 -1
  65. package/static/app/assets/AdminConsole-ZrTyN8_F.js +0 -1
  66. package/static/app/assets/Brain-CYHDXpPB.js +0 -321
  67. package/static/app/assets/BrainHome-bbJulb5g.js +0 -2
  68. package/static/app/assets/Capture-p5upXmz2.js +0 -1
  69. package/static/app/assets/CommandPalette-0zkyC0RY.js +0 -1
  70. package/static/app/assets/Library-Dt-vABI2.js +0 -1
  71. package/static/app/assets/System-BhrJQSD_.js +0 -1
  72. package/static/app/assets/brain-vuppco5y.js +0 -1
  73. package/static/app/assets/index--0zKF5Ow.js +0 -10
  74. package/static/app/assets/index-CEkL4_M-.css +0 -2
  75. package/static/app/assets/network-DB88FZ2T.js +0 -1
  76. package/static/app/assets/search-B8jsVTw_.js +0 -1
  77. package/static/app/assets/workspace-CSJNgX-C.js +0 -1
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
- ![v10.4.0 Living Brain walkthrough](output/release/v10.4.0/gifs/v10.4.0-living-brain-walkthrough.gif)
14
+ ![v10.6.0 Living Brain walkthrough](output/release/v10.6.0/gifs/v10.6.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,10 @@ 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/v10.4.0/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v10.4.0/screenshots/05-memory-graph.png) |
28
- | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v10.4.0/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v10.4.0/screenshots/12-review-center.png) |
29
- | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v10.4.0/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v10.4.0/screenshots/10-admin-console.png) |
27
+ | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v10.6.0/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v10.6.0/screenshots/05-memory-graph.png) |
28
+ | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v10.6.0/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v10.6.0/screenshots/12-review-center.png) |
29
+ | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v10.6.0/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v10.6.0/screenshots/10-admin-console.png) |
30
+ | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v10.6.0/screenshots/11-knowledge-journey.png) | **Say how much it may do alone** — one dial in plain words; dangerous actions stay blocked either way ![Settings](output/release/v10.6.0/screenshots/08-system.png) |
30
31
 
31
32
  ## Why Lattice AI
32
33
 
@@ -57,47 +58,62 @@ First-run flow — wake the Brain, pick the owner, load a recommended model:
57
58
 
58
59
  | | | |
59
60
  | --- | --- | --- |
60
- | ![Login](output/release/v10.4.0/screenshots/01-login.png) | ![Model install](output/release/v10.4.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v10.4.0/screenshots/07-model-library.png) |
61
+ | ![Login](output/release/v10.6.0/screenshots/01-login.png) | ![Model install](output/release/v10.6.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v10.6.0/screenshots/07-model-library.png) |
61
62
 
62
63
  Screenshot index and capture notes:
63
- [output/release/v10.4.0/SCREENSHOT_INDEX.md](output/release/v10.4.0/SCREENSHOT_INDEX.md)
64
+ [output/release/v10.6.0/SCREENSHOT_INDEX.md](output/release/v10.6.0/SCREENSHOT_INDEX.md)
64
65
 
65
66
  ## Current Release
66
67
 
67
- The current release is **10.4.0 — Named Ground**:
68
-
69
- 10.3.0 wrote down what was not measured. 10.4.0 emptied that list — and the
70
- things that made the list long turned out not to be typing problems.
71
-
72
- - **The type backlog went from 1,407 errors across 77 modules to zero across
73
- 274.** Two root causes accounted for 954 of them, and both were readability
74
- problems: a computed `__all__` that made every star-imported name invisible
75
- to a checker, and an eleven-mixin contract that existed but was written down
76
- nowhere. Both are now explicit, and both are guarded by tests.
77
- - **The composition root is no longer one function.** `app_factory._build` went
78
- from 1,318 lines to 26, split into ten ordered phases sharing a typed
79
- `RuntimeContext`. The phase order is a contract with a test, not a comment —
80
- and reading a value before its phase has run fails by name.
81
- - **Four real defects surfaced on the way**, including one that meant
82
- `python -m latticeai.server_app` had never worked: `main` was a local inside
83
- the old closure and was never on the export list.
84
- - **The surface-parity matrix has no ◐ left.** VS Code gained folder capture,
85
- artifact cards with their repair/validation flags, and a hardware-derived
86
- model recommendation; Telegram gained the same artifact card. All four were
87
- rendering gaps — the sidecar was already reporting the data.
88
- - **Coverage moved honestly, not to target.** Frontend 28.5% → 32.3% (208 → 337
89
- tests), Python 71.6% → 71.8% (1,896 → 1,956). Frontend 70% is still roughly
90
- 2,200 statements away, and this release does not claim otherwise.
68
+ The current release is **10.6.0 — Promoted Panels**:
69
+
70
+ 10.5.0 changed the words on each screen. 10.6.0 changes where things sit. Every
71
+ main screen used to open as a row of equal tabs, which asks a first-time user to
72
+ choose before they know what the choices are. Each screen now opens on the panel
73
+ that answers the question that brought you there, and everything else moves
74
+ below it. No feature was removed — every panel is still on the page, it just no
75
+ longer competes for the top of it.
76
+
77
+ - **Each screen leads with one panel instead of a row of equals.** Capture opens
78
+ on a single 자료 추가하기 card holding all three ways to add material —
79
+ 파일 올리기 / 폴더 연결하기 / 웹페이지 저장하기 — as a choice inside one card
80
+ rather than three tabs, with progress and connected folders moved to a quieter
81
+ second row. Work opens on 검토함, what is waiting on you, instead of on the
82
+ empty goal composer. The model library answers "which model is running, and
83
+ can I switch it" in a card above the tabs.
84
+ - **The Brain home is one card, not five stacked blocks.** Greeting, composer,
85
+ the add-material row and the autonomy dial now sit inside a single bordered
86
+ station that lifts when you type anywhere in it. The Brain artwork shrank so
87
+ that it introduces the composer rather than headlining the screen.
88
+ - **Everyday and management destinations stopped being one list.** 대화 · 자료 ·
89
+ 기억 stay in the primary nav; 작업 · AI 모델 · 설정 became topbar links at
90
+ desktop widths and fold into the menu below that — built from one array so the
91
+ two copies cannot drift, and shown by one breakpoint so they can never both
92
+ appear or both vanish.
93
+ - **The knowledge graph became a subview rather than a third tab.** Memory opens
94
+ on search, with 연결 지도 열기 one button away and a labelled way back.
95
+ - **Seven settings tabs became three named groups** — 나와 작업공간 · 내 데이터
96
+ 보관 · 동작 방식과 연결 — so the row reads as a short list of decisions.
97
+ - **Links that named a screen now open that screen.** `#/act/review` and its
98
+ siblings landed on the Brain home for every caller that emitted them — the
99
+ command palette, the daily briefing — because nothing parsed the
100
+ `<screen>/<tab>` form they had always used. The palette also read a private
101
+ second copy of the destination list, so 작업 opened a different screen
102
+ depending on whether you clicked it or searched for it. One list, one parser.
103
+ - **Guarded, not asserted.** The visual sweep walks ten viewport widths and
104
+ fails if a management link is visible in both places at once or in neither, if
105
+ a navigation landmark is unnamed or shares its name with another, or if the
106
+ topbar overflows.
91
107
 
92
108
  Release notes: [RELEASE.md](RELEASE.md) · Full history: [docs/CHANGELOG.md](docs/CHANGELOG.md)
93
109
 
94
- Expected artifacts for 10.4.0 release must use exact filenames:
110
+ Expected artifacts for 10.6.0 release must use exact filenames:
95
111
 
96
- - `dist/ltcai-10.4.0-py3-none-any.whl`
97
- - `dist/ltcai-10.4.0.tar.gz`
98
- - `ltcai-10.4.0.tgz`
99
- - `dist/ltcai-10.4.0.vsix`
100
- - `src-tauri/target/release/bundle/dmg/Lattice AI_10.4.0_aarch64.dmg`
112
+ - `dist/ltcai-10.6.0-py3-none-any.whl`
113
+ - `dist/ltcai-10.6.0.tar.gz`
114
+ - `ltcai-10.6.0.tgz`
115
+ - `dist/ltcai-10.6.0.vsix`
116
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_10.6.0_aarch64.dmg`
101
117
 
102
118
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
103
119
 
@@ -132,6 +148,8 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
132
148
 
133
149
  | Version | Theme |
134
150
  | --- | --- |
151
+ | 10.6.0 | Promoted Panels |
152
+ | 10.5.0 | Everyday Words |
135
153
  | 10.4.0 | Named Ground |
136
154
  | 10.3.0 | Measured Ground |
137
155
  | 10.2.0 | Load-Bearing Fixes |
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,159 @@ 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.6.0] - 2026-08-03
8
+
9
+ A layout rebuild, not a copy pass. Every main screen used to open as a row of
10
+ equal tabs; each now opens on the panel that answers the question that brought
11
+ the reader there, with everything else moved below it. No feature was removed —
12
+ every panel is still on its page. Backend behaviour is unchanged;
13
+ `frontend/openapi.json` differs from 10.5.0 only in `info.version`.
14
+
15
+ ### Changed
16
+ - **Capture leads with one card instead of four page-level tabs.** 파일 올리기 /
17
+ 폴더 연결하기 / 웹페이지 저장하기 became a `role="group"` method picker inside
18
+ a single `자료 추가하기` station, with the chosen method's form opening in the
19
+ same card. Progress, folder health, connected sources and recent documents
20
+ moved to a two-column `.capture-secondary` row that is always visible instead
21
+ of hidden behind a tab. `#/my-computer`, `#/capture-browser` and `#/pipeline`
22
+ still resolve.
23
+ - **Work opens on 검토함 instead of the empty goal composer.** The shell's 작업
24
+ entry point moved from `#/agents` to `#/review`, the Runs tab leads the tab
25
+ strip, and 검토함 leads 실행 within it. The page heading and description now
26
+ follow the selected tab instead of repeating one sentence on all five.
27
+ - **The model library answers the active model above the tab strip.** A new
28
+ `지금 작동 중인 모델` card names the loaded model in human terms and offers
29
+ one-click switching, listing only models already downloaded, supported and
30
+ loadable — never one that is still awaiting consent. With none loaded it says
31
+ so ("아직 사용할 모델이 없어요").
32
+ - **The Brain home is one bordered station instead of five stacked blocks.**
33
+ Greeting, composer, the ingestion dock and the autonomy dial now live in one
34
+ card that lifts on `:focus-within`; the dock and the dial were two competing
35
+ strips and became one `.brain-station-toolbar` row. The Brain organism shrank
36
+ from 7rem to 5.4rem.
37
+ - **The knowledge graph is a subview, not a third peer tab.** Memory keeps two
38
+ tabs and reaches the graph through a `연결 지도 열기` button, which swaps the
39
+ tab strip for a labelled `기억 화면으로 돌아가기` bar. `#/knowledge-graph`
40
+ still resolves.
41
+ - **Settings' seven flat tabs became three named groups**: 나와 작업공간
42
+ (계정, 작업공간), 내 데이터 보관 (스냅샷, 활동), 동작 방식과 연결 (설정,
43
+ 네트워크, 관리). All tab routes are unchanged.
44
+ - **Everyday and management destinations split.** 대화 · 자료 · 기억 stay in the
45
+ primary nav; 작업 · AI 모델 · 설정 render as topbar quick links at ≥960px and
46
+ inside the menu below that. Both copies are built from one array and shown by
47
+ one breakpoint in `shell.css`, so they cannot drift apart and cannot both
48
+ appear or both vanish.
49
+
50
+ ### Fixed
51
+ - **`#/act/review` never opened the review inbox.** The command palette and the
52
+ daily briefing had always emitted `<screen>/<tab>` hashes, and `parseHash`
53
+ had no case for that shape, so `#/act/review`, `#/act/workflows` and
54
+ `#/brain/graph` all fell through to the Brain home. The generic form is now
55
+ parsed as the last step, after named aliases, so an alias always wins.
56
+ - **The command palette read a private second copy of the destination list.**
57
+ `commandRoutes` in `routes.ts` was not the list the palette rendered, so
58
+ repointing 작업 there changed nothing while the palette kept the old target —
59
+ one label meaning two different screens depending on how it was reached. The
60
+ palette now reads that single list, and its entries are i18n keys rather than
61
+ hardcoded English labels.
62
+ - **The menu's focus trap counted links the browser will not focus.** The menu
63
+ holds a copy of the management links that CSS hides once the topbar shows
64
+ them; those anchors stay in the DOM, so `querySelectorAll` put the trap's
65
+ first/last boundaries on hidden elements, and opening the menu could call
66
+ `focus()` on a `display:none` anchor — which silently does nothing, leaving
67
+ focus on the trigger. Both now filter to elements that are actually rendered.
68
+ - **Both the primary nav and the menu's list were named "화면 이동".** A landmark
69
+ list showed two navigations with the same name and no way to tell them apart.
70
+ The management list is now 관리 and shares the accessible name 관리 화면 이동
71
+ with its topbar twin, which is never visible at the same time.
72
+ - **Release frame 11 shipped a byte-identical copy of frame 06.** With the
73
+ pipeline moved out of its own tab, `#/pipeline` renders the same page as
74
+ `#/capture`, so the full-page capture produced the same file twice while the
75
+ README printed them as different tiles. `scripts/capture_release_evidence.mjs`
76
+ now frames the three-step card itself.
77
+
78
+ ### Testing
79
+ - `tests/visual/v3.spec.js` asserts the new hierarchy: Brain home is one card
80
+ containing composer, dock and dial; the graph is reached by button and not by
81
+ tab; Capture has no page-level tabs and keeps its three deep links; the active
82
+ model card precedes the tab strip; the shell link and the command palette open
83
+ the same screen for 작업.
84
+ - A ten-width sweep (390px–1440px) fails if a management link is visible in both
85
+ places or in neither, if the topbar overflows, or if the menu button is
86
+ clipped. A separate check requires every visible `<nav>` to carry a unique
87
+ accessible name.
88
+ - `tests/visual/mock_server.cjs` now serves `POST /models/load` and
89
+ `GET /knowledge-graph/local/health`, so the one-click model switch and the
90
+ folder-health card render during capture instead of being photographed as
91
+ placeholders.
92
+
93
+ ## [10.5.0] - 2026-08-03
94
+
95
+ A UI/UX pass for the person who did not build this. No feature was removed;
96
+ vocabulary, ordering, and the default mode a first-run user lands in changed.
97
+ Backend behaviour is unchanged — `frontend/openapi.json` differs from 10.4.0
98
+ only in `info.version`.
99
+
100
+ ### Changed
101
+ - **Permission modes are named by what they do to you, not by their enum.**
102
+ 엄격 / 신뢰 / 바이패스 → 먼저 물어보기 / 웬만하면 알아서 / 거의 다 알아서
103
+ (`Strict` / `Trusted` / `Bypass` → `Ask me first` / `Mostly on its own` /
104
+ `Almost everything on its own`), each with a one-line summary of what it does
105
+ without asking. The bypass warning now says which kind of action stays
106
+ blocked rather than naming the mode.
107
+ - **`#/pipeline` is reachable in basic mode and named 진행 상황.** Its two raw
108
+ API payload panels are replaced (in basic mode) by an `aria-label`ed ordered
109
+ list of three steps — 내용 읽기 / 뜻 파악하기 / 기억에 연결하기 — with a
110
+ per-step waiting/working/done state. Advanced mode keeps both payload panels.
111
+ - **Ingestion stage names describe the reader's file, not the machine's job**:
112
+ 준비 → 파일 여는 중, 파싱 → 내용 읽는 중, 임베딩 → 뜻 파악하는 중, 인덱싱 →
113
+ 기억에 연결하는 중, 메모리화 완료 → 기억 완료. The stale-embedding prompt
114
+ became "찾는 방식이 바뀌었어요 / 기억 다시 정리하기".
115
+ - **Run rows are titled by workflow name** (then goal, then title/query, then
116
+ "n번째 작업" in basic mode) instead of a database id; the id moves to a
117
+ secondary line in advanced mode only.
118
+ - **Run and trigger states are translated per token.**
119
+ `act.runStatus.<token>` covers ok/succeeded/completed/retried_ok/
120
+ awaiting_approval/waiting_approval/running/queued/pending/failed/error/
121
+ cancelled/stopped/interrupted/rejected/partial; an unmapped token renders
122
+ "알 수 없음" rather than itself.
123
+ - **Brain stats answer a person's question** — 저장 위치 / 내 컴퓨터 and
124
+ 가져가기 / 언제든 내보낼 수 있어요 in place of `schema_version` and the
125
+ storage engine name (both still shown in advanced).
126
+ - **`scripts/capture_release_evidence.mjs` captures in `basic`**, the app's real
127
+ default, instead of `advanced`. Every README screenshot before this release
128
+ showed panels a first-run user never sees. `09-model-setup-status.png` (a
129
+ duplicate of the Brain home once captured in basic) is replaced by
130
+ `09-automation-runs.png`, and `11-knowledge-journey.png` is added.
131
+ - **The walkthrough GIF is encoded against a palette generated from the clip**
132
+ (`palettegen=stats_mode=diff` + `paletteuse=dither=sierra2_4a`) instead of
133
+ ffmpeg's default 256-colour cube, which had been rendering the ivory
134
+ background as dithered yellow and the greens as olive. 1.5 MB → 2.8 MB.
135
+
136
+ ### Added
137
+ - `frontend/src/lib/permissionCopy.ts` — one source for permission-mode copy,
138
+ shared by `BrainQuickControls` (home dial) and `PermissionModePanel`
139
+ (Settings), which had each been translating the server catalog separately.
140
+ Lookup is by mode id, falling back to the server's own localized label, so a
141
+ mode added server-side still renders; `PermissionModePanel.test.tsx` asserts
142
+ that fallback so the table cannot become an accidental allowlist.
143
+ - A basic-mode "자동으로 실행되는 작업" summary on the workflows surface:
144
+ workflow name plus 새 자료가 들어오면 / 정해진 시간에 / 내가 눌렀을 때만 /
145
+ 조건이 맞으면, and 켜져 있어요 / 지금은 멈춰 있어요. The node canvas and the
146
+ paste-JSON box are author tools and stay in advanced mode.
147
+ - `tests/visual/v3.spec.js`: a sweep over ten plain-mode routes asserting each
148
+ renders, shows no service-unavailable banner, and contains none of a list of
149
+ engine terms; plus a test that the three journey steps render under their
150
+ accessible name. `#/runs` failed the vocabulary assertion before this pass.
151
+ - `Library.test.tsx` covers registry prose that is English-only: a sentence with
152
+ no Hangul and six or more words is now replaced by a written Korean
153
+ explanation instead of being substituted term by term into word salad.
154
+
155
+ ### Known gaps
156
+ - The approval card under 작업 → 실행 still labels raw payload fields `Action`,
157
+ `Action Label`, `User Email`. It is visible in `09-automation-runs.png` and is
158
+ published rather than cropped.
159
+
7
160
  ## [10.4.0] - 2026-08-02
8
161
 
9
162
  ### Changed
@@ -1,6 +1,6 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **10.4.0 — Named Ground**.
3
+ Current release: **10.6.0 — Promoted Panels**.
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: **10.4.0 — Named Ground**.
6
+ Current release: **10.6.0 — Promoted Panels**.
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: **10.4.0 — Named Ground**.
3
+ Current release: **10.6.0 — Promoted Panels**.
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 (v10.4.0)
1
+ # Lattice AI — Operations Guide (v10.6.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
@@ -36,10 +36,21 @@ Env default: `LATTICEAI_PERMISSION_MODE=strict|trusted|bypass`.
36
36
 
37
37
  ## UI
38
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
39
+ `PermissionModePanel` renders in **설정 → 혼자 해도 되는 일** (`SystemPage`
40
+ settings tab; the section was called 에이전트 자율성 before 10.5.0). The same
41
+ dial is reachable on the home screen through `BrainQuickControls`.
42
+
43
+ It still renders whatever modes the catalog `/api/permission-mode/catalog`
44
+ returns rather than a hardcoded list, so a mode added server-side appears with
45
+ no frontend change. Since 10.5.0 the *wording* is no longer taken from the
46
+ server for modes the app knows: `frontend/src/lib/permissionCopy.ts` maps mode
47
+ id → plain-language label and summary (`strict` → 먼저 물어보기, `trusted` →
48
+ 웬만하면 알아서, `bypass` → 거의 다 알아서), and both surfaces read that one
49
+ module so the dial cannot be named two ways. The server's own localized label
50
+ is the fallback for an id the map does not know — renaming a mode server-side
51
+ therefore changes the UI only for ids the app has no copy for.
52
+
53
+ The apply button stays disabled until
43
54
 
44
55
  * a *different* mode is selected, and
45
56
  * for a mode whose catalog entry sets `requires_ack`, the risk acknowledgement
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **10.4.0 — Named Ground**.
3
+ Current release: **10.6.0 — Promoted Panels**.
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: **10.4.0 — Named Ground**.
3
+ Current release: **10.6.0 — Promoted Panels**.
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: **10.4.0 — Named Ground**.
3
+ Current release: **10.6.0 — Promoted Panels**.
4
4
 
5
5
  명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
6
6
  구현: `lattice_brain/graph/schema.py`
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "10.4.0"
29
+ __version__ = "10.6.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -47,7 +47,7 @@ from typing import Any, Callable, Dict, List, Optional
47
47
  from ..utils import now_iso as _now
48
48
  from .contracts import multi_agent_contract
49
49
 
50
- MULTI_AGENT_VERSION = "10.4.0"
50
+ MULTI_AGENT_VERSION = "10.6.0"
51
51
 
52
52
  AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
53
53
  CORE_PIPELINE = ("planner", "executor", "reviewer")
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "10.4.0"
3
+ __version__ = "10.6.0"
@@ -13,7 +13,7 @@ from dataclasses import dataclass
13
13
  from pathlib import Path
14
14
  from typing import Any, Dict, List
15
15
 
16
- LEGACY_COMPATIBILITY_VERSION = "10.4.0"
16
+ LEGACY_COMPATIBILITY_VERSION = "10.6.0"
17
17
 
18
18
 
19
19
  @dataclass(frozen=True)
@@ -10,7 +10,7 @@ from __future__ import annotations
10
10
  from copy import deepcopy
11
11
  from typing import Any, Dict, List, Optional
12
12
 
13
- MARKETPLACE_VERSION = "10.4.0"
13
+ MARKETPLACE_VERSION = "10.6.0"
14
14
  TEMPLATE_KINDS = ("plugin", "workflow", "agent", "ingestion_bridge")
15
15
 
16
16
 
@@ -10,7 +10,7 @@ from __future__ import annotations
10
10
 
11
11
  from typing import Dict
12
12
 
13
- WORKSPACE_OS_VERSION = "10.4.0"
13
+ WORKSPACE_OS_VERSION = "10.6.0"
14
14
 
15
15
  # Workspace types separate single-user Personal workspaces from shared
16
16
  # Organization workspaces. Both keep the same local-first JSON store; the type
@@ -16,7 +16,7 @@ from typing import Any, Dict, List
16
16
 
17
17
  from latticeai.core.legacy_compatibility import legacy_shim_report
18
18
 
19
- ARCHITECTURE_VERSION_TARGET = "10.4.0"
19
+ ARCHITECTURE_VERSION_TARGET = "10.6.0"
20
20
 
21
21
  PREFERRED_REFACTORING_ORDER = [
22
22
  "agent-runtime",
@@ -18,7 +18,7 @@ from typing import Any, Dict, List
18
18
 
19
19
  from latticeai.services.architecture_readiness import architecture_readiness
20
20
 
21
- PRODUCT_VERSION_TARGET = "10.4.0"
21
+ PRODUCT_VERSION_TARGET = "10.6.0"
22
22
 
23
23
 
24
24
  @dataclass(frozen=True)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "10.4.0",
3
+ "version": "10.6.0",
4
4
  "description": "Lattice AI — local-first Digital Brain that keeps your knowledge durable across any AI model.",
5
5
  "homepage": "https://github.com/TaeSooPark-PTS/LatticeAI#readme",
6
6
  "repository": {
@@ -53,12 +53,18 @@ async function main() {
53
53
  const page = await context.newPage();
54
54
  page.setDefaultTimeout(15000);
55
55
 
56
+ // These frames are the ones the README publishes, so they have to show the
57
+ // product a new person actually lands in. The app's own default is `basic`
58
+ // (frontend/src/store/appStore.ts) — capturing in `advanced` meant every
59
+ // published screenshot showed raw payload panels, storage engines and hook
60
+ // logs that no first-run user is ever shown. The admin console is captured
61
+ // by route below and does not depend on this setting.
56
62
  await page.addInitScript(() => {
57
63
  if (!sessionStorage.getItem("lattice.releaseEvidence.cleared")) {
58
64
  localStorage.removeItem("lattice.productFlow.complete");
59
65
  localStorage.removeItem("lattice.productFlow.user");
60
66
  localStorage.setItem("lattice.language", "ko");
61
- localStorage.setItem("lattice.mode", "advanced");
67
+ localStorage.setItem("lattice.mode", "basic");
62
68
  sessionStorage.setItem("lattice.releaseEvidence.cleared", "true");
63
69
  }
64
70
  });
@@ -109,16 +115,34 @@ async function main() {
109
115
  await page.locator("h1.page-title", { hasText: "Lattice를 내 방식에 맞게 설정하세요." }).waitFor();
110
116
  await shot(page, "08-system.png");
111
117
 
112
- await page.goto(`${baseURL}/app#/brain`, { waitUntil: "networkidle" });
113
- await page.locator("main[aria-label='Lattice Brain']").waitFor();
114
- await page.getByTestId("brain-knowledge-flow").waitFor();
115
- await page.waitForTimeout(250);
116
- await shot(page, "09-model-setup-status.png");
118
+ // Captured in `basic`, the Brain page's knowledge-flow strip stays collapsed,
119
+ // so this slot published a second copy of 04. The runs list carries what
120
+ // actually changed instead: runs named the way their author named them, and
121
+ // statuses spoken aloud rather than shown as `awaiting_approval`.
122
+ await page.goto(`${baseURL}/app#/runs`, { waitUntil: "networkidle" });
123
+ await page.locator("h1.page-title").waitFor();
124
+ await page.getByText("내 승인 기다리는 중").first().waitFor();
125
+ await shot(page, "09-automation-runs.png");
117
126
 
118
127
  await page.goto(`${baseURL}/app#/admin/users`, { waitUntil: "networkidle" });
119
128
  await page.waitForTimeout(250);
120
129
  await shot(page, "10-admin-console.png");
121
130
 
131
+ // The three named steps a file walks on its way into memory. 10.6.0 moved
132
+ // this out of a tab of its own and into Capture's second row, where it is now
133
+ // always on screen — so `#/pipeline` renders the same page as `#/capture`,
134
+ // and a full-page shot here came out byte-identical to 06. The README prints
135
+ // the two as different tiles, so frame the card this tile is actually about.
136
+ await page.goto(`${baseURL}/app#/pipeline`, { waitUntil: "networkidle" });
137
+ const journeyList = page.getByRole("list", { name: "자료가 기억이 되는 3단계" });
138
+ await journeyList.waitFor();
139
+ const journeyCard = page
140
+ .locator(".capture-secondary-column > *")
141
+ .filter({ has: journeyList })
142
+ .first();
143
+ await page.waitForTimeout(120);
144
+ await journeyCard.screenshot({ path: path.join(screenshots, "11-knowledge-journey.png") });
145
+
122
146
  await page.goto(`${baseURL}/app#/review`, { waitUntil: "networkidle" });
123
147
  await page.getByText(/Review Center|리뷰 센터|검토함/).first().waitFor();
124
148
  const rawError = page.getByText(/not valid JSON|Unexpected token/);
@@ -137,10 +161,17 @@ async function main() {
137
161
  if (fs.existsSync(webmTarget)) fs.unlinkSync(webmTarget);
138
162
  if (fs.existsSync(gifTarget)) fs.unlinkSync(gifTarget);
139
163
  fs.renameSync(recorded, webmTarget);
164
+ // ffmpeg's default GIF palette is a fixed 256-colour cube, which turned the
165
+ // app's ivory background into a dithered yellow and its greens into olive —
166
+ // this GIF is the first thing on the README, so it was publishing a product
167
+ // that does not exist. Generating the palette from the clip itself keeps the
168
+ // real colours.
140
169
  execFileSync("ffmpeg", [
141
170
  "-y",
142
171
  "-i", webmTarget,
143
- "-vf", "fps=8,scale=960:-1:flags=lanczos",
172
+ "-filter_complex",
173
+ "fps=8,scale=960:-1:flags=lanczos,split[s0][s1];" +
174
+ "[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=sierra2_4a",
144
175
  "-loop", "0",
145
176
  gifTarget,
146
177
  ], { stdio: "ignore" });
@@ -161,8 +192,9 @@ Captured from the built React/Vite app served by the release visual API on ${new
161
192
  | [06-capture.png](screenshots/06-capture.png) | Add Sources |
162
193
  | [07-model-library.png](screenshots/07-model-library.png) | Model Library |
163
194
  | [08-system.png](screenshots/08-system.png) | System |
164
- | [09-model-setup-status.png](screenshots/09-model-setup-status.png) | Model setup status |
195
+ | [09-automation-runs.png](screenshots/09-automation-runs.png) | Automation runs, named and status-spoken |
165
196
  | [10-admin-console.png](screenshots/10-admin-console.png) | Separate Admin Console |
197
+ | [11-knowledge-journey.png](screenshots/11-knowledge-journey.png) | Material-to-memory steps |
166
198
  | [12-review-center.png](screenshots/12-review-center.png) | Automation Review Center |
167
199
 
168
200
  ## Motion Evidence
@@ -6,7 +6,7 @@ const root = process.cwd();
6
6
  const pkg = JSON.parse(readFileSync(path.join(root, "package.json"), "utf8"));
7
7
  const version = pkg.version;
8
8
  const releaseDir = `output/release/v${version}`;
9
- const releaseTheme = "Named Ground";
9
+ const releaseTheme = "Promoted Panels";
10
10
  const title = `${version} — ${releaseTheme}`;
11
11
  const escapedVersion = version.replaceAll(".", "\\.");
12
12
 
@@ -1584,7 +1584,7 @@ dependencies = [
1584
1584
 
1585
1585
  [[package]]
1586
1586
  name = "lattice-ai-desktop"
1587
- version = "10.4.0"
1587
+ version = "10.6.0"
1588
1588
  dependencies = [
1589
1589
  "plist",
1590
1590
  "serde",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lattice-ai-desktop"
3
- version = "10.4.0"
3
+ version = "10.6.0"
4
4
  description = "Lattice AI Digital Brain desktop shell"
5
5
  authors = ["TaeSoo Park"]
6
6
  edition = "2021"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://schema.tauri.app/config/2",
3
3
  "productName": "Lattice AI",
4
- "version": "10.4.0",
4
+ "version": "10.6.0",
5
5
  "identifier": "ai.lattice.desktop",
6
6
  "build": {
7
7
  "beforeDevCommand": "npm run frontend:dev",