loki-mode 10.10.2 → 10.10.5

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 (81) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/dashboard/__init__.py +1 -1
  4. package/docs/CLI-REFERENCE.md +1 -1
  5. package/docs/INSTALLATION.md +1 -1
  6. package/docs/v10/BOARD.md +8 -0
  7. package/docs/v10/DEPS.md +2 -0
  8. package/docs/v10/FAILURE-CLASSES.md +59 -16
  9. package/docs/v10/METRICS.md +9 -0
  10. package/docs/v10/PROGRESS.md +17 -0
  11. package/docs/v10/cp-redesign/PARITY.md +188 -0
  12. package/docs/v10/cp-redesign/legacy/INDEX.md +1167 -0
  13. package/loki-ts/dist/loki.js +631 -612
  14. package/mcp/__init__.py +1 -1
  15. package/package.json +1 -1
  16. package/packages/control-plane/dist/server.js +433 -340
  17. package/packages/control-plane/src/server/diffstat.ts +77 -0
  18. package/packages/control-plane/src/server/repos.ts +5 -2
  19. package/packages/control-plane/src/server/routes/index.ts +1 -1
  20. package/packages/control-plane/src/server/runs.ts +3 -1
  21. package/packages/control-plane/ui/dist/assets/index-D27veKDf.js +152 -0
  22. package/packages/control-plane/ui/dist/index.html +1 -1
  23. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  24. package/web-app/dist/assets/{AdminPage-BvbxMtZO.js → AdminPage-qj6cyTT6.js} +1 -1
  25. package/web-app/dist/assets/{Avatar-Dc7Scg02.js → Avatar-Dg4WrYYd.js} +1 -1
  26. package/web-app/dist/assets/{Badge-BmVuOqbM.js → Badge-DHiwSg-p.js} +1 -1
  27. package/web-app/dist/assets/{Button-DvzqhxRU.js → Button-gi8XEzIU.js} +1 -1
  28. package/web-app/dist/assets/{CockpitPage-D8AZo7Ha.js → CockpitPage-B1QNjPBn.js} +1 -1
  29. package/web-app/dist/assets/{ComparePage-NmqaTXDz.js → ComparePage-DW-oUaDu.js} +1 -1
  30. package/web-app/dist/assets/{ErrorBoundary-PGl8Kzoq.js → ErrorBoundary-BK5zjqn-.js} +1 -1
  31. package/web-app/dist/assets/{EvidenceReceiptPanel-2NY4n9gv.js → EvidenceReceiptPanel-F58cuFm9.js} +1 -1
  32. package/web-app/dist/assets/{GitHubIssuesPanel-DBO_LHHM.js → GitHubIssuesPanel-QVyvF19M.js} +1 -1
  33. package/web-app/dist/assets/{GitHubPRsPanel-K7m9uJ1N.js → GitHubPRsPanel-BRFHMzwy.js} +1 -1
  34. package/web-app/dist/assets/{HomePage-qNQzAJxM.js → HomePage-Cpskd4yM.js} +2 -2
  35. package/web-app/dist/assets/{LoginPage-esu3OK65.js → LoginPage-CteYWi5M.js} +1 -1
  36. package/web-app/dist/assets/{MagicPage-CCdVvXrA.js → MagicPage-CCLor0AU.js} +1 -1
  37. package/web-app/dist/assets/{MetricsPage-bEvugU2t.js → MetricsPage-WgsOaLoq.js} +1 -1
  38. package/web-app/dist/assets/{NotFoundPage-BlEjQ1wX.js → NotFoundPage-DXSCr9P6.js} +1 -1
  39. package/web-app/dist/assets/{ProjectPage-Bnug_Yzv.js → ProjectPage-sR0kaaXV.js} +3 -3
  40. package/web-app/dist/assets/{ProjectsPage-M8r1vfpn.js → ProjectsPage-J3TNS42-.js} +1 -1
  41. package/web-app/dist/assets/{SettingsPage-NqAJpB48.js → SettingsPage-Cil5837P.js} +1 -1
  42. package/web-app/dist/assets/{ShowcasePage-8FggxL1P.js → ShowcasePage-C3_oWYJa.js} +1 -1
  43. package/web-app/dist/assets/{SystemSettingsPage-3Sz3kFOO.js → SystemSettingsPage-Sddw1fFS.js} +1 -1
  44. package/web-app/dist/assets/{TeamsPage-nV-6vdWM.js → TeamsPage-B0poySCt.js} +1 -1
  45. package/web-app/dist/assets/{TemplatesPage-Brbc_VR9.js → TemplatesPage-pcYSxHam.js} +1 -1
  46. package/web-app/dist/assets/{TerminalOutput-D1yta5ac.js → TerminalOutput-CRWTZM7F.js} +1 -1
  47. package/web-app/dist/assets/{activity-oEeKuqFe.js → activity-D3aR95zO.js} +1 -1
  48. package/web-app/dist/assets/{bell-3NJtqBRR.js → bell-WdWaPIBo.js} +1 -1
  49. package/web-app/dist/assets/{bot-CuvJZ6x1.js → bot-CzD3xokc.js} +1 -1
  50. package/web-app/dist/assets/{check-n4289IZw.js → check-DMYJiYcm.js} +1 -1
  51. package/web-app/dist/assets/{chevron-left-CmQeio7h.js → chevron-left-DY0FSKvI.js} +1 -1
  52. package/web-app/dist/assets/{circle-alert-CmmVW-Pd.js → circle-alert-DVPtG3Pe.js} +1 -1
  53. package/web-app/dist/assets/{clock-QFqk7GlA.js → clock-BjjLL6uI.js} +1 -1
  54. package/web-app/dist/assets/{cloud-BNkSokmq.js → cloud-CnUCVZhm.js} +1 -1
  55. package/web-app/dist/assets/{code-xml-nWeketqj.js → code-xml-BPoxcFNK.js} +1 -1
  56. package/web-app/dist/assets/{database-C83MXTmJ.js → database-ClVgDBYt.js} +1 -1
  57. package/web-app/dist/assets/{dollar-sign-Blg6TO4y.js → dollar-sign-Ui4BIml8.js} +1 -1
  58. package/web-app/dist/assets/{file-code-corner-Tk11oUzm.js → file-code-corner-BNYl7J1Z.js} +1 -1
  59. package/web-app/dist/assets/{file-plus-DF_eyA6I.js → file-plus-BxkSyRVn.js} +1 -1
  60. package/web-app/dist/assets/{globe-D5hDqqmn.js → globe-b2poyDKT.js} +1 -1
  61. package/web-app/dist/assets/{hammer-C2hm9lzl.js → hammer-D_0BUpBG.js} +1 -1
  62. package/web-app/dist/assets/{index-pMxOIwXq.js → index-D8TYtITk.js} +3 -3
  63. package/web-app/dist/assets/{layers-XWQKGXg0.js → layers-Co1szEIf.js} +1 -1
  64. package/web-app/dist/assets/{loader-circle-BRuvorm2.js → loader-circle-DylW-nwq.js} +1 -1
  65. package/web-app/dist/assets/{lock-BSGvQf5v.js → lock-D7aFdKw7.js} +1 -1
  66. package/web-app/dist/assets/{package-3FJYUYgJ.js → package-ElSsRKiN.js} +1 -1
  67. package/web-app/dist/assets/{plus-CeIx6g9P.js → plus-CVWgRxDX.js} +1 -1
  68. package/web-app/dist/assets/{refresh-cw-ChutW42g.js → refresh-cw-B2azSZHT.js} +1 -1
  69. package/web-app/dist/assets/{rotate-ccw-BdSjUAk-.js → rotate-ccw-BdQHOrf0.js} +1 -1
  70. package/web-app/dist/assets/{scroll-text-BjFqxpw3.js → scroll-text-9m-YKf83.js} +1 -1
  71. package/web-app/dist/assets/{server-C7UEKdol.js → server-BYq99Fe1.js} +1 -1
  72. package/web-app/dist/assets/{shield-alert-DY8fpEs7.js → shield-alert-BNCiHXhR.js} +1 -1
  73. package/web-app/dist/assets/{thumbs-up-Cz1san1g.js → thumbs-up-BB_EJkat.js} +1 -1
  74. package/web-app/dist/assets/{trash-2-D2MvGYeP.js → trash-2-BMF4kFvy.js} +1 -1
  75. package/web-app/dist/assets/{trending-down-CxO3OYOB.js → trending-down-BiqiTPXx.js} +1 -1
  76. package/web-app/dist/assets/{trending-up-DCHKPJLe.js → trending-up-Bq6qyKub.js} +1 -1
  77. package/web-app/dist/assets/{upload-CdPJpSHC.js → upload-1HzIJHHR.js} +1 -1
  78. package/web-app/dist/assets/{usePolling-DAH6K3ST.js → usePolling-FNwpjURt.js} +1 -1
  79. package/web-app/dist/assets/{user-Byyt01W4.js → user-DrORfQv3.js} +1 -1
  80. package/web-app/dist/index.html +1 -1
  81. package/packages/control-plane/ui/dist/assets/index-BrA22FUs.js +0 -152
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: An autonomous software factory that knows what it is supposed to deliver, and proves it did. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
4
4
  ---
5
5
 
6
- # Loki Mode v10.10.2
6
+ # Loki Mode v10.10.5
7
7
 
8
8
  **Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the legacy engine, which still ships and is being removed (`loki start owner/repo#N` still routes to it; prefer `loki owner/repo#N`).
9
9
 
@@ -483,4 +483,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
483
483
 
484
484
  ---
485
485
 
486
- **v10.10.2 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v10.10.5 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 10.10.2
1
+ 10.10.5
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "10.10.2"
10
+ __version__ = "10.10.5"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -1,6 +1,6 @@
1
1
  # CLI reference
2
2
 
3
- Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v10.10.2. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v10.10.5. Do not edit by hand.
4
4
  Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
5
5
 
6
6
  | Command | Description |
@@ -2,7 +2,7 @@
2
2
 
3
3
  The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
4
4
 
5
- **Version:** v10.10.2
5
+ **Version:** v10.10.5
6
6
 
7
7
  **Engine note:** `loki "<task>"`, `loki owner/repo#N` and `loki quick` run the Loki 10 engine. `loki start` still routes to the legacy engine, which is being removed (planned work resumes 2026-10-07); prefer `loki owner/repo#N`. See [docs/v10/GUIDE.md](v10/GUIDE.md).
8
8
 
package/docs/v10/BOARD.md CHANGED
@@ -873,3 +873,11 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
873
873
  | FC-09r | FC-09 rework f4eccfeac BLOCKED by rv-trust3 (reproduced): package.json pretest/posttest/test:* edits return no runner-config note; compare the whole scripts object, and have verify compare base vs head runner sections; add go.mod replace, Cargo.toml [patch], package.json overrides/imports, tsconfig paths | loki-ts/src/features/runner_config.ts plus its tests | HIGH | bun repro: a pretest-only edit caps the verdict; runner_config tests green | ready@2026-10-03T19:35Z | Do not merge f4eccfeac as is. Opus reviewer. |
874
874
  | CPE24-P2a | Checkpoint rollback restores only an allowlist (session.json, dashboard-state.json, CONTINUITY.md, autonomy-state.json, state, queue) and refuses nested symlinks | packages/control-plane/src/server/routes/checkpoints.ts plus test | MEDIUM | planted audit/ in a checkpoint does not overwrite .loki/audit | ready@2026-10-03T19:35Z | rv-trust3 advisory on P2. |
875
875
  | CPE24-P4a | Legacy /api/control/* callers require ctx.local (or isLoopbackHost) like /v1 | packages/control-plane/src/server/legacy/routes-control.ts plus test | MEDIUM | non-loopback Host refused on legacy control | ready@2026-10-03T19:35Z | rv-trust3 advisory on P4. |
876
+ | CP-NITS1 | CP run page nits from the 10.10.2 smoke: Wall row describes the Wall ("Wrote acceptance checks (n files)" or "skipped: no checks written"); local repo with no remote shows the folder name, not REPO UNMEASURED; receipt text read from receipt.json on disk like the derived diff; diffstat failures cached (F1); leading-dash sha fixture | packages/control-plane/src/server plus ui run page plus tests | MEDIUM | CP suite green; a signed receipt on disk renders its text; a no-remote repo shows its folder name | ready@2026-10-03T21:31Z | Peer smoke 21:27Z plus CP follow-up review F1. |
877
+ | FC-01b | Monorepo visual-evidence skip reason: with backend/ and frontend/ package.json and no root manifest, say "no dev, preview or start script in backend/ or frontend/", not "no package.json" | visual evidence path in loki-ts/src plus test | LOW | monorepo fixture prints the per-package reason | ready@2026-10-03T21:31Z | FC-01 sibling (Engine Law L5). |
878
+ | FC-19b | Spec-conflict resume near the stage limit: skip the resume when under about 60s of the implement window remains, or keep the first conflict when the resume is aborted, so the run ends BLOCKED with its question instead of a limit failure | loki-ts/src/util/conflict_resume.ts plus machine.ts plus test | MEDIUM | a fake first session that uses the window then conflicts ends BLOCKED with its question | ready@2026-10-03T21:56Z | review-fc19 non-blocking follow-up, from reading machine.ts runStage. |
879
+ | CP-START | FC-20 (LATER list): root-cause the CP home Start "HTTP 404" (route mismatch, stale CP process serving a newer UI, or the loopback guard) and fix it at the shared layer (UI and server version match; a stale CP restarts or refuses a newer UI); never show a bare HTTP status, show a sentence with the next step; repo chip lists registered repos by name plus Browse; choosing a smaller model shows one muted line ("haiku: fastest, may be less accurate") and never blocks. The composer itself is redefined by CP-ASK (founder 22:03Z): greenfield-from-composer is dropped | packages/control-plane server and ui plus tests | MEDIUM | a forced 404 renders a sentence, a version-skewed UI gets the restart sentence | ready@2026-10-03T22:05Z | Founder bug via steering 22:01Z, rescoped by founder 22:03Z. Do not displace FC-15 or FC-16. |
880
+ | CP-ASK | Founder 22:03Z: "we are not a vibe coding tool". The CP home box becomes Ask Loki: search, learn, compare runs, and ask anything about Loki Mode, past runs, receipts, repos and issues. Default provider claude (or any configured provider and model the user picks); the model gets all of that data (read-only tools or MCP over runs, receipts, events, METRICS, repos, gh issues and PRs); answers are async jobs the user can leave and come back to, listed in the CP. Read-only: Ask never edits a repo or starts a build | Architect slices first (10-40 slices, feature flag); packages/control-plane routes and ui, a read-only data layer, provider invocation | HIGH | the founder asks "compare my last two runs on FireLater" and gets a cited answer async in the CP; Ask cannot write to any repo | ready@2026-10-03T22:05Z | Founder direct directive 22:03Z. Architect plan first. |
881
+ | FC-21 | FC-21: (a) a limit in implement still runs verify on the existing work plus the fix rounds the budget allows, never seal directly; (b) the run cap scales with task size (sizing and Project Model), with a generous subscription default set in loki.yaml; (c) implement is told its remaining time; (d) the CLI summary, CP and PR body read receipt.verdict (one outcome) | loki-ts/src/engine10 run orchestration, the budget and sizing modules, the CLI summary, plus tests | MEDIUM | a fake implement limit is followed by verify; CLI outcome equals receipt.verdict for 4 verdicts; a large task gets a larger cap; core cap under 5000 | merged@2026-10-03T22:55Z | FireLater#17 gate on 10.10.3 PARTIAL (steering 22:08Z). P0 tier with FC-16/FC-15. Built 21fec9deb; opus review-fc21 APPROVE on merge e80abc63a (suites 1719/0, budget 27/0, tsc rc=0 with real node_modules); merged 881f1275f. Advisories A1-A4 filed as FC-21b. Ships in one train with FC-15 and FC-16. |
882
+ | FC-21b | FC-21 follow-ups, next train (steering 23:00Z): (1) an implement limit forces PARTIAL only while checks are red or unrun; if the fix rounds make the impacted checks green with n>0 the run earns VERIFIED (L3: what ran is the evidence, not how long implement took); (2) size the run cap from the Project Model and plan (packages and files touched) or a plan-session estimate, never from task-text character count (L0); (3) the CLI outcome must equal receipt.verdict, so a cap stop after a limit cannot print BUDGET_STOP over a PARTIAL or FAILED receipt (L7, was advisory A4); (A1) machine.ts:145 mustJump keys on reason limit only, require r.killed too; (A2) a spec-conflict resume gets the full original budget in the time note and limitS, and the note lands after FINISH_LINE; (A3) yamlRunCapS matches run_cap_s at any depth under budgets, CRLF yaml falls back silently, ls-files count off by one | loki-ts/src/engine10/machine.ts, stages/implement.ts, stages/seal.ts, output.ts, src/util/run_cap.ts, project_model sizing, plus tests | HIGH | a limit then fix-green with n>0 seals VERIFIED, a limit with a red or unrun check seals PARTIAL; the cap for a short task touching many packages exceeds the cap for one file; CLI outcome equals receipt.verdict on a cap stop after a limit; a thrown limit without a kill never reaches VERIFIED; nested per_stage run_cap_s is ignored; a resumed implement gets the remaining time | ready@2026-10-03T23:01Z | From review-fc21 22:53Z plus steering 23:00Z. HIGH because it changes the verdict rule (opus reviewer). Architect plan first for the sizing source. e10ext is 1 line under its 1500 cap. Queue after the FireLater#17 gate on 10.10.4. |
883
+ | FC-16b | FC-16 follow-ups: package_suite.ts:33 detects go by first token only (make test, GOFLAGS=x go test fall to the generic path); go -json parsing; load_owner killTree process-group kill; unittest atexit forged trailer | loki-ts/src/engine10 package_suite, load_owner, test classify, plus tests | MEDIUM | make test wrapping go test classifies with runner go; a forged unittest trailer from atexit is not a pass | ready@2026-10-03T23:01Z | From review-fc16-fc02-integ rounds 4-6. package_suite results never feed seal proof today. Also owed: an end-to-end test running a go Wall file through RealBaseTestRunner (the seal.test.ts case does not guard wall.ts). |
package/docs/v10/DEPS.md CHANGED
@@ -14,6 +14,7 @@ Inventory only. No dependency, lockfile, workflow or image was changed to produc
14
14
  | `loki-ts/package.json` | `@types/bun` | `latest` | `1.4.2` | unknown | no numeric version in spec (unpinned or a dist-tag like 'latest'); cannot compute a bump class |
15
15
  | `loki-ts/package.json` | `typescript` | `^5.6.0` | `7.0.2` | MAJOR | |
16
16
  | `loki-ts/tests/engine10/fixtures/testmap/package.json` | `vitest` | `^2.0.0` | `5.0.3` | MAJOR | test fixture, not a real dependency |
17
+ | `loki-ts/tests/fixtures/monorepo-fc01/backend/package.json` | `vitest` | `^1.0.0` | `5.0.3` | MAJOR | test fixture, not a real dependency |
17
18
  | `loki-ts/tests/fixtures/project-model/firelater-17/backend/package.json` | `vitest` | `^1.0.0` | `5.0.3` | MAJOR | test fixture, not a real dependency |
18
19
  | `package.json` | `@resvg/resvg-wasm` | `^2.6.2` | `2.6.2` | up-to-date | |
19
20
  | `package.json` | `@types/node` | `^25.2.0` | `26.6.4` | MAJOR | |
@@ -72,6 +73,7 @@ Inventory only. No dependency, lockfile, workflow or image was changed to produc
72
73
  | `web-app/package.json` | `typescript` | `~5.7.2` | `7.0.2` | MAJOR | |
73
74
  | `web-app/package.json` | `typescript-eslint` | `^8.70.1` | `8.71.0` | minor | |
74
75
  | `web-app/package.json` | `vite` | `^6.2.0` | `8.3.2` | MAJOR | |
76
+ | `loki-ts/tests/fixtures/monorepo-fc01/frontend/package.json` | `(none found)` | `` | `-` | n/a | test fixture; no dependencies or devDependencies declared |
75
77
  | `loki-ts/tests/fixtures/project-model/firelater-17/frontend/package.json` | `(none found)` | `` | `-` | n/a | test fixture; no dependencies or devDependencies declared |
76
78
 
77
79
  ## Python (requirements*.txt)
@@ -41,7 +41,10 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
41
41
  - vitest "No test files found, exiting with code 0" counts as a pass with n=0, when it should be not_run (EL-W1-06).
42
42
  - Mechanism: a result classifier with an owner (EL-W1-05). Only a FAIL owned by code drives fix and stall. Interim: EL-W0-02.
43
43
  - Fixture: tests/fixtures/runner-outputs/vitest/load-error.txt (from seq 56), plus siblings for each runner.
44
+ - Status: FIXED (interim, FC-02 lane F). One shared classifier loki-ts/src/runner/runner_errors.ts (classifyRunnerOutput); verify.ts runCheck turns a load or collection error into not_run with owner harness (no rerun, no fix round, listed in verify not_proven); deep.ts runFullSuite does the same; wall.ts classify() already returned not_run for jest/vitest/bun with no parsed failure and is left unchanged. A real failed-test count in the same output keeps it a code failure; lint checks are never reclassified. Fixtures: loki-ts/tests/engine10/fixtures/runner-outputs/{vitest,pytest}, test loki-ts/tests/engine10/runner_errors.test.ts. Still open: the n=0 pass rule (EL-W1-06) and per-runner fixtures for jest, node:test, go, cargo.
45
+ - Integration with FC-16 (2026-10-03): one mechanism identifies lint, typecheck and selector checks: `RunOpts.kind: "static"` (verify, deep and per-package paths alike); the FC-02 name-prefix exemption is removed. Load ownership is the single helper `harnessLoadReason` (runner/load_owner.ts), called from verify runCheck (kind test only), deep runFullSuite and project_model/package_suite.ts, which also routes results through FC-16 classifyCheck. Test: tests/engine10/monorepo_cwd.test.ts (FC-16 C1, lint kind blocks).
44
46
  - Sibling (2026-10-03): a change-introduced load error is a code fault. Base reproduction is necessary but not sufficient. The base rerun must be hermetic (an inherited editable install imports head code), and a check the task targets is never env-owned (7ad4a18b6, blocked in round 2). Superseded by L0-WAVE1 EL-W1-06: the harness gathers evidence and a separate reviewer call assigns the owner.
47
+ - Ownership rule (2026-10-03, HIGH review of fd3ad2037): loki-ts/src/runner/load_owner.ts loadErrorIsHarnessOwned, one mechanism used by verify.ts runCheck AND deep.ts runFullSuite (sibling sweep done: wall.ts classify() already returns fail for a parsed failure). A load error is harness-owned not_run only when the same command reproduces a load error on a hermetic base worktree, no changed file is named in the output (path or module stem), the check is not a Wall or task-relevant test, and its target file is not itself changed; else it stays fail so fix rounds run. Patterns tightened (N1): command not found and Cannot find module match runner-load shapes only. Regressions: tests/engine10/runner_errors.test.ts (B1 SyntaxError in changed source, B2 Wall missing symbol, base-reproduced harness error, non-reproducing error, N1).
45
48
 
46
49
  ## FC-03 Scope control reverted in-scope route edits
47
50
  - User saw: the PR without the fix (routes/applications.ts, assets.ts and attachments.ts reverted).
@@ -207,25 +210,65 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
207
210
  - The repo default branch is used only when it is configured as `default`. Never hardcode "main" (L0).
208
211
  - The start line prints `base: <branch> (<flag, config or checkout>)`.
209
212
  - The PR target is the configured target, else the repo default branch, and the PR body names it.
210
- - Siblings: every outcome that compares against the base (ALREADY_SATISFIED, the Wall base run, the scope diff, the receipt delta).
211
- - Mechanism:
212
- - 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.
213
- - Report "this branch already has run <id>'s unmerged work (PR #N, <state>); resume or review it", never ALREADY_SATISFIED.
214
- - A dirty or foreign checkout is noted in the output.
215
- - Fixture: owed. A repo whose checkout is a prior run's branch with a receipt must yield the unmerged-work outcome.
216
-
217
- ## FC-16 ALREADY_SATISFIED with zero Loki-executed checks
218
- - 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").
219
- - Law: L0 and L3 (the model never grades its own work), L5; Seal accuracy.
220
- - Siblings: every outcome that is reachable with an empty checks list.
221
- - Mechanism:
222
- - 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.
223
- - With zero executed checks the outcome is NOT VERIFIED.
224
- - Fixture: owed. A verify with checks [] and a self-reported pass must yield NOT VERIFIED.
213
+ - Siblings (swept 2026-10-03; every place a base or diff is computed):
214
+ - loki-ts/src/engine10/stages/intake.ts: baseSha = rev-parse HEAD, the ALREADY_SATISFIED judge (checkAlreadyDone, closed-issue exit); FIXED, now refuses first;
215
+ - loki-ts/src/engine10/worker.ts:49: ctx.baseSha = rev-parse HEAD (inherits intake's refusal, runs after it in the same checkout);
216
+ - loki-ts/src/engine10/stages/seal.ts:111-116,190,256: staged diff, discardIfSatisfied, diff-tree and receipt base_sha, all against ctx.baseSha;
217
+ - loki-ts/src/engine10/stages/verify.ts:63-67,103,176,238,287: changedFiles, testConfigChanged, the pre_red worktree at ctx.baseSha (the engine's only worktree use), inBase;
218
+ - loki-ts/src/engine10/stages/deep.ts:134,236: council diff and changedFiles against ctx.baseSha;
219
+ - loki-ts/src/engine10/supervisor.ts:221-224: PR diff-vs-base from intake's base_sha;
220
+ - loki-ts/src/engine10/stages/wall.ts, modernize/presealed_wall.ts: Wall base run and already_satisfied count, fed by the same ctx.baseSha.
221
+ All of them consume ctx.baseSha, which is HEAD after intake; one guard at intake covers them.
222
+ - Mechanism (shipped, redesigned 2026-10-03): the guard sits on the CLAIM, not the run. A run always starts from the base the user asked for and is never refused for carrying commits that are not on the PR target. loki-ts/src/util/base_guard.ts resolveBase resolves the PR TARGET (LOKI_E10_BASE else origin default branch, fetched with a 10s non-interactive fetch, else local main/master; never loki/* or HEAD). unmergedEvidence compares the ALREADY_SATISFIED evidence paths (AlreadyDoneResult.paths) with `git diff --name-only <target> HEAD`: evidence that exists only in target..HEAD voids the claim, and the run proceeds to implement. When those commits are really Loki's (one carries the engine's "Loki-Run:" commit trailer, or a local .loki/runs receipt sealed head_sha != base_sha with commits of its own there; a branch merely named loki/* or a zero-commit receipt does not count) intake records data.unmerged_loki_work with the harness-owned note "work exists on <branch>, not on <target>; open or resume it" (L5; informational, never a refusal, never VERIFIED). The note is visible in three places: a stderr line when intake finishes and the run goes on to implement, the terminal summary (renderMainOutput via unmergedLokiWorkNote), and a "- Note:" line under "How it was tested" in the real PR body (e10ext/reviewer_body.ts renderReviewerBody, called by stages/pr.ts), unclipped with the evidence path list capped at 3 plus "(+N more)". When the commits are not Loki's the claim is dropped with one stderr line saying the evidence is on <branch> but not on <target>. The start line prints "PR target: <ref>, base: <branch>". No reflog is read. Placed in util/ because engine10 core is at its size cap (budget.test.ts).
223
+ - Review fix (HIGH F1-F3, superseded by the redesign): the earlier refusal path and its reflog counting (including the R1 fresh-clone hole, where the oldest reflog entry is the tip itself) are removed rather than patched; with no refusal there is no wrongly-allowed run to close.
224
+ - Still owed: a --base CLI flag, loki.yaml base_branch, the PR-target wording in the PR body (the start line now prints "PR target: <ref>, base: <branch>"); resolveBase already takes the explicit value via LOKI_E10_BASE.
225
+ - Fixture: loki-ts/tests/engine10/intake.test.ts describe "base is not Loki's unmerged work (FC-15)" (origin + clone, local loki/e10-* branch committing the fix; without the guard intake returned already_satisfied from that unmerged commit, with it the claim is voided, the run completes and implements, and unmerged_loki_work is reported; control on main is not satisfied). Regressions A, B, B2 (no refusal, no claim), D (fresh clone of a pushed loki/* branch, 1 Loki commit: not refused, no claim, unmerged_loki_work.commits 1), a feature branch in a fresh clone (no refusal, not labelled Loki's), a loki/*-named branch with only the user's commit and a zero-commit receipt (neither labelled Loki's), the note present in renderMainOutput and renderReviewerBody, ALREADY_SATISFIED still reached when the work is on the target, and C (LOKI_E10_BASE=feature/search).
226
+
227
+ ## FC-16 ALREADY_SATISFIED / VERIFIED with zero Loki-executed checks (n=0 counted as pass)
228
+ - User saw: FireLater#17 on 10.7.1 recorded checks `"result":"pass","n":0` (zero tests executed counted as PASS). 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").
229
+ - Law: L0 and L3 (the model never grades its own work), L5 (not a pass: NOT PROVEN, owner harness); Seal accuracy.
230
+ - Rule: a test check with n=0 executed, or a count that cannot be parsed, is not_run with reason "no tests executed". VERIFIED and ALREADY_SATISFIED require at least one Loki-executed check with n>0 and a pass; otherwise the seal verdict is PARTIAL (the engine's existing NOT PROVEN label) and `no tests executed` is listed in NOT PROVEN.
231
+ - Mechanism (one shared module, loki-ts/src/util/check_result.ts): `testCount` (vitest, jest, bun test, pytest, go test -v (the engine passes -v; non-verbose is unmeasured), unittest, Playwright, cargo test, node --test, mocha; null = unknown), `classifyCheck` (kind test needs n>0 to pass; kind static = lint/typecheck/scan, decided by exit code), `hasExecutedProof`.
232
+ - Sibling sweep (every site that set or consumed "pass"):
233
+ - stages/verify.ts runCheck (was `n: ran(out) ?? 0` on a pass, and a null count passed): now classifyCheck. Lint, tsc, eslint, ruff, bash -n, shellcheck and select-tests are kind static.
234
+ - stages/wall.ts classify (exit 0 was an unconditional pass, feeding base_run.pass and wallGreenOnBase): now classifyCheck; zero or unknown count is not_run.
235
+ - stages/deep.ts runFullSuite (exit 0 was a pass): now classifyCheck, not_run lists NOT PROVEN. Council and secret-scan pass entries are static (no tests exist to count).
236
+ - stages/seal.ts verdictOf (VERIFIED and every ALREADY_SATISFIED route: intake.already_satisfied, wallGreenOnBase, implement exit already_done): gated on `proof` (hasExecutedProof over verify's raw checks, or a Wall base run with n>0).
237
+ - Consumers unchanged and now correct by construction: e10ext/select.ts, e10ext/reviewer_body.ts, features/pr_criteria.ts (they read result "pass", which now implies n>0 for test checks).
238
+ - Not applicable: modernize/presealed_wall.ts (red-base proof, never a pass), runner/quality_gates.ts (gate stubs, not test runs).
239
+ - Fixture: loki-ts/tests/engine10/check_result.test.ts (vitest `No test files found` and `Test Files 0`, pytest `no tests ran`, jest, cargo, mocha zero; go unparsed is unknown; real pass keeps n; verdict gate: VERIFIED and ALREADY_SATISFIED without proof are PARTIAL).
225
240
 
226
241
  ## FC-17 The Wall spends time and money and writes nothing
227
242
  - User saw: the same run's Wall produced "files": [] in 1m42s, with base_run 0/0/0. This is the D82-WALL0 class again.
228
243
  - Law: L5 (no work without evidence), cost.
229
244
  - Siblings: D82-WALL0 and any stage that can finish with zero artifacts and still bill.
230
245
  - 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.
231
- - Fixture: owed. A repo with no runnable test command yields a Wall skip under 10s with NOT PROVEN.
246
+ - Fixture: loki-ts/tests/engine10/runner_errors.test.ts (FC-17 block). A repo with no runnable test command yields a Wall skip under 10s.
247
+ - Status: FIXED for the no-runner case (lane G). wall.ts runWall prechecks, before any model session: a detected test map with no runner and no .py or .go file in the repo map returns stage.skipped with reason "no runnable test command detected: the Wall cannot write a runnable check". Still open: a Wall that has runners but writes nothing still bills its session (the SessionRunner has no progress hook for a no-progress cutoff); needs a session.ts change.
248
+
249
+ ## FC-19 Loki's own stage rules talk a capable model out of doing the job
250
+ - User saw: FireLater#17 run e10-20261003T200907Z-fea1 on 10.9.1 ended BLOCKED in 6m58s with a draft PR. The model's reason: "spec conflict: the task asks for all 37 route files to be migrated, validated and covered 100%, but the stage rules limit me to the named files and a few tests". Raw Claude Code finishes the same task in about 2 minutes. The user was told their spec conflicted; it was Loki's brief.
251
+ - Law: L1 (never below raw), L0 (the harness may not shrink the model's job), L5 (a harness failure is reported as one, never as the user's spec conflict).
252
+ - Siblings (limiting language swept, kept only where the stage is a read-only role or a trust rule):
253
+ - Fixed: loki-ts/src/features/lean_prefix.ts STAGE_PREFIX and LEAN_PREFIX, now role-neutral (they also prefix the read-only plan brief and the Wall author brief, so no full-job text lives there).
254
+ - Fixed: loki-ts/src/e10ext/context.ts FIXED_RULES, the implement brief only ("Run only the impacted tests named below", "Never run the full test suite, an E2E suite, or a long-lived server" removed; the full job is stated here).
255
+ - Fixed: loki-ts/src/engine10/stages/implement.ts brief ("Impacted tests: none known" wording) and its fixed 480s implement limit (now derived from the run budget in machine.ts; deep mode now also gets its 1800s session limit, where session.ts used to kill it at 480s).
256
+ - Kept, role-defining read-only stages: stages/plan.ts and engine10/already_done.ts ("do not edit any file", "do not run tests"); they never implement.
257
+ - Kept, deliberate parallel fence: features/speed/unit_mode.ts (a decomposer-set write set, off unless LOKI_UNIT_SPEC).
258
+ - Fix briefs reuse buildImplementBrief, so they inherit the same fix.
259
+ - Mechanism: one shared constant brief (full job, trust rules only) plus one resume. No code inspects the model's wording (L0): on any LOKI_SPEC_CONFLICT from implement, util/conflict_resume.ts resumes the session exactly once with a correction ("Loki imposes no file or test limits; if your conflict is only about Loki's own rules, finish the task. If the task itself conflicts, restate the conflict."). If the model still declares a conflict the outcome is the normal BLOCKED with its one question (A-110). User work always keeps its PR or draft PR (E-67, L6).
260
+ - Fixture: tests/engine10/conflict_resume.test.ts (a conflict that clears continues; one that persists stays BLOCKED with its question), tests/e10ext/full_job_brief.test.ts (limiting phrases gone, trust rules present, plan and Wall briefs carry no full-job wording), tests/engine10/machine.test.ts (deep implement session gets 1800s), tests/engine10/supervisor_backstop.test.ts (a PARTIAL seal after a failed implement stage still opens its PR).
261
+
262
+ ## FC-20 The Control Plane home cannot start a new app and shows a bare "HTTP 404"
263
+ - User saw: on the redesigned CP home the founder typed "create an async timezone page that gets time from a free source for the given location and displays sun movement for it in natural graphic generated as code", with the chips repo "server directory", provider claude and model haiku, and pressed Start. A red "HTTP 404" appeared under the composer, and no run started.
264
+ - Law: L5 (an honest, harness-owned reason with a next step, never a raw status), L6 (a start request never fails silently), L1 (raw Claude Code starts a greenfield app from one sentence; Loki must too).
265
+ - Siblings: every CP action that surfaces a raw HTTP status (start, stop, resume, retry, receipt fetch); a UI bundle served by an older CP process after an upgrade (version skew); the loopback guard rejecting a local request; any entry point that assumes a repo exists (CP composer, `loki start` with only a brief).
266
+ - Mechanism: one shared CP request helper turns every non-2xx into a plain sentence (what failed, why, next step). The UI and server carry one version, and a stale CP process restarts, or refuses a newer UI with that sentence. Rescoped by the founder at 22:03Z: Loki is not a vibe coding tool, so the home box is not a build prompt; it becomes Ask Loki (BOARD CP-ASK), and greenfield-from-composer is dropped.
267
+ - Fixture: owed. A forced 404 renders a sentence, not "HTTP 404"; a version-skewed UI gets the restart sentence.
268
+
269
+ ## FC-21 A large task hits the implement time limit and the run skips verify, then reports two different outcomes
270
+ - User saw: FireLater#17 on 10.10.3 (run e10-20261003T220847Z-78fa, steering 22:08Z). The model did the whole migration (83 files, +3999/-2476) and the backend suite then had 5855 pass, 3 fail. But implement stopped at "limit" after 639s under a fixed 900s run cap on a subscription run with no dollar cap. The run skipped verify and fix and went straight to commit and seal. The CLI printed "Outcome: FAILED, Reason: limit" while the receipt and run.completed said PARTIAL.
271
+ - Law: L1 (raw Claude Code would have kept going and fixed the 3 failures), L2 (fail open on work: the work that exists is verified, never abandoned), L5 (the limit is a harness-owned reason), L7 (one source of truth for the outcome).
272
+ - Siblings: every stage that can end at "limit" (plan, wall, implement, fix, deep); every caller that jumps from a stage failure straight to seal; every outcome printer (CLI summary, CP run page, PR body, Slack) that derives the verdict itself instead of reading receipt.verdict; FC-19 (a fixed time handicap on implement).
273
+ - Mechanism: (a) a limit in implement still runs verify on the work that exists, plus the fix rounds the remaining budget allows, and never jumps to seal; (b) the run time budget scales with task size (sizing and the Project Model: files, packages), and subscription runs default to a generous wall cap that can be set in loki.yaml; (c) the implement session is told its remaining time so it can checkpoint with tests passing; (d) every outcome printer reads receipt.verdict.
274
+ - Fixture: owed. A fake implement that hits the limit is followed by a verify stage event; the CLI summary equals receipt.verdict for VERIFIED, PARTIAL, FAILED and BLOCKED; a large sized task gets a larger cap than a small one.
@@ -585,3 +585,12 @@ Two of the four baseline losses were noise; two are real. Internal measurement,
585
585
  | --- | --- | --- | --- | --- | --- | --- | --- |
586
586
  | 2026-10-03 | claude-sonnet-5-5 (and claude-sonnet-5, now the standard price) | 2 (was 3 in loki-ts/data/model-pricing.json) | 10 (was 15) | 0.20 | 2.50 | 1M, standard pricing | platform.claude.com/docs/en/about-claude/pricing, read 2026-10-03 |
587
587
  Cost per completed task for sonnet arms measured before this date used the old 3/15 table; they overstate by 1.5x and are not comparable without rescaling.
588
+
589
+
590
+ ## FireLater#17 rerun gate (real repo, fresh clone, --no-pr)
591
+ | Version | Outcome | Cost | Notes |
592
+ | --- | --- | --- | --- |
593
+ | 10.6.14 | STALLED | $2.66 | |
594
+ | 10.7.1 | false ALREADY_SATISFIED, then FAILED | $2.69 | FC-15 class |
595
+ | 10.9.1 | BLOCKED | $0.75 | brief handicap, FC-19 class |
596
+ | 10.10.3 | PARTIAL | $2.27 | 12m; full migration (83 files); backend 5855/5858 green; implement stopped at a 900s run cap and verify was skipped (FC-21); run e10-20261003T220847Z-78fa, main be0799f, reported by steering 22:08Z |
@@ -1,5 +1,14 @@
1
1
  # Progress
2
2
 
3
+ ## 2026-10-03T21:26Z: v10.10.1 latest, v10.10.2 on next (CoS)
4
+ - v10.10.1: release run 37152525535 success. Smoke passed (peer, 20:58Z); promote moved latest (`npm view loki-mode dist-tags` = latest 10.10.1). The MCP registry publish was skipped: the publisher token expired and the MCP content is unchanged since 10.9.1.
5
+ - v10.10.2 at 78dc27a45: release run 37154153167 success; dist-tags next 10.10.2. Ships CP-REDESIGN, FC-01 Project Model default, the coverage step in test.yml, the cp-redesign image guard, and core-budget (engine10 core 4719; engine suites 1431/0, tsc rc=0 on merged main).
6
+ - Local main 1ea6596f9 (unpushed): CP follow-ups a88af4bf3 (MEDIUM APPROVE; CP 454/0, ui tsc rc=0). Follow-ups filed: F1 diffstat failures are uncached, so git respawns per list request (5s each); the leading-dash sha fixture is missing.
7
+ - FC-15 redesigned per steer: no refusal path; ALREADY_SATISFIED is checked against the PR target. aa0e626ba got REQUEST_CHANGES because the unmerged_loki_work note is not user-visible; the fix is in progress (fix-fc15-r1). Follow-up: receipt and draft-PR allow-signals.
8
+ - FC-19 2b1aa50e7: HIGH BLOCK (regex scope guard misclassifies 10/10; a silent PARTIAL with no PR or comment; STAGE_PREFIX reaches plan/Wall). Fix in progress (fix-fc19).
9
+ - FC-16 6155c23cc + FC-02 d0ef2995e integrated on main as slice-fc16-fc02-integ 20211aecf (C1/C2 applied, lint identified by kind:"static" only; 1472/0). HIGH review in progress.
10
+ - CLI follow-ups (peer): `loki status` prints a dead CP URL; the start line still suggests legacy (goes with W1-01).
11
+
3
12
  ## 2026-10-03T20:09Z: v10.10.0 pushed, P0/P1 lanes staffed (CoS)
4
13
  - v10.10.0 pushed at 0240a0a00 (release run 37150219461 in progress). It carries the status renderer, the CLI registry and completions, STALE-ZERO SZ-01..03, W1-02/W1-03, the moat P7 retarget and the fx-tests reds. Evidence in main: bun tests 1576/2 (the 2 are A-130 load flakes, 16/0 alone), p7 rc=0, test-release-dist-guard rc=0.
5
14
  - Main CI RED on Bun Parity: the status and status-json cases diff the Loki 10 status against the legacy bash box. Fix is in the W1-01b lane (W2-01).
@@ -2205,3 +2214,11 @@ The swarm is stopped: .loki/V10-STOP exists, the loop has no wake-ups, and the c
2205
2214
  - Usage reading relayed by Loki steering (`claude -p "/usage"`, peer-stamped about 18:10Z, recorded at 17:43Z local clock): session 28%, week 71%, resets Oct 7 12:59 ET. The pulse's 518% projection extrapolates today's burst rate; recalibrated from this reading.
2206
2215
  - Governor plan until Oct 7: ONE lane (sonnet builder, opus review only on trust paths), stop at 81% weekly (4% reserve below the 85% floor). Order: (1) 10.7.1 guard fix-forward and release, (2) EL-W1-01 Project Model, (3) EL-W1-06 failure ownership (absorbs FC-02), (4) EL-W1-00 static L0 guard. In-flight agents finish; no other dispatch. Pending reviews (FC-09, EL-W0-06, FC-10) wait for the reset.
2207
2216
  - Main 08bf593f2: L0 recorded (ENGINE-LAWS, L0-WAVE1.md, FC-11). Full bun test after merges: 3353 pass, 2 fail (the two known guards only).
2217
+
2218
+ ## 2026-10-03T22:26Z (CoS)
2219
+ - 10.10.3 published and promoted: release run 37156522424 success; `npm view loki-mode dist-tags` latest=10.10.3 next=10.10.3 (18:10 local).
2220
+ - FC-15 merged on main 87965225f after the scoped opus re-check APPROVE (c59035fbc); budget+intake 57/0, tsc rc=0 on the merge; e10ext 1499/1500. Pushed.
2221
+ - Founder 22:03Z: CP home box is Ask Loki (read-only async search/compare over runs, receipts, repos, issues, METRICS), not a build prompt. CP-START rescoped to the 404, CP-ASK row (HIGH, Architect first). 7b02aafa5.
2222
+ - FireLater#17 gate on 10.10.3 (steering): PARTIAL $2.27, full migration, 5855/5858 green; implement hit the 900s cap and verify was skipped. FC-21 filed (8d17b8c59); sonnet fix-fc21 seated 22:24Z under D87.
2223
+ - FC-16 narrowed (Go exit 0 always not_run) at 1f3c97831: 1504/0, red-then-green 4/6 against c35bc2d62; opus re-review in flight.
2224
+ - Next: FC-16 APPROVE + FC-21 green, then one train FC-15+FC-16+FC-21, then the gate rerun.
@@ -0,0 +1,188 @@
1
+ # Control Plane parity with the legacy dashboard
2
+
3
+ Founder rule: the legacy dashboard had every button and feature, including unwired ones. The Control Plane (CP) reaches parity only when each legacy control is wired to a real backend. A CP page whose backend does not exist is not rendered (CP-ENTERPRISE-UI.md section 0 item 4), so every BACKEND-MISSING row below names the route to build before its control may ship.
4
+
5
+ Source of the legacy inventory: docs/v10/cp-redesign/legacy/INDEX.md (screenshots and per-control endpoint results, captured from commit 102629c77). CP evidence: every WIRED row was proven by a curl against a CP on a temp SQLite DB and a fixture .loki (CP on 127.0.0.1, fixture runs copied from the main checkout). Read routes were called with GET; action routes with a loopback peer, Host 127.0.0.1 and JSON content type. The note column cites the HTTP status and the response shape (top-level keys) that was returned.
6
+
7
+ Statuses:
8
+ - WIRED: real route plus real data, proven by the curl cited in the note.
9
+ - BACKEND-MISSING: no CP route yet (a curl returned 404); the note names the route to build.
10
+ - DROP: dead in Loki 10, with the reason in the note.
11
+
12
+ Reading the shared rows: "legacy page" is the data-section of the legacy dashboard. CP page targets use the page names in CP-ENTERPRISE-UI.md section 3.2 (Home, New run, Run thread, Runs, Receipts, Cost, Models, Integrations, Notifications, Audit, Settings) plus pages this parity work adds (Checkpoints, Fleet, Context, Memory, Council, Quality, Spec checklist, App runner, Learning, Migration).
13
+
14
+ ## Session panel and shell
15
+
16
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
17
+ |---|---|---|---|---|---|
18
+ | Start build with spec text | Session panel | New run | POST /v1/start | WIRED | Validation proven: POST /v1/start with an empty body returned 400 {"error":"target must be a string"}. Spawn path not exercised in the fixture (it would start a real loki process). |
19
+ | Execution model select at start | Session panel | New run (model chip) | GET /v1/providers, POST /v1/start | WIRED | GET /v1/providers returned 200 {providers (6 entries), catalog_updated, probe_timeout_ms}. |
20
+ | Advisor model select at start | Session panel | New run (advisor chip) | POST /v1/start body.advisor | BACKEND-MISSING | /v1/start has no advisor field. Build: accept advisor_model in /v1/start and pass it as LOKI_ADVISOR_MODEL. Per CP-ENTERPRISE-UI.md section 1 there is no v10 advisor, so confirm with the CTO before building; if rejected this row becomes DROP. |
21
+ | Mid-run model switch (Run model select) | Session panel | Run thread | POST /v1/session/model | DROP | v10 reads the model at run start only; legacy wrote a file nobody consumes mid-iteration (POST /api/session/model returned 200 but only recorded the choice). Retry with another model instead. |
22
+ | Pause | Session panel | Run header | POST /v1/control/pause | WIRED | POST returned 503 {"success":false,"message":"Session process is not running; the pause signal may have no effect"} with no live process, which is the honest answer; the route writes the PAUSE signal file. |
23
+ | Resume | Session panel | Run header | POST /v1/control/resume | WIRED | POST returned 503 {"success":false,"message":"Session process is not running; the signal files were cleared"} with no live process. |
24
+ | Stop | Session panel | Run header | POST /v1/control/stop and POST /v1/runs/:source/:run/stop | WIRED | POST /v1/control/stop returned 503 {"success":false,"message":"Session process is not running; the stop signal may have no effect"}; POST /v1/runs/<unknown>/stop returned 404 {"error":"this run's repo is not known on this machine"} (route live; run-scoped stop needs a known repo). |
25
+ | Retry run | Run manager | Run header | POST /v1/runs/:source/:run/retry | WIRED | POST /v1/runs/<unknown>/retry returned 404 {"error":"this run's repo is not known on this machine"} (route live and guarded; a known run spawns a fresh loki start, not fired here to avoid spawning). |
26
+ | Answer a BLOCKED question | Escalations | Run thread reply prompt | POST /v1/runs/:source/:run/answer | WIRED | POST /v1/runs/<unknown>/answer returned 404 {"error":"run not found"}; an earlier call on the fixture run wrote an answer file for the fixture run in the control dir; the stray file was removed. |
27
+ | Session status card (mode, phase, complexity, iteration, uptime, connected) | Session panel | Run header and Home | GET /v1/status | BACKEND-MISSING | GET /v1/status returned 404. Build GET /v1/status: status, phase, iteration, complexity, mode, provider, uptime_seconds, running_agents, pending_tasks from .loki/session.json and dashboard-state.json (legacy /api/status shape; the shim at src/server/legacy/routes.ts maps it only partially). |
28
+ | Agents running and tasks queued counters | Session panel | Home KPI row | GET /v1/stats, GET /v1/fleet/summary | WIRED | GET /v1/stats returned 200 {since, runs_total, runs_finished, runs_running, by_verdict, blocked_waiting, verified_rate, verified_unchecked}; GET /v1/fleet/summary returned 200 {total_runs, running_runs, stopped_runs, total_cost_usd, total_cost_partial}. Per-agent counts need GET /v1/agents (404). |
29
+ | Live connection indicator and live updates (WS /ws) | Session panel | Shell | GET /v1/stream | WIRED | GET /v1/stream and GET /v1/stream returned 200 content-type text/event-stream (the per-run stream route shares the module, stream.ts). |
30
+ | Collapse and expand status panel | Session panel | Shell | none (client only) | WIRED | Client-side only in legacy as well (no request fired in the capture). |
31
+ | Settings disclosure (API URL, Go) | Session panel | Settings | GET /v1/config | WIRED | GET /v1/config returned 200 {path, exists, etag, config, errors}. |
32
+ | Dark mode toggle | Session panel | Shell menu | none (client only) | WIRED | Client-side in legacy (no request fired in the capture). |
33
+ | Project picker (focus another project) | Header | Repo chip | GET /v1/repos, GET /v1/focus, POST /v1/focus | WIRED | GET /v1/repos returned 200 {repos (23 entries)}; GET /v1/focus returned 200 {project_dir, loki_dir}; POST /v1/focus with an empty project_dir returned 400 {"error":"project_dir must not be empty"}; legacy POST /api/focus returned 200 in the capture. |
34
+ | Running projects list and per-app Stop | Header | Repo filter | GET /v1/running-projects | BACKEND-MISSING | 404. Build GET /v1/running-projects (repos with a live run.pid) and per-project stop through POST /v1/control/stop with a project field. |
35
+ | Receipts badge | Header | Shell | GET /v1/stats | WIRED | GET /v1/stats returned 200 with a top-level receipts key (keys: since, runs_total, runs_finished, runs_running, by_verdict, blocked_waiting, verified_rate, verified_unchecked, keys_configured, cost, receipts). |
36
+ | Budget banner (no cap, hit) | Shell | Shell | GET /v1/cost/timeline | WIRED | GET /v1/cost/timeline returned 200 {current_run, runs (9 entries), runs_count, project_total_usd, project_total_partial, budget}. |
37
+ | Mascot presence | Shell | Shell | GET /v1/stats | WIRED | State derives from runs_running in /v1/stats. |
38
+ | Open in browser (app preview) | App Runner | App runner | GET /v1/app-runner | BACKEND-MISSING | 404. See App Runner rows. |
39
+
40
+ ## Overview
41
+
42
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
43
+ |---|---|---|---|---|---|
44
+ | First-run hero (loki quickstart, Copy command) | Overview | New run empty state | none (client only) | WIRED | Static text and a clipboard copy; no backend. |
45
+ | Spec panel and Spec history | Overview | Run thread (spec tab) | GET /v1/spec, GET /v1/spec/history | BACKEND-MISSING | Both returned 404. Build: the spec text (task.md or issue.json of the active run) plus its revision list. |
46
+ | RARV timeline (Reason, Act, Reflect, Verify) | Overview | Run thread stage timeline | GET /v1/phases | BACKEND-MISSING | 404. GET /v1/runs/:source/:run returns stages, but the RARV phase fill needs GET /v1/phases (per-iteration phase durations from .loki/state/phases). Build it. |
47
+ | Session resume tiles (created, completed, blocked, errors) | Overview | Home | GET /v1/stats | WIRED | /v1/stats returned runs_total, runs_finished, blocked_waiting, by_verdict. |
48
+ | Session diff | Overview | Run thread diff | GET /v1/session-diff | BACKEND-MISSING | 404. GET /v1/runs/:s/:r/artifact/* serves diff.patch for finished runs; the live working-tree diff needs GET /v1/session-diff. |
49
+ | Task board (Pending, In Progress, In Review, Completed) | Overview | Work board | GET /v1/tasks | WIRED | GET /v1/tasks returned 200, a list of 4 tasks (the fixture queue). |
50
+ | Task board filters (All, Today, This Week, Running, Failed) and search | Overview | Work board | GET /v1/tasks | WIRED | Filters apply client side to the /v1/tasks list. |
51
+ | Add task, move task, edit task, delete task | Overview | Work board | POST, PUT, DELETE /v1/tasks | BACKEND-MISSING | /v1/tasks is read only (CP-ENTERPRISE-UI.md legacy table maps POST, PUT, DELETE /api/tasks to 410). Build POST /v1/tasks, PUT /v1/tasks/:id, DELETE /v1/tasks/:id and POST /v1/tasks/:id/move writing the .loki queue under the loopback guard. |
52
+ | Bulk select tasks | Overview | Work board | POST /v1/tasks/bulk | BACKEND-MISSING | Needs the task mutation routes above. |
53
+ | Task detail ("More") | Overview | Work board | GET /v1/tasks | WIRED | Detail fields come from the list payload. |
54
+
55
+ ## App Runner
56
+
57
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
58
+ |---|---|---|---|---|---|
59
+ | App status and URL | App Runner | App runner | GET /v1/app-runner | BACKEND-MISSING | 404. Build GET /v1/app-runner from .loki/app-runner/state.json (status, url, port, pid, started_at). |
60
+ | App logs | App Runner | App runner | GET /v1/app-runner/logs | BACKEND-MISSING | 404. Build, tailing .loki/app-runner/app.log with a size cap. |
61
+ | Restart app | App Runner | App runner | POST /v1/control/app-restart | BACKEND-MISSING | Not in ACTIONS (session_control.ts has pause, resume, stop, council-review). Add it as a signal file action. |
62
+ | Stop app | App Runner | App runner | POST /v1/control/app-stop | BACKEND-MISSING | Same as above. |
63
+
64
+ ## Checkpoints
65
+
66
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
67
+ |---|---|---|---|---|---|
68
+ | Checkpoint list | Checkpoints | Checkpoints | GET /v1/checkpoints | WIRED | 200 {checkpoints (20 entries)}. |
69
+ | Checkpoint detail | Checkpoints | Checkpoints | GET /v1/checkpoints/:id | WIRED | GET /v1/checkpoints/:id returned 200 {id, created_at, git_sha, message, files}. |
70
+ | Create Checkpoint | Checkpoints | Checkpoints | POST /v1/checkpoints | WIRED | 201 {id, created_at, git_sha, message, files}. |
71
+ | Rollback | Checkpoints | Checkpoints | POST /v1/checkpoints/:id/rollback | WIRED | POST /v1/checkpoints/nosuch/rollback returned 404 {"error":"checkpoint not found"} (route live; a real rollback rewrites a working tree and was not fired). |
72
+
73
+ ## Context
74
+
75
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
76
+ |---|---|---|---|---|---|
77
+ | Token context gauge, per-iteration table, compactions | Context | Context | GET /v1/context | WIRED | 200 {session_id, provider, updated_at, current, compactions, per_iteration, totals}. |
78
+
79
+ ## Fleet
80
+
81
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
82
+ |---|---|---|---|---|---|
83
+ | Fleet runs table | Fleet | Fleet and Runs | GET /v1/fleet/runs, GET /v1/runs | WIRED | /v1/fleet/runs returned a list of 22; /v1/runs returned 200 {runs (3), total, next_cursor}. |
84
+ | Fleet summary tiles | Fleet | Fleet | GET /v1/fleet/summary | WIRED | 200 {total_runs, running_runs, stopped_runs, total_cost_usd, total_cost_partial}. |
85
+ | Per-agent Kill, Pause, Resume | Fleet | Fleet | POST /v1/agents/:id/kill, pause, resume | BACKEND-MISSING | GET /v1/agents returned 404. Build GET /v1/agents plus the three POST routes (signal file per agent). The shim maps the legacy routes to 410 today. |
86
+ | Fleet cancel and retry run | Fleet | Fleet | POST /v1/runs/:s/:r/stop, retry | WIRED | See the Stop and Retry rows: both routes answered 404 for an unknown run. |
87
+ | Run detail, events and log | Run manager | Run thread | GET /v1/runs/:source/:run, GET /v1/runs/:source/:run/events | WIRED | Run detail 200 {source_id, run_id, origin_repo, issue_ref, task_source, group_id, unit_id, provider, ...}; events 200 {events (29), next_after, has_more}. |
88
+ | Run filters (verdict, repo, since, group) | Run manager | Runs | GET /v1/runs?verdict=&repo=&since= | WIRED | GET /v1/runs?verdict=FAILED answered 200. |
89
+ | Remove or prune run | Run manager | Runs | DELETE /v1/runs/:source/:run | WIRED | DELETE /v1/runs/<unknown> returned 404 {"error":"run not found"} (route live, loopback only, audited). |
90
+ | Import runs | Run manager | Runs | POST /v1/import | WIRED | POST /v1/import returned 200 {"runs":0,"sent":0,"failed":[]}. |
91
+
92
+ ## Quality
93
+
94
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
95
+ |---|---|---|---|---|---|
96
+ | Quality score gauge | Quality | Quality | GET /v1/quality | BACKEND-MISSING | 404. Build GET /v1/quality (score, grade, per-gate pass state) from .loki/quality/*.json. |
97
+ | Quality gates list | Quality | Quality | GET /v1/quality/gates | BACKEND-MISSING | Build from the same files. |
98
+ | Run quality scan | Quality | Quality | POST /v1/quality/scan | BACKEND-MISSING | Build as a loopback action spawning the scan command (argv only). Legacy POST /api/quality-scan is aborted by the harness. |
99
+ | Optimize Now (prompt optimizer) | Quality | Quality | POST /v1/prompt-optimize | BACKEND-MISSING | Build as a loopback action. Legacy /api/prompt-optimize. |
100
+ | Quality report | Quality | Quality | GET /v1/quality/report | BACKEND-MISSING | Build, serving .loki/quality/report. |
101
+ | Verify a run (receipt check) | Quality and Trust | Receipts | POST /v1/runs/:source/:run/verify | WIRED | POST /v1/runs/<unknown>/verify returned 404 {"error":"run not found"} (route live); GET /v1/keys returned 200 {kty, crv, x, kid, alg, use}. |
102
+
103
+ ## Trust
104
+
105
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
106
+ |---|---|---|---|---|---|
107
+ | Trust trajectory chart | Trust | Receipts | GET /v1/stats | WIRED | verified_rate and by_verdict from /v1/stats; per-day series from GET /v1/stats/cost?group=day (200 {group, since, rows, totals, budget}). |
108
+ | Receipts list and proofs page | Trust, proofs.html | Receipts | GET /v1/proofs | BACKEND-MISSING | GET /v1/proofs returned 404. GET /v1/runs lists runs with receipt fields, but the legacy proofs list (receipt id, sha256, signed, verified) needs GET /v1/proofs, and /api/proofs/summary needs GET /v1/proofs/summary. |
109
+ | Public key export | Trust | Receipts | GET /v1/keys | WIRED | 200 JWK {kty, crv, x, kid, alg, use}. |
110
+
111
+ ## Council
112
+
113
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
114
+ |---|---|---|---|---|---|
115
+ | Council overview state | Council | Council | GET /v1/council/state | WIRED | 200 {initialized, enabled, total_votes, approve_votes, reject_votes, last_check_iteration, consecutive_no_change, done_signals, convergence_history}. |
116
+ | Decision log (verdicts) | Council | Council | GET /v1/council/verdicts | WIRED | 200 {verdicts, details}; fixture holds no votes. |
117
+ | Convergence chart | Council | Council | GET /v1/council/convergence | WIRED | 200 {dataPoints (27)}. |
118
+ | Council report | Council | Council | GET /v1/council/report | WIRED | 200 {report}. |
119
+ | Council transcripts | Council | Council | GET /v1/council/transcripts | WIRED | 200 {transcripts, total, latest_id}. |
120
+ | Agents tab | Council | Council | GET /v1/agents | BACKEND-MISSING | 404; see Fleet. |
121
+ | Force Review | Council | Council | POST /v1/control/council-review | WIRED | 200 {"success":true,"message":"Council review requested"}. |
122
+
123
+ ## Spec Checklist
124
+
125
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
126
+ |---|---|---|---|---|---|
127
+ | Checklist items and status | Spec Checklist | Spec checklist | GET /v1/checklist | BACKEND-MISSING | 404. Build from .loki/checklist/checklist.json (legacy /api/checklist). |
128
+ | Verify checklist | Spec Checklist | Spec checklist | POST /v1/checklist/verify | BACKEND-MISSING | Build as a loopback action. |
129
+ | Waivers (add, remove) | Spec Checklist | Spec checklist | POST, DELETE /v1/checklist/waivers | BACKEND-MISSING | Build; the shim maps the legacy waiver routes to 410 today. |
130
+
131
+ ## Insights and Analytics
132
+
133
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
134
+ |---|---|---|---|---|---|
135
+ | Log stream (Auto-scroll, Clear, Download) | Insights | Run thread log | GET /v1/runs/:source/:run/events, GET /v1/runs/:source/:run/stream | WIRED | events 200 (29 events), stream is SSE. Download and Clear are client side. Project-wide log needs GET /v1/logs (404). |
136
+ | Project-wide log feed | Insights | Home activity | GET /v1/logs | BACKEND-MISSING | 404. Build, tailing .loki/logs with a limit and cursor. |
137
+ | Memory: Summary tab | Insights | Memory | GET /v1/memory/summary | BACKEND-MISSING | 404. Build counts of episodes, patterns, skills. |
138
+ | Memory: Episodes, Patterns, Skills | Insights | Memory | GET /v1/memory/episodes, patterns, skills | WIRED | Each returned 200, a list (1 entry each in the fixture). Detail routes /v1/memory/episodes/:id and /v1/memory/patterns/:id are registered. |
139
+ | Memory: Economics | Insights | Memory | GET /v1/memory/economics | WIRED | 200 {session_id, discovery_tokens, read_tokens, total_tokens, cache_hits, cache_misses, hit_rate, ratio, top_patterns}. |
140
+ | Memory: Search | Insights | Memory | POST /v1/memory/retrieve | BACKEND-MISSING | Legacy POST /api/memory/retrieve is mapped to 410 by the shim. Build GET /v1/memory/search?q=. |
141
+ | Memory: Consolidate Memory | Insights | Memory | POST /v1/memory/consolidate | BACKEND-MISSING | Build as a loopback action. |
142
+ | Memory: Notes, Ledgers, Handoffs, Semantic tabs and stats and files | Insights | Memory | GET /v1/memory/files, /v1/memory/stats | BACKEND-MISSING | Build file listings of .loki/memory/{notes,ledgers,handoffs,semantic}. |
143
+ | Learning dashboard (metrics, signals, aggregate) | Insights | Learning | GET /v1/learning/metrics, POST /v1/learning/aggregate | BACKEND-MISSING | GET returned 404. Build both. |
144
+ | USAGE.md viewer | Insights | Help link | none | DROP | A static doc; the Help menu links to it. No data feed. |
145
+ | Analytics: activity chart and heatmap | Analytics | Home trends | GET /v1/stats/cost?group=day, GET /v1/runs | WIRED | stats/cost returned 200 {group, since, rows, totals, budget}. Per-event activity (/api/activity) needs GET /v1/activity (404) for the heatmap. |
146
+ | Analytics: tool and agent breakdown | Analytics | Home trends | GET /v1/activity | BACKEND-MISSING | Build GET /v1/activity from the event log. |
147
+ | Pricing table | Analytics, Cost | Cost | GET /v1/pricing | BACKEND-MISSING | 404. Build from providers/model_catalog.json. |
148
+
149
+ ## Cost
150
+
151
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
152
+ |---|---|---|---|---|---|
153
+ | Cost gauge, tokens, cache ratio | Cost | Cost | GET /v1/cost/snapshot | WIRED | 200 {total_input_tokens, total_output_tokens, total_cache_read_tokens, total_cache_creation_tokens, total_tokens, cache_hit_ratio, estimated_cost_usd, cost_recorded}. |
154
+ | Cost timeline | Cost | Cost | GET /v1/cost/timeline | WIRED | 200 {current_run, runs (9), runs_count, project_total_usd, project_total_partial, budget}. |
155
+ | Cost breakdown by model, provider, repo, day | Cost | Cost | GET /v1/stats/cost | WIRED | 200 {group, since, rows, totals, budget}. |
156
+ | Cost waterfall page (cost.html) | Cost | Cost | GET /v1/cost/timeline | WIRED | Same payload as the timeline. |
157
+ | Prometheus metrics | Cost | Settings | GET /v1/metrics | WIRED | 200, Prometheus text (1824 bytes), not JSON. |
158
+
159
+ ## Notifications, Escalations, Migration, Wiki
160
+
161
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
162
+ |---|---|---|---|---|---|
163
+ | Notification feed (Feed, All, Build, Quality, System, Security) | Notifications | Notifications | GET /v1/notifications | WIRED | 200 {notifications (3), total, next_cursor}. |
164
+ | Notification triggers (edit) | Notifications | Notifications | PUT /v1/notifications/triggers | BACKEND-MISSING | Legacy PUT /api/notifications/triggers is mapped to 410. Build GET and PUT writing loki.yaml notifications through PUT /v1/config. |
165
+ | Escalations list and respond | Escalations | Home BLOCKED inbox | GET /v1/escalations, POST /v1/runs/:s/:r/answer | BACKEND-MISSING | List route returned 404; the respond half exists (answer route, WIRED). Build GET /v1/escalations from BLOCKED runs plus .loki/escalations. |
166
+ | Migration dashboard | Migration | Migration | GET /v1/migration | BACKEND-MISSING | 404. Build from .loki/migration (modernize runs). |
167
+ | Start a migration | Migration | Migration | POST /v1/migration/start | BACKEND-MISSING | Build as a loopback action (harness aborted the legacy call). |
168
+ | Wiki browser (Overview, Architecture, Key Modules, Data Flow, Ask) | Wiki | none | none | DROP | Wiki deleted from Loki 10 (LEGACY-REMOVAL.md:45). |
169
+
170
+ ## Standalone pages and onboarding
171
+
172
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
173
+ |---|---|---|---|---|---|
174
+ | Onboarding (start.html): GitHub connect, backlog import | start.html | Integrations | GET /v1/integrations | WIRED | 200 {integrations (7)}. Backlog import needs POST /v1/backlog (not built). |
175
+ | Backlog import | start.html | New run | POST /v1/backlog/import | BACKEND-MISSING | Build from GitHub issues through the integration token. |
176
+ | Audit log viewer | Audit | Audit | GET /v1/audit, GET /v1/audit/summary | WIRED | audit 200 {actions (11), total, next_cursor}; summary 200 {period_days, total_events, by_action, by_user, successful_events, failed_events, by_resource_type, recent_failures}. |
177
+ | Settings: loki.yaml read and write | Settings | Settings | GET, PUT /v1/config | WIRED | GET 200 {path, exists, etag, config, errors}; PUT /v1/config without If-Match returned 428 {"error":"If-Match is required"} (optimistic concurrency enforced). |
178
+ | Providers and CLI detection | Settings | Models | GET /v1/providers | WIRED | 200 {providers (6), catalog_updated, probe_timeout_ms}. |
179
+ | Merge queue and review risk | none (v10 only) | Runs | GET, POST /v1/merge/queue, GET /v1/review/risk | WIRED | GET merge queue 200 {measured, queue}; POST merge/queue with no prs returned 422 {"error":"prs must be 1 to 20 PR numbers (digits only, 7 max)"}; GET review/risk returned 422 without its required query. |
180
+
181
+ ## Dropped enterprise surfaces
182
+
183
+ | Feature | Legacy page | CP page target | Backing /v1 route | Status | Note |
184
+ |---|---|---|---|---|---|
185
+ | Tenant switcher | Header | none | none | DROP | Local single user; no tenants in Loki 10 (CP-ENTERPRISE-UI.md section 1). |
186
+ | API keys manager | Settings | none | none | DROP | The bearer token comes from env (src/server/auth.ts). |
187
+ | Managed memory panel | Insights | none | none | DROP | Managed memory dropped; run events cover it (GET /v1/runs/:s/:r/events). |
188
+ | Collab WebSocket (/ws/collab) | none | none | none | DROP | No multi-user presence in the local CP. |