loki-mode 9.78.0 → 9.81.0

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 (78) hide show
  1. package/README.md +19 -0
  2. package/SKILL.md +2 -2
  3. package/VERSION +1 -1
  4. package/autonomy/lib/engine10-legacy-notice.txt +3 -0
  5. package/autonomy/lib/engine10-push-gitlab.sh +96 -0
  6. package/autonomy/lib/engine10-push.sh +67 -2
  7. package/dashboard/__init__.py +1 -1
  8. package/docs/INSTALLATION.md +1 -1
  9. package/docs/dev/tmp-cleanup.md +3 -3
  10. package/docs/v10/BOARD.md +101 -47
  11. package/docs/v10/DECISIONS.md +18 -0
  12. package/docs/v10/ENGINE.md +267 -735
  13. package/docs/v10/GUARDS.md +81 -0
  14. package/docs/v10/GUIDE.md +154 -0
  15. package/docs/v10/METRICS.md +26 -0
  16. package/docs/v10/PROGRESS.md +41 -0
  17. package/loki-ts/dist/loki.js +711 -623
  18. package/loki-ts/package.json +1 -1
  19. package/mcp/__init__.py +1 -1
  20. package/package.json +1 -1
  21. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  22. package/web-app/dist/assets/{AdminPage-CSy7GfXm.js → AdminPage-BsKDNH7g.js} +1 -1
  23. package/web-app/dist/assets/{Avatar-FuCbZv5L.js → Avatar-eQ64Y3hv.js} +1 -1
  24. package/web-app/dist/assets/{Badge-Do6fV7hN.js → Badge-b82yzJcN.js} +1 -1
  25. package/web-app/dist/assets/{Button-B9NZXMf8.js → Button-Bd9FSMso.js} +1 -1
  26. package/web-app/dist/assets/{CockpitPage-VXxvKnKW.js → CockpitPage-DjnDt5xn.js} +1 -1
  27. package/web-app/dist/assets/{ComparePage-OmqxCaK7.js → ComparePage-D2gfvgOy.js} +1 -1
  28. package/web-app/dist/assets/{ErrorBoundary-BYCkDeu8.js → ErrorBoundary-BUHNHWWu.js} +1 -1
  29. package/web-app/dist/assets/{EvidenceReceiptPanel-KesRGf-7.js → EvidenceReceiptPanel-D1I4Ttbh.js} +1 -1
  30. package/web-app/dist/assets/{GitHubIssuesPanel-fEnpFg8B.js → GitHubIssuesPanel-DwVEFUMV.js} +1 -1
  31. package/web-app/dist/assets/{GitHubPRsPanel-DGGod_Y0.js → GitHubPRsPanel-ConSaimn.js} +1 -1
  32. package/web-app/dist/assets/{HomePage-EeWPhwob.js → HomePage-CKE8CosL.js} +2 -2
  33. package/web-app/dist/assets/{LoginPage-BPHKgT1f.js → LoginPage-D8axj5IL.js} +1 -1
  34. package/web-app/dist/assets/{MagicPage-CO0MTvpr.js → MagicPage-aD3MFjIp.js} +1 -1
  35. package/web-app/dist/assets/{MetricsPage-eYpHWxnI.js → MetricsPage-BdZxBPG9.js} +1 -1
  36. package/web-app/dist/assets/{NotFoundPage-Cd409HEe.js → NotFoundPage-TDGVwyxo.js} +1 -1
  37. package/web-app/dist/assets/{ProjectPage-hcAZ_hrX.js → ProjectPage-CUx32MoW.js} +3 -3
  38. package/web-app/dist/assets/{ProjectsPage-DH04B2fr.js → ProjectsPage-CHFOim84.js} +1 -1
  39. package/web-app/dist/assets/{SettingsPage-Csur-yom.js → SettingsPage-BM4FDVIk.js} +1 -1
  40. package/web-app/dist/assets/{ShowcasePage-B5AIrDXd.js → ShowcasePage-nki5E019.js} +1 -1
  41. package/web-app/dist/assets/{SystemSettingsPage-DA6Bn7er.js → SystemSettingsPage-B40QOcn3.js} +1 -1
  42. package/web-app/dist/assets/{TeamsPage-KcBbM7_z.js → TeamsPage-CKsaamvM.js} +1 -1
  43. package/web-app/dist/assets/{TemplatesPage-BgLOizbo.js → TemplatesPage-D3dEJ11t.js} +1 -1
  44. package/web-app/dist/assets/{TerminalOutput-CX-gh76o.js → TerminalOutput-DCL5jtSd.js} +1 -1
  45. package/web-app/dist/assets/{activity-6UlD-ytF.js → activity-D-IlrNbY.js} +1 -1
  46. package/web-app/dist/assets/{bell-CFARmHF4.js → bell-m1luNYs4.js} +1 -1
  47. package/web-app/dist/assets/{bot-M-HZlOa2.js → bot-Cl1HRT_0.js} +1 -1
  48. package/web-app/dist/assets/{check-9GtMUwM3.js → check-3lLURBsJ.js} +1 -1
  49. package/web-app/dist/assets/{chevron-left-CPV_nwtP.js → chevron-left-D02P_bEW.js} +1 -1
  50. package/web-app/dist/assets/{circle-alert-UahP_eMY.js → circle-alert-ZCI8JfmJ.js} +1 -1
  51. package/web-app/dist/assets/{clock-CcCc97td.js → clock-D3VuRQUy.js} +1 -1
  52. package/web-app/dist/assets/{cloud-CviPksVP.js → cloud-D0bikLQP.js} +1 -1
  53. package/web-app/dist/assets/{code-xml-gGDp7nvj.js → code-xml-tqtfp834.js} +1 -1
  54. package/web-app/dist/assets/{database-BlHnMksz.js → database-C2bSuVEi.js} +1 -1
  55. package/web-app/dist/assets/{dollar-sign-CqZfNw7q.js → dollar-sign-Dp8f9cxy.js} +1 -1
  56. package/web-app/dist/assets/{file-code-corner-ChtMYoeA.js → file-code-corner-CNsBLnGJ.js} +1 -1
  57. package/web-app/dist/assets/{file-plus-C3l1fGp_.js → file-plus-D5gsIm0p.js} +1 -1
  58. package/web-app/dist/assets/{globe-BM4RYvi9.js → globe-C5wH6C2_.js} +1 -1
  59. package/web-app/dist/assets/{hammer-C8xvsZCy.js → hammer-BbgvMFD3.js} +1 -1
  60. package/web-app/dist/assets/{index-BsB5DTpP.js → index-C-AhysBW.js} +2 -2
  61. package/web-app/dist/assets/{layers-WUsuQnfe.js → layers-Cy9T0QFp.js} +1 -1
  62. package/web-app/dist/assets/{loader-circle-CWZhBNSa.js → loader-circle-Bxmwkkrf.js} +1 -1
  63. package/web-app/dist/assets/{lock-bbfx9k11.js → lock-C8DRY3rX.js} +1 -1
  64. package/web-app/dist/assets/{package-CDfsTKO6.js → package-0ny9RvN9.js} +1 -1
  65. package/web-app/dist/assets/{plus-DEm39Klm.js → plus-B7Dhrqtb.js} +1 -1
  66. package/web-app/dist/assets/{refresh-cw-DJZcHBKa.js → refresh-cw-CkQrR-L1.js} +1 -1
  67. package/web-app/dist/assets/{rotate-ccw-BcngFsiU.js → rotate-ccw-du8wLFBD.js} +1 -1
  68. package/web-app/dist/assets/{scroll-text-CYSjVzWv.js → scroll-text-lC55WYYu.js} +1 -1
  69. package/web-app/dist/assets/{server-CkMcbRF7.js → server-DWbmrgQz.js} +1 -1
  70. package/web-app/dist/assets/{shield-alert-D6ZsDRLA.js → shield-alert-D7HIrslo.js} +1 -1
  71. package/web-app/dist/assets/{thumbs-up-Ce0QhF9c.js → thumbs-up-CXHDiQ_F.js} +1 -1
  72. package/web-app/dist/assets/{trash-2-OojrLB2z.js → trash-2-WYDISyed.js} +1 -1
  73. package/web-app/dist/assets/{trending-down-3Bu2DcUr.js → trending-down-iUK45Jk7.js} +1 -1
  74. package/web-app/dist/assets/{trending-up-BUkmDOK8.js → trending-up-Ca_zIVLF.js} +1 -1
  75. package/web-app/dist/assets/{upload-BgR13l74.js → upload-DWDtE29t.js} +1 -1
  76. package/web-app/dist/assets/{usePolling-DwQTkEQG.js → usePolling-DqMVwR9D.js} +1 -1
  77. package/web-app/dist/assets/{user-DZcP5JBh.js → user-Bgt0jZl5.js} +1 -1
  78. package/web-app/dist/index.html +1 -1
@@ -450,3 +450,84 @@ previously mismarked two merged guards (S-16, S-74) as PENDING.
450
450
  (S-139) asserts the VIOLATION fires for a `released@` row stamped after
451
451
  npm's newest publish; T39b asserts it stays silent for a row stamped
452
452
  before it.
453
+
454
+ ## 14. Eval harness orphans survived the arm's process-group KILL (EV-10)
455
+
456
+ - **Incident:** 00:08Z, pulse ORPHAN_WORKTREE flagged 6 orphaned processes
457
+ left running after `eval/loki10/harness.py` runs against the legacy arm;
458
+ all 6 were stopped by PID once found. Each was a detached
459
+ `/tmp/loki-run-*.sh` loop legacy loki spawns via `setsid`, which had
460
+ reparented to launchd (ppid 1) once the arm process it came from exited.
461
+ - **Root cause with evidence:** `kill_orphans()` only ever did
462
+ `os.killpg(timeout_pid, SIGKILL)` -- correct for anything still in the
463
+ `timeout` process group the arm ran under, but a `setsid`'d child
464
+ deliberately leaves that group and gets its own pgid, so the group KILL
465
+ can never reach it once the escape has completed. Reproduced locally: a
466
+ script that setsid-spawns a sleeper, confirms (by polling its pgid) that
467
+ the escape finished, then exits still leaves the sleeper running after
468
+ `capped_run()` returns and `kill_orphans()` has already run.
469
+ - **The guard:** `kill_orphans()` now also reaps by two signals that are
470
+ never a process name or pattern: any PID recorded in a `*.pid` file under
471
+ the run's own clone (`<work>/.loki/**/*.pid`, one per line, never through
472
+ a symlinked `.loki/` or a non-regular/oversized file), and any process
473
+ anywhere on the box whose cwd (`/proc/<pid>/cwd` where present, else one
474
+ system-wide `lsof -a -d cwd -Fpn` call, resolved with `os.path.realpath`)
475
+ is that same clone directory or a path inside it. Both are scoped to
476
+ `cwd`, the exact per-run clone `capped_run()` was given. Every candidate
477
+ PID is vetted by `_pid_is_ours()` before it ever reaches `os.kill`: never
478
+ `<= 1` (kill(2) treats -1/0 as "every process the caller may signal," not
479
+ a single-PID cleanup), never this process or its parent, and never older
480
+ than the run's own start (a stale or forged `.pid` entry naming an
481
+ unrelated, longer-lived process is left alone).
482
+ - **The test that proves it fires:** `eval/loki10/test-harness.sh`, EV-10.
483
+ Leg Rj: the `setsidorphan` stub-arm mode setsid-spawns a sleeper in its
484
+ own clone, polls until the sleeper's pgid equals its own pid and only
485
+ then records an "escaped" marker (ruling out a vacuous pass from a spawn
486
+ that never actually left the group), then exits; the leg asserts the
487
+ marker is present and the sleeper is dead once the harness run returns.
488
+ Leg Rk: the same escape, chdir'd out of the clone first so the cwd path
489
+ cannot see it, reaped instead from its own PID in a `.loki/*.pid` file; a
490
+ decoy PID that predates the run, planted in the same file (plus a literal
491
+ `-1`), is asserted to survive. Leg Rl exercises `_clone_orphan_pids`
492
+ directly to assert `-1`/`0`/`1` and a pre-run PID are filtered before any
493
+ kill is attempted, without ever risking a live `kill(-1, SIGKILL)`.
494
+ Mutation-tested: disabling the cwd path fails only Rj, disabling the
495
+ pidfile path fails only Rk, and bypassing `_pid_is_ours` (checked offline
496
+ against a throwaway copy of the module, never run against a live process)
497
+ lets `-1` through, which Rl's assertion catches.
498
+ ## 15. Two releases pushed with unbaselined secret-shaped fixtures never reached npm (E-60)
499
+
500
+ - **Incident:** Security Audit (the `secret-scan` job in
501
+ `.github/workflows/security-audit.yml`, a required-ci gate) failed on the
502
+ release SHAs for v9.79.0 (`9dc0b1d3`, 2026-09-27) and v9.80.0 (`085306ae`,
503
+ same day). Both pushes landed on main, but `publish-npm` never ran because
504
+ the required Security Audit conclusion was red, so npm latest stayed at
505
+ 9.78.0 through both releases -- 00:45Z is when the fix (`5190756f`) landed
506
+ and unblocked v9.80.1.
507
+ - **Root cause with evidence:** `5190756f`'s own commit message names the
508
+ findings exactly: "a planted AWS-shaped string for the deep-verify
509
+ secret-scan test and two CANARY/WITHHELD token canaries." Three new Loki 10
510
+ test fixtures were secret-shaped (matched gitleaks' built-in rules) and
511
+ landed on main across the two releases without a matching
512
+ `.gitleaksignore` entry, so gitleaks' full-history scan in CI reported
513
+ three new, unreviewed findings and blocked exactly as designed -- the gate
514
+ worked; nothing local had run the same scan before push to catch it there
515
+ instead of at CI, so two releases went out DOA on the fastest-available
516
+ feedback channel (CI, not a local gate).
517
+ - **The guard:** E-60 adds a fast-tier gitleaks step to `scripts/local-ci.sh`
518
+ (`_FAST_KEEP` entry `"gitleaks (secrets, origin/main..HEAD)"`): when a
519
+ `gitleaks` binary is on PATH, every pre-push run scans just the commits the
520
+ branch adds on top of `origin/main` against the same reviewed
521
+ `.gitleaksignore` baseline CI uses, so an unbaselined secret-shaped fixture
522
+ is caught before push, not after a release SHA is already tagged. Fails
523
+ closed the other way too: an absent binary prints an explicit SKIP line
524
+ (never a silent PASS), matching this file's shellcheck-absent posture.
525
+ - **The test that proves it fires:** `tests/test-local-ci-gitleaks.sh`
526
+ (registered in `tests/run-all-tests.sh` and `tests/shard-durations.tsv`).
527
+ Static assertions confirm the skip-not-pass path, the `.gitleaksignore`
528
+ baseline, the `origin/main..HEAD` scope, and `_FAST_KEEP` membership; when
529
+ a gitleaks binary is present, two live temp-repo scenarios drive the exact
530
+ command shape `scripts/local-ci.sh` runs: a commit adding a literal
531
+ AKIA-shaped token fails the step, and a commit adding the identical
532
+ characters via source-level concatenation (never contiguous in the
533
+ committed bytes) passes it.
@@ -0,0 +1,154 @@
1
+ # Loki 10 engine guide
2
+
3
+ Opt-in: set LOKI_ENGINE=v10 <!-- loki10-default -->
4
+
5
+ Loki 10 is the rewritten engine (docs/v10/ENGINE.md). It is not the default
6
+ yet. Every command below only runs when LOKI_ENGINE=v10 is set; leave it
7
+ unset and `loki` keeps using the current (legacy) engine exactly as before.
8
+
9
+ Some pieces named in this guide are still being built. Each one below says
10
+ so plainly instead of describing a finished feature.
11
+
12
+ ## Quickstart
13
+
14
+ Put the task first, as a quoted multi-word string, so bin/loki's router
15
+ sends it to the v10 engine instead of the legacy one. A one-word argument
16
+ that is not an issue ref, or any first argument starting with `-`, stays
17
+ on the legacy engine.
18
+
19
+ ```
20
+ LOKI_ENGINE=v10 loki "fix the login redirect loop" --no-pr
21
+ ```
22
+
23
+ Issue refs work the same way:
24
+
25
+ ```
26
+ LOKI_ENGINE=v10 loki owner/repo#123
27
+ LOKI_ENGINE=v10 loki https://github.com/owner/repo/issues/123
28
+ ```
29
+
30
+ bin/loki routes GitHub, GitLab (`.../-/issues/N`) and Jira
31
+ (`.../browse/KEY`) issue URLs to the v10 engine, and the issue-fetch step
32
+ (autonomy/issue-providers.sh) fetches title/body/labels from all three.
33
+ Only the extra already-done check (an issue's `state` and whether it was
34
+ closed by a merged PR) is GitHub-only; a GitLab or Jira issue still runs,
35
+ just without that extra signal.
36
+
37
+ Flags, from the engine's own `--help`:
38
+
39
+ - `--no-pr`: build and verify, but skip opening a pull request.
40
+ - `--deep`: request the deep verify pass; the implement time budget goes
41
+ from 480s to 1800s (`loki-ts/src/engine10/types.ts`).
42
+ - `--provider <name>`: pick the coding provider for this run. See the
43
+ provider table below.
44
+ - `--resume <run-id>`: continue a run that was interrupted.
45
+
46
+ `--no-pr`, `--deep` and `--provider` are parsed by the supervisor
47
+ (`loki-ts/src/engine10/supervisor.ts`) and take effect on a real run.
48
+ `--resume` is not wired yet: passing it prints `engine10: --resume is not
49
+ wired yet` and exits 2. Its shape is documented here because it is already
50
+ fixed in `--help`.
51
+
52
+ `loki status`, `loki verify` and `loki dashboard` are all built on main
53
+ (status.ts, verify_cmd.ts, dashboard/server.ts) and route through cli.ts's
54
+ table like any other subcommand.
55
+
56
+ The free-text and issue-ref run itself (the supervisor that plans, builds
57
+ and verifies) is wired into the CLI on main: `loki "<task>"` and `loki
58
+ <issue-ref>` run the full worker flow (intake, plan, wall, implement,
59
+ verify, seal) and then, in the supervisor, the pr stage, ending in the
60
+ 5-line summary below.
61
+
62
+ Slack is not part of the v10 engine surface (no command, no notification
63
+ hook) and is in progress, tracked with the other wave 3 items.
64
+
65
+ ## The 5-line summary
66
+
67
+ A finished run prints five lines, one label each:
68
+
69
+ ```
70
+ PR: https://github.com/owner/repo/pull/1
71
+ Verdict: VERIFIED
72
+ NOT PROVEN: full suite, app boot, council, security scan
73
+ Cost: $0.42 (claude, 212k tokens)
74
+ Time: 4m12s (intake 11s, plan 20s, implement 3m10s, verify 31s)
75
+ ```
76
+
77
+ - **PR**: the opened pull request URL, or `none` when the run used
78
+ `--no-pr` or never got that far. A draft PR adds the draft reason in
79
+ parentheses.
80
+ - **Verdict**: one of VERIFIED, PARTIAL, ALREADY_SATISFIED, SPEC_CONFLICT or
81
+ FAILED.
82
+ - **NOT PROVEN**: everything the run did not check, comma-joined. Never
83
+ empty by omission: a check that was skipped or deferred is always listed
84
+ here, not silently dropped. A flaky test found during verify appears as a
85
+ separate `; flaky ...` clause on the same line.
86
+ - **Cost**: the provider-reported dollar figure and token count. When the
87
+ provider does not report cost, this line reads `not measured` instead of
88
+ `$0.00`; a missing cost is never rendered as free.
89
+ - **Time**: total wall time, then each stage's own duration in parentheses.
90
+
91
+ This formatter (`loki-ts/src/engine10/output.ts`, `formatSummary`) is
92
+ called by the supervisor at the end of every run, so a real `loki "<task>"`
93
+ or `loki <issue-ref>` run prints this block on completion. The block above
94
+ is that function's real output, not a mockup.
95
+
96
+ ## NOT PROVEN
97
+
98
+ NOT PROVEN lists what a run did not verify, so a passing run is never read
99
+ as more thorough than it was. One entry is unconditional, written by Seal
100
+ every time:
101
+
102
+ - **The deep checks**: `full suite, app boot, council, security scan`.
103
+ They are deferred to a separate deep-verify pass, so Seal always lists
104
+ all four at seal time.
105
+
106
+ Seal also adds an entry whenever it applies, for example: `cost not
107
+ measured (no iteration ids recorded)`, `kill blocking not enforced` for
108
+ any provider other than claude, `worker killed by the supervisor backstop
109
+ (cap plus grace)`, `event log modified outside the engine`, a flaky test,
110
+ a reverted test edit, a model override a non-claude provider could not
111
+ honor, a task source the intake step did not record, an uncomputable
112
+ diff, an individual check that did not run, or a failed receipt signature.
113
+ The Cost line above separately reads `not measured` (never `$0.00`)
114
+ whenever the provider reported no dollar figure.
115
+
116
+ ## Receipts
117
+
118
+ A run writes `.loki/runs/<run-id>/receipt.json` and a matching
119
+ `receipt.md`. The JSON receipt's `receipt_sha256` hashes the canonical JSON
120
+ without the `verification` block, so verifying a receipt never has to trust
121
+ its own signature field to compute the hash it is checking.
122
+
123
+ `loki verify [run-id]` re-hashes the receipt and checks its signature. A
124
+ receipt with no signing key configured (or a key that failed to load) reads
125
+ `UNSIGNED` and is never presented as attested; a signed receipt reads
126
+ `SIGNED (kid ...)`.
127
+
128
+ ## Provider table
129
+
130
+ | Provider | Cost measured | Kill blocking enforced |
131
+ |----------|----------------|--------------------------|
132
+ | claude | yes | yes |
133
+ | codex | no | no |
134
+ | cline | no | no |
135
+ | aider | no | no |
136
+ | opencode | not supported | n/a |
137
+
138
+ For codex, cline and aider, a run's Cost line reads `not measured` and the
139
+ NOT PROVEN line adds the literal entry `kill blocking not enforced`
140
+ (`loki-ts/src/engine10/stages/seal.ts`). opencode is not one of engine10's
141
+ provider names (`claude`, `codex`, `cline`, `aider`); it is not supported.
142
+
143
+ ## After the flip
144
+
145
+ Once v10 becomes the default (docs/v10/DECISIONS.md, D29), `loki`, `loki
146
+ status`, `loki verify` and `loki dashboard` with no `LOKI_ENGINE` set will
147
+ mean the v10 commands described above. The previous engine stays fully
148
+ reachable: `loki legacy <args>` and `LOKI_ENGINE=legacy` both route to it,
149
+ unchanged. Nothing is removed at the flip.
150
+
151
+ That flip has not happened on main as of this guide. The opt-in line near
152
+ the top of this file and of README.md's section is the one place that
153
+ records which state we are in; it changes in the same commit as the flip
154
+ itself.
@@ -217,3 +217,29 @@ remains the only cap on this step. Guarded by
217
217
  ## Over-budget stops
218
218
 
219
219
  - 2026-09-27T21:33Z: batch 8 workflow wf_ff8d537c-40e stopped. Its last two reviewers (S-191, S-195) ran about 55 minutes against the 30-minute reviewer budget with no verdict (pulse AGENT_OVER_BUDGET at 21:31Z: "S-191 building MEDIUM (55.9 min, budget 30 min)"). Re-dispatched as two standalone reviewers with 20 and 25 minute scopes. Load average was 15 to 17 during the stall.
220
+
221
+ ## Loki 10 eval: first real arm numbers (2026-09-27, smoke, not the gate)
222
+
223
+ Raw `claude -p` arm (EV-4), model claude-opus-5-5, 900s cap, 3 public tasks, harness from the EV-1 branch with EV-3 isolation (auth via keychain access token; no credential in any result file):
224
+
225
+ | task | completed | time to PR | cost (provider-reported) |
226
+ |---|---|---|---|
227
+ | pub-more-itertools-1192 | yes | 20s | $0.1266 |
228
+ | pub-click-2877 | yes | 34s | $0.1861 |
229
+ | pub-humanize-152 | yes | 45s | $0.2704 |
230
+
231
+ `summarize --markdown`: 3/3 completed, p50 34s, p90 45s, $0.1944 per completed task, 0 capped. This is a 3-task smoke, not the 29-task gate. It sets the bar the v10 fast lane must meet on completion and cost per completed task (D29), which is far tighter than the 5-minute p50 target.
232
+
233
+ ## Loki 10 eval: raw claude -p arm, full 29 tasks (2026-09-27 23:05-23:16Z)
234
+
235
+ Model claude-opus-5-5, harness 84c22568, 900s cap, --parallel 3, EV-3 isolation. Results: ~/loki-ci-logs/eval-raw-claude-20260927T231653Z/.
236
+
237
+ | Arm | Completed | Rate | p50 time to PR | p90 time to PR | Cost per completed | Cost measured | Capped |
238
+ |---|---|---|---|---|---|---|---|
239
+ | raw-claude | 27/29 | 93.1% | 39s | 68s | $0.2363 | 29/29 | 0 |
240
+
241
+ Misses: pub-click-3059 (hidden tests failed: wrong metavar bracketing), pub-humanize-174 (hidden tests failed: rounding boundary cases). Total provider-reported spend $6.38.
242
+
243
+ ## Loki 10 engine: first real run (E-14 smoke, not the gate)
244
+
245
+ pub-more-itertools-1192 through the E-14 glue entry, real claude, --no-pr: 30s wall (intake 0s, plan 16s, implement 12s, verify 3s, commit and seal under 1s), hidden test passes, $0.4486 over 2 sessions (plan $0.2264, implement $0.2223), verdict PARTIAL only because ruff is not installed. Raw claude on the same task: 15s, $0.1290. The planner session costs as much as the implement session.
@@ -1248,3 +1248,44 @@ sample.
1248
1248
  - Eval numbers so far: none (no arm has run yet).
1249
1249
  - ETA for v10.0.0: thin path end to end targeted for about 01:00 UTC; gate decision at 03:00 UTC.
1250
1250
  - Top blocker: E-01 (shared types) gates phase B; augmentiq has only 3 issues, so the augmentiq share of the eval is 1 task, not 5.
1251
+
1252
+ ## 2026-09-27T22:57Z: Loki 10 engine progress
1253
+ - On main (`git ls-remote origin refs/heads/main` = 694866fc): engine wave 1 E-01..E-13 except E-14, plus E-11 (both halves), E-16, E-20; the eval harness EV-1 with EV-3 isolation and the 29 EV-2 tasks (EV-7 nonce fixes). tests/engine10 plus spawn guard 185 pass, 0 fail; eval/loki10/test-harness.sh 77 passed.
1254
+ - Eval baseline: a no-op arm over all 29 tasks graded every task not completed, none task_invalid (108s). No real arm numbers yet: EV-4 (raw claude -p, 3 tasks) and EV-5 (legacy, 1 task) are running.
1255
+ - In flight: E-14 end to end plus the first real v10 run on pub-more-itertools-1192; reworks E-15, E-17, E-18, E-21, E-22; E-19, E-23, E-TG.
1256
+ - Incidents fixed forward: two orphan loki test runs over 24 hours (stopped by PID; E-00 guard merged); main CI red on Coverage from engine spawns without env (72423684, 19128f6b).
1257
+ - ETA for v10.0.0: first real v10 task within the next hour; gate decision at 03:00 UTC.
1258
+ - Top blocker: E-14 integration (first time the modules run together).
1259
+
1260
+ ## 2026-09-27T23:03Z: first real eval numbers
1261
+ - Raw claude -p arm, 3 public tasks: 3/3 completed, p50 34s, p90 45s, $0.1944 per completed task (docs/v10/METRICS.md). Legacy arm and v10 arm not yet measured.
1262
+ - Implication for the gate: v10 must match raw completion and cost per completed task. Any extra model call (planner, Wall author, fix round) adds cost against a $0.19 baseline, so the fast lane must skip stages a small task does not need.
1263
+
1264
+ ## 2026-09-27T23:27Z: Loki 10 progress
1265
+ - Raw claude -p full arm: 27/29 (93.1%), p50 39s, p90 68s, $0.2363 per completed task (docs/v10/METRICS.md).
1266
+ - v10 first real task (E-14 glue entry, commit 9d9ff7d2): fixed in 30s, hidden test result "1 passed, exit 0", $0.45 (plan $0.23 plus implement $0.22; `cost-summary.py --json` fully_measured true) against raw $0.13 on the same task.
1267
+ - On main (`git ls-remote origin refs/heads/main` = 44731e0f): every engine slice except E-14's glue, plus E-41 local-origin push; v9.79.0 tagged 23:12:55.
1268
+ - In flight: E-42 (real entry end to end, Rule of Two for the pr stage, harness v10 arm on one task), E-43 cost knobs, E-44 output fixes, E-33..E-35, EV-5 legacy full arm.
1269
+ - ETA: first harness-scored v10 task by about 00:15Z; full v10 arm by about 01:30Z; gate decision 03:00Z.
1270
+ - Top blocker: cost. Plan plus implement is about 2x raw per task on this sample; the gate requires v10 cost per completed task at or below raw ($0.2363).
1271
+
1272
+ ## 2026-09-28T00:11Z: Loki 10 progress
1273
+ - On main (`git ls-remote origin refs/heads/main` = addda547): E-42 real entry end to end (run.ts glue deleted), E-44 output fixes, agent SDK 0.3.283 (9db2a4ed), E-51 eval PR path regression, and train E12 (23b20e6f): E-33 gate report, EV-6 publish script, E-38 legacy arm pin, E-39 interrupt/resume, E-40 live PR smoke. Train checks: engine10 349 pass 0 fail, tsc exit 0, test-harness 79/0, test-gate-report 34/0.
1274
+ - SDK route: claude-opus-5-5 now runs through the SDK (probe: `success OK`); 0.3.267 rejected it. The same probe cost $0.33 for a one-word reply, so fixed per-call overhead, not task work, drives v10 cost.
1275
+ - Legacy arm (EV-5): 3 results so far (2 hidden pass), each at the 900s cap; runner alive at parallel 3, ETA about 02:15Z. Incident: 6 then 2 legacy watchdog loops escaped the harness timeout group (ppid 1, 30 min); stopped by PID; guard slice EV-10.
1276
+ - In flight (wave E13, 12 builders): E-45 cost path rework, E-36 preflight (plus E-37), E-32 rebase, E-34 docs refresh, E-52..E-56, E-58 (makes E-47 green), E-59 (makes E-50 green), EV-10.
1277
+ - ETA: E-45 merge about 00:45Z, EV-8 5-task cost check right after, EV-9 full v10 arm about 01:00Z to 01:45Z, gate decision 03:00Z.
1278
+ - Top blocker: cost per completed task (raw $0.2363); E-45 plus the per-call overhead finding decide it.
1279
+
1280
+ ## 2026-09-28T01:51Z: Loki 10 progress (gate numbers, EV-8, MODERNIZE.md)
1281
+ - Gate numbers, small tier, claude-opus-5-5 (D30 targets: completion 96.5% or higher, cost per completed task $0.118 or lower, time to a correct result at most raw):
1282
+ - raw claude -p, 29 tasks: 27/29 (93.1%), p50 39s, p90 68s, $0.2363 per completed task (~/loki-ci-logs/eval-raw-claude-20260927T231653Z/results.jsonl).
1283
+ - legacy (EV-5, global loki v9.78.0, 29 tasks, finished): completed 15/29 (51.7%), hidden tests pass 26/29, p50 190s, p90 441s; cost not measured on any run (0/29 provider-sourced) (~/loki-ci-logs/ev5-legacy/results.jsonl). Legacy commits locally and opens no PR, which is why hidden-pass exceeds completed.
1284
+ - v10: full arm not run yet. EV-8 (5 tasks, results below) is the only v10 measurement.
1285
+ - EV-8 status: first run invalid (harness ran the global loki v9.78.0, and the main checkout had agent SDK 0.3.267, which rejects claude-opus-5-5; every session exited in 1s with 0 tokens). Rerun from the repo's bin/loki after `bun install` (node_modules 0.3.283), same 5 tasks (raw on them: 5/5, $0.2161 per completed, p50 41s):
1286
+ - A, full design (Wall on sonnet): 4/5, $0.5954 per completed (one run's cost unrecorded, so a floor), p50 116.5s, p90 322s.
1287
+ - B, Wall off: 5/5, $0.3976 per completed, p50 65s, p90 115s (~/loki-ci-logs/ev8r-{A,B}/results.jsonl).
1288
+ - Reading: v10 is 1.8x raw cost at best and 1.6x raw time; the D30 target is 0.5x cost. The Wall session alone was $0.119 in one run. Next lever: the cascade (sonnet first, opus only on a Wall or test failure), then per-call-type cost records.
1289
+ - MODERNIZE.md: CTO and Architect dispatched 01:52Z; ETA 02:45Z for the design doc, Part 2 slices cut by the PO right after.
1290
+ - CI: main red at d00c5ede and 7c3dea3d from train E13 (providers.test.ts dies where claude is absent because preflight exits in-process; test-engine10-dispatch.sh expected 2 cli.ts lines, E-32 made it 3). Both fixes are in train E14 (404 pass, 0 fail locally, plus a no-claude PATH run); push after the remaining no-claude check.
1291
+ - Top blocker: cost. v10 at $0.40 per completed task vs the $0.118 target.