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.
- package/README.md +19 -0
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/lib/engine10-legacy-notice.txt +3 -0
- package/autonomy/lib/engine10-push-gitlab.sh +96 -0
- package/autonomy/lib/engine10-push.sh +67 -2
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/dev/tmp-cleanup.md +3 -3
- package/docs/v10/BOARD.md +101 -47
- package/docs/v10/DECISIONS.md +18 -0
- package/docs/v10/ENGINE.md +267 -735
- package/docs/v10/GUARDS.md +81 -0
- package/docs/v10/GUIDE.md +154 -0
- package/docs/v10/METRICS.md +26 -0
- package/docs/v10/PROGRESS.md +41 -0
- package/loki-ts/dist/loki.js +711 -623
- package/loki-ts/package.json +1 -1
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-CSy7GfXm.js → AdminPage-BsKDNH7g.js} +1 -1
- package/web-app/dist/assets/{Avatar-FuCbZv5L.js → Avatar-eQ64Y3hv.js} +1 -1
- package/web-app/dist/assets/{Badge-Do6fV7hN.js → Badge-b82yzJcN.js} +1 -1
- package/web-app/dist/assets/{Button-B9NZXMf8.js → Button-Bd9FSMso.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-VXxvKnKW.js → CockpitPage-DjnDt5xn.js} +1 -1
- package/web-app/dist/assets/{ComparePage-OmqxCaK7.js → ComparePage-D2gfvgOy.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BYCkDeu8.js → ErrorBoundary-BUHNHWWu.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-KesRGf-7.js → EvidenceReceiptPanel-D1I4Ttbh.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-fEnpFg8B.js → GitHubIssuesPanel-DwVEFUMV.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-DGGod_Y0.js → GitHubPRsPanel-ConSaimn.js} +1 -1
- package/web-app/dist/assets/{HomePage-EeWPhwob.js → HomePage-CKE8CosL.js} +2 -2
- package/web-app/dist/assets/{LoginPage-BPHKgT1f.js → LoginPage-D8axj5IL.js} +1 -1
- package/web-app/dist/assets/{MagicPage-CO0MTvpr.js → MagicPage-aD3MFjIp.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-eYpHWxnI.js → MetricsPage-BdZxBPG9.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-Cd409HEe.js → NotFoundPage-TDGVwyxo.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-hcAZ_hrX.js → ProjectPage-CUx32MoW.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-DH04B2fr.js → ProjectsPage-CHFOim84.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-Csur-yom.js → SettingsPage-BM4FDVIk.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-B5AIrDXd.js → ShowcasePage-nki5E019.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-DA6Bn7er.js → SystemSettingsPage-B40QOcn3.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-KcBbM7_z.js → TeamsPage-CKsaamvM.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-BgLOizbo.js → TemplatesPage-D3dEJ11t.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-CX-gh76o.js → TerminalOutput-DCL5jtSd.js} +1 -1
- package/web-app/dist/assets/{activity-6UlD-ytF.js → activity-D-IlrNbY.js} +1 -1
- package/web-app/dist/assets/{bell-CFARmHF4.js → bell-m1luNYs4.js} +1 -1
- package/web-app/dist/assets/{bot-M-HZlOa2.js → bot-Cl1HRT_0.js} +1 -1
- package/web-app/dist/assets/{check-9GtMUwM3.js → check-3lLURBsJ.js} +1 -1
- package/web-app/dist/assets/{chevron-left-CPV_nwtP.js → chevron-left-D02P_bEW.js} +1 -1
- package/web-app/dist/assets/{circle-alert-UahP_eMY.js → circle-alert-ZCI8JfmJ.js} +1 -1
- package/web-app/dist/assets/{clock-CcCc97td.js → clock-D3VuRQUy.js} +1 -1
- package/web-app/dist/assets/{cloud-CviPksVP.js → cloud-D0bikLQP.js} +1 -1
- package/web-app/dist/assets/{code-xml-gGDp7nvj.js → code-xml-tqtfp834.js} +1 -1
- package/web-app/dist/assets/{database-BlHnMksz.js → database-C2bSuVEi.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-CqZfNw7q.js → dollar-sign-Dp8f9cxy.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-ChtMYoeA.js → file-code-corner-CNsBLnGJ.js} +1 -1
- package/web-app/dist/assets/{file-plus-C3l1fGp_.js → file-plus-D5gsIm0p.js} +1 -1
- package/web-app/dist/assets/{globe-BM4RYvi9.js → globe-C5wH6C2_.js} +1 -1
- package/web-app/dist/assets/{hammer-C8xvsZCy.js → hammer-BbgvMFD3.js} +1 -1
- package/web-app/dist/assets/{index-BsB5DTpP.js → index-C-AhysBW.js} +2 -2
- package/web-app/dist/assets/{layers-WUsuQnfe.js → layers-Cy9T0QFp.js} +1 -1
- package/web-app/dist/assets/{loader-circle-CWZhBNSa.js → loader-circle-Bxmwkkrf.js} +1 -1
- package/web-app/dist/assets/{lock-bbfx9k11.js → lock-C8DRY3rX.js} +1 -1
- package/web-app/dist/assets/{package-CDfsTKO6.js → package-0ny9RvN9.js} +1 -1
- package/web-app/dist/assets/{plus-DEm39Klm.js → plus-B7Dhrqtb.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-DJZcHBKa.js → refresh-cw-CkQrR-L1.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-BcngFsiU.js → rotate-ccw-du8wLFBD.js} +1 -1
- package/web-app/dist/assets/{scroll-text-CYSjVzWv.js → scroll-text-lC55WYYu.js} +1 -1
- package/web-app/dist/assets/{server-CkMcbRF7.js → server-DWbmrgQz.js} +1 -1
- package/web-app/dist/assets/{shield-alert-D6ZsDRLA.js → shield-alert-D7HIrslo.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-Ce0QhF9c.js → thumbs-up-CXHDiQ_F.js} +1 -1
- package/web-app/dist/assets/{trash-2-OojrLB2z.js → trash-2-WYDISyed.js} +1 -1
- package/web-app/dist/assets/{trending-down-3Bu2DcUr.js → trending-down-iUK45Jk7.js} +1 -1
- package/web-app/dist/assets/{trending-up-BUkmDOK8.js → trending-up-Ca_zIVLF.js} +1 -1
- package/web-app/dist/assets/{upload-BgR13l74.js → upload-DWDtE29t.js} +1 -1
- package/web-app/dist/assets/{usePolling-DwQTkEQG.js → usePolling-DqMVwR9D.js} +1 -1
- package/web-app/dist/assets/{user-DZcP5JBh.js → user-Bgt0jZl5.js} +1 -1
- package/web-app/dist/index.html +1 -1
package/docs/v10/GUARDS.md
CHANGED
|
@@ -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.
|
package/docs/v10/METRICS.md
CHANGED
|
@@ -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.
|
package/docs/v10/PROGRESS.md
CHANGED
|
@@ -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.
|