loki-mode 9.35.0 → 9.37.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.
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.35.0
6
+ # Loki Mode v9.37.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.35.0 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
473
+ **v9.37.0 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 9.35.0
1
+ 9.37.0
package/autonomy/run.sh CHANGED
@@ -10224,8 +10224,38 @@ enforce_static_analysis() {
10224
10224
  fi
10225
10225
  fi
10226
10226
  if [ -z "$changed_files" ]; then
10227
- log_info "Static analysis: no changed files to check"
10228
- touch "$quality_dir/static-analysis.pass"
10227
+ # SCANNED NOTHING IS NOT A PASS.
10228
+ #
10229
+ # This used to `touch static-analysis.pass` and return 0. The receipt
10230
+ # reader promotes a bare .pass marker straight to status "passed"
10231
+ # (proof-generator.py:352-353), so a gate that examined ZERO files was
10232
+ # rendered identically to one that examined everything and found it
10233
+ # clean.
10234
+ #
10235
+ # That is not cosmetic. static_analysis is usually the only EXOGENOUS
10236
+ # (agent-independent) gate in a receipt, and `any_verified`
10237
+ # (proof-generator.py:1694-1707) is satisfied by it alone -- so this
10238
+ # no-op pass was the single term standing between the honest headline
10239
+ # "NOT VERIFIED" and "VERIFIED WITH GAPS". Observed on a real run in a
10240
+ # non-git directory: file discovery is git-based, so changed_files was
10241
+ # empty, the gate examined none of the three files the run had just
10242
+ # created, and the receipt still reported a passing exogenous gate.
10243
+ #
10244
+ # Write the result JSON with files_checked:0 and status "inconclusive"
10245
+ # INSTEAD of the marker. INCONCLUSIVE, not failed: having nothing to scan
10246
+ # is not a defect in the code, and reporting it as a failure would trade
10247
+ # one dishonesty for another. _norm_gate_status already understands the
10248
+ # state, and the honesty ledger records it as a degraded gate rather than
10249
+ # a green one. Deliberately NOT touching the marker: the reader checks it
10250
+ # FIRST (proof-generator.py:352), so leaving it would keep the lie.
10251
+ #
10252
+ # The gate still returns 0 -- having nothing to scan is not a build
10253
+ # failure and must not block a run. Only the CLAIM changes.
10254
+ log_info "Static analysis: no changed files to check (recording as not run, not as a pass)"
10255
+ rm -f "$quality_dir/static-analysis.pass" 2>/dev/null || true
10256
+ cat > "$quality_dir/static-analysis.json" << SAEMPTYEOF
10257
+ {"timestamp":"$(date -u +%Y-%m-%dT%H:%M:%SZ)","files_checked":0,"findings":0,"summary":"no changed files to check; nothing was scanned","status":"inconclusive","reason":"no_changed_files"}
10258
+ SAEMPTYEOF
10229
10259
  return 0
10230
10260
  fi
10231
10261
 
@@ -11974,9 +12004,18 @@ NT_DIR_EOF
11974
12004
  # "no tests" never reads as "tests passed". A DETECTED runner that fails
11975
12005
  # still writes pass:false below and BLOCKS.
11976
12006
  #
11977
- # unit-tests.pass is only read for the status-line display (run.sh ~2183,
11978
- # PASS vs PENDING); keeping the touch preserves the historical
11979
- # non-blocking behavior for legitimate no-test projects.
12007
+ # CORRECTION (v9.37.0): "only read for the status-line display" was
12008
+ # FALSE, and that false premise is why the touch survived. The receipt
12009
+ # collector reads this exact marker (proof-generator.py:346) and promotes
12010
+ # its mere existence to status "passed" (:352) BEFORE it ever looks at
12011
+ # the honest JSON written below. Measured, driving the real collector:
12012
+ # marker present + {"status":"not_run"} json -> "passed"
12013
+ # json only, no marker -> "inconclusive"
12014
+ # So a project with NO test runner shipped a receipt claiming a passing
12015
+ # unit_tests gate, contradicting honesty.degraded in the same document.
12016
+ # The touch is therefore removed; the honest JSON below is now what the
12017
+ # receipt reads. The status line falls back to PENDING, which is also the
12018
+ # truthful rendering for a project whose tests never ran.
11980
12019
  #
11981
12020
  # F56/F53 (verification-gap honesty): a generated project that shipped
11982
12021
  # source but no runnable tests previously recorded a bare "not_run" and
@@ -12025,7 +12064,10 @@ NT_DIR_EOF
12025
12064
  _vgap_summary="Source present but no runnable tests detected (unverified logic)"
12026
12065
  log_warn "Verification gap: generated source present but no runnable tests -- logic is unverified by execution"
12027
12066
  fi
12028
- touch "$quality_dir/unit-tests.pass"
12067
+ # Deliberately NOT touching unit-tests.pass here -- see the correction
12068
+ # above. Non-blocking behaviour is preserved by the `return 0` below,
12069
+ # not by claiming a pass.
12070
+ rm -f "$quality_dir/unit-tests.pass" 2>/dev/null || true
12029
12071
  cat > "$quality_dir/test-results.json" << TREOF
12030
12072
  {"timestamp":"$(date -u +%Y-%m-%dT%H:%M:%SZ)","runner":"none","pass":"inconclusive","summary":"$_vgap_summary","command":null,"exit_code":null,"status":"not_run","passed_count":null,"failed_count":null,"verification_gap":"$_vgap"}
12031
12073
  TREOF
@@ -24514,12 +24556,31 @@ EOF
24514
24556
  _loki_check_claim_grounding || true
24515
24557
  fi
24516
24558
  local _loki_completion_ready=1
24559
+ # TIME THE COUNCIL. Measured on a one-function build: the agent did
24560
+ # the work in 71s and the council window was 142s -- the largest
24561
+ # single cost in the run -- yet it was the one major step with no
24562
+ # stage_complete record, so its cost could only be INFERRED from
24563
+ # artifact mtimes. Inferring duration from mtimes is invalid (an
24564
+ # mtime says when a file was written, not how long a step took), and
24565
+ # doing so produced a wrong attribution that had to be retracted.
24566
+ # Emitting the real number makes the profile measured rather than
24567
+ # guessed. Purely additive: emit_stage_complete never changes a
24568
+ # verdict, an exit code, or control flow.
24569
+ local _council_t0
24570
+ _council_t0=$(date +%s 2>/dev/null || echo "")
24517
24571
  if loki_is_supervised_simple_web; then
24518
24572
  _loki_supervised_completion_gates_pass "${gate_failures:-}" && _loki_completion_ready=0
24519
24573
  elif type council_should_stop &>/dev/null \
24520
24574
  && LOKI_COMPLETION_CLAIMED="$_loki_completion_claimed" council_should_stop; then
24521
24575
  _loki_completion_ready=0
24522
24576
  fi
24577
+ # Status reports what the council DECIDED, not whether it errored:
24578
+ # "pass" = it approved a stop, "not_run" = it ran and declined to
24579
+ # stop (the build continues). Both are normal outcomes; neither is a
24580
+ # failure, so neither is reported as one.
24581
+ emit_stage_complete "completion_council" \
24582
+ "$([ "$_loki_completion_ready" -eq 0 ] 2>/dev/null && echo pass || echo not_run)" \
24583
+ "$_council_t0" 2>/dev/null || true
24523
24584
  if [ "$_loki_completion_ready" -eq 0 ]; then
24524
24585
  # bash-F1: council_should_stop returns 0 from a genuine approval
24525
24586
  # AND from two force-stop safety valves (stagnation flood /
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "9.35.0"
10
+ __version__ = "9.37.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.35.0
5
+ **Version:** v9.37.0
6
6
 
7
7
  ---
8
8