ltcai 2.1.0 → 2.2.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.
package/auto_setup.py CHANGED
@@ -443,8 +443,6 @@ class Recommendation:
443
443
  _MODEL_CATALOG: List[Dict[str, Any]] = [
444
444
  # (min_ram_mb, min_vram_mb, model_id, quant, runtime_preference)
445
445
  # OS 오버헤드(~4-6 GB) + KV 캐시 여유를 감안한 보수적 RAM 임계값
446
- {"ram": 128 * 1024, "vram": 48 * 1024,
447
- "id": "mlx-community/gpt-oss-120b-MXFP4-Q4", "q": "mxfp4", "multimodal": False},
448
446
  {"ram": 64 * 1024, "vram": 32 * 1024,
449
447
  "id": "mlx-community/gemma-4-31b-it-4bit", "q": "4bit", "multimodal": True},
450
448
  {"ram": 64 * 1024, "vram": 32 * 1024,
@@ -452,9 +450,13 @@ _MODEL_CATALOG: List[Dict[str, Any]] = [
452
450
  {"ram": 48 * 1024, "vram": 24 * 1024,
453
451
  "id": "mlx-community/gemma-4-31b-it-4bit", "q": "4bit", "multimodal": True},
454
452
  {"ram": 32 * 1024, "vram": 16 * 1024,
455
- "id": "mlx-community/gpt-oss-20b-MXFP4-Q8", "q": "mxfp4", "multimodal": False},
453
+ "id": "mlx-community/gemma-4-26b-a4b-it-4bit", "q": "4bit", "multimodal": True},
456
454
  {"ram": 48 * 1024, "vram": 24 * 1024,
457
455
  "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", "q": "q4_K_M", "multimodal": True},
456
+ {"ram": 24 * 1024, "vram": 12 * 1024,
457
+ "id": "mlx-community/Llama-4-Scout-17B-16E-Instruct-4bit", "q": "4bit", "multimodal": True},
458
+ {"ram": 16 * 1024, "vram": 8 * 1024,
459
+ "id": "mlx-community/gemma-4-12b-it-4bit", "q": "4bit", "multimodal": True},
458
460
  {"ram": 32 * 1024, "vram": 16 * 1024,
459
461
  "id": "Qwen/Qwen3-VL-8B-Instruct", "q": "q5_K_M", "multimodal": True},
460
462
  {"ram": 24 * 1024, "vram": 12 * 1024,
@@ -466,7 +468,7 @@ _MODEL_CATALOG: List[Dict[str, Any]] = [
466
468
  {"ram": 8 * 1024, "vram": 4 * 1024,
467
469
  "id": "Qwen/Qwen3-VL-4B-Instruct", "q": "q4_K_M", "multimodal": True},
468
470
  {"ram": 4 * 1024, "vram": 0,
469
- "id": "google/gemma-3-1b-it", "q": "q4_K_M", "multimodal": False},
471
+ "id": "Qwen/Qwen3-VL-4B-Instruct", "q": "q4_K_M", "multimodal": True},
470
472
  ]
471
473
 
472
474
 
@@ -477,8 +479,8 @@ def recommend(profile: SystemProfile) -> Recommendation:
477
479
  # backend / runtime
478
480
  if profile.os == "darwin" and profile.gpu.vendor == "apple":
479
481
  backend = "metal+mlx"
480
- runtime = "mlx" if _has_module("mlx") else "llama.cpp"
481
- rationale.append("Apple Silicon → Metal + MLX")
482
+ runtime = "mlx" if _has_module("mlx_vlm") else "llama.cpp"
483
+ rationale.append("Apple Silicon → Metal + MLX-VLM")
482
484
  elif profile.gpu.vendor == "nvidia" and profile.cuda_available and (profile.os == "linux" or profile.is_wsl):
483
485
  backend = "cuda"
484
486
  runtime = "vllm" if profile.gpu.vram_mb >= 12 * 1024 else "llama.cpp"
@@ -612,10 +614,10 @@ def plan(profile: SystemProfile, rec: Recommendation) -> InstallPlan:
612
614
  need("node20", "VSCode 확장 / npm CLI 부트스트랩에 필요")
613
615
 
614
616
  # 런타임별 추가
615
- if rec.runtime == "mlx" and not _has_module("mlx_lm"):
617
+ if rec.runtime == "mlx" and not _has_module("mlx_vlm"):
616
618
  steps.append(InstallStep(
617
- name="mlx-lm", why="Apple Silicon LLM 추론",
618
- command=["pip3", "install", "--upgrade", "mlx-lm"],
619
+ name="mlx-vlm", why="Apple Silicon 멀티모달 추론",
620
+ command=["pip3", "install", "--upgrade", "mlx-vlm"],
619
621
  ))
620
622
  if rec.runtime in {"llama.cpp", "ollama"} and not _which("ollama"):
621
623
  need("ollama", "llama.cpp 가중치를 가장 쉽게 받는 경로")
@@ -638,18 +640,16 @@ def plan(profile: SystemProfile, rec: Recommendation) -> InstallPlan:
638
640
  model_command = ["huggingface-cli", "download", rec.model_id, "--quiet"]
639
641
  if rec.runtime == "ollama":
640
642
  lower = rec.model_id.lower()
641
- if "gpt-oss-120b" in lower:
642
- model_command = ["ollama", "pull", "gpt-oss:120b"]
643
- elif "gpt-oss-20b" in lower:
644
- model_command = ["ollama", "pull", "gpt-oss:20b"]
645
- elif "gemma-4-31b" in lower:
643
+ if "gemma-4-31b" in lower:
646
644
  model_command = ["ollama", "pull", "hf.co/ggml-org/gemma-4-31B-it-GGUF:Q4_K_M"]
645
+ elif "gemma-4-12b" in lower:
646
+ model_command = ["ollama", "pull", "hf.co/ggml-org/gemma-4-12B-it-GGUF:Q4_K_M"]
647
+ elif "llama-4-scout" in lower:
648
+ model_command = ["ollama", "pull", "hf.co/ggml-org/Llama-4-Scout-17B-16E-Instruct-GGUF:Q4_K_M"]
647
649
  elif "qwen3-vl-8b" in lower:
648
650
  model_command = ["ollama", "pull", "qwen3-vl:8b"]
649
651
  elif "qwen3-vl-4b" in lower:
650
652
  model_command = ["ollama", "pull", "qwen3-vl:4b"]
651
- elif "gemma-3-1b" in lower:
652
- model_command = ["ollama", "pull", "gemma3:1b"]
653
653
  elif rec.runtime == "lmstudio":
654
654
  model_command = ["lms", "get", rec.model_id]
655
655
  steps.append(InstallStep(
@@ -696,7 +696,7 @@ def verify(profile: SystemProfile, rec: Recommendation) -> Dict[str, Any]:
696
696
  f"{profile.disk_free_mb} MB free")
697
697
 
698
698
  if rec.runtime == "mlx":
699
- add("mlx_lm import", _has_module("mlx_lm"), "Apple Silicon 런타임")
699
+ add("mlx_vlm import", _has_module("mlx_vlm"), "Apple Silicon 멀티모달 런타임")
700
700
  if rec.runtime in {"llama.cpp", "ollama"}:
701
701
  add("ollama binary", _which("ollama") is not None,
702
702
  _which("ollama") or "not found")
package/docs/CHANGELOG.md CHANGED
@@ -1,5 +1,50 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.2.0] - 2026-06-04
4
+
5
+ > Multimodal-First Knowledge OS Release — Lattice AI is aligned around the
6
+ > Knowledge Graph, multimodal inputs, source disclosure, and Gemma-4-first model
7
+ > recommendations.
8
+
9
+ ### Added
10
+
11
+ - **Source disclosure metadata** — recommended model catalog entries now include
12
+ maker country, maker company, execution method, internet requirement, and
13
+ model name.
14
+ - **Principle documents** — added root-level `PROJECT_PRINCIPLES.md`,
15
+ `AI_PHILOSOPHY.md`, `MODEL_POLICY.md`, `KNOWLEDGE_GRAPH.md`,
16
+ `RELEASE_NOTES.md`, `ARCHITECTURE.md`, and `CHANGELOG.md`.
17
+ - **Gemma-4 default path** — default local model configuration and recommendation
18
+ aliases now center on Gemma 4 12B/31B multimodal models.
19
+
20
+ ### Changed
21
+
22
+ - **README / architecture rewrite** — current docs now describe Lattice AI as an
23
+ AI Knowledge OS rather than a chat app or model launcher.
24
+ - **Multimodal recommendation logic** — local recommendation catalogs and setup
25
+ flows use current multimodal model families only: Gemma 4, Qwen3-VL, and
26
+ Llama 4.
27
+ - **Mode language** — basic and advanced modes are feature-equivalent and differ
28
+ by explanation level; admin mode remains the authority boundary.
29
+ - **Runtime policy** — Apple Silicon local execution now checks MLX-VLM instead
30
+ of MLX-LM.
31
+ - **Version sync** — Python package, npm package, VS Code extension, Workspace
32
+ OS, runtime constants, FastAPI app, and `/health` metadata aligned at `2.2.0`.
33
+
34
+ ### Removed
35
+
36
+ - MLX-LM as a current local text-only recommendation/install path.
37
+ - Text-only low-spec fallback recommendations.
38
+ - Current recommendation entries for Gemma 2, Gemma 3, Qwen2.5-VL, SmolLM,
39
+ Phi, Mistral, DeepSeek, GPT-OSS, and Llama 3.x.
40
+
41
+ ### Validation
42
+
43
+ - Unit tests added/updated for multimodal catalog policy, source metadata,
44
+ Gemma-4 aliases, and version metadata.
45
+ - Package-store publishing remains manual; release artifacts are version-scoped
46
+ and must use exact filenames.
47
+
3
48
  ## [2.1.0] - 2026-06-01
4
49
 
5
50
  > Agent Platform Maturity Release — v2.1 operationalizes the v2.0 platform
@@ -1,7 +1,7 @@
1
1
  # Lattice AI Multi-Agent Runtime 2.1
2
2
 
3
3
  The Multi-Agent Runtime is the **orchestration layer** introduced in v2.0.0 and
4
- operationalized in v2.1.0. It sits
4
+ operationalized in v2.2.0. It sits
5
5
  *above* the v1.x single-agent state machine ([`AgentRuntime`](../latticeai/core/agent.py))
6
6
  and coordinates a pipeline of named **roles** that hand off work to one another,
7
7
  retry on a failing review, and emit a fully observable, replayable timeline.
@@ -12,12 +12,12 @@ retry on a failing review, and emit a fully observable, replayable timeline.
12
12
  (`WorkspaceOSStore.record_agent_run`, `replay_agent_run`, `list_handoffs`)
13
13
 
14
14
  ```python
15
- MULTI_AGENT_VERSION = "2.1.0"
15
+ MULTI_AGENT_VERSION = "2.2.0"
16
16
  ```
17
17
 
18
- ## What v2.1 adds
18
+ ## What v2.2 adds
19
19
 
20
- v2.1 does not replace the v2.0 runtime; it makes the runtime's operational
20
+ v2.2 does not replace the v2.0 runtime; it makes the runtime's operational
21
21
  objects durable and inspectable:
22
22
 
23
23
  - **Explicit handoff records**: `handoff_id`, source/target agent ids, reason,
@@ -1,7 +1,7 @@
1
1
  # Lattice AI Plugin SDK
2
2
 
3
3
  The Plugin SDK is the extension layer for the Lattice AI Agentic Workspace
4
- Platform. v2.1.0 keeps the v2.0 plugin model and adds execution observability plus
4
+ Platform. v2.2.0 keeps the v2.0 plugin model and adds execution observability plus
5
5
  local marketplace-template foundations. It lets you package skills, tools,
6
6
  workflow templates, and actions into one versioned, permissioned unit — a
7
7
  *plugin*. A plugin is a directory under the configured `plugins` root that ships
@@ -22,10 +22,10 @@ through the existing skill registry rather than owning a parallel one.
22
22
  The host SDK version is exposed as:
23
23
 
24
24
  ```python
25
- PLUGIN_SDK_VERSION = "2.1.0"
25
+ PLUGIN_SDK_VERSION = "2.2.0"
26
26
  ```
27
27
 
28
- ## v2.1 additions
28
+ ## v2.2 additions
29
29
 
30
30
  - `execute_action(...)` emits `plugin_started`, `plugin_completed`, and
31
31
  `execution_failed` through the existing Workspace OS timeline/realtime feed.
@@ -51,7 +51,7 @@ parsed and validated into an immutable `PluginManifest`.
51
51
  | `version` | string | yes | Semantic version (`^\d+\.\d+\.\d+([.-][0-9A-Za-z.]+)?$`). |
52
52
  | `description` | string | no | Short summary. |
53
53
  | `author` | string | no | Author or organization. |
54
- | `lattice_version` | string | no | Minimum host version this plugin requires. May be bare (`"2.1.0"`) or prefixed (`">=2.1.0"`). Empty means "any host". |
54
+ | `lattice_version` | string | no | Minimum host version this plugin requires. May be bare (`"2.2.0"`) or prefixed (`">=2.2.0"`). Empty means "any host". |
55
55
  | `permissions` | string[] | no | Must be a subset of the [permission allow-list](#permissions). Unknown values are rejected. |
56
56
  | `provides` | object | no | What the plugin contributes. Keys must be in `("skills", "tools", "workflows", "actions")`; each value is a list of names. |
57
57
  | `entrypoint` | string | no | Reserved for an optional code entrypoint. |
@@ -205,14 +205,14 @@ identically:
205
205
  { "lattice_version": ">=2.0.0" }
206
206
  ```
207
207
 
208
- Examples against a host of `2.1.0`:
208
+ Examples against a host of `2.2.0`:
209
209
 
210
210
  | Required | Compatible | Why |
211
211
  | --- | --- | --- |
212
212
  | `""` (missing) | yes | Any host. |
213
213
  | `2.0.0` / `>=2.0.0` | yes | Same major, host `>=` required. |
214
- | `2.1.0` / `>=2.1.0` | yes | Same major, exact current host. |
215
- | `2.1.0` | no | Host is lower than the required minimum. |
214
+ | `2.2.0` / `>=2.2.0` | yes | Same major, exact current host. |
215
+ | `2.3.0` | no | Host is lower than the required minimum. |
216
216
  | `1.0.0` | no | Major mismatch. |
217
217
  | `3.0.0` | no | Major mismatch. |
218
218
 
@@ -1,7 +1,7 @@
1
1
  # Lattice AI Realtime Collaboration
2
2
 
3
3
  Realtime Collaboration is the subsystem that gives a Lattice AI workspace a live
4
- **presence** registry and an **activity feed**. In v2.1.0 it also carries
4
+ **presence** registry and an **activity feed**. In v2.2.0 it also carries
5
5
  workspace-scoped execution observability for agents, handoffs, reviews,
6
6
  workflows, plugins, retries, and failures. It is delivered over Server-Sent
7
7
  Events (SSE) by an in-process pub/sub bus, the
@@ -15,10 +15,10 @@ event system.
15
15
  The bus version is:
16
16
 
17
17
  ```python
18
- REALTIME_VERSION = "2.1.0"
18
+ REALTIME_VERSION = "2.2.0"
19
19
  ```
20
20
 
21
- v2.1 execution event types include `agent_started`, `handoff_created`,
21
+ v2.2 execution event types include `agent_started`, `handoff_created`,
22
22
  `handoff_accepted`, `handoff_completed`, `review_requested`, `review_approved`,
23
23
  `retry_requested`, `workflow_started`, `workflow_completed`, `plugin_started`,
24
24
  `plugin_completed`, `execution_failed`, and `execution_cancelled`.
@@ -301,7 +301,7 @@ defaults to `50` and is clamped to the `200`-entry buffer. Returns newest-first:
301
301
  {
302
302
  "events": [ /* enriched events, newest first */ ],
303
303
  "stats": {
304
- "version": "2.1.0",
304
+ "version": "2.2.0",
305
305
  "subscribers": 1,
306
306
  "presence": 2,
307
307
  "feed_size": 17,
@@ -325,7 +325,7 @@ Returns the scope-filtered presence registry plus the same `stats` block:
325
325
  "last_seen": "2026-06-01T10:15:30"
326
326
  }
327
327
  ],
328
- "stats": { "version": "2.1.0", "subscribers": 1, "presence": 1, "feed_size": 17, "transport": "sse" }
328
+ "stats": { "version": "2.2.0", "subscribers": 1, "presence": 1, "feed_size": 17, "transport": "sse" }
329
329
  }
330
330
  ```
331
331
 
@@ -419,5 +419,5 @@ no client-side filtering is needed.
419
419
  on top of it, not a replacement.
420
420
  - **Single process.** The bus is in-process by design for the local-first
421
421
  deployment; it does not coordinate across multiple server processes.
422
- - **`stats()`** reports `version` (`2.1.0`), live `subscribers`, `presence`
422
+ - **`stats()`** reports `version` (`2.2.0`), live `subscribers`, `presence`
423
423
  count, `feed_size`, and the `transport` (`"sse"`) for health/observability.
@@ -1,13 +1,13 @@
1
1
  # Lattice AI v2 Architecture — Agentic Workspace Platform
2
2
 
3
3
  Lattice AI v2.0.0 turned the local-first Workspace OS into a full **Agentic
4
- Workspace Platform**. v2.1.0 keeps that architecture and matures the operational
4
+ Workspace Platform**. v2.2.0 keeps that architecture and matures the operational
5
5
  layer: explicit handoffs, context packets, review/retry loops, memory snapshots,
6
6
  planning records, replay, marketplace templates, and realtime execution
7
7
  observability all compose over the same local-first JSON store and Knowledge
8
8
  Graph.
9
9
 
10
- This document describes how the four v2.0 pillars fit together, the small set of
10
+ This document describes how the v2 platform pillars fit together, the small set of
11
11
  **additive integration seams** that wire them, the cross-integration matrix that
12
12
  results, and the compatibility surfaces that v1.x callers and data keep relying
13
13
  on. Every claim below is grounded in the shipping source:
@@ -22,17 +22,17 @@ on. Every claim below is grounded in the shipping source:
22
22
  - Marketplace foundation: `latticeai/core/marketplace.py`, `latticeai/api/marketplace.py`
23
23
  - Project conventions: `AGENTS.md`
24
24
 
25
- All four subsystems share the same design rules from `AGENTS.md`: dependency
25
+ All v2 subsystems share the same design rules from `AGENTS.md`: dependency
26
26
  injection, explicit interfaces, small focused modules, registry-based dispatch,
27
27
  and composition over global state. None of them import the FastAPI app; each is
28
28
  constructed by `server_app.py` and exposed through a router factory.
29
29
 
30
30
  ---
31
31
 
32
- ## 1. The Four v2 Pillars
32
+ ## 1. The v2 Platform Pillars
33
33
 
34
34
  The platform version is the single source of truth `WORKSPACE_OS_VERSION =
35
- "2.1.0"` (`latticeai/core/workspace_os.py`). Each pillar module re-declares the
35
+ "2.2.0"` (`latticeai/core/workspace_os.py`). Each pillar module re-declares the
36
36
  same version for its own surface (`PLUGIN_SDK_VERSION`, `WORKFLOW_ENGINE_VERSION`,
37
37
  `MULTI_AGENT_VERSION`, `REALTIME_VERSION`) and the marketplace foundation exposes
38
38
  `MARKETPLACE_VERSION`.
@@ -176,6 +176,13 @@ drive an injected `workflow_runner` / `plugin_runner`), and the `reviewer`
176
176
  returns `pass` / `retry`. The reviewer can rewind the pipeline to the executor up
177
177
  to `max_retries` times; the final `status` is `ok`, `retried_ok`, or `failed`.
178
178
 
179
+ v2.2.0 matures that orchestration with first-class `AgentHandoff` and
180
+ `AgentContextPacket` records, structured plan review, retry history, memory
181
+ snapshots, and replay frames. Handoffs are workspace-scoped and persisted with
182
+ source/target agents, task summary, reason, status, timestamps, and redacted
183
+ context so a run can be inspected after the fact instead of inferred from a flat
184
+ log.
185
+
179
186
  ### 1.4 Realtime Collaboration (`latticeai.core.realtime`)
180
187
 
181
188
  An in-process pub/sub bus, presence registry, and activity feed delivered over
@@ -201,21 +208,34 @@ class RealtimeBus:
201
208
  return self.publish(event)
202
209
  ```
203
210
 
211
+ ### 1.5 Marketplace Foundation (`latticeai.core.marketplace`)
212
+
213
+ v2.2.0 adds a local marketplace foundation rather than a cloud marketplace
214
+ service. `TemplateCatalog` manages Plugin, Workflow, and Agent templates with
215
+ metadata, export/import, install hooks, and a template registry stored through
216
+ Workspace OS. Marketplace templates are local extension points for the existing
217
+ Plugin SDK, Workflow Engine, and Multi-Agent Runtime; they do not bypass plugin
218
+ permissions, workflow execution guards, or workspace scoping.
219
+
204
220
  ---
205
221
 
206
222
  ## 2. How the Pillars Compose Into One Platform
207
223
 
208
- The four pillars are not parallel silos. They are stitched into one platform by
224
+ The v2 platform pillars are not parallel silos. They are stitched into one platform by
209
225
  exactly **three additive seams**, all introduced without changing any existing
210
226
  behavior.
211
227
 
212
- ### Seam 1 — Two new state keys with deep-merge backfill
228
+ ### Seam 1 — Additive state keys with deep-merge backfill
213
229
 
214
- `WorkspaceOSStore._default_state()` adds two new top-level keys to the local-first
215
- JSON state: **`plugin_registry`** (an object, mirroring `skill_registry`) and
216
- **`workflow_runs`** (a list, alongside the existing `workflows`). The default
217
- state also adds v2.0 feature flags (`plugin_sdk`, `workflow_designer`,
218
- `multi_agent_runtime`, `realtime_collaboration`) and a `plugins` navigation area.
230
+ `WorkspaceOSStore._default_state()` adds new top-level keys to the local-first
231
+ JSON state, including **`plugin_registry`** (an object, mirroring
232
+ `skill_registry`), **`workflow_runs`** (a list, alongside the existing
233
+ `workflows`), **`handoffs`**, **`memory_snapshots`**, and
234
+ **`template_registry`**. The default state also adds v2 feature flags
235
+ (`plugin_sdk`, `workflow_designer`, `multi_agent_runtime`,
236
+ `realtime_collaboration`, `agent_handoff`, `agent_context_packets`,
237
+ `review_retry_loop`, `timeline_replay`, `marketplace_foundation`, and related
238
+ agent memory/planning flags) plus platform navigation areas.
219
239
 
220
240
  These are safe for existing data because `load_state()` runs `_deep_merge(default,
221
241
  loaded)` on every load. `_deep_merge` walks the default tree and fills in any key
@@ -234,14 +254,14 @@ def _deep_merge(default: Any, loaded: Any) -> Any:
234
254
  return loaded
235
255
  ```
236
256
 
237
- A v1.x `workspace_os.json` that has no `plugin_registry` / `workflow_runs` is
238
- therefore upgraded *in memory* on first load — the new keys are backfilled with
239
- their defaults, every pre-existing snapshot, trace, memory, agent run, workflow,
240
- and skill entry is preserved, and the file is only rewritten on the next normal
241
- `save_state`. The Plugin SDK lifecycle helpers (`list_plugin_registry`,
242
- `set_plugin_enabled`, `mark_plugin_installed`, `mark_plugin_uninstalled`) and
243
- workflow-run helpers (`record_workflow_run`, `list_workflow_runs`) operate on
244
- these keys, deliberately mirroring the existing skill-registry contract.
257
+ A v1.x `workspace_os.json` that has none of these newer keys is therefore
258
+ upgraded *in memory* on first load — the new keys are backfilled with their
259
+ defaults, every pre-existing snapshot, trace, memory, agent run, workflow, and
260
+ skill entry is preserved, and the file is only rewritten on the next normal
261
+ `save_state`. Plugin lifecycle helpers, workflow-run helpers, handoff helpers,
262
+ memory snapshot helpers, and marketplace template helpers operate on these keys,
263
+ deliberately mirroring the existing skill-registry and workflow-history
264
+ contracts.
245
265
 
246
266
  ### Seam 2 — A single `event_sink` on `record_timeline_event`
247
267
 
@@ -281,7 +301,7 @@ behavior change.
281
301
 
282
302
  ### Seam 3 — `PlatformRuntime` as the one cross-wiring point
283
303
 
284
- `latticeai/services/platform_runtime.py` is the single place the four subsystems
304
+ `latticeai/services/platform_runtime.py` is the single place the v2 subsystems
285
305
  cross-wire to one another and to the workspace. Keeping it out of `server_app`
286
306
  honours the `AGENTS.md` preference for small, composable, independently testable
287
307
  modules; `server_app` only constructs it and mounts routers.
@@ -315,7 +335,7 @@ PLATFORM = PlatformRuntime(
315
335
  factories `build_workflow_runners`, `build_orchestrator`, and
316
336
  `plugin_capability_runners` that are handed to the routers.
317
337
 
318
- The four routers are wired entirely through `PLATFORM`:
338
+ The v2 routers are wired entirely through `PLATFORM`:
319
339
 
320
340
  ```python
321
341
  app.include_router(create_plugins_router(
@@ -472,7 +492,7 @@ Representative run request/response (Workflow Designer):
472
492
 
473
493
  ```json
474
494
  // POST /agents/api/run
475
- { "goal": "Draft v2.1 release notes", "roles": ["planner", "executor", "reviewer"], "max_retries": 2 }
495
+ { "goal": "Draft v2.2 release notes", "roles": ["planner", "executor", "reviewer"], "max_retries": 2 }
476
496
  ```
477
497
 
478
498
  ```json
@@ -486,7 +506,7 @@ Representative run request/response (Workflow Designer):
486
506
 
487
507
  ## 6. Compatibility
488
508
 
489
- > **Compatibility note.** v2.1.0 is **additive**. All v1.x and v2.0 data and APIs are
509
+ > **Compatibility note.** v2.2.0 is **additive**. All v1.x and v2.0 data and APIs are
490
510
  > preserved; the platform layers new capabilities on top of unchanged surfaces.
491
511
 
492
512
  Preserved surfaces, verified against source:
@@ -494,7 +514,7 @@ Preserved surfaces, verified against source:
494
514
  - **ASGI entrypoints.** `server:app` and `latticeai.server_app.app` remain the
495
515
  application objects. `server_app.py` still exposes the module-level `app =
496
516
  FastAPI(...)` plus the `main()` / `uvicorn.run(app, ...)` entry point.
497
- - **Version wiring.** `WORKSPACE_OS_VERSION = "2.1.0"` drives both
517
+ - **Version wiring.** `WORKSPACE_OS_VERSION = "2.2.0"` drives both
498
518
  `APP_VERSION` (and thus the FastAPI `app.version`) and the `/health`
499
519
  response — the health router is constructed with `app_version=APP_VERSION`.
500
520
  - **Existing routes.** Every v1.x router (`auth`, `admin`, `security_dashboard`,
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Workflow Designer
2
2
 
3
- The Workflow Designer (introduced in **v2.0.0** and hardened in **v2.1.0**) lets
3
+ The Workflow Designer (introduced in **v2.0.0** and hardened in **v2.2.0**) lets
4
4
  you build, validate, run, inspect, replay, export, and import automations as a
5
5
  small **directed graph of typed nodes**. A workflow starts from a single
6
6
  `trigger` node and walks node-to-node to an `output`, dispatching each executable
@@ -17,10 +17,10 @@ is preserved.
17
17
  The engine version is exported as:
18
18
 
19
19
  ```python
20
- WORKFLOW_ENGINE_VERSION = "2.1.0"
20
+ WORKFLOW_ENGINE_VERSION = "2.2.0"
21
21
  ```
22
22
 
23
- ## v2.1 hardening
23
+ ## v2.2 hardening
24
24
 
25
25
  - Agent node output is captured in workflow context and can flow into a later
26
26
  plugin or output node through `last_output`.
@@ -449,7 +449,7 @@ or scope), stamped with the engine version and stripped of the internal
449
449
 
450
450
  ```json
451
451
  {
452
- "lattice_workflow_export": "2.1.0",
452
+ "lattice_workflow_export": "2.2.0",
453
453
  "name": "Daily digest",
454
454
  "nodes": [ /* ... */ ],
455
455
  "metadata": {}