ltcai 11.7.0 → 11.9.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 (136) hide show
  1. package/README.md +73 -70
  2. package/docs/BENCHMARKS.md +9 -2
  3. package/docs/CHANGELOG.md +157 -0
  4. package/docs/CI_AND_RELEASE_GATES.md +126 -41
  5. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  6. package/docs/DEVELOPMENT.md +34 -14
  7. package/docs/LEGACY_COMPATIBILITY.md +10 -6
  8. package/docs/ONBOARDING.md +5 -3
  9. package/docs/OPERATIONS.md +5 -1
  10. package/docs/PERMISSION_MODE.md +14 -9
  11. package/docs/TRUST_MODEL.md +13 -6
  12. package/docs/USABILITY_AUDIT.md +5 -0
  13. package/docs/WHY_LATTICE.md +6 -4
  14. package/docs/kg-schema.md +7 -3
  15. package/docs/mcp-tools.md +73 -79
  16. package/docs/security-model.md +6 -3
  17. package/lattice_brain/__init__.py +1 -1
  18. package/lattice_brain/graph/_kg_common/__init__.py +1 -54
  19. package/lattice_brain/graph/_kg_common/text.py +14 -450
  20. package/lattice_brain/ingestion/__init__.py +6 -3
  21. package/lattice_brain/multimodal/__init__.py +9 -3
  22. package/latticeai/__init__.py +1 -1
  23. package/latticeai/api/agent_worker_seam.py +12 -1
  24. package/latticeai/api/models.py +18 -110
  25. package/latticeai/api/search.py +7 -30
  26. package/latticeai/api/worker_compute.py +53 -107
  27. package/latticeai/api/worker_seams.py +17 -2
  28. package/latticeai/core/http_origin.py +3 -3
  29. package/latticeai/core/messages.py +0 -5
  30. package/latticeai/core/policy.py +1 -6
  31. package/latticeai/core/quiet.py +1 -20
  32. package/latticeai/core/security.py +29 -83
  33. package/latticeai/core/sessions.py +95 -4
  34. package/latticeai/core/users.py +0 -38
  35. package/latticeai/models/router/catalog.py +2 -2
  36. package/latticeai/models/router/generation.py +81 -14
  37. package/latticeai/models/router/loading.py +41 -5
  38. package/latticeai/runtime/access_runtime.py +7 -4
  39. package/latticeai/runtime/build_phases/features.py +8 -31
  40. package/latticeai/runtime/build_phases/foundation.py +7 -16
  41. package/latticeai/runtime/build_phases/web.py +3 -3
  42. package/latticeai/runtime/build_phases/worker_profile.py +21 -28
  43. package/latticeai/runtime/runtime_context.py +0 -2
  44. package/latticeai/services/architecture_readiness.py +18 -19
  45. package/latticeai/services/process_audit.py +1 -22
  46. package/latticeai/services/product_readiness.py +33 -11
  47. package/latticeai/services/voice_capture.py +8 -28
  48. package/latticeai/tools/__init__.py +6 -46
  49. package/latticeai/tools/commands.py +9 -15
  50. package/latticeai/tools/knowledge.py +0 -6
  51. package/package.json +3 -5
  52. package/requirements.txt +0 -1
  53. package/scripts/check_current_release_docs.mjs +1 -1
  54. package/scripts/check_openapi_drift.mjs +3 -2
  55. package/scripts/check_server_i18n.mjs +5 -4
  56. package/scripts/compose_openapi.py +2 -1
  57. package/scripts/export_openapi.py +5 -4
  58. package/scripts/gen_worker_allowlist_fixture.py +2 -2
  59. package/scripts/openapi_route_families.json +14 -73
  60. package/scripts/release_screen_claims.json +131 -27
  61. package/src-tauri/Cargo.lock +11 -10
  62. package/src-tauri/Cargo.toml +1 -1
  63. package/src-tauri/tauri.conf.json +1 -1
  64. package/static/app/asset-manifest.json +41 -41
  65. package/static/app/assets/{Act-BPcVAbOL.js → Act-B4WT81kh.js} +1 -1
  66. package/static/app/assets/AdminConsole--Wf71m-o.js +1 -0
  67. package/static/app/assets/{Brain-CT92Kos0.js → Brain-CtYaa26c.js} +2 -2
  68. package/static/app/assets/BrainHome-Be2VPJEc.js +2 -0
  69. package/static/app/assets/BrainSignals-C0__xgpG.js +1 -0
  70. package/static/app/assets/Capture-DdNi5Peb.js +1 -0
  71. package/static/app/assets/Chronicle-B3hNveeI.js +1 -0
  72. package/static/app/assets/CommandPalette-CIsnSsFL.js +1 -0
  73. package/static/app/assets/Library-Bl5XClFV.js +1 -0
  74. package/static/app/assets/LivingBrain-DjkTB_gh.js +1 -0
  75. package/static/app/assets/{ProductFlow-DXBC6brE.js → ProductFlow-DCUNRNHs.js} +1 -1
  76. package/static/app/assets/{ReviewCard-HXRle3qq.js → ReviewCard-CD3yWvUB.js} +2 -2
  77. package/static/app/assets/System-BJ6jQ_SL.js +1 -0
  78. package/static/app/assets/arrow-left-6_28Z0qH.js +1 -0
  79. package/static/app/assets/{bot-Cn8bWRuq.js → bot-Bc3Q27YR.js} +1 -1
  80. package/static/app/assets/brain-B9BDrMTe.js +1 -0
  81. package/static/app/assets/{button-Ct9f2_oT.js → button-D6JcpYcf.js} +1 -1
  82. package/static/app/assets/circle-check-BFu9lD-3.js +1 -0
  83. package/static/app/assets/{circle-pause-CmzC_apg.js → circle-pause-BGMiV8UU.js} +1 -1
  84. package/static/app/assets/{circle-play-D8mW2aQ7.js → circle-play-DoanLHnd.js} +1 -1
  85. package/static/app/assets/{cpu-DZcdd0PZ.js → cpu-DwzNf82m.js} +1 -1
  86. package/static/app/assets/{download-bv1KEPGQ.js → download-Ddw49yCV.js} +1 -1
  87. package/static/app/assets/{folder-open-d-Pip5gr.js → folder-open-Brd6Kvto.js} +1 -1
  88. package/static/app/assets/{hard-drive-D20iavUb.js → hard-drive-Bu-DTJdB.js} +1 -1
  89. package/static/app/assets/index-CGdg_aq9.css +2 -0
  90. package/static/app/assets/{index-Do83hDzJ.js → index-CWKRRsLW.js} +4 -4
  91. package/static/app/assets/input-CEqsxtil.js +1 -0
  92. package/static/app/assets/{link-2-BPJOFlAy.js → link-2-DZ4OA5tJ.js} +1 -1
  93. package/static/app/assets/{permissionCopy-ChdJd493.js → permissionCopy-D9TR0F8b.js} +1 -1
  94. package/static/app/assets/primitives-DORg7Z_7.js +1 -0
  95. package/static/app/assets/search-0NQ21wXe.js +1 -0
  96. package/static/app/assets/{share-2-YNX_NtMU.js → share-2-BC5FirFv.js} +1 -1
  97. package/static/app/assets/{shield-alert-DuQ3zrVL.js → shield-alert-DUbR2W2s.js} +1 -1
  98. package/static/app/assets/textarea-jtQcRSXo.js +1 -0
  99. package/static/app/assets/{useFocusTrap-ZVI98jaW.js → useFocusTrap-HRemcWId.js} +1 -1
  100. package/static/app/assets/{useMutation-CVC4qv_D.js → useMutation-DqlFE-Bw.js} +1 -1
  101. package/static/app/assets/{useQuery-C7BeG4HU.js → useQuery-BizqBNGw.js} +1 -1
  102. package/static/app/assets/utils-WgW4V69R.js +4 -0
  103. package/static/app/assets/workspace-DSek3jCY.js +1 -0
  104. package/static/app/index.html +4 -4
  105. package/static/sw.js +1 -1
  106. package/lattice_brain/ingestion/pipeline.py +0 -108
  107. package/latticeai/api/local_files.py +0 -44
  108. package/latticeai/api/tools.py +0 -126
  109. package/latticeai/api/voice_capture.py +0 -32
  110. package/latticeai/core/agent_permission.py +0 -85
  111. package/scripts/agent_eval.py +0 -34
  112. package/scripts/brain_quality_eval.py +0 -37
  113. package/scripts/check_legacy_debt.mjs +0 -91
  114. package/scripts/check_python.py +0 -100
  115. package/scripts/chunking_parity_corpus.py +0 -449
  116. package/scripts/generate_agent_parity_fixtures.py +0 -771
  117. package/scripts/generate_chunking_parity_fixtures.py +0 -259
  118. package/static/app/assets/AdminConsole-Bw1ATQL0.js +0 -1
  119. package/static/app/assets/BrainHome-CFBkt1K_.js +0 -2
  120. package/static/app/assets/BrainSignals-ReLWF2H8.js +0 -1
  121. package/static/app/assets/Capture-BsTokYkk.js +0 -1
  122. package/static/app/assets/Chronicle-B6f0T9id.js +0 -1
  123. package/static/app/assets/CommandPalette-CuvjTv1u.js +0 -1
  124. package/static/app/assets/Library-BGJbG9Hd.js +0 -1
  125. package/static/app/assets/LivingBrain-DGYK_Jsa.js +0 -1
  126. package/static/app/assets/System-CMHSO9qM.js +0 -1
  127. package/static/app/assets/arrow-left-BfmkskWx.js +0 -1
  128. package/static/app/assets/brain-CQJberbE.js +0 -1
  129. package/static/app/assets/circle-check-DruOxB-4.js +0 -1
  130. package/static/app/assets/index-D9x-kSNy.css +0 -2
  131. package/static/app/assets/input-BLXVNmj1.js +0 -1
  132. package/static/app/assets/primitives-Cv5tbZBY.js +0 -1
  133. package/static/app/assets/search-CT9aho2j.js +0 -1
  134. package/static/app/assets/textarea-DqwLnli4.js +0 -1
  135. package/static/app/assets/utils-CiFtIdZq.js +0 -4
  136. package/static/app/assets/workspace-DQz9vIId.js +0 -1
package/README.md CHANGED
@@ -11,23 +11,24 @@
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
- ![v11.7.0 Living Brain walkthrough](output/release/v11.7.0/gifs/v11.7.0-living-brain-walkthrough.gif)
14
+ ![v11.9.0 Living Brain walkthrough](output/release/v11.9.0/gifs/v11.9.0-living-brain-walkthrough.gif)
15
15
 
16
16
  Chat, files, folders, notes, and web pages all flow into one durable knowledge
17
- graph on your computer. Any model — local MLX or cloud — can speak with that
18
- memory. Nothing leaves your machine without explicit consent.
17
+ graph on your computer. The default is local. Cloud is optional — an
18
+ OAuth-authenticated CLI (`agy` / `grok`) or an API key you configure — and
19
+ nothing leaves your machine without explicit consent.
19
20
 
20
- 대화·파일·폴더·웹페이지가 전부 내 컴퓨터 안의 지식 그래프로 쌓이고, 어떤
21
- 모델이든 그 기억을 이어받아 대화합니다.
21
+ 대화·파일·폴더·웹페이지가 전부 내 컴퓨터 안의 지식 그래프로 쌓입니다.
22
+ 기본은 로컬이고, 클라우드는 선택입니다 (OAuth CLI 지원).
22
23
 
23
24
  ## What You Can Do
24
25
 
25
26
  | | |
26
27
  | --- | --- |
27
- | **See your Brain's story in time** — a growth curve, an activity heatmap, and each day's story, rewindable to any past moment ![Brain Chronicle](output/release/v11.7.0/screenshots/13-chronicle.png) | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v11.7.0/screenshots/04-brain-chat-home.png) |
28
- | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v11.7.0/screenshots/05-memory-graph.png) | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v11.7.0/screenshots/06-capture.png) |
29
- | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v11.7.0/screenshots/12-review-center.png) | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v11.7.0/screenshots/02-recommended-models.png) |
30
- | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v11.7.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/v11.7.0/screenshots/08-system.png) |
28
+ | **See your Brain's story in time** — a growth curve, an activity heatmap, and each day's story, rewindable to any past moment ![Brain Chronicle](output/release/v11.9.0/screenshots/13-chronicle.png) | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v11.9.0/screenshots/04-brain-chat-home.png) |
29
+ | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v11.9.0/screenshots/05-memory-graph.png) | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v11.9.0/screenshots/06-capture.png) |
30
+ | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v11.9.0/screenshots/12-review-center.png) | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v11.9.0/screenshots/02-recommended-models.png) |
31
+ | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v11.9.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/v11.9.0/screenshots/08-system.png) |
31
32
 
32
33
  ## Why Lattice AI
33
34
 
@@ -58,67 +59,49 @@ First-run flow — wake the Brain, pick the owner, load a recommended model:
58
59
 
59
60
  | | | |
60
61
  | --- | --- | --- |
61
- | ![Login](output/release/v11.7.0/screenshots/01-login.png) | ![Model install](output/release/v11.7.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v11.7.0/screenshots/07-model-library.png) |
62
+ | ![Login](output/release/v11.9.0/screenshots/01-login.png) | ![Model install](output/release/v11.9.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v11.9.0/screenshots/07-model-library.png) |
62
63
 
63
64
  Screenshot index and capture notes:
64
- [output/release/v11.7.0/SCREENSHOT_INDEX.md](output/release/v11.7.0/SCREENSHOT_INDEX.md)
65
+ [output/release/v11.9.0/SCREENSHOT_INDEX.md](output/release/v11.9.0/SCREENSHOT_INDEX.md)
65
66
 
66
67
  ## Current Release
67
68
 
68
- The current release is **11.7.0 — Clean Sweep**:
69
+ The current release is **11.9.0 — Working Order**:
69
70
 
70
- 11.6.0 left a disclosed backlog and a visual language that still used
71
- glass. This release closes that backlog, fixes regressions One Door did
72
- not know it had shipped, and restyles every captured surface on an
73
- elevation ladder — ink night, paper day, no glass. The door is unchanged:
71
+ 11.8.0 took weight off the door. This release puts the remaining Current
72
+ stubs and the half-wired lanes in working order. The door is unchanged:
74
73
  `lattice-host` still serves **420 operations across 41 route families**,
75
- and the Python package is still a **28-route AI worker** (LLM, embed,
76
- extract, parse, four renderers, ASR, multimodal, catalog, `sysinfo`,
77
- `/health`). The allowlist still includes `/worker/parse` and
78
- `/worker/render/*`; nothing product-shaped moved back into Python.
79
-
80
- - **The three oracle bugs 11.6.0 ported as-is are fixed.** Command-search
81
- knowledge now reads `matches` and returns nodes. Review snooze accepts
82
- offset-aware datetimes (unparseable `until` → 422). Double-reject is
83
- 409, byte-identical to its dismiss sibling. Fixture bodies that pinned
84
- the old faults were updated and marked as divergences from the oracle.
85
- - **The §5.3 holes are closed.** Binary uploads go through `/worker/parse`.
86
- Per-chunk supplied vectors land at the four ingest doors. User hooks
87
- fire on native tools (`HooksStore` → `HookSink`) and write the same run
88
- log the HTTP route writes. `sanitize_write_content` runs on the loop
89
- path and on `POST /tools/write_file`. Every mutating review route records
90
- `review_item_created` / `review_item_updated`. `workspace_os.json` has
91
- one writer (`WorkspaceOsStore` + registry + ports).
92
- - **Regressions One Door did not know it had.** Self-Model writes were
93
- 100% dead (five routes posted into the retired `/worker/graph/mutate`;
94
- `resolve_contradiction` claimed "applied" while writing nothing) —
95
- restored natively, nine recorded bodies byte-identical. The security
96
- xlsx export 502'd because it posted to a product route; it now uses
97
- `/worker/render/xlsx`. Chat `ingest_generated` was a schema 400 even
98
- against a live 11.5.2 worker. Vault-watch had fixtures and no poller —
99
- it is a real native ingest loop now. A decoy-proven static gate keeps
100
- this class from shipping again.
101
- - **Time bombs defused.** Chronicle `@today`, briefing freshness, and the
102
- insights/garden/proactive/health/quality cutoffs now take a frozen
103
- clock. Falsifier tests fail on the next run if a fuse is re-armed.
104
- - **The UI is one language.** Token-native elevation and gradients replace
105
- backdrop-filter. Cytoscape reads theme tokens (comma-form `hsl()`).
106
- Layout and a11y contracts stay; the first-paint bundle is still ~103 KiB
107
- gzip.
108
-
109
- What this release still carries openly — `open_keys` pending-only, no
110
- extraction refiner, `delete_node` leaving `PART_OF`, review events silent
111
- without an owner, text-only KG-api ingest, two store cycles per review
112
- mutation, raw-English snooze 422 — is listed in
113
- [RELEASE_NOTES_v11.7.0.md](RELEASE_NOTES_v11.7.0.md).
114
-
115
- Expected artifacts for 11.7.0 release must use exact filenames:
116
-
117
- - `dist/ltcai-11.7.0-py3-none-any.whl`
118
- - `dist/ltcai-11.7.0.tar.gz`
119
- - `ltcai-11.7.0.tgz`
120
- - `dist/ltcai-11.7.0.vsix`
121
- - `src-tauri/target/release/bundle/dmg/Lattice AI_11.7.0_aarch64.dmg`
74
+ and the AI worker is still **19 routes** (`/worker/sysinfo` gained
75
+ additive `capabilities` and `python_version`). Cloud is optional; the
76
+ default is local; OAuth CLI (`agy` / `grok`) is supported.
77
+
78
+ - **Thirteen documented-Current stubs now answer.** Model
79
+ recommendations probe RAM and the worker catalog. Setup scan/auto are
80
+ real probes; install is real-or-manual (brew/pip stay manual).
81
+ Computer-use status reads worker capabilities. `/agent/eval` is a
82
+ deterministic skill eval. `/agents/api/run` is a live single-agent
83
+ pass. Automation mines `conversation_messages`. Workflow run is a
84
+ per-step executor; `build`/`deploy_project` run governed scripts.
85
+ - **Hybrid cloud is wired.** ReviewSink and a shape-only egress audit
86
+ are bound in production. Dual credentials: `api_key` (mock-verified
87
+ only) and `cli_oauth` (live OAuth E2E at zero billing). Escalation is
88
+ `auto` / `manual` / `always`; `local_only` on the request always wins.
89
+ - **MCP is a real JSON-RPC server** at `POST /mcp`. Chat file generation
90
+ — the v9.2.0 headline deleted in the 11.6.0 port — is restored. The
91
+ 8GB-tier default (gemma-4-e2b) actually runs.
92
+
93
+ What this release does not close — 2B agent-run quality, the mock-only
94
+ `api_key` path, restore needing a restart, brew/pip staying manual,
95
+ `/mcp` outside the OpenAPI contract, the ad-hoc-signed dmg — is listed
96
+ in [RELEASE_NOTES_v11.9.0.md](RELEASE_NOTES_v11.9.0.md).
97
+
98
+ Expected artifacts for 11.9.0 release must use exact filenames:
99
+
100
+ - `dist/ltcai-11.9.0-py3-none-any.whl`
101
+ - `dist/ltcai-11.9.0.tar.gz`
102
+ - `ltcai-11.9.0.tgz`
103
+ - `dist/ltcai-11.9.0.vsix`
104
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_11.9.0_aarch64.dmg`
122
105
 
123
106
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
124
107
 
@@ -131,21 +114,24 @@ every product route, owns every write to the Brain, and supervises a Python
131
114
  **AI worker** it reaches over loopback for the things a model does — inference,
132
115
  embedding, extraction, parsing, rendering, speech-to-text. The React/Vite
133
116
  frontend and the Tauri desktop shell sit on top of that one door. Local-first
134
- by default — cloud model calls, downloads, Brain Network, and update checks are
135
- opt-in.
117
+ by default — cloud is optional (OAuth CLI or an API key you configure),
118
+ and downloads, Brain Network, and update checks are opt-in.
136
119
 
137
120
  See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
138
121
  [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for the developer workflow
139
- (`npm install && npm run dev`, validation via `npm run lint`,
140
- `npm run test:unit`, `npm run test:visual`).
122
+ (`npm start` / `bin/ltcai.js` is the product; `npm run dev` is the
123
+ 19-route worker). Validation via `npm run lint`, `npm run test:unit`,
124
+ `npm run test:visual`.
141
125
 
142
126
  ## Known Limitations
143
127
 
144
128
  - External package registries are owner-published and can lag behind GitHub.
145
129
  - SQLite is the live local Brain store. The optional PostgreSQL/pgvector
146
- migration tooling is not part of the 11.6.0 worker.
130
+ migration tooling is not part of the 11.9.0 worker.
147
131
  - Docker, model downloads, cloud model calls, Brain Network, and update checks
148
- require explicit user action.
132
+ require explicit user action. Cloud is optional: `cli_oauth` (`agy` /
133
+ `grok`) was live-checked at zero billing; the `api_key` path is
134
+ mock-verified only.
149
135
  - **The Telegram bridge was removed in 11.6.0** — it lived in the platform code
150
136
  that became the AI worker. **SSO/OIDC login and callback flows were removed
151
137
  with it**; the configuration surface remains and password login is native.
@@ -157,11 +143,26 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
157
143
  required dependency as of 11.6.0 (it used to be an undeclared lazy import
158
144
  that raised a 500; `ltcai[pdf]` remains as an empty alias for older
159
145
  install instructions).
146
+ - The multimodal image and video analysis functions have no HTTP door as of
147
+ 11.8.0: their only route wrapped a native image ingest that was never
148
+ built. The observation code stays in Brain Core under unit test, and its
149
+ module header says so.
150
+ - The Python coverage gate is a **line floor of 90** since 11.8.0 (the
151
+ 100%-lines-and-branches gate was removed). 11.9.0 measures 99.97%; the
152
+ enforced floor is the smaller claim.
153
+ - **2B agent-run quality is gated honestly.** gemma-4-e2b writes the
154
+ requested file and can still fail the critic on the summary.
155
+ - Restore in a long-lived process may serve pre-restore bytes until
156
+ connections recycle — restart after restore. brew/pip setup items stay
157
+ manual. `/mcp` is a real JSON-RPC server and is outside the OpenAPI
158
+ contract by design.
159
+ - The macOS dmg is ad-hoc signed — effectively unsigned — so first launch
160
+ needs the usual Gatekeeper step.
160
161
  - Pointer-control tools still execute in the worker. Remaining honest gaps
161
162
  (`open_keys` pending-only, no Self-Model refiner, `PART_OF` left on
162
163
  delete, review events silent without an owner, KG-api ingest text-only,
163
164
  two store cycles per review mutation) are listed with their reasons in
164
- [RELEASE_NOTES_v11.7.0.md](RELEASE_NOTES_v11.7.0.md).
165
+ [RELEASE_NOTES_v11.9.0.md](RELEASE_NOTES_v11.9.0.md).
165
166
 
166
167
  ## Release History
167
168
 
@@ -172,6 +173,8 @@ same boundary. Earlier notes stay in the tree as `RELEASE_NOTES_v*.md` files.
172
173
 
173
174
  | Version | Theme |
174
175
  | --- | --- |
176
+ | 11.9.0 | Working Order |
177
+ | 11.8.0 | Travel Light |
175
178
  | 11.7.0 | Clean Sweep |
176
179
  | 11.6.0 | One Door |
177
180
  | 11.5.2 | Tight Ship |
@@ -1,8 +1,15 @@
1
1
  # Model Robustness Benchmarks
2
2
 
3
3
  > Status: reference 2026-07-21
4
-
5
- Methodology and results for `scripts/bench_models.py`, a harness that measures
4
+ >
5
+ > **Dated snapshot.** The harness this page documents no longer exists in the
6
+ > tree: `scripts/bench_models.py` went with the Python agent loop when 11.5.1
7
+ > ported it to Rust, and `latticeai.core.agent_eval` / `scripts/agent_eval.py`
8
+ > followed (the last of them deleted in 11.8.0). The methodology and the
9
+ > honesty notes below are kept as the record of how these numbers were produced
10
+ > and what they did and did not mean — not as instructions you can run today.
11
+
12
+ Methodology and results for `scripts/bench_models.py`, a harness that measured
6
13
  how well the agent loop turns model output into executable actions across model
7
14
  quality tiers. Companion to [CI & Release Gates](CI_AND_RELEASE_GATES.md).
8
15
 
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,163 @@ 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
+ ## [11.9.0] - 2026-08-17 — Working Order
8
+
9
+ ### Added
10
+ - 이중 클라우드 자격증명: `<data_dir>/cloud_provider.json` →
11
+ `LATTICEAI_CLOUD_API_KEY` → CLI 자동감지(`agy` / `grok`). `api_key`는
12
+ OpenAI 호환 어댑터(모의 서버만 검증, 실과금 없음). `cli_oauth`는 로컬
13
+ OAuth CLI(`agy` → gemini-3.7-flash, `grok` → grok-4.6). 중립 temp cwd,
14
+ 120초 타임아웃.
15
+ - `GET /api/cloud/status` — `{configured, mode, provider, model, detail}`.
16
+ - 하이브리드 에스컬레이션 `always` / `auto`(기본) / `manual`
17
+ (`hybrid_policy.json`). `auto`는 로컬 모델 없음 / 로컬 컨텍스트가 얇음
18
+ / 명시적 `/cloud `·`클라우드:` 접두사일 때만. 요청
19
+ `network_mode:"local_only"`가 항상 이김.
20
+ - 호스트가 Review Center + egress 감사 싱크를 바인딩. 클라우드 턴이
21
+ `kg_cloud_expansion` 제안을 올리고 형태만 있는 egress 레코드를 남김
22
+ (provider / model / reason, 내용 없음).
23
+ - `POST /mcp` streamable-HTTP JSON-RPC 실서버(`initialize` /
24
+ `tools/list` / `tools/call`). 큐레이트된 안전 도구 + 스키마가 파싱된
25
+ 스킬 7개. `/mcp/call`이 실제로 디스패치. `/mcp/install`은 정직
26
+ (스킬/플러그인 활성화, 원격은 수동).
27
+ - SPA 클라우드 투명성: ☁️ 클라우드 답변 칩, 컴포저 경계 힌트, 「이번
28
+ 대화는 로컬만」 토글, System 패널 provider 상태 행.
29
+ - 채팅 파일 생성 복원(v9.2.0 헤드라인, 11.6.0 포트에서 삭제됨). 확장자별
30
+ 앵커 프롬프트, judge + 1회 교정, 정직한 sanitize 배지, 프로젝트는
31
+ 최대 3파일 순차, 워커 렌더 시임의 실제 docx/pdf.
32
+ - `/worker/sysinfo`에 `capabilities`(pointer_tools)와 `python_version`
33
+ (가산, 라우트 수는 19 유지).
34
+ - 통합 로컬 승인 토큰(`LocalApprovals`) — `/permissions/approve`에서
35
+ 상환.
36
+
37
+ ### Changed
38
+ - 문서에만 있던 13개 Current 스텁이 실동작: `/models/recommendations`,
39
+ `/setup/scan`+`auto`, `/setup/install`, computer-use 상태,
40
+ `/agent/eval`, `/agents/api/run`, 자동화 패턴/제안, 워크플로 run·
41
+ resume, 리뷰 `run_now`, `build`/`deploy_project`, 백업 blob.
42
+ - 클라우드 모델은 provider 설정에서 오고, 로컬 MLX id를 쓰지 않음.
43
+ 로컬 모델이 없어도 클라우드 턴이 가능.
44
+ - 하이브리드 토큰 프레임은 도착하는 대로 스트림. `stream: false`는
45
+ JSON.
46
+ - 채팅 쓰기의 스코프가 비면 `workspace_id = personal`. null workspace
47
+ 읽기는 personal 가시성.
48
+ - 2B(gemma-4-e2b-it-4bit) compact 프로파일: 태그 스트립·balanced·
49
+ truncated_close·labeled·fence_rescue 파서, v10.8.0 salvage 삼종
50
+ 복원, COMPACT 컨텍스트 <2k, EXECUTE 온도 고정(compact 0.1 /
51
+ standard 0.2). MLX가 temperature + stop string을 존중.
52
+ - 백업 = `VACUUM INTO` 스냅샷 + blob + 정직한 매니페스트 + 원자적 복원.
53
+ export가 edges/chunks를 실음.
54
+ - `POST /agent`가 네이티브 루프에 닿고 제품 정책 표를 실음.
55
+
56
+ ### Fixed
57
+ - 라이브 감사 N1–N9: 에이전트 루프 호스트 바인딩, 빈 Brain 메모리
58
+ API 500(`conversation_messages` 부트스트랩), chat/memory/chronicle/
59
+ command가 지식을 봄, brain health의 빈 100점, 백업/복원 정직성,
60
+ export의 없는 컬럼 조회, 폴더 ingest 승인, 보이스 메모 텍스트 저장.
61
+ - 워크플로 resume 승인 게이트. `write_file`이 비어 있는 content를
62
+ 교정 에러로 거절. critic 판정 복구(verdict-shape + 보수적 토큰,
63
+ fail-closed 유지).
64
+ - 이전에 고장 나 있던 22항목을 신선한 Brain·실모델로 재검증.
65
+
66
+ ### Known issues
67
+ - 2B 에이전트 루프의 *내용 품질*은 정직하게 게이트된다. gemma-4-e2b는
68
+ 요청한 파일을 기계적으로 쓰지만(마감 테이프 5/5) 요약이 critic에서
69
+ 떨어져 FAILED/NEEDS_REVIEW로 끝날 수 있다. 퍼널은 에이전트 런에 더
70
+ 큰 모델을 권한다.
71
+ - `api_key` 클라우드 경로는 모의 서버만 검증했다. 계약 테스트는 있고
72
+ 실호출은 없다(과금 예산 없음).
73
+ - 오래 떠 있는 프로세스에서 복원하면 커넥션이 재활용되기 전까지
74
+ 복원 전 바이트를 줄 수 있다 — 재시작이 필요하다.
75
+ - brew/pip 셋업 항목은 설계상 수동이다.
76
+ - `/mcp`는 설계상 OpenAPI 제품 계약 밖이다.
77
+ - DMG는 ad-hoc 서명(미서명)이다.
78
+ - 11.8.0이 열어 둔 항목(커버리지 바닥 라인 90, 멀티모달 이미지/비디오
79
+ HTTP 문 없음, 11.7.0 leftover)은 그대로다. 전문은
80
+ [RELEASE_NOTES_v11.9.0.md](../RELEASE_NOTES_v11.9.0.md).
81
+
82
+ ## [11.8.0] - 2026-08-16 — Travel Light
83
+
84
+ ### Added
85
+ - 골든 드리프트 가드: 축소된 agent 대표행 세트가 커널의 새 판정 클래스를
86
+ 덮지 않으면 실패. 축소가 조용한 커버리지 손실이 되지 않게 하는 장치.
87
+ - 삭제된 아홉 워커 라우트에 대한 네거티브 테스트 — 게이트웨이가 더 이상
88
+ 전달하지 않음을 Rust KEEP 표와 allowlist 양쪽에서 고정.
89
+ - `rust/fixtures/chunking/FROZEN.md`. 이제 모든 픽스처 계열이 FROZEN.md를
90
+ 가짐.
91
+ - `PhaseBudgets` 토큰 상한(MIN 128 / MAX 8192). 이전에는 하한만 있었음.
92
+ - 모든 GitHub Actions 워크플로에 `concurrency` 그룹과 `timeout-minutes`.
93
+ - Brain Chat Home 재설계: 히어로 컴포저, 3배 커진 LivingBrain(1440에서
94
+ 60px → 179px)과 금빛/옥빛 성장 링, 준비도에 묶인 '기억이 자라고 있어요'
95
+ 캡션, 풀캔버스 그리드, 바닥 연속성 바(지난 대화·현황·기억 지도·기능),
96
+ `prefers-reduced-motion` 폴백.
97
+
98
+ ### Changed
99
+ - 워커 표면 **28 → 19 라우트**. `rust/fixtures/worker_allowlist.json`도 19.
100
+ - 로컬 lint 체인 **13 → 10 게이트**. 순서와 남은 열 개는 그대로.
101
+ - Python 커버리지 게이트가 `fail_under = 100`(문+분기) → **라인 90**.
102
+ 분기 측정은 꺼짐. 실측은 이번 릴리스에서도 100%.
103
+ - `ci.yml` 중복 스텝 제거 — 4레그 매트릭스는 유지하되 OpenAPI ·
104
+ product-readiness · 확장 테스트는 3.11+ubuntu 레그에서만, 커버리지 레그는
105
+ `pytest tests/`를 두 번 돌리지 않음. `release.yml`은 릴리스 스텝만.
106
+ dependency-audit은 cron 전용, visual은 push+nightly(PR 제외),
107
+ e2e-sidecar는 nightly 전용.
108
+ - Rust: `lattice-{platform,retrieval,ingest,jobs}`의 약 191개 파일 blanket
109
+ `#![allow]` 헤더 제거, 약 650건의 clippy/rustc 진단을 원인에서 수정.
110
+ 워크스페이스 수준 허용 0건 추가, 남긴 억제는 이유가 붙은 지역
111
+ `#[allow(clippy::too_many_arguments)]` 8개.
112
+ - 통합 테스트 파일(= 링크되는 테스트 바이너리) **98 → 56**
113
+ (lattice-platform 43 → 11). 테스트 함수 삭제 없이 주제별 통합.
114
+ - `ROLE_CAPABILITIES`가 `lattice-auth` 단일 출처. `lattice-agent`가 의존.
115
+ - agent 골든 `decisions__strict` · `calls`가 702 → **171 대표행**
116
+ (등가류당 한 행).
117
+ - product-readiness 증거를 Rust 픽스처로 재지정. 판정은 COMPLETE 10/10.
118
+
119
+ ### Fixed
120
+ - `SessionStore`가 조회 미스 시 `sessions.json`을 다시 읽음. v11.6.0부터
121
+ writer는 `lattice-auth`인데 워커는 `__init__`에서 한 번만 읽어, **워커
122
+ 기동 이후의 로그인이 워커에게 보이지 않았음** —
123
+ `trusted_local_owner`에서는 조용히, `LATTICEAI_REQUIRE_AUTH=true`에서는
124
+ 파일 안에 있는 토큰에 대해 401. `mtime_ns`/`size` 가드 + 1초 throttle을
125
+ 같은 락 아래에서 적용해 추측 버스트가 읽기 버스트가 되지 않게 함.
126
+ 테스트 9개 추가.
127
+
128
+ ### Removed
129
+ - 호출자 0인 워커 라우트 아홉 개: `GET /api/embeddings/providers`,
130
+ `POST /tools/read_document`, `GET /tools/pdf_pages`,
131
+ `POST /worker/multimodal/describe`, `GET /api/ingestion/multimodal`,
132
+ `POST /models/switch/{model_id}`, `DELETE /models/unload-all`,
133
+ `POST /engines/pull-model`, `GET /api/capture/voice/status`. 파일로는
134
+ `latticeai/api/{tools,local_files,voice_capture}.py`와
135
+ `lattice_brain/ingestion/pipeline.py`. `pypdfium2` 의존성도 함께.
136
+ - `latticeai/core/agent_permission.py`; 죽은 보안 헬퍼(`hash_password` /
137
+ `verify_password`, `check_ip_rate_limit`, `configure_trusted_proxies`,
138
+ `client_ip`, `bytes_match_extension`); `_kg_common/text.py`의 죽은 청커와
139
+ 호출자 0 함수 9개; 렌더 시임의 `_safe_filename` 이중 살균.
140
+ - 얼어붙은 픽스처의 생성기 2종(`generate_agent_parity_fixtures.py`,
141
+ `generate_chunking_parity_fixtures.py`),
142
+ `scripts/{brain_quality_eval,agent_eval,check_python,bench_agent_smoke}.py`,
143
+ `scripts/check_legacy_debt.mjs`(드리프트한 거울 — 파이썬 테스트가 권위).
144
+ - `.github/workflows/agent-smoke.yml` — 모델 없는 러너에서 이중 fail-open.
145
+ - Rust 죽은 코드: `workspace_scope` 모듈, `WORKSPACE_OS_VERSION` 상수,
146
+ 호출자 0 항목 16개.
147
+ - agent 골든 `decisions__trusted` · `decisions__bypass` 그리드(각 702행) —
148
+ 모든 판정 클래스를 덮는 이름 붙은 단위 테스트로 대체.
149
+ - 죽은 프론트 컴포넌트 `FeedbackState.tsx`, `DepthEmergence.tsx`.
150
+
151
+ ### Known issues
152
+ - 커버리지 **강제 바닥이 100 → 90(라인)** 으로 내려갔고 분기 게이트가
153
+ 없어졌습니다. 실측은 100%지만 게이트가 지키는 것은 바닥입니다.
154
+ - `lattice_brain` 멀티모달의 이미지/비디오 절반에 HTTP 문이 없습니다
155
+ (관찰 함수는 Brain Core에 남아 단위 테스트를 받고, 모듈 헤더에 명시).
156
+ - DMG는 ad-hoc 서명(미서명)입니다.
157
+ - 삭제된 라우트의 메시지 카탈로그 키는 얼어붙은 패리티 픽스처에 의도적으로
158
+ 남습니다 — 픽스처는 녹화 당시의 표면을 고정하는 기록입니다.
159
+ - `tests/visual/mock_server`가 고아 mock 라우트 하나를 아직 서빙합니다
160
+ (현재 증거가 해시로 묶여 있어 다음 캡처 사이클에 정리).
161
+ - 11.7.0이 열어 둔 항목은 그대로입니다. 전문은
162
+ [RELEASE_NOTES_v11.8.0.md](../RELEASE_NOTES_v11.8.0.md).
163
+
7
164
  ## [11.7.0] - 2026-08-15 — Clean Sweep
8
165
 
9
166
  ### Added
@@ -1,6 +1,6 @@
1
1
  # CI & Release Gates
2
2
 
3
- > Status: reference 2026-07-21
3
+ > Status: reference 2026-08-16
4
4
 
5
5
  Reference for the GitHub Actions workflows that guard `main` and releases, the
6
6
  supply-chain hardening applied to them, and the recommended branch-protection
@@ -11,13 +11,79 @@ configuration. Companion to [SECURITY_AUDIT.md](SECURITY_AUDIT.md) and
11
11
 
12
12
  | Workflow | File | Triggers | Purpose |
13
13
  |----------|------|----------|---------|
14
- | CI | `.github/workflows/ci.yml` | push/PR to `main` | Lint, typecheck, unit + integration tests, brain/agent eval gates, build + wheel smoke |
15
- | Release | `.github/workflows/release.yml` | tags `v*` / `[0-9]*` | Build & validate all artifacts (no publish) |
16
- | Visual Smoke | `.github/workflows/visual.yml` | push/PR, nightly cron, dispatch | Playwright visual smoke |
17
- | **Dependency Audit** | `.github/workflows/dependency-audit.yml` | push/PR, weekly cron, dispatch | pip-audit + npm audit + CycloneDX SBOMs |
18
- | **Postgres Integration** | `.github/workflows/postgres-integration.yml` | weekly cron, dispatch | Live SQLite→Postgres/pgvector migration test |
14
+ | CI | `.github/workflows/ci.yml` | push/PR to `main` | Lint, typecheck, unit + coverage + integration tests, product-readiness, build + wheel smoke, Rust workspace |
15
+ | Release | `.github/workflows/release.yml` | tags `v*` / `[0-9]*` | Build & validate artifacts (no publish; does not re-run CI lint/tests) |
16
+ | Visual Smoke | `.github/workflows/visual.yml` | push to `main`, nightly cron, dispatch | Playwright visual smoke (not on PRs) |
17
+ | Sidecar E2E | `.github/workflows/e2e-sidecar.yml` | nightly cron, dispatch | Live sidecar Playwright first-value loop |
18
+ | Dependency Audit | `.github/workflows/dependency-audit.yml` | weekly cron, dispatch | pip-audit + npm audit + CycloneDX SBOMs |
19
+ | Postgres Integration | `.github/workflows/postgres-integration.yml` | weekly cron, dispatch | Live SQLite→Postgres/pgvector migration test |
19
20
 
20
- The last two were added for the P2 deployment-trust / supply-chain workstream.
21
+ There is no `agent-smoke.yml`. Hosted runners have no MLX models; a fail-open
22
+ weekly smoke cannot report anything actionable.
23
+
24
+ Every workflow sets `concurrency.group` to `<workflow-file-stem>-${{ github.ref }}`
25
+ and cancels in-progress runs except on `main` (`cancel-in-progress: false` on
26
+ `release.yml`, which runs on tags). Job timeouts: test 40, integration 25,
27
+ build 20, rust 40, visual 15, sidecar 20, audit 15, release build 40,
28
+ postgres 20.
29
+
30
+ ## CI matrix (`ci.yml`)
31
+
32
+ Four legs. Job names are `Test (Python <ver> on <os>)`:
33
+
34
+ | Leg | OpenAPI generate + upload | Full lint + typecheck + docs | Extension tests | Vitest | `pytest tests/unit/` | Coverage pytest (`tests/` + `--cov`) | Product readiness |
35
+ |-----|---------------------------|------------------------------|-----------------|--------|----------------------|--------------------------------------|-------------------|
36
+ | 3.11 + ubuntu-latest | yes | yes (`npm run lint`, `typecheck`, `docs:check-current`, `docs:check-links`) | yes (`test:browser-extension` && `test:vscode-extension`) | yes | yes | no | yes |
37
+ | 3.12 + ubuntu-latest | no | Python only (`lint:python`) | no | yes | yes | no | no |
38
+ | 3.14 + ubuntu-latest | no | Python only | no | yes | **no** (coverage invocation is the only pytest) | yes, line floor ≥90 | no |
39
+ | 3.11 + macos-latest | no | Python only | no | yes | yes | no | no |
40
+
41
+ Downstream jobs (after `test`): `Integration smoke test` (25 min), then
42
+ `Build package` (20 min). `Rust workspace` is independent (40 min).
43
+
44
+ Removed from CI **and deleted from the tree** in 11.8.0 — a script that is not
45
+ a gate is a script that looks like one:
46
+
47
+ - `scripts/check_python.py` — ruff parses every file on every test leg
48
+ - `scripts/brain_quality_eval.py`
49
+ - `scripts/agent_eval.py`
50
+ - `scripts/bench_agent_smoke.py`
51
+
52
+ ## Local lint chain (`npm run lint`)
53
+
54
+ Ten members, in order:
55
+
56
+ 1. `lint:python` (ruff + mypy)
57
+ 2. `lint:visual`
58
+ 3. `lint:frontend`
59
+ 4. `frontend:openapi:check`
60
+ 5. `scripts/check_i18n_literals.mjs`
61
+ 6. `check:i18n-namespaces`
62
+ 7. `check:bundle`
63
+ 8. `check:server-i18n`
64
+ 9. `scripts/check_release_evidence_bound.mjs`
65
+ 10. `check:max-file-lines`
66
+
67
+ Not in the lint chain (CI calls the extension tests directly on the 3.11+ubuntu
68
+ leg; the Python legacy-shim test is authoritative):
69
+
70
+ - `test:browser-extension` / `test:vscode-extension` (script entries remain)
71
+ - `check:legacy-debt` (script entry and `scripts/check_legacy_debt.mjs` both
72
+ removed — the mjs mirror had drifted from the Python test)
73
+ - `check:python` (script entry and `scripts/check_python.py` both removed)
74
+
75
+ `npm run typecheck` is frontend-only (`typecheck:frontend`). The VS Code
76
+ extension is built by `test:vscode-extension` in CI and by `build_vsix.mjs`
77
+ at release.
78
+
79
+ ## Coverage floor
80
+
81
+ Python: `[tool.coverage.report] fail_under = 90` (line coverage). Branch
82
+ measurement is off (`branch` is not set under `[tool.coverage.run]`). The
83
+ coverage step runs only on 3.14 + ubuntu-latest.
84
+
85
+ Frontend: `vitest.config.ts` still pins 100% thresholds on all four metrics;
86
+ that is unchanged and still runs on every CI test leg.
21
87
 
22
88
  ## Supply-chain hardening: pinned actions
23
89
 
@@ -36,30 +102,22 @@ from the authoritative upstream refs via `git ls-remote --tags` on 2026-07-21.
36
102
  | actions/upload-artifact | v4.6.2 | `ea165f8d65b6e75b540449e92b4886f43607fa02` |
37
103
 
38
104
  Pinning coverage: **100% of current `uses:` entries** across `ci.yml`,
39
- `release.yml`, `visual.yml`, `dependency-audit.yml`, and
40
- `postgres-integration.yml`. All are first-party `actions/*`. If a third-party
41
- action is added later, resolve and pin its SHA the same way before merge.
105
+ `release.yml`, `visual.yml`, `e2e-sidecar.yml`, `dependency-audit.yml`, and
106
+ `postgres-integration.yml`. First-party `actions/*` plus pinned
107
+ `Swatinem/rust-cache` and `dtolnay/rust-toolchain` on the Rust/integration
108
+ legs. If a third-party action is added later, resolve and pin its SHA the same
109
+ way before merge.
42
110
 
43
- ## Dependency-audit gate posture (conservative)
111
+ ## Dependency-audit gate posture
44
112
 
45
- The audit workflow is intentionally **non-blocking on day-to-day PRs** and
46
- **strict on the scheduled/dispatch run**:
47
-
48
- - `push` / `pull_request`: `pip-audit` and `npm audit` run with
49
- `continue-on-error` keyed on the event name, so a newly-disclosed CVE in a
50
- transitive dependency never reddens an unrelated PR. Findings still appear in
51
- the job summary and uploaded report artifacts.
52
- - `schedule` (weekly) / `workflow_dispatch`: the same steps run **strict** —
53
- `pip-audit --strict` fails on any known vuln; `npm audit --audit-level=high`
54
- fails on high/critical. This is the loud channel for triage.
113
+ The audit workflow is **schedule + dispatch only** (not on push/PR). Both
114
+ `pip-audit --strict` and `npm audit --audit-level=high` fail the job on
115
+ findings. This is the loud channel for triage; a newly-disclosed CVE cannot
116
+ redden an unrelated change.
55
117
 
56
118
  CycloneDX SBOMs (`sbom-python.json`, `sbom-npm.json`) are produced every run and
57
119
  uploaded as artifacts. Regenerate locally with `scripts/generate_sbom.py`.
58
120
 
59
- **To promote to a required blocking PR check:** remove the `continue-on-error`
60
- expressions in `dependency-audit.yml` and add `python-audit` / `npm-audit` to
61
- the required-checks list below.
62
-
63
121
  ## Postgres integration gate
64
122
 
65
123
  `postgres-integration.yml` runs the migration-integrity suite
@@ -70,31 +128,58 @@ the workflow sets that variable, and the test itself starts and tears down a
70
128
  GitHub-hosted `ubuntu-latest`). It is deliberately kept off the PR path (slow,
71
129
  image pull, needs Docker) and runs weekly + on demand.
72
130
 
131
+ ## Visual smoke and sidecar E2E
132
+
133
+ This repository typically commits straight to `main`.
134
+
135
+ - `visual.yml` runs on push to `main`, the nightly cron, and dispatch. It does
136
+ **not** run on pull requests.
137
+ - `e2e-sidecar.yml` is nightly + dispatch only (no push, no PR).
138
+
73
139
  ## Recommended branch protection for `main`
74
140
 
75
- Required status checks (blocking):
141
+ Required status checks (blocking). Names match the job `name:` fields:
142
+
143
+ - `Test (Python 3.11 on ubuntu-latest)`
144
+ - `Test (Python 3.12 on ubuntu-latest)`
145
+ - `Test (Python 3.14 on ubuntu-latest)`
146
+ - `Test (Python 3.11 on macos-latest)`
147
+ - `Integration smoke test`
148
+ - `Build package`
149
+ - `Rust workspace`
76
150
 
77
- - `CI / Test (Python 3.11)`
78
- - `CI / Test (Python 3.12)`
79
- - `CI / Integration smoke test`
80
- - `CI / Build package`
81
- - `Visual Smoke / Playwright visual smoke`
151
+ `Playwright visual smoke` is **not** a PR-blocking check: `visual.yml` no
152
+ longer has a `pull_request` trigger. It still runs on every push to `main`.
82
153
 
83
- Advisory / non-blocking today (promote when the team is ready):
154
+ Advisory / non-blocking (schedule + dispatch only):
84
155
 
85
- - `Dependency Audit / Python dependency audit (pip-audit)`
86
- - `Dependency Audit / npm dependency audit`
156
+ - `Python dependency audit (pip-audit)`
157
+ - `npm dependency audit`
87
158
 
88
- Additional recommended settings: require PRs before merge, require branches to
89
- be up to date, require linear history, and dismiss stale approvals on new
90
- commits.
159
+ Additional recommended settings if pull requests are used: require PRs before
160
+ merge, require branches to be up to date, require linear history, and dismiss
161
+ stale approvals on new commits.
91
162
 
92
163
  ## Release gate (publication safety)
93
164
 
94
- `release.yml` builds and validates artifacts only — it never publishes. Package
95
- publication (PyPI / npm / VS Code Marketplace / Open VSX) is a manual step
96
- (`npm run publish:*`) using **exact version filenames**, never a `dist/*` glob,
97
- so pushing a tag can never publish by accident. See
165
+ `release.yml` builds and validates artifacts only — it never publishes. A tag
166
+ is only pushed on a commit that already passed CI, so the workflow does **not**
167
+ re-run `npm run lint`, `npm run typecheck`, `docs:check-links`, frontend tests,
168
+ or `pytest tests/unit/`.
169
+
170
+ It still runs:
171
+
172
+ - checkout / setup / installs
173
+ - `npm run docs:check-current` (release-specific current-version docs gate)
174
+ - `npm run build:assets`
175
+ - `python scripts/product_readiness.py` (safety net)
176
+ - `python -m build`, `wheel_smoke.py`, `twine check`
177
+ - `npm pack`, vsce package
178
+ - `validate_release_artifacts.py <v> --require-vsix --require-tgz`
179
+
180
+ Package publication (PyPI / npm / VS Code Marketplace / Open VSX) is a manual
181
+ step (`npm run publish:*`) using **exact version filenames**, never a `dist/*`
182
+ glob, so pushing a tag can never publish by accident. See
98
183
  [../RELEASE.md](../RELEASE.md) for the full procedure.
99
184
 
100
185
  ## Limitations (honest)
@@ -1,6 +1,6 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **11.7.0 — Clean Sweep**.
3
+ Current release: **11.9.0 — Working Order**.
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