loki-mode 9.64.0 → 9.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/autonomy/completion-council.sh +18 -1
  4. package/autonomy/lib/proof-generator.py +17 -0
  5. package/autonomy/lib/proof-verify.py +4 -0
  6. package/dashboard/__init__.py +1 -1
  7. package/docs/INSTALLATION.md +1 -1
  8. package/loki-ts/dist/loki.js +94 -94
  9. package/mcp/__init__.py +1 -1
  10. package/package.json +1 -1
  11. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  12. package/web-app/dist/assets/{AdminPage-Oyx-w2Ch.js → AdminPage-ChUvLzkF.js} +1 -1
  13. package/web-app/dist/assets/{Avatar-D60m65JB.js → Avatar-Dpy96tAc.js} +1 -1
  14. package/web-app/dist/assets/{Badge-CqfZNaem.js → Badge-BOHHYZTu.js} +1 -1
  15. package/web-app/dist/assets/{Button-BqjzE4fz.js → Button-B_XqEF7a.js} +1 -1
  16. package/web-app/dist/assets/{CockpitPage-Czk7o_ou.js → CockpitPage-C0z5QwNJ.js} +1 -1
  17. package/web-app/dist/assets/{ComparePage-BEfTrTb1.js → ComparePage-KWL6acQk.js} +1 -1
  18. package/web-app/dist/assets/{ErrorBoundary-BrLk5nkO.js → ErrorBoundary-BbyBJ4ZP.js} +1 -1
  19. package/web-app/dist/assets/{EvidenceReceiptPanel-9vEpi5ir.js → EvidenceReceiptPanel-Btblkwfr.js} +1 -1
  20. package/web-app/dist/assets/{GitHubIssuesPanel-D6izZx0w.js → GitHubIssuesPanel-7Bi1t04Q.js} +1 -1
  21. package/web-app/dist/assets/{GitHubPRsPanel-BTkG2FgA.js → GitHubPRsPanel-BxZtNprq.js} +1 -1
  22. package/web-app/dist/assets/{HomePage-nsr4kpN1.js → HomePage-BxDh3-CD.js} +1 -1
  23. package/web-app/dist/assets/{LoginPage-BVblQrr9.js → LoginPage-DpXq4rQe.js} +1 -1
  24. package/web-app/dist/assets/{MagicPage-CmnSyLq7.js → MagicPage-DP2k0ioE.js} +1 -1
  25. package/web-app/dist/assets/{MetricsPage-BVfwU81j.js → MetricsPage-Dus04BUR.js} +1 -1
  26. package/web-app/dist/assets/{NotFoundPage-AYQ6uqqI.js → NotFoundPage--54yr9Cy.js} +1 -1
  27. package/web-app/dist/assets/{ProjectPage-DMnbw9X9.js → ProjectPage-Cs6LOI7R.js} +3 -3
  28. package/web-app/dist/assets/{ProjectsPage-CNVTAF2N.js → ProjectsPage-5cpa0X1d.js} +1 -1
  29. package/web-app/dist/assets/SettingsPage-Duc5ApRj.js +10 -0
  30. package/web-app/dist/assets/{ShowcasePage-2dBCjLXn.js → ShowcasePage-C1wrPZgl.js} +1 -1
  31. package/web-app/dist/assets/{SystemSettingsPage-Djo6IE4u.js → SystemSettingsPage-CoD3LARj.js} +1 -1
  32. package/web-app/dist/assets/{TeamsPage-CY8p-yxD.js → TeamsPage-GuQ4YDV5.js} +1 -1
  33. package/web-app/dist/assets/{TemplatesPage-B6iFgH6t.js → TemplatesPage-CvWecmzl.js} +1 -1
  34. package/web-app/dist/assets/{TerminalOutput-B3yzZe-h.js → TerminalOutput-DFZw34kD.js} +1 -1
  35. package/web-app/dist/assets/{activity-CNfAjtRv.js → activity-BvHkXBYj.js} +1 -1
  36. package/web-app/dist/assets/{bell-CMETsHPH.js → bell-Bw2j-HI7.js} +1 -1
  37. package/web-app/dist/assets/{bot-C9kXvk1i.js → bot-BRuEmshQ.js} +1 -1
  38. package/web-app/dist/assets/{check-BRK-zLB5.js → check-B5uToWdF.js} +1 -1
  39. package/web-app/dist/assets/{chevron-left-CxI5uD4g.js → chevron-left-D-tXeEPI.js} +1 -1
  40. package/web-app/dist/assets/{circle-alert-CVFRPWpv.js → circle-alert-p3-Bg3sx.js} +1 -1
  41. package/web-app/dist/assets/{clock-CLYV8a_x.js → clock-CJc_91vp.js} +1 -1
  42. package/web-app/dist/assets/{cloud-CiISiIOa.js → cloud-lhmojUN8.js} +1 -1
  43. package/web-app/dist/assets/{code-xml-DHsgqwV-.js → code-xml-DMvQ2jw1.js} +1 -1
  44. package/web-app/dist/assets/{database-DbvUqtz3.js → database-EdwkplCN.js} +1 -1
  45. package/web-app/dist/assets/{dollar-sign-Ct0lRPHw.js → dollar-sign-BQiPo9Co.js} +1 -1
  46. package/web-app/dist/assets/{file-code-corner-D1sjFEh7.js → file-code-corner-CXUzs2z1.js} +1 -1
  47. package/web-app/dist/assets/{file-plus-DnmX18Fi.js → file-plus-hS0xkTL5.js} +1 -1
  48. package/web-app/dist/assets/{globe-bSpDNgoA.js → globe-B6Xk69Fj.js} +1 -1
  49. package/web-app/dist/assets/{hammer-Bj41Kvlq.js → hammer-B_evoVEr.js} +1 -1
  50. package/web-app/dist/assets/{index-CxajNJVu.js → index-XZrgDphJ.js} +2 -2
  51. package/web-app/dist/assets/{layers-BNtBwYER.js → layers-Bb295b4u.js} +1 -1
  52. package/web-app/dist/assets/{loader-circle-YY_VZofG.js → loader-circle-C8cKZhjP.js} +1 -1
  53. package/web-app/dist/assets/{lock-rpjEPVoC.js → lock-DcC9B8sE.js} +1 -1
  54. package/web-app/dist/assets/{package-desXU6XA.js → package-BFz4FYcR.js} +1 -1
  55. package/web-app/dist/assets/{plus-7AoOU-I9.js → plus-aS4YpFPG.js} +1 -1
  56. package/web-app/dist/assets/{refresh-cw-oNj-Xn4B.js → refresh-cw-B9_ksndc.js} +1 -1
  57. package/web-app/dist/assets/{rotate-ccw-DeiFjfVO.js → rotate-ccw-CBogZEoT.js} +1 -1
  58. package/web-app/dist/assets/{scroll-text-Q9AzWiNV.js → scroll-text-DMGgO6uq.js} +1 -1
  59. package/web-app/dist/assets/{server-DKgVwfek.js → server-CsEqUM8R.js} +1 -1
  60. package/web-app/dist/assets/{shield-alert-G6x-bS-I.js → shield-alert-Btnj6tmQ.js} +1 -1
  61. package/web-app/dist/assets/{thumbs-up-Qhk0yvw0.js → thumbs-up-C_NLSPqa.js} +1 -1
  62. package/web-app/dist/assets/{trash-2-D23gvznl.js → trash-2-zqZc9cSK.js} +1 -1
  63. package/web-app/dist/assets/{trending-down-CSQClPrr.js → trending-down-BGQh2rVE.js} +1 -1
  64. package/web-app/dist/assets/{trending-up-sjMSd1wc.js → trending-up-C31TrzUt.js} +1 -1
  65. package/web-app/dist/assets/{upload-Dchovhld.js → upload-CLwWKjCG.js} +1 -1
  66. package/web-app/dist/assets/{usePolling-DwLceXwF.js → usePolling-8wwOP53Y.js} +1 -1
  67. package/web-app/dist/assets/{user-BqZM8CmD.js → user-DUkbxibF.js} +1 -1
  68. package/web-app/dist/index.html +1 -1
  69. package/web-app/dist/assets/SettingsPage-D1_qasFD.js +0 -10
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: Autonomous spec-driven build system with a built-in trust layer. It does not call work done until it is verified (RARV-C closure loop, 8 quality gates, completion council, verified-completion evidence gate). Triggers on "Loki Mode". Takes a spec (PRD, GitHub issue, OpenAPI doc, etc.) to deployed product with minimal human intervention. Provider-agnostic. Requires --dangerously-skip-permissions flag.
4
4
  ---
5
5
 
6
- # Loki Mode v9.64.0
6
+ # Loki Mode v9.66.0
7
7
 
8
8
  **You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
9
9
 
@@ -470,4 +470,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
470
470
 
471
471
  ---
472
472
 
473
- **v9.64.0 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
473
+ **v9.66.0 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 9.64.0
1
+ 9.66.0
@@ -1856,6 +1856,12 @@ _loki_test_provenance() {
1856
1856
  # legitimate completion is never falsely stopped. Default-on; opt out with
1857
1857
  # LOKI_EVIDENCE_GATE=0 (byte-identical to prior behavior, no read/write).
1858
1858
  council_evidence_gate() {
1859
+ # P2 (S-116): when the caller sets _LOKI_EVIDENCE_REQUIRE_TESTS=1, inconclusive
1860
+ # test evidence blocks instead of passing through. council_evaluate sets it as
1861
+ # a function-local (bash dynamic scope, gone on return), so the vote alone can
1862
+ # never approve while every other caller keeps the old pass-through rc.
1863
+ local _require_tests="false"
1864
+ [ "${_LOKI_EVIDENCE_REQUIRE_TESTS:-0}" = "1" ] && _require_tests="true"
1859
1865
  # Knob first: opt-out is exact-as-today, before any file read or write.
1860
1866
  [ "${LOKI_EVIDENCE_GATE:-1}" = "0" ] && return 0
1861
1867
 
@@ -2702,6 +2708,15 @@ PYEOF
2702
2708
  # silently. The durable detail is in evidence-gate-details.json; this is
2703
2709
  # the human-visible honesty at the pass site.
2704
2710
  if [ "$test_inconclusive" = "true" ]; then
2711
+ # Tautological provenance is excluded: tests DID run green (e.g.
2712
+ # characterization tests pass on the base by design), and the
2713
+ # provenance block above promises that downgrade never blocks.
2714
+ if [ "$_require_tests" = "true" ] && [ "$test_inconclusive_reason" != "test_provenance_unconfirmed" ]; then
2715
+ # Council route: a vote over inconclusive tests is the vote alone.
2716
+ log_warn "[Council] Evidence gate: completion not backed by test evidence (${test_inconclusive_reason}); the council vote alone cannot approve. Record a real test run, or set LOKI_EVIDENCE_NO_TESTS_AFFIRMATIVE=1 to treat no-tests as affirmative."
2717
+ _write_evidence_details "block"
2718
+ return 1
2719
+ fi
2705
2720
  log_warn "[Council] Evidence gate: completion not backed by test evidence (${test_inconclusive_reason}). Pass-through; set LOKI_EVIDENCE_NO_TESTS_AFFIRMATIVE=1 to treat no-tests as affirmative."
2706
2721
  fi
2707
2722
  # Same honesty for the runtime-boot axis: a pass that could not confirm the
@@ -4176,7 +4191,9 @@ council_evaluate() {
4176
4191
  fi
4177
4192
 
4178
4193
  # Phase 2.5 (v7.19.1): evidence hard gate - block completion unless there is
4179
- # real evidence that files changed AND tests are green.
4194
+ # real evidence that files changed AND tests are green. The local below makes
4195
+ # an inconclusive test signal block here, so the vote never approves alone.
4196
+ local _LOKI_EVIDENCE_REQUIRE_TESTS=1
4180
4197
  if ! council_evidence_gate; then
4181
4198
  log_info "[Council] Completion blocked by evidence hard gate"
4182
4199
  return 1 # CONTINUE - cannot complete without real evidence
@@ -855,6 +855,15 @@ def _collect_functional(loki_dir):
855
855
  return out
856
856
 
857
857
 
858
+ def _collect_ablation(loki_dir):
859
+ """Copy .loki/quality/ablation.json verbatim (S-113). None when absent or
860
+ unreadable, so the caller attaches no key and an ablation-less receipt stays
861
+ byte-identical. _compute_headline reads status == not_load_bearing: a change
862
+ whose deletion leaves the suite green is not proven by that suite.
863
+ """
864
+ return _read_json(os.path.join(loki_dir, "quality", "ablation.json"), default=None)
865
+
866
+
858
867
  def _collect_healthcheck(loki_dir):
859
868
  """Read .loki/app-runner/health.json (the app-runner liveness probe).
860
869
 
@@ -1460,6 +1469,9 @@ def _build_proof(args, loki_dir, target_dir, repo_root):
1460
1469
  # only, never read by _compute_headline / _compute_degraded.
1461
1470
  if journey:
1462
1471
  facts["journey"] = journey
1472
+ ablation = _collect_ablation(loki_dir)
1473
+ if ablation is not None:
1474
+ facts["ablation"] = ablation
1463
1475
 
1464
1476
  # ASSESSMENTS: LLM opinions. Explicitly labeled as judgment, NOT proof. A
1465
1477
  # green council verdict is an opinion that can be wrong or gamed; it never
@@ -1760,6 +1772,11 @@ def _compute_headline(facts, degraded):
1760
1772
  and tests.get("exit_code") == 0
1761
1773
  )
1762
1774
  if tests_verified and not degraded and diff_nonempty:
1775
+ # S-113: ablation showed deleting the change leaves the suite green, so
1776
+ # the passing tests do not prove the change. Never VERIFIED; amber.
1777
+ ablation = facts.get("ablation")
1778
+ if isinstance(ablation, dict) and ablation.get("status") == "not_load_bearing":
1779
+ return "VERIFIED WITH GAPS"
1763
1780
  return "VERIFIED"
1764
1781
  # Any fact verified at all (tests/build verified, or a passed gate)?
1765
1782
  # A non-empty diff is a PREREQUISITE for VERIFIED (checked above), NOT a
@@ -341,6 +341,10 @@ def _compute_headline(facts, degraded):
341
341
  and tests.get("exit_code") == 0
342
342
  )
343
343
  if tests_verified and not degraded and diff_nonempty:
344
+ # S-113 mirror: a not_load_bearing ablation never yields VERIFIED.
345
+ ablation = facts.get("ablation")
346
+ if isinstance(ablation, dict) and ablation.get("status") == "not_load_bearing":
347
+ return "VERIFIED WITH GAPS"
344
348
  return "VERIFIED"
345
349
  any_verified = (
346
350
  tests.get("status") == "verified"
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "9.64.0"
10
+ __version__ = "9.66.0"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -2,7 +2,7 @@
2
2
 
3
3
  The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
4
4
 
5
- **Version:** v9.64.0
5
+ **Version:** v9.66.0
6
6
 
7
7
  ---
8
8