loki-mode 11.17.36 → 11.17.38

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 (75) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/autonomy/lib/help-core.sh +1 -1
  4. package/autonomy/lib/secret-scan.sh +1 -0
  5. package/autonomy/loki +129 -5
  6. package/autonomy/verify.sh +1 -0
  7. package/completions/_loki +4 -1
  8. package/completions/loki.bash +1 -1
  9. package/dashboard/__init__.py +1 -1
  10. package/docs/CLI-REFERENCE.md +1 -1
  11. package/docs/INSTALLATION.md +1 -1
  12. package/docs/v10/BOARD.md +27 -25
  13. package/docs/v10/PROGRESS.md +6 -0
  14. package/loki-ts/dist/loki.js +1284 -1251
  15. package/mcp/__init__.py +1 -1
  16. package/package.json +2 -2
  17. package/packages/control-plane/dist/server.js +519 -319
  18. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  19. package/web-app/dist/assets/{AdminPage-B-I1NRtL.js → AdminPage-DSztSxlG.js} +1 -1
  20. package/web-app/dist/assets/{Avatar-DT_8Mdba.js → Avatar-DAEkH-Kr.js} +1 -1
  21. package/web-app/dist/assets/{Badge-C09l4W-0.js → Badge-C2g1rIJS.js} +1 -1
  22. package/web-app/dist/assets/{Button-aC5gMeUz.js → Button-CV_oHoqk.js} +1 -1
  23. package/web-app/dist/assets/{CockpitPage-CpH1eekK.js → CockpitPage-K5cwryNH.js} +1 -1
  24. package/web-app/dist/assets/{ComparePage-hM6QwfSW.js → ComparePage-DdbrA3RG.js} +1 -1
  25. package/web-app/dist/assets/{ErrorBoundary-6c3dc7IQ.js → ErrorBoundary-Dpxn98IB.js} +1 -1
  26. package/web-app/dist/assets/{EvidenceReceiptPanel-DKE4l5Tk.js → EvidenceReceiptPanel-km5l3vCA.js} +1 -1
  27. package/web-app/dist/assets/{GitHubIssuesPanel-abdxEU9p.js → GitHubIssuesPanel-DMlTqaRk.js} +1 -1
  28. package/web-app/dist/assets/{GitHubPRsPanel-pHo-s2C4.js → GitHubPRsPanel-CJoaaFmz.js} +1 -1
  29. package/web-app/dist/assets/{HomePage-_-344_LT.js → HomePage-K3iEsqVb.js} +2 -2
  30. package/web-app/dist/assets/{LoginPage-frrXakkY.js → LoginPage-BOVpvaDP.js} +1 -1
  31. package/web-app/dist/assets/{MagicPage-BhafCYFh.js → MagicPage-DosEW7yP.js} +1 -1
  32. package/web-app/dist/assets/{MetricsPage-C5zf292O.js → MetricsPage-BlEv6oWo.js} +1 -1
  33. package/web-app/dist/assets/{NotFoundPage-D6M43Y9l.js → NotFoundPage-CLU9tMFT.js} +1 -1
  34. package/web-app/dist/assets/{ProjectPage-D4kvygK3.js → ProjectPage-BisHUpNi.js} +3 -3
  35. package/web-app/dist/assets/{ProjectsPage-Cu7lmyKY.js → ProjectsPage-CB3Nrofn.js} +1 -1
  36. package/web-app/dist/assets/{SettingsPage-8itZwlRh.js → SettingsPage-wcakpvlP.js} +1 -1
  37. package/web-app/dist/assets/{ShowcasePage-CYlATNwJ.js → ShowcasePage-C4YdF5sd.js} +1 -1
  38. package/web-app/dist/assets/{SystemSettingsPage-DBDfGnoQ.js → SystemSettingsPage-Bn5btsR8.js} +1 -1
  39. package/web-app/dist/assets/{TeamsPage-unFdeJaG.js → TeamsPage-CB6GZBBR.js} +1 -1
  40. package/web-app/dist/assets/{TemplatesPage-c6QupvoO.js → TemplatesPage-D7EZJX1e.js} +1 -1
  41. package/web-app/dist/assets/{TerminalOutput-DzuhSLY5.js → TerminalOutput-Da768cHK.js} +1 -1
  42. package/web-app/dist/assets/{activity-C3i3sjXj.js → activity-BuLQXksG.js} +1 -1
  43. package/web-app/dist/assets/{bell-BXgcpNiL.js → bell-_Kr8CUYd.js} +1 -1
  44. package/web-app/dist/assets/{bot-gYi5RFNf.js → bot-DAbnYgrW.js} +1 -1
  45. package/web-app/dist/assets/{check--JEYw3iQ.js → check-g8z-jOih.js} +1 -1
  46. package/web-app/dist/assets/{chevron-left-CJAjz61W.js → chevron-left-BX1wBgJb.js} +1 -1
  47. package/web-app/dist/assets/{circle-alert-1GfPVQQS.js → circle-alert-CAQ9CJWO.js} +1 -1
  48. package/web-app/dist/assets/{clock-DjpWVOcn.js → clock-B_12h7xJ.js} +1 -1
  49. package/web-app/dist/assets/{cloud-Cgitkgr5.js → cloud-BSXueLDB.js} +1 -1
  50. package/web-app/dist/assets/{code-xml-CxZaU6C9.js → code-xml-CIJS-Yar.js} +1 -1
  51. package/web-app/dist/assets/{database-DOrPow1f.js → database-Cdz3n1dm.js} +1 -1
  52. package/web-app/dist/assets/{dollar-sign-DqAZbHwb.js → dollar-sign-C80juwD5.js} +1 -1
  53. package/web-app/dist/assets/{file-code-corner-whhcIwS0.js → file-code-corner-DrUlON06.js} +1 -1
  54. package/web-app/dist/assets/{file-plus-Dp5DUu4j.js → file-plus-CM4quXAg.js} +1 -1
  55. package/web-app/dist/assets/{globe-Dq6fTDw8.js → globe-B0sONCFO.js} +1 -1
  56. package/web-app/dist/assets/{hammer--bO0oBWq.js → hammer-BjJX-yOi.js} +1 -1
  57. package/web-app/dist/assets/{index-M9OMp27I.js → index-DVGMLFpa.js} +3 -3
  58. package/web-app/dist/assets/{layers-CDURqqkV.js → layers-DkEVnjKP.js} +1 -1
  59. package/web-app/dist/assets/{loader-circle-C1bCbfqC.js → loader-circle-CIDRsfEi.js} +1 -1
  60. package/web-app/dist/assets/{lock-DVMr4ren.js → lock-D7LZarTx.js} +1 -1
  61. package/web-app/dist/assets/{package-CpLzC77t.js → package-BcupWHAG.js} +1 -1
  62. package/web-app/dist/assets/{plus-CXi3LhCN.js → plus-CefQT9P-.js} +1 -1
  63. package/web-app/dist/assets/{refresh-cw-26KajS9u.js → refresh-cw-CFCZx15Z.js} +1 -1
  64. package/web-app/dist/assets/{rotate-ccw-DAXQ_5XQ.js → rotate-ccw-CqmoHhjk.js} +1 -1
  65. package/web-app/dist/assets/{scroll-text-ipwVF4bE.js → scroll-text-zdRz-1_5.js} +1 -1
  66. package/web-app/dist/assets/{server-B6Yla6UI.js → server-CtCyqZ6x.js} +1 -1
  67. package/web-app/dist/assets/{shield-alert-BunS6EV9.js → shield-alert-BUi9cBVm.js} +1 -1
  68. package/web-app/dist/assets/{thumbs-up-X1xmkCyf.js → thumbs-up-DQs8lwJ2.js} +1 -1
  69. package/web-app/dist/assets/{trash-2-DrY1jsTr.js → trash-2-DQRQ4sfI.js} +1 -1
  70. package/web-app/dist/assets/{trending-down-D5A0-8g2.js → trending-down-DTC_CsGY.js} +1 -1
  71. package/web-app/dist/assets/{trending-up-BUVdVPXq.js → trending-up-BXz50tOk.js} +1 -1
  72. package/web-app/dist/assets/{upload-BMHttdxa.js → upload-DC8jWYOF.js} +1 -1
  73. package/web-app/dist/assets/{usePolling-C108x_AT.js → usePolling-DoIkN7zy.js} +1 -1
  74. package/web-app/dist/assets/{user-C0rsicvA.js → user-ndm8EPzF.js} +1 -1
  75. 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.36
6
+ # Loki Mode v11.17.38
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.36 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v11.17.38 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.17.36
1
+ 11.17.38
@@ -117,7 +117,7 @@ Verification
117
117
  loki verify --json One JSON object: command, exit_code, ok, output
118
118
  loki verify --pubkey FILE Check a receipt against a public key
119
119
  loki receipt Inspect the proof-of-run receipt
120
- loki undo <run> [--plan] Plan or apply an undo of a run
120
+ loki undo <run> [--plan|--dry-run] Plan or apply an undo of a run
121
121
 
122
122
  Exit codes: see loki help exit-codes.
123
123
  T
@@ -43,6 +43,7 @@ _commit_scan_secret_file() {
43
43
  'github_pat_[A-Za-z0-9_]{60,}' # GitHub fine-grained PAT
44
44
  'xox[baprs]-[A-Za-z0-9-]{10,}' # Slack token (xoxb-/xoxp-/...)
45
45
  'sk-[A-Za-z0-9]{20,}' # OpenAI-style secret key
46
+ 'sk-ant-[A-Za-z0-9_-]{20,}' # Anthropic API key (hyphenated body)
46
47
  'AIza[0-9A-Za-z_-]{35}' # Google API key
47
48
  'glpat-[A-Za-z0-9_-]{20,}' # GitLab personal access token
48
49
  )
package/autonomy/loki CHANGED
@@ -1853,7 +1853,7 @@ show_help_all() {
1853
1853
  echo " review [opts] Standalone code review with quality gates"
1854
1854
  echo " ultracode \"task\" Run a task as a native Claude Code Dynamic Workflow (opt-in, Claude-only)"
1855
1855
  echo " trust [cmd] Visible trust trajectory; 'trust detail' for metrics"
1856
- echo " undo <run> [--plan] Plan or apply (LOKI_UNDO=1) an undo of a run; verifies the receipt"
1856
+ echo " undo <run> [--plan|--dry-run] Plan or apply (LOKI_UNDO=1) an undo of a run; verifies the receipt"
1857
1857
  echo ""
1858
1858
  echo "Observe:"
1859
1859
  echo " dashboard [cmd] Operations UI server (start|stop|status|url|open)"
@@ -10009,7 +10009,7 @@ _deploy_latest_receipt() {
10009
10009
  return 0
10010
10010
  }
10011
10011
 
10012
- # _deploy_record <dir> <command> <exit_code> <run_id> <anchor_sha> [state] [health_status] [health_url] [rb_attempted] [rb_exit] [receipt_sha256] [started_at] [finished_at] [target] [canary] [post_rollback_health] [health_http_code] [health_match] [tree_sha] [destination] [deployed_url] [health_url_source] [env_keys_csv] [env_source]
10012
+ # _deploy_record <dir> <command> <exit_code> <run_id> <anchor_sha> [state] [health_status] [health_url] [rb_attempted] [rb_exit] [receipt_sha256] [started_at] [finished_at] [target] [canary] [post_rollback_health] [health_http_code] [health_match] [tree_sha] [destination] [deployed_url] [health_url_source] [env_keys_csv] [env_source] [domain] [domain_status] [tls_status] [tls_not_after] [domain_provenance]
10013
10013
  # Writes the executed deploy's own record, then signs it (loki.deploy/1, Ed25519 via the
10014
10014
  # receipt signer in loki-ts/src/util/receipt_signer.ts) so it is bound to the receipt that
10015
10015
  # authorized it; `loki verify <record>` re-checks it offline. An unsigned record is reported
@@ -10037,6 +10037,8 @@ _deploy_record() {
10037
10037
  # --env-file: key NAMES only (comma-joined, validated identifiers) and the file
10038
10038
  # path. A value is never passed here, so the signed record cannot carry one.
10039
10039
  local env_keys_csv="${23:-}" env_source="${24:-}"
10040
+ # --domain: tls_status is "unchecked" unless the openssl proof ran and said otherwise.
10041
+ local domain_rec="${25:-}" domain_status="${26:-}" tls_status="${27:-unchecked}" tls_not_after="${28:-}" domain_prov="${29:-}"
10040
10042
  local ddir="$dir/.loki/deploys"
10041
10043
  [ -d "${LOKI_DIR:-}" ] && ddir="${LOKI_DIR}/deploys"
10042
10044
  mkdir -p "$ddir" 2>/dev/null || return 0
@@ -10046,6 +10048,7 @@ _deploy_record() {
10046
10048
  DR_RBA="$rb_attempted" DR_RBX="$rb_exit" DR_RSHA="$receipt_sha" DR_T0="$started_at" \
10047
10049
  DR_T1="$finished_at" DR_TGT="$target" DR_CAN="$canary" DR_PRB="$post_rb" DR_HC="$hcode_rec" DR_HM="$hmatch" DR_TREE="$tree_sha" DR_DEST="$dest_rec" DR_DURL="$deployed_url" DR_HSRC="$hsrc" \
10048
10050
  DR_ENVK="$env_keys_csv" DR_ENVS="$env_source" \
10051
+ DR_DOM="$domain_rec" DR_DOMS="$domain_status" DR_TLS="$tls_status" DR_TLSA="$tls_not_after" DR_DOMP="$domain_prov" \
10049
10052
  python3 -c '
10050
10053
  import json, os, datetime
10051
10054
  state = os.environ.get("DR_STATE") or "anchored"
@@ -10079,6 +10082,11 @@ json.dump({
10079
10082
  "health_url_source": os.environ.get("DR_HSRC", ""),
10080
10083
  "env_keys": sorted(k for k in os.environ.get("DR_ENVK", "").split(",") if k),
10081
10084
  "env_source": os.environ.get("DR_ENVS", ""),
10085
+ "domain": os.environ.get("DR_DOM", ""),
10086
+ "domain_status": os.environ.get("DR_DOMS", ""),
10087
+ "tls_status": os.environ.get("DR_TLS") or "unchecked",
10088
+ "tls_not_after": os.environ.get("DR_TLSA", ""),
10089
+ "domain_provenance": os.environ.get("DR_DOMP", ""),
10082
10090
  "health_http_code": int(os.environ["DR_HC"]) if os.environ.get("DR_HC", "").isdigit() else None,
10083
10091
  }, open(os.environ["DR_OUT"], "w"), indent=2)
10084
10092
  ' 2>/dev/null || return 0
@@ -10300,6 +10308,80 @@ out("__LOKI_ENV_OK__")
10300
10308
  PYEOF
10301
10309
  }
10302
10310
 
10311
+ # _deploy_domain_step <dir> <command> <domain> <deployed_url> <head_sha>
10312
+ # --domain: attach <domain> with the provider's documented verb, then PROVE TLS with
10313
+ # openssl. Sets _DD_STATUS (attached|manual|failed), _DD_TLS (valid|expiring|invalid|
10314
+ # unchecked), _DD_NOTAFTER and _DD_PROV (match|mismatch|unchecked). Returns 6 when the
10315
+ # attach failed or the TLS handshake/cert is invalid, else 0. tls_status is "valid" ONLY
10316
+ # when the handshake gave a cert and 'openssl x509 -checkend 604800' accepted it.
10317
+ _deploy_domain_step() {
10318
+ local dir="$1" command="$2" domain="$3" durl="$4" head="$5"
10319
+ local arc=0 hint="" pem="" xout="" xrc=0 tmo="" na="" body="" psha=""
10320
+ _DD_STATUS="" _DD_TLS="unchecked" _DD_NOTAFTER="" _DD_PROV="unchecked"
10321
+ echo "Attaching domain: ${domain}"
10322
+ case "$command" in
10323
+ "vercel --prod")
10324
+ hint="Vercel needs DNS for ${domain}: A 76.76.21.21 (apex) or CNAME cname.vercel-dns.com"
10325
+ if [ -z "$durl" ]; then
10326
+ echo " The deploy printed no URL, so 'vercel alias set' has nothing to alias." >&2
10327
+ _DD_STATUS=failed
10328
+ else
10329
+ _DD_STATUS=attached
10330
+ ( cd "$dir" && vercel alias set "$durl" "$domain" ) || arc=$?
10331
+ [ "$arc" -eq 0 ] || _DD_STATUS=failed
10332
+ fi
10333
+ ;;
10334
+ "fly deploy")
10335
+ hint="Fly needs DNS for ${domain}: the A/AAAA or CNAME records 'fly certs show ${domain}' prints"
10336
+ _DD_STATUS=attached
10337
+ ( cd "$dir" && fly certs add "$domain" ) || arc=$?
10338
+ [ "$arc" -eq 0 ] || _DD_STATUS=failed
10339
+ ;;
10340
+ *)
10341
+ _DD_STATUS=manual
10342
+ hint="${command%% *} has no wired domain verb: add ${domain} in its dashboard, then point DNS at the record it shows"
10343
+ echo " Manual step: ${hint}."
10344
+ ;;
10345
+ esac
10346
+ [ "$_DD_STATUS" != failed ] || echo -e "${RED}Domain attach failed (exit ${arc}).${NC}" >&2
10347
+
10348
+ if ! command -v openssl >/dev/null 2>&1; then
10349
+ echo "TLS: openssl not found. tls_status=unchecked (never a claim of valid)."
10350
+ else
10351
+ command -v timeout >/dev/null 2>&1 && tmo="timeout 15"
10352
+ # shellcheck disable=SC2086
10353
+ pem="$($tmo openssl s_client -servername "$domain" -connect "${domain}:443" </dev/null 2>/dev/null)" || true
10354
+ case "$pem" in
10355
+ *"BEGIN CERTIFICATE"*)
10356
+ xout="$(printf '%s\n' "$pem" | openssl x509 -noout -enddate -checkend 604800 2>/dev/null)" || xrc=$?
10357
+ na="$(sed -n 's/^notAfter=//p' <<<"$xout" | head -n 1)"
10358
+ if [ -z "$na" ]; then _DD_TLS=invalid
10359
+ elif [ "$xrc" -eq 0 ]; then _DD_TLS=valid
10360
+ else _DD_TLS=expiring; fi
10361
+ [ -z "$na" ] || _DD_NOTAFTER="$(python3 -c 'import sys,datetime
10362
+ try: print(datetime.datetime.strptime(sys.argv[1].strip(), "%b %d %H:%M:%S %Y GMT").strftime("%Y-%m-%dT%H:%M:%SZ"))
10363
+ except Exception: print(sys.argv[1].strip())' "$na" 2>/dev/null || printf '%s' "$na")"
10364
+ ;;
10365
+ *) _DD_TLS=invalid ;;
10366
+ esac
10367
+ echo "TLS: ${domain} tls_status=${_DD_TLS}${_DD_NOTAFTER:+ (not after ${_DD_NOTAFTER})}"
10368
+ [ "$_DD_TLS" != expiring ] || echo -e "${YELLOW} The certificate expires within 7 days.${NC}" >&2
10369
+ fi
10370
+
10371
+ if [ "$_DD_TLS" = invalid ]; then
10372
+ echo -e "${RED}TLS invalid for ${domain}: no usable certificate was served. DNS may not point at the provider yet.${NC}" >&2
10373
+ [ -z "$hint" ] || echo " ${hint}." >&2
10374
+ elif command -v curl >/dev/null 2>&1; then
10375
+ body="$(curl -fsS --max-time 5 "https://${domain}/.well-known/loki-provenance.json" 2>/dev/null)" || body=""
10376
+ psha="$(python3 -c 'import json,sys;print(json.loads(sys.stdin.read()).get("head_sha") or "")' <<<"$body" 2>/dev/null || true)"
10377
+ if [ -n "$psha" ] && [ -n "$head" ] && [ "$psha" = "$head" ]; then _DD_PROV=match
10378
+ elif [ -n "$psha" ]; then _DD_PROV=mismatch; echo -e "${YELLOW}Provenance head_sha ${psha:0:12} differs from the deployed ${head:0:12}.${NC}" >&2; fi
10379
+ echo "Provenance: ${_DD_PROV}"
10380
+ fi
10381
+ if [ "$_DD_STATUS" = failed ] || [ "$_DD_TLS" = invalid ]; then return 6; fi
10382
+ return 0
10383
+ }
10384
+
10303
10385
  # _deploy_try_execute <dir> <type>
10304
10386
  # The ONLY place a deploy command is ever run. Evaluates the gate, and either
10305
10387
  # executes + records, or REFUSES naming every failed check. Returns the deploy
@@ -10592,12 +10674,21 @@ _deploy_try_execute() {
10592
10674
  fi
10593
10675
  fi
10594
10676
 
10677
+ # --domain: only after a deploy that exited 0 and did not fail its health probe.
10678
+ local domain="${_LOKI_DEPLOY_DOMAIN:-}" dom_rc=0
10679
+ _DD_STATUS="" _DD_TLS="unchecked" _DD_NOTAFTER="" _DD_PROV=""
10680
+ if [ -n "$domain" ] && [ "$rc" -eq 0 ] && [ "$health_status" != "FAILED_HEALTH" ]; then
10681
+ _deploy_domain_step "$dir" "$command" "$domain" "$deployed_url" "$anchor" || dom_rc=$?
10682
+ [ "$_DD_STATUS" != attached ] || exec_disp="${exec_disp}; domain ${domain}"
10683
+ fi
10684
+
10595
10685
  local rec rsha
10596
10686
  finished_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
10597
10687
  rsha="$(python3 -c 'import json,sys;print((json.load(open(sys.argv[1])).get("verification") or {}).get("hash") or "")' "$pj" 2>/dev/null || printf '')"
10598
10688
  rec="$(_deploy_record "$dir" "$exec_disp" "$rc" "${run_id:-unknown}" "${anchor:-unknown}" \
10599
10689
  "$anchor_state" "$health_status" "$health_url" "$rb_attempted" "$rb_exit" \
10600
- "$rsha" "$started_at" "$finished_at" "${command%% *}" "$canary" "$post_rb" "$hcode" "$health_match" "$(git -C "$dir" rev-parse 'HEAD^{tree}' 2>/dev/null || true)" "$dest" "$deployed_url" "$health_src" "$env_keys" "$env_file")"
10690
+ "$rsha" "$started_at" "$finished_at" "${command%% *}" "$canary" "$post_rb" "$hcode" "$health_match" "$(git -C "$dir" rev-parse 'HEAD^{tree}' 2>/dev/null || true)" "$dest" "$deployed_url" "$health_src" "$env_keys" "$env_file" \
10691
+ "$domain" "$_DD_STATUS" "$_DD_TLS" "$_DD_NOTAFTER" "$_DD_PROV")"
10601
10692
  echo ""
10602
10693
  if [ "$rc" -eq 0 ]; then
10603
10694
  echo -e "${GREEN}Deploy command exited 0.${NC}"
@@ -10628,6 +10719,8 @@ _deploy_try_execute() {
10628
10719
  [ "$post_rb" = "FAILED_HEALTH" ] && return 5
10629
10720
  return 4
10630
10721
  fi
10722
+ # 6: the domain could not be attached or its TLS is invalid.
10723
+ if [ "$rc" -eq 0 ] && [ "$dom_rc" -ne 0 ]; then return 6; fi
10631
10724
  return "$rc"
10632
10725
  }
10633
10726
 
@@ -10746,7 +10839,7 @@ cmd_deploy() {
10746
10839
  local LOKI_DEPLOY_ALLOW_UNANCHORED=false
10747
10840
  # Per-invocation like --execute; local so an ambient env var cannot set them.
10748
10841
  local _LOKI_DEPLOY_HEALTH_URL="" _LOKI_DEPLOY_HEALTH_MATCH="" _LOKI_DEPLOY_AUTO_ROLLBACK=false _LOKI_DEPLOY_CANARY=false _LOKI_DEPLOY_DESTINATION=""
10749
- local _LOKI_DEPLOY_ENV_FILE=""
10842
+ local _LOKI_DEPLOY_ENV_FILE="" _LOKI_DEPLOY_DOMAIN=""
10750
10843
 
10751
10844
  # Arg parse (mirror cmd_preview: lenient on unknown args -> no behavior drift).
10752
10845
  while [ $# -gt 0 ]; do
@@ -10754,7 +10847,7 @@ cmd_deploy() {
10754
10847
  --help|-h|help)
10755
10848
  echo -e "${BOLD}Loki Mode -- deploy command advisory (print-only by default)${NC}"
10756
10849
  echo ""
10757
- echo "Usage: loki deploy [--dir <path>] [--no-clip] [--execute [--canary] [--env-file FILE]] [--destination preview|staging|production] [--health-url URL [--health-match STR] [--auto-rollback]]"
10850
+ echo "Usage: loki deploy [--dir <path>] [--no-clip] [--execute [--canary] [--env-file FILE] [--domain HOST]] [--destination preview|staging|production] [--health-url URL [--health-match STR] [--auto-rollback]]"
10758
10851
  echo ""
10759
10852
  echo "Detects your project type and your installed cloud CLI (and any"
10760
10853
  echo "CI/CD pipeline), then PRINTS the exact deploy command for YOU to run."
@@ -10854,6 +10947,15 @@ cmd_deploy() {
10854
10947
  echo " step fails the deploy is not run. Values are masked as K=*** in"
10855
10948
  echo " output; the deploy record stores env_keys (names) and env_source,"
10856
10949
  echo " never values."
10950
+ echo " --domain HOST With --execute, after a deploy that exited 0 and is not FAILED_HEALTH:"
10951
+ echo " attach HOST (Vercel: 'vercel alias set <deployed_url> HOST'; Fly:"
10952
+ echo " 'fly certs add HOST'; Netlify and Cloudflare print the manual dashboard"
10953
+ echo " step, domain_status=manual). Then prove TLS with openssl s_client and"
10954
+ echo " 'openssl x509 -checkend 604800' and re-probe"
10955
+ echo " https://HOST/.well-known/loki-provenance.json. The record stores domain,"
10956
+ echo " domain_status, tls_status (valid|expiring|invalid|unchecked) and"
10957
+ echo " tls_not_after; no openssl means unchecked, never valid. An invalid TLS"
10958
+ echo " handshake or a failed attach exits 6 and prints the DNS record needed."
10857
10959
  echo " --allow-unanchored"
10858
10960
  echo " Proceed when the receipt records NO baseline (nothing"
10859
10961
  echo " about this tree is proven). Never bypasses a recorded"
@@ -10914,6 +11016,16 @@ cmd_deploy() {
10914
11016
  _LOKI_DEPLOY_ENV_FILE="${1#--env-file=}"
10915
11017
  [ -n "$_LOKI_DEPLOY_ENV_FILE" ] || { echo "loki deploy --env-file requires a file path" >&2; return 1; }
10916
11018
  ;;
11019
+ --domain)
11020
+ case "${2:-}" in
11021
+ -*|"") echo "loki deploy --domain requires a hostname" >&2; return 1 ;;
11022
+ *) _LOKI_DEPLOY_DOMAIN="$2"; shift ;;
11023
+ esac
11024
+ ;;
11025
+ --domain=*)
11026
+ _LOKI_DEPLOY_DOMAIN="${1#--domain=}"
11027
+ [ -n "$_LOKI_DEPLOY_DOMAIN" ] || { echo "loki deploy --domain requires a hostname" >&2; return 1; }
11028
+ ;;
10917
11029
  esac
10918
11030
  shift
10919
11031
  done
@@ -10931,6 +11043,18 @@ cmd_deploy() {
10931
11043
  _LOKI_DEPLOY_ENV_FILE="$(cd "$(dirname -- "$_LOKI_DEPLOY_ENV_FILE")" && pwd -P)/$(basename -- "$_LOKI_DEPLOY_ENV_FILE")"
10932
11044
  fi
10933
11045
 
11046
+ if [ -n "$_LOKI_DEPLOY_DOMAIN" ]; then
11047
+ if [ "$do_execute" != true ]; then
11048
+ echo "loki deploy --domain requires --execute (the advisory run attaches nothing)" >&2
11049
+ return 1
11050
+ fi
11051
+ _LOKI_DEPLOY_DOMAIN="$(printf '%s' "$_LOKI_DEPLOY_DOMAIN" | tr '[:upper:]' '[:lower:]')"
11052
+ if ! printf '%s' "$_LOKI_DEPLOY_DOMAIN" | grep -Eq '^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$'; then
11053
+ echo "loki deploy --domain: not a valid hostname: $_LOKI_DEPLOY_DOMAIN" >&2
11054
+ return 1
11055
+ fi
11056
+ fi
11057
+
10934
11058
  if [ "$_LOKI_DEPLOY_AUTO_ROLLBACK" = true ] && [ -z "$_LOKI_DEPLOY_HEALTH_URL" ]; then
10935
11059
  echo "loki deploy --auto-rollback requires --health-url (no health signal, no rollback)" >&2
10936
11060
  return 1
@@ -1175,6 +1175,7 @@ verify_secret_scan_file() {
1175
1175
  'github_pat_[A-Za-z0-9_]{60,}' # GitHub fine-grained PAT
1176
1176
  'xox[baprs]-[A-Za-z0-9-]{10,}' # Slack token (xoxb-/xoxp-/...)
1177
1177
  'sk-[A-Za-z0-9]{20,}' # OpenAI-style secret key
1178
+ 'sk-ant-[A-Za-z0-9_-]{20,}' # Anthropic API key (hyphenated body)
1178
1179
  'AIza[0-9A-Za-z_-]{35}' # Google API key
1179
1180
  'glpat-[A-Za-z0-9_-]{20,}' # GitLab personal access token
1180
1181
  )
package/completions/_loki CHANGED
@@ -179,6 +179,7 @@ function _loki {
179
179
  '--execute[Run the deploy command if the receipt gate passes]' \
180
180
  '--canary[With --execute: staged rollout (Vercel promote, Fly canary)]' \
181
181
  '--env-file[With --execute: push KEY=VALUE env via Vercel, Fly, Netlify or Cloudflare (names-only record)]:env file:_files' \
182
+ '--domain[With --execute: attach a custom domain and prove TLS with openssl]:hostname:' \
182
183
  '--allow-unanchored[Proceed when the receipt records no baseline]' \
183
184
  '--health-url[Health probe URL]:url:' \
184
185
  '--auto-rollback[Roll back on a failed health probe]' \
@@ -194,6 +195,8 @@ function _loki {
194
195
  '--receipt[Cited receipt file for a deploy record]:receipt:_files' \
195
196
  '--max-age[Reject a receipt older than DUR]:duration:' \
196
197
  '--require-exogenous[Exit 4 when a VERIFIED receipt has no agent-independent passing check]' \
198
+ '--explain[List each gate as exogenous or agent-influenced with the evidence it read]' \
199
+ '--json[Print the verdict and gates as JSON on stdout]' \
197
200
  '--seal-composite[Sign a workspace composite]:run dir:_directories' \
198
201
  '--help[Show help]' \
199
202
  '*:receipt or deploy record:_files'
@@ -301,7 +304,7 @@ function _loki_commands {
301
304
  'verify-pr:Verify a PR against its linked issue in a sandbox'
302
305
  'queue:Overnight issue queue with a morning digest'
303
306
  'issues:Run every open issue in a repo and open PRs'
304
- 'undo:Show what undoing a run would do (read-only plan)'
307
+ 'undo:Show what undoing a run would do (read-only plan; --dry-run adds the diffstat)'
305
308
  'chat:Interactive chat session (run, attach)'
306
309
  'route:Print the engine, provider and model route without running'
307
310
  'edit:Make a scoped edit to files'
@@ -150,7 +150,7 @@ _loki_completion() {
150
150
 
151
151
  deploy)
152
152
  if [[ "$cur" == -* ]]; then
153
- COMPREPLY=( $(compgen -W "--execute --destination --canary --env-file --health-url --health-match --auto-rollback --dir --no-clip --allow-unanchored --help" -- "$cur") )
153
+ COMPREPLY=( $(compgen -W "--execute --destination --canary --env-file --domain --health-url --health-match --auto-rollback --dir --no-clip --allow-unanchored --help" -- "$cur") )
154
154
  return 0
155
155
  fi
156
156
  ;;
@@ -7,6 +7,6 @@ Modules:
7
7
  control: Session control helpers (status, atomic writes, origin check)
8
8
  """
9
9
 
10
- __version__ = "11.17.36"
10
+ __version__ = "11.17.38"
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.36. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.38. 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 |
@@ -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.36
5
+ **Version:** v11.17.38
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
 
package/docs/v10/BOARD.md CHANGED
@@ -1009,7 +1009,7 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
1009
1009
  | TEN-DEPLOY-03 | Ship the provenance doc with the build and prove the live URL serves the verified SHA | autonomy/loki (_deploy_try_execute pre-exec and post-health blocks, _deploy_record live_binding field only), tests/test-deploy-receipt-gate.sh (new section), docs/WORKSPACES.md, CHANGELOG.md | HIGH | see Wall in note | ready@2026-10-17T01:40Z | SPLIT per CTO critic into (a) provenance file into deploy root per project type, (b) post-deploy live-binding probe; build as two commits or two agents. wave 3; depends: TEN-DEPLOY-01, TEN-DEPLOY-02. Goal: In _deploy_try_execute, after the gate passes and before the provider runs, write a signed .well-known/loki-provenance.json into the deploy root via `verify --sign-provenance`. The deploy root is public/ for nextjs and vite, the detected dist/ or build/ for static, and is refused with a reason for docker/python where no static root exists. Write it as an untracked build artifact so the dirty-tree gate is evaluated before it. After the deploy, probe <deployed_url>/.well-known/loki-provenance.json. Set live_binding=VERIFIED only when its head_sha equals the anchor. A mismatch gives FAILED_HEALTH exit 4 (stale or wrong build served). Update docs/WORKSPACES.md and replace 'deployed-SHA binding is not implemented' with what is now bound and what is not. Wall: RED: a stubbed vercel copies dist/ into a served dir and a python http.server serves it. On main, no provenance file exists and the record has no live_binding. GREEN: the file exists in dist/.well-known, live_binding=VERIFIED, and its head_sha equals git rev-parse HEAD. A stub that serves an older provenance gives FAILED_HEALTH exit 4. A docker project prints the refusal reason and records live_binding=unsupported, never VERIFIED. The dirty-tree gate still refuses a dirty tree before the file is written. MUTATION: compare against a constant instead of the anchor and the stale-serve case goes red. Gate: bash -n autonomy/loki && shellcheck -S warning autonomy/loki && bash tests/test-deploy-receipt-gate.sh && (cd loki-ts && bun test tests/engine10/verify_cmd.test.ts) Rules: FAILURE-CLASSES row first for any bug fix (D86); no CHANGELOG edits (Release Manager writes notes); DECISIONS numbers assigned by the Chief of Staff; reuse util/secure_scan.ts, the shared badge helper, keys_cmd export and the TS claude login probe instead of new copies; new CLI flags update autonomy/completions and the help-drift guard. |
1010
1010
  | TEN-DEPLOY-04 | Verified deploy badge from loki status --badge | loki-ts/src/commands/status.ts (renderLastDeploy plus --badge flag parse only), loki-ts/tests/commands/status.test.ts, CHANGELOG.md | MEDIUM | see Wall in note | released@2026-10-17T05:06Z | wave 4; depends: TEN-DEPLOY-01 (deployed_url field); live_binding from TEN-DEPLOY-03 is read if present, and its absence omits the badge. Goal: `loki status --badge` reads the newest loki.deploy/1 record (renderLastDeploy already loads it) and verifies it through the existing verify path. It prints a markdown shields badge linking to <deployed_url>/.well-known/loki-provenance.json. The message is 'deployed: verified' (brightgreen) ONLY when the record verifies and live_binding=VERIFIED. 'deployed: unverified' (red) is printed for TAMPERED or a failed health check. In all other cases the badge is omitted with a one-line reason. It never prints green from an unchecked field. The color mapping matches the share badge (autonomy/loki:38291), and no new vocabulary is added. Wall: RED: status.test.ts fixture with a signed healthy record, live_binding=VERIFIED and deployed_url. On main, --badge is unknown and no badge line is printed. GREEN: the badge line contains 'brightgreen' and deployed_url. A record with health FAILED_HEALTH gives a red badge. An unsigned record or a missing live_binding omits the badge and prints the reason. A record with no deployed_url omits the badge. MUTATION: drop the verify call and the unsigned case goes green, so the test goes red. Gate: cd loki-ts && bun test tests/commands/status.test.ts && bunx tsc --noEmit && bash tests/test-status-surface-agrees.sh Rules: FAILURE-CLASSES row first for any bug fix (D86); no CHANGELOG edits (Release Manager writes notes); DECISIONS numbers assigned by the Chief of Staff; reuse util/secure_scan.ts, the shared badge helper, keys_cmd export and the TS claude login probe instead of new copies; new CLI flags update autonomy/completions and the help-drift guard. |
1011
1011
  | TEN-DEPLOY-05 | loki deploy --env-file: push env to the provider with names-only records | autonomy/loki (cmd_deploy arg parse for --env-file, _deploy_try_execute env step, _deploy_record env_keys field only), tests/test-deploy-receipt-gate.sh (new section), autonomy/completions (loki deploy flag list only), CHANGELOG.md | HIGH | see Wall in note | released v11.17.35 | SPLIT per CTO critic into (a) env-file parser, .env.example check, masking, env_keys record, (b) four provider verbs; build as two commits or two agents. wave 4; depends: TEN-DEPLOY-03 (same function, serialized to avoid conflicts). Goal: `--env-file FILE` (with --execute only) parses KEY=VALUE with no shell eval. It refuses when a key in .env.example is missing from FILE, naming the keys. Env is applied through documented verbs only: Vercel `vercel --prod -e K=V` per key (args built as an array, never through the shell); Fly `fly secrets set --stage K=V ...` before `fly deploy`; Netlify `netlify env:import FILE`; Cloudflare `wrangler secret bulk FILE`. An unsupported provider refuses with nothing run. The record stores env_keys (names, sorted) and env_source; it NEVER stores values. Values never appear in stdout, the record or the printed 'Running:' line, where they are masked as K=***. Wall: RED: a recording vercel stub logs argv. On main, --env-file is ignored and no -e args appear. GREEN: argv has `-e API_URL=x -e TOKEN=s3cr3t`. Grepping stdout, stderr and the record for s3cr3t finds nothing; env_keys=[API_URL,TOKEN]. When .env.example lists DB_URL and the env file lacks it, the command refuses with rc 1, no stub calls and DB_URL named. A value with $(touch pwned) leaves no file named pwned. MUTATION: write values into the record and the secret-grep goes red. Gate: bash -n autonomy/loki && shellcheck -S warning autonomy/loki && bash tests/test-deploy-receipt-gate.sh && bash tests/test-completion-drift.sh (or whichever completion drift test the CHANGELOG cites) Rules: FAILURE-CLASSES row first for any bug fix (D86); no CHANGELOG edits (Release Manager writes notes); DECISIONS numbers assigned by the Chief of Staff; reuse util/secure_scan.ts, the shared badge helper, keys_cmd export and the TS claude login probe instead of new copies; new CLI flags update autonomy/completions and the help-drift guard. |
1012
- | TEN-DEPLOY-06 | loki deploy --domain: attach a custom domain and prove TLS | autonomy/loki (cmd_deploy --domain parse and a post-health domain block in _deploy_try_execute, _deploy_record domain/tls fields only), tests/test-deploy-receipt-gate.sh (new section), CHANGELOG.md | MEDIUM | see Wall in note | ready@2026-10-17T01:40Z | wave 5; depends: TEN-DEPLOY-05 (same function, serialized). Goal: `--domain example.com` (with --execute) runs documented verbs after a healthy deploy: Vercel `vercel alias set <deployed_url> <domain>`; Fly `fly certs add <domain>`. Netlify and Cloudflare print the manual dashboard step and set domain_status=manual. Then a TLS proof runs: `openssl s_client -servername <domain> -connect <domain>:443` plus `openssl x509 -noout -enddate -checkend 604800`. It records domain, tls_status (valid/expiring/invalid/unchecked) and tls_not_after, and re-probes https://<domain>/.well-known/loki-provenance.json for the same head_sha. DNS not yet pointed gives tls_status=invalid and exit 6, with the DNS record the provider needs printed. It never claims valid without the openssl check. Wall: RED: vercel, openssl and curl are stubbed. On main, --domain is ignored. GREEN: the alias set argv is recorded, tls_status=valid and tls_not_after is set. An openssl stub that fails -checkend gives expiring. An openssl handshake failure gives invalid and exit 6. A netlify project gives domain_status=manual, no alias call, and tls still checked. No openssl on PATH gives unchecked, never valid. MUTATION: default tls_status to valid and the missing-openssl case goes red. Gate: bash -n autonomy/loki && shellcheck -S warning autonomy/loki && bash tests/test-deploy-receipt-gate.sh Rules: FAILURE-CLASSES row first for any bug fix (D86); no CHANGELOG edits (Release Manager writes notes); DECISIONS numbers assigned by the Chief of Staff; reuse util/secure_scan.ts, the shared badge helper, keys_cmd export and the TS claude login probe instead of new copies; new CLI flags update autonomy/completions and the help-drift guard. |
1012
+ | TEN-DEPLOY-06 | loki deploy --domain: attach a custom domain and prove TLS | autonomy/loki (cmd_deploy --domain parse and a post-health domain block in _deploy_try_execute, _deploy_record domain/tls fields only), tests/test-deploy-receipt-gate.sh (new section), CHANGELOG.md | MEDIUM | see Wall in note | released v11.17.38 | wave 5; depends: TEN-DEPLOY-05 (same function, serialized). Goal: `--domain example.com` (with --execute) runs documented verbs after a healthy deploy: Vercel `vercel alias set <deployed_url> <domain>`; Fly `fly certs add <domain>`. Netlify and Cloudflare print the manual dashboard step and set domain_status=manual. Then a TLS proof runs: `openssl s_client -servername <domain> -connect <domain>:443` plus `openssl x509 -noout -enddate -checkend 604800`. It records domain, tls_status (valid/expiring/invalid/unchecked) and tls_not_after, and re-probes https://<domain>/.well-known/loki-provenance.json for the same head_sha. DNS not yet pointed gives tls_status=invalid and exit 6, with the DNS record the provider needs printed. It never claims valid without the openssl check. Wall: RED: vercel, openssl and curl are stubbed. On main, --domain is ignored. GREEN: the alias set argv is recorded, tls_status=valid and tls_not_after is set. An openssl stub that fails -checkend gives expiring. An openssl handshake failure gives invalid and exit 6. A netlify project gives domain_status=manual, no alias call, and tls still checked. No openssl on PATH gives unchecked, never valid. MUTATION: default tls_status to valid and the missing-openssl case goes red. Gate: bash -n autonomy/loki && shellcheck -S warning autonomy/loki && bash tests/test-deploy-receipt-gate.sh Rules: FAILURE-CLASSES row first for any bug fix (D86); no CHANGELOG edits (Release Manager writes notes); DECISIONS numbers assigned by the Chief of Staff; reuse util/secure_scan.ts, the shared badge helper, keys_cmd export and the TS claude login probe instead of new copies; new CLI flags update autonomy/completions and the help-drift guard. |
1013
1013
  | TEN-DEPLOY-07 | loki github publish: receipt-stamped GitHub export from the CLI | autonomy/loki (cmd_github publish arm and its help line only), tests/test-github-publish.sh (new: no existing test owns cmd_github repo creation; test-proven-pr-check.sh covers PR checks only) plus its run-all-tests.sh registration and shard row, CHANGELOG.md | MEDIUM | see Wall in note | released@2026-10-17T03:50Z | merged efa201ffd (TL APPROVE 81346df2a) Shipped in npm 11.17.15 (latest+next) or 11.17.16 (Release run success on e3d445460). |
1014
1014
  | TEN-DEPLOY-08 | Web app deploy and GitHub push go through the gated CLI; no fabricated URLs | web-app/server.py (deploy_session ~5236-5336 and github_push_session ~5339-5395 only), web-app/tests/test_server.py (new cases), CHANGELOG.md | HIGH | see Wall in note | released v11.17.35 | SPLIT per CTO critic into (a) deploy_session, (b) github_push_session plus web-app url:null handling; build as two commits or two agents. wave 4; depends: TEN-DEPLOY-01 (deployed_url), TEN-DEPLOY-07 (github publish). Goal: Replace the bodies of deploy_session and github_push_session in web-app/server.py. Deploy runs `loki deploy --execute --dir <session_dir>` as an argv list with a timeout, then reads the newest <session>/.loki/deploys/*.json. It returns {url: deployed_url or null, health_status, live_binding, record_path, refused_reasons} and exits non-2xx on refusal. The platform param is kept as a hint only when it matches the CLI's detected provider; otherwise it returns 409 with the reason. GitHub push calls `loki github publish` (private default). Delete the hardcoded https://vercel.app, https://netlify.app and https://github.io fallbacks and the `git add -A` / `--public` path in the same change. Wall: RED: test_server.py with monkeypatched subprocess. On main, a deploy whose output has no URL returns url='https://vercel.app' (assert url is None fails), and no receipt gate is invoked. GREEN: the subprocess argv is [loki, deploy, --execute, --dir, <dir>]. A gate refusal returns 4xx with the reasons. A no-URL deploy returns url null. A github push argv contains `github publish` and never `add -A`. `grep -n 'https://vercel.app\/https://netlify.app\/"https://github.io"' web-app/server.py` exits 1. MUTATION: restore a fallback URL and the null-URL test goes red. Gate: python3 -m pytest web-app/tests/test_server.py -q && bash tests/moat/p7-no-fabricated-data.sh && bash tests/test-web-app-no-orphan-components.sh Rules: FAILURE-CLASSES row first for any bug fix (D86); no CHANGELOG edits (Release Manager writes notes); DECISIONS numbers assigned by the Chief of Staff; reuse util/secure_scan.ts, the shared badge helper, keys_cmd export and the TS claude login probe instead of new copies; new CLI flags update autonomy/completions and the help-drift guard. |
1015
1015
  | TEN-DEPLOY-09 | One-click from loki start and loki chat: pass the new deploy flags through | autonomy/loki (cmd_start _ps_ deploy parse block ~2625-2690 only), loki-ts/src/commands/start.ts (help string ~148-151 only), autonomy/lib/chat.sh (help line 53, system prompt line 6, _chat_deploy echo only), tests/test-help-start-flags.sh, docs/DEPLOYMENT.md, CHANGELOG.md | LOW | see Wall in note | building@2026-10-17T05:48Z | SPLIT per CTO critic into (a) start passthrough, (b) chat and docs text; build as two commits or two agents. wave 5; depends: TEN-DEPLOY-05, TEN-DEPLOY-06, TEN-DEPLOY-07. Goal: `loki start --deploy` passes --destination, --canary, --env-file, --domain and --github through to cmd_deploy. --github runs `loki github publish` after a successful deploy. Flag validation uses the existing _ps_ pattern (a value must not start with '-'). Bun-route start.ts help text lists them, and the PATH-slice divert keeps routing --deploy to bash. chat.sh `/deploy` help and _LOKI_CHAT_SYSTEM_PROMPT mention --domain, --env-file and `loki verify --url`, and the confirm prompt prints the full argv. docs/DEPLOYMENT.md gets one end-to-end 'brief to verified URL' section. Wall: RED: test-help-start-flags.sh asserts `loki start --help` lists --domain and --env-file, and a stubbed cmd_deploy recorder receives `--domain x.com --env-file .env` from `loki start --deploy --domain x.com --env-file .env`. It fails on main. GREEN: both pass. `--domain --env-file` (flag-shaped value) exits 2. A non-zero start exit still never deploys. MUTATION: drop the --domain forward and the recorder assertion goes red. Gate: bash -n autonomy/loki autonomy/lib/chat.sh && bash tests/test-help-start-flags.sh && (cd loki-ts && bun test tests/commands/start.test.ts && bunx tsc --noEmit) && bash tests/test-help-drift.sh Rules: FAILURE-CLASSES row first for any bug fix (D86); no CHANGELOG edits (Release Manager writes notes); DECISIONS numbers assigned by the Chief of Staff; reuse util/secure_scan.ts, the shared badge helper, keys_cmd export and the TS claude login probe instead of new copies; new CLI flags update autonomy/completions and the help-drift guard. |
@@ -1125,28 +1125,30 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
1125
1125
  | TEN-QUALITY-11 | enhancement: a Python repo with uv.lock and no .venv runs tests and lint through uv run as the project interpreter | loki-ts/src/engine10/stages/verify.ts (resolveTool only, at most 3 core lines), loki-ts/tests/engine10/verify.test.ts | MEDIUM | red: uv.lock repo without .venv gets interpreter system and 'tests ran on the system interpreter' NOT PROVEN (verify.ts:43,339); green: interpreter project via uv run; no uv on PATH keeps today's system result | released v11.17.36 | goal: avoid a false PARTIAL for uv projects; verify.ts has no uv handling today |
1126
1126
  | TEN-QUALITY-12 | enhancement: repo map cap configurable (LOKI_E10_REPOMAP_MAX_FILES) and truncation drops vendored or generated dirs before source | loki-ts/src/engine10/repomap.ts (at most 3 core lines), loki-ts/tests/engine10/repomap.test.ts | LOW | red: 2500-file repo with 1500 vendor/ files maps mostly vendor and ignores the env knob; green: knob honored, vendor/ node_modules dist dropped first, default 2000 unchanged | released v11.17.36 | goal: plan context quality on large repos; complements TEN-QUALITY-10 with no shared file |
1127
1127
  | TEN-DEPLOY-04-F1 | register --badge in dispatcher route, help, registry and completions | loki-ts/src/commands/run_status.ts, registry.ts, cli.ts, autonomy/loki, help-core.sh, completions | LOW | help-changelog drift and completions coverage pass; removing the route line turns the status test red | released@2026-10-17T05:34Z v11.17.24 | TL APPROVE 50579a177 |
1128
- | TEN-COST-11-F1 | enhancement: direct test for the machine.ts wall-stage distrust call (TEN-COST-11 review follow-up) | loki-ts/tests/engine10/machine.test.ts | LOW | wall base run green while implement changed files must yield already_satisfied false and base_run unproven; red mutation: delete the distrustGreenBase call at machine.ts:221 turns the test red; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/machine.test.ts | ready@2026-10-17T07:00Z | goal: pin the fail-closed branch (machine.ts:221) that has no direct test; test only, no src change |
1129
- | TEN-COST-28 | feature: per-stage share of spend printed in the cost summary (plan, wall, implement, fix, xreview) with the top stage named | loki-ts/src/engine10/cost.ts, loki-ts/tests/engine10/cost.test.ts | MEDIUM | red: summary shows only a total; green: stage shares sum to 100 percent, unmetered stages say unmetered not 0; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/cost.test.ts | ready@2026-10-17T07:00Z | goal: make the 2x cost proof attributable; grep cost.ts for an existing by-stage field first |
1130
- | TEN-COST-29 | enhancement: flag a cache-cold stage (cache read under 30 percent of input) with one line in the cost breakdown | loki-ts/src/util/cost_breakdown.ts, loki-ts/tests/engine10/cost_unmetered.test.ts | LOW | red: a stage with 5 percent cache reads prints no hint; green: one 'cache cold: <stage>' line, none when all stages are warm or unmetered; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/cost_unmetered.test.ts | ready@2026-10-17T07:00Z | goal: surface the biggest cost lever (prefix cache hit) per run |
1131
- | TEN-COST-30 | fix: an unknown cost.profile value in loki.yaml or --cost (for example 'leen') warns once and names the valid profiles instead of silently using default | loki-ts/src/util/cost_profile.ts, loki-ts/tests/util/cost_profile.test.ts | MEDIUM | red: 'leen' resolves to default with no message; green: one stderr warning naming lean and default, valid values unchanged and quiet mode keeps stdout clean; cd loki-ts && bunx tsc --noEmit && bun test tests/util/cost_profile.test.ts | ready@2026-10-17T07:00Z | goal: a typo must not forfeit the cost win silently; follows TEN-COST-27 |
1132
- | TEN-SPEED-03 | feature: run summary Time line names the slowest stage and its share of wall time | loki-ts/src/util/run_summary.ts, loki-ts/tests/util/run_summary.test.ts | LOW | red: Time line has total only; green: 'slowest: <stage> NN%' appended, omitted when stage durations are missing; cd loki-ts && bunx tsc --noEmit && bun test tests/util/run_summary.test.ts | ready@2026-10-17T07:00Z | goal: speed work needs a visible per-run bottleneck |
1133
- | TEN-SPEED-04 | enhancement: repo map and test map reused across fix rounds when the git tree hash is unchanged | loki-ts/src/engine10/cache.ts, loki-ts/tests/engine10/cache.test.ts | MEDIUM | red: second fix round rebuilds the map with identical tree; green: cache hit counted, miss when tree hash differs; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/cache.test.ts | ready@2026-10-17T07:00Z | goal: cut seconds per fix round; read cache.ts key first and skip if the tree hash is already in the key |
1134
- | TEN-SPEED-05 | fix: back-to-back loki start runs reuse a successful claude login probe for 10 minutes instead of re-spawning the CLI every time | loki-ts/src/engine10/preflight.ts, loki-ts/tests/engine10/preflight.test.ts | MEDIUM | red: two starts inside 10 min spawn the probe twice; green: second reuses the result, a failed probe is never cached, TTL expiry re-probes; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/preflight.test.ts | ready@2026-10-17T07:00Z | goal: shave start latency without hiding a logged-out state |
1135
- | TEN-QUALITY-13 | feature: cross-review (xreview) prompt carries the intent card Acceptance lines and the verdict names any line left unmet | loki-ts/src/engine10/stages/xreview.ts, loki-ts/tests/engine10/xreview.test.ts | MEDIUM | red: reviewer prompt omits acceptance lines; green: prompt includes them, verdict lists unmet lines, absent card keeps today's prompt byte-identical; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/xreview.test.ts | ready@2026-10-17T07:00Z | goal: review checks what the user asked, not only the diff |
1136
- | TEN-QUALITY-14 | enhancement: Wall authoring prompt requires one negative-case assertion (rejects bad input or fails before the fix) per acceptance line | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall.test.ts | MEDIUM | red: prompt has no negative-case rule; green: rule present, prompt size growth under 400 chars, existing wall tests green; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/wall.test.ts | ready@2026-10-17T07:00Z | goal: stronger Wall checks reject wrong implementations; wall.ts line budget applies (shrink-or-flat) |
1137
- | TEN-QUALITY-15 | fix: fix rounds stop retrying the same model when the failing test set is identical two rounds in a row and escalate once | loki-ts/src/engine10/stages/fix.ts, loki-ts/tests/engine10/fix.test.ts | MEDIUM | red: identical failure signature loops on the same model to the round cap; green: escalates once then stops with a stalled reason; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/fix.test.ts | ready@2026-10-17T07:00Z | goal: stop wasted fix spend; grep stallClimb in unit_model.ts and reuse it, do not duplicate |
1138
- | TEN-GATES-14 | feature: loki verify --explain lists each gate with exogenous or agent-influenced and the evidence it read | loki-ts/src/engine10/verify_cmd.ts, loki-ts/tests/engine10/verify_cmd.test.ts | HIGH | red: --explain is an unknown flag; green: one line per gate, exit code unchanged, --json carries the same fields; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/verify_cmd.test.ts | ready@2026-10-17T07:00Z | goal: make the moat legible to buyers; read-only output, no verdict change |
1128
+ | TEN-COST-11-F1 | enhancement: direct test for the machine.ts wall-stage distrust call (TEN-COST-11 review follow-up) | loki-ts/tests/engine10/machine.test.ts | LOW | wall base run green while implement changed files must yield already_satisfied false and base_run unproven; red mutation: delete the distrustGreenBase call at machine.ts:221 turns the test red; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/machine.test.ts | released v11.17.37 | goal: pin the fail-closed branch (machine.ts:221) that has no direct test; test only, no src change |
1129
+ | TEN-COST-28 | feature: per-stage share of spend printed in the cost summary (plan, wall, implement, fix, xreview) with the top stage named | loki-ts/src/engine10/cost.ts, loki-ts/tests/engine10/cost.test.ts | MEDIUM | red: summary shows only a total; green: stage shares sum to 100 percent, unmetered stages say unmetered not 0; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/cost.test.ts | released v11.17.37 | goal: make the 2x cost proof attributable; grep cost.ts for an existing by-stage field first |
1130
+ | TEN-COST-29 | enhancement: flag a cache-cold stage (cache read under 30 percent of input) with one line in the cost breakdown | loki-ts/src/util/cost_breakdown.ts, loki-ts/tests/engine10/cost_unmetered.test.ts | LOW | red: a stage with 5 percent cache reads prints no hint; green: one 'cache cold: <stage>' line, none when all stages are warm or unmetered; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/cost_unmetered.test.ts | released v11.17.38 | goal: surface the biggest cost lever (prefix cache hit) per run |
1131
+ | TEN-COST-30 | fix: an unknown cost.profile value in loki.yaml or --cost (for example 'leen') warns once and names the valid profiles instead of silently using default | loki-ts/src/util/cost_profile.ts, loki-ts/tests/util/cost_profile.test.ts | MEDIUM | red: 'leen' resolves to default with no message; green: one stderr warning naming lean and default, valid values unchanged and quiet mode keeps stdout clean; cd loki-ts && bunx tsc --noEmit && bun test tests/util/cost_profile.test.ts | released v11.17.38 | goal: a typo must not forfeit the cost win silently; follows TEN-COST-27 |
1132
+ | TEN-SPEED-03 | feature: run summary Time line names the slowest stage and its share of wall time | loki-ts/src/util/run_summary.ts, loki-ts/tests/util/run_summary.test.ts | LOW | red: Time line has total only; green: 'slowest: <stage> NN%' appended, omitted when stage durations are missing; cd loki-ts && bunx tsc --noEmit && bun test tests/util/run_summary.test.ts | released v11.17.37 | goal: speed work needs a visible per-run bottleneck |
1133
+ | TEN-SPEED-04 | enhancement: repo map and test map reused across fix rounds when the git tree hash is unchanged | loki-ts/src/engine10/cache.ts, loki-ts/tests/engine10/cache.test.ts | MEDIUM | red: second fix round rebuilds the map with identical tree; green: cache hit counted, miss when tree hash differs; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/cache.test.ts | released v11.17.38 | goal: cut seconds per fix round; read cache.ts key first and skip if the tree hash is already in the key |
1134
+ | TEN-SPEED-05 | fix: back-to-back loki start runs reuse a successful claude login probe for 10 minutes instead of re-spawning the CLI every time | loki-ts/src/engine10/preflight.ts, loki-ts/tests/engine10/preflight.test.ts | MEDIUM | red: two starts inside 10 min spawn the probe twice; green: second reuses the result, a failed probe is never cached, TTL expiry re-probes; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/preflight.test.ts | released v11.17.38 | goal: shave start latency without hiding a logged-out state |
1135
+ | TEN-QUALITY-13 | feature: cross-review (xreview) prompt carries the intent card Acceptance lines and the verdict names any line left unmet | loki-ts/src/engine10/stages/xreview.ts, loki-ts/tests/engine10/xreview.test.ts | MEDIUM | red: reviewer prompt omits acceptance lines; green: prompt includes them, verdict lists unmet lines, absent card keeps today's prompt byte-identical; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/xreview.test.ts | released v11.17.37 | goal: review checks what the user asked, not only the diff |
1136
+ | TEN-QUALITY-14 | enhancement: Wall authoring prompt requires one negative-case assertion (rejects bad input or fails before the fix) per acceptance line | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall.test.ts | MEDIUM | red: prompt has no negative-case rule; green: rule present, prompt size growth under 400 chars, existing wall tests green; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/wall.test.ts | released v11.17.38 | goal: stronger Wall checks reject wrong implementations; wall.ts line budget applies (shrink-or-flat) |
1137
+ | TEN-QUALITY-15 | fix: fix rounds stop retrying the same model when the failing test set is identical two rounds in a row and escalate once | loki-ts/src/engine10/stages/fix.ts, loki-ts/tests/engine10/fix.test.ts | MEDIUM | red: identical failure signature loops on the same model to the round cap; green: escalates once then stops with a stalled reason; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/fix.test.ts | released v11.17.38 | goal: stop wasted fix spend; grep stallClimb in unit_model.ts and reuse it, do not duplicate |
1138
+ | TEN-GATES-14 | feature: loki verify --explain lists each gate with exogenous or agent-influenced and the evidence it read | loki-ts/src/engine10/verify_cmd.ts, loki-ts/tests/engine10/verify_cmd.test.ts | HIGH | red: --explain is an unknown flag; green: one line per gate, exit code unchanged, --json carries the same fields; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/verify_cmd.test.ts | released v11.17.37 | goal: make the moat legible to buyers; read-only output, no verdict change |
1139
1139
  | TEN-GATES-15 | enhancement: Seal receipt records the seeded-defect corpus version and catch rate used for the ablation gate | loki-ts/src/engine10/stages/seal.ts, loki-ts/tests/engine10/seal_verify_roundtrip.test.ts | HIGH | red: receipt lacks corpus id; green: corpus version and rate in the signed payload and loki verify rejects a tampered value; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/seal_verify_roundtrip.test.ts | ready@2026-10-17T07:00Z | goal: tie the load-bearing claim to evidence; builds on TEN-GATES-12/13 (released) |
1140
- | TEN-GATES-16 | fix: loki verify reports DRIFT, not OK, when HEAD moved after the seal and the changed paths overlap the sealed diff | loki-ts/src/util/seal_drift.ts, loki-ts/tests/engine10/log_seal.test.ts | HIGH | red: sealed run then an amend on a sealed path still verifies OK; green: DRIFT with the path named, unrelated commits keep OK; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/log_seal.test.ts | ready@2026-10-17T07:00Z | goal: a seal must not vouch for code it did not see; read seal_drift.ts first and extend it |
1141
- | TEN-UX-13 | feature: loki undo --dry-run prints the diffstat it would revert and changes nothing | loki-ts/src/commands/undo.ts, loki-ts/tests/commands/undo.test.ts | LOW | red: --dry-run unknown or applies the revert; green: diffstat printed, tree and HEAD unchanged, exit 0; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/undo.test.ts | ready@2026-10-17T07:00Z | goal: safe undo; new test file because no existing test owns undo.ts (rollback.test.ts covers rollback.ts only) |
1142
- | TEN-UX-14 | enhancement: loki queue list shows age and status columns and a count footer | loki-ts/src/commands/queue.ts, loki-ts/tests/commands/queue.test.ts | LOW | red: list prints ids only; green: id, age, status columns and 'N queued' footer, empty queue prints a next step; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/queue.test.ts | ready@2026-10-17T07:00Z | goal: queue is inspectable at a glance |
1143
- | TEN-UX-15 | fix: shell completions list flags added after the completion table was written (--probe, --badge, --cost) from the registry | loki-ts/src/commands/completion.ts, loki-ts/tests/commands/cli_help_routes.test.ts | LOW | red: completion output lacks a registered flag; green: every flag in registry.ts appears for its command; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/cli_help_routes.test.ts | ready@2026-10-17T07:00Z | goal: no hand-maintained drift; derive from registry |
1144
- | TEN-ADOPTION-11 | feature: loki trust prints a copyable README badge snippet for the last sealed run | loki-ts/src/commands/trust.ts, loki-ts/tests/commands/trust.test.ts | MEDIUM | red: no snippet; green: markdown snippet pointing at the verified badge, absent when no sealed run (prints the next step); cd loki-ts && bunx tsc --noEmit && bun test tests/commands/trust.test.ts | ready@2026-10-17T07:00Z | goal: every sealed repo advertises Loki; reuse the TEN-DEPLOY-04 badge output |
1145
- | TEN-ADOPTION-12 | enhancement: after an upgrade the next loki start prints a one-line what-is-new once | loki-ts/src/util/update_check.ts, loki-ts/tests/util/update_check.test.ts | LOW | red: no notice after version change; green: one line once per version, none in quiet or CI mode; cd loki-ts && bunx tsc --noEmit && bun test tests/util/update_check.test.ts | ready@2026-10-17T07:00Z | goal: retention; no network call added |
1146
- | TEN-DEPLOY-11 | feature: loki rollback prints the provider rollback command (names only, no secrets) for the last deploy record | loki-ts/src/commands/rollback.ts, loki-ts/tests/commands/rollback.test.ts | MEDIUM | red: rollback ignores deploy records; green: prints provider command from the record, nothing when no record, no env values; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/rollback.test.ts | ready@2026-10-17T07:00Z | goal: complete the deploy loop; read-only, never executes the provider command |
1147
- | TEN-DEPLOY-12 | fix: loki status --probe retries once after 5 seconds before reporting a regression, so a cold start is not a false alarm | loki-ts/src/commands/status.ts, loki-ts/tests/commands/status.test.ts | MEDIUM | red: first 503 then 200 exits non-zero; green: retry passes exit 0, two failures exit non-zero, retry visible in output; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/status.test.ts | ready@2026-10-17T07:00Z | goal: stop false regressions; depends on TEN-DEPLOY-10 (released v11.17.33) |
1148
- | TEN-STABILITY-11 | enhancement: run_pid detects a reused PID by comparing process start time and treats it as dead | loki-ts/src/util/run_pid.ts, loki-ts/tests/engine10/run_pid.test.ts | MEDIUM | red: unrelated live process with the recorded PID blocks a new run; green: start-time mismatch treated as stale; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/run_pid.test.ts | ready@2026-10-17T07:00Z | goal: no phantom lock after reboot; never kill by name or pattern |
1149
- | TEN-STABILITY-12 | fix: a truncated outbox entry left by a crash is quarantined and skipped, not fatal to the next start | loki-ts/src/util/outbox.ts, loki-ts/tests/util/outbox.test.ts | MEDIUM | red: half-written JSON entry throws on drain; green: entry moved to a quarantine name, the rest drain, one warning printed; cd loki-ts && bunx tsc --noEmit && bun test tests/util/outbox.test.ts | ready@2026-10-17T07:00Z | goal: crash-safe delivery |
1150
- | TEN-SECURITY-01 | feature: the pre-PR secure scan also matches provider keys (sk-ant, AIza, xox[bp]-, ghp_) in added lines and blocks with the file and line | loki-ts/src/util/secure_scan.ts, loki-ts/tests/util/secure_scan.test.ts | HIGH | red: fixture with a runtime-built sk-ant key passes the scan; green: blocked naming file:line without echoing the secret, clean diff passes; cd loki-ts && bunx tsc --noEmit && bun test tests/util/secure_scan.test.ts | ready@2026-10-17T07:00Z | goal: no leaked key in a Loki PR; fixtures build keys at runtime (gitleaks rule); grep first, extend patterns only |
1151
- | TEN-SECURITY-02 | fix: redact() strips URL userinfo (https://user:pass@host) and Authorization headers from logged and receipted output | loki-ts/src/util/redact.ts, loki-ts/tests/util/redact.test.ts | HIGH | red: https://u:p@host survives redact; green: userinfo replaced, plain URLs and existing redactions unchanged; cd loki-ts && bunx tsc --noEmit && bun test tests/util/redact.test.ts | ready@2026-10-17T07:00Z | goal: close a credential-in-log path; new test file because no existing test owns redact.ts |
1152
- | TEN-GATES-17 | fix: a pre-existing test file the run edited must not count as agent-independent proof for loki verify --require-exogenous (reviewer finding on the n-key fix: status M edits keep provenance exogenous) | loki-ts/src/util/check_result.ts, loki-ts/tests/engine10/seal.test.ts | HIGH | red: a sealed run whose only passing check is a test file the run modified (status M, assertions weakened or replaced) passes --require-exogenous with rc 0; green: that check is advisory and --require-exogenous exits 4 while an untouched exogenous test still counts; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/seal.test.ts tests/engine10/verify_cmd.test.ts tests/engine10/budget.test.ts | ready@2026-10-17T06:55Z | Source: HIGH review of c958f563c. Grep checkProvenance and the A-119 edit rule first; decide whether to reuse the weakened-test detector instead of a blanket M rule, so legit test fixes stay exogenous. Record the call in DECISIONS.md if it changes D104. |
1140
+ | TEN-GATES-16 | fix: loki verify reports DRIFT, not OK, when HEAD moved after the seal and the changed paths overlap the sealed diff | loki-ts/src/util/seal_drift.ts, loki-ts/tests/engine10/log_seal.test.ts | HIGH | red: sealed run then an amend on a sealed path still verifies OK; green: DRIFT with the path named, unrelated commits keep OK; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/log_seal.test.ts | released v11.17.38 | goal: a seal must not vouch for code it did not see; read seal_drift.ts first and extend it |
1141
+ | TEN-UX-13 | feature: loki undo --dry-run prints the diffstat it would revert and changes nothing | loki-ts/src/commands/undo.ts, loki-ts/tests/commands/undo.test.ts | LOW | red: --dry-run unknown or applies the revert; green: diffstat printed, tree and HEAD unchanged, exit 0; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/undo.test.ts | released v11.17.37 | goal: safe undo; new test file because no existing test owns undo.ts (rollback.test.ts covers rollback.ts only) |
1142
+ | TEN-UX-14 | enhancement: loki queue list shows age and status columns and a count footer | loki-ts/src/commands/queue.ts, loki-ts/tests/commands/queue.test.ts | LOW | red: list prints ids only; green: id, age, status columns and 'N queued' footer, empty queue prints a next step; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/queue.test.ts | released v11.17.38 | goal: queue is inspectable at a glance |
1143
+ | TEN-UX-15 | fix: shell completions list flags added after the completion table was written (--probe, --badge, --cost) from the registry | loki-ts/src/commands/completion.ts, loki-ts/tests/commands/cli_help_routes.test.ts | LOW | red: completion output lacks a registered flag; green: every flag in registry.ts appears for its command; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/cli_help_routes.test.ts | released v11.17.38 | goal: no hand-maintained drift; derive from registry |
1144
+ | TEN-ADOPTION-11 | feature: loki trust prints a copyable README badge snippet for the last sealed run | loki-ts/src/commands/trust.ts, loki-ts/tests/commands/trust.test.ts | MEDIUM | red: no snippet; green: markdown snippet pointing at the verified badge, absent when no sealed run (prints the next step); cd loki-ts && bunx tsc --noEmit && bun test tests/commands/trust.test.ts | released v11.17.38 | goal: every sealed repo advertises Loki; reuse the TEN-DEPLOY-04 badge output |
1145
+ | TEN-ADOPTION-12 | enhancement: after an upgrade the next loki start prints a one-line what-is-new once | loki-ts/src/util/update_check.ts, loki-ts/tests/util/update_check.test.ts | LOW | red: no notice after version change; green: one line once per version, none in quiet or CI mode; cd loki-ts && bunx tsc --noEmit && bun test tests/util/update_check.test.ts | released v11.17.38 | goal: retention; no network call added |
1146
+ | TEN-DEPLOY-11 | feature: loki rollback prints the provider rollback command (names only, no secrets) for the last deploy record | loki-ts/src/commands/rollback.ts, loki-ts/tests/commands/rollback.test.ts | MEDIUM | red: rollback ignores deploy records; green: prints provider command from the record, nothing when no record, no env values; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/rollback.test.ts | released v11.17.37 | goal: complete the deploy loop; read-only, never executes the provider command |
1147
+ | TEN-DEPLOY-12 | fix: loki status --probe retries once after 5 seconds before reporting a regression, so a cold start is not a false alarm | loki-ts/src/commands/status.ts, loki-ts/tests/commands/status.test.ts | MEDIUM | red: first 503 then 200 exits non-zero; green: retry passes exit 0, two failures exit non-zero, retry visible in output; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/status.test.ts | released v11.17.38 | goal: stop false regressions; depends on TEN-DEPLOY-10 (released v11.17.33) |
1148
+ | TEN-STABILITY-11 | enhancement: run_pid detects a reused PID by comparing process start time and treats it as dead | loki-ts/src/util/run_pid.ts, loki-ts/tests/engine10/run_pid.test.ts | MEDIUM | red: unrelated live process with the recorded PID blocks a new run; green: start-time mismatch treated as stale; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/run_pid.test.ts | released v11.17.37 | goal: no phantom lock after reboot; never kill by name or pattern |
1149
+ | TEN-STABILITY-12 | fix: a truncated outbox entry left by a crash is quarantined and skipped, not fatal to the next start | loki-ts/src/util/outbox.ts, loki-ts/tests/util/outbox.test.ts | MEDIUM | red: half-written JSON entry throws on drain; green: entry moved to a quarantine name, the rest drain, one warning printed; cd loki-ts && bunx tsc --noEmit && bun test tests/util/outbox.test.ts | released v11.17.38 | goal: crash-safe delivery |
1150
+ | TEN-SECURITY-01 | feature: the pre-PR secure scan also matches provider keys (sk-ant, AIza, xox[bp]-, ghp_) in added lines and blocks with the file and line | loki-ts/src/util/secure_scan.ts, loki-ts/tests/util/secure_scan.test.ts | HIGH | red: fixture with a runtime-built sk-ant key passes the scan; green: blocked naming file:line without echoing the secret, clean diff passes; cd loki-ts && bunx tsc --noEmit && bun test tests/util/secure_scan.test.ts | released v11.17.38 | goal: no leaked key in a Loki PR; fixtures build keys at runtime (gitleaks rule); grep first, extend patterns only |
1151
+ | TEN-SECURITY-02 | fix: redact() strips URL userinfo (https://user:pass@host) and Authorization headers from logged and receipted output | loki-ts/src/util/redact.ts, loki-ts/tests/util/redact.test.ts | HIGH | red: https://u:p@host survives redact; green: userinfo replaced, plain URLs and existing redactions unchanged; cd loki-ts && bunx tsc --noEmit && bun test tests/util/redact.test.ts | released v11.17.38 | goal: close a credential-in-log path; new test file because no existing test owns redact.ts |
1152
+ | TEN-GATES-17 | fix: a pre-existing test file the run edited must not count as agent-independent proof for loki verify --require-exogenous (reviewer finding on the n-key fix: status M edits keep provenance exogenous) | loki-ts/src/util/check_result.ts, loki-ts/tests/engine10/seal.test.ts | HIGH | red: a sealed run whose only passing check is a test file the run modified (status M, assertions weakened or replaced) passes --require-exogenous with rc 0; green: that check is advisory and --require-exogenous exits 4 while an untouched exogenous test still counts; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/seal.test.ts tests/engine10/verify_cmd.test.ts tests/engine10/budget.test.ts | released v11.17.38 | Source: HIGH review of c958f563c. Grep checkProvenance and the A-119 edit rule first; decide whether to reuse the weakened-test detector instead of a blanket M rule, so legit test fixes stay exogenous. Record the call in DECISIONS.md if it changes D104. |
1153
+ | TEN-STABILITY-13 | P0 fix-forward: engine10 core is 5006 lines against the 5000 cap (budget.test.ts red on main since at least v11.17.35); bring core to 4950 or below without behavior change | loki-ts/src/engine10 (non-modernize) files only, plus the util or e10ext module that already owns any moved helper | MEDIUM | red: cd loki-ts && bun test tests/engine10/budget.test.ts fails with core is 5006 lines; green: same command passes with core at or below 4950, bun test tests/engine10 and bunx tsc --noEmit pass | released v11.17.38 | Move pure helpers out of the largest core files into the module that owns their concern (extend, never duplicate); delete dead code first; never squeeze lines by joining statements. Source: combined-tree run after v11.17.36. |
1154
+ | TEN-SECURITY-03 | fix: the bash secret scanners miss Anthropic keys (sk-ant-...) and the bash run_secure_scan applies the token rule only to browser-served files | autonomy/lib/secret-scan.sh, autonomy/verify.sh (secret pattern near 1177 and run_secure_scan only), the existing test that owns secret-scan.sh | HIGH | red: a runtime-built sk-ant key in a committed non-browser file passes both bash scanners; green: both report it by file and line without echoing the key, clean fixture passes; bash -n on both files plus the owning test | released v11.17.38 | Source: TEN-SECURITY-01 HIGH review (non-blocking item 5). Reuse one pattern list across both scripts if one already exists; fixtures build keys at runtime (gitleaks rule). |
@@ -2488,3 +2488,9 @@ v11.17.21 published (Release success on 462fbc40a; npm latest 11.17.21, next 11.
2488
2488
 
2489
2489
  ## 2026-10-17T07:11Z (CoS) v11.17.36
2490
2490
  - Wave AC released: TEN-QUALITY-11, TEN-QUALITY-12, TEN-ADOPTION-09 (HIGH), TEN-UX-12, TEN-ADOPTION-07, TEN-ADOPTION-08; 6 of 6 APPROVE, merged clean via merge.sh (merged-ac.txt).
2491
+
2492
+ ## 2026-10-17T07:20Z (CoS) v11.17.37
2493
+ - Wave AD released: TEN-COST-11-F1, TEN-COST-28, TEN-SPEED-03, TEN-QUALITY-13, TEN-GATES-14 (HIGH), TEN-UX-13, TEN-DEPLOY-11 (7 APPROVE, merged clean, merged-ad.txt). TEN-STABILITY-11 already shipped (run_pid.ts verifyRunPid). TEN-SECURITY-01 BLOCK 13bec58ff after fix round. Combined tree: bun test tests/engine10 had 1 fail, the core size budget (core is 5006 lines, cap 5000), pre-existing at 18900e64d and b81a1012a; P0 fix-forward dispatched.
2494
+
2495
+ ## 2026-10-17T08:00Z (CoS) v11.17.38
2496
+ - Wave AE released: 17 APPROVE merged clean (merged-ae.txt), including P0 TEN-STABILITY-13 (core 4949 lines) and HIGH TEN-SECURITY-01/02/03, TEN-GATES-16/17. TEN-COST-30 and TEN-QUALITY-15 already shipped. TEN-DEPLOY-03 BLOCK eca0e17e0 and TEN-GATES-15 BLOCK 6f7591b8c re-dispatched. Combined tree: bun test tests/engine10 tests/util had 4 structural guard fails (3 pre-existing at ac43fb498: full_env_spawn, registration_list, start_flag_parity; 1 new: model_output_regex wall.ts count); P0 TEN-STABILITY-14 opened.