loki-mode 10.10.1 → 10.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/dashboard/__init__.py +1 -1
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/BOARD.md +2 -0
- package/docs/v10/FAILURE-CLASSES.md +18 -2
- package/docs/v10/GUARDS.md +18 -0
- package/docs/v10/PROGRESS.md +9 -0
- package/docs/v10/cp-redesign/PARITY.md +188 -0
- package/docs/v10/cp-redesign/legacy/INDEX.md +1167 -0
- package/loki-ts/dist/loki.js +643 -641
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
- package/packages/control-plane/dist/server.js +714 -394
- package/packages/control-plane/src/server/diffstat.ts +77 -0
- package/packages/control-plane/src/server/repos.ts +5 -2
- package/packages/control-plane/src/server/routes/index.ts +1 -1
- package/packages/control-plane/src/server/runs.ts +3 -1
- package/packages/control-plane/ui/dist/assets/index-BinL6h3i.css +1 -0
- package/packages/control-plane/ui/dist/assets/index-D27veKDf.js +152 -0
- package/packages/control-plane/ui/dist/index.html +2 -2
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-B8RjG3sy.js → AdminPage-Dyx5OHmP.js} +1 -1
- package/web-app/dist/assets/{Avatar-Dttmvqc-.js → Avatar-WVxt-kYj.js} +1 -1
- package/web-app/dist/assets/{Badge-Bvyp8VrD.js → Badge-16vWJ-6u.js} +1 -1
- package/web-app/dist/assets/{Button-DtY5ZrZw.js → Button-CWVPIMTW.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-B2gbOwRp.js → CockpitPage-D5WhogJK.js} +1 -1
- package/web-app/dist/assets/{ComparePage-CHi5nZTU.js → ComparePage-CjJfjxcT.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BUuTj-OQ.js → ErrorBoundary-CNnObh81.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-C5aOn4ES.js → EvidenceReceiptPanel-Cn1PE_JV.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-isVxxHXb.js → GitHubIssuesPanel-CcH9neSU.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-DtDpxyQl.js → GitHubPRsPanel-C-n6inCN.js} +1 -1
- package/web-app/dist/assets/{HomePage-Casf-LUB.js → HomePage-BZ7PCPFR.js} +2 -2
- package/web-app/dist/assets/{LoginPage-DvB78691.js → LoginPage-CJsigIUa.js} +1 -1
- package/web-app/dist/assets/{MagicPage-DU6hmbnC.js → MagicPage-ClZaKmXT.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-DcPwzoS8.js → MetricsPage-ELQn9-cf.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-Bs6WxAZ8.js → NotFoundPage-Dc_zp3RF.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-RBIqC-DJ.js → ProjectPage-B5K1NDuH.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-CogXD7jM.js → ProjectsPage-C2l5SiIN.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-pAyJAfPt.js → SettingsPage-DkDNp6Pd.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-D6bT2bDd.js → ShowcasePage-1zasFSKz.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-CE8xiJRh.js → SystemSettingsPage-hIm_4NUx.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-wMS55TDT.js → TeamsPage-DUb_TA22.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-COJNVQqu.js → TemplatesPage-B1mj-eA4.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-Cc2XASxd.js → TerminalOutput-BX1UwelI.js} +1 -1
- package/web-app/dist/assets/{activity-C6eHFDjL.js → activity-B8APKMuh.js} +1 -1
- package/web-app/dist/assets/{bell-BJpVYj4n.js → bell-BS8WL-tI.js} +1 -1
- package/web-app/dist/assets/{bot-BwRVVUQL.js → bot-e9I6yy12.js} +1 -1
- package/web-app/dist/assets/{check-CGDwoKy8.js → check-BbgR7Ovw.js} +1 -1
- package/web-app/dist/assets/{chevron-left-CF2Nilj6.js → chevron-left-BcDqv7aX.js} +1 -1
- package/web-app/dist/assets/{circle-alert-D0RyRec1.js → circle-alert-BnDT8wxe.js} +1 -1
- package/web-app/dist/assets/{clock-xeF3gW0W.js → clock-LPz79lks.js} +1 -1
- package/web-app/dist/assets/{cloud-D5Sy69ZZ.js → cloud-BcgBi5T1.js} +1 -1
- package/web-app/dist/assets/{code-xml-C6-5Ql9I.js → code-xml-5zcykgva.js} +1 -1
- package/web-app/dist/assets/{database-BSjG1_z0.js → database-D9KLqhHq.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-FnDR2QUu.js → dollar-sign-CrINoZ4o.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-BiOK9vR6.js → file-code-corner-CA7G72ip.js} +1 -1
- package/web-app/dist/assets/{file-plus-3WALQDEE.js → file-plus-D8tHdHn_.js} +1 -1
- package/web-app/dist/assets/{globe-vUdUrQqp.js → globe-CT0Ts5bO.js} +1 -1
- package/web-app/dist/assets/{hammer-0VwHUEpa.js → hammer-tUpu0LJk.js} +1 -1
- package/web-app/dist/assets/{index-BMKIwteZ.js → index-DdjeiWUI.js} +3 -3
- package/web-app/dist/assets/{layers-C6q8kzST.js → layers-BzzJ7w3C.js} +1 -1
- package/web-app/dist/assets/{loader-circle-B4Tz724d.js → loader-circle-BBdMdxIV.js} +1 -1
- package/web-app/dist/assets/{lock-yxvEA65n.js → lock-Cg9DkEh7.js} +1 -1
- package/web-app/dist/assets/{package-BpKD0Ot0.js → package-DHs8IEJR.js} +1 -1
- package/web-app/dist/assets/{plus-Ibqx_Vo9.js → plus-70JSAqB1.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-C9auyvi-.js → refresh-cw-DjggkboT.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-2cEiXm6O.js → rotate-ccw-c1NNyyL5.js} +1 -1
- package/web-app/dist/assets/{scroll-text-BPAWML-w.js → scroll-text-B49wQrJ2.js} +1 -1
- package/web-app/dist/assets/{server-CZh6B1zx.js → server-BHKG-dDi.js} +1 -1
- package/web-app/dist/assets/{shield-alert-CivolUIx.js → shield-alert-Dx9MoBGm.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-BP9covEH.js → thumbs-up-frEbS59j.js} +1 -1
- package/web-app/dist/assets/{trash-2-BCDfTcNx.js → trash-2-1Gd8pXFG.js} +1 -1
- package/web-app/dist/assets/{trending-down-5LypivXh.js → trending-down-BpUeO-FP.js} +1 -1
- package/web-app/dist/assets/{trending-up-DNt4SFdk.js → trending-up-CvhWp8qO.js} +1 -1
- package/web-app/dist/assets/{upload-DBmHbY6y.js → upload-DZuMugqd.js} +1 -1
- package/web-app/dist/assets/{usePolling-DOPZcbUL.js → usePolling-D5KUSkfs.js} +1 -1
- package/web-app/dist/assets/{user-BQTJJDCG.js → user-BF9vws84.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/packages/control-plane/ui/dist/assets/index-BQbFv65M.css +0 -1
- package/packages/control-plane/ui/dist/assets/index-NAMkcA9N.js +0 -165
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.
|
|
6
|
+
# Loki Mode v10.10.3
|
|
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.
|
|
486
|
+
**v10.10.3 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
10.10.
|
|
1
|
+
10.10.3
|
package/dashboard/__init__.py
CHANGED
package/docs/CLI-REFERENCE.md
CHANGED
|
@@ -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.
|
|
3
|
+
Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v10.10.3. 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 |
|
package/docs/INSTALLATION.md
CHANGED
|
@@ -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.
|
|
5
|
+
**Version:** v10.10.3
|
|
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,5 @@ 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). |
|
|
@@ -22,9 +22,12 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
|
|
|
22
22
|
- visual_evidence.ts:155-168;
|
|
23
23
|
- deep.ts;
|
|
24
24
|
- the brief's impacted commands;
|
|
25
|
-
- deferred by the FC-01 stopgap (de12ad0cb): deep.ts
|
|
25
|
+
- deferred by the FC-01 stopgap (de12ad0cb): deep.ts full suite at the repo root, verify.ts tsconfig root-only, verify.ts ESLINT_CONFIGS root-only. All three are now closed (see Status).
|
|
26
26
|
- Mechanism: Project Model packageRootOf/commandFor (EL-W1-01, EL-W1-04a/b). Interim: EL-W0-03.
|
|
27
|
-
-
|
|
27
|
+
- Status (FIXED, lane E): the Project Model is ON by default (opt-out LOKI_E10_PROJECT_MODEL=0). One shared resolver, loki-ts/src/project_model/resolve.ts (loadProjectApi, siteFor, groupByPackage) plus verify.ts commandFor(t, repoDir, api), returns cwd and argv. A file owned by a package below the repo root runs in that package dir with a package-relative path. An unknown model, the opt-out, or a root-only (single-package) model resolves to the repo root exactly as before.
|
|
28
|
+
- Sites now on the resolver: verify.ts test loop and subtractBase base run; verify.ts runLintChecks (tsc, eslint config lookup, cwd and file paths per package, check name lint:tsc:<root>); wall.ts RealBaseTestRunner; deep.ts runFullSuite (each package's own test command in its cwd); features/visual_evidence.ts (UI boot command, Playwright and e2e media from the UI package dir); implement brief (e10ext/context.ts prints `cd <pkg> && cmd`).
|
|
29
|
+
- Deliberately root-only: verify.ts select-tests (scripts/select-tests.sh, Loki's own repo); ruff and shellcheck (take repo-relative paths from the root); wall_manifest.ts reads the root package.json for style hints (read only, not a runner invocation).
|
|
30
|
+
- Fixture: tests/fixtures/firelater-17 plus the shape fixtures in benchmarks/tasks/shapes; tests/fixtures/monorepo-fc01 (backend with vitest, frontend, no root package.json) with loki-ts/tests/engine10/monorepo_cwd.test.ts (red at the repo root before, green after; includes the single-package regression).
|
|
28
31
|
|
|
29
32
|
## FC-02 A runner load error was treated as a code failure; two fix rounds, then STALLED
|
|
30
33
|
- User saw: 11 min, $2.66 and a FAILED draft PR for a bug that did not exist. Raw: done in 2 min.
|
|
@@ -226,3 +229,16 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
|
|
|
226
229
|
- Siblings: D82-WALL0 and any stage that can finish with zero artifacts and still bill.
|
|
227
230
|
- 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.
|
|
228
231
|
- Fixture: owed. A repo with no runnable test command yields a Wall skip under 10s with NOT PROVEN.
|
|
232
|
+
|
|
233
|
+
## FC-19 Loki's own stage rules talk a capable model out of doing the job
|
|
234
|
+
- 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.
|
|
235
|
+
- 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).
|
|
236
|
+
- Siblings (limiting language swept, kept only where the stage is a read-only role or a trust rule):
|
|
237
|
+
- 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).
|
|
238
|
+
- 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).
|
|
239
|
+
- 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).
|
|
240
|
+
- 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.
|
|
241
|
+
- Kept, deliberate parallel fence: features/speed/unit_mode.ts (a decomposer-set write set, off unless LOKI_UNIT_SPEC).
|
|
242
|
+
- Fix briefs reuse buildImplementBrief, so they inherit the same fix.
|
|
243
|
+
- 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).
|
|
244
|
+
- 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).
|
package/docs/v10/GUARDS.md
CHANGED
|
@@ -819,3 +819,21 @@ previously mismarked two merged guards (S-16, S-74) as PENDING.
|
|
|
819
819
|
worktree allowed, leader `git checkout main` allowed, subagent forms and
|
|
820
820
|
the unchecked-`cd` case blocked.
|
|
821
821
|
Run: `bash tests/test-v10-guard.sh`.
|
|
822
|
+
|
|
823
|
+
## cp-redesign image allowlist (third-party screenshot incident)
|
|
824
|
+
|
|
825
|
+
- **Incident:** a third-party product screenshot showing a real person's name
|
|
826
|
+
and customer data was committed under `docs/v10/cp-redesign/` by a UI slice
|
|
827
|
+
and was caught only in review.
|
|
828
|
+
- **Root cause:** nothing restricted which images may live in the doc folder;
|
|
829
|
+
evidence is the review finding on the CP-REDESIGN merge.
|
|
830
|
+
- **The guard:** `docs/v10/cp-redesign/ALLOWED-IMAGES.txt` is an explicit
|
|
831
|
+
allowlist with one-line provenance per image. `tests/test-cp-redesign-images.sh`
|
|
832
|
+
fails on any tracked image there that is not listed, and on any tracked image
|
|
833
|
+
anywhere named vorflux, lovable, bolt, v0-, or competitor, or under a path
|
|
834
|
+
containing `ui-refs` or `research/`. `.githooks/pre-commit` runs the same
|
|
835
|
+
check on staged files (`--staged`).
|
|
836
|
+
- **The test that proves it fires:** the self-test inside
|
|
837
|
+
`tests/test-cp-redesign-images.sh` builds a fixture with an unlisted image,
|
|
838
|
+
a ui-refs image and a banned name and asserts each fails.
|
|
839
|
+
Run: `bash tests/test-cp-redesign-images.sh`.
|
package/docs/v10/PROGRESS.md
CHANGED
|
@@ -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).
|
|
@@ -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. |
|