loki-mode 11.17.24 → 11.17.26

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 (77) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/autonomy/lib/secure-scan.py +16 -8
  4. package/autonomy/loki +15 -2
  5. package/completions/_loki +4 -0
  6. package/completions/loki.bash +2 -2
  7. package/dashboard/__init__.py +1 -1
  8. package/docs/CLI-REFERENCE.md +4 -1
  9. package/docs/INSTALLATION.md +1 -1
  10. package/docs/SIGNED-RECEIPTS.md +12 -0
  11. package/docs/v10/BOARD.md +28 -25
  12. package/docs/v10/CLI-MODERN.md +2 -2
  13. package/docs/v10/DECISIONS.md +7 -0
  14. package/docs/v10/OPERATING-MODEL.md +1 -1
  15. package/docs/v10/PROGRESS.md +10 -0
  16. package/loki-ts/dist/loki.js +1050 -1012
  17. package/mcp/__init__.py +1 -1
  18. package/package.json +2 -2
  19. package/packages/control-plane/dist/server.js +2 -0
  20. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  21. package/web-app/dist/assets/{AdminPage-BgsFCb6G.js → AdminPage-CHSP5e6k.js} +1 -1
  22. package/web-app/dist/assets/{Avatar-Dpws1ZeN.js → Avatar-CsGnA2OX.js} +1 -1
  23. package/web-app/dist/assets/{Badge-aqx8OHFn.js → Badge-FfL_dQe4.js} +1 -1
  24. package/web-app/dist/assets/{Button-DHfxUlbT.js → Button-Cx5mzyrb.js} +1 -1
  25. package/web-app/dist/assets/{CockpitPage-DCR5vesV.js → CockpitPage-j5pWIHUI.js} +1 -1
  26. package/web-app/dist/assets/{ComparePage-cuKXR1uv.js → ComparePage-BXu0LG_k.js} +1 -1
  27. package/web-app/dist/assets/{ErrorBoundary-DtpmT0jG.js → ErrorBoundary-CKIaI0bV.js} +1 -1
  28. package/web-app/dist/assets/{EvidenceReceiptPanel-BfWo4wKv.js → EvidenceReceiptPanel-DGlJkfzs.js} +1 -1
  29. package/web-app/dist/assets/{GitHubIssuesPanel-mEVOX_OU.js → GitHubIssuesPanel-Df6Remvh.js} +1 -1
  30. package/web-app/dist/assets/{GitHubPRsPanel-BZ5r-aEj.js → GitHubPRsPanel-CQQ9bdM1.js} +1 -1
  31. package/web-app/dist/assets/{HomePage-BDd9Oo2F.js → HomePage-Dk11xfaT.js} +2 -2
  32. package/web-app/dist/assets/{LoginPage-DkIZhiHl.js → LoginPage-DBAIxcUw.js} +1 -1
  33. package/web-app/dist/assets/{MagicPage-B-f0j2nJ.js → MagicPage-CyqSkrsY.js} +1 -1
  34. package/web-app/dist/assets/{MetricsPage-DA8Ay0wl.js → MetricsPage-DQegpg-N.js} +1 -1
  35. package/web-app/dist/assets/{NotFoundPage-Gc285tth.js → NotFoundPage-C0yp5Ap2.js} +1 -1
  36. package/web-app/dist/assets/{ProjectPage-m8eq3wb_.js → ProjectPage-rKmZwOBO.js} +3 -3
  37. package/web-app/dist/assets/{ProjectsPage-Bi3hT-dz.js → ProjectsPage-czX-J8lH.js} +1 -1
  38. package/web-app/dist/assets/{SettingsPage-DTS-0DeC.js → SettingsPage-DkzxPz7F.js} +1 -1
  39. package/web-app/dist/assets/{ShowcasePage-pU3PBH5u.js → ShowcasePage-BVsDC830.js} +1 -1
  40. package/web-app/dist/assets/{SystemSettingsPage-kgLmx5RH.js → SystemSettingsPage-B5Pwye_5.js} +1 -1
  41. package/web-app/dist/assets/{TeamsPage-hq3QcIwm.js → TeamsPage-Bbc8FBY1.js} +1 -1
  42. package/web-app/dist/assets/{TemplatesPage-DGuCo3l9.js → TemplatesPage-D4a3eoRk.js} +1 -1
  43. package/web-app/dist/assets/{TerminalOutput-BvQTYDkD.js → TerminalOutput-BXtC2fVL.js} +1 -1
  44. package/web-app/dist/assets/{activity-BSIMSL11.js → activity-DKZYAOnO.js} +1 -1
  45. package/web-app/dist/assets/{bell-Dz_p4zBz.js → bell-D3RE9q-q.js} +1 -1
  46. package/web-app/dist/assets/{bot-BPiqCx4b.js → bot-CADc3jXB.js} +1 -1
  47. package/web-app/dist/assets/{check-BdnIDQH_.js → check-DCvNMPBE.js} +1 -1
  48. package/web-app/dist/assets/{chevron-left-DZyjqI6t.js → chevron-left-DsM_tWPh.js} +1 -1
  49. package/web-app/dist/assets/{circle-alert-T-48TXlr.js → circle-alert-Bs7D9c0i.js} +1 -1
  50. package/web-app/dist/assets/{clock-DWovJ36o.js → clock-BQLKdG7i.js} +1 -1
  51. package/web-app/dist/assets/{cloud-BeXd75T1.js → cloud-BZwL7Ky0.js} +1 -1
  52. package/web-app/dist/assets/{code-xml-v6JHJEIo.js → code-xml-CIuVlN6J.js} +1 -1
  53. package/web-app/dist/assets/{database-CKh1wyGO.js → database-DTBmbHqP.js} +1 -1
  54. package/web-app/dist/assets/{dollar-sign-ekCljB4r.js → dollar-sign-mBQ_Luuc.js} +1 -1
  55. package/web-app/dist/assets/{file-code-corner-DPTJW6lV.js → file-code-corner-0PVCLO3g.js} +1 -1
  56. package/web-app/dist/assets/{file-plus-Bi1YBI-i.js → file-plus-C2h48ROI.js} +1 -1
  57. package/web-app/dist/assets/{globe-WXH8JrHX.js → globe-B8TLXWN-.js} +1 -1
  58. package/web-app/dist/assets/{hammer-BB52bYCL.js → hammer-DtAQHc4m.js} +1 -1
  59. package/web-app/dist/assets/{index-DC_ZXrfR.js → index-BPInZb4P.js} +3 -3
  60. package/web-app/dist/assets/{layers-eEDzUJ5I.js → layers-7I0qnFXb.js} +1 -1
  61. package/web-app/dist/assets/{loader-circle-B-ckgTV0.js → loader-circle-W2hai54C.js} +1 -1
  62. package/web-app/dist/assets/{lock-IaSvqOBP.js → lock-DuqlYTjH.js} +1 -1
  63. package/web-app/dist/assets/{package-DD_Mc6zc.js → package-DxdG-2j0.js} +1 -1
  64. package/web-app/dist/assets/{plus-B-J2c-0L.js → plus-CMfBxmmK.js} +1 -1
  65. package/web-app/dist/assets/{refresh-cw-B-mxeBhu.js → refresh-cw-CEB_GF0L.js} +1 -1
  66. package/web-app/dist/assets/{rotate-ccw-ljx8J7Uj.js → rotate-ccw-CKuogxUb.js} +1 -1
  67. package/web-app/dist/assets/{scroll-text-C0qhTlMn.js → scroll-text-DvYmWjxR.js} +1 -1
  68. package/web-app/dist/assets/{server-DPbYOIRj.js → server-BmUZpWGN.js} +1 -1
  69. package/web-app/dist/assets/{shield-alert-DcWEcsQ3.js → shield-alert-DCuPE-1R.js} +1 -1
  70. package/web-app/dist/assets/{thumbs-up-BDGNW6yX.js → thumbs-up-DlcnIo-K.js} +1 -1
  71. package/web-app/dist/assets/{trash-2-PQmjTryj.js → trash-2-D1IxWSMc.js} +1 -1
  72. package/web-app/dist/assets/{trending-down-Bagz3Udn.js → trending-down-Bg42QlcY.js} +1 -1
  73. package/web-app/dist/assets/{trending-up-kybNkF4Q.js → trending-up-BwxRm4qz.js} +1 -1
  74. package/web-app/dist/assets/{upload-ZZfo6VWe.js → upload-BFDwqKwL.js} +1 -1
  75. package/web-app/dist/assets/{usePolling-ClRU7-fC.js → usePolling-BTCAbzRU.js} +1 -1
  76. package/web-app/dist/assets/{user-KwLcwppK.js → user-DmkYa44R.js} +1 -1
  77. package/web-app/dist/index.html +1 -1
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 v11.17.24
6
+ # Loki Mode v11.17.26
7
7
 
8
8
  **Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the previous bash loop. PRD-file starts (`loki start ./prd.md`) and the opencode provider still run on it until FC38-SWEEP ports them; the legacy-engine command and the LOKI_ENGINE switch remain removed. Prefer `loki owner/repo#N` for issues.
9
9
 
@@ -483,4 +483,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
483
483
 
484
484
  ---
485
485
 
486
- **v11.17.24 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v11.17.26 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.17.24
1
+ 11.17.26
@@ -114,10 +114,14 @@ _SECRET_PATTERNS = [
114
114
  ("openai-key", re.compile(r"\bsk-[A-Za-z0-9_-]{20,}\b")),
115
115
  # GitHub personal access token (classic): ghp_ + 36 chars
116
116
  ("github-pat", re.compile(r"\bghp_[A-Za-z0-9]{36}\b")),
117
+ # GitHub OAuth / server / user-to-server tokens and fine-grained PATs
118
+ ("github-token", re.compile(r"\b(?:gh[osu]_[A-Za-z0-9]{36}|github_pat_[A-Za-z0-9_]{22,})\b")),
119
+ # Anthropic API key
120
+ ("anthropic-key", re.compile(r"\bsk-ant-[A-Za-z0-9_-]{16,}")),
117
121
  # Google API key: AIza + 35 url-safe chars
118
122
  ("google-api-key", re.compile(r"\bAIza[0-9A-Za-z_-]{35}\b")),
119
123
  # Slack bot token: xoxb- + token body
120
- ("slack-bot-token", re.compile(r"\bxoxb-[0-9A-Za-z-]{10,}\b")),
124
+ ("slack-token", re.compile(r"\bxox[baprs]-[0-9A-Za-z-]{10,}\b")),
121
125
  ]
122
126
 
123
127
  # Placeholder / example markers. If the matched secret (or its surrounding
@@ -427,7 +431,7 @@ def _finding(rule, rel_path, line, severity, message, fix):
427
431
  }
428
432
 
429
433
 
430
- def _scan_file(rel_path, lines):
434
+ def _scan_file(rel_path, lines, secrets_everywhere=False):
431
435
  """Return a list of findings for one file. `lines` is [(lineno, text), ...]."""
432
436
  findings = []
433
437
  browser_served = _is_browser_served(rel_path)
@@ -457,7 +461,10 @@ def _scan_file(rel_path, lines):
457
461
  ))
458
462
 
459
463
  # --- rule 2: secret literal in a browser-served file -------------
460
- if browser_served:
464
+ # secrets_everywhere (opt-in, used by the proof-share redaction scan)
465
+ # applies the same token rule to every text file: a share bundle has no
466
+ # browser/server split, so any token in it is a leak.
467
+ if browser_served or secrets_everywhere:
461
468
  for kind, pat in _SECRET_PATTERNS:
462
469
  for m in pat.finditer(text):
463
470
  secret = m.group(0)
@@ -590,7 +597,7 @@ def _scan_file(rel_path, lines):
590
597
  # scan driver
591
598
  # ---------------------------------------------------------------------------
592
599
 
593
- def scan(target_dir):
600
+ def scan(target_dir, secrets_everywhere=False):
594
601
  """Scan target_dir and return the result dict.
595
602
 
596
603
  Raises ValueError if target_dir is not a readable directory (the CLI maps
@@ -603,7 +610,7 @@ def scan(target_dir):
603
610
  lines = _read_lines(abs_path)
604
611
  if lines is None:
605
612
  continue
606
- findings.extend(_scan_file(rel_path, lines))
613
+ findings.extend(_scan_file(rel_path, lines, secrets_everywhere))
607
614
 
608
615
  # deterministic ordering: by file, then line, then rule
609
616
  findings.sort(key=lambda f: (f["file"], f["line"], f["rule"]))
@@ -630,14 +637,15 @@ def _cli(argv=None):
630
637
  argv = list(sys.argv[1:] if argv is None else argv)
631
638
  # --json is accepted for symmetry with the other shims; output is always
632
639
  # JSON, so the flag is a no-op kept for a stable, predictable interface.
633
- args = [a for a in argv if a != "--json"]
640
+ everywhere = "--secrets-everywhere" in argv
641
+ args = [a for a in argv if a not in ("--json", "--secrets-everywhere")]
634
642
  if not args or argv[0] in ("-h", "--help"):
635
643
  print(json.dumps(
636
- {"error": "usage: secure-scan.py <target_dir> [--json]"}))
644
+ {"error": "usage: secure-scan.py <target_dir> [--json] [--secrets-everywhere]"}))
637
645
  return 2
638
646
  target_dir = args[0]
639
647
  try:
640
- result = scan(target_dir)
648
+ result = scan(target_dir, everywhere)
641
649
  except ValueError as exc:
642
650
  print(json.dumps({"error": str(exc)}))
643
651
  return 2
package/autonomy/loki CHANGED
@@ -1895,6 +1895,7 @@ show_help_all() {
1895
1895
  echo " --no-dashboard Disable web dashboard"
1896
1896
  echo " --isolation LVL Per-run isolation dial: none (default) | worktree | docker"
1897
1897
  echo " --skip-memory Skip loading memory context at startup"
1898
+ echo " --cost PROFILE Opt-in cost profile: lean sets LOKI_ROUTER=1 and LOKI_E10_TRIM=1 unless already set (also LOKI_COST_PROFILE)"
1898
1899
  echo " --spec FILE Run against an edited spec (written by 'loki plan <task> --spec'; see also --spec-first)"
1899
1900
  echo " --fresh-prd Regenerate the PRD from the codebase (no-PRD runs; ignores the reusable generated PRD)"
1900
1901
  echo " --compliance PRESET Enable compliance mode (default|healthcare|fintech|government)"
@@ -2577,7 +2578,7 @@ _loki_start_handoff() {
2577
2578
  _loki_start_flag_kind() {
2578
2579
  _LOKI_START_FLAG_KIND=""
2579
2580
  case "${1%%=*}" in
2580
- --provider|--brief|--budget|--prd|--issue|--isolation|--aider-model|--aider-flags|--cline-model|--compliance|--max-duration|--log-level|--bmad-project|--openspec|--mirofish-rounds|--mirofish-timeout|--output|--config|--vars|--env-file|--remote|--attempts|--mirofish-docker) _LOKI_START_FLAG_KIND=value ;;
2581
+ --provider|--brief|--budget|--cost|--prd|--issue|--isolation|--aider-model|--aider-flags|--cline-model|--compliance|--max-duration|--log-level|--bmad-project|--openspec|--mirofish-rounds|--mirofish-timeout|--output|--config|--vars|--env-file|--remote|--attempts|--mirofish-docker) _LOKI_START_FLAG_KIND=value ;;
2581
2582
  --mirofish) _LOKI_START_FLAG_KIND=optional ;;
2582
2583
  --parallel|--allow-haiku|--regen-prd|--regenerate-prd|--regen|--fresh-prd|--bg|--background|--simple|--complex|--github|--no-dashboard|--api|--sandbox|--skip-memory|--yes|-y|--quiet|--mirofish-bg|--no-mirofish|--no-plan|--fast|--repo-fast|--full|--repo-full|--dry-run|--no-start|--worktree|-w|--pr|--prepare-pr|--ship|--detach|-d|--help|-h|--resume|--) _LOKI_START_FLAG_KIND=bool ;;
2583
2584
  *) return 1 ;;
@@ -2819,6 +2820,7 @@ cmd_start() {
2819
2820
  echo " --regenerate-prd, --regen, or LOKI_PRD_REGEN=1)"
2820
2821
  echo " --compliance PRESET Enable compliance mode (default|healthcare|fintech|government)"
2821
2822
  echo " --budget USD Per-run cost cap (default $(loki_budget_default_usd); auto-pause when exceeded)"
2823
+ echo " --cost PROFILE Opt-in cost profile: lean (LOKI_ROUTER=1, LOKI_E10_TRIM=1 unless already set) or off"
2822
2824
  echo " --bmad-project PATH Use BMAD Method project artifacts as input"
2823
2825
  echo " --openspec PATH Use OpenSpec change directory as input"
2824
2826
  echo " --mirofish [URL] Enable MiroFish market validation (default: localhost:5001)"
@@ -3282,6 +3284,17 @@ cmd_start() {
3282
3284
  export LOKI_BUDGET_LIMIT="$budget_val" LOKI_BUDGET_SOURCE=flag
3283
3285
  shift
3284
3286
  ;;
3287
+ # TEN-COST-01: opt-in cost profile; fills only unset levers (explicit env wins).
3288
+ --cost|--cost=*)
3289
+ if [[ "$1" == --cost=* ]]; then _cost_val="${1#*=}"; _cost_n=1; else _cost_val="${2:-}"; _cost_n=2; fi
3290
+ case "$_cost_val" in
3291
+ lean) : "${LOKI_ROUTER:=1}" "${LOKI_E10_TRIM:=1}"; export LOKI_ROUTER LOKI_E10_TRIM LOKI_COST_PROFILE=lean
3292
+ echo "cost profile lean: LOKI_ROUTER=$LOKI_ROUTER LOKI_E10_TRIM=$LOKI_E10_TRIM" ;;
3293
+ off) ;;
3294
+ *) echo -e "${RED}--cost must be lean or off${NC}" >&2; exit 2 ;;
3295
+ esac
3296
+ shift "$_cost_n"
3297
+ ;;
3285
3298
  # v6.84.0: explicit mode flags (override auto-detection)
3286
3299
  --prd)
3287
3300
  if [[ -n "${2:-}" ]] && [[ "${2:-}" != --* ]]; then
@@ -18707,7 +18720,7 @@ cmd_verify() {
18707
18720
  # verified by the engine10 verifier directly; bin/loki sends a bare verify back here.
18708
18721
  for _pk_arg in "$@"; do
18709
18722
  case "$_pk_arg" in
18710
- --sign-deploy|--receipt|composite.json|*/composite.json|--seal-composite|--seal-composite=*|--max-age|--max-age=*|.loki/groups/*/receipt.json|*/.loki/groups/*/receipt.json)
18723
+ --sign-deploy|--sign-provenance|--url|--receipt|composite.json|*/composite.json|--seal-composite|--seal-composite=*|--max-age|--max-age=*|.loki/groups/*/receipt.json|*/.loki/groups/*/receipt.json)
18711
18724
  _loki_bun_delegate engine10 verify "$@"
18712
18725
  return $? ;;
18713
18726
  # A signed deploy record (.loki/deploys/*.json, schema loki.deploy/1) is re-checked by the same verifier.
package/completions/_loki CHANGED
@@ -185,6 +185,9 @@ function _loki {
185
185
  _arguments \
186
186
  '--pubkey[Check against this public key only]:key file:_files' \
187
187
  '--sign-deploy[Sign a loki.deploy/1 deploy record in place]:record:_files' \
188
+ '--sign-provenance[Sign a loki.provenance/1 doc in place]:doc:_files' \
189
+ '--url[Verify the live provenance doc served at URL]:url:' \
190
+ '--expect-sha[Require the provenance head_sha to equal SHA]:sha:' \
188
191
  '--receipt[Cited receipt file for a deploy record]:receipt:_files' \
189
192
  '--max-age[Reject a receipt older than DUR]:duration:' \
190
193
  '--require-exogenous[Exit 4 when a VERIFIED receipt has no agent-independent passing check]' \
@@ -369,6 +372,7 @@ function _loki_start {
369
372
  '--yes[Skip confirmation prompts]' \
370
373
  '-y[Skip confirmation prompts]' \
371
374
  '--budget[Cost budget limit in USD]:amount:' \
375
+ '--cost[Opt-in cost profile]:profile:(lean off)' \
372
376
  '--model[Model or route override]:model:' \
373
377
  '--max-cost[Spend cap in USD]:amount:' \
374
378
  '--no-pr[Build and verify without opening a pull request]' \
@@ -28,7 +28,7 @@ _loki_completion() {
28
28
  # If the word starts with a dash, show flags
29
29
  # Rule: list every flag bin/loki routes (Bun/engine10 ones such as --model, --max-cost, --spec, --no-pr too), not only cmd_start's own.
30
30
  if [[ "$cur" == -* ]]; then
31
- local flags="--provider --max-iterations --parallel --background --bg --simple --complex --github --no-dashboard --sandbox --skip-memory --spec --spec-first --yes --budget --attempts --model --isolation --max-cost --no-pr --explain-route --brief --worktree --pr --ship --detach --workspace --deploy --health-url --auto-rollback --resume --help"
31
+ local flags="--provider --max-iterations --parallel --background --bg --simple --complex --github --no-dashboard --sandbox --skip-memory --cost --spec --spec-first --yes --budget --attempts --model --isolation --max-cost --no-pr --explain-route --brief --worktree --pr --ship --detach --workspace --deploy --health-url --auto-rollback --resume --help"
32
32
  COMPREPLY=( $(compgen -W "${flags}" -- "$cur") )
33
33
  return 0
34
34
  fi
@@ -157,7 +157,7 @@ _loki_completion() {
157
157
 
158
158
  verify)
159
159
  if [[ "$cur" == -* ]]; then
160
- COMPREPLY=( $(compgen -W "--base --out --block-on --no-llm --json --explain --check-fresh --max-age --hosted --seal-composite --sign-deploy --receipt --pubkey --require-exogenous --help" -- "$cur") )
160
+ COMPREPLY=( $(compgen -W "--base --out --block-on --no-llm --json --explain --check-fresh --max-age --hosted --seal-composite --sign-deploy --sign-provenance --url --expect-sha --receipt --pubkey --require-exogenous --help" -- "$cur") )
161
161
  return 0
162
162
  fi
163
163
  ;;
@@ -7,6 +7,6 @@ Modules:
7
7
  control: Session control helpers (status, atomic writes, origin check)
8
8
  """
9
9
 
10
- __version__ = "11.17.24"
10
+ __version__ = "11.17.26"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -1,6 +1,6 @@
1
1
  # CLI reference
2
2
 
3
- Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.24. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.26. Do not edit by hand.
4
4
  Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
5
5
 
6
6
  | Command | Description |
@@ -37,6 +37,9 @@ Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for th
37
37
  | `loki proof show` | Show a receipt |
38
38
  | `loki proof open` | Open a receipt |
39
39
  | `loki proof share` | Share a receipt |
40
+ | `loki proof badge` | Print the Verified by Loki badge |
41
+ | `loki proof md` | Print badge markdown for a README |
42
+ | `loki proof bundle` | Write a self-verifying receipt bundle |
40
43
  | `loki wiki` | Cited codebase wiki and Q&A |
41
44
  | `loki wiki generate` | Generate the wiki |
42
45
  | `loki wiki show` | Show a section |
@@ -2,7 +2,7 @@
2
2
 
3
3
  Loki Mode, by [Autonomi](https://www.autonomi.dev/), turns a spec or an issue into a verified pull request with a receipt you can check. This page covers installing it, a first run, and the options around it.
4
4
 
5
- **Version:** v11.17.24
5
+ **Version:** v11.17.26
6
6
 
7
7
  **Engine note:** `loki start` is the primary command. `loki start`, `loki "<task>"`, `loki owner/repo#N` and `loki quick` all run the Loki 10 engine, whatever the flag order or input form (PRD file, issue ref, task or one-word brief). The previous loop runs only on `--engine legacy`, `LOKI_ENGINE=legacy`, or for one call when a flag Loki 10 cannot honor is present. See the [user guide](v10/GUIDE.md) and the [5-minute quickstart](QUICKSTART.md).
8
8
 
@@ -46,6 +46,18 @@ rolled-back service answered again (`post_rollback_health`: `healthy`,
46
46
  With `--health-match STR` the probe body must contain STR, and the record stores
47
47
  `health_match` and the deployed `tree_sha`.
48
48
 
49
+ ## Live provenance doc (loki.provenance/1)
50
+
51
+ `loki verify --sign-provenance FILE` signs a JSON file holding `head_sha`,
52
+ `tree_sha`, `receipt_sha256`, `run_id` and `built_at` in place, with the same
53
+ Ed25519 key as a deploy record. Serve the result at
54
+ `/.well-known/loki-provenance.json`. `loki verify --url https://host
55
+ [--pubkey FILE] [--receipt FILE] [--expect-sha SHA]` fetches it (5s timeout,
56
+ 64KB cap, no redirects) and exits 0 VERIFIED only when the signature verifies
57
+ and any cited receipt found locally or via `--receipt` is VERIFIED. An edited
58
+ doc or a wrong `--expect-sha` is TAMPERED (1). A fetch failure, a non-200, a
59
+ non-JSON or oversize body, or an unknown kid is UNCHECKED (2), never VERIFIED.
60
+
49
61
  ## Honest limits
50
62
 
51
63
  - A signature proves **provenance and integrity**, not correctness. The