loki-mode 10.9.1 → 10.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/.github/actions/issue-to-pr/action.yml +2 -2
  2. package/README.md +9 -3
  3. package/SKILL.md +12 -2
  4. package/VERSION +1 -1
  5. package/autonomy/lib/proof-generator.py +1 -0
  6. package/autonomy/loki +39 -9
  7. package/autonomy/receipt_jwt.py +46 -1
  8. package/autonomy/run.sh +1 -1
  9. package/autonomy/telemetry.sh +1 -1
  10. package/autonomy/trigger-server.py +1 -0
  11. package/bin/loki +12 -1
  12. package/bin/loki-postinstall.js +12 -0
  13. package/dashboard/__init__.py +1 -1
  14. package/docs/CLI-REFERENCE.md +139 -0
  15. package/docs/INSTALLATION.md +1 -1
  16. package/docs/LOKI-10-BUILD-PROMPT.md +2 -2
  17. package/docs/PLANS-INDEX.md +2 -3
  18. package/docs/SLO.md +3 -3
  19. package/docs/alternative-installations.md +1 -1
  20. package/docs/bug-fixes/agent-04-memory-fixes.md +1 -1
  21. package/docs/dev/release-checklist.md +1 -1
  22. package/{.github/workflows/loki-issue-to-pr.yml → docs/examples/loki-issue-to-pr.yml.example} +2 -0
  23. package/docs/{ONE-RUN-AUDIT.md → history/one-run-audit.md} +6 -0
  24. package/docs/{BUG-AUDIT-v6.61.0.md → history/v6.61.0-audit.md} +6 -0
  25. package/docs/{V8-AGENT-SDK-PLAN.md → history/v8-agent-sdk-plan.md} +6 -0
  26. package/docs/{CONFIG-FILE-PLAN.md → history/v8-config-plan.md} +6 -0
  27. package/docs/test-scenarios/enterprise-scenarios.md +1 -1
  28. package/docs/v10/BOARD.md +3 -0
  29. package/docs/v10/CLI-MODERN.md +190 -0
  30. package/docs/v10/DEPS.md +148 -169
  31. package/docs/v10/FAILURE-CLASSES.md +23 -2
  32. package/docs/v10/GUARDS.md +18 -0
  33. package/docs/v10/LEGACY-REMOVAL.md +334 -25
  34. package/docs/v10/PROGRESS.md +15 -0
  35. package/loki-ts/dist/loki.js +1574 -1794
  36. package/mcp/__init__.py +1 -1
  37. package/package.json +3 -2
  38. package/packages/control-plane/dist/server.js +733 -397
  39. package/packages/control-plane/src/db/fixture-cleanup.ts +47 -0
  40. package/packages/control-plane/src/server/app.ts +2 -0
  41. package/packages/control-plane/src/server/integrity.ts +48 -9
  42. package/packages/control-plane/src/server/routes/stats.ts +16 -5
  43. package/packages/control-plane/src/server/runs.ts +16 -4
  44. package/packages/control-plane/ui/dist/assets/index-BinL6h3i.css +1 -0
  45. package/packages/control-plane/ui/dist/assets/index-BrA22FUs.js +152 -0
  46. package/packages/control-plane/ui/dist/index.html +2 -2
  47. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  48. package/schemas/status-result.schema.json +13 -22
  49. package/skills/release-cadence.md +5 -5
  50. package/web-app/dist/assets/{AdminPage-DqMnfZrH.js → AdminPage-BvbxMtZO.js} +1 -1
  51. package/web-app/dist/assets/{Avatar-BEof29du.js → Avatar-Dc7Scg02.js} +1 -1
  52. package/web-app/dist/assets/{Badge-WD53OL5m.js → Badge-BmVuOqbM.js} +1 -1
  53. package/web-app/dist/assets/{Button-Rzk5flhU.js → Button-DvzqhxRU.js} +1 -1
  54. package/web-app/dist/assets/{CockpitPage-Bqz3PCMh.js → CockpitPage-D8AZo7Ha.js} +1 -1
  55. package/web-app/dist/assets/{ComparePage-Byo2NzAZ.js → ComparePage-NmqaTXDz.js} +1 -1
  56. package/web-app/dist/assets/{ErrorBoundary-BuE0kH3W.js → ErrorBoundary-PGl8Kzoq.js} +1 -1
  57. package/web-app/dist/assets/{EvidenceReceiptPanel-CKFHOPBx.js → EvidenceReceiptPanel-2NY4n9gv.js} +1 -1
  58. package/web-app/dist/assets/{GitHubIssuesPanel-Df_kTMqI.js → GitHubIssuesPanel-DBO_LHHM.js} +1 -1
  59. package/web-app/dist/assets/{GitHubPRsPanel-CouvcKrZ.js → GitHubPRsPanel-K7m9uJ1N.js} +1 -1
  60. package/web-app/dist/assets/{HomePage-dEpLzj0x.js → HomePage-qNQzAJxM.js} +2 -2
  61. package/web-app/dist/assets/{LoginPage-6DVjUND5.js → LoginPage-esu3OK65.js} +1 -1
  62. package/web-app/dist/assets/{MagicPage-BDQ9MOfY.js → MagicPage-CCdVvXrA.js} +1 -1
  63. package/web-app/dist/assets/{MetricsPage-CXiJ04G_.js → MetricsPage-bEvugU2t.js} +1 -1
  64. package/web-app/dist/assets/{NotFoundPage-BaXhZvyj.js → NotFoundPage-BlEjQ1wX.js} +1 -1
  65. package/web-app/dist/assets/{ProjectPage-BzE4V7Ti.js → ProjectPage-Bnug_Yzv.js} +3 -3
  66. package/web-app/dist/assets/{ProjectsPage-ipf6TLMX.js → ProjectsPage-M8r1vfpn.js} +1 -1
  67. package/web-app/dist/assets/{SettingsPage-BDxkUKN6.js → SettingsPage-NqAJpB48.js} +1 -1
  68. package/web-app/dist/assets/{ShowcasePage-YQXD72SM.js → ShowcasePage-8FggxL1P.js} +1 -1
  69. package/web-app/dist/assets/{SystemSettingsPage-Dou7zHS0.js → SystemSettingsPage-3Sz3kFOO.js} +1 -1
  70. package/web-app/dist/assets/{TeamsPage-CQarfcYr.js → TeamsPage-nV-6vdWM.js} +1 -1
  71. package/web-app/dist/assets/{TemplatesPage-CPi1R8Xj.js → TemplatesPage-Brbc_VR9.js} +1 -1
  72. package/web-app/dist/assets/{TerminalOutput-WiGhWdYD.js → TerminalOutput-D1yta5ac.js} +1 -1
  73. package/web-app/dist/assets/{activity-DOa7ejQA.js → activity-oEeKuqFe.js} +1 -1
  74. package/web-app/dist/assets/{bell-CX-VAlYN.js → bell-3NJtqBRR.js} +1 -1
  75. package/web-app/dist/assets/{bot-EDXaZmHc.js → bot-CuvJZ6x1.js} +1 -1
  76. package/web-app/dist/assets/{check-CnBdKk3L.js → check-n4289IZw.js} +1 -1
  77. package/web-app/dist/assets/{chevron-left-BJ_ydRQW.js → chevron-left-CmQeio7h.js} +1 -1
  78. package/web-app/dist/assets/{circle-alert-tz8ufhc_.js → circle-alert-CmmVW-Pd.js} +1 -1
  79. package/web-app/dist/assets/{clock-DFBZPSsH.js → clock-QFqk7GlA.js} +1 -1
  80. package/web-app/dist/assets/{cloud-uy3p_5Q7.js → cloud-BNkSokmq.js} +1 -1
  81. package/web-app/dist/assets/{code-xml-3CbYD9YL.js → code-xml-nWeketqj.js} +1 -1
  82. package/web-app/dist/assets/{database-YiNBXc9c.js → database-C83MXTmJ.js} +1 -1
  83. package/web-app/dist/assets/{dollar-sign-D0wBa4Cv.js → dollar-sign-Blg6TO4y.js} +1 -1
  84. package/web-app/dist/assets/{file-code-corner-DDdZVZ5v.js → file-code-corner-Tk11oUzm.js} +1 -1
  85. package/web-app/dist/assets/{file-plus-D09LTBqt.js → file-plus-DF_eyA6I.js} +1 -1
  86. package/web-app/dist/assets/{globe-BirTPwff.js → globe-D5hDqqmn.js} +1 -1
  87. package/web-app/dist/assets/{hammer-DaE5qgnd.js → hammer-C2hm9lzl.js} +1 -1
  88. package/web-app/dist/assets/{index-D8t7KnQf.js → index-pMxOIwXq.js} +3 -3
  89. package/web-app/dist/assets/{layers-DVVrckRY.js → layers-XWQKGXg0.js} +1 -1
  90. package/web-app/dist/assets/{loader-circle-2-nMGmcb.js → loader-circle-BRuvorm2.js} +1 -1
  91. package/web-app/dist/assets/{lock-D0Xj43pC.js → lock-BSGvQf5v.js} +1 -1
  92. package/web-app/dist/assets/{package-BB7S3egm.js → package-3FJYUYgJ.js} +1 -1
  93. package/web-app/dist/assets/{plus-BLhoMrn3.js → plus-CeIx6g9P.js} +1 -1
  94. package/web-app/dist/assets/{refresh-cw-DMc2uPLw.js → refresh-cw-ChutW42g.js} +1 -1
  95. package/web-app/dist/assets/{rotate-ccw-DM3IP9x7.js → rotate-ccw-BdSjUAk-.js} +1 -1
  96. package/web-app/dist/assets/{scroll-text-lH2uW7rB.js → scroll-text-BjFqxpw3.js} +1 -1
  97. package/web-app/dist/assets/{server-BkerZcdR.js → server-C7UEKdol.js} +1 -1
  98. package/web-app/dist/assets/{shield-alert-B8ohcUfu.js → shield-alert-DY8fpEs7.js} +1 -1
  99. package/web-app/dist/assets/{thumbs-up-CTIxLzPD.js → thumbs-up-Cz1san1g.js} +1 -1
  100. package/web-app/dist/assets/{trash-2-C3zIpsH5.js → trash-2-D2MvGYeP.js} +1 -1
  101. package/web-app/dist/assets/{trending-down-BTT7wV4Y.js → trending-down-CxO3OYOB.js} +1 -1
  102. package/web-app/dist/assets/{trending-up-BzHdCDvF.js → trending-up-DCHKPJLe.js} +1 -1
  103. package/web-app/dist/assets/{upload-HxR34-A8.js → upload-CdPJpSHC.js} +1 -1
  104. package/web-app/dist/assets/{usePolling-DDj6Fupy.js → usePolling-DAH6K3ST.js} +1 -1
  105. package/web-app/dist/assets/{user-qH5y9yNy.js → user-Byyt01W4.js} +1 -1
  106. package/web-app/dist/index.html +1 -1
  107. package/docs/BRANCH-LIFECYCLE-PLAN.md +0 -354
  108. package/docs/EXECUTION-COCKPIT-PLAN.md +0 -289
  109. package/packages/control-plane/ui/dist/assets/index-BQbFv65M.css +0 -1
  110. 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. .github/workflows/loki-issue-to-pr.yml in asklokesh/loki-mode is the
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 .github/workflows/loki-issue-to-pr.yml in asklokesh/loki-mode."
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).** The previous engine still ships in 10.6.6 and is reachable with `LOKI_ENGINE=legacy` or `loki legacy <args>`. `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.
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). `loki dashboard` and `loki status` reach the v10 commands with `LOKI_ENGINE=v10`. 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`.
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` into 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.
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.9.1
6
+ # Loki Mode v10.10.2
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.9.1 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v10.10.2 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 10.9.1
1
+ 10.10.2
@@ -2406,6 +2406,7 @@ def generate(args):
2406
2406
  job_id=str(redacted.get("run_id") or ""),
2407
2407
  run_id=str(redacted.get("run_id") or ""),
2408
2408
  receipt_hash=digest,
2409
+ verification=verification,
2409
2410
  )
2410
2411
  if _tok:
2411
2412
  verification["attestation"] = _tok
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
- print("ok" if claims.get("receipt_sha256") == hashlib.sha256(canon).hexdigest()
972
- else "bad")
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
- print("ok" if claims.get("receipt_sha256") == hashlib.sha256(canon).hexdigest()
1123
- else "bad")
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
- echo "attestation: VERIFIED against ${_pv_jwks}" >&2
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"
@@ -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
- # .github/workflows/loki-issue-to-pr.yml).
5556
+ # docs/examples/loki-issue-to-pr.yml.example).
5557
5557
  #===============================================================================
5558
5558
  _LOKI_WITHHELD_TOKENS=""
5559
5559
  _LOKI_GIT_CONFIG_COUNT_UNSUPPORTED=""
@@ -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);
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "10.9.1"
10
+ __version__ = "10.10.2"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -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.2. 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 |
@@ -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.9.1
5
+ **Version:** v10.10.2
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: `.github/workflows/loki-issue-to-pr.yml`);
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 `provenance.yml` and `sbom.yml` green.
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.
@@ -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
- | CONFIG-FILE-PLAN.md | shipped | Unified config file; `--config` / `--vars` / `--env-file` flags in `autonomy/loki`. |
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
- | 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. |
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 the parity-drift workflow and soak-window observation.
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-drift.yml` workflow runs the Bun and Bash routes side by side; any non-empty diff fails the job |
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
- - The only continuous SLI shipping today is the parity-drift workflow.
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`), with `LOKI_ENGINE=v10`. 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.
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/BUG-AUDIT-v6.61.0.md` plus newly discovered issues.
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, Bun Parity and
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,5 @@
1
+ # Example workflow for users: copy it to .github/workflows/loki-issue-to-pr.yml in your own repository.
2
+ # It is not run by this repository CI.
1
3
  # Hand Loki an issue, get a pull request.
2
4
  #
3
5
  # Label an issue `loki` (or comment `/loki` as a repository owner, member or
@@ -1,3 +1,9 @@
1
+ ---
2
+ date: 2026-09-14
3
+ status: historical
4
+ note: Historical record, last changed 2026-09-14. Superseded by Loki 10; kept for reference only.
5
+ ---
6
+
1
7
  # One-Run Completion Audit
2
8
 
3
9
  Empirical audit of whether ONE RUN completes the job today. Read against
@@ -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