loki-mode 10.7.1 → 10.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/loki +4 -1
- package/autonomy/run.sh +9 -5
- package/dashboard/__init__.py +1 -1
- package/dashboard/server.py +6 -8
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/CP-ENTERPRISE-UI.md +263 -2
- package/docs/v10/FAILURE-CLASSES.md +21 -0
- package/docs/v10/METRICS.md +6 -0
- package/loki-ts/data/model-pricing.json +6 -6
- package/loki-ts/dist/loki.js +800 -807
- package/loki-ts/package.json +1 -1
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
- package/packages/control-plane/dist/server.js +17090 -5672
- package/packages/control-plane/drizzle/0004_cpe03_local_repos_actions.sql +17 -0
- package/packages/control-plane/drizzle/meta/0004_snapshot.json +542 -0
- package/packages/control-plane/drizzle/meta/_journal.json +9 -2
- package/packages/control-plane/package.json +4 -1
- package/packages/control-plane/src/db/schema.ts +19 -0
- package/packages/control-plane/src/server/app.ts +11 -22
- package/packages/control-plane/src/server/audit.ts +15 -0
- package/packages/control-plane/src/server/auth.ts +7 -1
- package/packages/control-plane/src/server/legacy/routes-metrics.ts +18 -0
- package/packages/control-plane/src/server/legacy/routes.ts +237 -0
- package/packages/control-plane/src/server/legacy/shim.ts +195 -0
- package/packages/control-plane/src/server/repos.ts +27 -0
- package/packages/control-plane/src/server/routes/artifacts.ts +104 -0
- package/packages/control-plane/src/server/routes/audit.ts +17 -0
- package/packages/control-plane/src/server/routes/config.ts +319 -0
- package/packages/control-plane/src/server/routes/control.ts +75 -0
- package/packages/control-plane/src/server/routes/cost.ts +70 -0
- package/packages/control-plane/src/server/routes/cost_ledger.ts +210 -0
- package/packages/control-plane/src/server/routes/fleet.ts +101 -0
- package/packages/control-plane/src/server/routes/index.ts +68 -0
- package/packages/control-plane/src/server/routes/integrations.ts +123 -0
- package/packages/control-plane/src/server/routes/merge_risk.ts +209 -0
- package/packages/control-plane/src/server/routes/metrics.ts +93 -0
- package/packages/control-plane/src/server/routes/notify.ts +48 -0
- package/packages/control-plane/src/server/routes/providers.ts +111 -0
- package/packages/control-plane/src/server/routes/start.ts +39 -0
- package/packages/control-plane/src/server/routes/stats.ts +76 -0
- package/packages/control-plane/src/server/routes/stream.ts +85 -0
- package/packages/control-plane/src/server/routes/verify.ts +66 -0
- package/packages/control-plane/src/server/spawn.ts +79 -0
- package/packages/control-plane/src/shipper/discover.ts +19 -1
- package/packages/control-plane/ui/dist/assets/index-BQbFv65M.css +1 -0
- package/packages/control-plane/ui/dist/assets/index-Dbhu244h.js +155 -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-BJSU5hY1.js → AdminPage-DDDvUz0N.js} +1 -1
- package/web-app/dist/assets/{Avatar-CSOSpw9c.js → Avatar-Dcdz46i6.js} +1 -1
- package/web-app/dist/assets/{Badge-COr7vj0D.js → Badge-BB24cCpK.js} +1 -1
- package/web-app/dist/assets/{Button-DGoWFERp.js → Button-D0-DmPZL.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-CBpWkNXY.js → CockpitPage-CdjpU2JW.js} +1 -1
- package/web-app/dist/assets/{ComparePage-BwT8vqrL.js → ComparePage-DT5U0y0d.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-D7SicDDA.js → ErrorBoundary-lEHcl0EO.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-bx-5liG2.js → EvidenceReceiptPanel-GpnWvdCr.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-BAeeWLqY.js → GitHubIssuesPanel-C7VOh1B7.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-CssD8lGI.js → GitHubPRsPanel-G_kOuINv.js} +1 -1
- package/web-app/dist/assets/{HomePage-SL5PT3m5.js → HomePage-PqRisOny.js} +2 -2
- package/web-app/dist/assets/{LoginPage-C8hFOZOM.js → LoginPage-DU7pFAkf.js} +1 -1
- package/web-app/dist/assets/{MagicPage-xHbHkrPf.js → MagicPage-C5JWIWMk.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-B_2CKFcC.js → MetricsPage-CbIGS_qo.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-CXwXMq35.js → NotFoundPage-vU1pvdSt.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-AaisMQI-.js → ProjectPage-SsixIPPv.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-Cej5ResX.js → ProjectsPage-BfQKSR9k.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-DKv4mn9H.js → SettingsPage-B8YfXAom.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-Dkiyzne4.js → ShowcasePage-Ba407f2-.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-DaBLQ5dU.js → SystemSettingsPage-DzNQhhBS.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-B2yUr31k.js → TeamsPage-tqUnpZ15.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-CfYiANhU.js → TemplatesPage-ClB5EpI3.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-CMXoexLM.js → TerminalOutput-CBvpYfEu.js} +1 -1
- package/web-app/dist/assets/{activity-B0dzoZtY.js → activity-C1s0L_X9.js} +1 -1
- package/web-app/dist/assets/{bell-DFOTaSoo.js → bell-DMEiXr73.js} +1 -1
- package/web-app/dist/assets/{bot-Dz-WSQyP.js → bot-BF_xIOxu.js} +1 -1
- package/web-app/dist/assets/{check-L1QIRueJ.js → check-Dv1Ynvrs.js} +1 -1
- package/web-app/dist/assets/{chevron-left-1TrnIEZS.js → chevron-left-Ddhsod7S.js} +1 -1
- package/web-app/dist/assets/{circle-alert-8Bf6xEDx.js → circle-alert-OATHUkBZ.js} +1 -1
- package/web-app/dist/assets/{clock-DB8NE6P5.js → clock-C1Ltva07.js} +1 -1
- package/web-app/dist/assets/{cloud-DUSL3wZS.js → cloud-B-S4oOy9.js} +1 -1
- package/web-app/dist/assets/{code-xml-DbjryWNl.js → code-xml-D3Femn_F.js} +1 -1
- package/web-app/dist/assets/{database-DrezrMSs.js → database-DBSeFgO3.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-CGbaLMzR.js → dollar-sign-sgDgNuGE.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-Dfypa-r4.js → file-code-corner-C-MbdZEc.js} +1 -1
- package/web-app/dist/assets/{file-plus-CzV5L2Gd.js → file-plus-CCB6yqXv.js} +1 -1
- package/web-app/dist/assets/{globe-BoYjTwPQ.js → globe-DlbrNAj1.js} +1 -1
- package/web-app/dist/assets/{hammer-WO-HuiyJ.js → hammer-B-DWm695.js} +1 -1
- package/web-app/dist/assets/{index-CjIOUjnd.js → index-Dvny-1SU.js} +3 -3
- package/web-app/dist/assets/{layers-Bn6jtKNk.js → layers-99qsKpOT.js} +1 -1
- package/web-app/dist/assets/{loader-circle-gERWRnmW.js → loader-circle-ZvZyZl3J.js} +1 -1
- package/web-app/dist/assets/{lock-BIiMLJq8.js → lock-DosGjcxP.js} +1 -1
- package/web-app/dist/assets/{package-dLvDSVys.js → package-C-PumesN.js} +1 -1
- package/web-app/dist/assets/{plus-BHM3ZLhZ.js → plus-CTYYskTB.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-BAp_alv6.js → refresh-cw-qW2ztTFS.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-CBhwq_MG.js → rotate-ccw-ZIKrf-vO.js} +1 -1
- package/web-app/dist/assets/{scroll-text-DoS-6dfU.js → scroll-text-BamlXjAT.js} +1 -1
- package/web-app/dist/assets/{server-5JgdDWQO.js → server-BljXb79I.js} +1 -1
- package/web-app/dist/assets/{shield-alert-DjmlLT34.js → shield-alert-Dr6eT9c_.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-BtiEXl3p.js → thumbs-up-v3oBXZgU.js} +1 -1
- package/web-app/dist/assets/{trash-2-ClsWU_Vg.js → trash-2-BOuIrCpi.js} +1 -1
- package/web-app/dist/assets/{trending-down-DPS4M7_X.js → trending-down-Dp7jMCgH.js} +1 -1
- package/web-app/dist/assets/{trending-up-D6OJ38-V.js → trending-up-CDiur-nP.js} +1 -1
- package/web-app/dist/assets/{upload-DOCzLUpF.js → upload-DxIHXhNE.js} +1 -1
- package/web-app/dist/assets/{usePolling-CljQTWj_.js → usePolling-D2Uu-YZb.js} +1 -1
- package/web-app/dist/assets/{user-C0G82Weu.js → user-BVWCUAfF.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/packages/control-plane/src/server/actions.ts +0 -60
- package/packages/control-plane/ui/dist/assets/index-DHDI_dHM.css +0 -1
- package/packages/control-plane/ui/dist/assets/index-DaQr0MPS.js +0 -129
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.
|
|
6
|
+
# Loki Mode v10.8.0
|
|
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
|
|
|
@@ -473,4 +473,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
473
473
|
|
|
474
474
|
---
|
|
475
475
|
|
|
476
|
-
**v10.
|
|
476
|
+
**v10.8.0 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
10.
|
|
1
|
+
10.8.0
|
package/autonomy/loki
CHANGED
|
@@ -1981,6 +1981,9 @@ _loki_control_ui() {
|
|
|
1981
1981
|
echo "loki: the Control Plane needs bun (https://bun.sh); using the classic dashboard." >&2
|
|
1982
1982
|
return 1
|
|
1983
1983
|
fi
|
|
1984
|
+
# FC-07: LOKI_CONTROL=0 is the test off switch (supervisor, run-all-tests, local-ci);
|
|
1985
|
+
# it must never start a detached `control serve` that writes ~/.loki/control.
|
|
1986
|
+
[ "${LOKI_CONTROL:-}" = "0" ] && return 1
|
|
1984
1987
|
local cli="$SKILL_DIR/loki-ts/dist/loki.js" cdir="${HOME}/.loki/control" spid
|
|
1985
1988
|
[ -f "$cli" ] || cli="$SKILL_DIR/loki-ts/src/cli.ts"
|
|
1986
1989
|
mkdir -p "$cdir" && chmod 700 "$cdir" 2>/dev/null || true
|
|
@@ -21331,7 +21334,7 @@ tokens_per_tier = {
|
|
|
21331
21334
|
pricing = {
|
|
21332
21335
|
'Fable': {'input': 10.00, 'output': 50.00},
|
|
21333
21336
|
'Opus': {'input': 5.00, 'output': 25.00},
|
|
21334
|
-
'Sonnet': {'input':
|
|
21337
|
+
'Sonnet': {'input': 2.00, 'output': 10.00},
|
|
21335
21338
|
'Haiku': {'input': 1.00, 'output': 5.00},
|
|
21336
21339
|
}
|
|
21337
21340
|
|
package/autonomy/run.sh
CHANGED
|
@@ -7581,7 +7581,7 @@ _write_pricing_json() {
|
|
|
7581
7581
|
"fable": {"input": 10.00, "output": 50.00, "label": "Fable 5 (top, 2x Opus)", "provider": "claude"},
|
|
7582
7582
|
"claude-fable-5": {"input": 10.00, "output": 50.00, "label": "Fable 5 (top, 2x Opus)", "provider": "claude"},
|
|
7583
7583
|
"opus": {"input": 5.00, "output": 25.00, "label": "Opus (latest)", "provider": "claude"},
|
|
7584
|
-
"sonnet": {"input":
|
|
7584
|
+
"sonnet": {"input": 2.00, "output": 10.00, "label": "Sonnet (latest)", "provider": "claude"},
|
|
7585
7585
|
"haiku": {"input": 1.00, "output": 5.00, "label": "Haiku (latest)", "provider": "claude"},
|
|
7586
7586
|
"gpt-5.3-codex": {"input": 1.75, "output": 14.00, "label": "GPT-5.3 Codex", "provider": "codex"}
|
|
7587
7587
|
}
|
|
@@ -20250,7 +20250,7 @@ pricing = {
|
|
|
20250
20250
|
'fable': {'input': 10.00, 'output': 50.00},
|
|
20251
20251
|
'claude-fable-5': {'input': 10.00, 'output': 50.00},
|
|
20252
20252
|
'opus': {'input': 5.00, 'output': 25.00},
|
|
20253
|
-
'sonnet': {'input':
|
|
20253
|
+
'sonnet': {'input': 2.00, 'output': 10.00},
|
|
20254
20254
|
'haiku': {'input': 1.00, 'output': 5.00},
|
|
20255
20255
|
'gpt-5.3-codex': {'input': 1.75, 'output': 14.00},
|
|
20256
20256
|
'gpt-5.6-sol': {'input': 2.50, 'output': 20.00},
|
|
@@ -24828,10 +24828,14 @@ except Exception:
|
|
|
24828
24828
|
if [[ "${ENABLE_DASHBOARD:-true}" == "true" ]] && command -v curl &>/dev/null; then
|
|
24829
24829
|
local project_cwd
|
|
24830
24830
|
project_cwd="$(pwd)"
|
|
24831
|
-
|
|
24831
|
+
# CPE-24: the Control Plane answers 501 (no focus API). Best-effort; say so
|
|
24832
|
+
# honestly in debug output rather than treating the miss as an error.
|
|
24833
|
+
_focus_code="$(curl -s -o /dev/null -w '%{http_code}' -X POST "http://127.0.0.1:${DASHBOARD_PORT}/api/focus" \
|
|
24832
24834
|
-H "Content-Type: application/json" \
|
|
24833
|
-
-d "{\"project_dir\": \"${project_cwd}\"}"
|
|
24834
|
-
|
|
24835
|
+
-d "{\"project_dir\": \"${project_cwd}\"}" 2>/dev/null || true)"
|
|
24836
|
+
case "$_focus_code" in
|
|
24837
|
+
501|410) type log_debug >/dev/null 2>&1 && log_debug "project focus: not available on the Control Plane (HTTP ${_focus_code})" ;;
|
|
24838
|
+
esac
|
|
24835
24839
|
fi
|
|
24836
24840
|
|
|
24837
24841
|
# Initialize Cross-Provider Failover (v6.19.0)
|
package/dashboard/__init__.py
CHANGED
package/dashboard/server.py
CHANGED
|
@@ -7752,7 +7752,7 @@ _DEFAULT_PRICING = {
|
|
|
7752
7752
|
"fable": {"input": 10.00, "output": 50.00},
|
|
7753
7753
|
"claude-fable-5": {"input": 10.00, "output": 50.00},
|
|
7754
7754
|
"opus": {"input": 5.00, "output": 25.00},
|
|
7755
|
-
"sonnet": {"input":
|
|
7755
|
+
"sonnet": {"input": 2.00, "output": 10.00},
|
|
7756
7756
|
"haiku": {"input": 1.00, "output": 5.00},
|
|
7757
7757
|
# OpenAI Codex
|
|
7758
7758
|
"gpt-5.3-codex": {"input": 1.50, "output": 12.00},
|
|
@@ -8587,18 +8587,16 @@ _PROVIDER_LABELS = {
|
|
|
8587
8587
|
}
|
|
8588
8588
|
|
|
8589
8589
|
# Display-only pricing notes, keyed by model. These annotate the pricing table in
|
|
8590
|
-
# the UI WITHOUT changing any computed cost number. The Sonnet 5
|
|
8591
|
-
#
|
|
8592
|
-
#
|
|
8593
|
-
# direction (a bill can only come in lower than quoted, never higher). This note
|
|
8594
|
-
# tells the user why the quote is conservative during the intro window.
|
|
8590
|
+
# the UI WITHOUT changing any computed cost number. The Sonnet 5 intro price
|
|
8591
|
+
# ($2/$10 per MTok) became the standard price, so the 2026-09-01 increase to
|
|
8592
|
+
# $3/$15 will not occur (platform.claude.com pricing page, read 2026-10-03).
|
|
8595
8593
|
_UNVERIFIED_RATE_NOTE = (
|
|
8596
8594
|
"Unverified placeholder rate, scaled from gpt-5.3; not from OpenAI's pricing page."
|
|
8597
8595
|
)
|
|
8598
8596
|
_MODEL_PRICING_NOTES = {
|
|
8599
8597
|
"sonnet": (
|
|
8600
|
-
"
|
|
8601
|
-
"
|
|
8598
|
+
"Standard pricing: $2 / $10 per MTok. "
|
|
8599
|
+
"The intro price became the standard price; no increase to $3 / $15."
|
|
8602
8600
|
),
|
|
8603
8601
|
# See the UNVERIFIED RATES comment on the pricing table: shown, not hidden.
|
|
8604
8602
|
"gpt-5.6-sol": _UNVERIFIED_RATE_NOTE,
|
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.
|
|
5
|
+
**Version:** v10.8.0
|
|
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
|
|
|
@@ -230,13 +230,274 @@ Gap: the server stores events only. Artifacts live in the local repo, and source
|
|
|
230
230
|
|
|
231
231
|
Every mutating endpoint: requires the bearer token when the server is not loopback-only, refuses non-JSON bodies, checks Origin against the served host, writes an audit row before acting, and returns the resulting state for optimistic reconciliation.
|
|
232
232
|
|
|
233
|
-
## 5.
|
|
233
|
+
## 5. Legacy integration contract (gate for CPE-24)
|
|
234
|
+
|
|
235
|
+
The legacy dashboard (dashboard/server.py, port 57374, 13194 lines) serves 234 routes (method and path entries after dropping HEAD; routers api_v2 at /api/v2, api_operator at /api/operator, api_start, api_runs_v1 at /api/v1/runs, the /lab and /assets mounts, WS /ws and /ws/collab). Deleting it (CPE-24) must not break a real integration. This section is the contract: one row per route, what consumes it, what the Control Plane offers, and what the shim at packages/control-plane/src/server/legacy/ does with it.
|
|
236
|
+
|
|
237
|
+
Method. Route list: FastAPI introspection of `dashboard.server.app` (the 234 entries). Consumers: a repo-wide text scan of git-tracked files, then each used route's consumer lines were read by hand. Counted as a consumer: the TypeScript and Python SDKs, vscode-extension (src and the bundled media/loki-dashboard.js webview), autonomy/loki and autonomy/run.sh, web-app, .github/workflows, tests/moat, tests/e2e, tests/integration, scripts/run-dashboard-* (marked "(test)" when a test). Not counted: dashboard/ itself, dashboard-ui/ (the legacy UI is deleted with the server), docs, generated maps, packages/control-plane. The scan matches path text, so single-segment paths (/start, /cost, /trust, /) were checked by hand: every hit was `loki start`, `/api/cost` or `/lab/api/cost`, none a request to that HTML route. Limits: a path built at runtime from parts is invisible to a text scan, and an HTTP verb is inferred from the nearby call text, so a verb on a bundled-JS row is best effort. A route with a consumer is USED, otherwise UNUSED.
|
|
238
|
+
|
|
239
|
+
Status values: EXISTS (the CP serves it today), PARTIAL (the shim maps it and says what differs), MISSING (a USED route the CP has no data or mechanism for), UNUSED (no consumer). Shim actions: map (answer from CP data), 308 to CP UI (HTML page), 410 with notice (UNUSED, retired), 501 not yet supported (USED but no CP data or mechanism: the shim answers an explicit 501, never a faked success), none (the CP already serves the path).
|
|
240
|
+
|
|
241
|
+
Counts: map 6, 308 5, 501 77, 410 142, none 4; total 234.
|
|
242
|
+
|
|
243
|
+
Auth contract (never looser than legacy). Legacy `require_scope` is open when LOKI_ENTERPRISE_AUTH and OIDC are both off, and otherwise answers 401 without a token and 403 on a missing scope. Open in every mode: /health, /.well-known/agent.json, /api/enterprise/status, /api/auth/info, /api/providers/models, /metrics, the docs routes. The shim applies one rule to every route the legacy server guarded: if LOKI_CONTROL_TOKEN is set, require the CP bearer token (401 with www-authenticate otherwise); if no CP token is set but legacy enterprise auth or OIDC is enabled in the environment, fail closed with 401 (the CP has no way to check the legacy `loki_*` tokens); if neither is set, open, matching the legacy default. The CP token carries every scope, which is safe because the shim exposes only read routes and answers 501 or 410 for the rest. 501 and 410 answers are also behind the guard, so an unauthenticated caller learns nothing about a guarded route. The shim never binds a port; mounting it on the CP app keeps hostGuard and the loopback-only action routes exactly as they are.
|
|
244
|
+
|
|
245
|
+
First hit per process, each route logs one line: `legacy dashboard route <path> is served by the Control Plane; migrate to /v1/...` (mapped and 308 routes). A 501 or 410 route logs the same single line in the words "is not served by the Control Plane (501)" or "is retired (410)".
|
|
246
|
+
|
|
247
|
+
### 5.1 Parity checklist (gate for CPE-24)
|
|
234
248
|
1. Every row of section 1 marked KEEP or REWORK has its v10 home rendered on real data, proven by a UI test with a fixture run.
|
|
235
249
|
2. Every row of section 3.3 not marked DEFERRED works end to end in tests/e2e (start a fixture run, stream, BLOCKED answer, stop, retry, verify, config write).
|
|
236
250
|
3. Visual parity: screenshots of wordmark, nav, card, KPI, badge, table in light and dark compared against legacy captures (CPE-23).
|
|
237
251
|
4. No route under the old dashboard is reachable except the CP-LEGACY redirects (7b701d238).
|
|
238
252
|
5. Lighthouse accessibility at or above 95 on composer, thread, Home; axe zero serious violations.
|
|
239
253
|
|
|
254
|
+
|
|
255
|
+
### 5.2 Route contract
|
|
256
|
+
|
|
257
|
+
| Method and path | Consumers (verified file:line) | CP /v1 equivalent | Status | Shim action |
|
|
258
|
+
|---|---|---|---|---|
|
|
259
|
+
| GET `/openapi.json` | none | none | UNUSED | 410 with notice |
|
|
260
|
+
| GET `/docs` | none | none | UNUSED | 410 with notice |
|
|
261
|
+
| GET `/docs/oauth2-redirect` | none | none | UNUSED | 410 with notice |
|
|
262
|
+
| GET `/redoc` | none | none | UNUSED | 410 with notice |
|
|
263
|
+
| POST `/api/v2/tenants` | sdk/python/loki_mode_sdk/client.py:204, sdk/typescript/src/client.ts:237 | none | MISSING | 501 not yet supported |
|
|
264
|
+
| GET `/api/v2/tenants` | sdk/python/loki_mode_sdk/client.py:191, sdk/typescript/src/client.ts:225 | none | MISSING | 501 not yet supported |
|
|
265
|
+
| GET `/api/v2/tenants/{tenant_id}` | sdk/typescript/src/client.ts:229 | none | MISSING | 501 not yet supported |
|
|
266
|
+
| PUT `/api/v2/tenants/{tenant_id}` | none | none | UNUSED | 410 with notice |
|
|
267
|
+
| DELETE `/api/v2/tenants/{tenant_id}` | sdk/typescript/src/client.ts:241 | none | MISSING | 501 not yet supported |
|
|
268
|
+
| GET `/api/v2/tenants/{tenant_id}/projects` | none | none | UNUSED | 410 with notice |
|
|
269
|
+
| POST `/api/v2/runs` | vscode-extension/media/loki-dashboard.js:9617 | none | MISSING | 501 not yet supported |
|
|
270
|
+
| GET `/api/v2/runs` | sdk/python/loki_mode_sdk/client.py:220, sdk/typescript/src/client.ts:201 | /v1/runs | PARTIAL (ids are source:run strings, not ints; no project_id filter; status maps to running/completed; limit/offset map to limit/cursor) | map |
|
|
271
|
+
| GET `/api/v2/runs/{run_id}` | sdk/python/loki_mode_sdk/client.py:228, sdk/typescript/src/client.ts:205 | /v1/runs/:id | PARTIAL (run_id is source:run (URL-encoded) or a bare run id; legacy integer ids answer 404) | map |
|
|
272
|
+
| POST `/api/v2/runs/{run_id}/cancel` | sdk/python/loki_mode_sdk/client.py:233, sdk/typescript/src/client.ts:209, vscode-extension/media/loki-dashboard.js:9617 | none | MISSING | 501 not yet supported |
|
|
273
|
+
| POST `/api/v2/runs/{run_id}/replay` | sdk/python/loki_mode_sdk/client.py:238, sdk/typescript/src/client.ts:213, vscode-extension/media/loki-dashboard.js:9617 | none | MISSING | 501 not yet supported |
|
|
274
|
+
| GET `/api/v2/runs/{run_id}/timeline` | sdk/python/loki_mode_sdk/client.py:243, sdk/typescript/src/client.ts:217, vscode-extension/media/loki-dashboard.js:9255 | /v1/runs/:id (stages, events) | PARTIAL (phases are CP stages; events carry seq, ts, type, stage only) | map |
|
|
275
|
+
| POST `/api/v2/api-keys` | sdk/python/loki_mode_sdk/client.py:263, sdk/typescript/src/client.ts:178, vscode-extension/media/loki-dashboard.js:10097 | none | MISSING | 501 not yet supported |
|
|
276
|
+
| GET `/api/v2/api-keys` | sdk/python/loki_mode_sdk/client.py:253, sdk/typescript/src/client.ts:170 | none | MISSING | 501 not yet supported |
|
|
277
|
+
| GET `/api/v2/api-keys/{identifier}` | none | none | UNUSED | 410 with notice |
|
|
278
|
+
| PUT `/api/v2/api-keys/{identifier}` | none | none | UNUSED | 410 with notice |
|
|
279
|
+
| DELETE `/api/v2/api-keys/{identifier}` | sdk/typescript/src/client.ts:190, vscode-extension/media/loki-dashboard.js:10097 | none | MISSING | 501 not yet supported |
|
|
280
|
+
| POST `/api/v2/api-keys/{identifier}/rotate` | sdk/python/loki_mode_sdk/client.py:271, sdk/typescript/src/client.ts:186, vscode-extension/media/loki-dashboard.js:10097 | none | MISSING | 501 not yet supported |
|
|
281
|
+
| GET `/api/v2/policies` | none | none | UNUSED | 410 with notice |
|
|
282
|
+
| PUT `/api/v2/policies` | none | none | UNUSED | 410 with notice |
|
|
283
|
+
| POST `/api/v2/policies/evaluate` | none | none | UNUSED | 410 with notice |
|
|
284
|
+
| GET `/api/v2/audit` | sdk/python/loki_mode_sdk/client.py:293, sdk/typescript/src/client.ts:254, vscode-extension/media/loki-dashboard.js:9813 | /v1/audit (added by the shim) | PARTIAL (CP audit is an operator-action log (run removal, prune), not the legacy hash-chained log; resource_type filter answers 400) | map |
|
|
285
|
+
| GET `/api/v2/audit/verify` | tests/moat/p2-honest-verdict.sh:1162 (test), tests/moat/p2-honest-verdict.sh:1258 (test), vscode-extension/media/loki-dashboard.js:9813 | none | MISSING | 501 not yet supported |
|
|
286
|
+
| GET `/api/v2/audit/export` | none | /v1/audit | UNUSED | 410 with notice |
|
|
287
|
+
| GET `/api/operator/runs/{run_id}` | none | /v1/runs/:id | UNUSED | 410 with notice |
|
|
288
|
+
| GET `/api/operator/tests` | none | none | UNUSED | 410 with notice |
|
|
289
|
+
| GET `/api/operator/receipts` | none | none | UNUSED | 410 with notice |
|
|
290
|
+
| GET `/api/operator/releases` | none | none | UNUSED | 410 with notice |
|
|
291
|
+
| GET `/api/operator/phases` | none | none | UNUSED | 410 with notice |
|
|
292
|
+
| GET `/api/operator/workspaces/runs` | none | none | UNUSED | 410 with notice |
|
|
293
|
+
| GET `/api/operator/workspaces/runs/{ws}/{run_id}` | none | none | UNUSED | 410 with notice |
|
|
294
|
+
| GET `/api/onboarding/state` | none | none | UNUSED | 410 with notice |
|
|
295
|
+
| POST `/api/onboarding/provider` | none | none | UNUSED | 410 with notice |
|
|
296
|
+
| POST `/api/onboarding/github` | none | none | UNUSED | 410 with notice |
|
|
297
|
+
| GET `/api/onboarding/repos` | none | none | UNUSED | 410 with notice |
|
|
298
|
+
| POST `/api/onboarding/repo` | none | none | UNUSED | 410 with notice |
|
|
299
|
+
| GET `/api/backlog/issues` | none | none | UNUSED | 410 with notice |
|
|
300
|
+
| POST `/api/backlog/run` | none | none | UNUSED | 410 with notice |
|
|
301
|
+
| GET `/api/backlog/status` | none | none | UNUSED | 410 with notice |
|
|
302
|
+
| GET `/api/v1/runs` | none | /v1/runs | UNUSED | 410 with notice |
|
|
303
|
+
| GET `/api/v1/runs/{run_id}` | none | /v1/runs/:id | UNUSED | 410 with notice |
|
|
304
|
+
| POST `/api/v1/runs` | none | /v1/runs | UNUSED | 410 with notice |
|
|
305
|
+
| POST `/api/v1/runs/{run_id}/stop` | none | none | UNUSED | 410 with notice |
|
|
306
|
+
| GET `/start` | none | CP UI (/) | EXISTS | 308 to CP UI |
|
|
307
|
+
| MOUNT `/lab` | none | CP UI (/) | EXISTS | 308 to CP UI |
|
|
308
|
+
| GET `/health` | autonomy/loki:1929, autonomy/loki:7760, autonomy/run.sh:19293 (+10) | /health | EXISTS (CP /health answers {service, pid, install_path}, not the legacy body; CLI discovery relies on that identity, so the shim never overrides it) | none (CP /health serves) |
|
|
309
|
+
| GET `/api/providers/models` | none | none | UNUSED | 410 with notice |
|
|
310
|
+
| GET `/.well-known/agent.json` | .github/workflows/integrity-audit.yml:114, .github/workflows/integrity-audit.yml:115 | none (static card) | PARTIAL (static card from shim constants; capabilities the CP cannot back (streaming, enterprise rbac/multi-tenant) are false) | map |
|
|
311
|
+
| GET `/api/status` | autonomy/loki:15601, autonomy/run.sh:19357, autonomy/run.sh:19541 (+10) | /v1/runs (derived) | PARTIAL (status, version, uptime, active_sessions, phase, provider only; no running_agents, pending_tasks, iteration, complexity, mode, current_task (CP has no such data, fields omitted)) | map |
|
|
312
|
+
| GET `/api/projects` | sdk/python/loki_mode_sdk/client.py:166, sdk/typescript/src/client.ts:127, tests/moat/p7-no-fabricated-data.sh:446 (test) | none | MISSING | 501 not yet supported |
|
|
313
|
+
| POST `/api/projects` | sdk/python/loki_mode_sdk/client.py:184, sdk/typescript/src/client.ts:139, tests/moat/p7-no-fabricated-data.sh:437 (test) (+1) | none | MISSING | 501 not yet supported |
|
|
314
|
+
| GET `/api/projects/{project_id}` | sdk/python/loki_mode_sdk/client.py:174, sdk/typescript/src/client.ts:131 | none | MISSING | 501 not yet supported |
|
|
315
|
+
| PUT `/api/projects/{project_id}` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
316
|
+
| DELETE `/api/projects/{project_id}` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
317
|
+
| GET `/api/tasks` | sdk/python/loki_mode_sdk/tasks.py:30, sdk/typescript/src/client.ts:150 | none | MISSING | 501 not yet supported |
|
|
318
|
+
| POST `/api/tasks` | sdk/python/loki_mode_sdk/tasks.py:56, sdk/typescript/src/client.ts:162, vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
319
|
+
| GET `/api/tasks/{task_id}` | sdk/python/loki_mode_sdk/tasks.py:38, sdk/typescript/src/client.ts:154, vscode-extension/src/views/dashboardWebview.ts:168 | none | MISSING | 501 not yet supported |
|
|
320
|
+
| PUT `/api/tasks/{task_id}` | sdk/python/loki_mode_sdk/tasks.py:71, vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
321
|
+
| DELETE `/api/tasks/{task_id}` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
322
|
+
| POST `/api/tasks/{task_id}/move` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
323
|
+
| WS `/ws` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
324
|
+
| GET `/api/registry/projects` | none | none | UNUSED | 410 with notice |
|
|
325
|
+
| POST `/api/registry/projects` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
326
|
+
| GET `/api/registry/projects/{identifier}` | none | none | UNUSED | 410 with notice |
|
|
327
|
+
| DELETE `/api/registry/projects/{identifier}` | none | none | UNUSED | 410 with notice |
|
|
328
|
+
| GET `/api/registry/projects/{identifier}/health` | none | none | UNUSED | 410 with notice |
|
|
329
|
+
| POST `/api/registry/projects/{identifier}/access` | none | none | UNUSED | 410 with notice |
|
|
330
|
+
| GET `/api/registry/discover` | none | none | UNUSED | 410 with notice |
|
|
331
|
+
| POST `/api/registry/sync` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
332
|
+
| GET `/api/registry/tasks` | none | none | UNUSED | 410 with notice |
|
|
333
|
+
| GET `/api/registry/learnings` | none | none | UNUSED | 410 with notice |
|
|
334
|
+
| GET `/api/fleet/runs` | tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4706 (test), tests/moat/p7-no-fabricated-data.sh:4710 (test) (+1) | /v1/fleet/runs (CPE24-P1) | PARTIAL (reads the same .loki or registry source; unmeasured values are null with a not-measured marker) | map |
|
|
335
|
+
| GET `/api/fleet/summary` | tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4695 (test), tests/moat/p7-no-fabricated-data.sh:4696 (test) (+1) | /v1/fleet/summary (CPE24-P1) | PARTIAL (reads the same .loki or registry source; unmeasured values are null with a not-measured marker) | map |
|
|
336
|
+
| GET `/api/fleet/runs/{identifier}` | none | none | UNUSED | 410 with notice |
|
|
337
|
+
| POST `/api/focus` | autonomy/run.sh:24831, web-app/server.py:2744 | none | MISSING | 501 not yet supported |
|
|
338
|
+
| GET `/api/focus` | none | none | UNUSED | 410 with notice |
|
|
339
|
+
| DELETE `/api/focus` | none | none | UNUSED | 410 with notice |
|
|
340
|
+
| GET `/api/session/model` | none | none | UNUSED | 410 with notice |
|
|
341
|
+
| POST `/api/session/model` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
342
|
+
| GET `/api/running-projects` | none | none | UNUSED | 410 with notice |
|
|
343
|
+
| POST `/api/control/start` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:257, vscode-extension/src/extension.ts:580 | none | MISSING | 501 not yet supported |
|
|
344
|
+
| GET `/api/control/builds/{execution_id}` | none | none | UNUSED | 410 with notice |
|
|
345
|
+
| GET `/api/control/builds/{execution_id}/proof` | none | none | UNUSED | 410 with notice |
|
|
346
|
+
| POST `/api/control/builds/{execution_id}/stop` | none | none | UNUSED | 410 with notice |
|
|
347
|
+
| POST `/api/running-projects/stop` | none | none | UNUSED | 410 with notice |
|
|
348
|
+
| POST `/api/fleet/runs/{identifier}/retry` | none | none | UNUSED | 410 with notice |
|
|
349
|
+
| POST `/api/fleet/runs/{identifier}/cancel` | none | none | UNUSED | 410 with notice |
|
|
350
|
+
| GET `/api/enterprise/status` | none | none | UNUSED | 410 with notice |
|
|
351
|
+
| GET `/api/auth/info` | none | none | UNUSED | 410 with notice |
|
|
352
|
+
| POST `/api/enterprise/tokens` | none | none | UNUSED | 410 with notice |
|
|
353
|
+
| GET `/api/enterprise/tokens` | none | none | UNUSED | 410 with notice |
|
|
354
|
+
| DELETE `/api/enterprise/tokens/{identifier}` | none | none | UNUSED | 410 with notice |
|
|
355
|
+
| GET `/api/enterprise/audit` | none | none | UNUSED | 410 with notice |
|
|
356
|
+
| GET `/api/enterprise/audit/summary` | none | none | UNUSED | 410 with notice |
|
|
357
|
+
| GET `/api/compliance` | none | none | UNUSED | 410 with notice |
|
|
358
|
+
| GET `/api/memory/summary` | none | none | UNUSED | 410 with notice |
|
|
359
|
+
| GET `/api/memory/episodes` | vscode-extension/src/views/memoryViewProvider.ts:152 | none | MISSING | 501 not yet supported |
|
|
360
|
+
| GET `/api/memory/episodes/{episode_id}` | vscode-extension/src/views/dashboardWebview.ts:204, vscode-extension/src/views/memoryViewProvider.ts:215 | none | MISSING | 501 not yet supported |
|
|
361
|
+
| GET `/api/memory/patterns` | vscode-extension/src/views/memoryViewProvider.ts:151 | none | MISSING | 501 not yet supported |
|
|
362
|
+
| GET `/api/memory/patterns/{pattern_id}` | vscode-extension/src/views/dashboardWebview.ts:186, vscode-extension/src/views/memoryViewProvider.ts:197 | none | MISSING | 501 not yet supported |
|
|
363
|
+
| GET `/api/memory/skills` | vscode-extension/src/views/memoryViewProvider.ts:153 | none | MISSING | 501 not yet supported |
|
|
364
|
+
| GET `/api/memory/skills/{skill_id}` | none | none | UNUSED | 410 with notice |
|
|
365
|
+
| GET `/api/memory/economics` | tests/moat/p7-no-fabricated-data.sh:4638 (test), tests/moat/p7-no-fabricated-data.sh:4749 (test), tests/moat/p7-no-fabricated-data.sh:4750 (test) (+2) | none | MISSING | 501 not yet supported |
|
|
366
|
+
| POST `/api/memory/consolidate` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
367
|
+
| POST `/api/memory/retrieve` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
368
|
+
| GET `/api/memory/index` | none | none | UNUSED | 410 with notice |
|
|
369
|
+
| GET `/api/memory/timeline` | none | none | UNUSED | 410 with notice |
|
|
370
|
+
| GET `/api/memory/files` | none | none | UNUSED | 410 with notice |
|
|
371
|
+
| GET `/api/memory/file` | none | none | UNUSED | 410 with notice |
|
|
372
|
+
| GET `/api/memory/search` | none | none | UNUSED | 410 with notice |
|
|
373
|
+
| GET `/api/memory/stats` | none | none | UNUSED | 410 with notice |
|
|
374
|
+
| GET `/api/learning/metrics` | tests/moat/p7-no-fabricated-data.sh:4638 (test), tests/moat/p7-no-fabricated-data.sh:4752 (test) | none | MISSING | 501 not yet supported |
|
|
375
|
+
| GET `/api/learning/trends` | none | none | UNUSED | 410 with notice |
|
|
376
|
+
| GET `/api/learning/signals` | none | none | UNUSED | 410 with notice |
|
|
377
|
+
| GET `/api/learning/aggregation` | none | none | UNUSED | 410 with notice |
|
|
378
|
+
| POST `/api/learning/aggregate` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
379
|
+
| GET `/api/learning/preferences` | none | none | UNUSED | 410 with notice |
|
|
380
|
+
| GET `/api/learning/errors` | none | none | UNUSED | 410 with notice |
|
|
381
|
+
| GET `/api/learning/success` | none | none | UNUSED | 410 with notice |
|
|
382
|
+
| GET `/api/learning/tools` | none | none | UNUSED | 410 with notice |
|
|
383
|
+
| POST `/api/control/pause` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:277, vscode-extension/src/extension.ts:703 | none | MISSING | 501 not yet supported |
|
|
384
|
+
| POST `/api/control/resume` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:285, vscode-extension/src/extension.ts:743 | none | MISSING | 501 not yet supported |
|
|
385
|
+
| POST `/api/control/stop` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/src/api/client.ts:269, vscode-extension/src/extension.ts:651 | none | MISSING | 501 not yet supported |
|
|
386
|
+
| GET `/api/cost` | tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4646 (test), tests/moat/p7-no-fabricated-data.sh:4647 (test) (+3) | /v1/cost/snapshot (CPE24-P1) | PARTIAL (reads the same .loki or registry source; unmeasured values are null with a not-measured marker) | map |
|
|
387
|
+
| GET `/api/budget` | tests/e2e/dashboard-evidence-panels.mjs:73 (test), tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4650 (test) (+3) | none | MISSING | 501 not yet supported |
|
|
388
|
+
| GET `/api/cost/timeline` | tests/moat/p7-no-fabricated-data.sh:4637 (test), tests/moat/p7-no-fabricated-data.sh:4652 (test), tests/moat/p7-no-fabricated-data.sh:4653 (test) (+15) | /v1/cost/timeline (CPE24-P1) | PARTIAL (reads the same .loki or registry source; unmeasured values are null with a not-measured marker) | map |
|
|
389
|
+
| GET `/api/trust/trajectory` | none | none | UNUSED | 410 with notice |
|
|
390
|
+
| GET `/api/gate-policy` | none | none | UNUSED | 410 with notice |
|
|
391
|
+
| GET `/api/pricing` | none | none | UNUSED | 410 with notice |
|
|
392
|
+
| GET `/api/council/state` | none | none | UNUSED | 410 with notice |
|
|
393
|
+
| GET `/api/council/verdicts` | none | none | UNUSED | 410 with notice |
|
|
394
|
+
| GET `/api/council/convergence` | none | none | UNUSED | 410 with notice |
|
|
395
|
+
| GET `/api/council/report` | none | none | UNUSED | 410 with notice |
|
|
396
|
+
| POST `/api/council/force-review` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/media/loki-dashboard.js:4312 | none | MISSING | 501 not yet supported |
|
|
397
|
+
| GET `/api/council/transcripts` | vscode-extension/media/loki-dashboard.js:12426 | none | MISSING | 501 not yet supported |
|
|
398
|
+
| GET `/api/council/transcripts/{iteration_id}` | none | none | UNUSED | 410 with notice |
|
|
399
|
+
| GET `/api/context` | tests/moat/p7-no-fabricated-data.sh:4638 (test), tests/moat/p7-no-fabricated-data.sh:4745 (test), tests/moat/p7-no-fabricated-data.sh:4746 (test) (+3) | none | MISSING | 501 not yet supported |
|
|
400
|
+
| GET `/api/notifications` | none | none | UNUSED | 410 with notice |
|
|
401
|
+
| GET `/api/notifications/triggers` | none | none | UNUSED | 410 with notice |
|
|
402
|
+
| PUT `/api/notifications/triggers` | vscode-extension/media/loki-dashboard.js:496, vscode-extension/media/loki-dashboard.js:6802 | none | MISSING | 501 not yet supported |
|
|
403
|
+
| POST `/api/notifications/{notification_id}/acknowledge` | none | none | UNUSED | 410 with notice |
|
|
404
|
+
| POST `/api/notifications/{notification_id}/unacknowledge` | none | none | UNUSED | 410 with notice |
|
|
405
|
+
| GET `/api/checkpoints` | vscode-extension/src/views/checkpointProvider.ts:108, vscode-extension/src/views/checkpointProvider.ts:134 | none | MISSING | 501 not yet supported |
|
|
406
|
+
| GET `/api/checkpoints/{checkpoint_id}` | none | none | UNUSED | 410 with notice |
|
|
407
|
+
| POST `/api/checkpoints` | vscode-extension/media/loki-dashboard.js:5960 | none | MISSING | 501 not yet supported |
|
|
408
|
+
| POST `/api/checkpoints/{checkpoint_id}/rollback` | vscode-extension/media/loki-dashboard.js:5960 | none | MISSING | 501 not yet supported |
|
|
409
|
+
| GET `/api/agents` | none | none | UNUSED | 410 with notice |
|
|
410
|
+
| POST `/api/agents/{agent_id}/kill` | vscode-extension/media/loki-dashboard.js:4312 | none | MISSING | 501 not yet supported |
|
|
411
|
+
| POST `/api/agents/{agent_id}/pause` | vscode-extension/media/loki-dashboard.js:4312 | none | MISSING | 501 not yet supported |
|
|
412
|
+
| POST `/api/agents/{agent_id}/resume` | vscode-extension/media/loki-dashboard.js:4312 | none | MISSING | 501 not yet supported |
|
|
413
|
+
| GET `/api/logs` | none | none | UNUSED | 410 with notice |
|
|
414
|
+
| POST `/api/collab/join` | none | none | UNUSED | 410 with notice |
|
|
415
|
+
| POST `/api/collab/leave` | none | none | UNUSED | 410 with notice |
|
|
416
|
+
| GET `/api/collab/users` | none | none | UNUSED | 410 with notice |
|
|
417
|
+
| GET `/api/collab/users/{user_id}` | none | none | UNUSED | 410 with notice |
|
|
418
|
+
| POST `/api/collab/users/{user_id}/heartbeat` | none | none | UNUSED | 410 with notice |
|
|
419
|
+
| POST `/api/collab/users/{user_id}/cursor` | none | none | UNUSED | 410 with notice |
|
|
420
|
+
| POST `/api/collab/users/{user_id}/status` | none | none | UNUSED | 410 with notice |
|
|
421
|
+
| GET `/api/collab/presence` | none | none | UNUSED | 410 with notice |
|
|
422
|
+
| GET `/api/collab/file/{file_path:path}` | none | none | UNUSED | 410 with notice |
|
|
423
|
+
| GET `/api/collab/state` | none | none | UNUSED | 410 with notice |
|
|
424
|
+
| GET `/api/collab/state/value` | none | none | UNUSED | 410 with notice |
|
|
425
|
+
| POST `/api/collab/operation` | none | none | UNUSED | 410 with notice |
|
|
426
|
+
| POST `/api/collab/sync` | none | none | UNUSED | 410 with notice |
|
|
427
|
+
| GET `/api/collab/history` | none | none | UNUSED | 410 with notice |
|
|
428
|
+
| WS `/ws/collab` | none | none | UNUSED | 410 with notice |
|
|
429
|
+
| GET `/api/collab/status` | none | none | UNUSED | 410 with notice |
|
|
430
|
+
| GET `/api/secrets/status` | none | none | UNUSED | 410 with notice |
|
|
431
|
+
| GET `/api/github/status` | none | none | UNUSED | 410 with notice |
|
|
432
|
+
| GET `/api/github/tasks` | none | none | UNUSED | 410 with notice |
|
|
433
|
+
| GET `/api/github/sync-log` | none | none | UNUSED | 410 with notice |
|
|
434
|
+
| GET `/api/health/processes` | none | none | UNUSED | 410 with notice |
|
|
435
|
+
| GET `/metrics` | autonomy/loki:29162, tests/e2e/webapp-admin-honesty.mjs:271 (test), tests/e2e/webapp-receipt-panel.mjs:54 (test) (+2) | /v1/metrics (CPE24-P1) | PARTIAL (reads the same .loki or registry source; unmeasured values are null with a not-measured marker) | map |
|
|
436
|
+
| GET `/api/checklist` | none | none | UNUSED | 410 with notice |
|
|
437
|
+
| GET `/api/usage` | none | none | UNUSED | 410 with notice |
|
|
438
|
+
| GET `/api/checklist/summary` | none | none | UNUSED | 410 with notice |
|
|
439
|
+
| GET `/api/prd-observations` | none | none | UNUSED | 410 with notice |
|
|
440
|
+
| GET `/api/checklist/waivers` | none | none | UNUSED | 410 with notice |
|
|
441
|
+
| POST `/api/checklist/waivers` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
442
|
+
| DELETE `/api/checklist/waivers/{item_id}` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
443
|
+
| GET `/api/council/gate` | tests/moat/p7-no-fabricated-data.sh:4638 (test), tests/moat/p7-no-fabricated-data.sh:4760 (test), tests/moat/p7-no-fabricated-data.sh:4762 (test) (+1) | none | MISSING | 501 not yet supported |
|
|
444
|
+
| GET `/api/app-runner/status` | none | none | UNUSED | 410 with notice |
|
|
445
|
+
| GET `/api/app-runner/logs` | none | none | UNUSED | 410 with notice |
|
|
446
|
+
| GET `/api/app-runner/errors` | none | none | UNUSED | 410 with notice |
|
|
447
|
+
| POST `/api/control/app-restart` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
448
|
+
| POST `/api/control/app-stop` | vscode-extension/media/loki-dashboard.js:496 | none | MISSING | 501 not yet supported |
|
|
449
|
+
| GET `/api/playwright/results` | none | none | UNUSED | 410 with notice |
|
|
450
|
+
| GET `/api/playwright/screenshot` | none | none | UNUSED | 410 with notice |
|
|
451
|
+
| GET `/api/failures` | none | none | UNUSED | 410 with notice |
|
|
452
|
+
| GET `/api/prompt-versions` | none | none | UNUSED | 410 with notice |
|
|
453
|
+
| POST `/api/prompt-optimize` | autonomy/loki:17793, vscode-extension/media/loki-dashboard.js:7581 | none | MISSING | 501 not yet supported |
|
|
454
|
+
| MOUNT `/assets` | none | UI static assets | EXISTS (vite output under ui/dist/assets) | none (CP UI serves it) |
|
|
455
|
+
| GET `/api/activity` | vscode-extension/media/loki-dashboard.js:8596 | none | MISSING | 501 not yet supported |
|
|
456
|
+
| GET `/api/session-diff` | none | none | UNUSED | 410 with notice |
|
|
457
|
+
| POST `/api/activity` | none | none | UNUSED | 410 with notice |
|
|
458
|
+
| GET `/favicon.svg` | none | UI static asset | EXISTS (the CP UI serves its own favicon from ui/dist) | none (CP UI serves it) |
|
|
459
|
+
| GET `/cost` | none | CP UI (/) | EXISTS | 308 to CP UI |
|
|
460
|
+
| GET `/trust` | none | CP UI (/) | EXISTS | 308 to CP UI |
|
|
461
|
+
| GET `/` | none | CP UI (/) | EXISTS | 308 to CP UI |
|
|
462
|
+
| GET `/api/quality-score` | none | none | UNUSED | 410 with notice |
|
|
463
|
+
| GET `/api/quality-score/history` | none | none | UNUSED | 410 with notice |
|
|
464
|
+
| POST `/api/quality-scan` | autonomy/loki:23927, vscode-extension/media/loki-dashboard.js:7832 | none | MISSING | 501 not yet supported |
|
|
465
|
+
| GET `/api/quality-report` | autonomy/loki:23994 | none | MISSING | 501 not yet supported |
|
|
466
|
+
| GET `/api/migration/list` | vscode-extension/media/loki-dashboard.js:8173 | none | MISSING | 501 not yet supported |
|
|
467
|
+
| POST `/api/migration/start` | none | none | UNUSED | 410 with notice |
|
|
468
|
+
| GET `/api/migration/{migration_id}/status` | vscode-extension/media/loki-dashboard.js:8173 | none | MISSING | 501 not yet supported |
|
|
469
|
+
| GET `/api/migration/{migration_id}/plan` | none | none | UNUSED | 410 with notice |
|
|
470
|
+
| GET `/api/migration/{migration_id}/features` | none | none | UNUSED | 410 with notice |
|
|
471
|
+
| GET `/api/migration/{migration_id}/seams` | none | none | UNUSED | 410 with notice |
|
|
472
|
+
| POST `/api/migration/{migration_id}/advance` | none | none | UNUSED | 410 with notice |
|
|
473
|
+
| POST `/api/migration/{migration_id}/start-phase` | none | none | UNUSED | 410 with notice |
|
|
474
|
+
| GET `/api/managed/events` | vscode-extension/media/loki-dashboard.js:11965 | none | MISSING | 501 not yet supported |
|
|
475
|
+
| GET `/api/managed/status` | tests/integration/test_dashboard_api_smoke.sh:105 (test), tests/integration/test_dashboard_api_smoke.sh:106 (test), vscode-extension/media/loki-dashboard.js:11965 | none | MISSING | 501 not yet supported |
|
|
476
|
+
| GET `/api/managed/memory_versions/{memory_id}` | none | none | UNUSED | 410 with notice |
|
|
477
|
+
| GET `/api/findings/{iteration}` | none | none | UNUSED | 410 with notice |
|
|
478
|
+
| GET `/api/quality/architecture` | none | none | UNUSED | 410 with notice |
|
|
479
|
+
| GET `/api/learnings` | tests/e2e/dashboard-evidence-panels.mjs:72 (test) | none | MISSING | 501 not yet supported |
|
|
480
|
+
| GET `/api/escalations` | vscode-extension/media/loki-dashboard.js:12356 | none | MISSING | 501 not yet supported |
|
|
481
|
+
| GET `/api/escalations/{filename}` | none | none | UNUSED | 410 with notice |
|
|
482
|
+
| GET `/api/phases` | none | none | UNUSED | 410 with notice |
|
|
483
|
+
| GET `/api/proofs` | tests/e2e/dashboard-evidence-panels.mjs:71 (test), tests/e2e/webapp-receipt-panel.mjs:75 (test), tests/e2e/webapp-receipt-panel.mjs:84 (test) | none | MISSING | 501 not yet supported |
|
|
484
|
+
| GET `/api/proofs/summary` | tests/e2e/webapp-receipt-panel.mjs:76 (test) | none | MISSING | 501 not yet supported |
|
|
485
|
+
| GET `/api/proofs/{run_id}` | tests/moat/p2-honest-verdict.sh:1251 (test) | none | MISSING | 501 not yet supported |
|
|
486
|
+
| GET `/api/proofs/{run_id}/html` | none | none | UNUSED | 410 with notice |
|
|
487
|
+
| GET `/api/spec` | none | none | UNUSED | 410 with notice |
|
|
488
|
+
| GET `/api/spec/history` | none | none | UNUSED | 410 with notice |
|
|
489
|
+
| GET `/api/wiki` | none | none | UNUSED | 410 with notice |
|
|
490
|
+
| GET `/api/wiki/{section}` | none | none | UNUSED | 410 with notice |
|
|
491
|
+
| POST `/api/wiki/ask` | vscode-extension/media/loki-dashboard.js:12595 | none | MISSING | 501 not yet supported |
|
|
492
|
+
| GET `/{full_path:path}` | none | SPA fallback | EXISTS (CP app.get("*") serves the SPA and 404s missing assets) | none (CP UI serves it) |
|
|
493
|
+
|
|
494
|
+
### 5.3 Notes for the deletion gate
|
|
495
|
+
|
|
496
|
+
- Test consumers that block deleting the legacy routes (they run the Python app in process, so they need the routes or a rewrite): tests/moat/p2-honest-verdict.sh (GET /api/proofs/{run_id}, GET /api/v2/audit/verify) and tests/moat/p7-no-fabricated-data.sh (/api/status, /api/projects, /api/cost, /api/budget, /api/cost/timeline, /api/fleet/runs, /api/fleet/summary, /api/context, /api/memory/economics, /api/learning/metrics, /api/council/gate, /metrics). tests/e2e/dashboard-evidence-panels.mjs and webapp-receipt-panel.mjs read /api/proofs, /api/proofs/summary, /api/learnings, /api/budget. None of these may be weakened or added to tests/moat/pending.txt; CPE-24 must port the property each one proves before the route goes.
|
|
497
|
+
- Corrections to the inventory hints: tests/moat/p5-sovereignty.sh does not call /api/enterprise/status or /api/enterprise/tokens (it runs `loki start`, matched by the text `/start`); autonomy/loki does not call /api/control/start or /api/control/stop on the dashboard; the VS Code extension requests `/status`, which the legacy server never served (its catch-all answered HTML), so it is not a row.
|
|
498
|
+
- /api/memory/* and /api/learning/* are consumed by the VS Code memory view (src/views/memoryViewProvider.ts, dashboardWebview.ts) and the bundled webview, and p7 reads /api/memory/economics and /api/learning/metrics, so those that appear USED above are not deletable on the UI alone.
|
|
499
|
+
- /health: the CP /health identity ({service: "loki-control"}) is relied on by CLI discovery. Callers that probe the legacy /health body at port 57374 (autonomy/loki, autonomy/run.sh, web-app) need either a migrated probe or a separate listener; the shim does not add one.
|
|
500
|
+
|
|
240
501
|
## 6. STEP 2 slice plan
|
|
241
502
|
|
|
242
503
|
Rules: one writer per file; UI pages register through ui/src/pages/registry.ts and server routes through src/server/routes/index.ts, both CREATED with stubs for every planned page and route by CPE-02 and CPE-03, so later slices only fill their own stub files. Wall checks run from packages/control-plane. HIGH = opus D12 review.
|
|
@@ -251,7 +512,7 @@ Rules: one writer per file; UI pages register through ui/src/pages/registry.ts a
|
|
|
251
512
|
| CPE-06 | Run thread view: stage messages, live log, diff, evidence, receipt, NOT PROVEN, cost, PR, BLOCKED reply prompt, Details drawer; replaces Live.tsx | ui/src/pages/run/**, ui/src/Live.tsx (delete), test/ui/run.test.tsx | `bun test test/ui/run.test.tsx` (fixture run renders every section; missing cost shows "not measured") | 02, 04, 05 | MEDIUM |
|
|
252
513
|
| CPE-07 | Start-run endpoint POST /v1/runs | src/server/routes/start.ts, src/server/spawn.ts, test/server/start.test.ts | `bun test test/server/start.test.ts` (unknown repo, shell metacharacters, unknown flag, missing token, bad Origin all refused; argv exact) | 03 | HIGH |
|
|
253
514
|
| CPE-08 | New run composer: one input, chips, Cmd+Enter, optimistic session row, empty state | ui/src/pages/compose/**, test/ui/compose.test.tsx | `bun test test/ui/compose.test.tsx` | 02, 07 | MEDIUM |
|
|
254
|
-
| CPE-09 | Run control: supervisor writes <run>/run.pid (pid, start time, argv); stop, retry, resume endpoints | loki-ts/src/
|
|
515
|
+
| CPE-09 | Run control: supervisor writes <run>/run.pid (pid, start time, argv); stop, retry, resume endpoints | loki-ts/src/util/run_pid.ts, loki-ts/src/engine10/supervisor.ts, src/server/routes/control.ts, test/server/control.test.ts, loki-ts/tests/engine10/run_pid.test.ts | `bun test test/server/control.test.ts` and `cd loki-ts && bun test tests/engine10/run_pid.test.ts` (stale pid, reused pid, other run's pid refused) | 03 | HIGH |
|
|
255
516
|
| CPE-10 | Run control UI: Stop (confirm), Retry, Resume with optimistic state and rollback | ui/src/pages/run-controls/** (mounted in the run header slot CPE-06 provides), test/ui/controls.test.tsx | `bun test test/ui/controls.test.tsx` | 06, 09 | LOW |
|
|
256
517
|
| CPE-11 | Runs table page with filters and group rollup | ui/src/pages/runs/**, test/ui/runs.test.tsx | `bun test test/ui/runs.test.tsx` | 02 | LOW |
|
|
257
518
|
| CPE-12 | Home: /v1/stats plus KPI tiles, recent runs, BLOCKED inbox | src/server/routes/stats.ts, ui/src/pages/home/**, test/server/stats.test.ts, test/ui/home.test.tsx | `bun test test/server/stats.test.ts test/ui/home.test.tsx` (numbers equal a hand-folded fixture) | 02, 03 | MEDIUM |
|
|
@@ -143,3 +143,24 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
|
|
|
143
143
|
- the shipper imports in e10ext/ship_hook.ts and commands/control.ts, which have no external deps today but share the same path.
|
|
144
144
|
- Mechanism: one `postinstall` in loki-ts/package.json installs packages/control-plane from its frozen lockfile, so every loki-ts install (CI, Docker, local) gets the sibling's deps. No per-workflow steps.
|
|
145
145
|
- Fixture: a clean `git worktree add` at HEAD, then `bun install --frozen-lockfile && bun run build` in loki-ts, and again with `--production`. Both exit 0 and the dist is byte-identical to the committed one; without the postinstall the build exits 1 with the error above.
|
|
146
|
+
|
|
147
|
+
## FC-13 Tests pin a data value that a correct change is allowed to move
|
|
148
|
+
- User saw: nothing; the full loki-ts bun test on merged main ca9b85b7f had 5 red in "budget: cache token pricing" after MW-1 correctly moved sonnet from 3/15/0.3/3.75 to 2/10/0.2/2.5. The expected totals (0.6617, 3.0) and tiers were literals, so the price change read as a cost bug. The MW-1 review was approved on the slice's own suites, without the full bun test (an FC-11 sibling).
|
|
149
|
+
- Law: L7 (the release is a contract); a guard must fail on wrong behavior, not on a legitimate data change.
|
|
150
|
+
- Siblings:
|
|
151
|
+
- tests/dashboard/test_api_cost_cache.py stubs its own table, so it stays consistent, but its docstring says the other routes return 0.6617, which is stale (cosmetic);
|
|
152
|
+
- tests/test-pricing-parity.sh (MW-1) compares routes against model-pricing.json, the correct shape;
|
|
153
|
+
- the codex and gpt rows drift between run.sh and budget.ts (rv-mw1 follow-up), which is the same file-is-the-source rule.
|
|
154
|
+
- Mechanism: arithmetic tests derive expectations from the single pricing source (loki-ts/data/model-pricing.json) and assert the loaded table equals the file; only the fixture token counts are literal. Pricing-table changes run the full bun test in main before the train (FC-11 mechanism).
|
|
155
|
+
- Fixture: loki-ts/test/budget_cache_pricing.test.ts at 0de0838e1, 8 pass 0 fail; "cache tiers survive loading" compares the loaded PRICING with the file (loader mutation not yet run; follow-up).
|
|
156
|
+
|
|
157
|
+
## FC-14 A nested sandbox trusts an inherited pointer to the real environment
|
|
158
|
+
- User saw: running the test runner truncated the founder real ~/.loki/keys/receipt-ed25519.pem. A fixture wrote through an inherited LOKI_REAL_HOME that still named the real home while HOME was a stand-in.
|
|
159
|
+
- Law: L2 (trust fails closed).
|
|
160
|
+
- Siblings:
|
|
161
|
+
- loki_hermetic_home_enter (tests/lib/hermetic-home.sh) took LOKI_REAL_HOME from the environment;
|
|
162
|
+
- loki-ts/tests/preload.ts used LOKI_REAL_HOME ?? HOME;
|
|
163
|
+
- run_runner in tests/test-e154-e155-guards.sh kept the exported LOKI_REAL_HOME;
|
|
164
|
+
- the outer E-154 key check compared names only, so truncating an existing key was invisible.
|
|
165
|
+
- Mechanism: derive the real path from the current HOME, never from an inherited variable (enter unsets LOKI_REAL_HOME, preload reads HOME); the key check fingerprints name, size and mtime.
|
|
166
|
+
- Fixture: tests/test-e154-e155-guards.sh (run_runner strips the pointers; t-keys writes only the runner-derived stand-in). A decoy-pointer probe and a bun HOME probe are owed after Oct 7 (B3, phase D vacuity).
|
package/docs/v10/METRICS.md
CHANGED
|
@@ -579,3 +579,9 @@ Raw rows: ~/loki-ci-logs/d50-{raw-haiku,raw-sonnet,v10-haiku,v10-sonnet}/results
|
|
|
579
579
|
| pub-humanize-174 | 0/3 | 2/3 |
|
|
580
580
|
| aiq-52-searchbar (no_change_needed) | 0/3 | 2/3 |
|
|
581
581
|
Two of the four baseline losses were noise; two are real. Internal measurement, not for publication until the fixes are re-measured.
|
|
582
|
+
|
|
583
|
+
## Cost rate re-baseline (MW-1)
|
|
584
|
+
| Date | Model | Input $/MTok | Output $/MTok | Cache read | Cache write 5m | Context | Source |
|
|
585
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
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
|
+
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.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema_version": 1,
|
|
3
3
|
"_comment": "Rolling pricing table consumed by loki-ts/src/runner/budget.ts. Update this file when Anthropic / OpenAI / others publish new prices; no code change required. Pricing is USD per 1 million tokens. Aliases (opus/sonnet/haiku) point to the latest model of that family per providers/model_catalog.json.",
|
|
4
|
-
"_updated": "2026-
|
|
5
|
-
"_source": "https://www.anthropic.com/pricing + provider docs. sonnet=claude-sonnet-5 (
|
|
4
|
+
"_updated": "2026-10-03",
|
|
5
|
+
"_source": "https://www.anthropic.com/pricing + provider docs. sonnet=claude-sonnet-5 and claude-sonnet-5-5, both $2/$10 per MTok (the Sonnet 5 intro price became the standard price; the 2026-09-01 increase to $3/$15 will not occur), cache write 5m $2.50, cache read $0.20, 1M context at standard pricing (platform.claude.com/docs/en/about-claude/pricing, read 2026-10-03). opus=claude-opus-5. codex=gpt-5.3-codex standard tier. Cache tiers: read 0.1x input, write 1.25x input (Anthropic + OpenAI published multipliers).",
|
|
6
6
|
"pricing": {
|
|
7
7
|
"fable": {
|
|
8
8
|
"input": 10.0,
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
"cache_write": 6.25
|
|
18
18
|
},
|
|
19
19
|
"sonnet": {
|
|
20
|
-
"input":
|
|
21
|
-
"output":
|
|
22
|
-
"cache_read": 0.
|
|
23
|
-
"cache_write":
|
|
20
|
+
"input": 2.0,
|
|
21
|
+
"output": 10.0,
|
|
22
|
+
"cache_read": 0.2,
|
|
23
|
+
"cache_write": 2.5
|
|
24
24
|
},
|
|
25
25
|
"haiku": {
|
|
26
26
|
"input": 1.0,
|