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 +2 -2
- package/VERSION +1 -1
- package/autonomy/run.sh +67 -6
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/loki-ts/dist/loki.js +321 -318
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
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.
|
|
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.
|
|
473
|
+
**v9.37.0 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
9.
|
|
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
|
-
|
|
10228
|
-
|
|
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
|
-
#
|
|
11978
|
-
#
|
|
11979
|
-
#
|
|
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
|
-
|
|
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 /
|
package/dashboard/__init__.py
CHANGED
package/docs/INSTALLATION.md
CHANGED
|
@@ -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.
|
|
5
|
+
**Version:** v9.37.0
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|