loki-mode 11.74.2 → 11.75.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +2 -3
  3. package/VERSION +1 -1
  4. package/autonomy/completion-council.sh +10 -10
  5. package/autonomy/council-v2.sh +4 -4
  6. package/autonomy/grill.sh +1 -1
  7. package/autonomy/lib/ablation.py +22 -2
  8. package/autonomy/lib/browser-open.sh +1 -1
  9. package/autonomy/lib/chat.sh +1 -1
  10. package/autonomy/lib/cockpit-render.sh +1 -1
  11. package/autonomy/lib/done-recognition.sh +4 -4
  12. package/autonomy/lib/efficiency_cost.py +1 -1
  13. package/autonomy/lib/engine10-push.sh +2 -2
  14. package/autonomy/lib/prd-enrich.sh +1 -1
  15. package/autonomy/lib/proof-check.sh +1 -1
  16. package/autonomy/lib/proof-generator.py +3 -3
  17. package/autonomy/lib/proof-pr.sh +1 -1
  18. package/autonomy/lib/skill-link-heal.sh +1 -1
  19. package/autonomy/lib/voter-agents.sh +1 -1
  20. package/autonomy/loki +26 -37
  21. package/autonomy/prd-checklist.sh +1 -1
  22. package/autonomy/receipt_jwt.py +1 -1
  23. package/autonomy/run.sh +28 -28
  24. package/autonomy/trigger-schedule.py +6 -414
  25. package/autonomy/tui.sh +1 -1
  26. package/autonomy/verify.sh +4 -4
  27. package/completions/loki.bash +0 -5
  28. package/dashboard/__init__.py +1 -1
  29. package/docs/ARCHITECTURE.md +1 -2
  30. package/docs/CLI-REFERENCE.md +1 -1
  31. package/docs/COMPONENTS.md +1 -1
  32. package/docs/INSTALLATION.md +1 -1
  33. package/docs/ROUTING-EVIDENCE.md +1 -2
  34. package/docs/V10-RESEARCH.md +1 -1
  35. package/docs/dev/architecture-reference.md +3 -7
  36. package/docs/dev/project-structure.md +1 -4
  37. package/docs/dev/release-checklist.md +13 -31
  38. package/docs/research-2026-07/OBSERVABILITY-TOOL-SPEC.md +1 -1
  39. package/docs/v11/MARKET-SLICES.md +1 -1
  40. package/docs/v11/REGISTRIES.md +1 -1
  41. package/docs/v11/ROUTER-1.md +2 -2
  42. package/loki-ts/dist/loki.js +2 -2
  43. package/mcp/__init__.py +1 -1
  44. package/package.json +2 -2
  45. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  46. package/skills/extending.md +2 -3
  47. package/skills/factory-operations.md +11 -18
  48. package/skills/release-cadence.md +2 -2
  49. package/web-app/dist/assets/{AdminPage-jkjilfbl.js → AdminPage-CTwi8SUX.js} +1 -1
  50. package/web-app/dist/assets/{Avatar-bd5JWkSJ.js → Avatar-DVtGtLkJ.js} +1 -1
  51. package/web-app/dist/assets/{Badge-DVRit2Xw.js → Badge-rwKzz0Pe.js} +1 -1
  52. package/web-app/dist/assets/{Button-BNAB-pVZ.js → Button-nIsPDfsQ.js} +1 -1
  53. package/web-app/dist/assets/{CockpitPage-DpG29h_w.js → CockpitPage-BCeDpoWa.js} +1 -1
  54. package/web-app/dist/assets/{ComparePage-Dasg5V41.js → ComparePage-CYIYanVq.js} +1 -1
  55. package/web-app/dist/assets/{ErrorBoundary-DJojse6b.js → ErrorBoundary-Bkz6HqWp.js} +1 -1
  56. package/web-app/dist/assets/{EvidenceReceiptPanel-Blxw7_u1.js → EvidenceReceiptPanel-DZT2Np4F.js} +1 -1
  57. package/web-app/dist/assets/{GitHubIssuesPanel-BBvSFj80.js → GitHubIssuesPanel-Bzla91Lu.js} +1 -1
  58. package/web-app/dist/assets/{GitHubPRsPanel-BCIKeSBg.js → GitHubPRsPanel-FjT-Xn5t.js} +1 -1
  59. package/web-app/dist/assets/{HomePage-C7d__oNG.js → HomePage-pXgmRGLt.js} +2 -2
  60. package/web-app/dist/assets/{LoginPage-BXljL3yY.js → LoginPage-CnmpE28B.js} +1 -1
  61. package/web-app/dist/assets/{MagicPage-Xjkts_yE.js → MagicPage-CuSeGsLq.js} +1 -1
  62. package/web-app/dist/assets/{MetricsPage-kQvVp-j2.js → MetricsPage-Bg3PkBOU.js} +1 -1
  63. package/web-app/dist/assets/{NotFoundPage-D-4ZlEaO.js → NotFoundPage-uzBtZNV-.js} +1 -1
  64. package/web-app/dist/assets/{ProjectPage-DfzR5RXP.js → ProjectPage-Dacki8Xr.js} +3 -3
  65. package/web-app/dist/assets/{ProjectsPage-DFDsWzkV.js → ProjectsPage-BRGjksXG.js} +1 -1
  66. package/web-app/dist/assets/{SettingsPage-CLPIoYT3.js → SettingsPage-BbNf3fEJ.js} +1 -1
  67. package/web-app/dist/assets/{ShowcasePage-PZKkyGeY.js → ShowcasePage-XX4830sX.js} +1 -1
  68. package/web-app/dist/assets/{SystemSettingsPage-BsBlcnzo.js → SystemSettingsPage-DOhQeXa6.js} +1 -1
  69. package/web-app/dist/assets/{TeamsPage-BSjgNhoU.js → TeamsPage-2reIRUp_.js} +1 -1
  70. package/web-app/dist/assets/{TemplatesPage-W2KeAzbg.js → TemplatesPage-BUsLEWHW.js} +1 -1
  71. package/web-app/dist/assets/{TerminalOutput-BjroTiCC.js → TerminalOutput-BrBDcgzC.js} +1 -1
  72. package/web-app/dist/assets/{activity-BXZ5YYes.js → activity-B6AZpgmb.js} +1 -1
  73. package/web-app/dist/assets/{bell-D1urp5pa.js → bell-CB792A7S.js} +1 -1
  74. package/web-app/dist/assets/{bot-Chedf2bF.js → bot-uQZwOFAn.js} +1 -1
  75. package/web-app/dist/assets/{check-DhaCuOCV.js → check-DrtG0lIZ.js} +1 -1
  76. package/web-app/dist/assets/{chevron-left-D7BpQyA6.js → chevron-left-CrsJSAqQ.js} +1 -1
  77. package/web-app/dist/assets/{circle-alert-DnGvQ_AQ.js → circle-alert-BUCly4p3.js} +1 -1
  78. package/web-app/dist/assets/{clock-CqfxWhHM.js → clock-B2IT9SnE.js} +1 -1
  79. package/web-app/dist/assets/{cloud-BKxp5AWB.js → cloud-CN6Ux7Q7.js} +1 -1
  80. package/web-app/dist/assets/{code-xml-BDQ6GBtt.js → code-xml-BEm8PWnK.js} +1 -1
  81. package/web-app/dist/assets/{database-BmpEx1y_.js → database-cHe5Fgu8.js} +1 -1
  82. package/web-app/dist/assets/{dollar-sign-DYNY9R_C.js → dollar-sign-BVmP4YrE.js} +1 -1
  83. package/web-app/dist/assets/{file-code-corner-BJi0IBFd.js → file-code-corner-D-m-NrwO.js} +1 -1
  84. package/web-app/dist/assets/{file-plus-Dqyb2bcQ.js → file-plus-6mCjIzAB.js} +1 -1
  85. package/web-app/dist/assets/{globe-DPh4RWfM.js → globe-vcWOujwU.js} +1 -1
  86. package/web-app/dist/assets/{hammer-B3xnuoA1.js → hammer-D4nZFpO2.js} +1 -1
  87. package/web-app/dist/assets/{index-BpX8DcTr.js → index-u8toJ43r.js} +3 -3
  88. package/web-app/dist/assets/{layers-BRCmyCW8.js → layers-CNhYLop8.js} +1 -1
  89. package/web-app/dist/assets/{loader-circle-n07Pky0M.js → loader-circle-Vl7XIMV6.js} +1 -1
  90. package/web-app/dist/assets/{lock-BWqOuQmS.js → lock-SW_KwAvf.js} +1 -1
  91. package/web-app/dist/assets/{package-BJlB_Z-Z.js → package-QPK-7Ej1.js} +1 -1
  92. package/web-app/dist/assets/{plus-oH17BZu2.js → plus-DUgAlgCB.js} +1 -1
  93. package/web-app/dist/assets/{refresh-cw-CPQ476LL.js → refresh-cw-LfUksPHq.js} +1 -1
  94. package/web-app/dist/assets/{rotate-ccw-7hLvOcnS.js → rotate-ccw-CMbuouVq.js} +1 -1
  95. package/web-app/dist/assets/{scroll-text-BCmLauQn.js → scroll-text-C_FxBmNQ.js} +1 -1
  96. package/web-app/dist/assets/{server-DfTfvW84.js → server-7UJe9Jqt.js} +1 -1
  97. package/web-app/dist/assets/{shield-alert-CaeGRq19.js → shield-alert-BMuu6fYB.js} +1 -1
  98. package/web-app/dist/assets/{thumbs-up-Dz-l2GPC.js → thumbs-up-Bhs0d2Gp.js} +1 -1
  99. package/web-app/dist/assets/{trash-2-B-OsDmSo.js → trash-2-BZKxv49w.js} +1 -1
  100. package/web-app/dist/assets/{trending-down-CXTFOxzq.js → trending-down-DKeCMZek.js} +1 -1
  101. package/web-app/dist/assets/{trending-up-FQEdqr3v.js → trending-up-43_9fShg.js} +1 -1
  102. package/web-app/dist/assets/{upload-CacWSNTg.js → upload-pV3irPEW.js} +1 -1
  103. package/web-app/dist/assets/{usePolling-cIjZ9qd2.js → usePolling-CoZQM-WL.js} +1 -1
  104. package/web-app/dist/assets/{user-DAouWFHi.js → user-CMl7dXvC.js} +1 -1
  105. package/web-app/dist/index.html +1 -1
  106. package/autonomy/company-seats.json +0 -82
  107. package/docs/COMPETITIVE-INTEL-2026-09.md +0 -444
  108. package/docs/FOUNDER-DECISIONS-TRUST-SEMANTICS-2026-08-01.md +0 -145
  109. package/docs/FOUNDER-STATUS-AND-DECISIONS-2026-07-01.md +0 -132
  110. package/docs/LOKI-10-BUILD-PROMPT.md +0 -350
  111. package/docs/STRATEGY-2026-2028.md +0 -124
  112. package/docs/V10-VISION.md +0 -161
  113. package/docs/v10/ADOPTION-PLAN.md +0 -375
  114. package/docs/v10/ARCHITECT-CUTS.md +0 -744
  115. package/docs/v10/BACKLOG.md +0 -231
  116. package/docs/v10/BOARD.md +0 -1403
  117. package/docs/v10/CONTROL-PLANE.md +0 -120
  118. package/docs/v10/CONTROL.md +0 -36
  119. package/docs/v10/CP-ASK-PLAN.md +0 -85
  120. package/docs/v10/CP-ENTERPRISE-UI.md +0 -537
  121. package/docs/v10/D51-PHASE-B.md +0 -120
  122. package/docs/v10/D61-SPEED.md +0 -105
  123. package/docs/v10/D63-CARDS.md +0 -354
  124. package/docs/v10/DECISIONS.md +0 -915
  125. package/docs/v10/E2E-D65.md +0 -123
  126. package/docs/v10/ENGINE-LAWS.md +0 -163
  127. package/docs/v10/ENGINE-MEASURE.md +0 -69
  128. package/docs/v10/ENGINE.md +0 -743
  129. package/docs/v10/FAILURE-CLASSES.md +0 -2026
  130. package/docs/v10/FC21B-FC22-PLAN.md +0 -107
  131. package/docs/v10/FIRST-RUN-GATE.md +0 -39
  132. package/docs/v10/FOUNDER-QUEUE.md +0 -29
  133. package/docs/v10/GAP-RESEARCH-1003.md +0 -32
  134. package/docs/v10/GUARDS.md +0 -883
  135. package/docs/v10/L0-WAVE1.md +0 -81
  136. package/docs/v10/LEGACY-REMOVAL.md +0 -408
  137. package/docs/v10/MEDIUM-ANALYSIS.md +0 -346
  138. package/docs/v10/METRICS.md +0 -645
  139. package/docs/v10/MODERNIZE.md +0 -437
  140. package/docs/v10/OPENCODE-PARITY-PLAN.md +0 -84
  141. package/docs/v10/OPERATING-MODEL.md +0 -60
  142. package/docs/v10/PLAN-V12.md +0 -896
  143. package/docs/v10/PROGRESS.md +0 -2735
  144. package/docs/v10/RELEASE-11.md +0 -77
  145. package/docs/v10/RETRO-2026.md +0 -650
  146. package/docs/v10/ROADMAP-D63.md +0 -35
  147. package/docs/v10/SCALE.md +0 -140
  148. package/docs/v10/SCORECARD-PLAN.md +0 -250
  149. package/docs/v10/SWARM-PROMPT.md +0 -98
  150. package/docs/v10/SWARM.md +0 -293
  151. package/docs/v10/cp-redesign/PARITY.md +0 -188
  152. package/docs/v10/cp-redesign/legacy/INDEX.md +0 -1167
  153. package/docs/v10/roadmap-10/01-measurement.md +0 -113
  154. package/docs/v10/roadmap-10/02-cost.md +0 -75
  155. package/docs/v10/roadmap-10/03-speed.md +0 -65
  156. package/docs/v10/roadmap-10/04-first-run.md +0 -61
  157. package/docs/v10/roadmap-10/05-deploy.md +0 -61
  158. package/docs/v10/roadmap-10/06-stability.md +0 -64
  159. package/docs/v10/roadmap-10/07-quality.md +0 -57
  160. package/docs/v10/roadmap-10/08-proof.md +0 -48
  161. package/docs/v10/roadmap-10/09-safety.md +0 -74
  162. package/docs/v10/roadmap-10/README.md +0 -1464
  163. package/skills/sdlc-fleet.md +0 -170
  164. package/tools/cockpit/SPEC.md +0 -275
  165. package/tools/cockpit/index.html +0 -146
  166. package/tools/cockpit/roi-basis.json +0 -33
  167. package/tools/cockpit/server.py +0 -946
package/docs/v10/SWARM.md DELETED
@@ -1,293 +0,0 @@
1
- # The swarm
2
-
3
- Adopted 2026-09-26, superseding the one-cycle-at-a-time loop in `docs/v10/PROGRESS.md`
4
- for everything after cycle 4. Goal: 10-20x more releases per day than cycles
5
- 1-4 (about 3 releases in 18 hours), without weakening anything in
6
- `docs/LOKI-10-BUILD-PROMPT.md` sections 2, 5b or 5c, or any global "never do"
7
- rule. Full text of the founder's prompt: `docs/v10/SWARM-PROMPT.md`.
8
-
9
- ## Why cycles were slow
10
-
11
- Each cycle batched 3-6 slices into one release, reviewed the whole batch in
12
- serial council rounds (cycle 1 took 9 rounds, cycle 3 took 6, cycle 4's P7
13
- property was found falsely PROVEN in three consecutive rounds before a fourth
14
- caught it), then verified every channel before the next cycle started. Every
15
- release waited on the slowest slice and on every round.
16
-
17
- ## Changes from the swarm prompt, and why (see DECISIONS.md D12, D13)
18
-
19
- - **D12: unanimous APPROVE, not "3 of 4".** The founder's prompt scored
20
- HIGH-tier review as "3 of 4 approve". CLAUDE.md's SDLC fleet pattern
21
- requires unanimous APPROVE and a full re-run on any CONCERN or REJECT.
22
- Cycle-4 round 3 was APPROVE, APPROVE, CONCERN, and the concern was a real
23
- false PROVEN; a vote-count rule would have shipped it. A HIGH-tier round may
24
- add a fourth adversarial reviewer for extra recall, but any reviewer's
25
- blocking finding with a working reproduction blocks the slice regardless of
26
- the count, and the whole council re-runs after the fix.
27
- - **D13: every review or council agent pins its model explicitly.** Round 4
28
- of the cycle-4 council was launched with two of three lenses left to
29
- inherit the session model; the session model changed between launch and
30
- the lenses resolving, so a round meant to run 2 Opus + 1 Sonnet in fact ran
31
- 3 Sonnet-5 lenses. It was killed and relaunched with every lens pinned.
32
- Every council, review or HIGH-tier script from here on sets `model`
33
- explicitly; composition is enforced by the script, never assumed from the
34
- session.
35
- - **Section 5c.5 (single writer) still governs.** One agent, the Release
36
- Captain, writes `main`, `VERSION`, tags and publishes. Builders are each a
37
- single writer on their own declared file set, never on `main`. Parallel
38
- reviewers are read-only. This is what the swarm's role split already is;
39
- it is restated here because the swarm looks superficially like
40
- peer-to-peer and it is not.
41
- - **`scripts/release.sh` is stale**, covering only `VERSION`,
42
- `package.json`, `vscode-extension/package.json`. The Captain does not run
43
- it as-is; the Captain follows CLAUDE.md's 14-file release checklist
44
- directly (see Captain brief below), and fixing `scripts/release.sh` to
45
- match is a queued LOW slice (BOARD).
46
- - **Budget:** the founder was asked whether to size wave 1 to a conservative
47
- estimate or launch at planned scale without a live cost feed, given
48
- cycle-5 alone had already run about 3.3M subagent output tokens before the
49
- swarm started. Founder chose full scale. METRICS.md still records a
50
- labelled *estimate* per wave (subagent token counts from workflow
51
- journals, not exact billing) so spend stays visible even though it does
52
- not gate wave size. If a wave's estimate would cross a plausible reading of
53
- founder-queue item 3, the swarm drops to 3 builders, keeps shipping LOW
54
- slices, and adds a founder-queue line asking for a clearer budget signal.
55
-
56
- ## Roles
57
-
58
- All roles are agents spawned through `Workflow`, run in git worktrees for
59
- isolation except the Product Owner and Release Captain, which touch shared
60
- state files and must serialize.
61
-
62
- ### 1. Product Owner (PO)
63
-
64
- One agent per wave planning step (re-spawned fresh each time it is needed;
65
- it writes `BACKLOG.md` and `BOARD.md`, never code). Ranks the backlog per
66
- build-prompt section 3 (moat and red-main first, then metric-moved / effort).
67
- Cuts work into release-sized slices:
68
-
69
- - under about 300 changed lines;
70
- - one owner;
71
- - a declared file set that overlaps no other in-flight slice (hot files and
72
- generated bundles are never in a builder's file set: see "Hot files"
73
- below);
74
- - acceptance checks written before building (the Wall, section 5c.1);
75
- - a risk tier (HIGH / MEDIUM / LOW, see Reviewers).
76
-
77
- Keeps roughly twice the builder count of ready slices queued.
78
-
79
- ### 2. Builders
80
-
81
- 6-10 in parallel, `isolation: "worktree"`, one slice each, single writer on
82
- that slice. Each builder:
83
-
84
- - runs `git merge --ff-only <captain's current main sha>` first (worktrees
85
- cut from origin/main, not local main: see memory
86
- `feedback-worktree-agents-base-branch`);
87
- - implements with red-then-green tests;
88
- - runs diff-scoped tests plus `bash tests/moat/run.sh` in its own worktree;
89
- - never touches `main`, `VERSION`, or any hot file or bundle listed below;
90
- - returns BLOCKED (never guesses past its file set) if the slice needs a
91
- file outside its declared set, so the PO can re-slice.
92
-
93
- ### 3. Reviewers
94
-
95
- Read-only, parallel, diff-scoped, tiered by risk. Every finding needs a
96
- reproduction (file:line, a concrete failing scenario, the fix). Models are
97
- always pinned explicitly (D13):
98
-
99
- - **HIGH** (verifier, Seal, gates, council, exit codes, auth, secrets,
100
- `tests/moat`, anything touching the trust core): 3 reviewers with
101
- different lenses (correctness, security/bypass, fail-closed) plus 1
102
- adversarial reviewer told to find a false pass. All 4 pinned to `opus`
103
- except the adversarial slot, which may run `sonnet` for a genuinely
104
- different read. **Unanimous APPROVE required (D12).** Any blocking finding
105
- with a reproduction blocks regardless of the other votes; after a fix,
106
- the whole HIGH council re-runs from round 1.
107
- - **MEDIUM** (runtime, CLI behavior, dashboard logic without a trust-core
108
- path): 2 reviewers, pinned `opus`. Unanimous APPROVE required; one
109
- CONCERN re-runs both after the fix.
110
- - **LOW** (docs, copy, tests-only, UI with no data path, deleting
111
- unreachable code): 1 reviewer, may be pinned `sonnet`. APPROVE required;
112
- a CONCERN re-runs it after the fix.
113
-
114
- After 3 rounds at any tier without unanimous APPROVE, the slice goes back to
115
- the PO to be cut smaller. It never blocks the line: other slices keep moving
116
- through the pipeline.
117
-
118
- ### 4. Release Captain
119
-
120
- Exactly one, never parallelized, serialized by a promise chain within one
121
- Workflow run (see "Cross-wave exclusion"). The only agent allowed to write
122
- `main`, bump `VERSION`, tag, or publish. For each approved slice, in order:
123
-
124
- 1. Rebase the slice onto current `origin/main`.
125
- 2. Apply any hot-file additions the slice requested (below), mechanically.
126
- 3. Rebuild every bundle the slice's file set could affect (below).
127
- 4. Run `bash scripts/local-ci.sh` (fast tier) and `bash tests/moat/run.sh`.
128
- The ratchet (`pending.txt` shrink-only, `cases.txt` grow-only, D2) must
129
- not regress; a regression refuses the merge and returns the slice to its
130
- builder.
131
- 5. Stage by name (never `git add -A`), commit with the repo-local asklokesh
132
- identity, push.
133
- 6. Bump `VERSION` and the other 13 files per CLAUDE.md's release checklist
134
- (`scripts/release.sh` is stale; do this directly, not through the
135
- script), rebuild dashboard and dist, run the full pre-publish validation,
136
- commit as the push head, push with `PRE_PUSH_SKIP=1` (D5).
137
- 7. Wait for the previous release's required-ci (Tests, Bun Parity, Security
138
- Audit) to go green before bumping `VERSION` again, so releases never
139
- cancel each other's CI (the v9.7-v9.9 failure, and
140
- `feedback-release-push-cancels-tests`). If several slices are ready
141
- while waiting, batch them into the next release rather than idle.
142
- 8. On a code conflict, send the slice back to its builder with the new base.
143
- The Captain never resolves a code conflict itself.
144
- 9. After a required-ci failure, rerun the failed job once; if the second
145
- run also fails, do a full `gh run rerun` (never `--failed`) on the whole
146
- Release run, and wait out the roughly 4-minute npm propagation window
147
- before treating a publish as real
148
- (`feedback-release-rerun-must-be-full-not-failed`,
149
- `feedback-npm-propagation-window-4min`).
150
-
151
- **Hot files** (never in any builder's declared file set; the Captain applies
152
- requested additions mechanically at merge time):
153
- `tests/moat/cases.txt`, `tests/moat/pending.txt` (merge with
154
- `scratchpad/union_cases.py`'s approach: union for cases, intersection-aware
155
- shrink for pending), `CHANGELOG.md`, `docs/v10/BACKLOG.md`,
156
- `docs/v10/BOARD.md`, `docs/v10/PROGRESS.md`, `docs/v10/METRICS.md`,
157
- `scripts/local-ci.sh` (`_FAST_KEEP` entries and `run_check` call sites),
158
- `tests/run-all-tests.sh`.
159
-
160
- **Generated bundles** (never edited by hand by a builder; the Captain
161
- rebuilds all three after every merge that could touch their sources):
162
- `loki-ts/dist/loki.js` (from `loki-ts/src`), `legacy-ui-static/index.html`
163
- and `legacy-ui/dist` (from `legacy-ui/scripts/build-standalone.js` and
164
- components), `web-app/dist` (from `web-app/src`).
165
-
166
- **Cross-wave exclusion:** a promise chain only serializes within one
167
- `Workflow` run. The swarm runs the PO-refill and Captain-queue loop inside a
168
- single long-running `Workflow` invocation rather than launching a fresh one
169
- per wave, so there is exactly one Captain at any time. If a script must be
170
- edited and re-invoked, the previous run is stopped first (`TaskStop`) and its
171
- in-flight slices are recovered from `BOARD.md` before the new run starts.
172
-
173
- ### 5. Channel Verifier
174
-
175
- One, async, read-only, spawned after each release. Checks npm `latest` and
176
- `gitHead`, the tag, the GitHub release, Docker amd64/arm64, the Homebrew
177
- sha256, and a smoke test from a fresh PATH. Never blocks the next merge. A
178
- failure becomes a HIGH-priority fix-forward slice through the normal PO
179
- queue. Never unpublishes or deletes a version.
180
-
181
- ## Orchestration
182
-
183
- - Repeated `Workflow` waves inside one long run: the PO produces up to 10
184
- ready slices, then `pipeline(slices, build -> verify -> review/fix loop ->
185
- captain queue)`. `pipeline`, not `parallel`, so a LOW slice ships while a
186
- HIGH slice is still mid-review.
187
- - The Captain step in the pipeline is itself a promise chain
188
- (`captainQueue = captainQueue.then(() => mergeAndRelease(slice))`), so
189
- exactly one merge or release runs at a time even though builders and
190
- reviewers for other slices run concurrently.
191
- - BOARD.md (slice id, owner, file set, tier, status, blockers) is the
192
- coordination surface between agents; only the PO and the Captain write it.
193
- - The next wave's PO step starts as soon as ready slices run low; the
194
- script never waits on Channel Verifier output before starting more work.
195
-
196
- ## Speed levers, in priority order
197
-
198
- 1. One slice, one release.
199
- 2. Risk-tiered review; most slices are LOW or MEDIUM.
200
- 3. Parallel reviewers per slice instead of serial whole-batch rounds.
201
- 4. Asynchronous channel verification.
202
- 5. Diff-scoped tests while building; the full fast tier plus moat run only
203
- at merge.
204
- 6. Flaky tests: rerun once, record it in `BACKLOG.md`, open a slice. Never
205
- pass a flake silently (BACKLOG 93).
206
-
207
- ## Cloud dispatch (G-04)
208
-
209
- `scripts/cloud-dispatch.sh SLICE-ID` fans one ready slice out to a Claude
210
- Code cloud session that works on `cloud/<slice-id>` and opens its own PR; the
211
- Release Manager still merges only PRs whose checks concluded success.
212
-
213
- - Default is `--dry-run`: it prints the exact `claude --cloud "<description>"`
214
- command and the exact BOARD row it would write (status `building`, a
215
- dispatch note with the session id), and changes nothing. Only an explicit
216
- `--live` dispatches. `--live` has never been run; the first live use is a
217
- founder-run probe.
218
- - Refusals, each non-zero with a message: not ready or dependency-blocked
219
- (exit 12); file set overlaps a building, review or review-blocked row
220
- (11); the G-01 governor max is reached, unknown or unreadable (10; same
221
- `usage-governor.py --json` source as the pulse); `--live` with no
222
- `--cloud` option in the installed CLI (13). Fail-safe rules: an in-flight
223
- row that cannot be parsed, or has no concrete file set, refuses (11); a
224
- ready slice with an elided or path-less file set refuses (12); a row with a
225
- tab, escaped pipe or a row not starting with `| ID |` refuses (17, also in
226
- dry-run); path-shaped tokens inside parentheses in a file set still count
227
- toward overlap; `--live` needs a live `.loki/v10-leader` PID that is an
228
- ancestor of the caller (16) and re-checks the row just before launching; the
229
- BOARD write keeps the file's mode; the governor call is
230
- capped at 180s and a timeout refuses; the dry-run governor runs with
231
- `--no-cache`.
232
- - Verified CLI surface (claude 2.1.288): only the top-level option
233
- `--cloud [description|session_id|url]` exists. `--help` documents no repo,
234
- branch, PR or non-interactive flag for it, so the branch and the PR
235
- instruction travel in the description text, and `--live` refuses to write
236
- the BOARD row unless the output contains a session id or claude.ai/code
237
- URL (exit 14).
238
-
239
- ## Guardrails (restated; speed pressure erodes them first)
240
-
241
- - Priority when goals conflict: moat > Seal accuracy > delivered accuracy >
242
- cost > speed (build prompt 5b).
243
- - The moat ratchet never regresses on `main`.
244
- - If two releases in a row fail required-ci, stop releasing, fix `main`,
245
- resume only when green.
246
- - No force push. Never delete versions or tags. Never disable a test or
247
- guard to get green.
248
- - Every "never do" item in build-prompt section 1 still applies without
249
- exception, swarm or not.
250
- - Section 5c.5 (single writer): one agent writes a given change; parallel
251
- agents are read-only; parallelize only across independent items under one
252
- central coordinator, never peer-to-peer.
253
- - Section 5c.11 (injection-safe intake): P9's split jobs and token
254
- withholding (cycle 5) are the concrete form of this rule; the swarm's own
255
- agent-authored slices never combine untrusted input, an agent, and push
256
- rights either.
257
-
258
- ## Slice card template
259
-
260
- Binding: the orchestrator dispatches every builder and reviewer from a slice
261
- card below, never from conversation history or its own recall of prior
262
- turns -- the card is the sole source of scope for that agent. While the
263
- swarm runs, the orchestrator's own live view stays limited to
264
- `docs/v10/CONTROL.md`, the pulse block, and `docs/v10/BOARD.md`; it does not
265
- re-derive scope from scrollback.
266
-
267
- <!-- SLICE-CARD-TEMPLATE:START -->
268
- Slice: S-<id>
269
- Goal: <one sentence, the acceptance condition for this slice>
270
- Tier: LOW | MEDIUM | HIGH
271
- Model: <pinned model, e.g. opus, sonnet -- never inherited, see D13>
272
- Budget: <minutes>
273
- Files:
274
- - <path>
275
- - <path>
276
- Wall checks:
277
- - <command or assertion that must pass before review>
278
- Commands:
279
- - <exact shell command(s) the builder runs>
280
- <!-- SLICE-CARD-TEMPLATE:END -->
281
-
282
- ## Metrics (appended to METRICS.md after every wave)
283
-
284
- - releases in the last 24h
285
- - median slice lead time (ready to npm)
286
- - review rounds per slice, by tier
287
- - moat proven count
288
- - required-ci failures
289
- - spend estimate (subagent output tokens from workflow journals x published
290
- per-token price, labelled ESTIMATE, not exact billing)
291
-
292
- Target: at least 30 releases per 24h at steady state, moat proven count never
293
- decreasing.
@@ -1,188 +0,0 @@
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. |