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.
- package/README.md +1 -1
- package/SKILL.md +2 -3
- package/VERSION +1 -1
- package/autonomy/completion-council.sh +10 -10
- package/autonomy/council-v2.sh +4 -4
- package/autonomy/grill.sh +1 -1
- package/autonomy/lib/browser-open.sh +1 -1
- package/autonomy/lib/chat.sh +1 -1
- package/autonomy/lib/cockpit-render.sh +1 -1
- package/autonomy/lib/done-recognition.sh +4 -4
- package/autonomy/lib/efficiency_cost.py +1 -1
- package/autonomy/lib/engine10-push.sh +2 -2
- package/autonomy/lib/prd-enrich.sh +1 -1
- package/autonomy/lib/proof-check.sh +1 -1
- package/autonomy/lib/proof-generator.py +3 -3
- package/autonomy/lib/proof-pr.sh +1 -1
- package/autonomy/lib/skill-link-heal.sh +1 -1
- package/autonomy/lib/voter-agents.sh +1 -1
- package/autonomy/loki +26 -37
- package/autonomy/prd-checklist.sh +1 -1
- package/autonomy/receipt_jwt.py +1 -1
- package/autonomy/run.sh +28 -28
- package/autonomy/trigger-schedule.py +6 -414
- package/autonomy/tui.sh +1 -1
- package/autonomy/verify.sh +4 -4
- package/completions/loki.bash +0 -5
- package/dashboard/__init__.py +1 -1
- package/docs/ARCHITECTURE.md +1 -2
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/COMPONENTS.md +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/ROUTING-EVIDENCE.md +1 -2
- package/docs/V10-RESEARCH.md +1 -1
- package/docs/dev/architecture-reference.md +3 -7
- package/docs/dev/project-structure.md +1 -4
- package/docs/dev/release-checklist.md +13 -31
- package/docs/research-2026-07/OBSERVABILITY-TOOL-SPEC.md +1 -1
- package/docs/v11/MARKET-SLICES.md +1 -1
- package/docs/v11/REGISTRIES.md +1 -1
- package/docs/v11/ROUTER-1.md +2 -2
- package/loki-ts/dist/loki.js +2 -2
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/skills/extending.md +2 -3
- package/skills/factory-operations.md +11 -18
- package/skills/release-cadence.md +2 -2
- package/web-app/dist/assets/{AdminPage-BJm9y_qE.js → AdminPage-xKgtIhk2.js} +1 -1
- package/web-app/dist/assets/{Avatar-EEiOX0Y0.js → Avatar-Q14AHox9.js} +1 -1
- package/web-app/dist/assets/{Badge-ZXM82z0d.js → Badge-yk5M-lip.js} +1 -1
- package/web-app/dist/assets/{Button-BTMAbQBv.js → Button-ynznk0At.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-BaorxOYw.js → CockpitPage-C8B765za.js} +1 -1
- package/web-app/dist/assets/{ComparePage-BxhA3QxZ.js → ComparePage-DqzmWKnf.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-DGIdCZdm.js → ErrorBoundary-DdBPd_Lq.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-OgHK5zmn.js → EvidenceReceiptPanel-jb4Tp38b.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-Bx89fXVx.js → GitHubIssuesPanel-xJQiLcxs.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-cuzSw_N3.js → GitHubPRsPanel-84W3Dhk_.js} +1 -1
- package/web-app/dist/assets/{HomePage-B-XP9eTl.js → HomePage-St1Xl2tu.js} +2 -2
- package/web-app/dist/assets/{LoginPage-DuNSWyVy.js → LoginPage-jRt0NUHb.js} +1 -1
- package/web-app/dist/assets/{MagicPage-DEqUoT0l.js → MagicPage-CQLFe7LR.js} +1 -1
- package/web-app/dist/assets/{MetricsPage--rnXkkOt.js → MetricsPage-zzX9eTC5.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-BLCJKK70.js → NotFoundPage-DDu023SY.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-BtF37a4e.js → ProjectPage-D60UURaH.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-BmRyPzwL.js → ProjectsPage-DqVsKxlt.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-Cg3fgOLx.js → SettingsPage-G7pPKvo0.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-CD25qTmg.js → ShowcasePage-CrU_aKgS.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-DNrCZvNp.js → SystemSettingsPage-ClKGQFsB.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-Bpe58D0B.js → TeamsPage-B530vSNe.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-Cwl_bmhO.js → TemplatesPage-COmv_Cqd.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-DYgZnII2.js → TerminalOutput-CufG9YzF.js} +1 -1
- package/web-app/dist/assets/{activity-CsVLJUZG.js → activity-Ct1Updr6.js} +1 -1
- package/web-app/dist/assets/{bell-DCcGk9Ub.js → bell-rcvhQuGr.js} +1 -1
- package/web-app/dist/assets/{bot-BaAaPto-.js → bot-DzeqEI-b.js} +1 -1
- package/web-app/dist/assets/{check-Dy8Lpprr.js → check-zacnZHyC.js} +1 -1
- package/web-app/dist/assets/{chevron-left-CiX3YEuG.js → chevron-left-Lxnkl8Qg.js} +1 -1
- package/web-app/dist/assets/{circle-alert-Bm2AEdEx.js → circle-alert-DoqSdQdB.js} +1 -1
- package/web-app/dist/assets/{clock-D1nWLjJm.js → clock-B7bJcVIC.js} +1 -1
- package/web-app/dist/assets/{cloud-Bp-p2q6I.js → cloud-DdA9Bu6q.js} +1 -1
- package/web-app/dist/assets/{code-xml-Crt8tNsY.js → code-xml-CAZEZ9T8.js} +1 -1
- package/web-app/dist/assets/{database-0lcGHtpv.js → database-Da2GkEIN.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-cup3uE0C.js → dollar-sign-DjDiG-37.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-jPdCMfoJ.js → file-code-corner-CSL-Jij-.js} +1 -1
- package/web-app/dist/assets/{file-plus-CncZcY9z.js → file-plus-02DRA8pV.js} +1 -1
- package/web-app/dist/assets/{globe-BvCLfBOs.js → globe-CGyB90kK.js} +1 -1
- package/web-app/dist/assets/{hammer-CG7gCbza.js → hammer-BaQB96TG.js} +1 -1
- package/web-app/dist/assets/{index-C5sRHsGA.js → index-lcoI1_Kk.js} +3 -3
- package/web-app/dist/assets/{layers-BPIeLcUT.js → layers-BWJBvoeg.js} +1 -1
- package/web-app/dist/assets/{loader-circle-wH9n2Xbt.js → loader-circle-CdcI0FeS.js} +1 -1
- package/web-app/dist/assets/{lock-D_CuUhM7.js → lock-BBkw5NJx.js} +1 -1
- package/web-app/dist/assets/{package-137A8C6B.js → package-BpPRO3LM.js} +1 -1
- package/web-app/dist/assets/{plus-QVF6Q3NZ.js → plus-D7XbyK29.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-Dq_1uZWi.js → refresh-cw-DLG3hyAi.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-Dyzxf9m5.js → rotate-ccw-Bqau4R_S.js} +1 -1
- package/web-app/dist/assets/{scroll-text-DrYmLoL4.js → scroll-text-BtIL3cNk.js} +1 -1
- package/web-app/dist/assets/{server-QWBqdl1e.js → server-tZCmZ4yH.js} +1 -1
- package/web-app/dist/assets/{shield-alert-DOZLbVQY.js → shield-alert-K5JXzFKg.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-CUKmG90b.js → thumbs-up-CHCVyJdw.js} +1 -1
- package/web-app/dist/assets/{trash-2-Cxx8CMS1.js → trash-2-DncNxVq0.js} +1 -1
- package/web-app/dist/assets/{trending-down-CU5sNvAx.js → trending-down-D8Bp0azX.js} +1 -1
- package/web-app/dist/assets/{trending-up-BV8fTyhT.js → trending-up-AixETdKR.js} +1 -1
- package/web-app/dist/assets/{upload-DsSmwrGn.js → upload-VCbjFn2H.js} +1 -1
- package/web-app/dist/assets/{usePolling-MdyOyVKa.js → usePolling-CQvKD2Jj.js} +1 -1
- package/web-app/dist/assets/{user-DblryVAt.js → user-SK-YguQ6.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/autonomy/company-seats.json +0 -82
- package/docs/COMPETITIVE-INTEL-2026-09.md +0 -444
- package/docs/FOUNDER-DECISIONS-TRUST-SEMANTICS-2026-08-01.md +0 -145
- package/docs/FOUNDER-STATUS-AND-DECISIONS-2026-07-01.md +0 -132
- package/docs/LOKI-10-BUILD-PROMPT.md +0 -350
- package/docs/STRATEGY-2026-2028.md +0 -124
- package/docs/V10-VISION.md +0 -161
- package/docs/v10/ADOPTION-PLAN.md +0 -375
- package/docs/v10/ARCHITECT-CUTS.md +0 -744
- package/docs/v10/BACKLOG.md +0 -231
- package/docs/v10/BOARD.md +0 -1403
- package/docs/v10/CONTROL-PLANE.md +0 -120
- package/docs/v10/CONTROL.md +0 -36
- package/docs/v10/CP-ASK-PLAN.md +0 -85
- package/docs/v10/CP-ENTERPRISE-UI.md +0 -537
- package/docs/v10/D51-PHASE-B.md +0 -120
- package/docs/v10/D61-SPEED.md +0 -105
- package/docs/v10/D63-CARDS.md +0 -354
- package/docs/v10/DECISIONS.md +0 -915
- package/docs/v10/E2E-D65.md +0 -123
- package/docs/v10/ENGINE-LAWS.md +0 -163
- package/docs/v10/ENGINE-MEASURE.md +0 -69
- package/docs/v10/ENGINE.md +0 -743
- package/docs/v10/FAILURE-CLASSES.md +0 -2025
- package/docs/v10/FC21B-FC22-PLAN.md +0 -107
- package/docs/v10/FIRST-RUN-GATE.md +0 -39
- package/docs/v10/FOUNDER-QUEUE.md +0 -29
- package/docs/v10/GAP-RESEARCH-1003.md +0 -32
- package/docs/v10/GUARDS.md +0 -883
- package/docs/v10/L0-WAVE1.md +0 -81
- package/docs/v10/LEGACY-REMOVAL.md +0 -408
- package/docs/v10/MEDIUM-ANALYSIS.md +0 -346
- package/docs/v10/METRICS.md +0 -645
- package/docs/v10/MODERNIZE.md +0 -437
- package/docs/v10/OPENCODE-PARITY-PLAN.md +0 -84
- package/docs/v10/OPERATING-MODEL.md +0 -60
- package/docs/v10/PLAN-V12.md +0 -896
- package/docs/v10/PROGRESS.md +0 -2735
- package/docs/v10/RELEASE-11.md +0 -77
- package/docs/v10/RETRO-2026.md +0 -650
- package/docs/v10/ROADMAP-D63.md +0 -35
- package/docs/v10/SCALE.md +0 -140
- package/docs/v10/SCORECARD-PLAN.md +0 -250
- package/docs/v10/SWARM-PROMPT.md +0 -98
- package/docs/v10/SWARM.md +0 -293
- package/docs/v10/cp-redesign/PARITY.md +0 -188
- package/docs/v10/cp-redesign/legacy/INDEX.md +0 -1167
- package/docs/v10/roadmap-10/01-measurement.md +0 -113
- package/docs/v10/roadmap-10/02-cost.md +0 -75
- package/docs/v10/roadmap-10/03-speed.md +0 -65
- package/docs/v10/roadmap-10/04-first-run.md +0 -61
- package/docs/v10/roadmap-10/05-deploy.md +0 -61
- package/docs/v10/roadmap-10/06-stability.md +0 -64
- package/docs/v10/roadmap-10/07-quality.md +0 -57
- package/docs/v10/roadmap-10/08-proof.md +0 -48
- package/docs/v10/roadmap-10/09-safety.md +0 -74
- package/docs/v10/roadmap-10/README.md +0 -1464
- package/skills/sdlc-fleet.md +0 -170
- package/tools/cockpit/SPEC.md +0 -275
- package/tools/cockpit/index.html +0 -146
- package/tools/cockpit/roi-basis.json +0 -33
- 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: [
|
|
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.
|
|
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.
|
|
478
|
+
**v11.75.1 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
11.
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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)}"`
|
package/autonomy/council-v2.sh
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
# - swarm/sycophancy.py (sycophancy detection)
|
|
20
20
|
# - swarm/calibration.py (reviewer calibration)
|
|
21
21
|
#
|
|
22
|
-
# Inline Python
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
package/autonomy/lib/chat.sh
CHANGED
|
@@ -72,7 +72,7 @@ HLP
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
|
|
75
|
-
# /steer: record source=chat and the chat user as actor
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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":
|
package/autonomy/lib/proof-pr.sh
CHANGED
|
@@ -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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
21330
|
-
[[ "${1:-}" == "--dry-run" ]] &&
|
|
21331
|
-
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
package/autonomy/receipt_jwt.py
CHANGED
|
@@ -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
|
|
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:
|