loki-mode 11.3.0 → 11.3.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 (242) hide show
  1. package/README.md +68 -650
  2. package/SKILL.md +5 -5
  3. package/VERSION +1 -1
  4. package/autonomy/completion-council.sh +2 -2
  5. package/autonomy/context-tracker.py +4 -4
  6. package/autonomy/council-v2.sh +1 -1
  7. package/autonomy/grill.sh +1 -1
  8. package/autonomy/lib/done-recognition.sh +1 -1
  9. package/autonomy/lib/efficiency_cost.py +8 -0
  10. package/autonomy/lib/engine10-push.sh +22 -8
  11. package/autonomy/lib/prd-enrich.sh +1 -1
  12. package/autonomy/lib/voter-agents.sh +1 -1
  13. package/autonomy/loki +161 -105
  14. package/autonomy/run.sh +30 -18
  15. package/autonomy/sandbox.sh +1 -1
  16. package/autonomy/tui.sh +6 -5
  17. package/autonomy/verify.sh +1 -1
  18. package/bin/loki +195 -59
  19. package/completions/_loki +8 -0
  20. package/completions/loki.bash +3 -3
  21. package/dashboard/__init__.py +1 -1
  22. package/dashboard/server.py +47 -45
  23. package/docs/AGENT-CHANGE-RECEIPT.md +2 -2
  24. package/docs/ARCHITECTURE.md +337 -0
  25. package/docs/BRANDING.md +124 -0
  26. package/docs/CLI-REFERENCE.md +11 -1
  27. package/docs/COMPONENTS.md +447 -0
  28. package/docs/DEPLOYMENT.md +9 -9
  29. package/docs/DOCKER.md +469 -0
  30. package/docs/INSTALLATION.md +67 -1045
  31. package/docs/KNOWN-ISSUES.md +11 -35
  32. package/docs/OTEL-COLLECTOR.md +24 -0
  33. package/docs/ROUTING-EVIDENCE.md +32 -0
  34. package/docs/TESTING.md +161 -0
  35. package/docs/air-gapped.md +1 -2
  36. package/docs/alternative-installations.md +14 -24
  37. package/docs/architecture/DECISIONS.md +333 -0
  38. package/docs/audit-logging.md +7 -7
  39. package/docs/authentication.md +3 -3
  40. package/docs/authorization.md +1 -1
  41. package/docs/certification/04-production-deployment/lab.md +6 -6
  42. package/docs/certification/04-production-deployment/lesson.md +4 -4
  43. package/docs/certification/README.md +1 -1
  44. package/docs/control-plane-container.md +2 -2
  45. package/docs/dev/real-run.md +34 -0
  46. package/docs/dev/release-checklist.md +2 -2
  47. package/docs/environment-variables.md +1 -0
  48. package/docs/exit-codes.md +3 -3
  49. package/docs/git-workflow.md +3 -3
  50. package/docs/metrics.md +37 -55
  51. package/docs/network-security.md +1 -1
  52. package/docs/siem-integration.md +5 -5
  53. package/docs/spec-first-intent.md +28 -0
  54. package/docs/v10/CLI-MODERN.md +7 -3
  55. package/docs/v10/DECISIONS.md +59 -0
  56. package/docs/v10/DEPS.md +22 -22
  57. package/docs/v10/ENGINE.md +1 -1
  58. package/docs/v10/FAILURE-CLASSES.md +212 -1
  59. package/docs/v10/FOUNDER-QUEUE.md +1 -0
  60. package/docs/v10/GUARDS.md +31 -0
  61. package/docs/v10/GUIDE.md +7 -5
  62. package/docs/v10/LEGACY-REMOVAL.md +4 -6
  63. package/docs/v10/METRICS.md +14 -2
  64. package/docs/v10/MODERNIZE.md +1 -1
  65. package/docs/v10/OPERATING-MODEL.md +4 -3
  66. package/docs/v10/PROGRESS.md +35 -0
  67. package/docs/v11/COST-HALF.md +352 -0
  68. package/docs/v11/INTOTO-AGENT-CHANGE-PREDICATE.md +77 -0
  69. package/docs/v11/MARKET-SLICES.md +315 -0
  70. package/docs/v11/MCP-2026-07-28.md +55 -0
  71. package/docs/v11/REGISTRIES.md +730 -0
  72. package/docs/v11/VERIFY-PR-SANDBOX.md +41 -0
  73. package/loki-ts/data/model-pricing.json +52 -24
  74. package/loki-ts/dist/loki.js +1185 -945
  75. package/mcp/__init__.py +1 -1
  76. package/mcp/v10_tools.py +29 -0
  77. package/package.json +9 -11
  78. package/packages/control-plane/dist/ask-tools-server.js +8 -2
  79. package/packages/control-plane/dist/server.js +15832 -12361
  80. package/packages/control-plane/drizzle/0006_token_sessions.sql +1 -0
  81. package/packages/control-plane/drizzle/meta/0006_snapshot.json +807 -0
  82. package/packages/control-plane/drizzle/meta/_journal.json +7 -0
  83. package/packages/control-plane/src/db/schema.ts +1 -0
  84. package/packages/control-plane/src/server/routes/cost.ts +4 -3
  85. package/packages/control-plane/src/server/runs.ts +3 -3
  86. package/packages/control-plane/ui/dist/assets/index-DbLzr87u.js +190 -0
  87. package/packages/control-plane/ui/dist/index.html +1 -1
  88. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  89. package/providers/opencode.sh +2 -3
  90. package/src/observability/genai-spans.js +104 -0
  91. package/src/observability/otel-bridge.js +49 -1
  92. package/src/observability/otel.js +2 -2
  93. package/src/protocols/mcp-client.js +6 -2
  94. package/src/protocols/mcp-server.js +191 -6
  95. package/src/protocols/transport/sse.js +23 -2
  96. package/tools/audit-docs.py +1 -1
  97. package/web-app/dist/assets/{AdminPage-D_e45uTw.js → AdminPage-DuRQZsF9.js} +1 -1
  98. package/web-app/dist/assets/{Avatar-T3nIpoaf.js → Avatar-7GtOQvsO.js} +1 -1
  99. package/web-app/dist/assets/{Badge-BKqb59pP.js → Badge-CYgTnIxj.js} +1 -1
  100. package/web-app/dist/assets/{Button-DjVlkh8_.js → Button-rYSyIu7X.js} +1 -1
  101. package/web-app/dist/assets/{CockpitPage-DXJgLGmh.js → CockpitPage-9adANY4o.js} +1 -1
  102. package/web-app/dist/assets/{ComparePage-BRP_eVc_.js → ComparePage-DEG2oA-R.js} +1 -1
  103. package/web-app/dist/assets/{ErrorBoundary-CLjpGLjC.js → ErrorBoundary-CwtvY4xs.js} +1 -1
  104. package/web-app/dist/assets/{EvidenceReceiptPanel-DX-vb4Xy.js → EvidenceReceiptPanel-DTT73pPB.js} +1 -1
  105. package/web-app/dist/assets/{GitHubIssuesPanel-214HVHtX.js → GitHubIssuesPanel-CpWZLz2x.js} +1 -1
  106. package/web-app/dist/assets/{GitHubPRsPanel-BEiZKc4t.js → GitHubPRsPanel-H293R7E2.js} +1 -1
  107. package/web-app/dist/assets/{HomePage-VvMHS5ga.js → HomePage-B11Imp9k.js} +2 -2
  108. package/web-app/dist/assets/{LoginPage-5WD-v7n3.js → LoginPage-BZBgx5Jr.js} +1 -1
  109. package/web-app/dist/assets/{MagicPage-DUQT_Jye.js → MagicPage-B27S4_X8.js} +1 -1
  110. package/web-app/dist/assets/{MetricsPage-lga-z79v.js → MetricsPage-CfbJWNDG.js} +1 -1
  111. package/web-app/dist/assets/{NotFoundPage-CGhBX3G1.js → NotFoundPage-Tp_4zMSm.js} +1 -1
  112. package/web-app/dist/assets/{ProjectPage-CdzF2GzZ.js → ProjectPage-CM4fgMsV.js} +3 -3
  113. package/web-app/dist/assets/{ProjectsPage-DRG64N8s.js → ProjectsPage-DP2Fvsrd.js} +1 -1
  114. package/web-app/dist/assets/{SettingsPage-5fzW9Frb.js → SettingsPage-C4G9-EAy.js} +1 -1
  115. package/web-app/dist/assets/{ShowcasePage-DrTdxO4y.js → ShowcasePage-Dj-n4dwu.js} +1 -1
  116. package/web-app/dist/assets/{SystemSettingsPage-C9Mqs6Rd.js → SystemSettingsPage-BqMLpuGt.js} +1 -1
  117. package/web-app/dist/assets/{TeamsPage-CUGPdSWo.js → TeamsPage-mIH8H96m.js} +1 -1
  118. package/web-app/dist/assets/{TemplatesPage-CNraDY0F.js → TemplatesPage-BagW-v4n.js} +1 -1
  119. package/web-app/dist/assets/{TerminalOutput-BIu_6Pea.js → TerminalOutput-CTQRHhnK.js} +1 -1
  120. package/web-app/dist/assets/{activity-Bk-kgqaf.js → activity-DNQiBDDL.js} +1 -1
  121. package/web-app/dist/assets/{bell-BXmUdmo8.js → bell-Coiwdad1.js} +1 -1
  122. package/web-app/dist/assets/{bot-CiuzXxUR.js → bot-Cou-rTgR.js} +1 -1
  123. package/web-app/dist/assets/{check-BEzjXppd.js → check-CsF-XtQp.js} +1 -1
  124. package/web-app/dist/assets/{chevron-left-AYWCXHf8.js → chevron-left-BJiy55Ht.js} +1 -1
  125. package/web-app/dist/assets/{circle-alert-BNg2uSRq.js → circle-alert-D6-pQQWq.js} +1 -1
  126. package/web-app/dist/assets/{clock-DTj0kkGT.js → clock-BOGqwgt9.js} +1 -1
  127. package/web-app/dist/assets/{cloud-x4nTDBLT.js → cloud-DsxhTtf5.js} +1 -1
  128. package/web-app/dist/assets/{code-xml-BVh_MLrk.js → code-xml-CxJDHUlE.js} +1 -1
  129. package/web-app/dist/assets/{database-DdfBaowG.js → database-BJePscl_.js} +1 -1
  130. package/web-app/dist/assets/{dollar-sign-XuYFmAOY.js → dollar-sign-6qWGAkZo.js} +1 -1
  131. package/web-app/dist/assets/{file-code-corner-D4cRnmeL.js → file-code-corner-DcOtYeDb.js} +1 -1
  132. package/web-app/dist/assets/{file-plus-CyoVlHc_.js → file-plus-WuRyLFo0.js} +1 -1
  133. package/web-app/dist/assets/{globe-Y6IK2RPW.js → globe-r-xCP4DE.js} +1 -1
  134. package/web-app/dist/assets/{hammer-BKzr9VZI.js → hammer-DTt0SsCB.js} +1 -1
  135. package/web-app/dist/assets/{index-B20cSx5G.js → index-BkbXyH8y.js} +3 -3
  136. package/web-app/dist/assets/{layers-DebNOhGS.js → layers-BvZhvSMY.js} +1 -1
  137. package/web-app/dist/assets/{loader-circle-DyGbrEgd.js → loader-circle-3gosTei9.js} +1 -1
  138. package/web-app/dist/assets/{lock-BKPpyt20.js → lock-CZZMxP0U.js} +1 -1
  139. package/web-app/dist/assets/{package-egF5Wi4y.js → package-C5A8CkJr.js} +1 -1
  140. package/web-app/dist/assets/{plus-OiEgKIc-.js → plus-Btv7tTIF.js} +1 -1
  141. package/web-app/dist/assets/{refresh-cw-CzKvrONq.js → refresh-cw-DsWLXgs_.js} +1 -1
  142. package/web-app/dist/assets/{rotate-ccw-Bu2mII0p.js → rotate-ccw-DOVDjway.js} +1 -1
  143. package/web-app/dist/assets/{scroll-text-CSkiyax8.js → scroll-text-smySzlrX.js} +1 -1
  144. package/web-app/dist/assets/{server-DlPthJFw.js → server-b5PHsqAU.js} +1 -1
  145. package/web-app/dist/assets/{shield-alert-CbpHWQQX.js → shield-alert-BD7FDlh-.js} +1 -1
  146. package/web-app/dist/assets/{thumbs-up-DgGpZe-Q.js → thumbs-up-CAsFzbyE.js} +1 -1
  147. package/web-app/dist/assets/{trash-2-BV3GlCB-.js → trash-2-BJ35qHgl.js} +1 -1
  148. package/web-app/dist/assets/{trending-down-Y4TJtXhD.js → trending-down-Ozrd26cZ.js} +1 -1
  149. package/web-app/dist/assets/{trending-up-DsDNoHZY.js → trending-up-BhnMcM32.js} +1 -1
  150. package/web-app/dist/assets/{upload-gkThrc_I.js → upload-JVHfdwoA.js} +1 -1
  151. package/web-app/dist/assets/{usePolling-jpNSeNAe.js → usePolling-CTzbDV-e.js} +1 -1
  152. package/web-app/dist/assets/{user-3Zez1WOK.js → user-Bks3-GYv.js} +1 -1
  153. package/web-app/dist/index.html +1 -1
  154. package/docs/ARCHITECTURE-OVERVIEW.md +0 -209
  155. package/docs/AUTONOMI-ECOSYSTEM.md +0 -107
  156. package/docs/COCKPIT-SPEC.md +0 -72
  157. package/docs/COCKPIT-UX-MANDATE.md +0 -53
  158. package/docs/COMPETITIVE-ANALYSIS.md +0 -303
  159. package/docs/COMPETITIVE-NEXT-10.md +0 -316
  160. package/docs/COMPETITIVE-RALPH-ZEROSHOT-2026-07-08.md +0 -81
  161. package/docs/DASHBOARD-9.12-EVIDENCE.md +0 -97
  162. package/docs/DASHBOARD-ARCHITECTURE.md +0 -425
  163. package/docs/DASHBOARD_V2_CHECKLIST.md +0 -243
  164. package/docs/DEMOS.md +0 -63
  165. package/docs/ENTERPRISE-IDENTITY-ROADMAP.md +0 -206
  166. package/docs/EVIDENCE-RECEIPT-BUILD-APPLICABILITY.md +0 -79
  167. package/docs/FEAT-PRDREUSE-DOCKER-PLAN.md +0 -144
  168. package/docs/GATE-FAILURE-TRIAGE.md +0 -254
  169. package/docs/HANDOFF-2026-08-03.md +0 -439
  170. package/docs/LOOP-CANDIDATE-PROPOSAL-v1.md +0 -167
  171. package/docs/LOOP-HARNESS-AUDIT.md +0 -684
  172. package/docs/MERGE-DEDUP-MAP.md +0 -420
  173. package/docs/MERGE-ROUTE-MAP.md +0 -139
  174. package/docs/MODEL-REGISTRY-PLAN.md +0 -155
  175. package/docs/OUTCOME-FRONTIER.md +0 -536
  176. package/docs/P2-SPEC-ROBUSTNESS-PLAN.md +0 -192
  177. package/docs/PLANS-INDEX.md +0 -32
  178. package/docs/PRD-REUSE-DONE-RECOGNITION-PLAN.md +0 -536
  179. package/docs/PROMPT-ABLATION-RESULT.md +0 -97
  180. package/docs/R4-TRUST-TRAJECTORY-DESIGN.md +0 -127
  181. package/docs/R5-AUTO-WIKI-DESIGN.md +0 -137
  182. package/docs/R6-ROLLBACK-CHECKPOINT-PLAN.md +0 -107
  183. package/docs/R7-ZERO-CONFIG-FIRST-RUN-PLAN.md +0 -137
  184. package/docs/R8-SHAREABLE-TEAM-ASSETS-PLAN.md +0 -129
  185. package/docs/R9-OPEN-CORE-HOOKS-PLAN.md +0 -113
  186. package/docs/RARV-C-100X-PLAN.md +0 -286
  187. package/docs/RARV-C-LOOP-EFFICIENCY-PLAN.md +0 -470
  188. package/docs/SHAREABLE-PROOF-PLAN.md +0 -194
  189. package/docs/SONNET5-DEFAULT-PLAN.md +0 -157
  190. package/docs/SPEED-AND-FIRST-PASS-PLAN.md +0 -281
  191. package/docs/STALE-STATE-AUDIT.md +0 -174
  192. package/docs/SYNERGY-TASKS.md +0 -143
  193. package/docs/TASKLIST-ACCURACY-PLAN.md +0 -355
  194. package/docs/TOP-100-BACKLOG.md +0 -159
  195. package/docs/V8-ACCEPTANCE-TRIAGE-2026-07-24.md +0 -114
  196. package/docs/V8-COMPLEXITY-AUDIT-2026-07-24.md +0 -45
  197. package/docs/V8-MAJOR-RELEASE-PLAN.md +0 -137
  198. package/docs/V8-OVERNIGHT-PLAN-2026-07-25.md +0 -82
  199. package/docs/V8-SDK-RESEARCH-RAW.md +0 -129
  200. package/docs/WELCOME-OPENER-PLAN.md +0 -106
  201. package/docs/adoption-baseline-2026-07-31.md +0 -84
  202. package/docs/architecture/bmad-integration-epic.md +0 -271
  203. package/docs/architecture/bmad-integration-review.md +0 -86
  204. package/docs/architecture/bmad-integration-validation.md +0 -249
  205. package/docs/architecture/bmad-loki-voice-agent-council-analysis.md +0 -61
  206. package/docs/auto-claude-comparison.md +0 -250
  207. package/docs/bug-fixes/agent-01-cli-fixes.md +0 -101
  208. package/docs/bug-fixes/agent-02-purplelab-fixes.md +0 -88
  209. package/docs/bug-fixes/agent-03-dashboard-fixes.md +0 -119
  210. package/docs/bug-fixes/agent-04-memory-fixes.md +0 -105
  211. package/docs/bug-fixes/agent-05-provider-fixes.md +0 -86
  212. package/docs/bug-fixes/agent-06-integration-fixes.md +0 -101
  213. package/docs/bug-fixes/agent-07-dash-run-fixes.md +0 -101
  214. package/docs/bug-fixes/agent-08-docker-fixes.md +0 -164
  215. package/docs/bug-fixes/agent-09-e2e-build-fixes.md +0 -69
  216. package/docs/bug-fixes/agent-10-e2e-fullstack-fixes.md +0 -102
  217. package/docs/bug-fixes/agent-11-e2e-session-fixes.md +0 -70
  218. package/docs/bug-fixes/agent-12-scenario-fixes.md +0 -120
  219. package/docs/bug-fixes/agent-13-enterprise-fixes.md +0 -143
  220. package/docs/bug-fixes/agent-14-uat-newuser-fixes.md +0 -88
  221. package/docs/bug-fixes/agent-15-uat-poweruser-fixes.md +0 -132
  222. package/docs/bug-fixes/agent-19-code-review.md +0 -316
  223. package/docs/bug-fixes/agent-20-architecture-review.md +0 -331
  224. package/docs/competitive/bolt-new-analysis.md +0 -579
  225. package/docs/competitive/emergence-others-analysis.md +0 -605
  226. package/docs/competitive/replit-lovable-analysis.md +0 -622
  227. package/docs/dashboard-guide.md +0 -487
  228. package/docs/enterprise/migration.md +0 -265
  229. package/docs/history/one-run-audit.md +0 -304
  230. package/docs/plans/FORGE-AUTONOMOUS-QUEUE.md +0 -312
  231. package/docs/plans/ULTRAPLAN-FORGE-BAAS.md +0 -612
  232. package/docs/plans/UT2-6-LSP-DIAGNOSTIC-BROADCAST.md +0 -394
  233. package/docs/prd-purple-lab-ide.md +0 -152
  234. package/docs/prd-purple-lab-platform-v2.md +0 -223
  235. package/docs/prd-purple-lab-platform.md +0 -319
  236. package/docs/retrospectives/v7.5.15-fleet-postmortem.md +0 -325
  237. package/docs/retrospectives/v7.5.15-honesty-audit.md +0 -136
  238. package/docs/retrospectives/v7.5.15-llm-failure-modes.md +0 -49
  239. package/docs/show-hn-post.md +0 -46
  240. package/docs/test-scenarios/enterprise-scenarios.md +0 -732
  241. package/docs/thick2thin.md +0 -173
  242. package/packages/control-plane/ui/dist/assets/index-DcBJXjCJ.js +0 -190
package/autonomy/loki CHANGED
@@ -1691,6 +1691,22 @@ _help_answer() {
1691
1691
  echo "and sets LOKI_NO_BROWSER=1."
1692
1692
  }
1693
1693
 
1694
+ # `loki help verify-pr`: a Bun-only command (loki-ts), so its help lives here.
1695
+ _help_verify_pr() {
1696
+ echo -e "${BOLD}loki verify-pr${NC} - Verify a PR against its linked issue (experimental, LOKI_VERIFY_PR=1)"
1697
+ echo ""
1698
+ echo "Usage: loki verify-pr <https://github.com/o/r/pull/N | o/r#N> [--out DIR]"
1699
+ echo ""
1700
+ echo "Derives a check from the PR's linked issue (Check: \`cmd\` or a loki-check fence)."
1701
+ echo "VERIFIED only if the check fails on the PR base, passes on its head, and the"
1702
+ echo "touched packages' suites pass. A PR with no linked issue, no check, a removed"
1703
+ echo "test or a non-discriminating check is NOT PROVEN. Writes verify-pr-result.json."
1704
+ echo "PR code runs only in the container sandbox (scripts/verify-pr-sandbox.sh); set"
1705
+ echo "LOKI_VPR_IMAGE to a locally present image."
1706
+ echo ""
1707
+ echo "Exit codes: 0 verified, 2 usage or sandbox blocked, 4 not proven."
1708
+ }
1709
+
1694
1710
  # Appended to `loki help verify`: the v10 DSSE export flag (docs/exit-codes.md).
1695
1711
  _help_verify_dsse() {
1696
1712
  echo ""
@@ -1763,6 +1779,7 @@ show_help() {
1763
1779
  echo " review [opts] Standalone code review with quality gates"
1764
1780
  echo " ultracode \"task\" Run a task as a native Claude Code Dynamic Workflow (opt-in, Claude-only)"
1765
1781
  echo " trust [cmd] Visible trust trajectory; 'trust detail' for metrics"
1782
+ echo " undo <run> [--plan] Plan or apply (LOKI_UNDO=1) an undo of a run; verifies the receipt"
1766
1783
  echo ""
1767
1784
  echo "Observe:"
1768
1785
  echo " dashboard [cmd] Operations UI server (start|stop|status|url|open)"
@@ -1798,13 +1815,9 @@ show_help() {
1798
1815
  echo ""
1799
1816
  echo "Options for 'start':"
1800
1817
  echo " --provider NAME AI provider: claude (default), codex, cline, aider, opencode"
1801
- echo " --parallel Enable parallel mode with git worktrees"
1802
- echo " --bg, --background Run in background mode"
1803
1818
  echo " --simple Force simple complexity tier (3 phases)"
1804
1819
  echo " --complex Force complex complexity tier (8 phases)"
1805
- echo " --github Enable GitHub issue import"
1806
1820
  echo " --no-dashboard Disable web dashboard"
1807
- echo " --sandbox Run in Docker sandbox for isolation (default: off; requires Docker)"
1808
1821
  echo " --isolation LVL Per-run isolation dial: none (default) | worktree | docker"
1809
1822
  echo " --skip-memory Skip loading memory context at startup"
1810
1823
  echo " --fresh-prd Regenerate the PRD from the codebase (no-PRD runs; ignores the reusable generated PRD)"
@@ -1824,8 +1837,6 @@ show_help() {
1824
1837
  echo " loki start ./prd.md # Start with PRD file"
1825
1838
  echo " loki start owner/repo#123 # GitHub issue (auto-fetches)"
1826
1839
  echo " loki start PROJ-456 # Jira issue"
1827
- echo " loki start --bg ./prd.md # Start in background"
1828
- echo " loki start --parallel ./prd.md # Parallel mode (git worktrees)"
1829
1840
  echo " loki quick \"add dark mode\" # Single-task mode (Loki 10 engine)"
1830
1841
  echo " loki tour # See a real sample result (no provider, no key, no spend)"
1831
1842
  echo " loki demo # Build a sample todo app end to end"
@@ -1860,7 +1871,7 @@ show_help() {
1860
1871
  echo " # only the OpenAI-shaped /v1/chat/completions. Use the aider or"
1861
1872
  echo " # cline route above for OpenRouter."
1862
1873
  echo ""
1863
- echo " # Cross-project context (Phase F v7.5.23+)"
1874
+ echo " # Cross-project context (Phase F)"
1864
1875
  echo " # Drop .loki/app.json with {schema_version:1,app_id:myapp,members:[ui,api]}"
1865
1876
  echo " # at the parent of related repos for shared CLAUDE.md + memory."
1866
1877
  echo ""
@@ -1871,7 +1882,7 @@ show_help() {
1871
1882
  echo ""
1872
1883
  echo " # Config + dashboard"
1873
1884
  echo " loki config set maxTier sonnet # Cap model cost"
1874
- echo " loki dashboard start # Web dashboard at localhost:57374"
1885
+ echo " loki dashboard start # Open the Control Plane UI"
1875
1886
  echo " loki watch # Auto-rerun on PRD changes"
1876
1887
  echo " loki cockpit # Live multi-repo cockpit (terminal image)"
1877
1888
  echo " loki remote # Remote session (phone/browser)"
@@ -1898,13 +1909,13 @@ show_help() {
1898
1909
  echo " merge resume review rollback run sandbox secrets secure self-update sentrux"
1899
1910
  echo " serve setup-skill share ship spec start state stats status steer stop"
1900
1911
  echo " syslog telemetry template test tour trigger trust trust-metrics"
1901
- echo " ultracode update verify version voice watch watchdog web welcome why"
1912
+ echo " ultracode undo update verify version voice watch watchdog web welcome why"
1902
1913
  echo " wiki workspace worktree (wt)"
1903
1914
  echo " control"
1904
1915
  echo ""
1905
1916
  echo "Any command: loki <command> --help"
1906
1917
  echo ""
1907
- echo "Phase A-J features (v7.5.18 - v7.5.28) are default-on. See CHANGELOG."
1918
+ echo "Phase A-J features are default-on. See CHANGELOG."
1908
1919
  echo ""
1909
1920
  echo "Environment variables an operator would set: docs/environment-variables.md"
1910
1921
  echo "Cost controls (budget, iteration and wall-clock caps): docs/cost-controls.md"
@@ -2534,7 +2545,7 @@ cmd_start() {
2534
2545
  while [[ $# -gt 0 ]]; do
2535
2546
  case "$1" in
2536
2547
  --help|-h)
2537
- echo -e "${BOLD}loki start${NC} - Unified entry point for Loki Mode (v6.84.0)"
2548
+ echo -e "${BOLD}loki start${NC} - Unified entry point for Loki Mode"
2538
2549
  echo ""
2539
2550
  echo "Usage: loki start [REPO|PRD|ISSUE-REF] [options]"
2540
2551
  echo ""
@@ -2563,17 +2574,15 @@ cmd_start() {
2563
2574
  echo " Token from LOKI_REMOTE_TOKEN / LOKI_REMOTE_TOKEN_FILE"
2564
2575
  echo " (never an argument). Env: LOKI_REMOTE_URL."
2565
2576
  echo " --provider NAME AI provider: claude (default), codex, cline, aider, opencode"
2566
- echo " --parallel Enable parallel mode with git worktrees"
2567
2577
  echo " --allow-haiku Enable Haiku model for the fast tier (default: disabled)"
2568
- echo " --bg, --background Run in background mode"
2569
2578
  echo " --simple Force simple complexity tier (3 phases)"
2570
2579
  echo " --complex Force complex complexity tier (8 phases)"
2571
- echo " --github Enable GitHub issue import"
2572
2580
  echo " --no-dashboard Disable web dashboard"
2573
2581
  echo " --api Start dashboard API server alongside the build"
2574
- echo " --sandbox Run in Docker sandbox (default: off; requires Docker)"
2575
2582
  echo " --isolation LEVEL Per-run isolation: none (default) | worktree | docker."
2576
- echo " Unified dial; --parallel = worktree, --sandbox = docker."
2583
+ echo " Unified dial."
2584
+ echo " --attempts N Run N (1-5, default 1) independent attempts in separate git worktrees;"
2585
+ echo " the most executed passing checks wins, losers are recorded on the receipt"
2577
2586
  echo " --skip-memory Skip loading memory context at startup"
2578
2587
  echo " --fresh-prd Regenerate the PRD from the codebase on a no-PRD run"
2579
2588
  echo " (ignores the reusable generated PRD; aliases: --regen-prd,"
@@ -2606,7 +2615,6 @@ cmd_start() {
2606
2615
  echo " --worktree, -w Git worktree isolation (separate branch)"
2607
2616
  echo " --pr Worktree + auto-create PR"
2608
2617
  echo " --ship Worktree + PR + auto-merge"
2609
- echo " --detach, -d Run in background"
2610
2618
  echo ""
2611
2619
  echo "Preview without spending (any input mode):"
2612
2620
  echo " loki plan <PRD> Analyze a spec WITHOUT executing: complexity,"
@@ -2635,7 +2643,6 @@ cmd_start() {
2635
2643
  echo " loki start 123 # ISSUE mode (current repo GitHub issue)"
2636
2644
  echo " loki start PROJ-456 # ISSUE mode (Jira)"
2637
2645
  echo " loki start owner/repo#789 # ISSUE mode (GitHub specific repo)"
2638
- echo " loki start --prd ./prd.md --parallel # Explicit PRD, parallel mode"
2639
2646
  echo " loki start --issue 123 --ship # Explicit issue, full automation"
2640
2647
  echo " loki start --provider codex # Use OpenAI Codex CLI"
2641
2648
  echo " loki start --bmad-project ./my-project # Start from BMAD artifacts"
@@ -2728,6 +2735,17 @@ cmd_start() {
2728
2735
  args+=("--parallel")
2729
2736
  shift
2730
2737
  ;;
2738
+ --attempts)
2739
+ # 11.3.0 T5: N>=2 is routed to the Bun route by bin/loki; N=1 is today's behavior.
2740
+ if [[ "${2:-}" != "1" ]]; then
2741
+ echo -e "${RED}--attempts N (2-5) needs the Bun route: run via bin/loki${NC}"
2742
+ exit 1
2743
+ fi
2744
+ shift 2
2745
+ ;;
2746
+ --attempts=1)
2747
+ shift
2748
+ ;;
2731
2749
  --allow-haiku)
2732
2750
  # Enable Haiku for the fast tier. Mirrors the LOKI_ALLOW_HAIKU=true
2733
2751
  # env var (consumed by providers/claude.sh and run.sh). Documented in
@@ -4232,7 +4250,7 @@ cmd_stop() {
4232
4250
  while [[ $# -gt 0 ]]; do
4233
4251
  case "$1" in
4234
4252
  --help|-h)
4235
- echo -e "${BOLD}loki stop${NC} - Stop running sessions (v7.7.30)"
4253
+ echo -e "${BOLD}loki stop${NC} - Stop running sessions"
4236
4254
  echo ""
4237
4255
  echo "Usage: loki stop [session-id] [--all]"
4238
4256
  echo ""
@@ -6411,22 +6429,35 @@ except Exception:
6411
6429
  fi
6412
6430
  fi
6413
6431
 
6414
- # v7.82: completion-aware one-liner. When a finished run left a completion
6415
- # record, show its outcome and point at \`loki why\` for the full story. Reads
6416
- # the persisted completion.json (no recompute); silent when absent.
6417
- if [ -f "$LOKI_DIR/state/completion.json" ]; then
6418
- local last_outcome
6419
- last_outcome=$(_LOKI_CJ="$LOKI_DIR/state/completion.json" python3 -c "
6420
- import json, os
6432
+ # 133-F4: newest sealed receipt's verdict, read from the receipt field only
6433
+ # (never recomputed). Missing, empty or unparseable receipts never read as
6434
+ # VERIFIED. This replaces the old completion.json one-liner (Bun never had it).
6435
+ local receipt_line
6436
+ receipt_line=$(_LOKI_RUNS="$LOKI_DIR/runs" python3 -c "
6437
+ import json, os, re
6438
+ runs = os.environ['_LOKI_RUNS']
6421
6439
  try:
6422
- d = json.load(open(os.environ['_LOKI_CJ']))
6423
- print(d.get('outcome', '') or '')
6440
+ ids = sorted(d for d in os.listdir(runs) if os.path.isdir(os.path.join(runs, d)))
6424
6441
  except Exception:
6425
- print('')" 2>/dev/null)
6426
- if [ -n "$last_outcome" ]; then
6427
- echo -e "${DIM}Last run: ${last_outcome} - run 'loki why' for details${NC}"
6428
- fi
6429
- fi
6442
+ ids = []
6443
+ if not ids:
6444
+ print('Last run: no receipt (verdict NOT AVAILABLE)')
6445
+ else:
6446
+ try:
6447
+ d = json.load(open(os.path.join(runs, ids[-1], 'receipt.json')))
6448
+ v = d['verdict']
6449
+ h = d['receipt_sha256']
6450
+ if not (isinstance(v, str) and re.fullmatch(r'[A-Z_]+', v) and isinstance(h, str)):
6451
+ raise ValueError
6452
+ h = h[7:] if h.startswith('sha256:') else h
6453
+ if not re.fullmatch(r'[0-9a-f]{12,}', h):
6454
+ raise ValueError
6455
+ print('Last run: %s (receipt sha256:%s)' % (v, h[:12]))
6456
+ except Exception:
6457
+ print('Last run: receipt unreadable')
6458
+ " 2>/dev/null)
6459
+ [ -n "$receipt_line" ] || receipt_line="Last run: receipt unreadable"
6460
+ echo -e "${DIM}${receipt_line}${NC}"
6430
6461
 
6431
6462
  echo ""
6432
6463
  echo -e "${DIM} Tip: loki analyze context show - detailed token breakdown${NC}"
@@ -7085,7 +7116,7 @@ cmd_provider() {
7085
7116
  echo " info Show provider details"
7086
7117
  echo " models Show resolved model configuration for all providers"
7087
7118
  echo ""
7088
- echo "Precedence (v7.7.2 -- highest wins):"
7119
+ echo "Precedence (highest wins):"
7089
7120
  echo " 1. loki start --provider NAME CLI flag (per-invocation)"
7090
7121
  echo " 2. .loki/state/provider saved value (per-project)"
7091
7122
  echo " 3. LOKI_PROVIDER env var shell session default"
@@ -7591,13 +7622,14 @@ cmd_dashboard_help() {
7591
7622
  echo ""
7592
7623
  echo "Usage: loki dashboard <command> [options]"
7593
7624
  echo ""
7594
- echo "Note: 'loki dashboard' is the operations/observability UI (port ${DASHBOARD_DEFAULT_PORT})."
7595
- echo " It is NOT the same as 'loki web' (Purple Lab, port ${PURPLE_LAB_DEFAULT_PORT}, deprecated v7.44.0)."
7596
- echo " Use 'loki dashboard' to monitor agents, tasks, costs, council, escalations,"
7597
- echo " and to submit a PRD via the embedded 'Lab' tab (replaces the deprecated 'loki web')."
7625
+ echo "'loki dashboard', 'loki dashboard start' and 'loki dashboard open' open the Control Plane,"
7626
+ echo "the browser UI for runs, cost, receipts and events (default port 47821; override with"
7627
+ echo "LOKI_CONTROL_PORT). Needs bun; see 'loki control --help'."
7628
+ echo "The commands below manage the classic dashboard server, which serves the API only."
7629
+ echo "Setting LOKI_LEGACY_DASHBOARD=1, or passing --host, --tls-cert or --tls-key, selects it."
7598
7630
  echo ""
7599
7631
  echo "Commands:"
7600
- echo " start Start the dashboard server"
7632
+ echo " start Open the Control Plane (or start the classic API server with the flags below)"
7601
7633
  echo " stop Stop the dashboard server"
7602
7634
  echo " status Show server status and URL"
7603
7635
  echo " url Get the dashboard URL"
@@ -7605,7 +7637,7 @@ cmd_dashboard_help() {
7605
7637
  echo " help Show this help"
7606
7638
  echo ""
7607
7639
  echo "Options for 'start':"
7608
- echo " --port PORT Port to listen on (default: $DASHBOARD_DEFAULT_PORT)"
7640
+ echo " --port PORT Port for the classic API server (default: see LOKI_DASHBOARD_PORT)"
7609
7641
  echo " --host HOST Host to bind to (default: $DASHBOARD_DEFAULT_HOST)"
7610
7642
  echo " --tls-cert PATH Path to PEM certificate (enables HTTPS)"
7611
7643
  echo " --tls-key PATH Path to PEM private key (enables HTTPS)"
@@ -7614,7 +7646,7 @@ cmd_dashboard_help() {
7614
7646
  echo " --format FMT Output format: text (default) or json"
7615
7647
  echo ""
7616
7648
  echo "Environment:"
7617
- echo " LOKI_DASHBOARD_PORT Default port (overrides $DASHBOARD_DEFAULT_PORT)"
7649
+ echo " LOKI_DASHBOARD_PORT Port for the classic API server"
7618
7650
  echo " LOKI_DASHBOARD_HOST Default host (overrides $DASHBOARD_DEFAULT_HOST)"
7619
7651
  echo " LOKI_TLS_CERT Path to PEM certificate (enables HTTPS)"
7620
7652
  echo " LOKI_TLS_KEY Path to PEM private key (enables HTTPS)"
@@ -7625,7 +7657,7 @@ cmd_dashboard_help() {
7625
7657
  echo " loki dashboard start --tls-cert cert.pem --tls-key key.pem"
7626
7658
  echo " loki dashboard status # Check if running"
7627
7659
  echo " loki dashboard url --format json # Get URL as JSON"
7628
- echo " loki dashboard open # Print the Control Plane hint (no browser)"
7660
+ echo " loki dashboard open # Open the Control Plane"
7629
7661
  echo " loki dashboard stop # Stop server"
7630
7662
  }
7631
7663
 
@@ -8409,39 +8441,29 @@ cmd_web_redirect_to_dashboard() {
8409
8441
  }
8410
8442
 
8411
8443
  cmd_web_help() {
8412
- echo -e "${BOLD}Purple Lab -- Loki Mode Web UI (deprecated -- use the dashboard)${NC}"
8444
+ echo -e "${BOLD}loki web${NC} - Deprecated alias for the Control Plane"
8413
8445
  echo ""
8414
8446
  echo "Usage: loki web [command] [options]"
8415
8447
  echo ""
8416
- echo "DEPRECATED as of v7.44.0: Purple Lab is consolidated into the dashboard."
8417
- echo " 'loki web' (no subcommand) now LAUNCHES THE DASHBOARD"
8418
- echo " (http://localhost:${DASHBOARD_DEFAULT_PORT}) instead of the deprecated Purple"
8419
- echo " Lab, so the obvious command lands you on the working UI. Use the embedded"
8420
- echo " 'Lab' tab there to submit a PRD. For the hosted platform, see Autonomi Cloud."
8421
- echo ""
8422
- echo "Note: the canonical command is 'loki dashboard' (operations UI, port ${DASHBOARD_DEFAULT_PORT})."
8423
- echo " Use it to monitor running agents, tasks, costs, council, escalations."
8448
+ echo "The standalone web UI was folded into the Control Plane. 'loki web' with no"
8449
+ echo "subcommand launches the Control Plane (default port 47821, override with"
8450
+ echo "LOKI_CONTROL_PORT). The canonical command is 'loki dashboard'."
8424
8451
  echo ""
8425
8452
  echo "Commands:"
8426
- echo " start Launch the dashboard (default; Purple Lab is deprecated)"
8427
- echo " stop Stop the Purple Lab server (if one was started the old way)"
8428
- echo " status Show Purple Lab server status"
8429
- echo " logs Show Purple Lab server logs"
8453
+ echo " start Launch the Control Plane (default)"
8454
+ echo " stop Stop a standalone web server started the old way"
8455
+ echo " status Show standalone web server status"
8456
+ echo " logs Show standalone web server logs"
8430
8457
  echo " help Show this help"
8431
8458
  echo ""
8432
8459
  echo "Options (for start):"
8433
- echo " --port PORT Use custom port (default: ${DASHBOARD_DEFAULT_PORT})"
8434
- echo " --no-open Accepted for back-compat; ignored (no-op on the dashboard)"
8460
+ echo " --port PORT Use custom port"
8461
+ echo " --no-open Accepted for back-compat; ignored (no-op)"
8435
8462
  echo ""
8436
8463
  echo "Examples:"
8437
- echo " loki web Launch the dashboard"
8438
- echo " loki web --no-open Launch the dashboard (--no-open is a no-op)"
8439
- echo " loki web stop Stop a Purple Lab server started the old way"
8440
- echo ""
8441
- echo "Note (since v7.5.30):"
8442
- echo " The same PRD-input UI is embedded in the dashboard as a 'Lab' sidebar entry."
8443
- echo " 'loki web stop|status|logs' still operate on a standalone Purple Lab"
8444
- echo " process so anyone who started one the old way is never stranded."
8464
+ echo " loki web Launch the Control Plane"
8465
+ echo " loki web --no-open Same (--no-open is a no-op)"
8466
+ echo " loki web stop Stop a standalone web server started the old way"
8445
8467
  }
8446
8468
 
8447
8469
  cmd_web_start() {
@@ -11836,7 +11858,7 @@ cmd_watch() {
11836
11858
  while [[ $# -gt 0 ]]; do
11837
11859
  case "$1" in
11838
11860
  --help|-h)
11839
- echo -e "${BOLD}loki watch${NC} - Auto-rerun on PRD file changes (v6.33.0)"
11861
+ echo -e "${BOLD}loki watch${NC} - Auto-rerun on PRD file changes"
11840
11862
  echo ""
11841
11863
  echo "Usage: loki watch [prd-path] [options]"
11842
11864
  echo ""
@@ -12134,7 +12156,7 @@ cmd_cockpit() {
12134
12156
  while [[ $# -gt 0 ]]; do
12135
12157
  case "$1" in
12136
12158
  --help|-h)
12137
- echo -e "${BOLD}loki cockpit${NC} - Live multi-repo status as a terminal inline image (v7.128.0)"
12159
+ echo -e "${BOLD}loki cockpit${NC} - Live multi-repo status as a terminal inline image"
12138
12160
  echo ""
12139
12161
  echo "Usage: loki cockpit [options]"
12140
12162
  echo ""
@@ -12380,7 +12402,7 @@ cmd_export() {
12380
12402
 
12381
12403
  case "$format" in
12382
12404
  --help|-h)
12383
- echo -e "${BOLD}loki export${NC} - Export session data (v6.0.0)"
12405
+ echo -e "${BOLD}loki export${NC} - Export session data"
12384
12406
  echo ""
12385
12407
  echo "Usage: loki export <format> [output-path]"
12386
12408
  echo ""
@@ -12390,6 +12412,9 @@ cmd_export() {
12390
12412
  echo " csv Task queue as CSV"
12391
12413
  echo " timeline Iteration timeline as JSON"
12392
12414
  echo ""
12415
+ echo "Flags:"
12416
+ echo " --sarif [run-id] Write .loki/runs/<id>/findings.sarif (SARIF 2.1.0; needs bun)"
12417
+ echo ""
12393
12418
  echo "Examples:"
12394
12419
  echo " loki export json # Print to stdout"
12395
12420
  echo " loki export json session-export.json # Save to file"
@@ -12412,6 +12437,10 @@ cmd_export() {
12412
12437
  require_jq || return 1
12413
12438
  _export_timeline "$output_path"
12414
12439
  ;;
12440
+ --sarif)
12441
+ echo -e "${RED}loki export --sarif needs bun (https://bun.sh).${NC}" >&2
12442
+ return 1
12443
+ ;;
12415
12444
  *)
12416
12445
  echo -e "${RED}Unknown format: $format${NC}"
12417
12446
  echo "Supported: json, markdown, csv, timeline"
@@ -12936,7 +12965,7 @@ cmd_config() {
12936
12965
  echo " schema Print the key -> env-var mapping table"
12937
12966
  echo " validate [FILE] Validate loki.yaml (no FILE: repo root, then ~/.loki) or a --config file"
12938
12967
  echo ""
12939
- echo "Settable keys (v6.0.0):"
12968
+ echo "Settable keys:"
12940
12969
  echo " maxTier Cost ceiling: opus, sonnet, haiku (default: opus)"
12941
12970
  echo " model.planning Model for planning tier"
12942
12971
  echo " model.development Model for development tier"
@@ -13291,7 +13320,7 @@ cmd_config_show() {
13291
13320
  echo " max_iterations: ${LOKI_MAX_ITERATIONS:-1000}"
13292
13321
  echo " autonomy_mode: ${LOKI_AUTONOMY_MODE:-perpetual}"
13293
13322
  echo ""
13294
- echo "v6.0.0 Settings:"
13323
+ echo "Settings:"
13295
13324
  echo " maxTier: ${LOKI_MAX_TIER:-(unlimited)}"
13296
13325
  echo " blind_validation: ${LOKI_BLIND_VALIDATION:-true}"
13297
13326
  echo " adversarial_testing: ${LOKI_ADVERSARIAL_TESTING:-true}"
@@ -14396,7 +14425,7 @@ cmd_logs() {
14396
14425
  # Resolve the log the runner ACTUALLY writes.
14397
14426
  #
14398
14427
  # This read a logs/session.log path that nothing in the tree writes (other
14399
- # readers of it exist in web-app/ and api-examples/, all equally dead). So
14428
+ # readers of it exist in web-app/ and examples/api/, all equally dead). So
14400
14429
  # `loki logs`, the
14401
14430
  # most natural "what is it doing?" command, reported "No log file found"
14402
14431
  # while the real logs sat in that same directory. run.sh:22409 writes
@@ -14585,7 +14614,7 @@ cmd_api() {
14585
14614
  echo " status Check if dashboard server is running"
14586
14615
  echo ""
14587
14616
  echo "Environment:"
14588
- echo " LOKI_DASHBOARD_PORT Port to listen on (default: 57374)"
14617
+ echo " LOKI_DASHBOARD_PORT Port for the API server"
14589
14618
  echo ""
14590
14619
  echo "Endpoints:"
14591
14620
  echo " GET /api/health - Health check"
@@ -17957,7 +17986,7 @@ cmd_mcp() {
17957
17986
  }
17958
17987
 
17959
17988
  cmd_heal_help() {
17960
- echo -e "${BOLD}loki heal${NC} - Legacy system healing (v6.67.0)"
17989
+ echo -e "${BOLD}loki heal${NC} - Legacy system healing"
17961
17990
  echo ""
17962
17991
  echo "Heal legacy codebases by understanding their real behaviors -- the quirks,"
17963
17992
  echo "delays, error states, and invisible dependencies -- then modernizing"
@@ -18992,7 +19021,7 @@ cmd_cluster() {
18992
19021
 
18993
19022
  case "$subcmd" in
18994
19023
  --help|-h|help)
18995
- echo -e "${BOLD}loki cluster${NC} - Custom workflow templates (v6.3.0)"
19024
+ echo -e "${BOLD}loki cluster${NC} - Custom workflow templates"
18996
19025
  echo ""
18997
19026
  echo "Usage: loki cluster <command> [options]"
18998
19027
  echo ""
@@ -19710,7 +19739,7 @@ with open(failover_file, 'w') as f: json.dump(d, f, indent=2)
19710
19739
  shift
19711
19740
  ;;
19712
19741
  --help|-h)
19713
- echo -e "${BOLD}loki failover${NC} - Cross-provider auto-failover management (v6.19.0)"
19742
+ echo -e "${BOLD}loki failover${NC} - Cross-provider auto-failover management"
19714
19743
  echo ""
19715
19744
  echo "Usage: loki failover [options]"
19716
19745
  echo ""
@@ -19949,7 +19978,7 @@ def _resolve_session_pin(alias):
19949
19978
  # fable unavailable, collapse to opus. Claude Fable 5 is not available at
19950
19979
  # the Claude API (advises use Opus 4.8); the runner dispatches opus for a
19951
19980
  # fable pin (claude.sh resolve_model_for_tier, run.sh dispatch backstop).
19952
- # Quote opus pricing (\$5/\$25) so the estimator agrees with dispatch and
19981
+ # Quote opus pricing (\$4/\$20) so the estimator agrees with dispatch and
19953
19982
  # the dashboard (v7.39.1).
19954
19983
  _m = 'opus'
19955
19984
  else: # development (and the '*' fallthrough)
@@ -20279,22 +20308,23 @@ tokens_per_tier = {
20279
20308
  'fast': {'input': 30000, 'output': 5000, 'model': 'Haiku'},
20280
20309
  }
20281
20310
 
20282
- # Pricing per 1M tokens. Fable 5 is the top-tier advisory model at exactly 2x
20283
- # Opus per token (published \$10/\$50 in/out vs Opus \$5/\$25). The Opus row was
20284
- # corrected from a stale \$15/\$75 to the real Opus 4.8 \$5/\$25, and the Haiku
20285
- # row from a stale \$0.25/\$1.25 (Haiku 3.5) to the published Claude Haiku 4.5
20286
- # price of \$1/\$5 (anthropic.com/news/claude-haiku-4-5), so all four rows now
20311
+ # Pricing per 1M tokens. Fable 5 is the top-tier advisory model at 2.5x
20312
+ # Opus per token (published \$10/\$50 in/out vs Opus 5.5 \$4/\$20). The Opus row was
20313
+ # corrected to the published Opus 5.5 \$4/\$20 (platform.claude.com pricing, 2026-10-08), and the Haiku
20314
+ # row from a stale \$0.25/\$1.25 (Haiku 3.5) to Haiku 5.5 \$0.10/\$0.50 (the haiku alias target
20315
+ # in the model catalog, up to 100K prompt tokens), so all four rows now
20287
20316
  # match the three canonical model-keyed tables (run.sh pricing.json, run.sh
20288
20317
  # check_budget_limit, dashboard _DEFAULT_PRICING). The Fable row (\$10/\$50) is
20289
20318
  # kept as the reference price, but since v7.39.1 fable is unavailable at the API
20290
20319
  # and a fable pin RESOLVES to Opus everywhere -- so a fable-pinned run both
20291
- # dispatches AND quotes Opus (\$5/\$25), matching the runner. The Fable price row
20320
+ # dispatches AND quotes Opus (\$4/\$20), matching the runner. The Fable price row
20292
20321
  # is only reachable as an explicit advisory reference, not via a session pin.
20293
20322
  pricing = {
20294
20323
  'Fable': {'input': 10.00, 'output': 50.00},
20295
- 'Opus': {'input': 5.00, 'output': 25.00},
20324
+ 'Opus': {'input': 4.00, 'output': 20.00},
20296
20325
  'Sonnet': {'input': 2.00, 'output': 10.00},
20297
- 'Haiku': {'input': 1.00, 'output': 5.00},
20326
+ # Haiku = Haiku 5.5 up to 100K prompt tokens (alias target in the model catalog)
20327
+ 'Haiku': {'input': 0.10, 'output': 0.50},
20298
20328
  }
20299
20329
 
20300
20330
  # Build per-iteration plan
@@ -20888,6 +20918,23 @@ main() {
20888
20918
  # (CLI > config). The pre-pass SCANS without consuming; the per-command
20889
20919
  # loops carry consume-and-ignore arms for the three aliases. Gated to
20890
20920
  # start/run/quick so status/config/stop never trigger a config load.
20921
+ # T5-D2 (FC-38 sweep): the bash entries have no attempts engine. --attempts (any value) is refused
20922
+ # here, before cmd_start / cmd_run / cmd_quick / cmd_demo can reach the legacy loop. bin/loki sends
20923
+ # `start --attempts N` to the Bun start command and never gets here with it.
20924
+ case "$command" in
20925
+ start|run|quick|demo|tour)
20926
+ local _att_a
20927
+ for _att_a in "$@"; do
20928
+ case "$_att_a" in
20929
+ --attempts|--attempts=*)
20930
+ echo -e "${RED}--attempts is only supported by 'loki start --attempts N --no-pr' (the Loki 10 engine); 'loki $command' would run the removed legacy loop.${NC}" >&2
20931
+ exit 2
20932
+ ;;
20933
+ esac
20934
+ done
20935
+ ;;
20936
+ esac
20937
+
20891
20938
  case "$command" in
20892
20939
  start|run|quick)
20893
20940
  if declare -f loki_maybe_apply_config_file >/dev/null 2>&1; then
@@ -21017,13 +21064,13 @@ main() {
21017
21064
  echo "Usage: loki serve [options]"
21018
21065
  echo ""
21019
21066
  echo "Alias for 'loki api start'. Starts the dashboard HTTP API"
21020
- echo "server (FastAPI, port 57374 by default)."
21067
+ echo "server (FastAPI)."
21021
21068
  echo ""
21022
21069
  echo "For the UI, run 'loki' (opens the Control Plane) or 'loki control serve'."
21023
21070
  echo ""
21024
21071
  echo "Options:"
21025
21072
  echo " --host HOST Bind host (default: 127.0.0.1)"
21026
- echo " --port PORT Bind port (default: 57374)"
21073
+ echo " --port PORT Bind port (default: LOKI_DASHBOARD_PORT)"
21027
21074
  echo " --help, -h Show this help and exit"
21028
21075
  echo ""
21029
21076
  echo "Side effects: starts a long-running HTTP server bound to a TCP port."
@@ -21179,6 +21226,11 @@ main() {
21179
21226
  mcp)
21180
21227
  cmd_mcp "$@"
21181
21228
  ;;
21229
+ undo)
21230
+ # UNDO-1: Bun-only (verifies the receipt with the Bun verifier); bin/loki routes here only when bun is absent.
21231
+ echo "loki undo needs the Bun runtime (install bun, then re-run: loki undo <run-id> --plan)" >&2
21232
+ exit 2
21233
+ ;;
21182
21234
  acp)
21183
21235
  # ACP agent over stdio; stdout is protocol-only. See docs/acp-editors.md.
21184
21236
  LOKI_ACP_LOKI="${LOKI_ACP_LOKI:-$_LOKI_SCRIPT_DIR/loki}" exec python3 "$_LOKI_SCRIPT_DIR/acp-agent.py"
@@ -21391,6 +21443,8 @@ main() {
21391
21443
  show_help
21392
21444
  elif [ "$_help_target" = "answer" ]; then
21393
21445
  _help_answer
21446
+ elif [ "$_help_target" = "verify-pr" ]; then
21447
+ _help_verify_pr
21394
21448
  else
21395
21449
  LOKI_HELP_ONLY=1 "$0" "$_help_target" --help "$@"
21396
21450
  local _help_rc=$?
@@ -22449,7 +22503,7 @@ MERGE_VALIDATE_PY
22449
22503
  ;;
22450
22504
 
22451
22505
  --help|-h|help)
22452
- echo -e "${BOLD}loki worktree${NC} - Manage parallel worktrees (v6.7.0)"
22506
+ echo -e "${BOLD}loki worktree${NC} - Manage parallel worktrees"
22453
22507
  echo ""
22454
22508
  echo "Usage: loki worktree <command>"
22455
22509
  echo ""
@@ -22475,7 +22529,7 @@ cmd_state() {
22475
22529
 
22476
22530
  case "$subcmd" in
22477
22531
  --help|-h|help)
22478
- echo -e "${BOLD}loki state${NC} - Query the SQLite state layer (v6.3.0)"
22532
+ echo -e "${BOLD}loki state${NC} - Query the SQLite state layer"
22479
22533
  echo ""
22480
22534
  echo "Usage: loki state <command> [options]"
22481
22535
  echo ""
@@ -24356,7 +24410,7 @@ except Exception as e:
24356
24410
  echo " skill [name] Show skill by name or list all skills"
24357
24411
  echo " vectors [rebuild] Show vector index stats or rebuild indices"
24358
24412
  echo ""
24359
- echo "Namespace Commands (v5.19.0):"
24413
+ echo "Namespace Commands:"
24360
24414
  echo " namespace detect Auto-detect namespace from current directory"
24361
24415
  echo " namespace list List all available namespaces"
24362
24416
  echo " namespace create NAME Create a new namespace"
@@ -24384,14 +24438,14 @@ except Exception as e:
24384
24438
  echo " loki memory vectors"
24385
24439
  echo " loki memory vectors rebuild"
24386
24440
  echo ""
24387
- echo " loki memory ingest --from-claude-transcript <path> # v7.7.18"
24388
- echo " loki memory ingest --from-stdin # v7.7.18"
24389
- echo " loki memory replay <episode-id> [--json] # v7.7.22"
24390
- echo " loki memory crossproject --for 'build api' # v7.7.20"
24391
- echo " loki memory graph --export graph.json # v7.7.20"
24392
- echo " loki memory graph rebuild # v7.7.20"
24393
- echo " loki memory enable-hook # v7.7.20"
24394
- echo " loki memory disable-hook # v7.7.20"
24441
+ echo " loki memory ingest --from-claude-transcript <path>"
24442
+ echo " loki memory ingest --from-stdin"
24443
+ echo " loki memory replay <episode-id> [--json]"
24444
+ echo " loki memory crossproject --for 'build api'"
24445
+ echo " loki memory graph --export graph.json"
24446
+ echo " loki memory graph rebuild"
24447
+ echo " loki memory enable-hook"
24448
+ echo " loki memory disable-hook"
24395
24449
  echo ""
24396
24450
  echo " loki memory namespace detect"
24397
24451
  echo " loki memory namespace list"
@@ -27166,15 +27220,17 @@ TELEM_DISABLE_PY
27166
27220
  echo " status Show OTEL config + collection state + pending crash reports"
27167
27221
  echo " enable [endpoint] Enable OTEL (default: http://localhost:4318)"
27168
27222
  echo " disable Disable OTEL for current project"
27169
- echo " on Opt in to anonymous diagnostics (off by default)"
27223
+ echo " on Opt in explicitly to anonymous diagnostics"
27170
27224
  echo " off Opt out of all anonymous diagnostics (telemetry + crash)"
27171
27225
  echo " start Alias for 'on' (persistent opt-in across all sessions)"
27172
27226
  echo " stop Alias for 'off' (persistent opt-out across all sessions)"
27173
27227
  echo " analytics on|off|status"
27174
27228
  echo " Opt in/out of build-outcome analytics (off by default)"
27175
27229
  echo ""
27176
- echo "Anonymous diagnostics are OFF by default. Nothing is collected or"
27177
- echo "sent unless you opt in. See docs/PRIVACY.md for the full disclosure."
27230
+ echo "Anonymous diagnostics are ON by default for individual interactive installs,"
27231
+ echo "and OFF in CI, enterprise, air-gapped and non-interactive contexts. An opt-out"
27232
+ echo "(loki telemetry off, LOKI_TELEMETRY=off or DO_NOT_TRACK=1) always wins."
27233
+ echo "See docs/PRIVACY.md for the full disclosure."
27178
27234
  echo ""
27179
27235
  ;;
27180
27236
  *)
@@ -29829,7 +29885,7 @@ PYEOF
29829
29885
  ;;
29830
29886
 
29831
29887
  --help|-h|help)
29832
- echo -e "${BOLD}loki agent${NC} - Agent type dispatch (v6.7.0)"
29888
+ echo -e "${BOLD}loki agent${NC} - Agent type dispatch"
29833
29889
  echo ""
29834
29890
  echo "Usage: loki agent <command> [args]"
29835
29891
  echo ""
@@ -30140,7 +30196,7 @@ except: pass
30140
30196
 
30141
30197
  # Detect shell scripts
30142
30198
  local shell_count=0
30143
- shell_count=$(find "$target_path" -maxdepth 2 -name "*.sh" -type f 2>/dev/null | wc -l | tr -d ' ')
30199
+ shell_count=$(find "$target_path" -maxdepth 2 -name "*.sh" -type f 2>/dev/null | wc -l | tr -d ' ' || true)
30144
30200
  if [ "$shell_count" -gt 0 ]; then
30145
30201
  languages="$languages Bash"
30146
30202
  fi
@@ -30578,7 +30634,7 @@ Files: $src_count source, $test_count test, $doc_count docs"
30578
30634
  if [ -d "$target_path/$dir" ]; then
30579
30635
  # Count files in directory
30580
30636
  local dir_count
30581
- dir_count=$(echo "$tree_output" | grep "^${dir}/" | wc -l | tr -d ' ')
30637
+ dir_count=$(echo "$tree_output" | grep "^${dir}/" | wc -l | tr -d ' ' || true)
30582
30638
  output="$output
30583
30639
  $dir/ ($dir_count files)"
30584
30640
  else
@@ -31506,7 +31562,7 @@ _docs_invoke_provider() {
31506
31562
  # not the workload that needs the top tier. Pinned to the same
31507
31563
  # default the review subcall uses (run.sh:13762), and overridable
31508
31564
  # for anyone who wants a different trade.
31509
- result=$($t_prefix env CAVEMAN_DEFAULT_MODE=off claude -p --model "${LOKI_DOCS_MODEL:-claude-sonnet-5}" "$prompt" 2>/dev/null) || exit_code=$?
31565
+ result=$($t_prefix env CAVEMAN_DEFAULT_MODE=off claude -p --model "${LOKI_DOCS_MODEL:-sonnet}" "$prompt" 2>/dev/null) || exit_code=$?
31510
31566
  ;;
31511
31567
  codex)
31512
31568
  result=$($t_prefix codex exec --sandbox workspace-write "$prompt" 2>/dev/null) || exit_code=$?
@@ -35029,7 +35085,7 @@ cmd_report_legacy() {
35029
35085
  while [[ $# -gt 0 ]]; do
35030
35086
  case "$1" in
35031
35087
  --help|-h)
35032
- echo -e "${BOLD}loki report${NC} - Session report generator (v6.27.0)"
35088
+ echo -e "${BOLD}loki report${NC} - Session report generator"
35033
35089
  echo ""
35034
35090
  echo "Usage: loki report [subcommand] [options]"
35035
35091
  echo ""