loki-mode 10.5.15 → 10.5.17

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 (80) hide show
  1. package/.claude-plugin/marketplace.json +12 -0
  2. package/README.md +2 -0
  3. package/SKILL.md +2 -2
  4. package/VERSION +1 -1
  5. package/autonomy/lib/backlog.py +280 -0
  6. package/autonomy/lib/claude-flags.sh +15 -5
  7. package/autonomy/lib/loki_yaml.py +225 -0
  8. package/autonomy/loki +65 -6
  9. package/autonomy/run.sh +33 -7
  10. package/autonomy/verify.sh +11 -0
  11. package/completions/_loki +1 -0
  12. package/completions/loki.bash +2 -2
  13. package/dashboard/__init__.py +1 -1
  14. package/docs/INSTALLATION.md +1 -1
  15. package/docs/exit-codes.md +15 -0
  16. package/docs/v10/BOARD.md +20 -10
  17. package/docs/v10/DECISIONS.md +36 -0
  18. package/docs/v10/FOUNDER-QUEUE.md +1 -0
  19. package/docs/v10/PROGRESS.md +59 -0
  20. package/loki-ts/dist/loki.js +476 -468
  21. package/mcp/__init__.py +1 -1
  22. package/package.json +1 -1
  23. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  24. package/web-app/dist/assets/{AdminPage-1661YC4g.js → AdminPage-DxGZSpFg.js} +1 -1
  25. package/web-app/dist/assets/{Avatar-CCdkODwW.js → Avatar-BZEp23D8.js} +1 -1
  26. package/web-app/dist/assets/{Badge-DubiNUZt.js → Badge-DnDwqDLu.js} +1 -1
  27. package/web-app/dist/assets/{Button-BijTQ2Hp.js → Button-C9KDP4c1.js} +1 -1
  28. package/web-app/dist/assets/{CockpitPage-BBzWm20i.js → CockpitPage-DRlh3LV2.js} +1 -1
  29. package/web-app/dist/assets/{ComparePage-CV1dk0YH.js → ComparePage-C_gE45dQ.js} +1 -1
  30. package/web-app/dist/assets/{ErrorBoundary-G43S3loS.js → ErrorBoundary-CL-J9-Cs.js} +1 -1
  31. package/web-app/dist/assets/{EvidenceReceiptPanel-CMxsfL9Z.js → EvidenceReceiptPanel-DABd176Y.js} +1 -1
  32. package/web-app/dist/assets/{GitHubIssuesPanel-B8MNoAuP.js → GitHubIssuesPanel-C4lYbm6O.js} +1 -1
  33. package/web-app/dist/assets/{GitHubPRsPanel-4qgjR27S.js → GitHubPRsPanel-CgiUixwo.js} +1 -1
  34. package/web-app/dist/assets/{HomePage-BhtvClDY.js → HomePage-DC99RIrz.js} +2 -2
  35. package/web-app/dist/assets/{LoginPage-ByyJjjmL.js → LoginPage-Bd72QWNk.js} +1 -1
  36. package/web-app/dist/assets/{MagicPage-CtcPSQs8.js → MagicPage-CBouFs2K.js} +1 -1
  37. package/web-app/dist/assets/{MetricsPage-ClJgMw3s.js → MetricsPage-c9MyDcBp.js} +1 -1
  38. package/web-app/dist/assets/{NotFoundPage-Dqd4hF4i.js → NotFoundPage-ZPhiebiW.js} +1 -1
  39. package/web-app/dist/assets/{ProjectPage-Dk4djs43.js → ProjectPage-DKwrALUb.js} +3 -3
  40. package/web-app/dist/assets/{ProjectsPage-CsBlltJT.js → ProjectsPage-X1uZKZC_.js} +1 -1
  41. package/web-app/dist/assets/{SettingsPage-uCfcY7iV.js → SettingsPage-CiZKZRto.js} +1 -1
  42. package/web-app/dist/assets/{ShowcasePage-CQI_upZe.js → ShowcasePage-k_imKfeh.js} +1 -1
  43. package/web-app/dist/assets/{SystemSettingsPage-Cj-Lzdfz.js → SystemSettingsPage-Wx9ESLll.js} +1 -1
  44. package/web-app/dist/assets/{TeamsPage-BDx2oGna.js → TeamsPage-B7upn-I7.js} +1 -1
  45. package/web-app/dist/assets/{TemplatesPage-BQmxaXw-.js → TemplatesPage-oJf_VKgh.js} +1 -1
  46. package/web-app/dist/assets/{TerminalOutput-CRHC4wYM.js → TerminalOutput-BdfPlgLI.js} +1 -1
  47. package/web-app/dist/assets/{activity-V-Uelube.js → activity-BcZTsgWH.js} +1 -1
  48. package/web-app/dist/assets/{bell-C-87SkAH.js → bell-JNEkjWQ2.js} +1 -1
  49. package/web-app/dist/assets/{bot-C7LozwoL.js → bot-DMAJobP_.js} +1 -1
  50. package/web-app/dist/assets/{check-C_vTc9Wn.js → check-DPTry-z2.js} +1 -1
  51. package/web-app/dist/assets/{chevron-left-BaUVoa6G.js → chevron-left-DSqOEtTV.js} +1 -1
  52. package/web-app/dist/assets/{circle-alert-DlX6JSco.js → circle-alert-BbL8Vysv.js} +1 -1
  53. package/web-app/dist/assets/{clock-VmX2uYbD.js → clock-BHEr5lGW.js} +1 -1
  54. package/web-app/dist/assets/{cloud-D_39zt_T.js → cloud-C48PunYo.js} +1 -1
  55. package/web-app/dist/assets/{code-xml-DdlM7uo3.js → code-xml-Boa7kRqT.js} +1 -1
  56. package/web-app/dist/assets/{database-BpMQCo28.js → database-Eu35Gv7z.js} +1 -1
  57. package/web-app/dist/assets/{dollar-sign-Bwa1rbCN.js → dollar-sign-BO9fCnHW.js} +1 -1
  58. package/web-app/dist/assets/{file-code-corner-8d8iVZR0.js → file-code-corner-DHsSDIL_.js} +1 -1
  59. package/web-app/dist/assets/{file-plus-DaR4_dNZ.js → file-plus-BYiQLe5l.js} +1 -1
  60. package/web-app/dist/assets/{globe-qpF9WsVW.js → globe-BPZ5sQI2.js} +1 -1
  61. package/web-app/dist/assets/{hammer-CUuB3N-9.js → hammer-DlOLTsH3.js} +1 -1
  62. package/web-app/dist/assets/{index-CjHC75iU.js → index-BrgkuqSA.js} +3 -3
  63. package/web-app/dist/assets/{layers-Bg8D3b7W.js → layers-DMNdn1GR.js} +1 -1
  64. package/web-app/dist/assets/{loader-circle-D6KvToOI.js → loader-circle-_e9fypHL.js} +1 -1
  65. package/web-app/dist/assets/{lock-7JNLBG67.js → lock-D_elxMZb.js} +1 -1
  66. package/web-app/dist/assets/{package-BHJiWZ8O.js → package-Bw-7g3JI.js} +1 -1
  67. package/web-app/dist/assets/{plus-C08Uh-ub.js → plus-CZeq0pgJ.js} +1 -1
  68. package/web-app/dist/assets/{refresh-cw-Du1eZj1a.js → refresh-cw-D0WMyffs.js} +1 -1
  69. package/web-app/dist/assets/{rotate-ccw-k3kR3GkM.js → rotate-ccw-CcKyNwXG.js} +1 -1
  70. package/web-app/dist/assets/{scroll-text-DXn0Z1aO.js → scroll-text-C0L9Vqpm.js} +1 -1
  71. package/web-app/dist/assets/{server-Co4areOg.js → server-SgwFv6cd.js} +1 -1
  72. package/web-app/dist/assets/{shield-alert-BcVL7YGG.js → shield-alert-D1tESlfI.js} +1 -1
  73. package/web-app/dist/assets/{thumbs-up-h1XMb-L3.js → thumbs-up-bUtUA15O.js} +1 -1
  74. package/web-app/dist/assets/{trash-2-B4AamWeu.js → trash-2-C9Nv1kKk.js} +1 -1
  75. package/web-app/dist/assets/{trending-down-B_boYLT1.js → trending-down-Bh107AJe.js} +1 -1
  76. package/web-app/dist/assets/{trending-up-JE2ittyH.js → trending-up-25BqhLVq.js} +1 -1
  77. package/web-app/dist/assets/{upload-DGPQNnqT.js → upload-DDYtMbN5.js} +1 -1
  78. package/web-app/dist/assets/{usePolling-Br26QTdJ.js → usePolling-BSDT0il_.js} +1 -1
  79. package/web-app/dist/assets/{user-_PdrcqfM.js → user-CKpUEUhK.js} +1 -1
  80. package/web-app/dist/index.html +1 -1
package/autonomy/loki CHANGED
@@ -1627,6 +1627,7 @@ show_help() {
1627
1627
  echo "Build:"
1628
1628
  echo " start [SPEC] Start a build (PRD file, GitHub/GitLab/Jira/Azure issue, or no arg)"
1629
1629
  echo " plan <PRD-file> Dry-run analysis: complexity, cost, execution plan"
1630
+ echo " backlog <owner/repo> --all|--label X|--issues N,N Run every matching open issue, N in parallel"
1630
1631
  echo " quickstart [idea] Guided first build: setup, idea, template, plan, go"
1631
1632
  echo ""
1632
1633
  echo "Session:"
@@ -1765,7 +1766,7 @@ show_help() {
1765
1766
  # missing from this list, so a new command cannot ship invisible.
1766
1767
  echo ""
1767
1768
  echo "All commands:"
1768
- echo " agent analyze api assets audit bench checkpoint (cp) ci cleanup"
1769
+ echo " agent analyze api assets audit backlog bench checkpoint (cp) ci cleanup"
1769
1770
  echo " cluster cockpit code compliance completions compound config context (ctx)"
1770
1771
  echo " cost council crash dashboard demo deploy docker docs doctor dogfood"
1771
1772
  echo " enterprise estimate explain export failover github grill heal help"
@@ -9306,6 +9307,32 @@ _deploy_receipt_verdict() {
9306
9307
  # evaluated, so no key set is written and the verdict is UNCHECKED, never
9307
9308
  # TAMPERED: the hash is fine, we just cannot vouch for who signed it. A
9308
9309
  # local key only proves "a holder of this key", not an independent build.
9310
+ # Token SHAPE before any key lookup (mirrors engine10 checkAttestation): a present
9311
+ # attestation that is not a string, not a 3-part JWS, or whose header/payload are not
9312
+ # JSON with alg EdDSA is junk, so TAMPERED, never UNCHECKED, with or without a key.
9313
+ if ! python3 -E - "$pj" >/dev/null 2>&1 <<'PYSHAPE'
9314
+ import sys
9315
+ sys.path[:] = [p for p in sys.path if p not in ("", ".")]
9316
+ import json, base64
9317
+ def dec(x):
9318
+ return json.loads(base64.urlsafe_b64decode(x + "=" * (-len(x) % 4)))
9319
+ v = json.load(open(sys.argv[1])).get("verification") or {}
9320
+ t = v.get("attestation")
9321
+ if t is None or t == "":
9322
+ sys.exit(0)
9323
+ if not isinstance(t, str):
9324
+ sys.exit(1)
9325
+ parts = t.split(".")
9326
+ if len(parts) != 3 or not all(parts):
9327
+ sys.exit(1)
9328
+ try:
9329
+ h = dec(parts[0]); dec(parts[1])
9330
+ except Exception:
9331
+ sys.exit(1)
9332
+ sys.exit(0 if isinstance(h, dict) and h.get("alg") == "EdDSA" else 1)
9333
+ PYSHAPE
9334
+ then printf '%s' "TAMPERED"; return 0; fi
9335
+
9309
9336
  local jwks att
9310
9337
  jwks="$(mktemp "${TMPDIR:-/tmp}/loki-jwks.XXXXXX")" || { printf '%s' "UNCHECKED"; return 0; }
9311
9338
  python3 -E - "${_LOKI_SCRIPT_DIR}" "$pj" >"$jwks" 2>/dev/null <<'PY' || true
@@ -12593,7 +12620,7 @@ cmd_config() {
12593
12620
  echo " get KEY Get a configuration value"
12594
12621
  echo " example Print an annotated config template (for --config)"
12595
12622
  echo " schema Print the key -> env-var mapping table"
12596
- echo " validate FILE Validate a config file (--config) without applying it"
12623
+ echo " validate [FILE] Validate loki.yaml (no FILE: repo root, then ~/.loki) or a --config file"
12597
12624
  echo ""
12598
12625
  echo "Settable keys (v6.0.0):"
12599
12626
  echo " maxTier Cost ceiling: opus, sonnet, haiku (default: opus)"
@@ -12797,14 +12824,43 @@ cmd_config_schema() {
12797
12824
  loki_config_generate_schema
12798
12825
  }
12799
12826
 
12827
+ # D51: headless backlog runner. One v10 issue-mode run per open issue, each in
12828
+ # its own worktree and branch, at most N in parallel (loki.yaml concurrency).
12829
+ cmd_backlog() {
12830
+ case "${1:-}" in
12831
+ ""|--help|-h|help)
12832
+ echo -e "${BOLD}loki backlog${NC} - run a v10 issue-mode run for every matching open issue"
12833
+ echo ""
12834
+ echo "Usage: loki backlog owner/repo (--all | --label X | --issues 1,2,3) [--concurrency N] [--dry-run]"
12835
+ echo ""
12836
+ echo " --all Every open issue"
12837
+ echo " --label X Open issues with label X"
12838
+ echo " --issues 1,2,3 Exactly these issue numbers"
12839
+ echo " --concurrency N Max runs in parallel (default: loki.yaml concurrency, else 2)"
12840
+ echo " --dry-run List what would run; launch nothing"
12841
+ echo ""
12842
+ echo "Run from a checkout of owner/repo. Each issue runs in its own worktree on loki/backlog-N."
12843
+ echo "Config: loki.yaml (repo root, then ~/.loki/loki.yaml); see docs/loki.yaml.example."
12844
+ echo "Exit: 0 every issue ended VERIFIED or with a PR; 3 only budget stops; 1 otherwise; 2 usage."
12845
+ return 0
12846
+ ;;
12847
+ esac
12848
+ command -v python3 >/dev/null 2>&1 || { echo -e "${RED}loki backlog: python3 is required${NC}" >&2; return 2; }
12849
+ python3 "$_LOKI_SCRIPT_DIR/lib/backlog.py" "$@"
12850
+ }
12851
+
12800
12852
  # #691: validate a config file (--config) WITHOUT applying it. Reports
12801
12853
  # unresolved ${VAR} refs, raw-secret literals (error), and per-value validation
12802
12854
  # failures. Non-zero exit on any failure.
12803
12855
  cmd_config_validate() {
12804
- local file="${1:-}"
12805
- if [ -z "$file" ]; then
12806
- echo -e "${RED}Usage: loki config validate <file>${NC}" >&2
12807
- return 2
12856
+ local file="${1:-}" _loki_yaml
12857
+ # D51: loki.yaml (UI + headless config) has its own schema; no argument
12858
+ # validates the discovered loki.yaml (repo root, then ~/.loki/loki.yaml).
12859
+ case "$(basename -- "$file")" in "" | loki.yaml | loki.yml | loki.yaml.example) _loki_yaml=1 ;; *) _loki_yaml=0 ;; esac
12860
+ if [ "$_loki_yaml" = 1 ]; then
12861
+ command -v python3 >/dev/null 2>&1 || { echo -e "${RED}config validate: python3 is required${NC}" >&2; return 2; }
12862
+ python3 "$_LOKI_SCRIPT_DIR/lib/loki_yaml.py" validate ${file:+"$file"}
12863
+ return $?
12808
12864
  fi
12809
12865
  if ! declare -f loki_config_validate_file >/dev/null 2>&1; then
12810
12866
  echo -e "${RED}config validate: config-map.sh helper not loaded${NC}" >&2
@@ -21767,6 +21823,9 @@ main() {
21767
21823
  assets)
21768
21824
  cmd_assets "$@"
21769
21825
  ;;
21826
+ backlog)
21827
+ cmd_backlog "$@"
21828
+ ;;
21770
21829
  config)
21771
21830
  cmd_config "$@"
21772
21831
  ;;
package/autonomy/run.sh CHANGED
@@ -245,7 +245,18 @@ if [ -z "${LOKI_QUICK_INNER:-}" ] && [ "${LOKI_VERBOSE:-0}" != "1" ] && [ "${BAS
245
245
  case "${1:-}" in */quick-prd-*.md | quick-prd-*.md)
246
246
  _qd="$(cd "$(dirname "$1")" && pwd -P)"; rm -f "$_qd/quick-receipt.txt"
247
247
  # Async with default INT/QUIT (a bare `&` child ignores them), signals forwarded.
248
- ( trap - INT QUIT; LOKI_QUICK_DIR="$_qd" LOKI_QUICK_OUTER_PID=$$ LOKI_QUICK_INNER=1 exec "$BASH" "$0" "$@" >"$_qd/quick-run.log" ) &
248
+ # A Node/Bun parent starts us with SIGPIPE ignored, and bash cannot reset a
249
+ # signal ignored on entry; every `echo big | head -1` then prints "echo: write
250
+ # error: Broken pipe" onto the user's terminal. Re-exec the inner run through
251
+ # python3 with SIGPIPE back at default (SIG_DFL survives exec).
252
+ _qexec=("$BASH" "$0" "$@")
253
+ # Env differences under python (not bash): LC_CTYPE may be set when the locale is
254
+ # C, macOS adds __CF_USER_TEXT_ENCODING, and SIGXFSZ stays ignored.
255
+ # The import probe guards a python3 that exists but is broken (CLT stub, pyenv shim).
256
+ if command -v python3 >/dev/null 2>&1 && python3 -c 'import os,signal' >/dev/null 2>&1; then
257
+ _qexec=(python3 -c 'import os,signal,sys;signal.signal(signal.SIGPIPE,signal.SIG_DFL);os.execv(sys.argv[1],sys.argv[1:])' "${_qexec[@]}")
258
+ fi
259
+ ( trap - INT QUIT; LOKI_QUICK_DIR="$_qd" LOKI_QUICK_OUTER_PID=$$ LOKI_QUICK_INNER=1 exec "${_qexec[@]}" >"$_qd/quick-run.log" ) &
249
260
  _qpid=$!
250
261
  trap 'kill -INT "$_qpid" 2>/dev/null' INT
251
262
  trap 'kill -TERM "$_qpid" 2>/dev/null' TERM HUP
@@ -7429,7 +7440,22 @@ init_loki_dir() {
7429
7440
  fi
7430
7441
  fi
7431
7442
 
7432
- mkdir -p .loki/{state,queue,messages,logs,config,prompts,artifacts,scripts}
7443
+ # crash.sh's disclosure sentinel can have left a regular FILE at .loki/config
7444
+ # (LOKI_DIR is the project .loki); mkdir -p of the config DIRECTORY then fails
7445
+ # with "File exists". Fold the file into the directory (back-compat sentinel only),
7446
+ # but ONLY when it holds nothing except that sentinel, and NEVER for ~/.loki (a run
7447
+ # started from $HOME): there config is the user's real settings FILE (telemetry opt-out).
7448
+ if [ -f .loki/config ] && [ ! -L .loki/config ] \
7449
+ && [ "$(cd .loki 2>/dev/null && pwd -P)" != "$(cd "${HOME:-/nonexistent}/.loki" 2>/dev/null && pwd -P)" ] \
7450
+ && [ -z "$(grep -v -e '^DISCLOSURE_SHOWN=true$' -e '^[[:space:]]*$' .loki/config 2>/dev/null)" ]; then
7451
+ mv .loki/config .loki/config.disclosure.tmp 2>/dev/null \
7452
+ && mkdir -p .loki/config 2>/dev/null \
7453
+ && mv .loki/config.disclosure.tmp .loki/config/disclosure 2>/dev/null
7454
+ fi
7455
+ # Retry once: a concurrent creator of the same dir can make the first mkdir -p
7456
+ # fail with "File exists" (seen on CI, leaked to the quiet quick terminal).
7457
+ mkdir -p .loki/{state,queue,messages,logs,config,prompts,artifacts,scripts} 2>/dev/null \
7458
+ || mkdir -p .loki/{state,queue,messages,logs,config,prompts,artifacts,scripts}
7433
7459
  mkdir -p .loki/queue
7434
7460
  mkdir -p .loki/state/checkpoints
7435
7461
  mkdir -p .loki/artifacts/{releases,reports,backups}
@@ -7757,11 +7783,11 @@ write_dashboard_state() {
7757
7783
  local tasks_failed=0
7758
7784
 
7759
7785
  if [ -f ".loki/state/orchestrator.json" ]; then
7760
- current_phase=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('currentPhase', 'BOOTSTRAP'))" 2>/dev/null || echo "BOOTSTRAP")
7761
- version=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('version', 'unknown'))" 2>/dev/null || echo "unknown")
7762
- started_at=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('startedAt', ''))" 2>/dev/null || echo "")
7763
- tasks_completed=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('metrics', {}).get('tasksCompleted', 0))" 2>/dev/null || echo "0")
7764
- tasks_failed=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('metrics', {}).get('tasksFailed', 0))" 2>/dev/null || echo "0")
7786
+ _dv=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('currentPhase', 'BOOTSTRAP'))" 2>/dev/null) && current_phase="$_dv"
7787
+ _dv=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('version', 'unknown'))" 2>/dev/null) && version="$_dv"
7788
+ _dv=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('startedAt', ''))" 2>/dev/null) && started_at="$_dv"
7789
+ _dv=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('metrics', {}).get('tasksCompleted', 0))" 2>/dev/null) && tasks_completed="$_dv"
7790
+ _dv=$(python3 -c "import json; print(json.load(open('.loki/state/orchestrator.json')).get('metrics', {}).get('tasksFailed', 0))" 2>/dev/null) && tasks_failed="$_dv"
7765
7791
  fi
7766
7792
 
7767
7793
  # Emit phase change event if phase has changed (checked in background monitor loop)
@@ -3074,6 +3074,15 @@ sys.exit(0 if ok else 3)" "$lib" "$pj" 2>/dev/null || rc=$?
3074
3074
  declare -f _deploy_receipt_verdict >/dev/null 2>&1 || return 0
3075
3075
  local att
3076
3076
  att="$(_deploy_receipt_verdict "$pj")"
3077
+ # D47: UNSIGNED is never a pass; --allow-unsigned / LOKI_VERIFY_ALLOW_UNSIGNED=1 accepts it, said aloud.
3078
+ if [ "$att" = "UNSIGNED" ]; then
3079
+ if [ "${VERIFY_ALLOW_UNSIGNED:-0}" = "1" ] || [ "${LOKI_VERIFY_ALLOW_UNSIGNED:-}" = "1" ]; then
3080
+ printf 'attestation: UNSIGNED (accepted by --allow-unsigned; integrity not attested)\n'
3081
+ return 0
3082
+ fi
3083
+ printf 'attestation: UNSIGNED, integrity not attested; refusing (pass --allow-unsigned to accept)\n'
3084
+ return 1
3085
+ fi
3077
3086
  printf 'attestation: %s\n' "$att"
3078
3087
  [ "$att" != "TAMPERED" ]
3079
3088
  }
@@ -3093,6 +3102,7 @@ verify_main() {
3093
3102
  VERIFY_CHECK_FRESH=0
3094
3103
  # Opt-in machine-readable stdout (--json). Default 0 = exactly today.
3095
3104
  VERIFY_JSON=0
3105
+ VERIFY_ALLOW_UNSIGNED=0
3096
3106
 
3097
3107
  # Fail-closed defaults. These globals are read at the end of this function
3098
3108
  # (the VERDICT banner and the function return code). verify_compute_verdict()
@@ -3158,6 +3168,7 @@ verify_main() {
3158
3168
  # verdict above stays authoritative for the exit code. Unset =
3159
3169
  # exactly today's behavior. See verify_hosted_enrich().
3160
3170
  VERIFY_HOSTED=1; shift ;;
3171
+ --allow-unsigned) VERIFY_ALLOW_UNSIGNED=1; shift ;;
3161
3172
  --) shift; break ;;
3162
3173
  -*)
3163
3174
  _verify_err "unknown option: $1"; verify_help; return $VERIFY_EXIT_ERROR ;;
package/completions/_loki CHANGED
@@ -205,6 +205,7 @@ function _loki_commands {
205
205
  'crash:Crash report management'
206
206
  'otel:OpenTelemetry management'
207
207
  'wiki:Wiki commands'
208
+ 'backlog:Run every matching open issue, N in parallel'
208
209
  'explain:Explain Loki concepts'
209
210
  'optimize:Optimization commands'
210
211
  'review:Code review commands'
@@ -5,8 +5,8 @@ _loki_completion() {
5
5
  _init_completion || return
6
6
 
7
7
  # Main subcommands (must match autonomy/loki main case statement)
8
- local main_commands="start quick monitor demo tour welcome init stop pause resume steer status next ship dashboard web serve api sandbox notify import github issue config provider reset memory compound checkpoint council dogfood projects enterprise secrets cockpit secure own handoff doctor watchdog audit metrics syslog onboard share proof receipt outcomes explain plan report cost estimate kpis stats test ci watch telemetry agent context ctx code run export review optimize heal modernize migrate cluster worktree wt trigger failover remote deploy docker mcp magic assets analyze compliance crash open otel preview quickstart rc rollback self-update sentrux setup-skill spec state template trust trust-metrics ultracode update verify voice why wiki bench cleanup logs grill docs cp version completions help"
9
- local main_commands="start quick monitor demo tour welcome init stop pause resume steer status next ship dashboard web serve api sandbox notify import github issue intent config provider reset memory compound checkpoint council dogfood projects enterprise secrets cockpit secure own handoff doctor watchdog audit metrics syslog onboard share proof receipt explain plan report cost estimate kpis stats test ci watch telemetry agent context ctx code run export review optimize heal modernize migrate cluster worktree wt trigger failover remote deploy docker mcp magic assets analyze compliance crash open otel preview quickstart rc rollback self-update sentrux setup-skill spec state template trust trust-metrics ultracode update verify voice why wiki bench cleanup logs grill docs cp version completions help"
8
+ local main_commands="start backlog quick monitor demo tour welcome init stop pause resume steer status next ship dashboard web serve api sandbox notify import github issue config provider reset memory compound checkpoint council dogfood projects enterprise secrets cockpit secure own handoff doctor watchdog audit metrics syslog onboard share proof receipt outcomes explain plan report cost estimate kpis stats test ci watch telemetry agent context ctx code run export review optimize heal modernize migrate cluster worktree wt trigger failover remote deploy docker mcp magic assets analyze compliance crash open otel preview quickstart rc rollback self-update sentrux setup-skill spec state template trust trust-metrics ultracode update verify voice why wiki bench cleanup logs grill docs cp version completions help"
9
+ local main_commands="start backlog quick monitor demo tour welcome init stop pause resume steer status next ship dashboard web serve api sandbox notify import github issue intent config provider reset memory compound checkpoint council dogfood projects enterprise secrets cockpit secure own handoff doctor watchdog audit metrics syslog onboard share proof receipt explain plan report cost estimate kpis stats test ci watch telemetry agent context ctx code run export review optimize heal modernize migrate cluster worktree wt trigger failover remote deploy docker mcp magic assets analyze compliance crash open otel preview quickstart rc rollback self-update sentrux setup-skill spec state template trust trust-metrics ultracode update verify voice why wiki bench cleanup logs grill docs cp version completions help"
10
10
 
11
11
  # 1. If we are on the first argument (subcommand)
12
12
  if [[ $cword -eq 1 ]]; then
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "10.5.15"
10
+ __version__ = "10.5.17"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -2,7 +2,7 @@
2
2
 
3
3
  The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
4
4
 
5
- **Version:** v10.5.15
5
+ **Version:** v10.5.17
6
6
 
7
7
  ---
8
8
 
@@ -63,6 +63,21 @@ Code 3 matters more than it looks. A verifier that cannot run is not a pass,
63
63
  so `[ $rc -eq 0 ]` is the only safe test for "verified" -- `[ $rc -ne 2 ]`
64
64
  would treat a broken verifier as acceptable.
65
65
 
66
+ ### UNSIGNED receipts (D47)
67
+
68
+ An UNSIGNED receipt (no attestation, so its integrity is not attested) is never
69
+ a pass, on either engine, with or without a local key. A stripped receipt must
70
+ not rank above UNCHECKED.
71
+
72
+ | Engine | UNSIGNED without the flag | With `--allow-unsigned` or `LOKI_VERIFY_ALLOW_UNSIGNED=1` |
73
+ |---|---|---|
74
+ | Engine10 (`loki-ts`, `verify_cmd.ts`) | exit 3, `attestation: UNSIGNED, integrity not attested; refusing (pass --allow-unsigned to accept)` | exit 0, `attestation: UNSIGNED (accepted by --allow-unsigned; integrity not attested)` |
75
+ | Legacy shell (`autonomy/verify.sh`) | BLOCKED (non-zero) | the receipt line passes with the same accepted line |
76
+
77
+ Engine10 `loki verify [run-id]` exits: 0 verified, 1 tampered, 2 unchecked,
78
+ 3 unsigned (refused), 66 no runs. The flag never changes TAMPERED or UNCHECKED,
79
+ and verify never creates a signing key.
80
+
66
81
  An early draft spec listed `1=BLOCKED, 2=CONCERNS`. That ordering was rejected:
67
82
  it is not used anywhere, it has no consumers, and it inverts the
68
83
  severity-rises-with-the-code rule that every other command follows.
package/docs/v10/BOARD.md CHANGED
@@ -625,25 +625,35 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
625
625
  | E-155 | Incident 21:58Z: a shell test run from the MAIN checkout (633 diff-selected tests, xargs -P 4, 17:58:16 local) switched HEAD to the stale branch loki/session-1789047299-95963; main ref intact, restored by `git checkout main` 33s later. Candidates running that second: test-metrics-command, test-metrics-json-unmeasured, test-migration-post-edit-revert, test-mirofish-integration, test-magic-injection. A stray root bun.lock also appeared at 17:54. Guard: tests/run-all-tests.sh records `git symbolic-ref HEAD` + status before and fails loudly when any test changes the parent checkout branch; bisect the culprit with that guard | tests/run-all-tests.sh, culprit test | MEDIUM | guard test red when a test runs git checkout in the parent repo | merged@2026-09-30T22:27Z | process fix already applied: shell batches run only in a disposable worktree |
626
626
  | E-154c | CORRECTED PREMISE (builder, 59c1cb54): CI shards set LOKI_TEST_SHARD, not LOKI_TEST_LIST (a list-only mode that runs nothing), so sharded CI DOES run the guards; the train/14 failure was the guard test inheriting LOKI_TEST_SHARD. Slice adds shard-mode guard checks only. Original claim: the E-154/E-155 guards (run-owned signing key default, real ~/.loki/keys snapshot, parent HEAD check) are skipped whenever LOKI_TEST_LIST is set, and CI shards set it, so sharded CI runs carry NO guard: a test writing the real key dir or switching the parent branch would pass on CI. Make the guards active in shard mode too (the LOKI_TEST_LIST skip was presumably for selective local runs) and keep the guard test hermetic | tests/run-all-tests.sh, tests/test-e154-e155-guards.sh | MEDIUM | guard checks run and pass under LOKI_TEST_LIST | released@2026-10-01T01:19Z | found while fixing train/14 shard 6 Released in v10.5.14 (merge 0d8a5dce is an ancestor of v10.5.14). |
627
627
  | E-156 | Incident 22:00Z: pre-push gitleaks (generic-api-key) blocked train/11 on the key FILE NAME string `.loki/keys/receipt-ed25519.pem` (seal.ts:68, seal.test.ts:174, dist/loki.js:1244); no key material. Fixed by exact .gitleaksignore fingerprints, but any future commit that rewrites the minified dist line re-triggers and can block a release push. Durable fix needs a CTO call: a narrow `.gitleaks.toml` allowlist (regexTarget=secret, `^receipt-ed25519\.pem$`, extend defaults) pushed with LOKI_ALLOW_GITLEAKS_CONFIG_CHANGE=1 plus a test that a real key in the same position is still caught | .gitleaks.toml, tests/test-pre-push-gitleaks.sh | HIGH | real-key fixture still flagged; filename allowed | released@2026-10-01T01:19Z | CTO approval (security scan config) Released in v10.5.14 (merge 314b89fe is an ancestor of v10.5.14). |
628
- | E-157 | D46: Security Audit verdict reuse. (a) security-audit.yml also runs on push to train/** so every train tip gets the full --all gitleaks scan before main is fast-forwarded; (b) required-ci reuses the parent Security Audit verdict for an eligible VERSION-only bump under the existing eligibility rule (diff is VERSION plus generated version stamps only, parent run success at that exact SHA). Moat test: a non-VERSION-only bump still re-runs Security Audit. Supersedes FOUNDER-QUEUE 14 | .github/workflows/security-audit.yml, release.yml (required-ci), tests | HIGH | non-VERSION-only bump re-runs the scan | ready@2026-10-01T00:30Z | after slice-D46-ci |
629
- | E-159 | Pre-existing secret-scan gaps found by the E-157 r2 opus reviewer: (a) an evil merge, a merge commit whose OWN content adds a secret (merge -s ours --no-commit, token in the merge commit), is invisible to both the PARENT..SHA range scan and the --all scan (only `gitleaks dir` found it); (b) pinned gitleaks 8.30.0 exits 0 when its internal git log fails (invalid range), a latent fail-open. Fix: --diff-merges=first-parent (or -m) in --log-opts for both modes or a working-tree scan at the release SHA; guard `git rev-list RANGE` success or treat `[git] fatal` as failure | scripts/security-audit-gitleaks.sh, workflows, tests | HIGH | evil-merge and bad-range fixtures fail the scan | ready@2026-10-01T01:07Z | CI-health engineer after E-157 r3 |
628
+ | E-157 | D46: Security Audit verdict reuse. (a) security-audit.yml also runs on push to train/** so every train tip gets the full --all gitleaks scan before main is fast-forwarded; (b) required-ci reuses the parent Security Audit verdict for an eligible VERSION-only bump under the existing eligibility rule (diff is VERSION plus generated version stamps only, parent run success at that exact SHA). Moat test: a non-VERSION-only bump still re-runs Security Audit. Supersedes FOUNDER-QUEUE 14 | .github/workflows/security-audit.yml, release.yml (required-ci), tests | HIGH | non-VERSION-only bump re-runs the scan | merged@2026-10-01T03:03Z | after slice-D46-ci; r3 opus APPROVE 57b511d2; DROPPED from train/21 (D46): STEP 1 re-indent broke S-132 normalizer parity (test-version-bump-only 28/1), reverted 7d1a0f15, r4 with CI-health |
629
+ | E-159 | Pre-existing secret-scan gaps found by the E-157 r2 opus reviewer: (a) an evil merge, a merge commit whose OWN content adds a secret (merge -s ours --no-commit, token in the merge commit), is invisible to both the PARENT..SHA range scan and the --all scan (only `gitleaks dir` found it); (b) pinned gitleaks 8.30.0 exits 0 when its internal git log fails (invalid range), a latent fail-open. Fix: --diff-merges=first-parent (or -m) in --log-opts for both modes or a working-tree scan at the release SHA; guard `git rev-list RANGE` success or treat `[git] fatal` as failure | scripts/security-audit-gitleaks.sh, workflows, tests | HIGH | evil-merge and bad-range fixtures fail the scan | merged@2026-10-01T03:03Z | CI-health engineer after E-157 r3; r1 opus REJECT 5f33451d: stdin merge scan false-positives on real history (v10.5.13..14 rc 1), Wall checks skip in CI |
630
+ | E-160 | D46 runner contention (peer steer 02:11Z): a green train SHA fast-forwarded to main re-runs Tests (8 shards), Bun Parity, Security Audit and First-run gate on the identical SHA, doubling runner load and queueing the next train. Proposal: on push to main, a first job checks for a successful run of the same workflow at the same SHA from a train/** push and, if found, exits success recording the reused run id (D28: same SHA = same tree); any SHA not train-tested runs in full. CTO call FIRST: OPERATING-MODEL says "Tier B full verification on every main commit (never cancelled on main)"; confirm reuse does not weaken Release required-ci, branch-conditional steps (train vs main), or the Security Audit range (base tag config). Sequence after E-157 r4 (same files) | .github/workflows/test.yml, bun-parity.yml, security-audit.yml, tests/test_release_required_ci.py | HIGH | main push of a train-green SHA records reuse and finishes in under 1 min; an untested SHA runs in full; a train-red SHA is not reused | ready@2026-10-01T02:10Z | CTO decision first; after E-157 |
631
+ | E-161 | INCIDENT 02:46Z: an opus reviewer ran `git checkout --detach <tag>` x7 plus a `.gitleaksignore` overwrite in the SHARED main checkout (reflog 02:46:04Z to 02:46:38Z). Cause: its run-owned clone dir was deleted, the next `cd` into a new clone failed, and the shell cwd fell back to the main checkout; every later command ran there. Restored by the Chief of Staff (`git checkout main`, fafe50dd, clean). Guard: v10-guard.sh (PreToolUse) blocks `git checkout`/`git switch`/`git reset`/`git worktree remove` and writes to tracked files when cwd resolves to the main checkout and the caller is an agent (not the leader session); agent prompts use `cd DIR` followed by an exit-on-failure check. Test: a hook test with cwd=main checkout blocks a detached checkout and allows it in a worktree | scripts/v10-guard.sh, tests | HIGH | detached checkout in main checkout blocked; same in a worktree allowed | ready@2026-10-01T02:47Z | GUARDS.md entry |
632
+ | E-162 | Founder "faster" (03:05Z): slice CI runs only Tier A plus diff-selected suites (the existing Tier A selection), Bun Parity and the structural guards; the full 8-shard Tests stays on train/** and main, and the train stays the release verdict. Frees runners and targets about 2 min slice CI | .github/workflows/test.yml (slice-* job matrix only), tests | HIGH | slice-* push runs no 8-shard matrix; train/** and main still run all 8 shards; a slice touching a suite runs that suite | ready@2026-10-01T03:01Z | after E-157 r4 (same file) |
633
+ | D49-auto | Auto-promote to latest on Post-Release Smoke success (founder D49) | .github/workflows/promote.yml, tests/test_release_next_tag.py | HIGH | smoke-success from Release promotes; manual smoke never promotes; not-lower guard | merged@2026-10-01T03:03Z | opus APPROVE 5510b8c8. Follow-ups (D49-auto-b): not-lower guard fails OPEN on an npm error (make it fail closed); loki-mode-sdk latest has no not-lower guard; a newer queued promote can replace a pending one in a release burst |
634
+ | D51-A3 | Headless `loki backlog owner/repo --all/--label/--issues` plus loki.yaml (schema, validator, env overrides) | autonomy/lib/backlog.py, autonomy/lib/loki_yaml.py, autonomy/loki, schemas/loki-yaml.schema.json, tests/test-backlog.sh | HIGH | backlog 47/0 | merged@2026-10-01T03:11Z | sonnet APPROVE 14ff9ae2; follow-up D51-A3b: `loki_yaml.py show` echoes a token pasted into git.token_env (redact x-secret-ref fields); no-parser test case; re-run of a failed issue discards its kept worktree |
635
+ | D51-A4 | Slack on the v10 path (PR opened, BLOCKED, finished), webhook from the env var named by LOKI_SLACK_WEBHOOK_ENV, URL redacted, 5s bounded post | loki-ts/src/e10ext/slack_events.ts, engine10/supervisor.ts, tests | MEDIUM | slack tests 40/0 | merged@2026-10-01T03:11Z | sonnet APPROVE adb838b2; one labelled test message after it ships |
636
+ | D48-r10 | loki-seal in the repo plugin marketplace (`/plugin marketplace add asklokesh/loki-mode`, `/plugin install loki-seal@loki-mode`), README line 4 | .claude-plugin/marketplace.json, README.md, tests/test-loki-seal-marketplace.sh | MEDIUM | clean-HOME install works; marketplace test 8/0 | merged@2026-10-01T03:11Z | sonnet APPROVE 5ecab20d; nit: blank line between README lines 3 and 4 (DOC-01 owns README) |
637
+ | P0-t15 | train/15 and train/17 red: quiet `loki quick` default output 16 lines (stderr noise: mkdir .loki/config File exists, 2 caveman bootstrap lines, echo broken pipe). Fix: caveman notices to the quiet run log, fold a sentinel-only .loki/config into the config dir (never ~/.loki), SIGPIPE reset via python3 re-exec guarded by an import probe | autonomy/run.sh, autonomy/loki, tests/test-quick-config-safety.sh | MEDIUM | default output at most 15 lines; ~/.loki/config untouched from $HOME; broken python3 still runs | released@2026-10-01T02:27Z | r1 REJECT (config clobber, python3 guard); r2 54da8960 APPROVE (config-safety 5/0, receipt-order 14/0 at 12 lines, crash-cli 57/0) Released in v10.5.16 (merge e7e39e27 is an ancestor of v10.5.16). |
630
638
  | A-113 | Stop reasons: STALLED and the fatal classifier (item 5) | see plan A-113 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T01:19Z | Wave per plan section 5; one writer per file. Released in v10.5.14 (merge 0377398d is an ancestor of v10.5.14). |
631
639
  | A-114 | FALSE VERIFIED ON MAIN (found by the A-112 opus reviewer, repro m6 on 4ad430ad): bugrepo plus an unrelated red test; the agent changes only other.js; verify selects only node:other.test.js (testmap from the diff), so the task's own target test sums.test.js is never run and the run seals VERIFIED rc=0 while it is red. Fix: the relevant tests of the task-named files (hasRelevantTests / impacted(likely), the lean-path Wall stand-in) are ALWAYS selected by verify, whatever the diff touches | loki-ts/src/engine10/stages/verify.ts or testmap selection, tests | HIGH | m6 fixture seals FAILED | merged@2026-09-30T22:37Z | coordinate with A-112 (verify.ts, same target notion); P0 moat |
632
640
  | A-115 | TIER 0 (steer 22:50Z). FALSE VERIFIED ON MAIN (A-112 opus reviewer, c10 on 275b4fc0): a conftest.py that skips the target test (and the unrelated red one) seals VERIFIED rc=0, "2 passed, 2 skipped", nothing disclosed. Seal accuracy: a relevant check with more skipped tests than base, or a diff touching conftest.py / pytest.ini / pyproject [tool.pytest] / jest or node test config, must not count as a pass or as progress; list it in NOT PROVEN | loki-ts/src/engine10/stages/verify.ts, failures.ts, tests | HIGH | c10 and e9 fixtures seal FAILED or NOT VERIFIED | released@2026-10-01T00:52Z | core at the 5000 cap: needs an offset (A-150) Released in v10.5.13 (merge bdb332e3 is an ancestor of v10.5.13). |
633
- | A-115b | A-115 opus notes: (1) an honest fix that also appends a new test to a relevant test file, in a repo with an unrelated red test, ends STALLED/FAILED instead of PARTIAL: the edited file is excluded from progress so the unrelated red is never subtracted; allow progress when the file's pre-existing target ids went red to green; (2) the node base-count fallback sums every `pass N`/`fail N` line, so a base test printing them inflates the count (safe-direction false PARTIAL); take the last pass and last fail lines | loki-ts/src/engine10/stages/verify.ts, verify_weak.test.ts | HIGH | both fixtures | merged@2026-10-01T01:02Z | |
634
- | A-119 | P0 FALSE VERIFIED ON MAIN (A-115b opus reviewer, reproduced on bba2e5ec): rename the target test file and weaken its expectation (sum.test.js => sum.spec.test.js with 6 changed to 5), add a comment to sum.js: rc=0 Outcome VERIFIED, receipt shows node:sum.spec.test.js pass, sum.js still buggy. verify only sees relevant test files that still exist on head; seal writes `weakened test: sum.test.js` (seal.ts:205) but that line never downgrades the verdict. Fix: seal's `weakened test:` downgrades to PARTIAL like verify's not_proven | loki-ts/src/engine10/stages/seal.ts, tests | HIGH | rename-and-weaken fixture: not VERIFIED, rc!=0 | merged@2026-10-01T01:17Z | Tier 0 |
635
- | A-119b | A-119 opus review (REJECT on pre-existing holes, A-119 landed as a strict improvement): weakening still ends VERIFIED via (1) a helper file a base test imports (eq=()=>{}), (2) snapshot or fixture edits (__snapshots__/*.snap, tests/fixtures/*.json), (3) tests isTestFile (testmap.ts:51) does not recognise: __tests__/*.js, mocha test/*.js, cargo tests/*.rs, including rename to .bak. Also: verdictOf returns ALREADY_SATISFIED before the weakened downgrade when implement says already_done; package.json jest testPathIgnorePatterns and vite.config.ts test.exclude skip config detection. Fix: widen the seal.ts weakTests predicate to any changed/deleted base path under test/, tests/, __tests__/, __snapshots__/, fixtures dirs plus non-test files a base test imports; check weakened before the already_done early return; add vite.config and in-block jest keys to CFG detection | loki-ts/src/engine10/stages/seal.ts, verify.ts (CFG only), tests | HIGH | each repro gives not-VERIFIED; source-only fix and new test stay VERIFIED | building@2026-10-01T01:18Z | |
636
- | A-117 | FALSE VERIFIED IN `loki verify` (A-130 r2 opus reviewer): on a run whose events.jsonl was tampered (append, edit, truncate, delete), the run now ends FAILED (A-130) but the receipt on disk still says VERIFIED with no tamper mark, because the worker sealed it before the supervisor detected the tamper; `loki verify` prints verdict: VERIFIED rc=0. Fix: record the tamper on the receipt via the registered receipt.addendum event (hash-chained) or have verify check the event log hash; verify must say TAMPERED and exit non-zero | loki-ts/src/engine10/verify_cmd.ts, supervisor.ts or seal.ts, tests | HIGH | tampered-log fixture: loki verify TAMPERED rc!=0 | building@2026-10-01T01:18Z | after A-130 (supervisor.ts); r2: opus REJECT, tail truncation erases post-seal tamper, fix = signed final log line |
637
- | A-118 | Exit-honest policy gap on the DEFAULT path (A-115 r2 finding): legacy `loki quick` prints `Evidence Receipt: NOT VERIFIED` yet exits rc 0 on a run whose target test was skipped; G1 exit-honest counts a skipped test as green, so it does not catch this. CTO call: should legacy quick exit non-zero on NOT VERIFIED when a relevant test was skipped/weakened, and should G1 count skipped as not-green? | autonomy/run.sh (quick exit path), scripts/first-run-gate.sh G1 | HIGH | skipped-target legacy run exits non-zero; G1 treats skipped as not green | building@2026-10-01T01:17Z | D47 decided: rc 3 on tests_integrity failed (skip added, runner config changed, test file deleted/renamed); assertion edits disclosed rc 0; G1 green needs pass 2 fail 0, 9b asserts rc 3. Files: proof-generator.py, run.sh after generate_proof_of_run, first-run-gate.sh, docs/exit-codes.md. Blocks promote of `latest` |
641
+ | A-115b | A-115 opus notes: (1) an honest fix that also appends a new test to a relevant test file, in a repo with an unrelated red test, ends STALLED/FAILED instead of PARTIAL: the edited file is excluded from progress so the unrelated red is never subtracted; allow progress when the file's pre-existing target ids went red to green; (2) the node base-count fallback sums every `pass N`/`fail N` line, so a base test printing them inflates the count (safe-direction false PARTIAL); take the last pass and last fail lines | loki-ts/src/engine10/stages/verify.ts, verify_weak.test.ts | HIGH | both fixtures | released@2026-10-01T01:53Z | Released in v10.5.15 (merge 945f58ec is an ancestor of v10.5.15). |
642
+ | A-119 | P0 FALSE VERIFIED ON MAIN (A-115b opus reviewer, reproduced on bba2e5ec): rename the target test file and weaken its expectation (sum.test.js => sum.spec.test.js with 6 changed to 5), add a comment to sum.js: rc=0 Outcome VERIFIED, receipt shows node:sum.spec.test.js pass, sum.js still buggy. verify only sees relevant test files that still exist on head; seal writes `weakened test: sum.test.js` (seal.ts:205) but that line never downgrades the verdict. Fix: seal's `weakened test:` downgrades to PARTIAL like verify's not_proven | loki-ts/src/engine10/stages/seal.ts, tests | HIGH | rename-and-weaken fixture: not VERIFIED, rc!=0 | released@2026-10-01T01:53Z | Tier 0 Released in v10.5.15 (merge c41a2b83 is an ancestor of v10.5.15). |
643
+ | A-119b | A-119 opus review (REJECT on pre-existing holes, A-119 landed as a strict improvement): weakening still ends VERIFIED via (1) a helper file a base test imports (eq=()=>{}), (2) snapshot or fixture edits (__snapshots__/*.snap, tests/fixtures/*.json), (3) tests isTestFile (testmap.ts:51) does not recognise: __tests__/*.js, mocha test/*.js, cargo tests/*.rs, including rename to .bak. Also: verdictOf returns ALREADY_SATISFIED before the weakened downgrade when implement says already_done; package.json jest testPathIgnorePatterns and vite.config.ts test.exclude skip config detection. Fix: widen the seal.ts weakTests predicate to any changed/deleted base path under test/, tests/, __tests__/, __snapshots__/, fixtures dirs plus non-test files a base test imports; check weakened before the already_done early return; add vite.config and in-block jest keys to CFG detection | loki-ts/src/engine10/stages/seal.ts, verify.ts (CFG only), tests | HIGH | each repro gives not-VERIFIED; source-only fix and new test stay VERIFIED | building@2026-10-01T02:18Z | |
644
+ | A-117 | FALSE VERIFIED IN `loki verify` (A-130 r2 opus reviewer): on a run whose events.jsonl was tampered (append, edit, truncate, delete), the run now ends FAILED (A-130) but the receipt on disk still says VERIFIED with no tamper mark, because the worker sealed it before the supervisor detected the tamper; `loki verify` prints verdict: VERIFIED rc=0. Fix: record the tamper on the receipt via the registered receipt.addendum event (hash-chained) or have verify check the event log hash; verify must say TAMPERED and exit non-zero | loki-ts/src/engine10/verify_cmd.ts, supervisor.ts or seal.ts, tests | HIGH | tampered-log fixture: loki verify TAMPERED rc!=0 | merged@2026-10-01T02:50Z | after A-130 (supervisor.ts); r2: opus REJECT, tail truncation erases post-seal tamper, fix = signed final log line |
645
+ | A-118 | Exit-honest policy gap on the DEFAULT path (A-115 r2 finding): legacy `loki quick` prints `Evidence Receipt: NOT VERIFIED` yet exits rc 0 on a run whose target test was skipped; G1 exit-honest counts a skipped test as green, so it does not catch this. CTO call: should legacy quick exit non-zero on NOT VERIFIED when a relevant test was skipped/weakened, and should G1 count skipped as not-green? | autonomy/run.sh (quick exit path), scripts/first-run-gate.sh G1 | HIGH | skipped-target legacy run exits non-zero; G1 treats skipped as not green | building@2026-10-01T02:15Z | D47 decided: rc 3 on tests_integrity failed (skip added, runner config changed, test file deleted/renamed); assertion edits disclosed rc 0; G1 green needs pass 2 fail 0, 9b asserts rc 3. Files: proof-generator.py, run.sh after generate_proof_of_run, first-run-gate.sh, docs/exit-codes.md. Blocks promote of `latest`; built df404970, opus review |
638
646
  | A-112b | A-112 readability debt: subtractBase in verify.ts was folded to reach 4999 of 5000 core lines (9 lines over 200 chars, longest 347; un/progress/base-run loop each on one line). Unfold when A-150 frees budget; no behaviour change | loki-ts/src/engine10/stages/verify.ts | MEDIUM | budget test plus verify_prered unchanged | ready@2026-09-30T22:37Z | after A-150 |
639
647
  | A-113b | A-110 opus notes on A-113: (1) under the CLI invoker (LOKI_E10_INVOKER=cli) the provider child stderr never reaches the fatal classifier (the *-impl.stderr.log is empty), so a credit/auth failure printed on plain stderr gives stop:null and burns the fix rounds; (2) machine.ts re-records the previous signature when a verify crashes, so a crashed verify counts toward a stall. Fix both in session.ts/machine.ts, with end-to-end tests through the real worker | loki-ts/src/engine10/session.ts, machine.ts, tests | HIGH | CLI stderr credit line stops fatal; crashed verify does not count as a stall repeat | released@2026-10-01T01:19Z | keep the A-110 escalated emit; the A-110 reviewer plugin probe is a good e2e template Released in v10.5.14 (merge 0377398d is an ancestor of v10.5.14). |
640
648
  | A-121 | v10 signs and verifies natively (item 3) | see plan A-121 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 08b31271 is an ancestor of v10.5.13). |
641
649
  | A-122 | Delete the GPG signing layer (item 3, deletion) | see plan A-122 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge cb738c36 is an ancestor of v10.5.13). |
642
- | A-121b | A-121 opus note: a receipt downgrade exits 0. Anyone can edit the body, recompute receipt_sha256 and null the jwt to get UNSIGNED rc 0 on `loki verify`, and the legacy deploy gate refuses UNSIGNED but the v10 verify does not. Decide the signed-by-default policy: once a local key exists, UNSIGNED on a receipt from this machine exits non-zero (or the receipt records its kid outside the hashed body) | loki-ts/src/engine10/verify_cmd.ts, stages/seal.ts, tests | HIGH | downgrade fixture exits non-zero | building@2026-10-01T01:17Z | D47 decided: UNSIGNED exits 3 on both engines (verify_cmd.ts EXIT_BY_VERDICT, autonomy/verify.sh _verify_receipt_digest), --allow-unsigned / LOKI_VERIFY_ALLOW_UNSIGNED=1 accepts with explicit line; update tests/test-engine10-live-pr.sh 115-122; verify never creates a key |
650
+ | A-121b | A-121 opus note: a receipt downgrade exits 0. Anyone can edit the body, recompute receipt_sha256 and null the jwt to get UNSIGNED rc 0 on `loki verify`, and the legacy deploy gate refuses UNSIGNED but the v10 verify does not. Decide the signed-by-default policy: once a local key exists, UNSIGNED on a receipt from this machine exits non-zero (or the receipt records its kid outside the hashed body) | loki-ts/src/engine10/verify_cmd.ts, stages/seal.ts, tests | HIGH | downgrade fixture exits non-zero | building@2026-10-01T02:33Z | D47 decided: UNSIGNED exits 3 on both engines (verify_cmd.ts EXIT_BY_VERDICT, autonomy/verify.sh _verify_receipt_digest), --allow-unsigned / LOKI_VERIFY_ALLOW_UNSIGNED=1 accepts with explicit line; update tests/test-engine10-live-pr.sh 115-122; verify never creates a key |
651
+ | A-121c | A-121b opus finding B: legacy `loki verify` passes a WELL-FORMED token with an unknown kid at rc 0 (`attestation: UNCHECKED`, `VERDICT: VERIFIED`) with or without the local key; engine10 gives rc 2. A forger can always mint such a token, so on legacy a downgrade-to-foreign-kid is a pass. D47 kept legacy UNCHECKED unchanged because it also covers honest cross-machine verification. CTO call: make legacy UNCHECKED non-zero (parity with engine10 rc 2), now that D48 row 2 adds `loki verify --pubkey` as the honest cross-machine path? Also: a missing .loki/state/last-proof-id.txt makes legacy verify skip the receipt check entirely and pass (pre-existing, A-134) | autonomy/loki (_deploy_receipt_verdict, verify), tests | HIGH | unknown-kid forged token exits non-zero on legacy; honest cross-machine path documented | ready@2026-10-01T02:33Z | CTO decision first; after A-121b |
643
652
  | A-110 | One named outcome, fixed exit ladder, --json (items 1 and 5) | see plan A-110 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 47ac1ccc is an ancestor of v10.5.13). |
644
653
  | A-112 | Baseline subtract: judge only the delta (item 5) | see plan A-112 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 69f1a910 is an ancestor of v10.5.13). |
645
654
  | A-123 | Doctor: only the selected provider blocks, one Ready line (item 3) | see plan A-123 | MEDIUM | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 275b4fc0 is an ancestor of v10.5.13). |
646
655
  | A-134 | Legacy: receipt after the final commit, chatter behind --verbose (item 2) | see plan A-134 | MEDIUM | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 7d3edf96 is an ancestor of v10.5.13). |
647
- | A-134b | A-134 opus notes: (1) standalone autonomy/verify.sh prints no attestation line (only `loki verify` has _deploy_receipt_verdict); print `attestation: UNCHECKED (run via loki verify)` instead of silence; (2) the quiet failure tail grep `[Ff]ailed` matched the RALPH system-prompt line and printed ~1.5k chars; anchor to `^\[(ERROR|WARN)\]` or cap line length; (3) the quiet inner run starts as a background job so its stdin is /dev/null even from a TTY: pause-mode keypress resume changes for quiet runs; (4) `loki quick --verbose` is also the A-122 cmd_quick flag, done | autonomy/verify.sh, autonomy/run.sh | MEDIUM | each note has a test | review@2026-10-01T01:23Z | |
656
+ | A-134b | A-134 opus notes: (1) standalone autonomy/verify.sh prints no attestation line (only `loki verify` has _deploy_receipt_verdict); print `attestation: UNCHECKED (run via loki verify)` instead of silence; (2) the quiet failure tail grep `[Ff]ailed` matched the RALPH system-prompt line and printed ~1.5k chars; anchor to `^\[(ERROR|WARN)\]` or cap line length; (3) the quiet inner run starts as a background job so its stdin is /dev/null even from a TTY: pause-mode keypress resume changes for quiet runs; (4) `loki quick --verbose` is also the A-122 cmd_quick flag, done | autonomy/verify.sh, autonomy/run.sh | MEDIUM | each note has a test | building@2026-10-01T02:24Z | |
657
+ | A-134c | A-134b r1 review finding: provider call sites in autonomy/run.sh (mainline claude -p at about 25455/25460, provider_invoke_argv about 1050/1053) do not redirect stdin, so under LOKI_VERBOSE=1 (and any non-quiet path) a parent stdin pipe that never closes blocks `claude -p` reading stdin (pre-existing). Fix: `< /dev/null` at provider invocations that pass the prompt as an argument | autonomy/run.sh (provider call sites only), providers/*.sh, tests | MEDIUM | never-closing stdin pipe: verbose `loki quick` completes under timeout 60 | ready@2026-10-01T01:37Z | |
648
658
  | A-130 | v10 quiet by default (item 2) | see plan A-130 | MEDIUM | first-run-gate assertion per plan card | released@2026-10-01T01:19Z | Wave per plan section 5; one writer per file. Released in v10.5.14 (merge a518bfea is an ancestor of v10.5.14). |
649
- | A-130b | A-130 Reason line prints first_error from a failing check verbatim (capped at 200 chars, control chars stripped) but unredacted: a `ghp_` token in a test failure line reaches the terminal. No TS redactor is reachable from engine10 core (only autonomy/lib/proof_redact.py). Port the token patterns to a small TS helper outside core or redact first_error where it is captured in verify | loki-ts/src (util), verify.ts or output.ts, tests | MEDIUM | ghp_/sk- token in first_error prints redacted | review@2026-10-01T01:22Z | |
659
+ | A-130b | A-130 Reason line prints first_error from a failing check verbatim (capped at 200 chars, control chars stripped) but unredacted: a `ghp_` token in a test failure line reaches the terminal. No TS redactor is reachable from engine10 core (only autonomy/lib/proof_redact.py). Port the token patterns to a small TS helper outside core or redact first_error where it is captured in verify | loki-ts/src (util), verify.ts or output.ts, tests | MEDIUM | ghp_/sk- token in first_error prints redacted | released@2026-10-01T02:27Z | ; sonnet APPROVE be50510f (redaction before cap, parity with proof_redact.py) Released in v10.5.16 (merge f214a0fa is an ancestor of v10.5.16). |
@@ -383,3 +383,39 @@ Loki's definition: "autonomous software factory that runs with the knowledge of
383
383
  4. Recording the kid outside the hash and markers inside the body were rejected: verification is already unhashed and a forger can rewrite any body field.
384
384
  5. `--allow-unsigned` or LOKI_VERIFY_ALLOW_UNSIGNED=1 accepts UNSIGNED with an explicit line. It never changes TAMPERED or UNCHECKED, and verify never creates a key.
385
385
  6. Both slices (A-118, A-121b) are HIGH tier with red-first fixtures (skip, config, rename, downgrade, fresh HOME). They land before `latest` is promoted, together with A-115.
386
+
387
+ ## D48 (founder, relayed by autonomi-dev-dc at 02:35Z): "10/10 on everything" by 04:35Z
388
+ 1. Ten rows, each with a CI acceptance test, scored against the best competitor; 10/10 means the test passes in CI, never a claim. Quality bar and the Never list unchanged; D46 cadence continues.
389
+ 2. Rows: (1) gaming matrix on both engines ends non-VERIFIED with rc != 0; (2) portable receipt: `loki keys export` + `loki verify --pubkey`; (3) quiet default output at most 8 lines, real-mode wall within 1.5x raw `claude -p`; (4) first-run gate on node:test, pytest and go test repos, only fix files change; (5) exit ladder on legacy quick plus a --json schema validated against real output; (6) `loki doctor --fix`, doctor under 2s; (7-9) lean v10 engine default for `loki "<task>"`, issue mode and `loki quick` on next, legacy escape hatch kept, non-null cost on every gate run; (10) repo-root .claude-plugin/marketplace.json listing packages/loki-seal, tested in a clean Claude Code HOME, one README install line.
390
+ 3. Rows 7-9 flip the default only after A-117, A-118 and A-119b are merged and the gaming matrix (row 1) passes; until then they are built behind the existing flag.
391
+ 4. Staffing is bounded by machine load (max 28) and the worktree cap (15); rows run in waves, not all at once. Status per row is written to PROGRESS.md at 03:35Z and 04:35Z as pass, fail or not started, with what is missing.
392
+
393
+ ## D49 (founder, CONFIRMED directly in the Release Manager session at 02:42Z): promote to `latest` now and auto-promote every release
394
+ - Relayed text: "everything should be released asap, no holding of anything done so far as well", "and going forward". Asks to promote 10.5.16 to `latest` now and trigger promote.yml automatically after every Release.
395
+ - Not applied by the Release Manager because it contradicts the standing instruction in this session ("NEVER run promote or move `latest`") and SWARM-PROMPT-ADOPTION, and a peer relay is not the founder's direct approval for a hard-to-reverse, user-facing change. Awaiting the founder's direct confirmation in the Release Manager session. Prepared evidence: first-run gate stub against the npm-installed 10.5.16.
396
+ - 02:42Z: the founder answered directly in the Release Manager session: "Apply D49 fully" and, for D48 rows 7-9, "Flip on next now". Applied: the first-run gate stub on the npm-installed 10.5.16 passed (0 assertions failed, wall 34s); promote.yml dispatched for 10.5.16 (run 36807172046). Auto-promotion on every green Release (stub gate plus Post-Release Smoke) is a slice. A-117, A-118, A-119b and the real-provider run are no longer `latest` blockers; they ship as they land.
397
+
398
+ ## D50 (founder, relayed by autonomi-dev-dc at 02:45Z): the harness is the product; proof is the floor
399
+ 1. Finish only the in-flight proof work (A-117, A-118, A-119b, gaming matrix, verify --pubkey); move most engineers to the harness.
400
+ 2. North-star metric: model lift on our own eval (hidden tests, small and medium tiers): Loki+model vs raw `claude -p` same model, and Loki+cheap vs raw stronger. Targets: Loki+haiku >= raw sonnet completion at lower cost; Loki+sonnet >= raw opus at lower cost; Loki+X never below raw X, and at most 1.2x its time. Full matrix in METRICS.md, losses included; a slice that lowers lift is dropped.
401
+ 3. Harness items, one slice each: (1) intent contract; (2) context engine (symbol retrieval, real commands, ranked pack per model budget); (3) project memory in .loki/knowledge with decay; (4) cross-repo and user knowledge sources via .loki/config.yaml, read-only; (5) model-adaptive profiles in model_catalog.json, step routing, escalate only on a failing check; (6) speed (parallel context, cached prefix, trimming, impacted tests, harness overhead under 5s); (7) cost (cascade, caps, measured cost on every provider); (8) enterprise config (allowed models and endpoints, budgets, redaction, an audit log of model calls; no certification claims).
402
+ 4. Context and memory live in loki-ts/src/engine10/context/ with their own line budget set by the CTO; the 5000-line core cap (D33) stays.
403
+ 5. Order: multi-model baseline eval first, then items 1, 2, 3 and 6 in parallel, then 5 and 4 (8 with 4). Eval runs count against the usage governor.
404
+
405
+ ## D51 (founder, relayed by autonomi-dev-dc at 02:55Z): the product surface the harness powers
406
+ 1. Local: install, `loki` opens a browser UI; onboarding (provider, GitHub PAT stored 0600, repo); a backlog view with complete-selected or complete-all, each issue its own worktree, branch and PR with receipt and evidence; live status, BLOCKED questions answerable in the UI.
407
+ 2. Headless parity: `loki backlog owner/repo --all|--label|--issues`, one loki.yaml driving both UI and headless (provider and models, git auth env var, repos, concurrency, budgets, knowledge sources, notifications). Slack via autonomy/notify.sh on the v10 path.
408
+ 3. 10x defined: merge-ready PRs per hour of wall clock and per hour of human attention on a 20-issue backlog vs one raw Claude Code session; target 10x on both, from parallelism, zero babysitting and attached evidence. Measured and published.
409
+ 4. Reuse dashboard/, notify.sh, deploy/helm, docker-compose, terraform, playwright-verify.sh and issue-providers.sh; delete UI and endpoints that do not serve the flow. One UI, one config file, one engine.
410
+ 5. Phase A (today): first-run UI, backlog view, headless plus loki.yaml, Slack. Phase B: workspaces, cross-repo runs, combined integration testing with evidence. Phase C: one container image, Helm and ECS, org connect, audit log.
411
+
412
+ ## D39 amendment (founder, relayed 03:16Z): "Sprint, then pace"
413
+ 1. Full speed until the D48 deadline at 04:35Z.
414
+ 2. From 04:35Z the governor paces to about 0.48% of the weekly limit per hour (projected <= 75% used at the 2026-10-07T17:00Z reset), about 7 concurrent engineers at today's burn; the ceiling is recomputed hourly from new /usage readings (docs/v10/usage-readings.tsv; first reading 2026-10-01T03:14Z: window 11%, weekly 25%).
415
+ 3. Priority inside the paced budget: release flow, then D50 harness and lift eval, then D51 Phase A, then docs, then the remaining D48 polish.
416
+ 4. Builders run as cloud sessions first (the 250 USD cloud credit is used before plan usage).
417
+ 5. If the 5h window passes 80%, pause new work until it resets; never let a run die mid-release.
418
+
419
+ ## D52 (founder, relayed 03:25Z) and overnight mandate (03:40Z): least tokens, fastest release
420
+ 1. Target about 10x less plan usage per merged slice and per release, measured from `claude -p "/usage"`. Haiku for mechanical work, sonnet to build, opus only for moat or latest-moving reviews; `model:` set explicitly on every agent; small briefs with file paths; read line ranges, not whole files; agent returns of 10 lines or fewer; fresh agent per slice; the lead session hands off at about 120k context.
421
+ 2. Overnight until about 11:00Z: sprint to 04:35Z, then pace (D39 amendment). Priority: release flow, D48 rows plus the 04:35Z report, D51 Phase A ready to test (LOKI MORNING TEST in PROGRESS), D50 lift baseline then harness slices, docs, then D51 Phase B/C as budget allows. docs/v10/MORNING-BRIEF.md (60 lines or fewer) at 10:30Z, honest about what is not done.
@@ -20,3 +20,4 @@ this file; each item says what the loop does meanwhile.
20
20
  | 13 | 2026-09-30 | Repo `.claude/settings.json` hooks use relative paths (`bash autonomy/hooks/session-init.sh`, `validate-bash.sh`, `track-metrics.sh`, `store-episode.sh`, lines 9, 20, 31, 42), so they fail ("No such file or directory") whenever a session or agent's cwd is not the repo root (gate worktrees, /private/tmp train checkouts). validate-bash.sh is a PreToolUse guard, so it may silently not guard there. Proposed: `bash "$CLAUDE_PROJECT_DIR/autonomy/hooks/<name>.sh"`, exiting 0 quietly when the variable is unset. Raised by the steering session 22:50Z. | Claude Code configuration; agents may not edit it on a peer's request. | Leaves the file unchanged; hook errors continue outside the repo root. | RESOLVED 2026-10-01T00:30Z: Loki approved "fix the hooks"; slice-F13-hook-paths (65dc1411) merged on train/15. |
21
21
  | 14 | 2026-10-01 | Move the full-history `gitleaks --all` scan out of the Release path (to nightly plus every push to main, still blocking there), keeping a base-tag-to-tip range scan in Release. Relayed by the steering session as part of D46. | Weakens a release-blocking security gate; needs the founder directly, not a relay. | Release keeps the `--all` scan; E-156 removes the recurring false positive at the source. | SUPERSEDED 2026-10-01T00:30Z: Security Audit verdict reuse for VERSION-only bumps keeps the full --all scan scope (steering session 00:28Z); filed for the CI-health engineer. |
22
22
  | 15 | 2026-10-01 | Run the REAL-provider first-run gate on the published `next` build: `CLAUDE_CODE_OAUTH_TOKEN=<token from "claude setup-token"> bash scripts/first-run-gate.sh --real --installed loki-mode@10.5.13` (or ANTHROPIC_API_KEY). The swarm has no provider credential in its environment and does not read stored secrets; the gate's throwaway HOME cannot use the keychain login. Stub mode on the installed npm package runs meanwhile. | Credential only the founder holds. | The promote milestone (real gate pass on a `next` version) stays blocked; stub-mode evidence only. |
23
+ | 16 | 2026-10-01 | A Slack incoming-webhook URL for testing D51 item 4 (notify.sh on the v10 path: PR opened, BLOCKED, backlog finished). Provide it as an env var (for example `LOKI_SLACK_WEBHOOK_URL`) in the Release Manager session, never in a file or chat. | Needs a credential only the founder holds. | Until then notify.sh is tested against a local mock webhook; the real end-to-end check runs once the env var is set. | open |
@@ -1646,3 +1646,62 @@ The swarm is stopped: .loki/V10-STOP exists, the loop has no wake-ups, and the c
1646
1646
  - Release run success; `npm view loki-mode@10.5.14 version gitHead` = 10.5.14 / 2f4462b7; dist-tags next=10.5.14, latest=10.5.10 (unchanged); release body 17 lines.
1647
1647
  - D46 tally this hour: next releases 1 (10.5.14) vs target 3-6; trains cut 1 (train/17), red 1, dropped 0. Shortfall cause: the main-resident quiet-output flake (P0-t15 in rework).
1648
1648
  - OPUS_SHARE 33.7% vs 30%: no new opus seats until it drops; the open opus work is the A-117 r2 builder (resumed) only.
1649
+
1650
+ ## 2026-10-01T01:32Z train/18 cut
1651
+ - train/18 = 37267ebd (local main d5d679a4: A-119 merge c41a2b83 + docs, plus dist rebuild), pushed by SHA 01:34Z (`git ls-remote origin refs/heads/train/18` = 37267ebd). Tier B watcher armed.
1652
+ - P0-t15 round 2 at 54da8960 in sonnet re-review; train/19 = train/18 + P0-t15 when approved.
1653
+ - In review: A-130b (be50510f), A-134b (3bbec935). Building: A-117 r2, A-118, A-121b, A-119b (7edf4ae0 awaiting one clean full run).
1654
+ - Seats capped by worktrees 15/15 and load about 15-25; no new seats this tick.
1655
+
1656
+ ## 2026-10-01T01:41Z train/18 green, v10.5.15 cut, train/20 cut
1657
+ - train/18 37267ebd: Tests, Bun Parity, Coverage (baseline) all success (watcher b3l054ag3, 01:38:25Z). origin/main fast-forwarded 2f4462b7..37267ebd.
1658
+ - v10.5.15 release commit a7945d67 (parent 37267ebd == origin/main; `release.sh --check-clean` rc=0), pushed by SHA. Contents: A-119, A-115b. Watcher armed for Release run, npm version/gitHead, next == 10.5.15, latest unchanged (10.5.10).
1659
+ - train/19 89bf645b (P0-t15) is superseded for main because it lacks the release commit; train/20 c57eb914 = train/19 + main (release merge c908a37f), pushed 01:43Z, Tier B watcher armed.
1660
+ - D46 tally: trains cut 3 this hour (18, 19, 20), red 0 of the finished ones.
1661
+
1662
+ ## 2026-10-01T01:51Z trains 19/20 red on one lint line; train/21 carries the fix
1663
+ - train/19 89bf645b and train/20 c57eb914: Tests failed only in "ShellCheck Linting" (SC2088, a quoted "~/.loki/config" in tests/test-quick-config-safety.sh line 71, from P0-t15). The quiet-output 16-line failure did not recur (failparse on job 110179389806 lists only ShellCheck). Fixed forward on main 1be4bbe9 (run-shellcheck.sh rc=0); train/21 2ebfa3a1 = train/20 + fix + E-157, in Tier B.
1664
+ - v10.5.15 a7945d67: Release run queued at 01:48Z.
1665
+ - Reviews: E-157 r3 APPROVE (merged), A-130b APPROVE (merged), E-159 REJECT (rework), A-117 r2 REJECT (back-compat for old receipts; key-env tests), A-118/A-119b/A-134b r2 in review.
1666
+ - D46 tally this hour: next releases 1 confirmed (10.5.14) + 1 pending (10.5.15); trains cut 18/19/20/21, red 19 and 20 (one lint line), dropped 0. OPUS_SHARE 36% (HIGH reviews only); load about 25 of 28, no new seats.
1667
+
1668
+ ## 2026-10-01T02:01Z v10.5.15 published; train/21 dropped E-157; train/22 cut
1669
+ - v10.5.15: Release run success; npm 10.5.15 gitHead a7945d67 (matches); dist-tags next=10.5.15, latest=10.5.10 (unchanged); release body carries the full CHANGELOG section.
1670
+ - train/21 2ebfa3a1 red: Shell tests shard 1, tests/test-version-bump-only.sh 28/1 (S-132 normalizer parity). Cause E-157 (release.yml STEP 1 heredoc re-indented 10 to 12 spaces). D46 drop: E-157 merge reverted on local main 7d1a0f15 (test then 29/0), back to CI-health for r4.
1671
+ - train/22 dd9842c6 = train/20 + main (SC2088 fix, A-130b, E-157 revert); release.yml identical to train/20; test-version-bump-only 29/0 and shellcheck clean locally. Tier B watcher armed.
1672
+ - D46 tally (rolling hour): next releases 2 (10.5.14 01:19Z, 10.5.15 01:54Z); trains cut 5 (18-22), red 3 (19, 20 lint; 21 E-157), dropped 1 (E-157).
1673
+
1674
+ ## 2026-10-01T02:08Z train/22 green, v10.5.16 cut
1675
+ - train/22 dd9842c6: Tests, Bun Parity, Coverage (baseline) all success (02:07:32Z). origin/main fast-forwarded a7945d67..dd9842c6 (the v10.5.15 Release run had completed success).
1676
+ - v10.5.16 release commit f522c12f (parent dd9842c6 == origin/main; --check-clean rc=0), pushed by SHA. Contents: P0-t15 (quiet quick stderr noise, sentinel-only config fold, guarded SIGPIPE re-exec), A-130b (Reason line redaction). E-157 net zero (reverted). Watcher armed; latest must stay 10.5.10.
1677
+
1678
+ ## 2026-10-01T02:25Z train/23 red, A-134b dropped
1679
+ - train/23 de366303 (A-134b): Tests red in 3 shards, all from A-134b's new tests/test-quick-quiet-tail.sh: registered in no runner (D44 guard, shard 1; D44-C structural, shard 6), and an unescalated `timeout 150` at line 53 (E-00 guard, shard 7). Bun Parity and Coverage success.
1680
+ - D46 drop: A-134b merge reverted on local main 3924bc3f; local main now has no code diff from origin/main (`git diff --stat origin/main main -- . ':!docs'` empty), so no replacement train. A-134b back to its builder (register plus shard row, timeout -k).
1681
+ - Process miss (mine): I merged A-134b on the reviewer's conditional approval without the repo-wide test-file guards. New rule in memory: any slice adding tests/*.sh runs the registration, E-00 and shellcheck guards before merge.
1682
+ - v10.5.16 Release run still in progress at 02:23Z. D46 hour 02:00Z: 0 confirmed so far (10.5.16 pending), trains cut 22 and 23, red 1 (23), dropped A-134b.
1683
+
1684
+ ## 2026-10-01T02:45Z D49: 10.5.16 promoted to latest
1685
+ - Founder confirmed D49 and the D48 engine flip directly in this session (02:42Z). First-run gate stub on the npm-installed 10.5.16: 0 assertions failed, wall 34s (scripts/first-run-gate.sh --installed loki-mode@10.5.16). promote.yml run 36807172046: completed success. npm dist-tags now {"latest":"10.5.16","next":"10.5.16"} (was latest 10.5.10).
1686
+ - Slices pushed to origin for slice CI during review: slice-A-117, slice-A-121b(-r2), slice-A-118, slice-A-134b-r4, slice-E-157-r4, slice-E-159-r2.
1687
+ - Reviews in flight (opus, HIGH): A-117 r3, A-118 r2, A-121b r2, E-157 r4 + E-159 r2. D48 wave 1 building (sonnet): gaming matrix (row 1), portable verify (row 2), doctor --fix (row 6), loki-seal marketplace (row 10).
1688
+
1689
+ ## 2026-10-01T02:47Z INCIDENT: main checkout detached by a reviewer (restored)
1690
+ - The E-157/E-159 opus reviewer ran a 7-tag `git checkout --detach` loop with a `.gitleaksignore` overwrite in the shared main checkout (reflog 02:46:04Z to 02:46:38Z): a failed `cd` into a new clone left its cwd in the main checkout. It stopped on request; nothing left running (its report). Restored: `git checkout main` gives main at fafe50dd, `git status --porcelain` shows only the pre-existing untracked .git-pulse-fix.patch; PROGRESS.md 1687 and BOARD.md 652 lines intact. Guard slice E-161. During the window the pulse misread BOARD and PROGRESS from the old tree.
1691
+
1692
+ ## 2026-10-01T03:01Z "faster" levers (founder via peer, 03:05Z)
1693
+ - Baseline (before): median opus review about 20-23 min (A-121b r1 22m46s, A-117 r3 about 39 min under load); slice CI is the full 8-shard Tests (about 12-15 min, runner-queued); train cadence: 22 to 24 cut 02:00Z-02:51Z; releases in the 02:00Z hour: 1 (10.5.16), plus a promotion to latest.
1694
+ - Applied now: (1) opus reviews only for moat, latest-moving and signing slices; sonnet, 10-min cap, for the rest; slices under 150 changed lines. (3) New builders launch as remote (cloud) agents, so local load is reviewers, gate and Release Captain only. (4) A train is cut on any green reviewed slice, every 10-15 min, even while the previous train is in CI.
1695
+ - (2) Slice CI tier-down is BOARD E-162, sequenced after E-157 r4 because both edit test.yml.
1696
+ - After-numbers go in the 03:35Z entry.
1697
+
1698
+ ## 2026-10-01T03:08Z usage governor calibrated; pacing decided; A-118 r3
1699
+ - First usage reading in docs/v10/usage-readings.tsv: 2026-10-01T03:14:00Z, window 11%, weekly 25%. Founder pacing (D39 amendment): sprint to 04:35Z, then about 0.48%/h (about 7 engineers).
1700
+ - A-118 r2 opus REJECT (4 blockers: multi-line pyproject addopts and unittest @skip bypasses; pagination `{ skip: n }` and new shared config files falsely accused); r3 with the builder.
1701
+ - Pushed for slice CI: slice-D51-A3 14ff9ae2 (backlog plus loki.yaml), slice-D51-A4 adb838b2 (Slack on v10). slice-D51-A12 and slice-D48-r6 were blocked by pre-push gitleaks on synthetic strings; a fix agent is moving both to source-level fixes.
1702
+
1703
+ ## 2026-10-01T03:25Z LEAD HANDOFF STATE (read this first on resume)
1704
+ - npm: latest=next=10.5.16 (f522c12f). origin/main=f522c12f. Release worktree: scratchpad/rel-1056; train worktree: scratchpad/t14.
1705
+ - Trains: train/24 1f3c9da1 RED (E-142 board sweep: E-161 row had a `||`, fixed in 7cfd7399); train/25 b1d2ecbd superseded (same row); train/26 6d288543 = local main d449a419+ (A-117, E-157 r4, E-159 r2, D49-auto, D51-A3, D51-A4, D48-r10, D48-r6, board fix) in CI. When green: ff origin/main to 6d288543, cut 10.5.17; D49-auto then auto-promotes later releases.
1706
+ - In review: A-118 r3 b48adeacc (opus). Rework (fresh agents): A-121b r3 (sys.path guard), A-119b r3 (diff-line asserts, scoped exclude), D51-A12 r2 (Host allowlist vs DNS rebinding). Built, unreviewed or unpushed: D48-r1 gaming matrix de71397dd (needs a CTO call on the pre-red case and a duration row), D48-r2 b073d50a (opus review pending), E-162 6b9738fdc (pushed; sonnet review pending), E-163 678f2162e (unpushed; sonnet review pending). Building: D48-flip, D50 baseline eval, DOC-01, DOC-02.
1707
+ - Rules: slice pushes go from the main checkout only (the agent pre-push guard blocks agents); cancel queued slice CI for merged slices; any slice adding tests/*.sh runs the registration, E-00, shard-coverage and shellcheck guards before merge; no `|` or `||` inside BOARD cells.