# Changelog

## Score

- CAI 39 → 33 (-6.4)
- Rubric changed (rubric-2026.08.18 → rubric-2026.08.15) — scores are not directly comparable.

## Lenses

- Code Health 29 → 38 (+9.8)
- Architecture 98 → 96 (-2.3)
- Maturity 66 → 54 (-11.3)
- Readiness 39 → 18 (-20.4)
- Security 40 → 39 (-1.0)

## Resolved (256)

- API._apply_state (cognitive 21) (src/exo/api/main.py)
- API._collect_image_chunks (cognitive 34) (src/exo/api/main.py)
- API._collect_image_chunks (cyclomatic 18) (src/exo/api/main.py)
- API._collect_text_generation_with_stats (cognitive 16) (src/exo/api/main.py)
- API._generate_image_stream (cognitive 27) (src/exo/api/main.py)
- API.get_placement_previews (cognitive 31) (src/exo/api/main.py)
- API.get_placement_previews (cyclomatic 17) (src/exo/api/main.py)
- BatchGenerator.step (cognitive 18) (src/exo/worker/runner/llm_inference/batch_generator.py)
- Boundary-crossing change coupling: networking.rs ↔ router.py (rust/exo_rs/src/networking.rs)
- Change coupling: HeaderNav.svelte ↔ +page.svelte (dashboard/src/lib/components/HeaderNav.svelte)
- Change coupling: HeaderNav.svelte ↔ app.svelte.ts (dashboard/src/lib/components/HeaderNav.svelte)
- Change coupling: ModelPickerModal.svelte ↔ +page.svelte (dashboard/src/lib/components/ModelPickerModal.svelte)
- Change coupling: chat_completions.py ↔ generate.py (src/exo/api/adapters/chat_completions.py)
- Change coupling: chat_completions.py ↔ utils_mlx.py (src/exo/api/adapters/chat_completions.py)
- Change coupling: claude.py ↔ generate.py (src/exo/api/adapters/claude.py)
- Change coupling: claude.py ↔ responses.py (src/exo/api/adapters/claude.py)
- Change coupling: claude.py ↔ utils_mlx.py (src/exo/api/adapters/claude.py)
- Change coupling: responses.py ↔ utils_mlx.py (src/exo/api/adapters/responses.py)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- …and 236 more

## New (58)

- Coverage not measured — test suite did not build
- Dimension evaluation failed
- Duplicated block (11 lines × 2) (src/exo/worker/engines/image/models/qwen/adapter.py)
- Duplicated block (11 lines × 2) (src/exo/worker/engines/image/models/qwen/edit_adapter.py)
- Duplicated block (12 lines × 2) (src/exo/api/tests/test_claude_tool_use.py)
- Duplicated block (13 lines × 2) (src/exo/worker/engines/image/pipeline/runner.py)
- Duplicated block (13 lines × 3) (src/exo/worker/engines/mlx/auto_parallel.py)
- Duplicated block (14 lines × 2) (src/exo/worker/tests/unittests/test_runner/test_finish_reason_sse.py)
- Duplicated block (15 lines × 2) (src/exo/worker/tests/unittests/test_runner/test_finish_reason_sse.py)
- Duplicated block (15 lines × 2) (src/exo/worker/tests/unittests/test_runner/test_parse_tool_calls.py)
- Duplicated block (17 lines × 2) (src/exo/worker/tests/unittests/test_mlx/test_kv_prefix_cache.py)
- Duplicated block (21 lines × 3) (src/exo/master/main.py)
- Duplicated block (22 lines × 2) (src/exo/worker/tests/unittests/test_runner/test_dsml_e2e.py)
- Duplicated block (8 lines × 2) (src/exo/download/tests/test_rate_limit_handling.py)
- Duplicated block (9 lines × 2) (src/exo/api/tests/test_openai_responses_api.py)
- High CVE: [GHSA redacted] (Cargo.lock)
- High CVE: [GHSA redacted] (uv.lock)
- High CVE: [GHSA redacted] (uv.lock)
- High CVE: [GHSA redacted] (uv.lock)
- High CVE: [GHSA redacted] (uv.lock)
- …and 38 more

## Architecture

- Containers 0 added · 0 removed · contexts 0 added · 1 removed · edges 0 added · 0 removed

## Removed bounded contexts (1)

- exo
