loki-mode 10.8.0 → 10.9.1

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 (147) hide show
  1. package/README.md +2 -2
  2. package/SKILL.md +2 -2
  3. package/VERSION +1 -1
  4. package/autonomy/loki +16 -31
  5. package/autonomy/tui.sh +5 -1
  6. package/dashboard/__init__.py +1 -1
  7. package/dashboard/api_phases.py +1 -1
  8. package/dashboard/api_start.py +0 -1
  9. package/dashboard/server.py +22 -138
  10. package/docs/COCKPIT-SPEC.md +3 -1
  11. package/docs/DASHBOARD-9.12-EVIDENCE.md +1 -1
  12. package/docs/DASHBOARD-ARCHITECTURE.md +13 -11
  13. package/docs/DASHBOARD_V2_CHECKLIST.md +2 -0
  14. package/docs/INSTALLATION.md +12 -11
  15. package/docs/MERGE-DEDUP-MAP.md +1 -1
  16. package/docs/MERGE-ROUTE-MAP.md +1 -1
  17. package/docs/MERGE3-PLAN.md +2 -2
  18. package/docs/R3-COST-OBSERVABILITY-DESIGN.md +2 -2
  19. package/docs/R4-TRUST-TRAJECTORY-DESIGN.md +1 -1
  20. package/docs/R5-AUTO-WIKI-DESIGN.md +1 -1
  21. package/docs/R6-ROLLBACK-CHECKPOINT-PLAN.md +1 -1
  22. package/docs/RARV-C-100X-PLAN.md +3 -3
  23. package/docs/SONNET5-DEFAULT-PLAN.md +2 -2
  24. package/docs/SYNERGY-TASKS.md +1 -1
  25. package/docs/TOOL-INTEGRATION.md +1 -1
  26. package/docs/TOP-100-BACKLOG.md +1 -1
  27. package/docs/alternative-installations.md +1 -1
  28. package/docs/architecture/ADR-001-runtime-migration.md +1 -1
  29. package/docs/architecture/DASHBOARD_V2_ARCHITECTURE.md +2 -0
  30. package/docs/audit-logging.md +2 -0
  31. package/docs/authentication.md +2 -0
  32. package/docs/authorization.md +2 -0
  33. package/docs/certification/02-enterprise-features/lab.md +2 -0
  34. package/docs/certification/02-enterprise-features/lesson.md +2 -0
  35. package/docs/certification/04-production-deployment/lab.md +2 -0
  36. package/docs/certification/04-production-deployment/lesson.md +2 -0
  37. package/docs/control-plane-migration.md +97 -0
  38. package/docs/dashboard-guide.md +6 -7
  39. package/docs/dev/release-checklist.md +9 -11
  40. package/docs/enterprise/integration-cookbook.md +2 -0
  41. package/docs/enterprise/migration.md +1 -1
  42. package/docs/enterprise/performance.md +3 -1
  43. package/docs/enterprise/sdk-guide.md +2 -0
  44. package/docs/enterprise/security.md +2 -0
  45. package/docs/plans/FORGE-AUTONOMOUS-QUEUE.md +2 -2
  46. package/docs/research-2026-07/OBSERVABILITY-TOOL-SPEC.md +1 -1
  47. package/docs/retrospectives/v7.5.15-honesty-audit.md +2 -2
  48. package/docs/test-scenarios/enterprise-scenarios.md +2 -2
  49. package/docs/v10/ARCHITECT-CUTS.md +9 -9
  50. package/docs/v10/BACKLOG.md +7 -7
  51. package/docs/v10/BOARD.md +25 -25
  52. package/docs/v10/CONTROL-PLANE.md +4 -4
  53. package/docs/v10/CP-ENTERPRISE-UI.md +66 -66
  54. package/docs/v10/D51-PHASE-B.md +1 -1
  55. package/docs/v10/DECISIONS.md +3 -3
  56. package/docs/v10/DEPS.md +10 -10
  57. package/docs/v10/FAILURE-CLASSES.md +45 -1
  58. package/docs/v10/LEGACY-REMOVAL.md +2 -2
  59. package/docs/v10/SWARM.md +2 -2
  60. package/loki-ts/dist/cockpit.js +11 -11
  61. package/loki-ts/dist/loki.js +596 -579
  62. package/magic/core/design_tokens.py +1 -2
  63. package/magic/core/generator.py +2 -2
  64. package/magic/tokens/README.md +1 -3
  65. package/mcp/__init__.py +1 -1
  66. package/package.json +2 -7
  67. package/packages/control-plane/dist/server.js +1683 -843
  68. package/packages/control-plane/src/server/legacy/routes-audit.ts +50 -0
  69. package/packages/control-plane/src/server/legacy/routes-control.ts +26 -0
  70. package/packages/control-plane/src/server/legacy/routes-memory.ts +30 -0
  71. package/packages/control-plane/src/server/legacy/routes.ts +58 -58
  72. package/packages/control-plane/src/server/legacy/shim.ts +10 -4
  73. package/packages/control-plane/src/server/routes/checkpoints.ts +171 -0
  74. package/packages/control-plane/src/server/routes/index.ts +4 -1
  75. package/packages/control-plane/src/server/routes/memory.ts +219 -0
  76. package/packages/control-plane/src/server/routes/session_control.ts +155 -0
  77. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  78. package/references/magic-modules-patterns.md +2 -2
  79. package/skills/factory-operations.md +3 -3
  80. package/skills/magic-modules.md +1 -1
  81. package/skills/release-cadence.md +1 -1
  82. package/tools/audit-docs.py +1 -1
  83. package/tools/index-codebase.py +1 -1
  84. package/web-app/dist/assets/{AdminPage-DDDvUz0N.js → AdminPage-DqMnfZrH.js} +1 -1
  85. package/web-app/dist/assets/{Avatar-Dcdz46i6.js → Avatar-BEof29du.js} +1 -1
  86. package/web-app/dist/assets/{Badge-BB24cCpK.js → Badge-WD53OL5m.js} +1 -1
  87. package/web-app/dist/assets/{Button-D0-DmPZL.js → Button-Rzk5flhU.js} +1 -1
  88. package/web-app/dist/assets/{CockpitPage-CdjpU2JW.js → CockpitPage-Bqz3PCMh.js} +1 -1
  89. package/web-app/dist/assets/{ComparePage-DT5U0y0d.js → ComparePage-Byo2NzAZ.js} +1 -1
  90. package/web-app/dist/assets/{ErrorBoundary-lEHcl0EO.js → ErrorBoundary-BuE0kH3W.js} +1 -1
  91. package/web-app/dist/assets/{EvidenceReceiptPanel-GpnWvdCr.js → EvidenceReceiptPanel-CKFHOPBx.js} +1 -1
  92. package/web-app/dist/assets/{GitHubIssuesPanel-C7VOh1B7.js → GitHubIssuesPanel-Df_kTMqI.js} +1 -1
  93. package/web-app/dist/assets/{GitHubPRsPanel-G_kOuINv.js → GitHubPRsPanel-CouvcKrZ.js} +1 -1
  94. package/web-app/dist/assets/{HomePage-PqRisOny.js → HomePage-dEpLzj0x.js} +2 -2
  95. package/web-app/dist/assets/{LoginPage-DU7pFAkf.js → LoginPage-6DVjUND5.js} +1 -1
  96. package/web-app/dist/assets/{MagicPage-C5JWIWMk.js → MagicPage-BDQ9MOfY.js} +1 -1
  97. package/web-app/dist/assets/{MetricsPage-CbIGS_qo.js → MetricsPage-CXiJ04G_.js} +1 -1
  98. package/web-app/dist/assets/{NotFoundPage-vU1pvdSt.js → NotFoundPage-BaXhZvyj.js} +1 -1
  99. package/web-app/dist/assets/{ProjectPage-SsixIPPv.js → ProjectPage-BzE4V7Ti.js} +3 -3
  100. package/web-app/dist/assets/{ProjectsPage-BfQKSR9k.js → ProjectsPage-ipf6TLMX.js} +1 -1
  101. package/web-app/dist/assets/{SettingsPage-B8YfXAom.js → SettingsPage-BDxkUKN6.js} +1 -1
  102. package/web-app/dist/assets/{ShowcasePage-Ba407f2-.js → ShowcasePage-YQXD72SM.js} +1 -1
  103. package/web-app/dist/assets/{SystemSettingsPage-DzNQhhBS.js → SystemSettingsPage-Dou7zHS0.js} +1 -1
  104. package/web-app/dist/assets/{TeamsPage-tqUnpZ15.js → TeamsPage-CQarfcYr.js} +1 -1
  105. package/web-app/dist/assets/{TemplatesPage-ClB5EpI3.js → TemplatesPage-CPi1R8Xj.js} +1 -1
  106. package/web-app/dist/assets/{TerminalOutput-CBvpYfEu.js → TerminalOutput-WiGhWdYD.js} +1 -1
  107. package/web-app/dist/assets/{activity-C1s0L_X9.js → activity-DOa7ejQA.js} +1 -1
  108. package/web-app/dist/assets/{bell-DMEiXr73.js → bell-CX-VAlYN.js} +1 -1
  109. package/web-app/dist/assets/{bot-BF_xIOxu.js → bot-EDXaZmHc.js} +1 -1
  110. package/web-app/dist/assets/{check-Dv1Ynvrs.js → check-CnBdKk3L.js} +1 -1
  111. package/web-app/dist/assets/{chevron-left-Ddhsod7S.js → chevron-left-BJ_ydRQW.js} +1 -1
  112. package/web-app/dist/assets/{circle-alert-OATHUkBZ.js → circle-alert-tz8ufhc_.js} +1 -1
  113. package/web-app/dist/assets/{clock-C1Ltva07.js → clock-DFBZPSsH.js} +1 -1
  114. package/web-app/dist/assets/{cloud-B-S4oOy9.js → cloud-uy3p_5Q7.js} +1 -1
  115. package/web-app/dist/assets/{code-xml-D3Femn_F.js → code-xml-3CbYD9YL.js} +1 -1
  116. package/web-app/dist/assets/{database-DBSeFgO3.js → database-YiNBXc9c.js} +1 -1
  117. package/web-app/dist/assets/{dollar-sign-sgDgNuGE.js → dollar-sign-D0wBa4Cv.js} +1 -1
  118. package/web-app/dist/assets/{file-code-corner-C-MbdZEc.js → file-code-corner-DDdZVZ5v.js} +1 -1
  119. package/web-app/dist/assets/{file-plus-CCB6yqXv.js → file-plus-D09LTBqt.js} +1 -1
  120. package/web-app/dist/assets/{globe-DlbrNAj1.js → globe-BirTPwff.js} +1 -1
  121. package/web-app/dist/assets/{hammer-B-DWm695.js → hammer-DaE5qgnd.js} +1 -1
  122. package/web-app/dist/assets/{index-Dvny-1SU.js → index-D8t7KnQf.js} +3 -3
  123. package/web-app/dist/assets/{layers-99qsKpOT.js → layers-DVVrckRY.js} +1 -1
  124. package/web-app/dist/assets/{loader-circle-ZvZyZl3J.js → loader-circle-2-nMGmcb.js} +1 -1
  125. package/web-app/dist/assets/{lock-DosGjcxP.js → lock-D0Xj43pC.js} +1 -1
  126. package/web-app/dist/assets/{package-C-PumesN.js → package-BB7S3egm.js} +1 -1
  127. package/web-app/dist/assets/{plus-CTYYskTB.js → plus-BLhoMrn3.js} +1 -1
  128. package/web-app/dist/assets/{refresh-cw-qW2ztTFS.js → refresh-cw-DMc2uPLw.js} +1 -1
  129. package/web-app/dist/assets/{rotate-ccw-ZIKrf-vO.js → rotate-ccw-DM3IP9x7.js} +1 -1
  130. package/web-app/dist/assets/{scroll-text-BamlXjAT.js → scroll-text-lH2uW7rB.js} +1 -1
  131. package/web-app/dist/assets/{server-BljXb79I.js → server-BkerZcdR.js} +1 -1
  132. package/web-app/dist/assets/{shield-alert-Dr6eT9c_.js → shield-alert-B8ohcUfu.js} +1 -1
  133. package/web-app/dist/assets/{thumbs-up-v3oBXZgU.js → thumbs-up-CTIxLzPD.js} +1 -1
  134. package/web-app/dist/assets/{trash-2-BOuIrCpi.js → trash-2-C3zIpsH5.js} +1 -1
  135. package/web-app/dist/assets/{trending-down-Dp7jMCgH.js → trending-down-BTT7wV4Y.js} +1 -1
  136. package/web-app/dist/assets/{trending-up-CDiur-nP.js → trending-up-BzHdCDvF.js} +1 -1
  137. package/web-app/dist/assets/{upload-DxIHXhNE.js → upload-HxR34-A8.js} +1 -1
  138. package/web-app/dist/assets/{usePolling-D2Uu-YZb.js → usePolling-DDj6Fupy.js} +1 -1
  139. package/web-app/dist/assets/{user-BVWCUAfF.js → user-qH5y9yNy.js} +1 -1
  140. package/web-app/dist/index.html +1 -1
  141. package/dashboard/static/assets/mermaid.min.js +0 -2030
  142. package/dashboard/static/cost.html +0 -344
  143. package/dashboard/static/favicon.svg +0 -5
  144. package/dashboard/static/index.html +0 -15577
  145. package/dashboard/static/proofs.html +0 -194
  146. package/dashboard/static/start.html +0 -131
  147. package/dashboard/static/trust.html +0 -325
@@ -20,24 +20,24 @@ Package: packages/control-plane (server in src/server, UI in ui/src). Sources ci
20
20
 
21
21
  ## 1. Legacy inventory (KEEP / REWORK / DROP)
22
22
 
23
- Shell: dashboard-ui/scripts/build-standalone.js (generates dashboard/static/index.html). Nav groups at build-standalone.js:1266-1347 (Build, Quality and Trust, Insights, Ops, Wiki). Pages at :1358-1882. RARV, Council, gates, checkpoints and app runner are legacy engine concepts with no v10 producer (docs/v10/LEGACY-REMOVAL.md:36-37), so they DROP or remap to v10 stages (events stage.started/completed/failed/skipped, loki-ts/src/engine10/status.ts:9).
23
+ Shell: legacy-ui/scripts/build-standalone.js (generates legacy-ui-static/index.html). Nav groups at build-standalone.js:1266-1347 (Build, Quality and Trust, Insights, Ops, Wiki). Pages at :1358-1882. RARV, Council, gates, checkpoints and app runner are legacy engine concepts with no v10 producer (docs/v10/LEGACY-REMOVAL.md:36-37), so they DROP or remap to v10 stages (events stage.started/completed/failed/skipped, loki-ts/src/engine10/status.ts:9).
24
24
 
25
25
  | Legacy page or control | Source | Decision | v10 home |
26
26
  |---|---|---|---|
27
27
  | Overview (spec, tasks, RARV timeline, diff) | components/loki-overview.js, loki-spec-panel.js, loki-rarv-timeline.js, loki-session-diff.js, loki-task-board.js; build-standalone.js:1358-1415 | REWORK | Home (KPI row, recent runs, BLOCKED inbox). RARV timeline becomes the v10 stage timeline in the run thread. Task board DROP (no v10 task queue). Diff KEEP inside the run thread. |
28
28
  | First-run hero ("loki quickstart") | build-standalone.js:1365-1387 | REWORK | Empty state of the New run composer (one action: paste an issue). |
29
29
  | App Runner | loki-app-preview.js, loki-app-status.js (/api/app-runner/*) | DROP | Screenshots and evidence in the run thread replace it. |
30
- | Checkpoints | loki-checkpoint-viewer.js (/api/checkpoints, rollback) | DROP | No v10 checkpoints; rollback deleted (LEGACY-REMOVAL.md:37). |
30
+ | Checkpoints | loki-checkpoint-viewer.js (/api/checkpoints, rollback) | REWORK | Served by the Control Plane: /v1/checkpoints read routes, plus create and rollback on the loopback-only action path (CPE24-P2). |
31
31
  | Context | loki-context-tracker.js (/api/context) | DROP | Token counts per run (input_tokens, output_tokens) shown in the run cost card. |
32
32
  | Fleet | loki-fleet.js (/api/fleet/*) | REWORK | Runs table (all repos, filters, group_id rollup). Its table styling is the Table primitive. |
33
33
  | Quality (score, gates, prompt optimizer) | loki-quality-score.js, loki-quality-gates.js, loki-prompt-optimizer.js | DROP | v10 verify stage plus NOT PROVEN list in the run thread. |
34
- | Trust trajectory and receipts panel | dashboard/static/trust.html, proofs.html; build-standalone.js:1811-1828 | KEEP on v10 data | Receipts page (list, inline verify, verified-rate trend from runs). |
34
+ | Trust trajectory and receipts panel | legacy-ui-static/trust.html, proofs.html; build-standalone.js:1811-1828 | KEEP on v10 data | Receipts page (list, inline verify, verified-rate trend from runs). |
35
35
  | Completion Council | loki-council-dashboard.js, loki-council-transcripts.js | DROP | Remapped: the v10 verify stage and receipt verdict. |
36
36
  | Spec Checklist | loki-checklist-viewer.js (/api/checklist) | REWORK | Plans and traceability (plan.json, issue.json, receipt claims). |
37
37
  | Insights: logs | loki-log-stream.js (/api/logs) | KEEP | Streaming log inside the run thread (events.jsonl). |
38
38
  | Insights: memory, learnings, USAGE.md | loki-memory-browser.js, loki-learning-dashboard.js; build-standalone.js:1427-1590 | DROP now | Memory page deferred until a v10 memory read API exists (section 3.2). USAGE.md becomes a Help link. |
39
39
  | Analytics | loki-analytics.js (/api/activity) | REWORK | Home trends (runs per day, verified rate) from the runs table. |
40
- | Cost | loki-cost-dashboard.js, loki-cost-waterfall.js, dashboard/static/cost.html; spend-cap banner build-standalone.js:1800-1806 | KEEP on v10 data | Cost and usage page; the "no cap" banner is kept and fed by loki.yaml budgets. |
40
+ | Cost | loki-cost-dashboard.js, loki-cost-waterfall.js, legacy-ui-static/cost.html; spend-cap banner build-standalone.js:1800-1806 | KEEP on v10 data | Cost and usage page; the "no cap" banner is kept and fed by loki.yaml budgets. |
41
41
  | Notifications | loki-notification-center.js | REWORK | Derived from events: BLOCKED, FAILED, budget.hit, tampered, conflict. |
42
42
  | Escalations | loki-escalations.js | REWORK | BLOCKED inbox on Home plus the reply prompt in the thread. |
43
43
  | Migration | loki-migration-dashboard.js | REWORK | Runs filtered to `loki modernize` runs once they ship events (engine10/modernize); hidden until then. |
@@ -55,11 +55,11 @@ Shell: dashboard-ui/scripts/build-standalone.js (generates dashboard/static/inde
55
55
  | Budget banner | build-standalone.js:1200-1203 | KEEP | Top banner when a budget is hit (budget.hit event). |
56
56
  | Run manager, audit viewer | loki-run-manager.js, loki-audit-viewer.js | REWORK | Runs table actions; Audit log page (control-plane actions). |
57
57
  | API keys, tenant switcher, managed memory | loki-api-keys.js, loki-tenant-switcher.js, loki-managed-memory-panel.js | DROP | Local single user; the bearer token is set by env (src/server/auth.ts). |
58
- | Onboarding (start.html) | dashboard/static/start.html (/api/onboarding/*, /api/backlog/*) | REWORK | Integrations page (GitHub connect status) plus the composer empty state. |
58
+ | Onboarding (start.html) | legacy-ui-static/start.html (/api/onboarding/*, /api/backlog/*) | REWORK | Integrations page (GitHub connect status) plus the composer empty state. |
59
59
 
60
60
  ## 2. Design system (extracted, binding)
61
61
 
62
- Two legacy layers exist and disagree on ground colors. The SHELL layer in build-standalone.js:113-185 is documented as the founder-approved identity (light-grey ground, comment at :113) and is what users saw around every page; the COMPONENT layer in dashboard-ui/core/loki-unified-styles.js:20-146 (also loki-theme.js:44-124) supplies the scales, status colors and component specs. Decision: shell ground and accent per theme from the shell layer; scales, radii, shadows, model colors and component recipes from the component layer. (Open question 1.)
62
+ Two legacy layers exist and disagree on ground colors. The SHELL layer in build-standalone.js:113-185 is documented as the founder-approved identity (light-grey ground, comment at :113) and is what users saw around every page; the COMPONENT layer in legacy-ui/core/loki-unified-styles.js:20-146 (also loki-theme.js:44-124) supplies the scales, status colors and component specs. Decision: shell ground and accent per theme from the shell layer; scales, radii, shadows, model colors and component recipes from the component layer. (Open question 1.)
63
63
 
64
64
  Package: packages/control-plane/ui/src/design/ with tokens.css (custom properties below), fonts.css (Google Fonts link, build-standalone parity: Fraunces opsz 9..144 wght 400/500/600, Inter 300-700, JetBrains Mono 400/500; static/index.html:11), tailwind.preset.ts (maps Tailwind colors, radius, spacing, fontFamily to the vars, so existing Tailwind classes keep working), and primitives/*.tsx.
65
65
 
@@ -238,7 +238,7 @@ Method. Route list: FastAPI introspection of `dashboard.server.app` (the 234 ent
238
238
 
239
239
  Status values: EXISTS (the CP serves it today), PARTIAL (the shim maps it and says what differs), MISSING (a USED route the CP has no data or mechanism for), UNUSED (no consumer). Shim actions: map (answer from CP data), 308 to CP UI (HTML page), 410 with notice (UNUSED, retired), 501 not yet supported (USED but no CP data or mechanism: the shim answers an explicit 501, never a faked success), none (the CP already serves the path).
240
240
 
241
- Counts: map 6, 308 5, 501 77, 410 142, none 4; total 234.
241
+ Counts: map 35, 308 5, 501 21, 410 169, none 4; total 234. A 410 row with a non-empty CP column also names that replacement in the 410 body (CPE24-P6).
242
242
 
243
243
  Auth contract (never looser than legacy). Legacy `require_scope` is open when LOKI_ENTERPRISE_AUTH and OIDC are both off, and otherwise answers 401 without a token and 403 on a missing scope. Open in every mode: /health, /.well-known/agent.json, /api/enterprise/status, /api/auth/info, /api/providers/models, /metrics, the docs routes. The shim applies one rule to every route the legacy server guarded: if LOKI_CONTROL_TOKEN is set, require the CP bearer token (401 with www-authenticate otherwise); if no CP token is set but legacy enterprise auth or OIDC is enabled in the environment, fail closed with 401 (the CP has no way to check the legacy `loki_*` tokens); if neither is set, open, matching the legacy default. The CP token carries every scope, which is safe because the shim exposes only read routes and answers 501 or 410 for the rest. 501 and 410 answers are also behind the guard, so an unauthenticated caller learns nothing about a guarded route. The shim never binds a port; mounting it on the CP app keeps hostGuard and the loopback-only action routes exactly as they are.
244
244
 
@@ -260,11 +260,11 @@ First hit per process, each route logs one line: `legacy dashboard route <path>
260
260
  | GET `/docs` | none | none | UNUSED | 410 with notice |
261
261
  | GET `/docs/oauth2-redirect` | none | none | UNUSED | 410 with notice |
262
262
  | GET `/redoc` | none | none | UNUSED | 410 with notice |
263
- | POST `/api/v2/tenants` | sdk/python/loki_mode_sdk/client.py:204, sdk/typescript/src/client.ts:237 | none | MISSING | 501 not yet supported |
264
- | GET `/api/v2/tenants` | sdk/python/loki_mode_sdk/client.py:191, sdk/typescript/src/client.ts:225 | none | MISSING | 501 not yet supported |
265
- | GET `/api/v2/tenants/{tenant_id}` | sdk/typescript/src/client.ts:229 | none | MISSING | 501 not yet supported |
263
+ | POST `/api/v2/tenants` | sdk/python/loki_mode_sdk/client.py:204, sdk/typescript/src/client.ts:237 | no tenants: local single user | DROPPED (section 1) | 410 with notice |
264
+ | GET `/api/v2/tenants` | sdk/python/loki_mode_sdk/client.py:191, sdk/typescript/src/client.ts:225 | no tenants: local single user | DROPPED (section 1) | 410 with notice |
265
+ | GET `/api/v2/tenants/{tenant_id}` | sdk/typescript/src/client.ts:229 | no tenants: local single user | DROPPED (section 1) | 410 with notice |
266
266
  | PUT `/api/v2/tenants/{tenant_id}` | none | none | UNUSED | 410 with notice |
267
- | DELETE `/api/v2/tenants/{tenant_id}` | sdk/typescript/src/client.ts:241 | none | MISSING | 501 not yet supported |
267
+ | DELETE `/api/v2/tenants/{tenant_id}` | sdk/typescript/src/client.ts:241 | no tenants: local single user | DROPPED (section 1) | 410 with notice |
268
268
  | GET `/api/v2/tenants/{tenant_id}/projects` | none | none | UNUSED | 410 with notice |
269
269
  | POST `/api/v2/runs` | vscode-extension/media/loki-dashboard.js:9617 | none | MISSING | 501 not yet supported |
270
270
  | GET `/api/v2/runs` | sdk/python/loki_mode_sdk/client.py:220, sdk/typescript/src/client.ts:201 | /v1/runs | PARTIAL (ids are source:run strings, not ints; no project_id filter; status maps to running/completed; limit/offset map to limit/cursor) | map |
@@ -272,12 +272,12 @@ First hit per process, each route logs one line: `legacy dashboard route <path>
272
272
  | POST `/api/v2/runs/{run_id}/cancel` | sdk/python/loki_mode_sdk/client.py:233, sdk/typescript/src/client.ts:209, vscode-extension/media/loki-dashboard.js:9617 | none | MISSING | 501 not yet supported |
273
273
  | POST `/api/v2/runs/{run_id}/replay` | sdk/python/loki_mode_sdk/client.py:238, sdk/typescript/src/client.ts:213, vscode-extension/media/loki-dashboard.js:9617 | none | MISSING | 501 not yet supported |
274
274
  | GET `/api/v2/runs/{run_id}/timeline` | sdk/python/loki_mode_sdk/client.py:243, sdk/typescript/src/client.ts:217, vscode-extension/media/loki-dashboard.js:9255 | /v1/runs/:id (stages, events) | PARTIAL (phases are CP stages; events carry seq, ts, type, stage only) | map |
275
- | POST `/api/v2/api-keys` | sdk/python/loki_mode_sdk/client.py:263, sdk/typescript/src/client.ts:178, vscode-extension/media/loki-dashboard.js:10097 | none | MISSING | 501 not yet supported |
276
- | GET `/api/v2/api-keys` | sdk/python/loki_mode_sdk/client.py:253, sdk/typescript/src/client.ts:170 | none | MISSING | 501 not yet supported |
275
+ | POST `/api/v2/api-keys` | sdk/python/loki_mode_sdk/client.py:263, sdk/typescript/src/client.ts:178, vscode-extension/media/loki-dashboard.js:10097 | CP bearer token set by env (LOKI_CONTROL_TOKEN) | DROPPED (section 1) | 410 with notice |
276
+ | GET `/api/v2/api-keys` | sdk/python/loki_mode_sdk/client.py:253, sdk/typescript/src/client.ts:170 | CP bearer token set by env (LOKI_CONTROL_TOKEN) | DROPPED (section 1) | 410 with notice |
277
277
  | GET `/api/v2/api-keys/{identifier}` | none | none | UNUSED | 410 with notice |
278
278
  | PUT `/api/v2/api-keys/{identifier}` | none | none | UNUSED | 410 with notice |
279
- | DELETE `/api/v2/api-keys/{identifier}` | sdk/typescript/src/client.ts:190, vscode-extension/media/loki-dashboard.js:10097 | none | MISSING | 501 not yet supported |
280
- | POST `/api/v2/api-keys/{identifier}/rotate` | sdk/python/loki_mode_sdk/client.py:271, sdk/typescript/src/client.ts:186, vscode-extension/media/loki-dashboard.js:10097 | none | MISSING | 501 not yet supported |
279
+ | DELETE `/api/v2/api-keys/{identifier}` | sdk/typescript/src/client.ts:190, vscode-extension/media/loki-dashboard.js:10097 | CP bearer token set by env (LOKI_CONTROL_TOKEN) | DROPPED (section 1) | 410 with notice |
280
+ | POST `/api/v2/api-keys/{identifier}/rotate` | sdk/python/loki_mode_sdk/client.py:271, sdk/typescript/src/client.ts:186, vscode-extension/media/loki-dashboard.js:10097 | CP bearer token set by env (LOKI_CONTROL_TOKEN) | DROPPED (section 1) | 410 with notice |
281
281
  | GET `/api/v2/policies` | none | none | UNUSED | 410 with notice |
282
282
  | PUT `/api/v2/policies` | none | none | UNUSED | 410 with notice |
283
283
  | POST `/api/v2/policies/evaluate` | none | none | UNUSED | 410 with notice |
@@ -314,31 +314,31 @@ First hit per process, each route logs one line: `legacy dashboard route <path>
314
314
  | GET `/api/projects/{project_id}` | sdk/python/loki_mode_sdk/client.py:174, sdk/typescript/src/client.ts:131 | none | MISSING | 501 not yet supported |
315
315
  | PUT `/api/projects/{project_id}` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
316
316
  | DELETE `/api/projects/{project_id}` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
317
- | GET `/api/tasks` | sdk/python/loki_mode_sdk/tasks.py:30, sdk/typescript/src/client.ts:150 | none | MISSING | 501 not yet supported |
318
- | POST `/api/tasks` | sdk/python/loki_mode_sdk/tasks.py:56, sdk/typescript/src/client.ts:162, vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
319
- | GET `/api/tasks/{task_id}` | sdk/python/loki_mode_sdk/tasks.py:38, sdk/typescript/src/client.ts:154, vscode-extension/src/views/dashboardWebview.ts:168 | none | MISSING | 501 not yet supported |
320
- | PUT `/api/tasks/{task_id}` | sdk/python/loki_mode_sdk/tasks.py:71, vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
321
- | DELETE `/api/tasks/{task_id}` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
322
- | POST `/api/tasks/{task_id}/move` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
323
- | WS `/ws` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
317
+ | GET `/api/tasks` | sdk/python/loki_mode_sdk/tasks.py:30, sdk/typescript/src/client.ts:150 | /v1/tasks (CPE24-P3) | PARTIAL (reads the same .loki source; legacy SQLite memory backend not read; unmeasured values are null) | map |
318
+ | POST `/api/tasks` | sdk/python/loki_mode_sdk/tasks.py:56, sdk/typescript/src/client.ts:162, vscode-extension/media/loki-dashboard.js:496 | no v10 task queue; read-only GET /v1/tasks | DROPPED (section 1) | 410 with notice |
319
+ | GET `/api/tasks/{task_id}` | sdk/python/loki_mode_sdk/tasks.py:38, sdk/typescript/src/client.ts:154, vscode-extension/src/views/dashboardWebview.ts:168 | no v10 task queue; read-only GET /v1/tasks | DROPPED (section 1) | 410 with notice |
320
+ | PUT `/api/tasks/{task_id}` | sdk/python/loki_mode_sdk/tasks.py:71, vscode-extension/media/loki-dashboard.js:496 | no v10 task queue; read-only GET /v1/tasks | DROPPED (section 1) | 410 with notice |
321
+ | DELETE `/api/tasks/{task_id}` | vscode-extension/media/loki-dashboard.js:496 | no v10 task queue; read-only GET /v1/tasks | DROPPED (section 1) | 410 with notice |
322
+ | POST `/api/tasks/{task_id}/move` | vscode-extension/media/loki-dashboard.js:496 | no v10 task queue; read-only GET /v1/tasks | DROPPED (section 1) | 410 with notice |
323
+ | WS `/ws` | vscode-extension/media/loki-dashboard.js:496 | SSE at GET /v1/stream | DROPPED (section 1) | 410 with notice |
324
324
  | GET `/api/registry/projects` | none | none | UNUSED | 410 with notice |
325
- | POST `/api/registry/projects` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
325
+ | POST `/api/registry/projects` | vscode-extension/media/loki-dashboard.js:496 | repos are discovered locally; GET /v1/repos | DROPPED (section 1) | 410 with notice |
326
326
  | GET `/api/registry/projects/{identifier}` | none | none | UNUSED | 410 with notice |
327
327
  | DELETE `/api/registry/projects/{identifier}` | none | none | UNUSED | 410 with notice |
328
328
  | GET `/api/registry/projects/{identifier}/health` | none | none | UNUSED | 410 with notice |
329
329
  | POST `/api/registry/projects/{identifier}/access` | none | none | UNUSED | 410 with notice |
330
330
  | GET `/api/registry/discover` | none | none | UNUSED | 410 with notice |
331
- | POST `/api/registry/sync` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
331
+ | POST `/api/registry/sync` | vscode-extension/media/loki-dashboard.js:496 | repos are discovered locally; GET /v1/repos | DROPPED (section 1) | 410 with notice |
332
332
  | GET `/api/registry/tasks` | none | none | UNUSED | 410 with notice |
333
333
  | GET `/api/registry/learnings` | none | none | UNUSED | 410 with notice |
334
334
  | GET `/api/fleet/runs` | tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4706 (test), tests/moat/p7-no-fabricated-data.sh:4710 (test) (+1) | /v1/fleet/runs (CPE24-P1) | PARTIAL (reads the same .loki or registry source; unmeasured values are null with a not-measured marker) | map |
335
335
  | GET `/api/fleet/summary` | tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4695 (test), tests/moat/p7-no-fabricated-data.sh:4696 (test) (+1) | /v1/fleet/summary (CPE24-P1) | PARTIAL (reads the same .loki or registry source; unmeasured values are null with a not-measured marker) | map |
336
336
  | GET `/api/fleet/runs/{identifier}` | none | none | UNUSED | 410 with notice |
337
- | POST `/api/focus` | autonomy/run.sh:24831, web-app/server.py:2744 | none | MISSING | 501 not yet supported |
337
+ | POST `/api/focus` | autonomy/run.sh:24831, web-app/server.py:2744 | /v1/focus (CPE24-P3) | PARTIAL (focus only to this checkout or a registered project; loopback, JSON, same-origin) | map |
338
338
  | GET `/api/focus` | none | none | UNUSED | 410 with notice |
339
339
  | DELETE `/api/focus` | none | none | UNUSED | 410 with notice |
340
340
  | GET `/api/session/model` | none | none | UNUSED | 410 with notice |
341
- | POST `/api/session/model` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
341
+ | POST `/api/session/model` | vscode-extension/media/loki-dashboard.js:496 | no mid-run model switch; start a new run with another model (POST /v1/runs) | DROPPED (section 1) | 410 with notice |
342
342
  | GET `/api/running-projects` | none | none | UNUSED | 410 with notice |
343
343
  | POST `/api/control/start` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:257, vscode-extension/src/extension.ts:580 | none | MISSING | 501 not yet supported |
344
344
  | GET `/api/control/builds/{execution_id}` | none | none | UNUSED | 410 with notice |
@@ -352,19 +352,19 @@ First hit per process, each route logs one line: `legacy dashboard route <path>
352
352
  | POST `/api/enterprise/tokens` | none | none | UNUSED | 410 with notice |
353
353
  | GET `/api/enterprise/tokens` | none | none | UNUSED | 410 with notice |
354
354
  | DELETE `/api/enterprise/tokens/{identifier}` | none | none | UNUSED | 410 with notice |
355
- | GET `/api/enterprise/audit` | none | none | UNUSED | 410 with notice |
356
- | GET `/api/enterprise/audit/summary` | none | none | UNUSED | 410 with notice |
355
+ | GET `/api/enterprise/audit` | none | /v1/audit (CPE24-P2) | PARTIAL (read-only; the operator audit table, no hash chain access) | map |
356
+ | GET `/api/enterprise/audit/summary` | none | /v1/audit/summary (CPE24-P2) | PARTIAL (read-only; success, failure and resource-type counts are null, not measured) | map |
357
357
  | GET `/api/compliance` | none | none | UNUSED | 410 with notice |
358
358
  | GET `/api/memory/summary` | none | none | UNUSED | 410 with notice |
359
- | GET `/api/memory/episodes` | vscode-extension/src/views/memoryViewProvider.ts:152 | none | MISSING | 501 not yet supported |
360
- | GET `/api/memory/episodes/{episode_id}` | vscode-extension/src/views/dashboardWebview.ts:204, vscode-extension/src/views/memoryViewProvider.ts:215 | none | MISSING | 501 not yet supported |
361
- | GET `/api/memory/patterns` | vscode-extension/src/views/memoryViewProvider.ts:151 | none | MISSING | 501 not yet supported |
362
- | GET `/api/memory/patterns/{pattern_id}` | vscode-extension/src/views/dashboardWebview.ts:186, vscode-extension/src/views/memoryViewProvider.ts:197 | none | MISSING | 501 not yet supported |
363
- | GET `/api/memory/skills` | vscode-extension/src/views/memoryViewProvider.ts:153 | none | MISSING | 501 not yet supported |
359
+ | GET `/api/memory/episodes` | vscode-extension/src/views/memoryViewProvider.ts:152 | /v1/memory/episodes (CPE24-P3) | PARTIAL (reads the same .loki source; legacy SQLite memory backend not read; unmeasured values are null) | map |
360
+ | GET `/api/memory/episodes/{episode_id}` | vscode-extension/src/views/dashboardWebview.ts:204, vscode-extension/src/views/memoryViewProvider.ts:215 | /v1/memory/episodes/{id} (CPE24-P3) | PARTIAL (reads the same .loki source; legacy SQLite memory backend not read; unmeasured values are null) | map |
361
+ | GET `/api/memory/patterns` | vscode-extension/src/views/memoryViewProvider.ts:151 | /v1/memory/patterns (CPE24-P3) | PARTIAL (reads the same .loki source; legacy SQLite memory backend not read; unmeasured values are null) | map |
362
+ | GET `/api/memory/patterns/{pattern_id}` | vscode-extension/src/views/dashboardWebview.ts:186, vscode-extension/src/views/memoryViewProvider.ts:197 | /v1/memory/patterns/{id} (CPE24-P3) | PARTIAL (reads the same .loki source; legacy SQLite memory backend not read; unmeasured values are null) | map |
363
+ | GET `/api/memory/skills` | vscode-extension/src/views/memoryViewProvider.ts:153 | /v1/memory/skills (CPE24-P3) | PARTIAL (reads the same .loki source; legacy SQLite memory backend not read; unmeasured values are null) | map |
364
364
  | GET `/api/memory/skills/{skill_id}` | none | none | UNUSED | 410 with notice |
365
- | GET `/api/memory/economics` | tests/moat/p7-no-fabricated-data.sh:4638 (test), tests/moat/p7-no-fabricated-data.sh:4749 (test), tests/moat/p7-no-fabricated-data.sh:4750 (test) (+2) | none | MISSING | 501 not yet supported |
366
- | POST `/api/memory/consolidate` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
367
- | POST `/api/memory/retrieve` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
365
+ | GET `/api/memory/economics` | tests/moat/p7-no-fabricated-data.sh:4638 (test), tests/moat/p7-no-fabricated-data.sh:4749 (test), tests/moat/p7-no-fabricated-data.sh:4750 (test) (+2) | /v1/memory/economics (CPE24-P3) | PARTIAL (reads the same .loki source; legacy SQLite memory backend not read; unmeasured values are null) | map |
366
+ | POST `/api/memory/consolidate` | vscode-extension/media/loki-dashboard.js:496 | read-only GET /v1/memory/* | DROPPED (section 1) | 410 with notice |
367
+ | POST `/api/memory/retrieve` | vscode-extension/media/loki-dashboard.js:496 | read-only GET /v1/memory/* | DROPPED (section 1) | 410 with notice |
368
368
  | GET `/api/memory/index` | none | none | UNUSED | 410 with notice |
369
369
  | GET `/api/memory/timeline` | none | none | UNUSED | 410 with notice |
370
370
  | GET `/api/memory/files` | none | none | UNUSED | 410 with notice |
@@ -375,41 +375,41 @@ First hit per process, each route logs one line: `legacy dashboard route <path>
375
375
  | GET `/api/learning/trends` | none | none | UNUSED | 410 with notice |
376
376
  | GET `/api/learning/signals` | none | none | UNUSED | 410 with notice |
377
377
  | GET `/api/learning/aggregation` | none | none | UNUSED | 410 with notice |
378
- | POST `/api/learning/aggregate` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
378
+ | POST `/api/learning/aggregate` | vscode-extension/media/loki-dashboard.js:496 | read-only GET /v1/memory/patterns | DROPPED (section 1) | 410 with notice |
379
379
  | GET `/api/learning/preferences` | none | none | UNUSED | 410 with notice |
380
380
  | GET `/api/learning/errors` | none | none | UNUSED | 410 with notice |
381
381
  | GET `/api/learning/success` | none | none | UNUSED | 410 with notice |
382
382
  | GET `/api/learning/tools` | none | none | UNUSED | 410 with notice |
383
- | POST `/api/control/pause` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:277, vscode-extension/src/extension.ts:703 | none | MISSING | 501 not yet supported |
384
- | POST `/api/control/resume` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:285, vscode-extension/src/extension.ts:743 | none | MISSING | 501 not yet supported |
385
- | POST `/api/control/stop` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:269, vscode-extension/src/extension.ts:651 | none | MISSING | 501 not yet supported |
383
+ | POST `/api/control/pause` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:277, vscode-extension/src/extension.ts:703 | /v1/control/pause (CPE24-P4) | PARTIAL (writes only the .loki signal file run.sh reads; no process is signalled; same-origin plus loopback or CP token required) | map |
384
+ | POST `/api/control/resume` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:285, vscode-extension/src/extension.ts:743 | /v1/control/resume (CPE24-P4) | PARTIAL (writes only the .loki signal file run.sh reads; no process is signalled; same-origin plus loopback or CP token required) | map |
385
+ | POST `/api/control/stop` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:269, vscode-extension/src/extension.ts:651 | /v1/control/stop (CPE24-P4) | PARTIAL (writes only the .loki signal file run.sh reads; no process is signalled; same-origin plus loopback or CP token required) | map |
386
386
  | GET `/api/cost` | tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4646 (test), tests/moat/p7-no-fabricated-data.sh:4647 (test) (+3) | /v1/cost/snapshot (CPE24-P1) | PARTIAL (reads the same .loki or registry source; unmeasured values are null with a not-measured marker) | map |
387
387
  | GET `/api/budget` | tests/e2e/dashboard-evidence-panels.mjs:73 (test), tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4650 (test) (+3) | none | MISSING | 501 not yet supported |
388
388
  | GET `/api/cost/timeline` | tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4652 (test), tests/moat/p7-no-fabricated-data.sh:4653 (test) (+15) | /v1/cost/timeline (CPE24-P1) | PARTIAL (reads the same .loki or registry source; unmeasured values are null with a not-measured marker) | map |
389
389
  | GET `/api/trust/trajectory` | none | none | UNUSED | 410 with notice |
390
390
  | GET `/api/gate-policy` | none | none | UNUSED | 410 with notice |
391
391
  | GET `/api/pricing` | none | none | UNUSED | 410 with notice |
392
- | GET `/api/council/state` | none | none | UNUSED | 410 with notice |
393
- | GET `/api/council/verdicts` | none | none | UNUSED | 410 with notice |
394
- | GET `/api/council/convergence` | none | none | UNUSED | 410 with notice |
395
- | GET `/api/council/report` | none | none | UNUSED | 410 with notice |
396
- | POST `/api/council/force-review` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/media/loki-dashboard.js:4312 | none | MISSING | 501 not yet supported |
397
- | GET `/api/council/transcripts` | vscode-extension/media/loki-dashboard.js:12426 | none | MISSING | 501 not yet supported |
392
+ | GET `/api/council/state` | none | /v1/council/state (CPE24-P4) | PARTIAL (reads the same .loki/council files; read-only) | map |
393
+ | GET `/api/council/verdicts` | none | /v1/council/verdicts (CPE24-P4) | PARTIAL (reads the same .loki/council files; read-only) | map |
394
+ | GET `/api/council/convergence` | none | /v1/council/convergence (CPE24-P4) | PARTIAL (reads the same .loki/council files; read-only) | map |
395
+ | GET `/api/council/report` | none | /v1/council/report (CPE24-P4) | PARTIAL (reads the same .loki/council files; read-only) | map |
396
+ | POST `/api/council/force-review` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/media/loki-dashboard.js:4312 | /v1/control/council-review (CPE24-P4) | PARTIAL (writes only the .loki signal file run.sh reads; no process is signalled; same-origin plus loopback or CP token required) | map |
397
+ | GET `/api/council/transcripts` | vscode-extension/media/loki-dashboard.js:12426 | /v1/council/transcripts (CPE24-P4) | PARTIAL (reads the same .loki/council files; read-only) | map |
398
398
  | GET `/api/council/transcripts/{iteration_id}` | none | none | UNUSED | 410 with notice |
399
- | GET `/api/context` | tests/moat/p7-no-fabricated-data.sh:4638 (test), tests/moat/p7-no-fabricated-data.sh:4745 (test), tests/moat/p7-no-fabricated-data.sh:4746 (test) (+3) | none | MISSING | 501 not yet supported |
399
+ | GET `/api/context` | tests/moat/p7-no-fabricated-data.sh:4638 (test), tests/moat/p7-no-fabricated-data.sh:4745 (test), tests/moat/p7-no-fabricated-data.sh:4746 (test) (+3) | /v1/context (CPE24-P3) | PARTIAL (reads the same .loki source; legacy SQLite memory backend not read; unmeasured values are null) | map |
400
400
  | GET `/api/notifications` | none | none | UNUSED | 410 with notice |
401
401
  | GET `/api/notifications/triggers` | none | none | UNUSED | 410 with notice |
402
- | PUT `/api/notifications/triggers` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/media/loki-dashboard.js:6802 | none | MISSING | 501 not yet supported |
402
+ | PUT `/api/notifications/triggers` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/media/loki-dashboard.js:6802 | GET /v1/notifications (derived from events) | DROPPED (section 1) | 410 with notice |
403
403
  | POST `/api/notifications/{notification_id}/acknowledge` | none | none | UNUSED | 410 with notice |
404
404
  | POST `/api/notifications/{notification_id}/unacknowledge` | none | none | UNUSED | 410 with notice |
405
- | GET `/api/checkpoints` | vscode-extension/src/views/checkpointProvider.ts:108, vscode-extension/src/views/checkpointProvider.ts:134 | none | MISSING | 501 not yet supported |
406
- | GET `/api/checkpoints/{checkpoint_id}` | none | none | UNUSED | 410 with notice |
407
- | POST `/api/checkpoints` | vscode-extension/media/loki-dashboard.js:5960 | none | MISSING | 501 not yet supported |
408
- | POST `/api/checkpoints/{checkpoint_id}/rollback` | vscode-extension/media/loki-dashboard.js:5960 | none | MISSING | 501 not yet supported |
405
+ | GET `/api/checkpoints` | vscode-extension/src/views/checkpointProvider.ts:108, vscode-extension/src/views/checkpointProvider.ts:134 | /v1/checkpoints (CPE24-P2) | PARTIAL (reads the same .loki/state/checkpoints store; unmeasured values are null) | map |
406
+ | GET `/api/checkpoints/{checkpoint_id}` | none | /v1/checkpoints/{id} (CPE24-P2) | PARTIAL (reads the same .loki/state/checkpoints store; unmeasured values are null) | map |
407
+ | POST `/api/checkpoints` | vscode-extension/media/loki-dashboard.js:5960 | /v1/checkpoints (CPE24-P2) | PARTIAL (loopback peer, loopback Host and JSON required; audited) | map |
408
+ | POST `/api/checkpoints/{checkpoint_id}/rollback` | vscode-extension/media/loki-dashboard.js:5960 | /v1/checkpoints/{id}/rollback (CPE24-P2) | PARTIAL (loopback peer, loopback Host and JSON required; forced pre-rollback snapshot; audited) | map |
409
409
  | GET `/api/agents` | none | none | UNUSED | 410 with notice |
410
- | POST `/api/agents/{agent_id}/kill` | vscode-extension/media/loki-dashboard.js:4312 | none | MISSING | 501 not yet supported |
411
- | POST `/api/agents/{agent_id}/pause` | vscode-extension/media/loki-dashboard.js:4312 | none | MISSING | 501 not yet supported |
412
- | POST `/api/agents/{agent_id}/resume` | vscode-extension/media/loki-dashboard.js:4312 | none | MISSING | 501 not yet supported |
410
+ | POST `/api/agents/{agent_id}/kill` | vscode-extension/media/loki-dashboard.js:4312 | POST /v1/control/stop | DROPPED (section 1) | 410 with notice |
411
+ | POST `/api/agents/{agent_id}/pause` | vscode-extension/media/loki-dashboard.js:4312 | POST /v1/control/stop (v10 has no pause) | DROPPED (section 1) | 410 with notice |
412
+ | POST `/api/agents/{agent_id}/resume` | vscode-extension/media/loki-dashboard.js:4312 | POST /v1/control/resume | DROPPED (section 1) | 410 with notice |
413
413
  | GET `/api/logs` | none | none | UNUSED | 410 with notice |
414
414
  | POST `/api/collab/join` | none | none | UNUSED | 410 with notice |
415
415
  | POST `/api/collab/leave` | none | none | UNUSED | 410 with notice |
@@ -438,19 +438,19 @@ First hit per process, each route logs one line: `legacy dashboard route <path>
438
438
  | GET `/api/checklist/summary` | none | none | UNUSED | 410 with notice |
439
439
  | GET `/api/prd-observations` | none | none | UNUSED | 410 with notice |
440
440
  | GET `/api/checklist/waivers` | none | none | UNUSED | 410 with notice |
441
- | POST `/api/checklist/waivers` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
442
- | DELETE `/api/checklist/waivers/{item_id}` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
441
+ | POST `/api/checklist/waivers` | vscode-extension/media/loki-dashboard.js:496 | plan.json and receipt claims in GET /v1/runs/:id | DROPPED (section 1) | 410 with notice |
442
+ | DELETE `/api/checklist/waivers/{item_id}` | vscode-extension/media/loki-dashboard.js:496 | plan.json and receipt claims in GET /v1/runs/:id | DROPPED (section 1) | 410 with notice |
443
443
  | GET `/api/council/gate` | tests/moat/p7-no-fabricated-data.sh:4638 (test), tests/moat/p7-no-fabricated-data.sh:4760 (test), tests/moat/p7-no-fabricated-data.sh:4762 (test) (+1) | none | MISSING | 501 not yet supported |
444
444
  | GET `/api/app-runner/status` | none | none | UNUSED | 410 with notice |
445
445
  | GET `/api/app-runner/logs` | none | none | UNUSED | 410 with notice |
446
446
  | GET `/api/app-runner/errors` | none | none | UNUSED | 410 with notice |
447
- | POST `/api/control/app-restart` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
448
- | POST `/api/control/app-stop` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
447
+ | POST `/api/control/app-restart` | vscode-extension/media/loki-dashboard.js:496 | evidence in GET /v1/runs/:source/:run/artifact/* | DROPPED (section 1) | 410 with notice |
448
+ | POST `/api/control/app-stop` | vscode-extension/media/loki-dashboard.js:496 | evidence in GET /v1/runs/:source/:run/artifact/* | DROPPED (section 1) | 410 with notice |
449
449
  | GET `/api/playwright/results` | none | none | UNUSED | 410 with notice |
450
450
  | GET `/api/playwright/screenshot` | none | none | UNUSED | 410 with notice |
451
451
  | GET `/api/failures` | none | none | UNUSED | 410 with notice |
452
452
  | GET `/api/prompt-versions` | none | none | UNUSED | 410 with notice |
453
- | POST `/api/prompt-optimize` | autonomy/loki:17793, vscode-extension/media/loki-dashboard.js:7581 | none | MISSING | 501 not yet supported |
453
+ | POST `/api/prompt-optimize` | autonomy/loki:17793, vscode-extension/media/loki-dashboard.js:7581 | verify stage: POST /v1/runs/:source/:run/verify | DROPPED (section 1) | 410 with notice |
454
454
  | MOUNT `/assets` | none | UI static assets | EXISTS (vite output under ui/dist/assets) | none (CP UI serves it) |
455
455
  | GET `/api/activity` | vscode-extension/media/loki-dashboard.js:8596 | none | MISSING | 501 not yet supported |
456
456
  | GET `/api/session-diff` | none | none | UNUSED | 410 with notice |
@@ -461,8 +461,8 @@ First hit per process, each route logs one line: `legacy dashboard route <path>
461
461
  | GET `/` | none | CP UI (/) | EXISTS | 308 to CP UI |
462
462
  | GET `/api/quality-score` | none | none | UNUSED | 410 with notice |
463
463
  | GET `/api/quality-score/history` | none | none | UNUSED | 410 with notice |
464
- | POST `/api/quality-scan` | autonomy/loki:23927, vscode-extension/media/loki-dashboard.js:7832 | none | MISSING | 501 not yet supported |
465
- | GET `/api/quality-report` | autonomy/loki:23994 | none | MISSING | 501 not yet supported |
464
+ | POST `/api/quality-scan` | autonomy/loki:23927, vscode-extension/media/loki-dashboard.js:7832 | verify stage: POST /v1/runs/:source/:run/verify | DROPPED (section 1) | 410 with notice |
465
+ | GET `/api/quality-report` | autonomy/loki:23994 | verify stage: POST /v1/runs/:source/:run/verify | DROPPED (section 1) | 410 with notice |
466
466
  | GET `/api/migration/list` | vscode-extension/media/loki-dashboard.js:8173 | none | MISSING | 501 not yet supported |
467
467
  | POST `/api/migration/start` | none | none | UNUSED | 410 with notice |
468
468
  | GET `/api/migration/{migration_id}/status` | vscode-extension/media/loki-dashboard.js:8173 | none | MISSING | 501 not yet supported |
@@ -471,8 +471,8 @@ First hit per process, each route logs one line: `legacy dashboard route <path>
471
471
  | GET `/api/migration/{migration_id}/seams` | none | none | UNUSED | 410 with notice |
472
472
  | POST `/api/migration/{migration_id}/advance` | none | none | UNUSED | 410 with notice |
473
473
  | POST `/api/migration/{migration_id}/start-phase` | none | none | UNUSED | 410 with notice |
474
- | GET `/api/managed/events` | vscode-extension/media/loki-dashboard.js:11965 | none | MISSING | 501 not yet supported |
475
- | GET `/api/managed/status` | tests/integration/test_dashboard_api_smoke.sh:105 (test), tests/integration/test_dashboard_api_smoke.sh:106 (test), vscode-extension/media/loki-dashboard.js:11965 | none | MISSING | 501 not yet supported |
474
+ | GET `/api/managed/events` | vscode-extension/media/loki-dashboard.js:11965 | managed memory dropped; GET /v1/runs/:source/:run/events | DROPPED (section 1) | 410 with notice |
475
+ | GET `/api/managed/status` | tests/integration/test_dashboard_api_smoke.sh:105 (test), tests/integration/test_dashboard_api_smoke.sh:106 (test), vscode-extension/media/loki-dashboard.js:11965 | managed memory dropped; GET /v1/runs | DROPPED (section 1) | 410 with notice |
476
476
  | GET `/api/managed/memory_versions/{memory_id}` | none | none | UNUSED | 410 with notice |
477
477
  | GET `/api/findings/{iteration}` | none | none | UNUSED | 410 with notice |
478
478
  | GET `/api/quality/architecture` | none | none | UNUSED | 410 with notice |
@@ -488,7 +488,7 @@ First hit per process, each route logs one line: `legacy dashboard route <path>
488
488
  | GET `/api/spec/history` | none | none | UNUSED | 410 with notice |
489
489
  | GET `/api/wiki` | none | none | UNUSED | 410 with notice |
490
490
  | GET `/api/wiki/{section}` | none | none | UNUSED | 410 with notice |
491
- | POST `/api/wiki/ask` | vscode-extension/media/loki-dashboard.js:12595 | none | MISSING | 501 not yet supported |
491
+ | POST `/api/wiki/ask` | vscode-extension/media/loki-dashboard.js:12595 | wiki deleted; no replacement | DROPPED (section 1) | 410 with notice |
492
492
  | GET `/{full_path:path}` | none | SPA fallback | EXISTS (CP app.get("*") serves the SPA and 404s missing assets) | none (CP UI serves it) |
493
493
 
494
494
  ### 5.3 Notes for the deletion gate
@@ -527,7 +527,7 @@ Rules: one writer per file; UI pages register through ui/src/pages/registry.ts a
527
527
  | CPE-21 | Notifications and Audit log: derived notifications, actions view | src/server/routes/notify.ts, src/server/routes/audit.ts, ui/src/pages/notifications/**, ui/src/pages/audit/**, test/server/notify.test.ts | `bun test test/server/notify.test.ts` | 03 | LOW |
528
528
  | CPE-22 | Cmd+K palette, global search, shortcuts (Cmd+Enter, Cmd+N, Cmd+Shift+D, Esc) | ui/src/palette/**, test/ui/palette.test.tsx | `bun test test/ui/palette.test.tsx` | 02 | LOW |
529
529
  | CPE-23 | Accessibility, mobile and visual parity: axe, keyboard path, 375 px layout, light and dark screenshot comparison to legacy captures | test/e2e/cp-ui.spec.ts, test/e2e/legacy-baseline/**, ui/playwright.config.ts | `bunx playwright test test/e2e/cp-ui.spec.ts` (headless, LOKI_NO_BROWSER=1) | 06, 08, 12 | MEDIUM |
530
- | CPE-24 | Delete legacy dashboard at parity: dashboard-ui/, dashboard/static/, legacy server routes, their tests and package entries | dashboard-ui/**, dashboard/static/**, dashboard/server.py (UI routes), package.json files list, tests naming them | section 5 checklist all green plus `bash scripts/local-ci.sh` | all, section 5 | MEDIUM |
530
+ | CPE-24 | Delete legacy dashboard at parity: legacy-ui/, legacy-ui-static/, legacy server routes, their tests and package entries | legacy-ui/**, legacy-ui-static/**, dashboard/server.py (UI routes), package.json files list, tests naming them | section 5 checklist all green plus `bash scripts/local-ci.sh` | all, section 5 | MEDIUM |
531
531
 
532
532
  Parallelism: CPE-01 and CPE-03 start at once; after them up to 12 builders run in parallel (04, 05, 07, 09, 11, 12, 13, 14, 15, 18, 21, 22). HIGH slices (04, 07, 09, 14) carry the security review the founder asked for.
533
533
 
@@ -98,7 +98,7 @@ Failure modes:
98
98
  | B11 | PR comment with the integration result, via the existing gh token path (no LLM in the step) | autonomy/lib/workspace_comment.py, tests/workspace/80-comment.sh | stub gh receives one comment per PR; the token appears in no log or argv | MEDIUM |
99
99
  | B12 | CLI `loki workspace` subcommand (list, show, run, status, clean) | autonomy/loki, tests/workspace/90-cli.sh | flag off: the command says it is disabled; `clean` never removes a worktree whose branch has an open PR | MEDIUM |
100
100
  | B13 | Dashboard endpoints reading group.json; run launches a detached runner | dashboard/api_workspaces.py, dashboard/server.py, tests/dashboard/test_api_workspaces.py | the group survives an app restart; non-loopback Host gets 403; control scope required for run | HIGH |
101
- | B14 | Dashboard group card (per-repo rows, integration row, stale-evidence badge) | dashboard/static/start.html | Playwright: a fixture group renders 2 repo rows plus integration; a mismatched head SHA shows stale | LOW |
101
+ | B14 | Dashboard group card (per-repo rows, integration row, stale-evidence badge) | legacy-ui-static/start.html | Playwright: a fixture group renders 2 repo rows plus integration; a mismatched head SHA shows stale | LOW |
102
102
  | B15 | 10x metric: PRs per wall-clock hour and per attention minute from group.json timestamps | autonomy/lib/workspace_metrics.py, tests/workspace/95-metrics.sh | a fixture group gives the hand-computed rate; unmeasured runs are reported, not counted as zero | LOW |
103
103
  | B16 | Docs plus flag flip after the whole-feature Wall: a 2-repo fixture (lib and app) ends with 2 PRs and integration passed | docs/WORKSPACES.md, tests/workspace/99-e2e.sh | the e2e part passes on CI with the stub provider; one real run is recorded in METRICS.md | MEDIUM |
104
104
 
@@ -451,18 +451,18 @@ Loki's definition: "autonomous software factory that runs with the knowledge of
451
451
  4. Order: P0 first-run bugs, first run end to end with a recorded demo, PR body and cost cap, D51 Phase B, D51 Phase C. D50 continues only where it raises completion or merge rate. Every release note leads with the user-visible v1 change.
452
452
 
453
453
  ## D55 (CTO, 2026-10-01; reversible via repo variable LOKI_E160_REUSE=0): a push to main reuses a train's verdict for the identical SHA
454
- 1. Rule (E-160, scripts/ci/train-verdict-reuse.sh). A push to refs/heads/main skips the heavy jobs only when ALL hold: LOKI_E160_REUSE is not 0; the workflow-runs listing for the SHA has total_count of 100 or less; among completed push runs of the same workflow file, other than this run, whose head_branch starts with train/, there is at least one success and no failure, timed_out or startup_failure (cancelled, skipped and neutral count for nothing); and, for Tests only, BEFORE is not all zeros and the BEFORE...SHA compare succeeded, lists fewer than 300 files and touches none of loki-ts/bun.lock, requirements-test.txt, dashboard-ui/package-lock.json. Any parse or API error means reuse=false and the full suite runs. The newest success by created_at is recorded (run id, attempt, branch) in the step summary and a notice; attempts above 1 are accepted.
454
+ 1. Rule (E-160, scripts/ci/train-verdict-reuse.sh). A push to refs/heads/main skips the heavy jobs only when ALL hold: LOKI_E160_REUSE is not 0; the workflow-runs listing for the SHA has total_count of 100 or less; among completed push runs of the same workflow file, other than this run, whose head_branch starts with train/, there is at least one success and no failure, timed_out or startup_failure (cancelled, skipped and neutral count for nothing); and, for Tests only, BEFORE is not all zeros and the BEFORE...SHA compare succeeded, lists fewer than 300 files and touches none of loki-ts/bun.lock, requirements-test.txt, legacy-ui/package-lock.json. Any parse or API error means reuse=false and the full suite runs. The newest success by created_at is recorded (run id, attempt, branch) in the step summary and a notice; attempts above 1 are accepted.
455
455
  2. Wiring. test.yml: the version-bump-gate skip output is true when either the S-132 gate or the reuse step says so. bun-parity, coverage, first-run-gate and security-audit get a first job train-reuse; every other job needs it and runs under `!cancelled() && needs.train-reuse.outputs.reuse != 'true'`. security-audit sast (CodeQL) is never gated: it always runs on main. coverage and first-run-gate take test.yml's concurrency block (per-ref with cancel for pull_request and train/**, per-SHA without cancel on main).
456
456
  3. Rationale: D28 and D46 item 4 (same SHA means same tree means same workflow YAML). required-ci, train-cycle, the pulse and the version-bump gate already read the train run by head_sha, so no gate gains new trust. Dependency lockfiles are excluded because a fast-forward from an older main can change resolved dependencies that the train run did not see.
457
457
  ## D56 (founder, relayed 15:40Z; numbered D56 because D55 is the E-160 CTO ruling): the Loki Control Plane replaces the dashboards
458
- 1. One service plus one UI, `loki control`, replaces dashboard/, dashboard-ui/ and engine10/dashboard. It runs locally with zero config or is deployed once for many runs. It is stateless and horizontally scalable, keeps all state in a DB (SQLite locally, Postgres via DATABASE_URL), and is self-healing (/health, /ready, migrations on boot, spool replay, CLI restart of a dead local instance, k8s probes, version-checked reuse).
458
+ 1. One service plus one UI, `loki control`, replaces dashboard/, legacy-ui/ and engine10/dashboard. It runs locally with zero config or is deployed once for many runs. It is stateless and horizontally scalable, keeps all state in a DB (SQLite locally, Postgres via DATABASE_URL), and is self-healing (/health, /ready, migrations on boot, spool replay, CLI restart of a dead local instance, k8s probes, version-checked reuse).
459
459
  2. Stack: TypeScript on Bun with Hono and Drizzle; React, Vite and Tailwind built into static assets served by the same service; one container image.
460
460
  3. Ingest: engine10 ships batched events with idempotent ids to LOKI_CONTROL_URL, with retry; the run's own events.jsonl is the spool. `loki control backfill` imports existing runs.
461
461
  4. Every number comes from ingested events; no placeholders or invented data; an empty panel says so. Localhost-only by default, token auth when bound non-local, no secrets in events.
462
462
  5. Built in packages/control-plane/ behind LOKI_CONTROL=1 until it passes its acceptance tests (real runs in, correct counts out), then the default flips and the old UIs are deleted. v0 (service, SQLite, ingest, shipper, Runs list and detail) ships on D46 trains first; the other views follow train by train.
463
463
  6. Design: docs/v10/CONTROL-PLANE.md (architect slice in progress). Old-dashboard bug work is retired, except the P0 that shipped in 10.5.34.
464
464
  ## D55 (CTO, 2026-10-01; reversible via repo variable LOKI_E160_REUSE=0): a push to main reuses a train's verdict for the identical SHA
465
- 1. Rule (E-160, scripts/ci/train-verdict-reuse.sh). A push to refs/heads/main skips the heavy jobs only when ALL hold: LOKI_E160_REUSE is not 0; the workflow-runs listing for the SHA has total_count of 100 or less; among completed push runs of the same workflow file, other than this run, whose head_branch starts with train/, there is at least one success and no failure, timed_out or startup_failure (cancelled, skipped and neutral count for nothing); and, for Tests only, BEFORE is not all zeros and the BEFORE...SHA compare succeeded, lists fewer than 300 files and touches none of loki-ts/bun.lock, requirements-test.txt, dashboard-ui/package-lock.json. Any parse or API error means reuse=false and the full suite runs. The newest success by created_at is recorded (run id, attempt, branch) in the step summary and a notice; attempts above 1 are accepted.
465
+ 1. Rule (E-160, scripts/ci/train-verdict-reuse.sh). A push to refs/heads/main skips the heavy jobs only when ALL hold: LOKI_E160_REUSE is not 0; the workflow-runs listing for the SHA has total_count of 100 or less; among completed push runs of the same workflow file, other than this run, whose head_branch starts with train/, there is at least one success and no failure, timed_out or startup_failure (cancelled, skipped and neutral count for nothing); and, for Tests only, BEFORE is not all zeros and the BEFORE...SHA compare succeeded, lists fewer than 300 files and touches none of loki-ts/bun.lock, requirements-test.txt, legacy-ui/package-lock.json. Any parse or API error means reuse=false and the full suite runs. The newest success by created_at is recorded (run id, attempt, branch) in the step summary and a notice; attempts above 1 are accepted.
466
466
  2. Wiring. test.yml: the version-bump-gate skip output is true when either the S-132 gate or the reuse step says so. bun-parity, coverage, first-run-gate and security-audit get a first job train-reuse; every other job needs it and runs under `!cancelled() && needs.train-reuse.outputs.reuse != 'true'`. security-audit sast (CodeQL) is never gated: it always runs on main. coverage and first-run-gate take test.yml's concurrency block (per-ref with cancel for pull_request and train/**, per-SHA without cancel on main).
467
467
  3. Rationale: D28 and D46 item 4 (same SHA means same tree means same workflow YAML). required-ci, train-cycle, the pulse and the version-bump gate already read the train run by head_sha, so no gate gains new trust. Dependency lockfiles are excluded because a fast-forward from an older main can change resolved dependencies that the train run did not see.
468
468
 
package/docs/v10/DEPS.md CHANGED
@@ -8,11 +8,11 @@ Inventory only. No dependency, lockfile, workflow or image was changed to produc
8
8
 
9
9
  | File | Name | Current | Latest stable | Bump | Note |
10
10
  |---|---|---|---|---|---|
11
- | `dashboard-ui/package.json` | `@playwright/test` | `^1.58.1` | `1.63.0` | minor | |
12
- | `dashboard-ui/package.json` | `esbuild` | `^0.24.0` | `0.28.2` | 0.x breaking | |
13
- | `dashboard-ui/package.json` | `jest` | `^29.7.0` | `30.5.2` | MAJOR | |
14
- | `dashboard-ui/package.json` | `jest-environment-jsdom` | `^29.7.0` | `30.5.2` | MAJOR | |
15
- | `dashboard-ui/package.json` | `jsdom` | `^24.0.0` | `30.1.1` | MAJOR | |
11
+ | `legacy-ui/package.json` | `@playwright/test` | `^1.58.1` | `1.63.0` | minor | |
12
+ | `legacy-ui/package.json` | `esbuild` | `^0.24.0` | `0.28.2` | 0.x breaking | |
13
+ | `legacy-ui/package.json` | `jest` | `^29.7.0` | `30.5.2` | MAJOR | |
14
+ | `legacy-ui/package.json` | `jest-environment-jsdom` | `^29.7.0` | `30.5.2` | MAJOR | |
15
+ | `legacy-ui/package.json` | `jsdom` | `^24.0.0` | `30.1.1` | MAJOR | |
16
16
  | `loki-ts/package.json` | `@anthropic-ai/claude-agent-sdk` | `0.3.283` | `0.3.283` | up-to-date | |
17
17
  | `loki-ts/package.json` | `@anthropic-ai/sdk` | `^0.124.0` | `0.128.0` | 0.x breaking | |
18
18
  | `loki-ts/package.json` | `@resvg/resvg-wasm` | `^2.6.2` | `2.6.2` | up-to-date | |
@@ -384,7 +384,7 @@ Counts are all from the single `Bump` column (current line vs newest line in the
384
384
  ## Proposed slice list (D35)
385
385
 
386
386
  - **LOW - npm/bun patch+minor batch** (one slice for the whole ecosystem, touching every file below; lockfiles regenerated and committed):
387
- - `dashboard-ui/package.json`: @playwright/test ^1.58.1->1.63.0
387
+ - `legacy-ui/package.json`: @playwright/test ^1.58.1->1.63.0
388
388
  - `vscode-extension/package.json`: @types/vscode ^1.85.0->1.138.0
389
389
  - `web-app/package.json`: @playwright/test ^1.58.2->1.63.0, @types/react ^19.0.10->19.3.0, @types/react-dom ^19.0.4->19.3.0, autoprefixer ^10.4.20->10.6.1, postcss ^8.5.3->8.5.28, react ^19.0.0->19.3.0, react-dom ^19.0.0->19.3.0, react-resizable-panels ^4.7.3->4.14.1, react-router-dom ^7.13.1->7.18.4, typescript-eslint ^8.24.1->8.70.1
390
390
  - **LOW - Python patch+minor batch** (one slice for the whole ecosystem, touching every file below; lockfiles regenerated and committed):
@@ -404,16 +404,16 @@ Counts are all from the single `Bump` column (current line vs newest line in the
404
404
  - `anthropic` -> `1.8.0` (MAJOR): mcp/requirements.txt
405
405
  - `asyncpg` -> `0.31.0` (0.x breaking): web-app/requirements.txt
406
406
  - `cryptography` -> `50.0.1` (MAJOR): requirements-test.txt, web-app/requirements.txt
407
- - `esbuild` -> `0.28.2` (0.x breaking): dashboard-ui/package.json, vscode-extension/package.json
407
+ - `esbuild` -> `0.28.2` (0.x breaking): legacy-ui/package.json, vscode-extension/package.json
408
408
  - `eslint` -> `10.11.0` (MAJOR): vscode-extension/package.json, web-app/package.json
409
409
  - `eslint-plugin-react-hooks` -> `7.1.1` (MAJOR): web-app/package.json
410
410
  - `eslint-plugin-react-refresh` -> `0.5.7` (0.x breaking): web-app/package.json
411
411
  - `fastapi` -> `0.141.1` (0.x breaking): dashboard/requirements.txt, web-app/requirements.txt
412
412
  - `globals` -> `17.12.0` (MAJOR): web-app/package.json
413
413
  - `httpx` -> `0.28.1` (0.x breaking): sdk/python/pyproject.toml, web-app/requirements-test.txt, web-app/requirements.txt
414
- - `jest` -> `30.5.2` (MAJOR): dashboard-ui/package.json, package.json
415
- - `jest-environment-jsdom` -> `30.5.2` (MAJOR): dashboard-ui/package.json
416
- - `jsdom` -> `30.1.1` (MAJOR): dashboard-ui/package.json, package.json
414
+ - `jest` -> `30.5.2` (MAJOR): legacy-ui/package.json, package.json
415
+ - `jest-environment-jsdom` -> `30.5.2` (MAJOR): legacy-ui/package.json
416
+ - `jsdom` -> `30.1.1` (MAJOR): legacy-ui/package.json, package.json
417
417
  - `lucide-react` -> `1.48.0` (MAJOR): web-app/package.json
418
418
  - `mcp` -> `2.2.0` (MAJOR): mcp/requirements.txt, requirements-test.txt
419
419
  - `pytest` -> `9.1.1` (MAJOR): web-app/requirements-test.txt
@@ -62,7 +62,8 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
62
62
  - fix.ts:63 escalation gate;
63
63
  - implement.ts:56 limit;
64
64
  - the plan stage on the "fast" tier;
65
- - no effort field in SessionRunOptions.
65
+ - no effort field in SessionRunOptions;
66
+ - `loki start prd.md` still goes to the legacy run.sh route, whose default is sonnet (providers/claude.sh CLAUDE_DEFAULT_DEVELOPMENT).
66
67
  - Mechanism: a catalog best_default plus a top tier for each provider (EL-W0-06, EL-W0-07), and a size gate on the artifact (EL-W0-05).
67
68
  - Fixture: a unit test that the default run.started.model equals the catalog best_default, plus a parity replay row.
68
69
 
@@ -125,6 +126,18 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
125
126
  - Mechanism: one runner-config registry for each runner. Any added or changed file that it names (configs, preloads, setup files, conftest) caps the verdict below VERIFIED, with NOT PROVEN naming the file.
126
127
  - Fixture: a stub-provider repro for each runner (bun preload, vitest setupFiles, jest moduleNameMapper, pytest conftest).
127
128
 
129
+ ## FC-10 Live line truncated to ~20 columns on a pty with no size
130
+ - User saw: on a pty with no column size (script -q, CI, tmux before a resize, IDE terminals) the quiet-mode live status line was cut to about 20 characters, for example "[implement] implemen". Raw: the stage events were complete; only the rendering was wrong.
131
+ - Law: L7 (outputs are contracts).
132
+ - Siblings (every terminal width read, with its old fallback):
133
+ - loki-ts/src/engine10/supervisor.ts:334 passed process.stdout.columns straight to LiveLine (undefined or 0);
134
+ - loki-ts/src/e10ext/liveline.ts:35 used Math.max(20, (columns ?? 80) - 1), so 0 became 20 (the bug);
135
+ - loki-ts/src/cockpit/cli.ts:73 used columns || $COLUMNS || 0 with no 80 default and accepted widths of 5 or more;
136
+ - autonomy/tui.sh:27 used `tput cols || echo 80`, which accepts tput printing 0 or nothing;
137
+ - packages/*/src: no terminal width reads.
138
+ - Mechanism: one shared terminalWidth() helper (loki-ts/src/util/term_width.ts): a finite columns >= 40, else a valid $COLUMNS >= 40, else 80. Every TS read goes through it and the bash read applies the same rule.
139
+ - Fixture: loki-ts/tests/engine10/term_width.test.ts (columns undefined, 0 and 20 give >= 80; the live line shows the full "[implement] implementing" text; a guard fails on any raw .columns read in src outside the helper).
140
+
128
141
  ## FC-11 Repo-wide structural guards went red after slices passed narrowed reviews
129
142
  - User saw: nothing yet; the 10.7.1 train was blocked on main 51e02b229 (2 failures in the full loki-ts bun test).
130
143
  - Law: L7 (the release is a contract), and the D44 gate.
@@ -164,3 +177,34 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
164
177
  - the outer E-154 key check compared names only, so truncating an existing key was invisible.
165
178
  - Mechanism: derive the real path from the current HOME, never from an inherited variable (enter unsets LOKI_REAL_HOME, preload reads HOME); the key check fingerprints name, size and mtime.
166
179
  - Fixture: tests/test-e154-e155-guards.sh (run_runner strips the pointers; t-keys writes only the runner-derived stand-in). A decoy-pointer probe and a bun HOME probe are owed after Oct 7 (B3, phase D vacuity).
180
+
181
+ ## FC-15 A run judges "already done" against Loki's own unmerged work
182
+ - User saw: FireLater#17 rerun on 10.7.1 (e10-20261003T185853Z-2d44) reported ALREADY_SATISFIED in 2m07s for $0.52. That was false. The run branched from the checked-out loki/e10-20261003T150744Z-59b1 (eda184e). That branch was the earlier FAILED run's unmerged draft PR #25, which also lacks the route edits the old scope control reverted.
183
+ - Law: L4 (the base is a contract), L2 (trust fails closed).
184
+ - Founder rule (2026-10-03):
185
+ - Base precedence: an explicit CLI flag (add `--base` if none exists), then the loki.yaml base_branch setting (a branch name, `current` or `default`), then the user's checked-out branch.
186
+ - The repo default branch is used only when it is configured as `default`. Never hardcode "main" (L0).
187
+ - The start line prints `base: <branch> (<flag, config or checkout>)`.
188
+ - The PR target is the configured target, else the repo default branch, and the PR body names it.
189
+ - Siblings: every outcome that compares against the base (ALREADY_SATISFIED, the Wall base run, the scope diff, the receipt delta).
190
+ - Mechanism:
191
+ - Detect Loki's own unmerged work on the base from its run records (the loki/e10-* branch plus the run receipt), not from a branch-name regex.
192
+ - Report "this branch already has run <id>'s unmerged work (PR #N, <state>); resume or review it", never ALREADY_SATISFIED.
193
+ - A dirty or foreign checkout is noted in the output.
194
+ - Fixture: owed. A repo whose checkout is a prior run's branch with a receipt must yield the unmerged-work outcome.
195
+
196
+ ## FC-16 ALREADY_SATISFIED with zero Loki-executed checks
197
+ - User saw: the same run had verify "checks": [] and changed_files []. The verdict rested only on the implement agent's self-report ("10/10 named impacted tests pass ... via npx vitest run").
198
+ - Law: L0 and L3 (the model never grades its own work), L5; Seal accuracy.
199
+ - Siblings: every outcome that is reachable with an empty checks list.
200
+ - Mechanism:
201
+ - A success-class outcome requires harness-executed evidence against the target base: the impacted tests run through the Project Model commands, plus each acceptance point of the issue checked.
202
+ - With zero executed checks the outcome is NOT VERIFIED.
203
+ - Fixture: owed. A verify with checks [] and a self-reported pass must yield NOT VERIFIED.
204
+
205
+ ## FC-17 The Wall spends time and money and writes nothing
206
+ - User saw: the same run's Wall produced "files": [] in 1m42s, with base_run 0/0/0. This is the D82-WALL0 class again.
207
+ - Law: L5 (no work without evidence), cost.
208
+ - Siblings: D82-WALL0 and any stage that can finish with zero artifacts and still bill.
209
+ - Mechanism: if the Wall cannot write a check, it skips in under 10s with a NOT PROVEN note and never runs a model session to an empty result.
210
+ - Fixture: owed. A repo with no runnable test command yields a Wall skip under 10s with NOT PROVEN.
@@ -66,7 +66,7 @@ Evidence: `grep -rn autonomy/|providers/` over loki-ts/src/engine10, packages/co
66
66
  | loki-ts/src/runner, commands, providers (v8 loop) | PORT subset | engine10 imports runner/github_token, types, retry_class, providers, budget; providers/claude_flags, mcp_config; delete the rest |
67
67
  | council/, quality gates scripts, swarm/, agents/ | DELETE (6e) | no engine10 refs |
68
68
  | dashboard/ (Python) | KEEP until D56 flip, then DELETE | D57 item 3 |
69
- | dashboard-ui/ | KEEP until D56 flip, then DELETE | same |
69
+ | legacy-ui/ | KEEP until D56 flip, then DELETE | same |
70
70
  | engine10/dashboard | KEEP until D56 flip | engine10/cli.ts TABLE |
71
71
  | web-app/ (Purple Lab) | DELETE | no engine10 or CP ref; 55k lines |
72
72
  | mcp/ | DELETE (6d) | mcp/server.py has 0 engine10 calls; loki-ts refs are v8 runner only |
@@ -94,7 +94,7 @@ Wall check for every slice: v10 suite, Bun Parity (redefined in W2-01), first-ru
94
94
  10. W2-10 providers/*.sh (~3k).
95
95
  11. W2-11 autonomy/run.sh, autonomy/loki, autonomy/lib except KEEP rows (~125k). Last code slice; depends on 01, 02, 08, 09.
96
96
  12. W2-12 legacy docs/ plans and wiki pages (~1000 mentions).
97
- 13. W2-13 dashboard/ + dashboard-ui/ (~113k), only after D56 default flip.
97
+ 13. W2-13 dashboard/ + legacy-ui/ (~113k), only after D56 default flip.
98
98
 
99
99
  ## 5. Guard spec (D57 item 4)
100
100
 
package/docs/v10/SWARM.md CHANGED
@@ -159,8 +159,8 @@ shrink for pending), `CHANGELOG.md`, `docs/v10/BACKLOG.md`,
159
159
 
160
160
  **Generated bundles** (never edited by hand by a builder; the Captain
161
161
  rebuilds all three after every merge that could touch their sources):
162
- `loki-ts/dist/loki.js` (from `loki-ts/src`), `dashboard/static/index.html`
163
- and `dashboard-ui/dist` (from `dashboard-ui/scripts/build-standalone.js` and
162
+ `loki-ts/dist/loki.js` (from `loki-ts/src`), `legacy-ui-static/index.html`
163
+ and `legacy-ui/dist` (from `legacy-ui/scripts/build-standalone.js` and
164
164
  components), `web-app/dist` (from `web-app/src`).
165
165
 
166
166
  **Cross-wave exclusion:** a promise chain only serializes within one