loki-mode 10.9.1 → 10.10.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/.github/actions/issue-to-pr/action.yml +2 -2
- package/README.md +9 -3
- package/SKILL.md +12 -2
- package/VERSION +1 -1
- package/autonomy/lib/proof-generator.py +1 -0
- package/autonomy/loki +39 -9
- package/autonomy/receipt_jwt.py +46 -1
- package/autonomy/run.sh +1 -1
- package/autonomy/telemetry.sh +1 -1
- package/autonomy/trigger-server.py +1 -0
- package/bin/loki +12 -1
- package/bin/loki-postinstall.js +12 -0
- package/dashboard/__init__.py +1 -1
- package/docs/CLI-REFERENCE.md +139 -0
- package/docs/INSTALLATION.md +1 -1
- package/docs/LOKI-10-BUILD-PROMPT.md +2 -2
- package/docs/PLANS-INDEX.md +2 -3
- package/docs/SLO.md +3 -3
- package/docs/alternative-installations.md +1 -1
- package/docs/bug-fixes/agent-04-memory-fixes.md +1 -1
- package/docs/dev/release-checklist.md +1 -1
- package/{.github/workflows/loki-issue-to-pr.yml → docs/examples/loki-issue-to-pr.yml.example} +2 -0
- package/docs/{ONE-RUN-AUDIT.md → history/one-run-audit.md} +6 -0
- package/docs/{BUG-AUDIT-v6.61.0.md → history/v6.61.0-audit.md} +6 -0
- package/docs/{V8-AGENT-SDK-PLAN.md → history/v8-agent-sdk-plan.md} +6 -0
- package/docs/{CONFIG-FILE-PLAN.md → history/v8-config-plan.md} +6 -0
- package/docs/test-scenarios/enterprise-scenarios.md +1 -1
- package/docs/v10/BOARD.md +3 -0
- package/docs/v10/CLI-MODERN.md +190 -0
- package/docs/v10/DEPS.md +148 -169
- package/docs/v10/FAILURE-CLASSES.md +18 -0
- package/docs/v10/LEGACY-REMOVAL.md +334 -25
- package/docs/v10/PROGRESS.md +15 -0
- package/loki-ts/dist/loki.js +1570 -1790
- package/mcp/__init__.py +1 -1
- package/package.json +3 -2
- package/packages/control-plane/dist/server.js +424 -327
- package/packages/control-plane/src/db/fixture-cleanup.ts +47 -0
- package/packages/control-plane/src/server/app.ts +2 -0
- package/packages/control-plane/src/server/integrity.ts +48 -9
- package/packages/control-plane/src/server/routes/stats.ts +16 -5
- package/packages/control-plane/src/server/runs.ts +16 -4
- package/packages/control-plane/ui/dist/assets/index-NAMkcA9N.js +165 -0
- package/packages/control-plane/ui/dist/index.html +1 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/schemas/status-result.schema.json +13 -22
- package/skills/release-cadence.md +5 -5
- package/web-app/dist/assets/{AdminPage-DqMnfZrH.js → AdminPage-B8RjG3sy.js} +1 -1
- package/web-app/dist/assets/{Avatar-BEof29du.js → Avatar-Dttmvqc-.js} +1 -1
- package/web-app/dist/assets/{Badge-WD53OL5m.js → Badge-Bvyp8VrD.js} +1 -1
- package/web-app/dist/assets/{Button-Rzk5flhU.js → Button-DtY5ZrZw.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-Bqz3PCMh.js → CockpitPage-B2gbOwRp.js} +1 -1
- package/web-app/dist/assets/{ComparePage-Byo2NzAZ.js → ComparePage-CHi5nZTU.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BuE0kH3W.js → ErrorBoundary-BUuTj-OQ.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-CKFHOPBx.js → EvidenceReceiptPanel-C5aOn4ES.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-Df_kTMqI.js → GitHubIssuesPanel-isVxxHXb.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-CouvcKrZ.js → GitHubPRsPanel-DtDpxyQl.js} +1 -1
- package/web-app/dist/assets/{HomePage-dEpLzj0x.js → HomePage-Casf-LUB.js} +2 -2
- package/web-app/dist/assets/{LoginPage-6DVjUND5.js → LoginPage-DvB78691.js} +1 -1
- package/web-app/dist/assets/{MagicPage-BDQ9MOfY.js → MagicPage-DU6hmbnC.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-CXiJ04G_.js → MetricsPage-DcPwzoS8.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-BaXhZvyj.js → NotFoundPage-Bs6WxAZ8.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-BzE4V7Ti.js → ProjectPage-RBIqC-DJ.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-ipf6TLMX.js → ProjectsPage-CogXD7jM.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-BDxkUKN6.js → SettingsPage-pAyJAfPt.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-YQXD72SM.js → ShowcasePage-D6bT2bDd.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-Dou7zHS0.js → SystemSettingsPage-CE8xiJRh.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-CQarfcYr.js → TeamsPage-wMS55TDT.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-CPi1R8Xj.js → TemplatesPage-COJNVQqu.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-WiGhWdYD.js → TerminalOutput-Cc2XASxd.js} +1 -1
- package/web-app/dist/assets/{activity-DOa7ejQA.js → activity-C6eHFDjL.js} +1 -1
- package/web-app/dist/assets/{bell-CX-VAlYN.js → bell-BJpVYj4n.js} +1 -1
- package/web-app/dist/assets/{bot-EDXaZmHc.js → bot-BwRVVUQL.js} +1 -1
- package/web-app/dist/assets/{check-CnBdKk3L.js → check-CGDwoKy8.js} +1 -1
- package/web-app/dist/assets/{chevron-left-BJ_ydRQW.js → chevron-left-CF2Nilj6.js} +1 -1
- package/web-app/dist/assets/{circle-alert-tz8ufhc_.js → circle-alert-D0RyRec1.js} +1 -1
- package/web-app/dist/assets/{clock-DFBZPSsH.js → clock-xeF3gW0W.js} +1 -1
- package/web-app/dist/assets/{cloud-uy3p_5Q7.js → cloud-D5Sy69ZZ.js} +1 -1
- package/web-app/dist/assets/{code-xml-3CbYD9YL.js → code-xml-C6-5Ql9I.js} +1 -1
- package/web-app/dist/assets/{database-YiNBXc9c.js → database-BSjG1_z0.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-D0wBa4Cv.js → dollar-sign-FnDR2QUu.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-DDdZVZ5v.js → file-code-corner-BiOK9vR6.js} +1 -1
- package/web-app/dist/assets/{file-plus-D09LTBqt.js → file-plus-3WALQDEE.js} +1 -1
- package/web-app/dist/assets/{globe-BirTPwff.js → globe-vUdUrQqp.js} +1 -1
- package/web-app/dist/assets/{hammer-DaE5qgnd.js → hammer-0VwHUEpa.js} +1 -1
- package/web-app/dist/assets/{index-D8t7KnQf.js → index-BMKIwteZ.js} +3 -3
- package/web-app/dist/assets/{layers-DVVrckRY.js → layers-C6q8kzST.js} +1 -1
- package/web-app/dist/assets/{loader-circle-2-nMGmcb.js → loader-circle-B4Tz724d.js} +1 -1
- package/web-app/dist/assets/{lock-D0Xj43pC.js → lock-yxvEA65n.js} +1 -1
- package/web-app/dist/assets/{package-BB7S3egm.js → package-BpKD0Ot0.js} +1 -1
- package/web-app/dist/assets/{plus-BLhoMrn3.js → plus-Ibqx_Vo9.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-DMc2uPLw.js → refresh-cw-C9auyvi-.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-DM3IP9x7.js → rotate-ccw-2cEiXm6O.js} +1 -1
- package/web-app/dist/assets/{scroll-text-lH2uW7rB.js → scroll-text-BPAWML-w.js} +1 -1
- package/web-app/dist/assets/{server-BkerZcdR.js → server-CZh6B1zx.js} +1 -1
- package/web-app/dist/assets/{shield-alert-B8ohcUfu.js → shield-alert-CivolUIx.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-CTIxLzPD.js → thumbs-up-BP9covEH.js} +1 -1
- package/web-app/dist/assets/{trash-2-C3zIpsH5.js → trash-2-BCDfTcNx.js} +1 -1
- package/web-app/dist/assets/{trending-down-BTT7wV4Y.js → trending-down-5LypivXh.js} +1 -1
- package/web-app/dist/assets/{trending-up-BzHdCDvF.js → trending-up-DNt4SFdk.js} +1 -1
- package/web-app/dist/assets/{upload-HxR34-A8.js → upload-DBmHbY6y.js} +1 -1
- package/web-app/dist/assets/{usePolling-DDj6Fupy.js → usePolling-DOPZcbUL.js} +1 -1
- package/web-app/dist/assets/{user-qH5y9yNy.js → user-BQTJJDCG.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/docs/BRANCH-LIFECYCLE-PLAN.md +0 -354
- package/docs/EXECUTION-COCKPIT-PLAN.md +0 -289
- package/packages/control-plane/ui/dist/assets/index-Dbhu244h.js +0 -155
|
@@ -10,7 +10,7 @@ branding:
|
|
|
10
10
|
# must not hold a write token. Run it with `permissions: contents: read,
|
|
11
11
|
# issues: read` and `actions/checkout` with `persist-credentials: false`, upload
|
|
12
12
|
# `outputs.patch`, and push and open the PR from a second job that runs no
|
|
13
|
-
# agent.
|
|
13
|
+
# agent. docs/examples/loki-issue-to-pr.yml.example in asklokesh/loki-mode is the
|
|
14
14
|
# reference. Earlier versions pushed and opened the PR from the same step that
|
|
15
15
|
# ran the agent; this one does not.
|
|
16
16
|
#
|
|
@@ -247,7 +247,7 @@ runs:
|
|
|
247
247
|
echo "patch=$OUT/loki.patch" >> "$GITHUB_OUTPUT"
|
|
248
248
|
echo "pr_body=$OUT/pr-body.md" >> "$GITHUB_OUTPUT"
|
|
249
249
|
|
|
250
|
-
echo "::warning::This action does not open the pull request (Rule of Two). Upload outputs.patch and open the PR from a job that holds the write token and runs no agent; see
|
|
250
|
+
echo "::warning::This action does not open the pull request (Rule of Two). Upload outputs.patch and open the PR from a job that holds the write token and runs no agent; see docs/examples/loki-issue-to-pr.yml.example in asklokesh/loki-mode."
|
|
251
251
|
if [ -n "$RUN_DIR" ]; then
|
|
252
252
|
echo "Loki 10 receipt under $RUN_DIR/"
|
|
253
253
|
fi
|
package/README.md
CHANGED
|
@@ -9,6 +9,12 @@ An autonomous software factory that knows what it is supposed to deliver, and pr
|
|
|
9
9
|
|
|
10
10
|
[Website](https://www.autonomi.dev/) | [Documentation](wiki/Home.md) | [Installation](docs/INSTALLATION.md) | [Changelog](CHANGELOG.md)
|
|
11
11
|
|
|
12
|
+
<!-- generated:facts -->
|
|
13
|
+
The npm badge above tracks the current release; see [CHANGELOG.md](CHANGELOG.md) for release notes.
|
|
14
|
+
|
|
15
|
+
CLI reference: [docs/CLI-REFERENCE.md](docs/CLI-REFERENCE.md) (generated from the command registry).
|
|
16
|
+
<!-- /generated -->
|
|
17
|
+
|
|
12
18
|
Loki Mode is a free, source-available autonomous coding agent by [Autonomi](https://www.autonomi.dev/). Hand it a PRD, GitHub issue, OpenAPI doc or one-line brief. It derives a delivery contract (the acceptance criteria), builds against it, and ends with a signed Evidence Receipt that states what was proven and what was not. If the contract cannot be derived, it stops and asks one question instead of guessing.
|
|
13
19
|
|
|
14
20
|
Before a build counts as done, a review council selects reviewers from a specialist pool (`agents/types.json`, scored by `run.sh:FOCUS_KEYWORDS`). The bundled MCP server exposes 39 tools over stdio (`mcp/server.py`), including `loki_v10_run`, `loki_v10_status` and `loki_v10_verify` to start a Loki 10 run in the background, read its phase, verdict and cost, and verify its receipt (`BLOCKED` runs report their question). Add it with `claude mcp add loki-mode -- python3 -m mcp.server` from the install directory.
|
|
@@ -88,7 +94,7 @@ loki owner/repo#123
|
|
|
88
94
|
|
|
89
95
|
The v10 engine accepts a quoted multi-word task, a GitHub, GitLab or Jira issue reference, `status`, `verify`, `dashboard`, and other subcommands. Flags (`loki-ts/src/engine10/cli.ts` USAGE): `--no-pr` builds and verifies without opening a pull request, `--deep` requests the deep verify pass and a longer implement budget, `--provider <name>` picks the coding provider, `--max-cost <usd>` sets the per-run cost cap (default $100.00 when an API key is set, no dollar cap on a subscription run where the start line adds `subscription: no dollar cap; usage counts against your plan limits`; or `budgets.per_run` in `loki.yaml`; the flag wins; the start line prints it as `cap $100.00 (default)`; reaching it ends the run BUDGET_STOP, exit 3) (`--json` and `--verbose` are also parsed by the supervisor, see [Quiet output](#quiet-output)). The engine needs Bun; without it the command exits 1 with a message and installation instructions.
|
|
90
96
|
|
|
91
|
-
**Legacy engine (being removed).**
|
|
97
|
+
**Legacy engine (being removed).** Migration note: the previous engine is being removed and has no engine switch; use `loki "<task>"` and `loki owner/repo#N`. `loki start owner/repo#N`, `loki start <issue URL>` and `loki start "<multi-word task>"` run on Loki 10, the same as `loki owner/repo#N` and `loki "<task>"`; `loki start ./prd.md`, a flag-first call and a one-word start stay on the legacy engine. For many issues use `loki backlog owner/repo --all|--label X|--issues N,N` (many issues, N in parallel, each on a `loki/backlog-N` worktree branch) instead. Legacy removal is planned and resumes on 2026-10-07; see [docs/v10/LEGACY-REMOVAL.md](docs/v10/LEGACY-REMOVAL.md). Sections below marked "legacy" describe features that run only on that engine.
|
|
92
98
|
|
|
93
99
|
### The state machine
|
|
94
100
|
|
|
@@ -154,7 +160,7 @@ The run cap is 900s (2700s with `--deep`, `DEFAULT_CAP_S` and `DEEP_CAP_S` in `t
|
|
|
154
160
|
|
|
155
161
|
A finished run prints a short summary (see [Quiet output](#quiet-output), which also shows an example) whose `NOT PROVEN` line is never empty by omission: deep checks deferred to the deep-verify pass are always listed there.
|
|
156
162
|
|
|
157
|
-
`loki status [run-id]` and `loki verify [run-id]` are built on the v10 path (bare `loki verify` follows the newest run, v10 or legacy).
|
|
163
|
+
`loki status [run-id]` and `loki verify [run-id]` are built on the v10 path (bare `loki verify` follows the newest run, v10 or legacy). Two-way Slack (`loki slack serve`) is on by default and documented in [docs/slack.md](docs/slack.md); outbound notifications use `LOKI_SLACK_WEBHOOK_URL`.
|
|
158
164
|
|
|
159
165
|
## Run from Jira or Linear
|
|
160
166
|
|
|
@@ -182,7 +188,7 @@ On by default; set `LOKI_CONTRACT=0` to turn it off. It does nothing unless `.lo
|
|
|
182
188
|
|
|
183
189
|
Both run on your own GitHub Actions minutes; there is no hosted service.
|
|
184
190
|
|
|
185
|
-
- Issue to PR: copy `.github/workflows/loki-issue-to-pr.yml`
|
|
191
|
+
- Issue to PR: copy `docs/examples/loki-issue-to-pr.yml.example` to `.github/workflows/loki-issue-to-pr.yml` in your repository. Label an issue `loki`, or comment `/loki` as an owner, member or collaborator, and it runs `loki owner/repo#N` (the Loki 10 engine) and opens a pull request with an evidence receipt. The agent job holds a read-only token; a separate publish job opens the PR. Set `ANTHROPIC_API_KEY` in repository secrets.
|
|
186
192
|
- Nightly backlog: copy `examples/loki-nightly-backlog.yml` into `.github/workflows/`. Its `schedule:` trigger runs `loki backlog owner/repo --label loki`, one Loki 10 run per labeled open issue:
|
|
187
193
|
|
|
188
194
|
```yaml
|
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: An autonomous software factory that knows what it is supposed to deliver, and proves it did. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v10.
|
|
6
|
+
# Loki Mode v10.10.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 legacy engine, which still ships and is being removed (`loki start owner/repo#N` still routes to it; prefer `loki owner/repo#N`).
|
|
9
9
|
|
|
@@ -195,6 +195,16 @@ This protocol governs **skill module** loading -- task-scoped instruction files
|
|
|
195
195
|
|
|
196
196
|
---
|
|
197
197
|
|
|
198
|
+
## Command list
|
|
199
|
+
|
|
200
|
+
<!-- generated:commands -->
|
|
201
|
+
Commands (generated from `loki-ts/src/cli/registry.ts`; full reference in `docs/CLI-REFERENCE.md`):
|
|
202
|
+
|
|
203
|
+
`version`, `status`, `doctor`, `provider`, `memory`, `rollback`, `proof`, `wiki`, `control`, `kpis`, `report`, `trust`, `crash`, `contract`, `start`, `slack`, `answer`, `engine10`, `help`, `quick`, `quickstart`, `init`, `template`, `verify`, `keys`, `review`, `dashboard`, `config`, `mcp`, `acp`, `stop`, `pause`, `resume`, `why`, `next`, `logs`, `ship`, `deploy`, `import`, `github`, `issue`, `ci`, `modernize`, `share`, `assets`, `export`, `notify`, `tour`, `welcome`, `onboard`, `setup-skill`, `self-update`, `remote`, `cockpit`, `code`, `context`, `secrets`, `api`, `sandbox`, `docker`, `web`, `preview`, `telemetry`, `syslog`, `explain`, `docs`, `test`, `bench`, `voice`, `own`, `secure`, `compliance`, `enterprise`, `projects`, `audit`, `cost`, `metrics`, `sentrux`, `magic`
|
|
204
|
+
<!-- /generated -->
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
198
208
|
## Invocation
|
|
199
209
|
|
|
200
210
|
**Legacy entry point (v6.84.0, being removed; for Loki 10 use `loki "<task>"` or `loki owner/repo#N`):** `loki start [SPEC|ISSUE-REF]` auto-detects whether the input is a PRD file, an issue URL, an issue number, or another spec format (e.g. OpenAPI). No need to pick between `loki start` and `loki run` -- the single command handles all cases.
|
|
@@ -473,4 +483,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
473
483
|
|
|
474
484
|
---
|
|
475
485
|
|
|
476
|
-
**v10.
|
|
486
|
+
**v10.10.1 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
10.
|
|
1
|
+
10.10.1
|
package/autonomy/loki
CHANGED
|
@@ -918,7 +918,7 @@ import sys; sys.path[:] = [p for p in sys.path if p not in ("", ".")]
|
|
|
918
918
|
import json, sys, hashlib, urllib.request
|
|
919
919
|
sys.path.insert(0, sys.argv[3])
|
|
920
920
|
try:
|
|
921
|
-
from receipt_jwt import verify_attestation, _CRYPTO_AVAILABLE
|
|
921
|
+
from receipt_jwt import verify_attestation, check_seal_meta, _CRYPTO_AVAILABLE
|
|
922
922
|
except ImportError:
|
|
923
923
|
sys.exit(1) # -> "" : cannot check, never a verdict
|
|
924
924
|
proof = json.load(open(sys.argv[1]))
|
|
@@ -966,10 +966,14 @@ if not ok:
|
|
|
966
966
|
# receipt. Recompute the digest the same way the receipt records it (with
|
|
967
967
|
# `verification` stripped) and require the signed claim to match, or a valid
|
|
968
968
|
# token lifted from a different run would vouch for these bytes.
|
|
969
|
-
proof.pop("verification", None)
|
|
969
|
+
_vmeta = proof.pop("verification", None)
|
|
970
970
|
canon = json.dumps(proof, sort_keys=True, separators=(",", ":")).encode()
|
|
971
|
-
|
|
972
|
-
|
|
971
|
+
if claims.get("receipt_sha256") != hashlib.sha256(canon).hexdigest():
|
|
972
|
+
print("bad"); sys.exit(0)
|
|
973
|
+
# seal.v2: the verification.* metadata (scope, algo, attestation_kid, ...) is
|
|
974
|
+
# inside the signature; a token that signs different metadata is refused. A
|
|
975
|
+
# legacy seal.v1 token still verifies (its metadata is simply unsigned).
|
|
976
|
+
print("ok" if check_seal_meta(tok, claims, _vmeta)[0] != "bad" else "bad")
|
|
973
977
|
PY
|
|
974
978
|
}
|
|
975
979
|
|
|
@@ -1052,7 +1056,7 @@ import sys; sys.path[:] = [p for p in sys.path if p not in ("", ".")]
|
|
|
1052
1056
|
import json, sys, os, hashlib, urllib.request
|
|
1053
1057
|
sys.path.insert(0, sys.argv[3])
|
|
1054
1058
|
try:
|
|
1055
|
-
from receipt_jwt import verify_attestation, _CRYPTO_AVAILABLE
|
|
1059
|
+
from receipt_jwt import verify_attestation, check_seal_meta, _CRYPTO_AVAILABLE
|
|
1056
1060
|
except ImportError:
|
|
1057
1061
|
sys.exit(1) # "" : cannot check
|
|
1058
1062
|
try:
|
|
@@ -1117,10 +1121,32 @@ if not ok:
|
|
|
1117
1121
|
# A verifying signature is not enough: it must attest to THESE bytes. Recompute
|
|
1118
1122
|
# the digest the way the receipt records it, so a token lifted from another run
|
|
1119
1123
|
# cannot vouch for this one.
|
|
1120
|
-
proof.pop("verification", None)
|
|
1124
|
+
_vmeta = proof.pop("verification", None)
|
|
1121
1125
|
canon = json.dumps(proof, sort_keys=True, separators=(",", ":")).encode()
|
|
1122
|
-
|
|
1123
|
-
|
|
1126
|
+
if claims.get("receipt_sha256") != hashlib.sha256(canon).hexdigest():
|
|
1127
|
+
print("bad"); sys.exit(0)
|
|
1128
|
+
# seal.v2: the verification.* metadata (scope, algo, attestation_kid, ...) is
|
|
1129
|
+
# inside the signature; a token that signs different metadata is refused. A
|
|
1130
|
+
# legacy seal.v1 token still verifies (its metadata is simply unsigned).
|
|
1131
|
+
print("ok" if check_seal_meta(tok, claims, _vmeta)[0] != "bad" else "bad")
|
|
1132
|
+
PY
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
# Prints "legacy" when the receipt's attestation is a seal.v1 token (the
|
|
1136
|
+
# verification.* metadata is NOT inside the signature), else nothing. Callers
|
|
1137
|
+
# append "metadata not signed (legacy seal.v1)" to a VERIFIED line.
|
|
1138
|
+
loki_proof_seal_legacy() {
|
|
1139
|
+
python3 -E - "$1" "${_LOKI_SCRIPT_DIR}" 2>/dev/null <<'PY' || true
|
|
1140
|
+
import sys; sys.path[:] = [p for p in sys.path if p not in ("", ".")]
|
|
1141
|
+
import json, sys
|
|
1142
|
+
sys.path.insert(0, sys.argv[2])
|
|
1143
|
+
from receipt_jwt import _b64url_decode
|
|
1144
|
+
try:
|
|
1145
|
+
tok = json.load(open(sys.argv[1]))["verification"]["attestation"]
|
|
1146
|
+
claims = json.loads(_b64url_decode(tok.split(".")[1]))
|
|
1147
|
+
print("legacy" if "seal" not in claims else "")
|
|
1148
|
+
except Exception:
|
|
1149
|
+
print("")
|
|
1124
1150
|
PY
|
|
1125
1151
|
}
|
|
1126
1152
|
|
|
@@ -37660,7 +37686,11 @@ print(json.dumps(json.load(open(os.environ['LOKI_PROOF_JSON'])), indent=2))
|
|
|
37660
37686
|
_pv_att="$(loki_proof_attestation_check "$pj" "$_pv_jwks")"
|
|
37661
37687
|
case "$_pv_att" in
|
|
37662
37688
|
ok)
|
|
37663
|
-
|
|
37689
|
+
if [ "$(loki_proof_seal_legacy "$pj")" = "legacy" ]; then
|
|
37690
|
+
echo "attestation: VERIFIED against ${_pv_jwks} (metadata not signed (legacy seal.v1): scope, algo and attestation_kid are not covered by the signature)" >&2
|
|
37691
|
+
else
|
|
37692
|
+
echo "attestation: VERIFIED against ${_pv_jwks}" >&2
|
|
37693
|
+
fi
|
|
37664
37694
|
echo " Proven: these bytes were signed by the holder of a key in that set." >&2
|
|
37665
37695
|
echo " NOT proven: that the code is correct. A receipt records which checks ran." >&2
|
|
37666
37696
|
_pv_attestation_field="VERIFIED"
|
package/autonomy/receipt_jwt.py
CHANGED
|
@@ -265,8 +265,49 @@ def build_jwks(private_key=None, retired_public_keys=None) -> dict:
|
|
|
265
265
|
return {"keys": keys}
|
|
266
266
|
|
|
267
267
|
|
|
268
|
+
SEAL_V2 = "seal.v2"
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def seal_meta(verification, kid):
|
|
272
|
+
"""The verification.* metadata a seal.v2 token signs.
|
|
273
|
+
|
|
274
|
+
Every key of `verification` except the token itself and attestation_kid
|
|
275
|
+
(which is replaced by the signing kid, so a forged kid can never match).
|
|
276
|
+
Any extra key a forger adds (for example gpg_signature) changes this dict
|
|
277
|
+
and so fails the comparison in check_seal_meta.
|
|
278
|
+
"""
|
|
279
|
+
meta = {k: v for k, v in (verification or {}).items()
|
|
280
|
+
if k not in ("attestation", "attestation_kid")}
|
|
281
|
+
meta["attestation_kid"] = kid
|
|
282
|
+
return meta
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def check_seal_meta(token, claims, verification):
|
|
286
|
+
"""Bind verification.* metadata to a verified token. Returns (status, why).
|
|
287
|
+
|
|
288
|
+
status is "v2" (metadata signed and matching), "legacy" (seal.v1 token: the
|
|
289
|
+
metadata is NOT signed, the caller must say so), or "bad" (a seal.v2 token
|
|
290
|
+
whose signed metadata differs from what the receipt now shows).
|
|
291
|
+
"""
|
|
292
|
+
if not isinstance(claims, dict) or "seal" not in claims:
|
|
293
|
+
return "legacy", "metadata not signed (legacy seal.v1)"
|
|
294
|
+
if claims.get("seal") != SEAL_V2:
|
|
295
|
+
return "bad", "unknown seal version"
|
|
296
|
+
try:
|
|
297
|
+
kid = json.loads(_b64url_decode(token.split(".")[0])).get("kid", "")
|
|
298
|
+
except Exception:
|
|
299
|
+
return "bad", "malformed token"
|
|
300
|
+
if not isinstance(verification, dict):
|
|
301
|
+
return "bad", "verification block missing"
|
|
302
|
+
if verification.get("attestation_kid") != kid:
|
|
303
|
+
return "bad", "attestation_kid differs from the signing kid"
|
|
304
|
+
if claims.get("meta") != seal_meta(verification, kid):
|
|
305
|
+
return "bad", "verification metadata differs from the signed metadata"
|
|
306
|
+
return "v2", ""
|
|
307
|
+
|
|
308
|
+
|
|
268
309
|
def sign_attestation(private_key, kid, *, job_id, run_id, receipt_hash,
|
|
269
|
-
submitter="", issued_at=None, issuer=""):
|
|
310
|
+
submitter="", issued_at=None, issuer="", verification=None):
|
|
270
311
|
"""Return a compact JWT binding a receipt hash to a job identity.
|
|
271
312
|
|
|
272
313
|
The signed claims are what gpg could never carry: WHICH job produced this
|
|
@@ -294,6 +335,10 @@ def sign_attestation(private_key, kid, *, job_id, run_id, receipt_hash,
|
|
|
294
335
|
# Optional claims are omitted rather than emitted empty: a present-but-blank
|
|
295
336
|
# `sub` reads as "an anonymous submitter was recorded" instead of "no
|
|
296
337
|
# submitter identity was available".
|
|
338
|
+
if verification is not None:
|
|
339
|
+
# seal.v2: the verification.* metadata is inside the signature.
|
|
340
|
+
payload["seal"] = SEAL_V2
|
|
341
|
+
payload["meta"] = seal_meta(verification, kid)
|
|
297
342
|
if submitter:
|
|
298
343
|
payload["sub"] = submitter
|
|
299
344
|
if issuer:
|
package/autonomy/run.sh
CHANGED
|
@@ -5553,7 +5553,7 @@ except Exception:
|
|
|
5553
5553
|
# prompt over IPC; it is left untouched here) explicitly to route around
|
|
5554
5554
|
# this. The boundary is a CI job that holds
|
|
5555
5555
|
# no write token and no SSH agent while the agent runs (see
|
|
5556
|
-
#
|
|
5556
|
+
# docs/examples/loki-issue-to-pr.yml.example).
|
|
5557
5557
|
#===============================================================================
|
|
5558
5558
|
_LOKI_WITHHELD_TOKENS=""
|
|
5559
5559
|
_LOKI_GIT_CONFIG_COUNT_UNSUPPORTED=""
|
package/autonomy/telemetry.sh
CHANGED
|
@@ -168,7 +168,7 @@ _loki_known_command() {
|
|
|
168
168
|
case "${1:-}" in
|
|
169
169
|
--help|--version|-h|-v|agent|analyze|api|assets\
|
|
170
170
|
|audit|bench|checkpoint|ci|cleanup|cluster|cockpit|code\
|
|
171
|
-
|completions|compliance|compound|config|context|control|cost|council|cp\
|
|
171
|
+
|completion|completions|compliance|compound|config|context|control|cost|council|cp\
|
|
172
172
|
|crash|ctx|dashboard|demo|deploy|docker|docs|doctor\
|
|
173
173
|
|dogfood|enterprise|explain|export|failover|github|grill|handoff\
|
|
174
174
|
|heal|help|import|init|internal|issue|kpis|logs\
|
|
@@ -1069,6 +1069,7 @@ class WebhookHandler(http.server.BaseHTTPRequestHandler):
|
|
|
1069
1069
|
token = sign_attestation(
|
|
1070
1070
|
self.signing_key, self.signing_kid,
|
|
1071
1071
|
job_id=job_id, run_id=run_id, receipt_hash=receipt_hash,
|
|
1072
|
+
verification=verification,
|
|
1072
1073
|
)
|
|
1073
1074
|
if not token:
|
|
1074
1075
|
return proof
|
package/bin/loki
CHANGED
|
@@ -115,6 +115,17 @@ else
|
|
|
115
115
|
exec "$BASH_CLI" "$@"
|
|
116
116
|
fi
|
|
117
117
|
|
|
118
|
+
# Shell completions install themselves: once per VERSION, on the first interactive
|
|
119
|
+
# run after an install or upgrade (stamp: ~/.loki/completions-version). Never needed
|
|
120
|
+
# by the user; skipped under CI, LOKI_NO_COMPLETIONS=1 and non-TTY stdout. Failure
|
|
121
|
+
# is silent and never blocks the command.
|
|
122
|
+
if [ -t 1 ] && [ -z "${CI:-}" ] && [ "${LOKI_NO_COMPLETIONS:-}" != "1" ] \
|
|
123
|
+
&& [ "${1:-}" != "completion" ] && [ "${1:-}" != "__complete" ] \
|
|
124
|
+
&& [ "$(cat "${HOME}/.loki/completions-version" 2>/dev/null)" != "$(cat "$REPO_ROOT/VERSION" 2>/dev/null)" ] \
|
|
125
|
+
&& command -v bun >/dev/null 2>&1; then
|
|
126
|
+
bun "$BUN_CLI" completion --auto </dev/null || true
|
|
127
|
+
fi
|
|
128
|
+
|
|
118
129
|
# v7.88.1 covert-path fix (council cF_r2 + cG_r2 sentinel edge): under on-by-default
|
|
119
130
|
# diagnostics, NO telemetry may egress before the user has seen a disclosure once.
|
|
120
131
|
# The cmd_start welcome only shows on `loki start`, so a first `loki version`/`doctor`
|
|
@@ -567,7 +578,7 @@ fi
|
|
|
567
578
|
# Two-token routes (provider show/list, memory list/index) match on the first
|
|
568
579
|
# token only; the Bun dispatcher handles subcommand routing internally.
|
|
569
580
|
case "${1:-}" in
|
|
570
|
-
version|--version|-v|status|stats|doctor|provider|memory|rollback|internal|kpis|trust|proof|receipt|wiki|crash|control|contract|slack|answer)
|
|
581
|
+
version|--version|-v|status|stats|doctor|provider|memory|rollback|internal|kpis|trust|proof|receipt|wiki|crash|control|contract|slack|answer|completion|__complete)
|
|
571
582
|
# v7.5.2: rollback added (wires loki-ts/src/commands/rollback.ts).
|
|
572
583
|
# v7.5.3: internal added for autonomy/run.sh phase1-hooks calls.
|
|
573
584
|
# v7.5.28: kpis added (Phase K MVP: read-only KPI snapshot).
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// npm postinstall: install shell completions. Must never fail the install.
|
|
3
|
+
try {
|
|
4
|
+
const { spawnSync } = require("node:child_process");
|
|
5
|
+
const path = require("node:path");
|
|
6
|
+
if (!process.env.CI && process.env.LOKI_NO_COMPLETIONS !== "1") {
|
|
7
|
+
spawnSync(path.join(__dirname, "loki"), ["completion", "--postinstall"], { stdio: "ignore", timeout: 20000 });
|
|
8
|
+
}
|
|
9
|
+
} catch (e) {
|
|
10
|
+
// ignore: completions are a convenience
|
|
11
|
+
}
|
|
12
|
+
process.exit(0);
|
package/dashboard/__init__.py
CHANGED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# CLI reference
|
|
2
|
+
|
|
3
|
+
Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v10.10.1. Do not edit by hand.
|
|
4
|
+
Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
|
|
5
|
+
|
|
6
|
+
| Command | Description |
|
|
7
|
+
| --- | --- |
|
|
8
|
+
| `loki version` | Show version |
|
|
9
|
+
| `loki status` | Show current run status |
|
|
10
|
+
| `loki doctor` | System prerequisites health check |
|
|
11
|
+
| `loki provider` | Show, list or set the AI provider |
|
|
12
|
+
| `loki provider show` | Show current provider |
|
|
13
|
+
| `loki provider list` | List providers and install status |
|
|
14
|
+
| `loki provider set` | Switch the active provider |
|
|
15
|
+
| `loki memory` | Cross-project learnings |
|
|
16
|
+
| `loki memory list` | All learnings |
|
|
17
|
+
| `loki memory index` | Show or rebuild the memory index |
|
|
18
|
+
| `loki memory show` | Show one learning |
|
|
19
|
+
| `loki memory search` | Search learnings |
|
|
20
|
+
| `loki memory stats` | Memory statistics |
|
|
21
|
+
| `loki memory consolidate` | Episodic-to-semantic pipeline |
|
|
22
|
+
| `loki memory compound` | Compound learnings |
|
|
23
|
+
| `loki rollback` | Restore .loki/ state from a checkpoint |
|
|
24
|
+
| `loki rollback list` | List checkpoints |
|
|
25
|
+
| `loki rollback show` | Show a checkpoint |
|
|
26
|
+
| `loki rollback to` | Restore a checkpoint |
|
|
27
|
+
| `loki rollback latest` | Restore the latest checkpoint |
|
|
28
|
+
| `loki proof` (alias: `receipt`) | Inspect and share proof-of-run receipts |
|
|
29
|
+
| `loki proof list` | List receipts |
|
|
30
|
+
| `loki proof show` | Show a receipt |
|
|
31
|
+
| `loki proof open` | Open a receipt |
|
|
32
|
+
| `loki proof share` | Share a receipt |
|
|
33
|
+
| `loki wiki` | Cited codebase wiki and Q&A |
|
|
34
|
+
| `loki wiki generate` | Generate the wiki |
|
|
35
|
+
| `loki wiki show` | Show a section |
|
|
36
|
+
| `loki wiki ask` | Ask a question |
|
|
37
|
+
| `loki control` | Control Plane (serve, backfill, prune, status) |
|
|
38
|
+
| `loki control serve` | Run the control plane and UI |
|
|
39
|
+
| `loki control backfill` | Ship DIR/.loki/runs to the control plane |
|
|
40
|
+
| `loki control prune` | Delete matching runs |
|
|
41
|
+
| `loki control status` | Show control plane reachability |
|
|
42
|
+
| `loki kpis` | KPI snapshot (alias of report kpis) |
|
|
43
|
+
| `loki report` | Reporting: kpis, session, metrics, cost, export, share, dogfood |
|
|
44
|
+
| `loki report kpis` | Canonical KPI snapshot |
|
|
45
|
+
| `loki report session` | Session report |
|
|
46
|
+
| `loki report metrics` | Metrics report |
|
|
47
|
+
| `loki report cost` | Cost report |
|
|
48
|
+
| `loki report export` | Export session |
|
|
49
|
+
| `loki report share` | Share a report |
|
|
50
|
+
| `loki report dogfood` | Dogfood report |
|
|
51
|
+
| `loki trust` | Trust trajectory from proof history |
|
|
52
|
+
| `loki trust detail` | Trust metrics detail |
|
|
53
|
+
| `loki crash` | Inspect or submit scrubbed crash reports |
|
|
54
|
+
| `loki contract` | Print the spec delivery contract |
|
|
55
|
+
| `loki start` | Run the autonomous build |
|
|
56
|
+
| `loki slack` | Slack inbound handler |
|
|
57
|
+
| `loki slack serve` | Serve the Slack handler |
|
|
58
|
+
| `loki answer` | Resume a BLOCKED run with an answer |
|
|
59
|
+
| `loki engine10` | v10 engine router |
|
|
60
|
+
| `loki engine10 run` | Run the v10 engine |
|
|
61
|
+
| `loki engine10 status` | v10 status |
|
|
62
|
+
| `loki engine10 verify` | v10 verify |
|
|
63
|
+
| `loki engine10 keys` | v10 keys |
|
|
64
|
+
| `loki engine10 dashboard` | v10 dashboard |
|
|
65
|
+
| `loki engine10 modernize` | v10 modernize |
|
|
66
|
+
| `loki help` | Show help |
|
|
67
|
+
| `loki quick` | One small task |
|
|
68
|
+
| `loki quickstart` | Guided first build |
|
|
69
|
+
| `loki init` | Scaffold from a template |
|
|
70
|
+
| `loki template` | Manage PRD templates |
|
|
71
|
+
| `loki verify` | Deterministic PR verification |
|
|
72
|
+
| `loki keys` | Receipt-signing keys |
|
|
73
|
+
| `loki keys export` | Print the public signing key (JWK) |
|
|
74
|
+
| `loki review` | Standalone code review with quality gates |
|
|
75
|
+
| `loki dashboard` | Operations UI server |
|
|
76
|
+
| `loki dashboard start` | Start |
|
|
77
|
+
| `loki dashboard stop` | Stop |
|
|
78
|
+
| `loki dashboard status` | Status |
|
|
79
|
+
| `loki dashboard url` | Print URL |
|
|
80
|
+
| `loki dashboard open` | Open in browser |
|
|
81
|
+
| `loki config` | Manage configuration |
|
|
82
|
+
| `loki config show` | Show config |
|
|
83
|
+
| `loki config init` | Create config |
|
|
84
|
+
| `loki config edit` | Edit config |
|
|
85
|
+
| `loki config path` | Print config path |
|
|
86
|
+
| `loki config set` | Set a value |
|
|
87
|
+
| `loki config get` | Get a value |
|
|
88
|
+
| `loki mcp` | Launch the MCP server (stdio) |
|
|
89
|
+
| `loki acp` | Run Loki as an ACP agent |
|
|
90
|
+
| `loki stop` | Stop execution immediately |
|
|
91
|
+
| `loki pause` | Pause after the current session |
|
|
92
|
+
| `loki resume` | Resume a paused or interrupted run |
|
|
93
|
+
| `loki why` | Explain how the last run ended |
|
|
94
|
+
| `loki next` | Run the right next step |
|
|
95
|
+
| `loki logs` | Tail recent log output |
|
|
96
|
+
| `loki ship` | Ship the verified result |
|
|
97
|
+
| `loki deploy` | Deploy the built product |
|
|
98
|
+
| `loki import` | Import issues or specs |
|
|
99
|
+
| `loki github` | GitHub integration |
|
|
100
|
+
| `loki issue` | Work an issue |
|
|
101
|
+
| `loki ci` | CI helpers |
|
|
102
|
+
| `loki modernize` | Code modernization |
|
|
103
|
+
| `loki share` | Share a run |
|
|
104
|
+
| `loki assets` | Export team assets |
|
|
105
|
+
| `loki assets export` | Export shareable assets |
|
|
106
|
+
| `loki export` | Export session data |
|
|
107
|
+
| `loki notify` | Notifications |
|
|
108
|
+
| `loki tour` | See a sample result |
|
|
109
|
+
| `loki welcome` | First-run opener |
|
|
110
|
+
| `loki onboard` | Onboard to a codebase |
|
|
111
|
+
| `loki setup-skill` | Install the skill symlinks |
|
|
112
|
+
| `loki self-update` (alias: `self_update`, `update`) | Update Loki |
|
|
113
|
+
| `loki remote` (alias: `rc`) | Remote session |
|
|
114
|
+
| `loki cockpit` | Live multi-repo cockpit |
|
|
115
|
+
| `loki code` | Code intelligence |
|
|
116
|
+
| `loki context` (alias: `ctx`) | Cross-project context |
|
|
117
|
+
| `loki secrets` | Secrets handling |
|
|
118
|
+
| `loki api` | Dashboard HTTP API |
|
|
119
|
+
| `loki sandbox` | Docker sandbox |
|
|
120
|
+
| `loki docker` | Docker helpers |
|
|
121
|
+
| `loki web` | Web UI |
|
|
122
|
+
| `loki preview` | Preview the built app |
|
|
123
|
+
| `loki telemetry` (alias: `otel`) | Telemetry controls |
|
|
124
|
+
| `loki syslog` | System log forwarding |
|
|
125
|
+
| `loki explain` | Explain code |
|
|
126
|
+
| `loki docs` | Open docs |
|
|
127
|
+
| `loki test` | Run project tests |
|
|
128
|
+
| `loki bench` | Benchmarks |
|
|
129
|
+
| `loki voice` | Voice input |
|
|
130
|
+
| `loki own` (alias: `handoff`) | Hand off ownership |
|
|
131
|
+
| `loki secure` | Security scan |
|
|
132
|
+
| `loki compliance` | Compliance reports |
|
|
133
|
+
| `loki enterprise` | Enterprise features |
|
|
134
|
+
| `loki projects` | Project registry |
|
|
135
|
+
| `loki audit` | Audit log |
|
|
136
|
+
| `loki cost` | Cost report |
|
|
137
|
+
| `loki metrics` | Metrics |
|
|
138
|
+
| `loki sentrux` | Architecture sensor |
|
|
139
|
+
| `loki magic` | Magic modules |
|
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:** v10.
|
|
5
|
+
**Version:** v10.10.1
|
|
6
6
|
|
|
7
7
|
**Engine note:** `loki "<task>"`, `loki owner/repo#N` and `loki quick` run the Loki 10 engine. `loki start` still routes to the legacy engine, which is being removed (planned work resumes 2026-10-07); prefer `loki owner/repo#N`. See [docs/v10/GUIDE.md](v10/GUIDE.md).
|
|
8
8
|
|
|
@@ -150,7 +150,7 @@ Order is a default. Re-rank with data, and record why.
|
|
|
150
150
|
- Decide whether the Seal replaces the Evidence Receipt or profiles it, and record the decision.
|
|
151
151
|
- **M3. Assign it like a teammate (the Devin experience).**
|
|
152
152
|
- Work arrives from:
|
|
153
|
-
- a GitHub issue label or `/loki` comment (exists:
|
|
153
|
+
- a GitHub issue label or `/loki` comment (exists: `docs/examples/loki-issue-to-pr.yml.example`);
|
|
154
154
|
- a GitLab equivalent;
|
|
155
155
|
- Slack @loki (code exists under `src/integrations/slack/`; verify it is actually reachable, because v9.33.0 found unreachable integrations);
|
|
156
156
|
- Jira (the read path works);
|
|
@@ -200,7 +200,7 @@ Order is a default. Re-rank with data, and record why.
|
|
|
200
200
|
- it works behind a corporate proxy with SSO;
|
|
201
201
|
- the only outbound traffic is to configured model endpoints.
|
|
202
202
|
Measure install-to-first-sealed-PR in the adoption eval.
|
|
203
|
-
- Keep `
|
|
203
|
+
- Keep `sbom.yml` and the release.yml signing steps green.
|
|
204
204
|
- **M10. Simplify and ship v10.0.0.**
|
|
205
205
|
- Collapse the surface.
|
|
206
206
|
- Remove deprecated commands and settings that measurement shows nobody needs.
|
package/docs/PLANS-INDEX.md
CHANGED
|
@@ -4,9 +4,8 @@ This index maps each historical plan doc to its status. Plan docs are kept as de
|
|
|
4
4
|
|
|
5
5
|
| Plan | Status | Notes |
|
|
6
6
|
|---|---|---|
|
|
7
|
-
| BRANCH-LIFECYCLE-PLAN.md | shipped | Feature-branch-by-default + CI/CD-aware deploy; `feature_branch` logic in `autonomy/run.sh`. |
|
|
8
7
|
| BUILD-HUD-PLAN.md | shipped | Live in-terminal build HUD; `LOKI_HUD` / `[HUD]` in `autonomy/run.sh`, CHANGELOG "Live in-terminal build HUD". |
|
|
9
|
-
|
|
|
8
|
+
| history/v8-config-plan.md | shipped | Unified config file; `--config` / `--vars` / `--env-file` flags in `autonomy/loki`. |
|
|
10
9
|
| CRASH-REPORTING-PLAN.md | shipped | Crash-reporting + auto-fix; `cmd_crash()` in `autonomy/loki` (`loki crash`). |
|
|
11
10
|
| DEPLOY-PLAN.md | shipped | `loki deploy` advisory print-only; CHANGELOG "`loki deploy`: advisory, print-only deploy guidance". |
|
|
12
11
|
| FAILURE-MEMORY-PLAN.md | shipped | Failure-memory loop; `FailureMode` schema in `memory/schemas.py`. |
|
|
@@ -29,5 +28,5 @@ This index maps each historical plan doc to its status. Plan docs are kept as de
|
|
|
29
28
|
| UNCERTAINTY-ESCALATION-PLAN.md | shipped | Uncertainty-gated escalation (v7.19.2); uncertainty escalation logic in `autonomy/run.sh`. |
|
|
30
29
|
| VERIFIED-COMPLETION-PLAN.md | shipped | Verified completion (v7.19.1); verified-completion gate in `autonomy/run.sh` + `autonomy/completion-council.sh`. |
|
|
31
30
|
| WELCOME-OPENER-PLAN.md | shipped | Welcome opener ("magic opener"); `welcome` path in `autonomy/loki`. |
|
|
32
|
-
|
|
|
31
|
+
| history/v8-agent-sdk-plan.md | shipped | The v8 Anthropic SDK runtime migration; shipped on `feature/v8-agent-sdk` as v8.0.0 + v8.1 (`loki-ts/src/runner/sdk_invoker.ts`, `sdk_mode.ts`, CHANGELOG v8.0.0/v8.1). Feature-branch-only, not yet merged to main. |
|
|
33
32
|
| V8-SDK-RESEARCH-RAW.md | shipped | Research notes underpinning V8-AGENT-SDK-PLAN; design history for the v8 SDK arc. |
|
package/docs/SLO.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Service Level Objectives
|
|
2
2
|
|
|
3
|
-
This document records baseline targets for the user-visible behavior of the CLI and the runner. These are honest first-pass targets. **No SLI/SLO infrastructure is shipped yet.** Tracking is manual, via
|
|
3
|
+
This document records baseline targets for the user-visible behavior of the CLI and the runner. These are honest first-pass targets. **No SLI/SLO infrastructure is shipped yet.** Tracking is manual, via soak-window observation.
|
|
4
4
|
|
|
5
5
|
The targets below should be treated as goals, not contracts. They will be revised as measurement infrastructure is built out.
|
|
6
6
|
|
|
@@ -25,7 +25,7 @@ The targets below should be treated as goals, not contracts. They will be revise
|
|
|
25
25
|
|
|
26
26
|
| Property | Target | Measurement |
|
|
27
27
|
|----------|--------|-------------|
|
|
28
|
-
| Byte-divergence between Bash and Bun routes for the ported commands | 0 divergences | `parity
|
|
28
|
+
| Byte-divergence between Bash and Bun routes for the ported commands | 0 divergences | `tests/test-bash-bun-parity.sh` and the per-command parity suites (run on demand and in the Tests workflow) |
|
|
29
29
|
|
|
30
30
|
The eight commands currently in scope: `version`, `status`, `stats`, `doctor`, `provider show`, `provider list`, `memory list`, `memory index`.
|
|
31
31
|
|
|
@@ -45,7 +45,7 @@ The reliability numbers above are explicitly aspirational. The system does not c
|
|
|
45
45
|
|
|
46
46
|
## Notes on measurement
|
|
47
47
|
|
|
48
|
-
-
|
|
48
|
+
- There is no continuous parity SLI shipping today; parity is checked by test suites only.
|
|
49
49
|
- Latency measurements are recorded in `.loki/metrics/migration_bench_soak.jsonl` when a benchmark run is performed; they are not collected continuously.
|
|
50
50
|
- Reliability is tracked by manual review during the v7.3.0 soak window.
|
|
51
51
|
|
|
@@ -89,7 +89,7 @@ jobs:
|
|
|
89
89
|
| `github_token` | (required) | GitHub token for PR comments |
|
|
90
90
|
| `prd_file` | | Path to PRD file (for fix/test modes) |
|
|
91
91
|
|
|
92
|
-
**Engine:** every mode runs the Loki 10 engine through `loki start "<task>" --no-pr --provider <name> --max-cost <usd>` (the same path as `loki start owner/repo#N`)
|
|
92
|
+
**Engine:** every mode runs the Loki 10 engine through `loki start "<task>" --no-pr --provider <name> --max-cost <usd>` (the same path as `loki start owner/repo#N`). The PRD file or PR diff is folded into the task text. The action never opens a PR itself (Rule of Two). A run that crosses the cap ends BUDGET_STOP (exit 3). The legacy `--simple` path is no longer used.
|
|
93
93
|
|
|
94
94
|
**Modes:**
|
|
95
95
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Scope
|
|
4
4
|
Comprehensive review and fix of all 16 Python modules in `memory/` (~10K lines).
|
|
5
|
-
Addressed bugs from `docs/
|
|
5
|
+
Addressed bugs from `docs/history/v6.61.0-audit.md` plus newly discovered issues.
|
|
6
6
|
|
|
7
7
|
## Bugs Fixed
|
|
8
8
|
|
|
@@ -120,7 +120,7 @@ If any check fails, do not release; fix the root cause first.
|
|
|
120
120
|
|
|
121
121
|
Stage files by name (never `git add -A` or `git add .`), commit with the
|
|
122
122
|
repo-local `asklokesh` identity, no co-author. Batch approved merges locally;
|
|
123
|
-
push once per train (`git push origin main`); wait for Tests
|
|
123
|
+
push once per train (`git push origin main`); wait for Tests and
|
|
124
124
|
Security Audit to go green on that exact SHA before bumping VERSION and
|
|
125
125
|
releasing. GitHub Actions then creates the tag, the GitHub Release, publishes
|
|
126
126
|
npm, builds/pushes Docker, and updates the Homebrew tap. Do not manually
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
date: 2026-03-22
|
|
3
|
+
status: historical
|
|
4
|
+
note: Historical record, last changed 2026-03-22. Superseded by Loki 10; kept for reference only.
|
|
5
|
+
---
|
|
6
|
+
|
|
1
7
|
# Loki Mode Bug Audit - v6.61.0
|
|
2
8
|
Generated: 2026-03-22 by 20 parallel bug-hunting agents (16 initial + 4 final)
|
|
3
9
|
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
date: 2026-07-14
|
|
3
|
+
status: historical
|
|
4
|
+
note: Historical record, last changed 2026-07-14. Superseded by Loki 10; kept for reference only.
|
|
5
|
+
---
|
|
6
|
+
|
|
1
7
|
# V8: SDK-Based Runtime Migration Plan
|
|
2
8
|
|
|
3
9
|
Status: IMPLEMENTED (shipped on feature/v8-agent-sdk as v8.0.0 + v8.1; kept as design history)
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
date: 2026-06-19
|
|
3
|
+
status: historical
|
|
4
|
+
note: Historical record, last changed 2026-06-19. Superseded by Loki 10; kept for reference only.
|
|
5
|
+
---
|
|
6
|
+
|
|
1
7
|
# Unified Config-File Plan (FEAT-CONFIG, task #691)
|
|
2
8
|
|
|
3
9
|
Status: design for implementation. Build target: POST-v7.73.0 main (the v7.73.0
|