loki-mode 11.74.1 → 11.75.1

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 (166) 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/browser-open.sh +1 -1
  8. package/autonomy/lib/chat.sh +1 -1
  9. package/autonomy/lib/cockpit-render.sh +1 -1
  10. package/autonomy/lib/done-recognition.sh +4 -4
  11. package/autonomy/lib/efficiency_cost.py +1 -1
  12. package/autonomy/lib/engine10-push.sh +2 -2
  13. package/autonomy/lib/prd-enrich.sh +1 -1
  14. package/autonomy/lib/proof-check.sh +1 -1
  15. package/autonomy/lib/proof-generator.py +3 -3
  16. package/autonomy/lib/proof-pr.sh +1 -1
  17. package/autonomy/lib/skill-link-heal.sh +1 -1
  18. package/autonomy/lib/voter-agents.sh +1 -1
  19. package/autonomy/loki +26 -37
  20. package/autonomy/prd-checklist.sh +1 -1
  21. package/autonomy/receipt_jwt.py +1 -1
  22. package/autonomy/run.sh +28 -28
  23. package/autonomy/trigger-schedule.py +6 -414
  24. package/autonomy/tui.sh +1 -1
  25. package/autonomy/verify.sh +4 -4
  26. package/completions/loki.bash +0 -5
  27. package/dashboard/__init__.py +1 -1
  28. package/docs/ARCHITECTURE.md +1 -2
  29. package/docs/CLI-REFERENCE.md +1 -1
  30. package/docs/COMPONENTS.md +1 -1
  31. package/docs/INSTALLATION.md +1 -1
  32. package/docs/ROUTING-EVIDENCE.md +1 -2
  33. package/docs/V10-RESEARCH.md +1 -1
  34. package/docs/dev/architecture-reference.md +3 -7
  35. package/docs/dev/project-structure.md +1 -4
  36. package/docs/dev/release-checklist.md +13 -31
  37. package/docs/research-2026-07/OBSERVABILITY-TOOL-SPEC.md +1 -1
  38. package/docs/v11/MARKET-SLICES.md +1 -1
  39. package/docs/v11/REGISTRIES.md +1 -1
  40. package/docs/v11/ROUTER-1.md +2 -2
  41. package/loki-ts/dist/loki.js +2 -2
  42. package/mcp/__init__.py +1 -1
  43. package/package.json +2 -2
  44. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  45. package/skills/extending.md +2 -3
  46. package/skills/factory-operations.md +11 -18
  47. package/skills/release-cadence.md +2 -2
  48. package/web-app/dist/assets/{AdminPage-BJm9y_qE.js → AdminPage-xKgtIhk2.js} +1 -1
  49. package/web-app/dist/assets/{Avatar-EEiOX0Y0.js → Avatar-Q14AHox9.js} +1 -1
  50. package/web-app/dist/assets/{Badge-ZXM82z0d.js → Badge-yk5M-lip.js} +1 -1
  51. package/web-app/dist/assets/{Button-BTMAbQBv.js → Button-ynznk0At.js} +1 -1
  52. package/web-app/dist/assets/{CockpitPage-BaorxOYw.js → CockpitPage-C8B765za.js} +1 -1
  53. package/web-app/dist/assets/{ComparePage-BxhA3QxZ.js → ComparePage-DqzmWKnf.js} +1 -1
  54. package/web-app/dist/assets/{ErrorBoundary-DGIdCZdm.js → ErrorBoundary-DdBPd_Lq.js} +1 -1
  55. package/web-app/dist/assets/{EvidenceReceiptPanel-OgHK5zmn.js → EvidenceReceiptPanel-jb4Tp38b.js} +1 -1
  56. package/web-app/dist/assets/{GitHubIssuesPanel-Bx89fXVx.js → GitHubIssuesPanel-xJQiLcxs.js} +1 -1
  57. package/web-app/dist/assets/{GitHubPRsPanel-cuzSw_N3.js → GitHubPRsPanel-84W3Dhk_.js} +1 -1
  58. package/web-app/dist/assets/{HomePage-B-XP9eTl.js → HomePage-St1Xl2tu.js} +2 -2
  59. package/web-app/dist/assets/{LoginPage-DuNSWyVy.js → LoginPage-jRt0NUHb.js} +1 -1
  60. package/web-app/dist/assets/{MagicPage-DEqUoT0l.js → MagicPage-CQLFe7LR.js} +1 -1
  61. package/web-app/dist/assets/{MetricsPage--rnXkkOt.js → MetricsPage-zzX9eTC5.js} +1 -1
  62. package/web-app/dist/assets/{NotFoundPage-BLCJKK70.js → NotFoundPage-DDu023SY.js} +1 -1
  63. package/web-app/dist/assets/{ProjectPage-BtF37a4e.js → ProjectPage-D60UURaH.js} +3 -3
  64. package/web-app/dist/assets/{ProjectsPage-BmRyPzwL.js → ProjectsPage-DqVsKxlt.js} +1 -1
  65. package/web-app/dist/assets/{SettingsPage-Cg3fgOLx.js → SettingsPage-G7pPKvo0.js} +1 -1
  66. package/web-app/dist/assets/{ShowcasePage-CD25qTmg.js → ShowcasePage-CrU_aKgS.js} +1 -1
  67. package/web-app/dist/assets/{SystemSettingsPage-DNrCZvNp.js → SystemSettingsPage-ClKGQFsB.js} +1 -1
  68. package/web-app/dist/assets/{TeamsPage-Bpe58D0B.js → TeamsPage-B530vSNe.js} +1 -1
  69. package/web-app/dist/assets/{TemplatesPage-Cwl_bmhO.js → TemplatesPage-COmv_Cqd.js} +1 -1
  70. package/web-app/dist/assets/{TerminalOutput-DYgZnII2.js → TerminalOutput-CufG9YzF.js} +1 -1
  71. package/web-app/dist/assets/{activity-CsVLJUZG.js → activity-Ct1Updr6.js} +1 -1
  72. package/web-app/dist/assets/{bell-DCcGk9Ub.js → bell-rcvhQuGr.js} +1 -1
  73. package/web-app/dist/assets/{bot-BaAaPto-.js → bot-DzeqEI-b.js} +1 -1
  74. package/web-app/dist/assets/{check-Dy8Lpprr.js → check-zacnZHyC.js} +1 -1
  75. package/web-app/dist/assets/{chevron-left-CiX3YEuG.js → chevron-left-Lxnkl8Qg.js} +1 -1
  76. package/web-app/dist/assets/{circle-alert-Bm2AEdEx.js → circle-alert-DoqSdQdB.js} +1 -1
  77. package/web-app/dist/assets/{clock-D1nWLjJm.js → clock-B7bJcVIC.js} +1 -1
  78. package/web-app/dist/assets/{cloud-Bp-p2q6I.js → cloud-DdA9Bu6q.js} +1 -1
  79. package/web-app/dist/assets/{code-xml-Crt8tNsY.js → code-xml-CAZEZ9T8.js} +1 -1
  80. package/web-app/dist/assets/{database-0lcGHtpv.js → database-Da2GkEIN.js} +1 -1
  81. package/web-app/dist/assets/{dollar-sign-cup3uE0C.js → dollar-sign-DjDiG-37.js} +1 -1
  82. package/web-app/dist/assets/{file-code-corner-jPdCMfoJ.js → file-code-corner-CSL-Jij-.js} +1 -1
  83. package/web-app/dist/assets/{file-plus-CncZcY9z.js → file-plus-02DRA8pV.js} +1 -1
  84. package/web-app/dist/assets/{globe-BvCLfBOs.js → globe-CGyB90kK.js} +1 -1
  85. package/web-app/dist/assets/{hammer-CG7gCbza.js → hammer-BaQB96TG.js} +1 -1
  86. package/web-app/dist/assets/{index-C5sRHsGA.js → index-lcoI1_Kk.js} +3 -3
  87. package/web-app/dist/assets/{layers-BPIeLcUT.js → layers-BWJBvoeg.js} +1 -1
  88. package/web-app/dist/assets/{loader-circle-wH9n2Xbt.js → loader-circle-CdcI0FeS.js} +1 -1
  89. package/web-app/dist/assets/{lock-D_CuUhM7.js → lock-BBkw5NJx.js} +1 -1
  90. package/web-app/dist/assets/{package-137A8C6B.js → package-BpPRO3LM.js} +1 -1
  91. package/web-app/dist/assets/{plus-QVF6Q3NZ.js → plus-D7XbyK29.js} +1 -1
  92. package/web-app/dist/assets/{refresh-cw-Dq_1uZWi.js → refresh-cw-DLG3hyAi.js} +1 -1
  93. package/web-app/dist/assets/{rotate-ccw-Dyzxf9m5.js → rotate-ccw-Bqau4R_S.js} +1 -1
  94. package/web-app/dist/assets/{scroll-text-DrYmLoL4.js → scroll-text-BtIL3cNk.js} +1 -1
  95. package/web-app/dist/assets/{server-QWBqdl1e.js → server-tZCmZ4yH.js} +1 -1
  96. package/web-app/dist/assets/{shield-alert-DOZLbVQY.js → shield-alert-K5JXzFKg.js} +1 -1
  97. package/web-app/dist/assets/{thumbs-up-CUKmG90b.js → thumbs-up-CHCVyJdw.js} +1 -1
  98. package/web-app/dist/assets/{trash-2-Cxx8CMS1.js → trash-2-DncNxVq0.js} +1 -1
  99. package/web-app/dist/assets/{trending-down-CU5sNvAx.js → trending-down-D8Bp0azX.js} +1 -1
  100. package/web-app/dist/assets/{trending-up-BV8fTyhT.js → trending-up-AixETdKR.js} +1 -1
  101. package/web-app/dist/assets/{upload-DsSmwrGn.js → upload-VCbjFn2H.js} +1 -1
  102. package/web-app/dist/assets/{usePolling-MdyOyVKa.js → usePolling-CQvKD2Jj.js} +1 -1
  103. package/web-app/dist/assets/{user-DblryVAt.js → user-SK-YguQ6.js} +1 -1
  104. package/web-app/dist/index.html +1 -1
  105. package/autonomy/company-seats.json +0 -82
  106. package/docs/COMPETITIVE-INTEL-2026-09.md +0 -444
  107. package/docs/FOUNDER-DECISIONS-TRUST-SEMANTICS-2026-08-01.md +0 -145
  108. package/docs/FOUNDER-STATUS-AND-DECISIONS-2026-07-01.md +0 -132
  109. package/docs/LOKI-10-BUILD-PROMPT.md +0 -350
  110. package/docs/STRATEGY-2026-2028.md +0 -124
  111. package/docs/V10-VISION.md +0 -161
  112. package/docs/v10/ADOPTION-PLAN.md +0 -375
  113. package/docs/v10/ARCHITECT-CUTS.md +0 -744
  114. package/docs/v10/BACKLOG.md +0 -231
  115. package/docs/v10/BOARD.md +0 -1403
  116. package/docs/v10/CONTROL-PLANE.md +0 -120
  117. package/docs/v10/CONTROL.md +0 -36
  118. package/docs/v10/CP-ASK-PLAN.md +0 -85
  119. package/docs/v10/CP-ENTERPRISE-UI.md +0 -537
  120. package/docs/v10/D51-PHASE-B.md +0 -120
  121. package/docs/v10/D61-SPEED.md +0 -105
  122. package/docs/v10/D63-CARDS.md +0 -354
  123. package/docs/v10/DECISIONS.md +0 -915
  124. package/docs/v10/E2E-D65.md +0 -123
  125. package/docs/v10/ENGINE-LAWS.md +0 -163
  126. package/docs/v10/ENGINE-MEASURE.md +0 -69
  127. package/docs/v10/ENGINE.md +0 -743
  128. package/docs/v10/FAILURE-CLASSES.md +0 -2025
  129. package/docs/v10/FC21B-FC22-PLAN.md +0 -107
  130. package/docs/v10/FIRST-RUN-GATE.md +0 -39
  131. package/docs/v10/FOUNDER-QUEUE.md +0 -29
  132. package/docs/v10/GAP-RESEARCH-1003.md +0 -32
  133. package/docs/v10/GUARDS.md +0 -883
  134. package/docs/v10/L0-WAVE1.md +0 -81
  135. package/docs/v10/LEGACY-REMOVAL.md +0 -408
  136. package/docs/v10/MEDIUM-ANALYSIS.md +0 -346
  137. package/docs/v10/METRICS.md +0 -645
  138. package/docs/v10/MODERNIZE.md +0 -437
  139. package/docs/v10/OPENCODE-PARITY-PLAN.md +0 -84
  140. package/docs/v10/OPERATING-MODEL.md +0 -60
  141. package/docs/v10/PLAN-V12.md +0 -896
  142. package/docs/v10/PROGRESS.md +0 -2735
  143. package/docs/v10/RELEASE-11.md +0 -77
  144. package/docs/v10/RETRO-2026.md +0 -650
  145. package/docs/v10/ROADMAP-D63.md +0 -35
  146. package/docs/v10/SCALE.md +0 -140
  147. package/docs/v10/SCORECARD-PLAN.md +0 -250
  148. package/docs/v10/SWARM-PROMPT.md +0 -98
  149. package/docs/v10/SWARM.md +0 -293
  150. package/docs/v10/cp-redesign/PARITY.md +0 -188
  151. package/docs/v10/cp-redesign/legacy/INDEX.md +0 -1167
  152. package/docs/v10/roadmap-10/01-measurement.md +0 -113
  153. package/docs/v10/roadmap-10/02-cost.md +0 -75
  154. package/docs/v10/roadmap-10/03-speed.md +0 -65
  155. package/docs/v10/roadmap-10/04-first-run.md +0 -61
  156. package/docs/v10/roadmap-10/05-deploy.md +0 -61
  157. package/docs/v10/roadmap-10/06-stability.md +0 -64
  158. package/docs/v10/roadmap-10/07-quality.md +0 -57
  159. package/docs/v10/roadmap-10/08-proof.md +0 -48
  160. package/docs/v10/roadmap-10/09-safety.md +0 -74
  161. package/docs/v10/roadmap-10/README.md +0 -1464
  162. package/skills/sdlc-fleet.md +0 -170
  163. package/tools/cockpit/SPEC.md +0 -275
  164. package/tools/cockpit/index.html +0 -146
  165. package/tools/cockpit/roi-basis.json +0 -33
  166. package/tools/cockpit/server.py +0 -946
@@ -1,23 +1,11 @@
1
1
  # Release checklist and local CI
2
2
 
3
- Moved out of CLAUDE.md (S-78) to keep the root file short. Updated in this
4
- pass to remove two items that `docs/v10/DECISIONS.md` D25 and
5
- `docs/LOKI-10-BUILD-PROMPT.md` section 1 have superseded:
6
- - `git add -A` in step 4 is replaced with staging by name (repo rule, always).
7
- - Per-merge pushing and the D25 release trains are superseded by D96 (every
8
- approved slice is a release; see `docs/v10/OPERATING-MODEL.md`). Waiting for
9
- Tests and Security Audit green on that exact SHA still applies to any push
10
- made outside the merge-gate.
11
- "Wait for user approval before commit" from the old workflow is superseded
12
- by the standing authorization in `docs/LOKI-10-BUILD-PROMPT.md` section 1
13
- for sessions operating under that program; outside it, ask as normal.
3
+ Release steps and local CI details for maintainers.
14
4
 
15
5
  ## Local CI Before Every Push
16
6
 
17
- **Superseded by D27 (`docs/v10/DECISIONS.md`).** The FAST-tier-before-every-push
18
- mandate that used to live in this section is retired: GitHub CI is the gate.
19
- Before pushing, run only syntax checks (`bash -n`, `py_compile`) plus the
20
- slice's own tests, capped at 60 seconds. `.githooks/pre-push` enforces the
7
+ GitHub CI is the gate. Before pushing, run only syntax checks (`bash -n`, `py_compile`) plus the
8
+ change's own tests, capped at 60 seconds. `.githooks/pre-push` enforces the
21
9
  repo-identity check, `bash -n` on `autonomy/run.sh` and `autonomy/loki`, and
22
10
  the red-main warning only; a push is not "done" until `git ls-remote origin
23
11
  refs/heads/main` matches `git rev-parse HEAD`. `scripts/local-ci.sh` remains
@@ -36,7 +24,7 @@ Cleanup after every local-ci run and post-release validation uses
36
24
 
37
25
  ## Release Workflow
38
26
 
39
- **Step 0 (always first, D27): syntax checks + the slice's own tests, 60s cap.**
27
+ **Step 0 (always first): syntax checks + the change's own tests, 60s cap.**
40
28
  See "Local CI Before Every Push" above.
41
29
 
42
30
  ### 1. Version Bump - ALL Files
@@ -59,8 +47,8 @@ wiki/Home.md, wiki/_Sidebar.md, wiki/API-Reference.md
59
47
  README.md, docker/docker-compose.yml # Docker image tags (MAJOR/MINOR bumps)
60
48
  ```
61
49
 
62
- The CHANGELOG.md entry must be a full section, not a one-line placeholder
63
- (E-88): a summary line, one or more `### ` subsections (Added, Fixed, etc.)
50
+ The CHANGELOG.md entry must be a full section, not a one-line placeholder:
51
+ a summary line, one or more `### ` subsections (Added, Fixed, etc.)
64
52
  with a `- ` bullet for every user-visible change, and, if this version
65
53
  republishes a version that never reached npm, that version's own section
66
54
  carried forward too. `scripts/release-notes.sh <version>` extracts and
@@ -68,10 +56,10 @@ validates this section the same way release.yml does; `.githooks/pre-push`
68
56
  runs it on any push whose remote ref is `refs/heads/main` and whose VERSION
69
57
  actually changes there, and release.yml refuses to publish the release if
70
58
  the section is missing, empty, or not fully written. release.yml runs this
71
- extraction BEFORE tagging (D36), so a notes failure never burns a version
59
+ extraction BEFORE tagging, so a notes failure never burns a version
72
60
  number.
73
61
 
74
- Carrying another version's notes forward (E-88a) is explicit only:
62
+ Carrying another version's notes forward is explicit only:
75
63
  `--include v1,v2,...` names the versions to append, each under its own
76
64
  "## vX.Y.Z changes (first published in vNEW)" heading; release.yml itself
77
65
  passes no `--include`, so a version that never reached npm gets its
@@ -117,19 +105,15 @@ rm -f loki-mode-*.tgz
117
105
  ```
118
106
  If any check fails, do not release; fix the root cause first.
119
107
 
120
- ### 4. Commit and land (every approved slice is a release, D96)
108
+ ### 4. Commit and land
121
109
 
122
- Stage files by name (never `git add -A` or `git add .`), commit with the
123
- repo-local `asklokesh` identity, no co-author. The merge-gate merges approved
124
- slices to main and a VERSION push publishes to npm under `latest` and `next` at once (D96, D102); the
110
+ Stage files by name (never `git add -A` or `git add .`). A VERSION push to main publishes to npm under `latest` and `next` at once; the
125
111
  `publish-npm` job needs only `pack-npm` and never waits on Tests, Security Audit, nightly or the backstop.
126
112
  For a manual push (`git push origin main`), run `bash scripts/local-ci.sh` first. GitHub Actions publishes
127
113
  npm, then creates the tag and GitHub Release, builds/pushes Docker (including `:latest`), and updates the Homebrew tap. Do not manually
128
114
  create tags.
129
115
 
130
- Before any release merge or push to main, run `bash scripts/release-approval-gate.sh --range origin/main..<sha>` (FC-RELEASE-UNNAMED-STACKED-PARENT): every commit in the range must be named by a `TL|HIGH|CTO|tl-x|rev-x APPROVE <sha>` line in docs/v10/BOARD.md, be rebase-equal by `git patch-id --stable`, or be an exempt clean merge or release commit; a held slice denies. Exit 1 lists each unapproved SHA with its reason, and `LOKI_RELEASE_APPROVED` does not bypass it.
131
-
132
- Before pushing the release commit, run `bash scripts/release.sh --check-clean` (E-151): it exits 1 naming any tracked file (for example a stamped `loki-ts/dist/loki.js.map`) the commit left modified; `--bump-only` prints the "stage these files:" list.
116
+ Before pushing the release commit, run `bash scripts/release.sh --check-clean`: it exits 1 naming any tracked file (for example a stamped `loki-ts/dist/loki.js.map`) the commit left modified; `--bump-only` prints the "stage these files:" list.
133
117
 
134
118
  ### 5. Verify ALL Distribution Channels
135
119
 
@@ -142,10 +126,8 @@ brew update && brew info loki-mode
142
126
  gh release view vX.Y.Z
143
127
  ```
144
128
 
145
- ### Train cycle: previous release must be on npm
146
- `scripts/train-cycle.sh` (phase C) refuses to cut release N+1 until the previous `release: vX` version is visible on npm (`npm_has_version`). While it is missing, the cycle logs `PREV_NOT_ON_NPM X` and returns 0 (waiting is not a failure). An unreachable registry fails closed and adds `reason=NPM_UNREACHABLE`. After `LOKI_TC_NPM_WAIT_MIN` minutes (default 45) since the previous release commit the log becomes `PREV_NOT_ON_NPM_STALE ... refusing release, needs a human`; the release stays refused either way.
147
-
148
- Operator action: wait for the Release workflow publish-npm job to land (seconds after the push). `latest` and `next` are set together by that job (D102); do not move them by hand, and never unpublish (npm deprecate is allowed). If the STALE line appears, investigate the failed or stuck publish run rather than bypassing the check.
129
+ ### Publish check
130
+ Wait for the Release workflow publish-npm job to land (seconds after the push). `latest` and `next` are set together by that job; do not move them by hand, and never unpublish (npm deprecate is allowed).
149
131
 
150
132
  ### Distribution Channel Checklist
151
133
 
@@ -21,7 +21,7 @@ in Autonomi's design language. Runs in Docker locally; opens in the browser when
21
21
  - Before/after metrics: `benchmarks/results/*.json` (speed-before/after-*.json = wall_clock_min,
22
22
  act_iterations, completion_claims, engine_completed, acceptance, per_iteration_work_s).
23
23
  - Diagnoses / decisions / plans: `docs/SPEED-DIAGNOSIS-2026-07-01.md`,
24
- `docs/FOUNDER-STATUS-AND-DECISIONS-2026-07-01.md`, `docs/TOP-100-BACKLOG.md`,
24
+ `docs/TOP-100-BACKLOG.md`,
25
25
  `docs/research-2026-07/GAP-ANALYSIS-BACKLOG.md`.
26
26
  - What worked / didn't / mistakes: parse the above docs' honest sections + git log on origin/main
27
27
  (`git log --oneline` for shipped commits; look for "revert" and "fix(...council-review finding)"
@@ -1,6 +1,6 @@
1
1
  # Market program slice cards (source: autonomi-dev/research/2026-10-08-market/MARKET.md)
2
2
 
3
- Owner: Product Owner. Not committed to BOARD.md. Cards are at most 60 lines each. Shared Wall checks on every card: tsc clean (loki-ts), only the file set listed is touched, bash -n on touched shell, no emoji or dash characters, SKILL.md untouched, dist rebuilt when loki-ts/src changes (memory: ts edit needs dist rebuild), new test files registered in the runner and shard table (structural guards). Budgets: LOW 15 min, MEDIUM 30 min, HIGH 30 min build plus live pair review (D91-8). Every flag is default OFF unless the card says otherwise. Staffing order is the section order.
3
+ Cards are at most 60 lines each. Shared Wall checks on every card: tsc clean (loki-ts), only the file set listed is touched, bash -n on touched shell, no emoji or dash characters, SKILL.md untouched, dist rebuilt when loki-ts/src changes, new test files registered in the runner and shard table (structural guards). Budgets: LOW 15 min, MEDIUM 30 min, HIGH 30 min build plus live pair review. Every flag is default OFF unless the card says otherwise. Staffing order is the section order.
4
4
 
5
5
  # STANDARDS
6
6
 
@@ -42,7 +42,7 @@ This is a pure refactor:
42
42
  1200 lines) and the D66 import rules: no `stages/` import except a
43
43
  whole-statement `import type` of seal, verify or wall.
44
44
  - The new cap needs CTO sign-off (RG-06).
45
- 6. Dist is never committed by a slice. The Release Manager rebuilds dist in the
45
+ 6. Dist is never committed by a slice. The release owner rebuilds dist in the
46
46
  main checkout, because a symlinked node_modules breaks the source maps.
47
47
 
48
48
  ## Existing partial registries (reuse, do not duplicate)
@@ -94,7 +94,7 @@ Tier sets the review (D12): LOW/MEDIUM by Tech Leads, HIGH by opus reviewers, un
94
94
  | R1-15 | Start line, receipt route block, PR line | loki-ts/src/engine10/supervisor.ts, loki-ts/src/engine10/stages/seal.ts, loki-ts/src/engine10/pr_body.ts, loki-ts/tests/engine10/route_receipt_golden.test.ts | MEDIUM | sonnet | golden: `executor haiku-5.5, advisor opus: <reason>`; receipt lists `route.shape_key`, escalations with trigger and evidence, advisor NOT PROVEN with owner, >100K share; `route.shape_parity: NOT PROVEN` for a shape with no B9 row (D89 item 10); flag off byte-identical (receipt hash stable) | pr_body_golden, portable_receipt, seal suites | R1-05, R1-06, R1-11 |
95
95
  | R1-16 | Per-shape outcome history (H4) | loki-ts/src/runner/router/history.ts, loki-ts/src/e10ext/repomemory.ts, loki-ts/tests/runner/router_history.test.ts | MEDIUM | haiku | append/read in the per-repo cache dir; shape key from Project Model workspaceKind + sorted runner labels (model-derived, L4), never from file regex; floor: haiku lost 2 of last 3 on the shape (code-owned FAIL or escalation; harness, env and provider ERRORs do not count) -> sonnet, cleared only by a B9 row showing Haiku at parity on that shape; fixture: 3 harness-owned FAILs on haiku do NOT trigger the floor. Also creates the empty shipped `loki-ts/data/router-shape-defaults.json` and its reader `shapeDefault(key)` (section 4.6), which accepts `sonnet` and `prior-default` and rejects any other value (cold read + NOT PROVEN) | corrupt file is a cold read, never a crash | none |
96
96
  | R1-17 | B9 scoreboard harness | scripts/b9-scoreboard.sh, tests/test-b9-scoreboard.sh, tests/run-all-tests.sh (registration + shard row) | MEDIUM | sonnet | dry-run with a stub `claude` produces one METRICS row per arm with solve, wall seconds, usd, shape_key; `--emit-shape-defaults` on a fixture where the router loses one shape lists exactly that shape as `sonnet`; a fixture where the Sonnet confirming rerun also loses emits it as `prior-default` | shellcheck, `timeout -k`, runner registration guard (memory: new test file structural guards) | none |
97
- | R1-18 | Docs: GUIDE model-routing section, CHANGELOG | docs/v10/GUIDE.md, CHANGELOG.md | LOW | haiku | doc lint; GUIDE names every knob in section 5 and the fallback | Release Manager reads it against the receipt | R1-15 |
97
+ | R1-18 | Docs: GUIDE model-routing section, CHANGELOG | docs/v10/GUIDE.md, CHANGELOG.md | LOW | haiku | doc lint; GUIDE names every knob in section 5 and the fallback | Read against the receipt | R1-15 |
98
98
  | R1-19 | Final flip after the CTO gate: LOKI_ROUTER default ON with Sonnet 5.5 + Opus 5.5 advisor as the default executor (11.1.0 and 11.2.0 still ship OFF); Haiku 5.5 per work unit only when Opus assigns it in the plan, per-unit schema `units: [{id, kind, executor, reason}]` (11.2.0 or 11.2.1); ship seeded shape defaults (`haiku` only for earned shapes) | loki-ts/src/runner/router/flag.ts, loki-ts/data/router-shape-defaults.json, loki-ts/tests/runner/router_flag_default.test.ts | HIGH | sonnet | red: unset env resolves off; green: unset resolves on, `0`/`off`/`false` resolve off; R1-21 opt-out golden still green with `LOKI_ROUTER=0` | GATE (all on the release candidate SHA): steering's FireLater#17 gate green (VERIFIED, ready PR, time within raw + 30s, cost <= raw x 1.2); B9 correctness parity with raw `claude -p` on the Sonnet default and on every shape listed `haiku` (a shape with no evidence stays on Sonnet); arm 4 correctness parity, or the Sonnet no-advisor fallback in place (R1-07, R1-09); every shape listed as `prior-default` runs the exact LOKI_ROUTER=0 models (R1-21 golden per listed shape); the seeded file committed with its METRICS.md refs | all |
99
99
  | R1-21 | Opt-out golden: `LOKI_ROUTER=0` equals pre-router behavior exactly | loki-ts/tests/engine10/router_optout_golden.test.ts, loki-ts/tests/engine10/fixtures/pre_router_models.json | HIGH | sonnet | fixture captured on 11.0.3 code BEFORE any router slice merges: for an env matrix (default; LOKI_E10_CASCADE=1; LOKI_E10_WALL_TIER=haiku; LOKI_ALLOW_HAIKU=true; LOKI_MODEL_OVERRIDE=sonnet; LOKI_CLAUDE_MODEL_DEVELOPMENT=opus; LOKI_E10_PLAN=always) it records, per stage (plan, wall, already_done, implement, fix round 1 and escalated round 2), the model passed to sessions.run, the child-env LOKI_CLAUDE_MODEL_* values, the SDK query options model/fallbackModel/settings, the downgrade list, the start line and the run.started keys. The test replays the matrix through fake sessions with `LOKI_ROUTER=0` (and unset, until R1-19) and requires deep equality. Mutation: changing wallModel's default or adding `settings.advisorModel` under `0` turns it red | runs in the fast tier; must be green on every slice's train | none (lands first in W1) |
100
100
  | R1-20 | `loki doctor` shows advisor availability and bundled CC version | loki-ts/src/commands/doctor.ts, loki-ts/tests/commands/doctor_router.test.ts | LOW | haiku | doctor prints `advisor: available` or the reason from R1-06 | doctor suites | R1-06 |
@@ -111,7 +111,7 @@ Arms (n=3 per repo per arm; a 0/3 needs a positive control first):
111
111
  4. Loki, `LOKI_ROUTER=1 LOKI_ROUTER_ADVISOR=off` (fallback path, proves "never fail a run for it").
112
112
  Metrics per run: solved (hidden tests), wall seconds, usd (SDK total_cost_usd, including advisor tokens), escalations taken, share of requests above 100K, advisor consultations.
113
113
  Pass: arm 2 solve rate >= arm 1 on every repo; time within raw + 30s (small) or raw x 1.3; cost <= raw x 1.2 (expected well below); zero harness-owned FAILED/STALLED; arm 4 completes every run with advisor NOT PROVEN recorded, and its solve rate is >= arm 1 on every repo; if not, the no-advisor executor is Sonnet 5.5 (section 4.4). Rows go to docs/v10/METRICS.md with commands and exit codes. A correctness loss on a shape does NOT hold the release: `--emit-shape-defaults` lists it, R1-19 ships it in `router-shape-defaults.json`, and that shape runs on Sonnet (+ Opus advisor) by default (section 4.6). Before R1-19 merges, rerun B9 on the losing shape with the seeded file present to confirm Sonnet reaches parity there; if Sonnet also loses, it ships as `prior-default` in router-shape-defaults.json, plus a FAILURE-CLASSES row; it is not a release blocker for other shapes. Time and cost misses on a shape are recorded and routed the same way. FireLater#17 is binding: it must pass on whatever executor its shape resolves to. The R1-19 gate also requires arm 4 correctness parity (or the Sonnet no-advisor fallback in place) and that every `prior-default` shape runs the exact `LOKI_ROUTER=0` models.
114
- Budget: B9 runs count inside the 10% measurement budget; the Chief of Staff runs them, not a slice builder.
114
+ Budget: B9 runs count inside the 10% measurement budget; the coordinator runs them, not a slice builder.
115
115
 
116
116
  ## 8. Risks and open questions
117
117
  1. Price unverified: $0.10/$0.50 (<=100K) and $0.50/$2.50 (>100K), cache read $0.01/$0.05, are steering-reported. R1-02 step 1 confirms on the Anthropic pricing page or blocks. Engine10 run dollars come from the SDK, so a wrong table only skews partial streams and estimates, but receipts would still be wrong there.
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var Fn0=Object.create;var{getPrototypeOf:On0,defineProperty:qG,getOwnPropertyNames:m80,getOwnPropertyDescriptor:Ln0}=Object,u80=Object.prototype.hasOwnProperty;function d80($){return this[$]}var jn0,An0,Cn0=($,Z,J)=>{var X=$!=null&&typeof $==="object";if(X){var Y=Z?jn0??=new WeakMap:An0??=new WeakMap,Q=Y.get($);if(Q)return Q}J=$!=null?Fn0(On0($)):{};let W=Z||!$||!$.__esModule?qG(J,"default",{value:$,enumerable:!0}):J;for(let z of m80($))if(!u80.call(W,z))qG(W,z,{get:d80.bind($,z),enumerable:!0});if(X)Y.set($,W);return W},Tn0=($)=>{var Z=(g80??=new WeakMap).get($),J;if(Z)return Z;if(Z=qG({},"__esModule",{value:!0}),$&&typeof $==="object"||typeof $==="function"){for(var X of m80($))if(!u80.call(Z,X))qG(Z,X,{get:d80.bind($,X),enumerable:!(J=Ln0($,X))||J.enumerable})}return g80.set($,Z),Z},g80,fO=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var Pn0=($)=>$;function In0($,Z){this[$]=Pn0.bind(null,Z)}var P0=($,Z)=>{for(var J in Z)qG($,J,{get:Z[J],enumerable:!0,configurable:!0,set:In0.bind(Z,J)})};var w=($,Z)=>()=>($&&(Z=$($=0)),Z);var q6=import.meta.require;var p80={};P0(p80,{lokiDirFor:()=>gO,lokiDir:()=>k0,homeLokiDir:()=>K$,findRepoRootForVersion:()=>UG,REPO_ROOT:()=>R0});import{resolve as b1,dirname as ex}from"path";import{fileURLToPath as Rn0}from"url";import{existsSync as hO}from"fs";import{homedir as En0}from"os";function Dn0(){let $=c80;for(let Z=0;Z<6;Z++){if(hO(b1($,"VERSION"))&&hO(b1($,"autonomy/run.sh")))return $;let J=ex($);if(J===$)break;$=J}return b1(c80,"..","..","..")}function UG($){let Z=$;for(let J=0;J<6;J++){if(hO(b1(Z,"VERSION"))&&hO(b1(Z,"autonomy/run.sh")))return Z;let X=ex(Z);if(X===Z)break;Z=X}return b1($,"..","..","..")}function gO($){return process.env.LOKI_DIR??b1($,".loki")}function k0(){return gO(process.cwd())}function K$(){return b1(En0(),".loki")}var c80,R0;var X8=w(()=>{c80=ex(Rn0(import.meta.url));R0=Dn0()});import{readFileSync as wn0}from"fs";import{resolve as _n0,dirname as xn0}from"path";import{fileURLToPath as kn0}from"url";function y7(){if(iJ!==null)return iJ;let $="11.74.1";if(typeof $==="string"&&$.length>0)return iJ=$,iJ;try{let Z=xn0(kn0(import.meta.url)),J=UG(Z);iJ=wn0(_n0(J,"VERSION"),"utf-8").trim()}catch{iJ="unknown"}return iJ}var iJ=null;var y1=w(()=>{X8()});import{mkdirSync as Zk,readFileSync as mO,realpathSync as Sn0,statSync as bn0,writeFileSync as Jk}from"fs";import{dirname as kQ,join as $k,resolve as l80}from"path";function gn0(){return l80(K$(),"cache","update-check.json")}function v1($){let Z=/^(\d+)\.(\d+)\.(\d+)$/.exec($.trim());if(!Z)return null;return[Number(Z[1]),Number(Z[2]),Number(Z[3])]}function BG($,Z){let J=v1($),X=v1(Z);if(!J||!X)return!1;let[Y,Q,W]=J,[z,K,V]=X;if(Y!==z)return Y>z;if(Q!==K)return Q>K;return W>V}function i80(){let $=(process.env.LOKI_NO_UPDATE_CHECK??"").trim().toLowerCase();if($==="1"||$==="true"||$==="yes")return!0;if(process.env.CI)return!0;if(!process.stdout.isTTY)return!0;return!1}function a80($){try{let Z=mO($,"utf-8"),J=JSON.parse(Z);if(typeof J.checkedAt==="number"&&typeof J.latest==="string"&&v1(J.latest)!==null)return{checkedAt:J.checkedAt,latest:J.latest}}catch{}return null}function mn0($){try{let Z=JSON.parse(mO($,"utf-8")).failedAt;if(typeof Z==="number")return Z}catch{}return null}function un0($,Z){let J=a80($);try{Zk(kQ($),{recursive:!0}),Jk($,JSON.stringify({...J??{},failedAt:Z}),"utf-8")}catch{}}function dn0($,Z){try{Zk(kQ($),{recursive:!0}),Jk($,JSON.stringify(Z),"utf-8")}catch{}}async function cn0(){try{let $=await fetch(yn0,{signal:AbortSignal.timeout(fn0),headers:{accept:"application/json"}});if(!$.ok)return null;let Z=await $.json();if(typeof Z.version==="string"&&v1(Z.version)!==null)return Z.version}catch{}return null}async function pn0($=Date.now(),Z=cn0,J=gn0()){let X=a80(J);if(X&&$-X.checkedAt<vn0)return X.latest;let Y=mn0(J);if(Y!==null&&$-Y>=0&&$-Y<hn0)return null;let Q=await Z();if(Q===null)return un0(J,$),null;return dn0(J,{checkedAt:$,latest:Q}),Q}function ln0($,Z=process.env){if(v1($)===null)return null;let X=Z.PATH;if(!X)return null;let Y=new Set;for(let Q of X.split(":")){if(!Q)continue;let W=$k(Q,"loki"),z;try{bn0(W),z=Sn0(W)}catch{continue}if(Y.has(z))continue;Y.add(z);try{let K=$k(kQ(kQ(z)),"package.json"),V=JSON.parse(mO(K,"utf8")).version;if(typeof V!=="string")continue;if(BG(V,$))return{path:W,version:V}}catch{continue}}return null}function in0(){return l80(K$(),"cache","last-seen-version.json")}function an0($,Z={}){try{if(i80())return!1;if(v1($)===null)return!1;let J=Z.seenFile??in0(),X=null;try{let Q=JSON.parse(mO(J,"utf-8")).version;if(typeof Q==="string"&&v1(Q)!==null)X=Q}catch{}if(X!==null&&!BG($,X))return!1;try{Zk(kQ(J),{recursive:!0}),Jk(J,JSON.stringify({version:$}),"utf-8")}catch{return!1}if(X===null)return!1;return(Z.write??((Q)=>process.stderr.write(Q)))(`Loki Mode upgraded ${X} -> ${$}. What is new: https://github.com/asklokesh/loki-mode/releases/tag/v${$}
2
+ var Fn0=Object.create;var{getPrototypeOf:On0,defineProperty:qG,getOwnPropertyNames:m80,getOwnPropertyDescriptor:Ln0}=Object,u80=Object.prototype.hasOwnProperty;function d80($){return this[$]}var jn0,An0,Cn0=($,Z,J)=>{var X=$!=null&&typeof $==="object";if(X){var Y=Z?jn0??=new WeakMap:An0??=new WeakMap,Q=Y.get($);if(Q)return Q}J=$!=null?Fn0(On0($)):{};let W=Z||!$||!$.__esModule?qG(J,"default",{value:$,enumerable:!0}):J;for(let z of m80($))if(!u80.call(W,z))qG(W,z,{get:d80.bind($,z),enumerable:!0});if(X)Y.set($,W);return W},Tn0=($)=>{var Z=(g80??=new WeakMap).get($),J;if(Z)return Z;if(Z=qG({},"__esModule",{value:!0}),$&&typeof $==="object"||typeof $==="function"){for(var X of m80($))if(!u80.call(Z,X))qG(Z,X,{get:d80.bind($,X),enumerable:!(J=Ln0($,X))||J.enumerable})}return g80.set($,Z),Z},g80,fO=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var Pn0=($)=>$;function In0($,Z){this[$]=Pn0.bind(null,Z)}var P0=($,Z)=>{for(var J in Z)qG($,J,{get:Z[J],enumerable:!0,configurable:!0,set:In0.bind(Z,J)})};var w=($,Z)=>()=>($&&(Z=$($=0)),Z);var q6=import.meta.require;var p80={};P0(p80,{lokiDirFor:()=>gO,lokiDir:()=>k0,homeLokiDir:()=>K$,findRepoRootForVersion:()=>UG,REPO_ROOT:()=>R0});import{resolve as b1,dirname as ex}from"path";import{fileURLToPath as Rn0}from"url";import{existsSync as hO}from"fs";import{homedir as En0}from"os";function Dn0(){let $=c80;for(let Z=0;Z<6;Z++){if(hO(b1($,"VERSION"))&&hO(b1($,"autonomy/run.sh")))return $;let J=ex($);if(J===$)break;$=J}return b1(c80,"..","..","..")}function UG($){let Z=$;for(let J=0;J<6;J++){if(hO(b1(Z,"VERSION"))&&hO(b1(Z,"autonomy/run.sh")))return Z;let X=ex(Z);if(X===Z)break;Z=X}return b1($,"..","..","..")}function gO($){return process.env.LOKI_DIR??b1($,".loki")}function k0(){return gO(process.cwd())}function K$(){return b1(En0(),".loki")}var c80,R0;var X8=w(()=>{c80=ex(Rn0(import.meta.url));R0=Dn0()});import{readFileSync as wn0}from"fs";import{resolve as _n0,dirname as xn0}from"path";import{fileURLToPath as kn0}from"url";function y7(){if(iJ!==null)return iJ;let $="11.75.1";if(typeof $==="string"&&$.length>0)return iJ=$,iJ;try{let Z=xn0(kn0(import.meta.url)),J=UG(Z);iJ=wn0(_n0(J,"VERSION"),"utf-8").trim()}catch{iJ="unknown"}return iJ}var iJ=null;var y1=w(()=>{X8()});import{mkdirSync as Zk,readFileSync as mO,realpathSync as Sn0,statSync as bn0,writeFileSync as Jk}from"fs";import{dirname as kQ,join as $k,resolve as l80}from"path";function gn0(){return l80(K$(),"cache","update-check.json")}function v1($){let Z=/^(\d+)\.(\d+)\.(\d+)$/.exec($.trim());if(!Z)return null;return[Number(Z[1]),Number(Z[2]),Number(Z[3])]}function BG($,Z){let J=v1($),X=v1(Z);if(!J||!X)return!1;let[Y,Q,W]=J,[z,K,V]=X;if(Y!==z)return Y>z;if(Q!==K)return Q>K;return W>V}function i80(){let $=(process.env.LOKI_NO_UPDATE_CHECK??"").trim().toLowerCase();if($==="1"||$==="true"||$==="yes")return!0;if(process.env.CI)return!0;if(!process.stdout.isTTY)return!0;return!1}function a80($){try{let Z=mO($,"utf-8"),J=JSON.parse(Z);if(typeof J.checkedAt==="number"&&typeof J.latest==="string"&&v1(J.latest)!==null)return{checkedAt:J.checkedAt,latest:J.latest}}catch{}return null}function mn0($){try{let Z=JSON.parse(mO($,"utf-8")).failedAt;if(typeof Z==="number")return Z}catch{}return null}function un0($,Z){let J=a80($);try{Zk(kQ($),{recursive:!0}),Jk($,JSON.stringify({...J??{},failedAt:Z}),"utf-8")}catch{}}function dn0($,Z){try{Zk(kQ($),{recursive:!0}),Jk($,JSON.stringify(Z),"utf-8")}catch{}}async function cn0(){try{let $=await fetch(yn0,{signal:AbortSignal.timeout(fn0),headers:{accept:"application/json"}});if(!$.ok)return null;let Z=await $.json();if(typeof Z.version==="string"&&v1(Z.version)!==null)return Z.version}catch{}return null}async function pn0($=Date.now(),Z=cn0,J=gn0()){let X=a80(J);if(X&&$-X.checkedAt<vn0)return X.latest;let Y=mn0(J);if(Y!==null&&$-Y>=0&&$-Y<hn0)return null;let Q=await Z();if(Q===null)return un0(J,$),null;return dn0(J,{checkedAt:$,latest:Q}),Q}function ln0($,Z=process.env){if(v1($)===null)return null;let X=Z.PATH;if(!X)return null;let Y=new Set;for(let Q of X.split(":")){if(!Q)continue;let W=$k(Q,"loki"),z;try{bn0(W),z=Sn0(W)}catch{continue}if(Y.has(z))continue;Y.add(z);try{let K=$k(kQ(kQ(z)),"package.json"),V=JSON.parse(mO(K,"utf8")).version;if(typeof V!=="string")continue;if(BG(V,$))return{path:W,version:V}}catch{continue}}return null}function in0(){return l80(K$(),"cache","last-seen-version.json")}function an0($,Z={}){try{if(i80())return!1;if(v1($)===null)return!1;let J=Z.seenFile??in0(),X=null;try{let Q=JSON.parse(mO(J,"utf-8")).version;if(typeof Q==="string"&&v1(Q)!==null)X=Q}catch{}if(X!==null&&!BG($,X))return!1;try{Zk(kQ(J),{recursive:!0}),Jk(J,JSON.stringify({version:$}),"utf-8")}catch{return!1}if(X===null)return!1;return(Z.write??((Q)=>process.stderr.write(Q)))(`Loki Mode upgraded ${X} -> ${$}. What is new: https://github.com/asklokesh/loki-mode/releases/tag/v${$}
3
3
  `),!0}catch{return!1}}function nn0($){let Z=$.replace(/\\/g,"/");if(Z.includes("/Cellar/"))return"brew upgrade loki-mode";if(/\/pnpm\//.test(Z)||Z.includes("/.pnpm/"))return"pnpm add -g loki-mode (or npm i -g loki-mode)";if(Z.includes("/yarn/global/")||Z.includes("/.yarn/"))return"yarn global add loki-mode (or npm i -g loki-mode)";if(Z.includes("/.bun/"))return"bun install -g loki-mode (or npm i -g loki-mode)";if(Z.includes("/lib/node_modules/"))return"npm i -g loki-mode (or bun install -g loki-mode)";if(Z.includes("/homebrew/"))return"brew upgrade loki-mode";return"bun install -g loki-mode (or npm i -g loki-mode)"}async function n80($,Z={}){try{if(i80())return;if(v1($)===null)return;let J=Z.write??((Q)=>process.stderr.write(Q));an0($,{write:J,...Z.cacheFile?{seenFile:$k(kQ(Z.cacheFile),"last-seen-version.json")}:{}});let X=ln0($,Z.env??process.env);if(X!==null){J(`Loki Mode ${X.version} is installed but not the one running (you are running ${$}).
4
4
  Another loki earlier on PATH is winning. Newer copy: ${X.path}
5
5
  Run \`which -a loki\` to see the order, then remove or re-point the earlier entry.
@@ -3307,4 +3307,4 @@ Unknown commands exit 2 with a suggestion; run 'loki help' for the full list.
3307
3307
  `);{let{suggestCommand:X}=await Promise.resolve().then(() => (u5(),D90)),Y=Z===void 0?void 0:X(Z);if(Y)process.stderr.write(`Did you mean 'loki ${Y}'?
3308
3308
  `)}return process.stderr.write(Gn0),2}}Ek0();var Hn0=()=>globalThis[Symbol.for("loki.ownsStopSignals")]===!0;process.on("SIGINT",()=>{if(!Hn0())process.exit(130)});process.on("SIGTERM",()=>{if(!Hn0())process.exit(143)});var Wb9=await Qb9(Bun.argv.slice(2));process.exit(Wb9);
3309
3309
 
3310
- //# debugId=7450DD724FB109625F5137770199A178
3310
+ //# debugId=AE8E22AF80E28FF347C7894F2E2E82BF
package/mcp/__init__.py CHANGED
@@ -75,4 +75,4 @@ try:
75
75
  except ImportError:
76
76
  __all__ = ['mcp']
77
77
 
78
- __version__ = '11.74.1'
78
+ __version__ = '11.75.1'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "loki-mode",
3
3
  "mcpName": "io.github.asklokesh/loki-mode",
4
- "version": "11.74.1",
4
+ "version": "11.75.1",
5
5
  "description": "An autonomous software factory that knows what it is supposed to deliver, and proves it did.",
6
6
  "keywords": [
7
7
  "agent",
@@ -160,5 +160,5 @@
160
160
  "dependencies": {
161
161
  "@resvg/resvg-wasm": "^2.6.2"
162
162
  },
163
- "gitHead": "7047b19ed2da1a3e41e4d76e1b01a287368c8a6a"
163
+ "gitHead": "ef781549cb5f72d58cfdb943a978d3980672aa3c"
164
164
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "loki-mode",
4
4
  "displayName": "Loki Mode",
5
- "version": "11.74.1",
5
+ "version": "11.75.1",
6
6
  "description": "Autonomous spec-to-product build system with a built-in trust layer (RARV-C closure loop, 8 quality gates, completion council). Ships Loki's spec-hardening, drift-detection, and deterministic PR verification commands plus the Loki MCP server.",
7
7
  "author": {
8
8
  "name": "Autonomi",
@@ -139,6 +139,5 @@ the next reader does not mistake a green test suite for a working feature.
139
139
 
140
140
  If you need a new blocking gate, it is an engine change: add the phase to
141
141
  `autonomy/run.sh`, give it an opt-out flag matching the `LOKI_GATE_*` convention
142
- in `skills/quality-gates.md`, and mirror it on the Bun route. Follow
143
- `skills/sdlc-fleet.md` -- a new gate is a non-trivial change and needs the
144
- council.
142
+ in `skills/quality-gates.md`, and mirror it on the Bun route. A new gate is a
143
+ non-trivial change and needs council review.
@@ -32,11 +32,6 @@ file, how many things run at once, what a blocked team does). It does not
32
32
  restate the release procedure, which lives in `skills/release-cadence.md` and,
33
33
  authoritatively, in the CLAUDE.md "Release Workflow" section.
34
34
 
35
- **Relationship to `skills/sdlc-fleet.md`:** that module defines the six roles
36
- for ONE change. This module defines what happens when several such fleets run
37
- concurrently. Read sdlc-fleet.md for the roles; read this one for the traffic
38
- rules between them.
39
-
40
35
  **REGISTRATION REQUIRED (blocking).** `tests/test-skill-doc-accuracy.sh` check 4
41
36
  loops every `skills/*.md` and FAILS any file that `SKILL.md` does not
42
37
  link. Measured on creation: the suite went from 57 passed / 0 failed to 57
@@ -75,16 +70,16 @@ coordination failure in this repo has been a role acting outside its column.
75
70
 
76
71
  | Role | DECIDES (binding) | ADVISES (non-binding) |
77
72
  |---|---|---|
78
- | **Chief of Staff** (the integrator session) | Work partition and file ownership; WIP admission; when to escalate to the founder; integration of parallel outputs | Implementation approach inside a team's slice |
73
+ | **Coordinator** (the integrator session) | Work partition and file ownership; WIP admission; when to escalate to the project owner; integration of parallel outputs | Implementation approach inside a team's slice |
79
74
  | **PM** (per workstream) | Scope and acceptance criteria for its workstream; accepts or rejects the delivered slice against those criteria | Sequencing relative to other workstreams (the CoS decides that) |
80
75
  | **Dev Fleet** (3-5 engineers, parallel) | Implementation detail within an owned file set | Scope changes; anything touching a file it does not own |
81
76
  | **SDET** | Whether a test actually exercises the acceptance criterion | Whether the feature ships (that is the council's call) |
82
77
  | **Council Reviewers** (3, parallel) | SHIP / NO-SHIP. Unanimous APPROVE required | Style preferences, which are findings, not vetoes |
83
- | **Release Captain** | When the VERSION bump is pushed, and sole ownership of main during a release window | Content of the release (the PM and council settled that already) |
78
+ | **Release owner** | When the VERSION bump is pushed, and sole ownership of main during a release window | Content of the release (the PM and council settled that already) |
84
79
 
85
80
  Three rules that follow, each of which this repo has broken and paid for:
86
81
 
87
- **The Chief of Staff does not write code in a file an agent owns.** Not a
82
+ **The coordinator does not write code in a file an agent owns.** Not a
88
83
  one-line fix, not while the agent looks idle. An agent holds the file's prior
89
84
  content and writes whole regions from its own buffer; an edit made underneath
90
85
  it vanishes with no conflict and no error. Measured on 2026-08-08: a
@@ -95,13 +90,11 @@ nothing protects the lead. If a requirement has not landed after two asks, the
95
90
  fix is a third message carrying a measured number and the exact distinction
96
91
  wanted, not an edit.
97
92
 
98
- **The council decides ship, and 2-of-3 is never acceptable.** This is
99
- inherited verbatim from `skills/sdlc-fleet.md:83` and CLAUDE.md's standing
100
- fleet pattern. A CONCERN or REJECT sends the integrator to the source to
93
+ **The council decides ship, and 2-of-3 is never acceptable.** A CONCERN or REJECT sends the integrator to the source to
101
94
  validate it; a valid concern means fix and RE-RUN the entire council, not
102
95
  patch and count votes again.
103
96
 
104
- **The Release Captain owns main during a release window.** See section 5.
97
+ **The release owner owns main during a release window.** See section 5.
105
98
 
106
99
  ---
107
100
 
@@ -119,7 +112,7 @@ ownership and the only collision that occurred was the one the lead created by
119
112
  editing an owned file directly.
120
113
 
121
114
  An agent that needs a change in a file it does not own does not make the
122
- change. It reports the required change to the Chief of Staff, who routes it to
115
+ change. It reports the required change to the coordinator, who routes it to
123
116
  the owner. A cross-cutting change with no single owner is a signal the
124
117
  partition is wrong; re-partition rather than letting two agents negotiate.
125
118
 
@@ -239,8 +232,8 @@ Route by the KIND of block:
239
232
 
240
233
  | Block | Action | Never |
241
234
  |---|---|---|
242
- | Needs an edit in a file another agent owns | Report the required change to the Chief of Staff with the exact diff intent; continue on the rest of the owned slice | Edit it yourself |
243
- | Ambiguous scope | Escalate to the PM, who uses `AskUserQuestion` to lock it. Per `skills/sdlc-fleet.md:40`, NEVER guess at scope | Pick an interpretation and build |
235
+ | Needs an edit in a file another agent owns | Report the required change to the coordinator with the exact diff intent; continue on the rest of the owned slice | Edit it yourself |
236
+ | Ambiguous scope | Escalate to the PM, who uses `AskUserQuestion` to lock it. NEVER guess at scope | Pick an interpretation and build |
244
237
  | Gate is red | Read the actual assertion and the whole guard above it before bisecting; the assertion type names the failing line | Call it environmental |
245
238
  | Gate red and unreproducible | Re-run on the IDENTICAL SHA first. A rerun proves flake AND diff-innocence for free | Edit the test to make it pass |
246
239
  | Blocked on a gate run held by another stream | Queue behind it and do useful non-gate work (plan the next item, write the test, draft the brief) | Start a second concurrent gate run |
@@ -374,7 +367,7 @@ shard 1). A red nobody can clear is how the team learns to ignore reds.
374
367
  ## 5. Release windows: main is WIP=1
375
368
 
376
369
  When a VERSION bump is pushed, main enters a release window that closes only
377
- when npm shows the new version. Inside that window the Release Captain owns
370
+ when npm shows the new version. Inside that window the release owner owns
378
371
  main and NOBODY else pushes to it, including docs.
379
372
 
380
373
  D102 update: `release.yml` no longer has a `required-ci` job; `publish-npm` needs only
@@ -400,7 +393,7 @@ procedure and its recovery paths.
400
393
 
401
394
  Several agent processes run against this checkout at once. On 2026-08-07 a
402
395
  parallel process force-reset main to a different lineage and five commits
403
- vanished from the remote, including one already reported to the founder as
396
+ vanished from the remote, including one already reported as
404
397
  landed with CI running against it.
405
398
 
406
399
  - Before claiming a push landed, check ANCESTRY, not equality:
@@ -438,7 +431,7 @@ harder.
438
431
  | 6 | `grep -rn ... --include=*.sh` for a precedent | no output, `rc=0` | the search never ran | zsh expanded `--include=*.sh` as a glob, found no match, and aborted the command before grep started |
439
432
 
440
433
  Instance 5 is the most dangerous of the set: it nearly shipped a false release
441
- announcement to the founder. It was caught only because the operator fetched
434
+ announcement. It was caught only because the operator fetched
442
435
  origin and compared SHAs instead of trusting the exit code. See section 4.2.
443
436
 
444
437
  Instance 6 is instructive because it is the cheapest possible version of the
@@ -52,7 +52,7 @@ each citation also names a string or label to grep.
52
52
 
53
53
  **The FAST tier is the release gate. The FULL tier is not a blocker.**
54
54
 
55
- That is the founder decision of 2026-07-31, recorded in CLAUDE.md under a
55
+ That is the project policy of 2026-07-31, recorded in CLAUDE.md under a
56
56
  header that says so explicitly: "Local CI Before Every Push (2026-07-31 mandate
57
57
  -- SUPERSEDES 2026-04-26)".
58
58
 
@@ -380,7 +380,7 @@ green job is not yet proof the version is fetchable.
380
380
 
381
381
  ## 6. The cadence, end to end
382
382
 
383
- 1. **Scope locked** by the PM. No guessing (`skills/sdlc-fleet.md:40`).
383
+ 1. **Scope locked** by the PM. No guessing.
384
384
  2. **Build** inside owned file sets, at most 3 streams
385
385
  (`skills/factory-operations.md` section 3).
386
386
  3. **Council**: unanimous 3-of-3 APPROVE. Any CONCERN or REJECT means fix and
@@ -1,4 +1,4 @@
1
- import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-C5sRHsGA.js";import{B as C}from"./Button-BTMAbQBv.js";import{T as $e}from"./trending-up-BV8fTyhT.js";import{C as z}from"./clock-D1nWLjJm.js";import{A as Be,U as ue,M as De}from"./Avatar-EEiOX0Y0.js";import{A as J}from"./activity-CsVLJUZG.js";import{R as pe}from"./refresh-cw-Dq_1uZWi.js";import{G as ze}from"./globe-BvCLfBOs.js";import{C as Le}from"./chevron-left-CiX3YEuG.js";import{C as je}from"./check-Dy8Lpprr.js";import{D as Y}from"./dollar-sign-cup3uE0C.js";import{U as Te}from"./user-DblryVAt.js";import{D as Me}from"./database-0lcGHtpv.js";import{L as Ue}from"./lock-D_CuUhM7.js";import{S as Re}from"./scroll-text-DrYmLoL4.js";import{S as Ie}from"./shield-alert-DOZLbVQY.js";/**
1
+ import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-lcoI1_Kk.js";import{B as C}from"./Button-ynznk0At.js";import{T as $e}from"./trending-up-AixETdKR.js";import{C as z}from"./clock-B7bJcVIC.js";import{A as Be,U as ue,M as De}from"./Avatar-Q14AHox9.js";import{A as J}from"./activity-Ct1Updr6.js";import{R as pe}from"./refresh-cw-DLG3hyAi.js";import{G as ze}from"./globe-CGyB90kK.js";import{C as Le}from"./chevron-left-Lxnkl8Qg.js";import{C as je}from"./check-zacnZHyC.js";import{D as Y}from"./dollar-sign-DjDiG-37.js";import{U as Te}from"./user-SK-YguQ6.js";import{D as Me}from"./database-Da2GkEIN.js";import{L as Ue}from"./lock-BBkw5NJx.js";import{S as Re}from"./scroll-text-BtIL3cNk.js";import{S as Ie}from"./shield-alert-K5JXzFKg.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as l,j as s}from"./index-C5sRHsGA.js";/**
1
+ import{c as l,j as s}from"./index-lcoI1_Kk.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{j as e}from"./index-C5sRHsGA.js";import{C as r}from"./clock-D1nWLjJm.js";import{C as a}from"./circle-alert-Bm2AEdEx.js";import{C as l}from"./check-Dy8Lpprr.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
1
+ import{j as e}from"./index-lcoI1_Kk.js";import{C as r}from"./clock-B7bJcVIC.js";import{C as a}from"./circle-alert-DoqSdQdB.js";import{C as l}from"./check-zacnZHyC.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
@@ -1 +1 @@
1
- import{r as p,j as t}from"./index-C5sRHsGA.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
1
+ import{r as p,j as t}from"./index-lcoI1_Kk.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
@@ -1,4 +1,4 @@
1
- import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-C5sRHsGA.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-DGIdCZdm.js";import{C as qe,F as Ge,M as Ue,H as Ke,a as We,G as Ve,T as Qe}from"./thumbs-up-CUKmG90b.js";import{C as oe}from"./check-Dy8Lpprr.js";import{C as Ye}from"./clock-D1nWLjJm.js";import{D as Xe}from"./dollar-sign-cup3uE0C.js";import{U as Ze}from"./upload-DsSmwrGn.js";import{L as V}from"./loader-circle-wH9n2Xbt.js";/**
1
+ import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-lcoI1_Kk.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-DdBPd_Lq.js";import{C as qe,F as Ge,M as Ue,H as Ke,a as We,G as Ve,T as Qe}from"./thumbs-up-CHCVyJdw.js";import{C as oe}from"./check-zacnZHyC.js";import{C as Ye}from"./clock-B7bJcVIC.js";import{D as Xe}from"./dollar-sign-DjDiG-37.js";import{U as Ze}from"./upload-VCbjFn2H.js";import{L as V}from"./loader-circle-CdcI0FeS.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as o,j as e}from"./index-C5sRHsGA.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
1
+ import{r as o,j as e}from"./index-lcoI1_Kk.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
@@ -1,4 +1,4 @@
1
- import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-C5sRHsGA.js";/**
1
+ import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-lcoI1_Kk.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as l,a as x,j as e}from"./index-C5sRHsGA.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
1
+ import{r as l,a as x,j as e}from"./index-lcoI1_Kk.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
@@ -1,4 +1,4 @@
1
- import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-C5sRHsGA.js";import{B as N}from"./Button-BTMAbQBv.js";import{C as y}from"./thumbs-up-CUKmG90b.js";import{R as S}from"./refresh-cw-Dq_1uZWi.js";import{C as z}from"./circle-alert-Bm2AEdEx.js";import{U as D}from"./user-DblryVAt.js";import{L as G}from"./loader-circle-wH9n2Xbt.js";import{R as T}from"./rotate-ccw-Dyzxf9m5.js";/**
1
+ import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-lcoI1_Kk.js";import{B as N}from"./Button-ynznk0At.js";import{C as y}from"./thumbs-up-CHCVyJdw.js";import{R as S}from"./refresh-cw-DLG3hyAi.js";import{C as z}from"./circle-alert-DoqSdQdB.js";import{U as D}from"./user-SK-YguQ6.js";import{L as G}from"./loader-circle-CdcI0FeS.js";import{R as T}from"./rotate-ccw-Bqau4R_S.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-C5sRHsGA.js";import{B as y}from"./Button-BTMAbQBv.js";import{C as ge}from"./chevron-left-CiX3YEuG.js";import{G as P}from"./thumbs-up-CUKmG90b.js";import{R as $}from"./refresh-cw-Dq_1uZWi.js";import{C as Ne}from"./circle-alert-Bm2AEdEx.js";import{L as Q,S as je}from"./ProjectPage-BtF37a4e.js";import{S as se}from"./shield-alert-DOZLbVQY.js";import{F as ye}from"./file-code-corner-jPdCMfoJ.js";import{C as V}from"./clock-D1nWLjJm.js";import{C as re}from"./check-Dy8Lpprr.js";import"./ErrorBoundary-DGIdCZdm.js";import"./TerminalOutput-DYgZnII2.js";import"./lock-D_CuUhM7.js";import"./package-137A8C6B.js";import"./file-plus-CncZcY9z.js";import"./activity-CsVLJUZG.js";import"./scroll-text-DrYmLoL4.js";import"./bot-BaAaPto-.js";import"./loader-circle-wH9n2Xbt.js";import"./hammer-CG7gCbza.js";import"./dollar-sign-cup3uE0C.js";import"./globe-BvCLfBOs.js";import"./trash-2-Cxx8CMS1.js";import"./upload-DsSmwrGn.js";import"./plus-QVF6Q3NZ.js";import"./rotate-ccw-Dyzxf9m5.js";import"./code-xml-Crt8tNsY.js";import"./trending-up-BV8fTyhT.js";import"./layers-BPIeLcUT.js";import"./trending-down-CU5sNvAx.js";import"./server-QWBqdl1e.js";/**
1
+ import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-lcoI1_Kk.js";import{B as y}from"./Button-ynznk0At.js";import{C as ge}from"./chevron-left-Lxnkl8Qg.js";import{G as P}from"./thumbs-up-CHCVyJdw.js";import{R as $}from"./refresh-cw-DLG3hyAi.js";import{C as Ne}from"./circle-alert-DoqSdQdB.js";import{L as Q,S as je}from"./ProjectPage-D60UURaH.js";import{S as se}from"./shield-alert-K5JXzFKg.js";import{F as ye}from"./file-code-corner-CSL-Jij-.js";import{C as V}from"./clock-B7bJcVIC.js";import{C as re}from"./check-zacnZHyC.js";import"./ErrorBoundary-DdBPd_Lq.js";import"./TerminalOutput-CufG9YzF.js";import"./lock-BBkw5NJx.js";import"./package-BpPRO3LM.js";import"./file-plus-02DRA8pV.js";import"./activity-Ct1Updr6.js";import"./scroll-text-BtIL3cNk.js";import"./bot-DzeqEI-b.js";import"./loader-circle-CdcI0FeS.js";import"./hammer-BaQB96TG.js";import"./dollar-sign-DjDiG-37.js";import"./globe-CGyB90kK.js";import"./trash-2-DncNxVq0.js";import"./upload-VCbjFn2H.js";import"./plus-D7XbyK29.js";import"./rotate-ccw-Bqau4R_S.js";import"./code-xml-CAZEZ9T8.js";import"./trending-up-AixETdKR.js";import"./layers-BWJBvoeg.js";import"./trending-down-D8Bp0azX.js";import"./server-tZCmZ4yH.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.