loki-mode 11.74.2 → 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-jkjilfbl.js → AdminPage-xKgtIhk2.js} +1 -1
  49. package/web-app/dist/assets/{Avatar-bd5JWkSJ.js → Avatar-Q14AHox9.js} +1 -1
  50. package/web-app/dist/assets/{Badge-DVRit2Xw.js → Badge-yk5M-lip.js} +1 -1
  51. package/web-app/dist/assets/{Button-BNAB-pVZ.js → Button-ynznk0At.js} +1 -1
  52. package/web-app/dist/assets/{CockpitPage-DpG29h_w.js → CockpitPage-C8B765za.js} +1 -1
  53. package/web-app/dist/assets/{ComparePage-Dasg5V41.js → ComparePage-DqzmWKnf.js} +1 -1
  54. package/web-app/dist/assets/{ErrorBoundary-DJojse6b.js → ErrorBoundary-DdBPd_Lq.js} +1 -1
  55. package/web-app/dist/assets/{EvidenceReceiptPanel-Blxw7_u1.js → EvidenceReceiptPanel-jb4Tp38b.js} +1 -1
  56. package/web-app/dist/assets/{GitHubIssuesPanel-BBvSFj80.js → GitHubIssuesPanel-xJQiLcxs.js} +1 -1
  57. package/web-app/dist/assets/{GitHubPRsPanel-BCIKeSBg.js → GitHubPRsPanel-84W3Dhk_.js} +1 -1
  58. package/web-app/dist/assets/{HomePage-C7d__oNG.js → HomePage-St1Xl2tu.js} +2 -2
  59. package/web-app/dist/assets/{LoginPage-BXljL3yY.js → LoginPage-jRt0NUHb.js} +1 -1
  60. package/web-app/dist/assets/{MagicPage-Xjkts_yE.js → MagicPage-CQLFe7LR.js} +1 -1
  61. package/web-app/dist/assets/{MetricsPage-kQvVp-j2.js → MetricsPage-zzX9eTC5.js} +1 -1
  62. package/web-app/dist/assets/{NotFoundPage-D-4ZlEaO.js → NotFoundPage-DDu023SY.js} +1 -1
  63. package/web-app/dist/assets/{ProjectPage-DfzR5RXP.js → ProjectPage-D60UURaH.js} +3 -3
  64. package/web-app/dist/assets/{ProjectsPage-DFDsWzkV.js → ProjectsPage-DqVsKxlt.js} +1 -1
  65. package/web-app/dist/assets/{SettingsPage-CLPIoYT3.js → SettingsPage-G7pPKvo0.js} +1 -1
  66. package/web-app/dist/assets/{ShowcasePage-PZKkyGeY.js → ShowcasePage-CrU_aKgS.js} +1 -1
  67. package/web-app/dist/assets/{SystemSettingsPage-BsBlcnzo.js → SystemSettingsPage-ClKGQFsB.js} +1 -1
  68. package/web-app/dist/assets/{TeamsPage-BSjgNhoU.js → TeamsPage-B530vSNe.js} +1 -1
  69. package/web-app/dist/assets/{TemplatesPage-W2KeAzbg.js → TemplatesPage-COmv_Cqd.js} +1 -1
  70. package/web-app/dist/assets/{TerminalOutput-BjroTiCC.js → TerminalOutput-CufG9YzF.js} +1 -1
  71. package/web-app/dist/assets/{activity-BXZ5YYes.js → activity-Ct1Updr6.js} +1 -1
  72. package/web-app/dist/assets/{bell-D1urp5pa.js → bell-rcvhQuGr.js} +1 -1
  73. package/web-app/dist/assets/{bot-Chedf2bF.js → bot-DzeqEI-b.js} +1 -1
  74. package/web-app/dist/assets/{check-DhaCuOCV.js → check-zacnZHyC.js} +1 -1
  75. package/web-app/dist/assets/{chevron-left-D7BpQyA6.js → chevron-left-Lxnkl8Qg.js} +1 -1
  76. package/web-app/dist/assets/{circle-alert-DnGvQ_AQ.js → circle-alert-DoqSdQdB.js} +1 -1
  77. package/web-app/dist/assets/{clock-CqfxWhHM.js → clock-B7bJcVIC.js} +1 -1
  78. package/web-app/dist/assets/{cloud-BKxp5AWB.js → cloud-DdA9Bu6q.js} +1 -1
  79. package/web-app/dist/assets/{code-xml-BDQ6GBtt.js → code-xml-CAZEZ9T8.js} +1 -1
  80. package/web-app/dist/assets/{database-BmpEx1y_.js → database-Da2GkEIN.js} +1 -1
  81. package/web-app/dist/assets/{dollar-sign-DYNY9R_C.js → dollar-sign-DjDiG-37.js} +1 -1
  82. package/web-app/dist/assets/{file-code-corner-BJi0IBFd.js → file-code-corner-CSL-Jij-.js} +1 -1
  83. package/web-app/dist/assets/{file-plus-Dqyb2bcQ.js → file-plus-02DRA8pV.js} +1 -1
  84. package/web-app/dist/assets/{globe-DPh4RWfM.js → globe-CGyB90kK.js} +1 -1
  85. package/web-app/dist/assets/{hammer-B3xnuoA1.js → hammer-BaQB96TG.js} +1 -1
  86. package/web-app/dist/assets/{index-BpX8DcTr.js → index-lcoI1_Kk.js} +3 -3
  87. package/web-app/dist/assets/{layers-BRCmyCW8.js → layers-BWJBvoeg.js} +1 -1
  88. package/web-app/dist/assets/{loader-circle-n07Pky0M.js → loader-circle-CdcI0FeS.js} +1 -1
  89. package/web-app/dist/assets/{lock-BWqOuQmS.js → lock-BBkw5NJx.js} +1 -1
  90. package/web-app/dist/assets/{package-BJlB_Z-Z.js → package-BpPRO3LM.js} +1 -1
  91. package/web-app/dist/assets/{plus-oH17BZu2.js → plus-D7XbyK29.js} +1 -1
  92. package/web-app/dist/assets/{refresh-cw-CPQ476LL.js → refresh-cw-DLG3hyAi.js} +1 -1
  93. package/web-app/dist/assets/{rotate-ccw-7hLvOcnS.js → rotate-ccw-Bqau4R_S.js} +1 -1
  94. package/web-app/dist/assets/{scroll-text-BCmLauQn.js → scroll-text-BtIL3cNk.js} +1 -1
  95. package/web-app/dist/assets/{server-DfTfvW84.js → server-tZCmZ4yH.js} +1 -1
  96. package/web-app/dist/assets/{shield-alert-CaeGRq19.js → shield-alert-K5JXzFKg.js} +1 -1
  97. package/web-app/dist/assets/{thumbs-up-Dz-l2GPC.js → thumbs-up-CHCVyJdw.js} +1 -1
  98. package/web-app/dist/assets/{trash-2-B-OsDmSo.js → trash-2-DncNxVq0.js} +1 -1
  99. package/web-app/dist/assets/{trending-down-CXTFOxzq.js → trending-down-D8Bp0azX.js} +1 -1
  100. package/web-app/dist/assets/{trending-up-FQEdqr3v.js → trending-up-AixETdKR.js} +1 -1
  101. package/web-app/dist/assets/{upload-CacWSNTg.js → upload-VCbjFn2H.js} +1 -1
  102. package/web-app/dist/assets/{usePolling-cIjZ9qd2.js → usePolling-CQvKD2Jj.js} +1 -1
  103. package/web-app/dist/assets/{user-DAouWFHi.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 -2026
  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
package/README.md CHANGED
@@ -138,7 +138,7 @@ loki control backfill . # load existing ./.loki/runs
138
138
  loki control status # reachable? how many runs?
139
139
  ```
140
140
 
141
- While it is running, runs on this machine ship to it automatically. Guides: [docs/v10/CONTROL-PLANE.md](docs/v10/CONTROL-PLANE.md), [container, Helm and ECS](docs/control-plane-container.md), [migrating from the old dashboard](docs/control-plane-migration.md).
141
+ While it is running, runs on this machine ship to it automatically. Guides: [container, Helm and ECS](docs/control-plane-container.md), [migrating from the old dashboard](docs/control-plane-migration.md).
142
142
 
143
143
  ## Requirements
144
144
 
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: Runs an autonomous software factory that knows what it is supposed to deliver and proves it did, with a signed receipt. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
4
4
  ---
5
5
 
6
- # Loki Mode v11.74.2
6
+ # Loki Mode v11.75.1
7
7
 
8
8
  **Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the previous bash loop. PRD-file starts (`loki start ./prd.md`) and the opencode provider still run on it until FC38-SWEEP ports them; the legacy-engine command and the LOKI_ENGINE switch remain removed. Prefer `loki owner/repo#N` for issues.
9
9
 
@@ -208,7 +208,6 @@ Pick modules from this table, one hop from here. Each module over 100 lines open
208
208
  | Legacy healing, modernization | [healing.md](skills/healing.md) |
209
209
  | Plan deepening, knowledge extraction | [compound-learning.md](skills/compound-learning.md) |
210
210
  | Managed Agents memory, council, flag hierarchy | [memory.md](skills/memory.md) |
211
- | Non-trivial change (>3 files, MINOR/MAJOR) | [sdlc-fleet.md](skills/sdlc-fleet.md) |
212
211
  | Several agent teams at once, WIP limits | [factory-operations.md](skills/factory-operations.md) |
213
212
  | Release, version bump, publish check | [release-cadence.md](skills/release-cadence.md) |
214
213
  | Adding your own gate, reviewer or agent | [extending.md](skills/extending.md) |
@@ -476,4 +475,4 @@ Implemented, planned and deprecated items, with the version each landed in: `ski
476
475
 
477
476
  ---
478
477
 
479
- **v11.74.2 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
478
+ **v11.75.1 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.74.2
1
+ 11.75.1
@@ -19,7 +19,7 @@
19
19
  # - Multi-agent debate: Voting beats unanimous (+13.2%), KS adaptive stopping
20
20
  # - NVIDIA ToolOrchestra: Efficiency metrics for agent tool use
21
21
  #
22
- # Inline Python (D7): the council runs with the cwd inside the agent's repo, so
22
+ # Inline Python: the council runs with the cwd inside the agent's repo, so
23
23
  # every "python3 -c" / "python3 -" here runs -E (a PYTHONPATH empty component
24
24
  # would load a committed sitecustomize.py) and drops '' and '.' from sys.path
25
25
  # before any other import (a committed json.py would print the verdict).
@@ -251,7 +251,7 @@ council_augment_from_managed_memory() {
251
251
  return 0
252
252
  fi
253
253
  local target_dir="${TARGET_DIR:-.}"
254
- # D7: never fall back to the cwd. The council runs with cwd inside the
254
+ # never fall back to the cwd. The council runs with cwd inside the
255
255
  # agent's own repo, which can ship its own memory/managed_memory package
256
256
  # that shadows the real one -- `${PROJECT_DIR:-$(pwd)}` would `cd` into
257
257
  # that repo and `python3 -m memory.managed_memory.retrieve` would import
@@ -1412,7 +1412,7 @@ council_checklist_gate() {
1412
1412
  # than the old `|| echo PASS`, which cleared the first hard gate on a broken
1413
1413
  # host. (Absent python is a real deployment problem; failing open here is
1414
1414
  # exactly the fake-green this gate exists to prevent.)
1415
- # S-141: resolved -I -S interpreter (see _loki_snapshot_py_tool); a bare
1415
+ # resolved -I -S interpreter (see _loki_snapshot_py_tool); a bare
1416
1416
  # python3 -E still runs user-site .pth lines that can forge json.load.
1417
1417
  local _gate_py
1418
1418
  if ! _gate_py="$(_loki_snapshot_py_tool)"; then
@@ -1563,7 +1563,7 @@ council_heldout_gate() {
1563
1563
  # The failing titles are NOT carried in this line (a checklist title may
1564
1564
  # contain ':' or '|'); they are read separately from the held-out JSON block
1565
1565
  # below in the BLOCK branch.
1566
- # S-141: resolved -I -S interpreter. None resolvable -> "BLOCK 0 1" and fall
1566
+ # resolved -I -S interpreter. None resolvable -> "BLOCK 0 1" and fall
1567
1567
  # through, so the BLOCK branch still records its trust event and block file.
1568
1568
  local gate_result _heldout_py
1569
1569
  if ! _heldout_py="$(_loki_snapshot_py_tool)"; then
@@ -1890,7 +1890,7 @@ _council_trivial_diff() {
1890
1890
  }
1891
1891
 
1892
1892
  council_evidence_gate() {
1893
- # P2 (S-116): when the caller sets _LOKI_EVIDENCE_REQUIRE_TESTS=1, inconclusive
1893
+ # P2: when the caller sets _LOKI_EVIDENCE_REQUIRE_TESTS=1, inconclusive
1894
1894
  # test evidence blocks instead of passing through. council_evaluate sets it as
1895
1895
  # a function-local (bash dynamic scope, gone on return), so the vote alone can
1896
1896
  # never approve while every other caller keeps the old pass-through rc.
@@ -4283,7 +4283,7 @@ council_evaluate() {
4283
4283
  if declare -f loki_council_dispatch_agents >/dev/null 2>&1; then
4284
4284
  if loki_council_dispatch_agents "$ITERATION_COUNT" "${COUNCIL_PRD_PATH:-}"; then
4285
4285
  local _va_round_file="$COUNCIL_STATE_DIR/votes/round-${ITERATION_COUNT}.json"
4286
- # S-141: resolved -I -S interpreter. Dispatch succeeded, so an
4286
+ # resolved -I -S interpreter. Dispatch succeeded, so an
4287
4287
  # unreadable round file is CONTINUE, never a fall-through to the
4288
4288
  # heuristic path that could still reach COMPLETE.
4289
4289
  local _va_py=""
@@ -4405,7 +4405,7 @@ council_managed_should_stop() {
4405
4405
  return 1
4406
4406
  fi
4407
4407
 
4408
- # S-196: every reader and the session heredoc run on the resolved -I -S
4408
+ # every reader and the session heredoc run on the resolved -I -S
4409
4409
  # interpreter (see _loki_snapshot_py_tool); -E still loads user-site .pth
4410
4410
  # files. None resolvable -> never start the managed session: Bash fallback.
4411
4411
  # Deliberate consequence: -S hides site-packages, so the anthropic SDK is
@@ -4426,7 +4426,7 @@ council_managed_should_stop() {
4426
4426
 
4427
4427
  # Build session context: diff_summary, test_summary, pending_tasks.
4428
4428
  # Kept deliberately small so we never choke the session budget.
4429
- # S-196: diff the target project (same root as loki_dir and
4429
+ # diff the target project (same root as loki_dir and
4430
4430
  # LOKI_TARGET_DIR), never PROJECT_DIR, which is Loki's install tree.
4431
4431
  local diff_summary=""
4432
4432
  diff_summary=$(cd "${TARGET_DIR:-.}" 2>/dev/null && git diff --stat 2>/dev/null | tail -20 | tr '\n' ' ' || echo "")
@@ -4472,7 +4472,7 @@ import sys; sys.path[:] = [p for p in sys.path if p not in ("", ".")]
4472
4472
  import json, os, sys, pathlib
4473
4473
 
4474
4474
  # Path setup: import providers.managed only from an explicit PROJECT_DIR. Never
4475
- # fall back to the cwd (D7): it is the agent's repo, which could ship its own
4475
+ # fall back to the cwd: it is the agent's repo, which could ship its own
4476
4476
  # providers/managed.py. Unset -> ImportError -> the Bash voting path.
4477
4477
  project_dir = os.environ.get("PROJECT_DIR", "")
4478
4478
  if project_dir:
@@ -4859,7 +4859,7 @@ council_should_stop() {
4859
4859
  # managed memory store. Backgrounded + silent; flags gate the work
4860
4860
  # inside the Python module so no-op when off.
4861
4861
  #
4862
- # D7: never fall back to the cwd. Identical threat model to
4862
+ # never fall back to the cwd. Identical threat model to
4863
4863
  # council_augment_from_managed_memory (BACKLOG 63) but more severe:
4864
4864
  # this call EXECUTES memory.managed_memory.shadow_write as a module,
4865
4865
  # not just imports one for reading, so `cd "${PROJECT_DIR:-$(pwd)}"`
@@ -19,7 +19,7 @@
19
19
  # - swarm/sycophancy.py (sycophancy detection)
20
20
  # - swarm/calibration.py (reviewer calibration)
21
21
  #
22
- # Inline Python (D7): the council runs with the cwd inside the agent's repo, so
22
+ # Inline Python: the council runs with the cwd inside the agent's repo, so
23
23
  # every python here drops '' and '.' from sys.path before any other import (the
24
24
  # swarm dir is inserted after that); a committed json.py or sitecustomize.py
25
25
  # cannot read the votes. Pinned by tests/test-council-no-fabricated-verdict.sh
@@ -76,7 +76,7 @@ council_v2_vote() {
76
76
  local iteration="${4:-0}"
77
77
 
78
78
  local council_size="${COUNCIL_SIZE:-3}"
79
- # S-201: none resolvable -> every read below takes its fail-safe fallback.
79
+ # none resolvable -> every read below takes its fail-safe fallback.
80
80
  local _c2_py
81
81
  _c2_py="$(_loki_snapshot_py_tool)" || _c2_py=""
82
82
 
@@ -180,7 +180,7 @@ import json
180
180
  votes = json.loads(sys.argv[1])
181
181
  print('{:.3f}'.format(detect_sycophancy(votes)))
182
182
  " "$votes_json" 2>/dev/null) || sycophancy_score=""
183
- # S-201: a crashed or missing detector did not measure 0.000. Record the
183
+ # a crashed or missing detector did not measure 0.000. Record the
184
184
  # score as unmeasured (null keeps summary.json valid JSON) so Step 5
185
185
  # challenges instead of reading "independent".
186
186
  case "$sycophancy_score" in
@@ -194,7 +194,7 @@ print('{:.3f}'.format(detect_sycophancy(votes)))
194
194
  if [ "$approve_count" -eq "$council_size" ]; then
195
195
  local threshold="${LOKI_COUNCIL_SYCOPHANCY_THRESHOLD:-0.6}"
196
196
  local should_challenge
197
- # S-201: an unmeasured score, or a compare that cannot run, challenges.
197
+ # an unmeasured score, or a compare that cannot run, challenges.
198
198
  # Only a measured score below the threshold skips the devil's advocate.
199
199
  if [ "$sycophancy_score" = "null" ]; then
200
200
  should_challenge="yes"
package/autonomy/grill.sh CHANGED
@@ -248,7 +248,7 @@ grill_invoke_provider() {
248
248
  _LOKI_PERM_ARGV=(--dangerously-skip-permissions)
249
249
  ! type _loki_claude_permission_argv >/dev/null 2>&1 || _loki_claude_permission_argv
250
250
  local _gr_argv=("${_LOKI_PERM_ARGV[@]}" "--model" "${LOKI_GRILL_MODEL:-sonnet}")
251
- # S8: lean child flags (text-only role, no tools/MCP/slash commands) and
251
+ # lean child flags (text-only role, no tools/MCP/slash commands) and
252
252
  # a ledger line per call via --output-format json (unwrapped below).
253
253
  local _gr_lf _gr_ledger=false
254
254
  if type loki_lean_child_flags >/dev/null 2>&1; then
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # Loki Mode -- the single guarded browser opener (S-103).
2
+ # Loki Mode -- the single guarded browser opener.
3
3
  #
4
4
  # Every place Loki opens a browser MUST go through loki_open_url. Tests and
5
5
  # agent sessions must never pop a browser tab on a developer's machine (a
@@ -72,7 +72,7 @@ HLP
72
72
  }
73
73
 
74
74
 
75
- # /steer: record source=chat and the chat user as actor (D02). Echo loki steer's own
75
+ # /steer: record source=chat and the chat user as actor. Echo loki steer's own
76
76
  # "Steer rev N received" ack; never claim receipt it did not print.
77
77
  _chat_steer() {
78
78
  local loki="$1" msg="$2" out rc=0 first
@@ -239,7 +239,7 @@ cockpit_render() {
239
239
  }
240
240
 
241
241
  #===============================================================================
242
- # E3: keyboard interactivity for `loki cockpit --follow`.
242
+ # keyboard interactivity for `loki cockpit --follow`.
243
243
  # These live here (sourced by cmd_cockpit) so they can be extracted + unit
244
244
  # tested without pulling in the whole autonomy/loki CLI.
245
245
  #===============================================================================
@@ -37,7 +37,7 @@
37
37
  #
38
38
  # No emojis. No em dashes. bash 3.2 safe. Honors `set -uo pipefail`.
39
39
  #
40
- # Inline Python (D7): the gate runs with the cwd inside the agent's repo, so
40
+ # Inline Python: the gate runs with the cwd inside the agent's repo, so
41
41
  # every python3 here drops '' and '.' from sys.path before any other import; a
42
42
  # committed json.py or sitecustomize.py cannot turn the verdict done. Pinned by
43
43
  # tests/test-reuse-done-recognition.sh case (d7).
@@ -318,7 +318,7 @@ reuse_done_recognition_gate() {
318
318
  fi
319
319
  local _test_results="$loki_dir/quality/test-results.json"
320
320
 
321
- # --- Resolve the -I -S interpreter (S-200); none -> inconclusive -> build.
321
+ # --- Resolve the -I -S interpreter; none -> inconclusive -> build.
322
322
  local _dr_py
323
323
  if ! _dr_py="$(_loki_snapshot_py_tool)"; then
324
324
  log_info "Done-recognition: no isolated python3 interpreter resolved; proceeding to build."
@@ -776,7 +776,7 @@ _loki_done_recog_finish() {
776
776
  local parsed="$2"
777
777
  local loki_dir="${TARGET_DIR:-.}/.loki"
778
778
 
779
- # S-200: no -I -S interpreter -> write no done record (the gate then builds).
779
+ # no -I -S interpreter -> write no done record (the gate then builds).
780
780
  local _dr_py
781
781
  _dr_py="$(_loki_snapshot_py_tool)" || return 1
782
782
 
@@ -923,7 +923,7 @@ _loki_done_recog_write_manifest() {
923
923
  local parsed="$2"
924
924
  local loki_dir="${TARGET_DIR:-.}/.loki"
925
925
 
926
- # S-200: no -I -S interpreter -> record nothing as met (full build).
926
+ # no -I -S interpreter -> record nothing as met (full build).
927
927
  local _dr_py
928
928
  _dr_py="$(_loki_snapshot_py_tool)" || return 1
929
929
 
@@ -217,7 +217,7 @@ def collect_efficiency(loki_dir):
217
217
  # real observation, and nulling it would be its own dishonesty (existing
218
218
  # contract: test_genuine_zero_cost_stays_zero_not_null). What is unknown is a
219
219
  # record that never carried the field at all.
220
- # FC-44: a record flagged tokens_measured:false (an ambiguous resumed session) carries no usage keys. One of them makes every
220
+ # a record flagged tokens_measured:false (an ambiguous resumed session) carries no usage keys. One of them makes every
221
221
  # token total NOT RECORDED (None); the flag keys are added only then, so a complete run's dict is unchanged.
222
222
  _unmeasured_tokens = sum(1 for r in _records if r.get("tokens_measured") is False)
223
223
  _any_cost = any("cost_usd" in r for r in _records)
@@ -58,7 +58,7 @@ _LOKI_PINNED_ORIGIN="$_e10_origin"
58
58
 
59
59
  [ "$_LOKI_ORIGIN_PINNED" = "1" ] || die "origin not pinned (_LOKI_ORIGIN_PINNED=1 required)"
60
60
 
61
- # E-41: the eval harness (eval/loki10/harness.py) pins origin to a local bare
61
+ # the eval harness (eval/loki10/harness.py) pins origin to a local bare
62
62
  # repo and scores "PR opened" as a branch landing there. Only an absolute,
63
63
  # colon-free path whose own git dir is itself a bare repo qualifies; anything
64
64
  # else (URL, scp host:path, relative, non-bare, a subdirectory) takes the
@@ -270,7 +270,7 @@ case "$mode" in
270
270
  _e10_gh pr comment "$1" --repo "$_e10_repo" --body-file "$2" || die "gh pr comment failed"
271
271
  ;;
272
272
  issue-comment)
273
- # E-67: a FAILED run with no diff (or no remote) has no PR to open; comment on the issue
273
+ # a FAILED run with no diff (or no remote) has no PR to open; comment on the issue
274
274
  # instead so the run's reason is never silently lost. <issue-ref> is owner/repo#N or #N.
275
275
  # --update: the status projector. One comment carrying the marker below is edited in place (created when absent),
276
276
  # so an issue shows live run state without a new comment per event. Only a comment written by the authenticated
@@ -88,7 +88,7 @@ _loki_prd_enrich_invoke() {
88
88
  local out=""
89
89
  _LOKI_PERM_ARGV=(--dangerously-skip-permissions)
90
90
  ! type _loki_claude_permission_argv >/dev/null 2>&1 || _loki_claude_permission_argv
91
- # S8: lean child flags (no user-scope settings/MCP/tools) + ledger line.
91
+ # lean child flags (no user-scope settings/MCP/tools) + ledger line.
92
92
  type loki_lean_child_flags >/dev/null 2>&1 \
93
93
  || . "$(dirname "${BASH_SOURCE[0]}")/claude-flags.sh" 2>/dev/null || true
94
94
  local _pe_argv=("${_LOKI_PERM_ARGV[@]}") _pe_lf _pe_ledger=false
@@ -27,7 +27,7 @@
27
27
  # This function is only ever called when the operator opted in (the call site
28
28
  # guards on LOKI_PROVEN_PR_CHECK=1). It is also safe if called directly.
29
29
  #
30
- # Inline Python (D7): the call site's cwd is the agent's repo, so the proof
30
+ # Inline Python: the call site's cwd is the agent's repo, so the proof
31
31
  # readers drop '' and '.' from sys.path first; a committed json.py or
32
32
  # sitecustomize.py cannot change the headline. Pinned by
33
33
  # tests/test-proven-pr-check.sh (D7 section).
@@ -1789,7 +1789,7 @@ def _build_proof(args, loki_dir, target_dir, repo_root):
1789
1789
  "post_headline": True,
1790
1790
  })
1791
1791
 
1792
- # D47: edited assertion lines are disclosed but never move the headline or rc.
1792
+ # edited assertion lines are disclosed but never move the headline or rc.
1793
1793
  _ae = (facts.get("tests_integrity") or {}).get("assertions_edited")
1794
1794
  if _ae:
1795
1795
  degraded.append({
@@ -1966,7 +1966,7 @@ def _compute_degraded(facts):
1966
1966
  if rec.get("state") == "gap":
1967
1967
  out.append({"item": "functionality:%s" % axis, "status": "failed",
1968
1968
  "reason": rec.get("reason") or "axis disproven"})
1969
- # TEN-GATES-10 (D105): the agent writes both the code and the suite, so a
1969
+ # TEN-GATES-10: the agent writes both the code and the suite, so a
1970
1970
  # green suite alone is the agent grading its own work. When the suite is the
1971
1971
  # ONLY passing fact, record the gap here (pre-headline, so proof-verify.py
1972
1972
  # re-derives the same amber headline from the recorded ledger) and VERIFIED
@@ -2102,7 +2102,7 @@ def _compute_headline(facts, degraded):
2102
2102
  and tests.get("exit_code") == 0
2103
2103
  )
2104
2104
  if tests_verified and not degraded and diff_nonempty:
2105
- # S-113: ablation showed deleting the change leaves the suite green, so
2105
+ # ablation showed deleting the change leaves the suite green, so
2106
2106
  # the passing tests do not prove the change. Never VERIFIED; amber.
2107
2107
  ablation = facts.get("ablation")
2108
2108
  if isinstance(ablation, dict) and ablation.get("status") == "not_load_bearing":
@@ -32,7 +32,7 @@
32
32
  # every optional tool is `command -v`-guarded. All print paths `return 0` so a
33
33
  # sourced call cannot abort the caller under set -e.
34
34
 
35
- # S-215: callers render from the agent's repo, and a bare `python3 -` puts the
35
+ # callers render from the agent's repo, and a bare `python3 -` puts the
36
36
  # cwd first on sys.path, so a committed json.py forged the headline. The
37
37
  # renderer resolves its interpreter through _loki_snapshot_py_tool and runs it
38
38
  # -I -S. The copy below only serves callers that source this file on its own;
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # FC-30: keep the provider skill links Loki created pointing at the running
2
+ # keep the provider skill links Loki created pointing at the running
3
3
  # install. One shared mechanism, called from npm postinstall and from the bin/loki
4
4
  # shim (first invocation after an install or upgrade). Cost: a few lstat/readlink
5
5
  # calls, no network, no subprocess beyond readlink/ln/mv on the repair path.
@@ -27,7 +27,7 @@
27
27
  # condition (caller falls through
28
28
  # to existing heuristic dispatch).
29
29
  #
30
- # Inline Python (D7): the dispatch runs with the cwd inside the agent's repo, so
30
+ # Inline Python: the dispatch runs with the cwd inside the agent's repo, so
31
31
  # every python3 here drops '' and '.' from sys.path before any other import; a
32
32
  # committed json.py or sitecustomize.py cannot read the votes.
33
33
  # Pinned by tests/test-voter-agents-json.sh (Case D).
package/autonomy/loki CHANGED
@@ -1220,7 +1220,7 @@ PY
1220
1220
  }
1221
1221
 
1222
1222
  # loki_verify_root: the ONE place that decides which tree the receipt verifier
1223
- # hashes (FC-29). The verifier walks and digests the directory it is given, so
1223
+ # hashes. The verifier walks and digests the directory it is given, so
1224
1224
  # an ambient cwd (a huge checkout, $HOME, a non-project directory) must never be
1225
1225
  # the default. Order: explicit TARGET_DIR; the parent of an absolute LOKI_DIR;
1226
1226
  # the cwd if it holds .loki; the repo top-level if it holds .loki. Anything else
@@ -2017,7 +2017,6 @@ show_help_all() {
2017
2017
  echo "Cost controls (budget, iteration and wall-clock caps): docs/cost-controls.md"
2018
2018
  echo "Already have a codebase? Start read-only: docs/brownfield.md"
2019
2019
  echo "No egress allowed? What runs disconnected: docs/air-gapped.md"
2020
- echo "Where this is going: docs/STRATEGY-2026-2028.md"
2021
2020
  echo ""
2022
2021
  echo "Scripting Loki? Exit codes for every command are documented in"
2023
2022
  echo "docs/exit-codes.md. Severity rises with the code, and 'loki start'"
@@ -2079,7 +2078,7 @@ show_help_aliases() {
2079
2078
  echo "See internal/CLI-CONSOLIDATION-DESIGN.md for the full migration plan."
2080
2079
  }
2081
2080
 
2082
- # D51: bare `loki`. Reuse a running dashboard, else start one on a free
2081
+ # bare `loki`. Reuse a running dashboard, else start one on a free
2083
2082
  # loopback port, then open /start (or just print the URL when headless).
2084
2083
  loki_ui_free_port() {
2085
2084
  python3 - "$1" <<'PY'
@@ -2162,7 +2161,7 @@ _loki_control_ui() {
2162
2161
  echo "loki: the Control Plane needs bun (https://bun.sh); using the classic dashboard." >&2
2163
2162
  return 1
2164
2163
  fi
2165
- # FC-07: LOKI_CONTROL=0 is the test off switch (supervisor, run-all-tests, local-ci);
2164
+ # LOKI_CONTROL=0 is the test off switch (supervisor, run-all-tests, local-ci);
2166
2165
  # it must never start a detached `control serve` that writes ~/.loki/control.
2167
2166
  [ "${LOKI_CONTROL:-}" = "0" ] && return 1
2168
2167
  local cli="$SKILL_DIR/loki-ts/dist/loki.js" cdir="${HOME}/.loki/control" spid
@@ -2388,7 +2387,7 @@ detect_arg_type() {
2388
2387
  echo "unknown"
2389
2388
  }
2390
2389
 
2391
- # --- loki start detach-default handoff (S1) --------------------------------
2390
+ # --- loki start detach-default handoff --------------------------------
2392
2391
  # On an interactive TTY, `loki start` now detaches the build to the background
2393
2392
  # by default after a rich, reversible handoff card. A non-interactive shell,
2394
2393
  # --bg, --yes/-y, or CI takes the exact pre-existing foreground path (no card,
@@ -2409,7 +2408,7 @@ _loki_start_should_handoff() {
2409
2408
  return 0
2410
2409
  }
2411
2410
 
2412
- # Stare-worthy brand banner (S6). Renders the real Autonomi logo (purple squircle
2411
+ # Stare-worthy brand banner. Renders the real Autonomi logo (purple squircle
2413
2412
  # + white "A" + teal dot) as a crafted truecolor block, next to a "LOKI" wordmark,
2414
2413
  # straight to stderr. ZERO new tooling: pure ANSI escapes. Degrades by color depth
2415
2414
  # ($COLORTERM truecolor -> 24-bit; else a clean 256/mono badge). Never required,
@@ -2461,7 +2460,7 @@ _loki_brand_banner() {
2461
2460
  fi
2462
2461
  }
2463
2462
 
2464
- # E4: a 3-line "what Loki will do" preview from REAL signals only. Line 1 ties
2463
+ # a 3-line "what Loki will do" preview from REAL signals only. Line 1 ties
2465
2464
  # the detected tier to its phase count (simple=3, standard=6, complex=8 -- the
2466
2465
  # same mapping run.sh uses; auto/unknown stays honest as "auto-detecting"). Line
2467
2466
  # 2 names the spec, or admits "exploring the codebase" when there is none. Line 3
@@ -2525,7 +2524,7 @@ _loki_start_handoff() {
2525
2524
  esac
2526
2525
  fi
2527
2526
 
2528
- # Stare-worthy brand banner (S6) then the rich handoff card. Both to stderr so
2527
+ # Stare-worthy brand banner then the rich handoff card. Both to stderr so
2529
2528
  # stdout carries only the decision word.
2530
2529
  _loki_brand_banner "$proj"
2531
2530
  {
@@ -4420,7 +4419,7 @@ cmd_start() {
4420
4419
  loki_project_graph_discover "$_pg_target" || true
4421
4420
  fi
4422
4421
 
4423
- # S1: detach-to-background by default on an interactive TTY. Fires a rich,
4422
+ # detach-to-background by default on an interactive TTY. Fires a rich,
4424
4423
  # reversible handoff card, then arms the existing --bg path so run.sh
4425
4424
  # backgrounds the runner (it writes the log + PID file and prints its own
4426
4425
  # "Running in Background" banner). The HARD gate below keeps every
@@ -6934,7 +6933,7 @@ cmd_status() {
6934
6933
  fi
6935
6934
  fi
6936
6935
 
6937
- # P12-19 (D04): freshness of the newest Loki 10 run, same wording as the Bun route
6936
+ # P12-19: freshness of the newest Loki 10 run, same wording as the Bun route
6938
6937
  # ("last event Ns ago (seq N)"). Display-only; silent when there is no run or no parseable event.
6939
6938
  local _e10_last _e10_ev _e10_seq _e10_ts _e10_epoch
6940
6939
  _e10_last=$(ls -d "$LOKI_DIR"/runs/e10-*/ 2>/dev/null | sort | tail -1) || _e10_last=""
@@ -8127,7 +8126,7 @@ _loki_dashboard_args_need_classic() {
8127
8126
  cmd_dashboard() {
8128
8127
  local subcommand="${1:-}"
8129
8128
 
8130
- # CP-LEGACY (D57): the Control Plane is the default UI for `dashboard`,
8129
+ # CP-LEGACY: the Control Plane is the default UI for `dashboard`,
8131
8130
  # `dashboard start` and `dashboard open`, with or without flags. The legacy
8132
8131
  # Python dashboard stays reachable only by explicit opt-in:
8133
8132
  # LOKI_LEGACY_DASHBOARD=1 or LOKI_CONTROL_DEFAULT=0. Enterprise bind/TLS
@@ -14509,7 +14508,7 @@ cmd_config_schema() {
14509
14508
  loki_config_generate_schema
14510
14509
  }
14511
14510
 
14512
- # D65: multi-repo workspaces (D51 Phase B). On by default; LOKI_WORKSPACES=0 disables.
14511
+ # multi-repo workspaces (D51 Phase B). On by default; LOKI_WORKSPACES=0 disables.
14513
14512
  cmd_workspace() {
14514
14513
  if [ "${LOKI_WORKSPACES:-}" = "0" ]; then
14515
14514
  echo -e "${RED}loki workspace is disabled.${NC} Unset LOKI_WORKSPACES (it is set to 0)." >&2
@@ -14519,7 +14518,7 @@ cmd_workspace() {
14519
14518
  python3 "$_LOKI_SCRIPT_DIR/lib/workspace.py" "$@"
14520
14519
  }
14521
14520
 
14522
- # D51: headless backlog runner. One v10 issue-mode run per open issue, each in
14521
+ # headless backlog runner. One v10 issue-mode run per open issue, each in
14523
14522
  # its own worktree and branch, at most N in parallel (loki.yaml concurrency).
14524
14523
  cmd_backlog() {
14525
14524
  case "${1:-}" in
@@ -14549,7 +14548,7 @@ cmd_backlog() {
14549
14548
  # failures. Non-zero exit on any failure.
14550
14549
  cmd_config_validate() {
14551
14550
  local file="${1:-}" _loki_yaml
14552
- # D51: loki.yaml (UI + headless config) has its own schema; no argument
14551
+ # loki.yaml (UI + headless config) has its own schema; no argument
14553
14552
  # validates the discovered loki.yaml (repo root, then ~/.loki/loki.yaml).
14554
14553
  case "$(basename -- "$file")" in "" | loki.yaml | loki.yml | loki.yaml.example) _loki_yaml=1 ;; *) _loki_yaml=0 ;; esac
14555
14554
  if [ "$_loki_yaml" = 1 ]; then
@@ -19767,7 +19766,7 @@ with open(manifest_path, 'w') as f:
19767
19766
  # usable.
19768
19767
  # ---------------------------------------------------------------------------
19769
19768
  cmd_verify() {
19770
- # D48: --pubkey FILE or --pubkey=FILE (any position) verifies a receipt against a given public key (v10 engine, no ~/.loki needed).
19769
+ # --pubkey FILE or --pubkey=FILE (any position) verifies a receipt against a given public key (v10 engine, no ~/.loki needed).
19771
19770
  local _pk_arg
19772
19771
  for _pk_arg in "$@"; do
19773
19772
  case "$_pk_arg" in
@@ -21326,15 +21325,9 @@ print(json.loads(p.read_text()).get('port', 7373) if p.exists() else 7373)
21326
21325
  python3 "$trigger_schedule_script" remove "$name"
21327
21326
  ;;
21328
21327
  daemon)
21329
- local daemon_flag=""
21330
- [[ "${1:-}" == "--dry-run" ]] && daemon_flag="--dry-run"
21331
- [[ "${1:-}" == "--loop" ]] && daemon_flag="--loop"
21332
- python3 "$trigger_schedule_script" daemon $daemon_flag
21333
- ;;
21334
- install|uninstall)
21335
- # Always-on company seats: LaunchAgent running the daemon loop
21336
- LOKI_BIN="${LOKI_BIN:-$(readlink -f "${BASH_SOURCE[0]}")}" \
21337
- python3 "$trigger_schedule_script" "$subcmd" "$@"
21328
+ local dry_run_flag=""
21329
+ [[ "${1:-}" == "--dry-run" ]] && dry_run_flag="--dry-run"
21330
+ python3 "$trigger_schedule_script" daemon $dry_run_flag
21338
21331
  ;;
21339
21332
  test)
21340
21333
  local event_type="${1:-issues}"
@@ -21445,11 +21438,7 @@ for line in sys.stdin:
21445
21438
  echo " add schedule <name> <cron_expr> <action> [args...]"
21446
21439
  echo " Add a cron-based schedule trigger"
21447
21440
  echo " remove <name> Remove a schedule trigger"
21448
- echo " daemon [--dry-run|--loop]"
21449
- echo " Run one pass of schedule checks (call from cron), or loop once a minute"
21450
- echo " install [--no-load] Seed the ten company-seat schedules and install the always-on"
21451
- echo " LaunchAgent (dev.autonomi.loki-company; macOS)"
21452
- echo " uninstall [--no-load] Remove the always-on LaunchAgent"
21441
+ echo " daemon [--dry-run] Run one pass of schedule checks (call from cron)"
21453
21442
  echo " test <event-type> [--repo owner/repo] [--issue NUM]"
21454
21443
  echo " Send a test webhook event (event-types: issues, pull_request, workflow_run)"
21455
21444
  echo " logs [--tail N] Show recent trigger event log (default: last 50)"
@@ -22826,7 +22815,7 @@ main() {
22826
22815
  fi
22827
22816
 
22828
22817
  if [ $# -eq 0 ] || { [ $# -eq 1 ] && [ "$1" = "--no-open" ]; }; then
22829
- # D51: bare `loki` starts the local UI. LOKI_LANDING=1 keeps the v7.28
22818
+ # bare `loki` starts the local UI. LOKI_LANDING=1 keeps the v7.28
22830
22819
  # newcomer landing (tests and scripts that parse it set it).
22831
22820
  if [ "${LOKI_LANDING:-0}" = "1" ]; then
22832
22821
  show_landing
@@ -23239,7 +23228,7 @@ main() {
23239
23228
  cmd_verify "$@"
23240
23229
  ;;
23241
23230
  keys)
23242
- # D48: public-key export lives in the Bun v10 engine; re-enter the shim on that route.
23231
+ # public-key export lives in the Bun v10 engine; re-enter the shim on that route.
23243
23232
  exec "$_LOKI_SCRIPT_DIR/../bin/loki" keys "$@"
23244
23233
  ;;
23245
23234
  spec)
@@ -30763,7 +30752,7 @@ tokens_known = bool(iterations)
30763
30752
  ctx_file = os.path.join(loki_dir, "context", "tracking.json")
30764
30753
  ctx = load_json(ctx_file)
30765
30754
  # context-tracker.py seeds tracking.json with all-zero totals, so the file
30766
- # existing is not a measurement: only real (nonzero) totals count (S-147).
30755
+ # existing is not a measurement: only real (nonzero) totals count.
30767
30756
  if isinstance(ctx, dict) and not tokens_known:
30768
30757
  totals = ctx.get("totals")
30769
30758
  if isinstance(totals, dict) and (totals.get("total_input") or totals.get("total_output")
@@ -34059,7 +34048,7 @@ _docs_generate() {
34059
34048
  fi
34060
34049
  target_path="$(cd "$target_path" && pwd)"
34061
34050
 
34062
- # S6: a small-tier run (caller exports LOKI_DOCS_TIER) does not pay for the
34051
+ # a small-tier run (caller exports LOKI_DOCS_TIER) does not pay for the
34063
34052
  # eight-doc suite unless docs were asked for explicitly.
34064
34053
  case "${LOKI_DOCS_TIER:-}" in
34065
34054
  small|simple)
@@ -35533,7 +35522,7 @@ cmd_canary() {
35533
35522
  return 2
35534
35523
  fi
35535
35524
  if [ "$subcommand" = "verify" ]; then
35536
- # D7: this is a verify path. -E stops PYTHONPATH (an empty component
35525
+ # this is a verify path. -E stops PYTHONPATH (an empty component
35537
35526
  # would add the cwd as an absolute path) and a committed
35538
35527
  # sitecustomize.py from acting before the tool runs. python3 is
35539
35528
  # resolved to an absolute path first so an empty PATH component (or a
@@ -38913,7 +38902,7 @@ PYEOF
38913
38902
  if command -v jq &>/dev/null; then
38914
38903
  jq . "$pj"
38915
38904
  else
38916
- # D7: this is a verify-adjacent read of proof.json. -E stops
38905
+ # this is a verify-adjacent read of proof.json. -E stops
38917
38906
  # PYTHONPATH/sitecustomize.py from acting before this line, and
38918
38907
  # python3 is resolved to an absolute path first so an empty
38919
38908
  # PATH component cannot let a committed python3 shim in the
@@ -39385,7 +39374,7 @@ print(json.dumps(doc, indent=2))
39385
39374
  local skip_confirm=0
39386
39375
  local visibility="--public"
39387
39376
  local hosted=0
39388
- # D7: every python3 invocation below reads proof.json from inside
39377
+ # every python3 invocation below reads proof.json from inside
39389
39378
  # the checkout being shared. Resolve an absolute path once so an
39390
39379
  # empty PATH component cannot let a committed python3 shim in that
39391
39380
  # checkout answer instead of the real interpreter; each call site
@@ -39783,7 +39772,7 @@ cmd_docker() {
39783
39772
  # the port-in-use check, so the picked port is ignored on reuse). Run in
39784
39773
  # a subshell so its internal `exit` paths (already-running -> exit 0,
39785
39774
  # errors -> exit 1) never abort the blocking docker run.
39786
- # CP-LEGACY (D57): open the Control Plane, never the classic server,
39775
+ # CP-LEGACY: open the Control Plane, never the classic server,
39787
39776
  # unless LOKI_LEGACY_DASHBOARD=1 opts back in. Same open gate as before.
39788
39777
  if [ "${LOKI_LEGACY_DASHBOARD:-0}" != "1" ]; then
39789
39778
  local _cp_args=()
@@ -18,7 +18,7 @@
18
18
  # LOKI_CHECKLIST_TIMEOUT - Timeout per check in seconds (default: 30)
19
19
  # LOKI_CHECKLIST_ENABLED - Enable/disable checklist (default: true)
20
20
  #
21
- # Inline Python (D7): verification runs with the cwd inside the agent's repo,
21
+ # Inline Python: verification runs with the cwd inside the agent's repo,
22
22
  # so every python3 here ignores PYTHON* env vars (an empty PYTHONPATH component
23
23
  # would load a committed sitecustomize.py) and every -c / - body drops '' and
24
24
  # '.' from sys.path before any other import (a committed json.py would print
@@ -46,7 +46,7 @@ import logging
46
46
  import os
47
47
  from pathlib import Path
48
48
 
49
- # Default signer file name; one definition, free of key-ish words (E-156).
49
+ # Default signer file name; one definition, free of key-ish words.
50
50
  RECEIPT_SIGNER_BASENAME = "receipt-ed25519.pem"
51
51
 
52
52
  try: