loki-mode 11.74.2 → 11.75.2
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 +1 -1
- package/SKILL.md +2 -3
- package/VERSION +1 -1
- package/autonomy/completion-council.sh +10 -10
- package/autonomy/council-v2.sh +4 -4
- package/autonomy/grill.sh +1 -1
- package/autonomy/lib/ablation.py +22 -2
- package/autonomy/lib/browser-open.sh +1 -1
- package/autonomy/lib/chat.sh +1 -1
- package/autonomy/lib/cockpit-render.sh +1 -1
- package/autonomy/lib/done-recognition.sh +4 -4
- package/autonomy/lib/efficiency_cost.py +1 -1
- package/autonomy/lib/engine10-push.sh +2 -2
- package/autonomy/lib/prd-enrich.sh +1 -1
- package/autonomy/lib/proof-check.sh +1 -1
- package/autonomy/lib/proof-generator.py +3 -3
- package/autonomy/lib/proof-pr.sh +1 -1
- package/autonomy/lib/skill-link-heal.sh +1 -1
- package/autonomy/lib/voter-agents.sh +1 -1
- package/autonomy/loki +26 -37
- package/autonomy/prd-checklist.sh +1 -1
- package/autonomy/receipt_jwt.py +1 -1
- package/autonomy/run.sh +28 -28
- package/autonomy/trigger-schedule.py +6 -414
- package/autonomy/tui.sh +1 -1
- package/autonomy/verify.sh +4 -4
- package/completions/loki.bash +0 -5
- package/dashboard/__init__.py +1 -1
- package/docs/ARCHITECTURE.md +1 -2
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/COMPONENTS.md +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/ROUTING-EVIDENCE.md +1 -2
- package/docs/V10-RESEARCH.md +1 -1
- package/docs/dev/architecture-reference.md +3 -7
- package/docs/dev/project-structure.md +1 -4
- package/docs/dev/release-checklist.md +13 -31
- package/docs/research-2026-07/OBSERVABILITY-TOOL-SPEC.md +1 -1
- package/docs/v11/MARKET-SLICES.md +1 -1
- package/docs/v11/REGISTRIES.md +1 -1
- package/docs/v11/ROUTER-1.md +2 -2
- package/loki-ts/dist/loki.js +2 -2
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/skills/extending.md +2 -3
- package/skills/factory-operations.md +11 -18
- package/skills/release-cadence.md +2 -2
- package/web-app/dist/assets/{AdminPage-jkjilfbl.js → AdminPage-CTwi8SUX.js} +1 -1
- package/web-app/dist/assets/{Avatar-bd5JWkSJ.js → Avatar-DVtGtLkJ.js} +1 -1
- package/web-app/dist/assets/{Badge-DVRit2Xw.js → Badge-rwKzz0Pe.js} +1 -1
- package/web-app/dist/assets/{Button-BNAB-pVZ.js → Button-nIsPDfsQ.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-DpG29h_w.js → CockpitPage-BCeDpoWa.js} +1 -1
- package/web-app/dist/assets/{ComparePage-Dasg5V41.js → ComparePage-CYIYanVq.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-DJojse6b.js → ErrorBoundary-Bkz6HqWp.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-Blxw7_u1.js → EvidenceReceiptPanel-DZT2Np4F.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-BBvSFj80.js → GitHubIssuesPanel-Bzla91Lu.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-BCIKeSBg.js → GitHubPRsPanel-FjT-Xn5t.js} +1 -1
- package/web-app/dist/assets/{HomePage-C7d__oNG.js → HomePage-pXgmRGLt.js} +2 -2
- package/web-app/dist/assets/{LoginPage-BXljL3yY.js → LoginPage-CnmpE28B.js} +1 -1
- package/web-app/dist/assets/{MagicPage-Xjkts_yE.js → MagicPage-CuSeGsLq.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-kQvVp-j2.js → MetricsPage-Bg3PkBOU.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-D-4ZlEaO.js → NotFoundPage-uzBtZNV-.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-DfzR5RXP.js → ProjectPage-Dacki8Xr.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-DFDsWzkV.js → ProjectsPage-BRGjksXG.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-CLPIoYT3.js → SettingsPage-BbNf3fEJ.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-PZKkyGeY.js → ShowcasePage-XX4830sX.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-BsBlcnzo.js → SystemSettingsPage-DOhQeXa6.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-BSjgNhoU.js → TeamsPage-2reIRUp_.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-W2KeAzbg.js → TemplatesPage-BUsLEWHW.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-BjroTiCC.js → TerminalOutput-BrBDcgzC.js} +1 -1
- package/web-app/dist/assets/{activity-BXZ5YYes.js → activity-B6AZpgmb.js} +1 -1
- package/web-app/dist/assets/{bell-D1urp5pa.js → bell-CB792A7S.js} +1 -1
- package/web-app/dist/assets/{bot-Chedf2bF.js → bot-uQZwOFAn.js} +1 -1
- package/web-app/dist/assets/{check-DhaCuOCV.js → check-DrtG0lIZ.js} +1 -1
- package/web-app/dist/assets/{chevron-left-D7BpQyA6.js → chevron-left-CrsJSAqQ.js} +1 -1
- package/web-app/dist/assets/{circle-alert-DnGvQ_AQ.js → circle-alert-BUCly4p3.js} +1 -1
- package/web-app/dist/assets/{clock-CqfxWhHM.js → clock-B2IT9SnE.js} +1 -1
- package/web-app/dist/assets/{cloud-BKxp5AWB.js → cloud-CN6Ux7Q7.js} +1 -1
- package/web-app/dist/assets/{code-xml-BDQ6GBtt.js → code-xml-BEm8PWnK.js} +1 -1
- package/web-app/dist/assets/{database-BmpEx1y_.js → database-cHe5Fgu8.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-DYNY9R_C.js → dollar-sign-BVmP4YrE.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-BJi0IBFd.js → file-code-corner-D-m-NrwO.js} +1 -1
- package/web-app/dist/assets/{file-plus-Dqyb2bcQ.js → file-plus-6mCjIzAB.js} +1 -1
- package/web-app/dist/assets/{globe-DPh4RWfM.js → globe-vcWOujwU.js} +1 -1
- package/web-app/dist/assets/{hammer-B3xnuoA1.js → hammer-D4nZFpO2.js} +1 -1
- package/web-app/dist/assets/{index-BpX8DcTr.js → index-u8toJ43r.js} +3 -3
- package/web-app/dist/assets/{layers-BRCmyCW8.js → layers-CNhYLop8.js} +1 -1
- package/web-app/dist/assets/{loader-circle-n07Pky0M.js → loader-circle-Vl7XIMV6.js} +1 -1
- package/web-app/dist/assets/{lock-BWqOuQmS.js → lock-SW_KwAvf.js} +1 -1
- package/web-app/dist/assets/{package-BJlB_Z-Z.js → package-QPK-7Ej1.js} +1 -1
- package/web-app/dist/assets/{plus-oH17BZu2.js → plus-DUgAlgCB.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-CPQ476LL.js → refresh-cw-LfUksPHq.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-7hLvOcnS.js → rotate-ccw-CMbuouVq.js} +1 -1
- package/web-app/dist/assets/{scroll-text-BCmLauQn.js → scroll-text-C_FxBmNQ.js} +1 -1
- package/web-app/dist/assets/{server-DfTfvW84.js → server-7UJe9Jqt.js} +1 -1
- package/web-app/dist/assets/{shield-alert-CaeGRq19.js → shield-alert-BMuu6fYB.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-Dz-l2GPC.js → thumbs-up-Bhs0d2Gp.js} +1 -1
- package/web-app/dist/assets/{trash-2-B-OsDmSo.js → trash-2-BZKxv49w.js} +1 -1
- package/web-app/dist/assets/{trending-down-CXTFOxzq.js → trending-down-DKeCMZek.js} +1 -1
- package/web-app/dist/assets/{trending-up-FQEdqr3v.js → trending-up-43_9fShg.js} +1 -1
- package/web-app/dist/assets/{upload-CacWSNTg.js → upload-pV3irPEW.js} +1 -1
- package/web-app/dist/assets/{usePolling-cIjZ9qd2.js → usePolling-CoZQM-WL.js} +1 -1
- package/web-app/dist/assets/{user-DAouWFHi.js → user-CMl7dXvC.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/autonomy/company-seats.json +0 -82
- package/docs/COMPETITIVE-INTEL-2026-09.md +0 -444
- package/docs/FOUNDER-DECISIONS-TRUST-SEMANTICS-2026-08-01.md +0 -145
- package/docs/FOUNDER-STATUS-AND-DECISIONS-2026-07-01.md +0 -132
- package/docs/LOKI-10-BUILD-PROMPT.md +0 -350
- package/docs/STRATEGY-2026-2028.md +0 -124
- package/docs/V10-VISION.md +0 -161
- package/docs/v10/ADOPTION-PLAN.md +0 -375
- package/docs/v10/ARCHITECT-CUTS.md +0 -744
- package/docs/v10/BACKLOG.md +0 -231
- package/docs/v10/BOARD.md +0 -1403
- package/docs/v10/CONTROL-PLANE.md +0 -120
- package/docs/v10/CONTROL.md +0 -36
- package/docs/v10/CP-ASK-PLAN.md +0 -85
- package/docs/v10/CP-ENTERPRISE-UI.md +0 -537
- package/docs/v10/D51-PHASE-B.md +0 -120
- package/docs/v10/D61-SPEED.md +0 -105
- package/docs/v10/D63-CARDS.md +0 -354
- package/docs/v10/DECISIONS.md +0 -915
- package/docs/v10/E2E-D65.md +0 -123
- package/docs/v10/ENGINE-LAWS.md +0 -163
- package/docs/v10/ENGINE-MEASURE.md +0 -69
- package/docs/v10/ENGINE.md +0 -743
- package/docs/v10/FAILURE-CLASSES.md +0 -2026
- package/docs/v10/FC21B-FC22-PLAN.md +0 -107
- package/docs/v10/FIRST-RUN-GATE.md +0 -39
- package/docs/v10/FOUNDER-QUEUE.md +0 -29
- package/docs/v10/GAP-RESEARCH-1003.md +0 -32
- package/docs/v10/GUARDS.md +0 -883
- package/docs/v10/L0-WAVE1.md +0 -81
- package/docs/v10/LEGACY-REMOVAL.md +0 -408
- package/docs/v10/MEDIUM-ANALYSIS.md +0 -346
- package/docs/v10/METRICS.md +0 -645
- package/docs/v10/MODERNIZE.md +0 -437
- package/docs/v10/OPENCODE-PARITY-PLAN.md +0 -84
- package/docs/v10/OPERATING-MODEL.md +0 -60
- package/docs/v10/PLAN-V12.md +0 -896
- package/docs/v10/PROGRESS.md +0 -2735
- package/docs/v10/RELEASE-11.md +0 -77
- package/docs/v10/RETRO-2026.md +0 -650
- package/docs/v10/ROADMAP-D63.md +0 -35
- package/docs/v10/SCALE.md +0 -140
- package/docs/v10/SCORECARD-PLAN.md +0 -250
- package/docs/v10/SWARM-PROMPT.md +0 -98
- package/docs/v10/SWARM.md +0 -293
- package/docs/v10/cp-redesign/PARITY.md +0 -188
- package/docs/v10/cp-redesign/legacy/INDEX.md +0 -1167
- package/docs/v10/roadmap-10/01-measurement.md +0 -113
- package/docs/v10/roadmap-10/02-cost.md +0 -75
- package/docs/v10/roadmap-10/03-speed.md +0 -65
- package/docs/v10/roadmap-10/04-first-run.md +0 -61
- package/docs/v10/roadmap-10/05-deploy.md +0 -61
- package/docs/v10/roadmap-10/06-stability.md +0 -64
- package/docs/v10/roadmap-10/07-quality.md +0 -57
- package/docs/v10/roadmap-10/08-proof.md +0 -48
- package/docs/v10/roadmap-10/09-safety.md +0 -74
- package/docs/v10/roadmap-10/README.md +0 -1464
- package/skills/sdlc-fleet.md +0 -170
- package/tools/cockpit/SPEC.md +0 -275
- package/tools/cockpit/index.html +0 -146
- package/tools/cockpit/roi-basis.json +0 -33
- package/tools/cockpit/server.py +0 -946
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
# E-98: why v10 loses to raw `claude -p` on the medium tier (EV-15)
|
|
2
|
-
|
|
3
|
-
Source data: EV-15 (2026-09-28, harness `cc4992ed`, v10.2.5, `claude-opus-5-5`, 7 `pub-*` medium tasks, 2 runs per arm, 900s cap). The engine10 code this analysis cites is unchanged between `cc4992ed` and `origin/main` `d811e5c3` (`git diff --stat cc4992ed origin/main -- loki-ts/src/engine10` is empty).
|
|
4
|
-
All paths below are relative to `/Users/lokesh/loki-ci-logs/eval/` (called EV below). `EV/ev15-summary.md` and `EV/ev15-stage-detail.md` are the run summaries.
|
|
5
|
-
|
|
6
|
-
The founder's "12/14 vs 10/14" comes from EV-14. Its result files were lost when a worktree was force-removed (E-96/E-101). EV-15 re-ran the tier: raw 10/14, v10 9/14. The numbers here are EV-15's, and every claim cites an EV-15 file.
|
|
7
|
-
|
|
8
|
-
## 1. Outcome per task-run
|
|
9
|
-
|
|
10
|
-
| task | raw r1 | raw r2 | v10 r1 | v10 r2 | class |
|
|
11
|
-
|---|---|---|---|---|---|
|
|
12
|
-
| pub-jinja-1413 | pass | pass | **miss** | **miss** | **v10 loss (2)** |
|
|
13
|
-
| pub-werkzeug-3105 | miss | miss (hidden_pass, no push) | miss | miss | shared miss |
|
|
14
|
-
| pub-werkzeug-3271 | miss | miss | miss | pass | shared miss, one v10 win |
|
|
15
|
-
| attrs-1313, click-2869, faker-1817, werkzeug-3121 | pass | pass | pass | pass | tie (v10 slower/costlier) |
|
|
16
|
-
|
|
17
|
-
Only two task-runs were completed by raw and missed by v10: pub-jinja-1413 r1 and r2.
|
|
18
|
-
- werkzeug-3105: both arms fail the same hidden test with the same error. `EV/ev15-v10-r{1,2}/logs/pub-werkzeug-3105*/grade_hidden.stdout.log` and `EV/ev15-raw-claude-r1/logs/pub-werkzeug-3105*/grade_hidden.stdout.log` all show `FAILED tests/test_routing.py::test_no_duplicate_head_options - DuplicateRuleError: / -> a`.
|
|
19
|
-
- werkzeug-3271 r1: both arms fail with `FAILED tests/test_wrappers.py::test_user_agent - Failed: DID NOT WARN`.
|
|
20
|
-
- These are task difficulty, not v10 stage losses.
|
|
21
|
-
|
|
22
|
-
## 2. Failure table (v10 losses, with log citations)
|
|
23
|
-
|
|
24
|
-
Event logs:
|
|
25
|
-
- `EV/ev15-engine/v10-r1/pub-jinja-1413.v10.71372932a4ef/.loki/runs/e10-20260928T185044Z-5451/events.jsonl` (r1)
|
|
26
|
-
- `EV/ev15-engine/v10-r2/pub-jinja-1413.v10.78270c64e4ab/.loki/runs/e10-20260928T190755Z-60df/events.jsonl` (r2)
|
|
27
|
-
|
|
28
|
-
Hidden grade, in both runs (`EV/ev15-v10-r{1,2}/logs/pub-jinja-1413*/grade_hidden.stdout.log`):
|
|
29
|
-
- Result: `2 failed, 12 passed`.
|
|
30
|
-
- The failing tests are `TestSet::test_set_invalid` and `TestSet::test_namespace_redefined`, both `DID NOT RAISE TemplateRuntimeError`.
|
|
31
|
-
- Both tests passed at baseline (`baseline.stdout.log`: only `test_namespace_set_tuple` failed).
|
|
32
|
-
- So v10 broke the namespace runtime check. These are regressions in existing tests, not a missing feature.
|
|
33
|
-
- Raw (opus) kept the check: `EV/ev15-raw-claude-r1/logs/pub-jinja-1413*/grade_hidden.stdout.log` shows `14 passed`.
|
|
34
|
-
|
|
35
|
-
| run | stage that lost it | exact event lines | cause (one sentence) |
|
|
36
|
-
|---|---|---|---|
|
|
37
|
-
| jinja r1 | implement brief, then early exit past verify | seq21 `stage.completed implement {"exit": "spec_conflict", ..., "spec_conflict_reason": "plan step 8 requires adding tests to the existing tests/test_core_tags.py, but the rules make existing test files read-only ...", "impacted_tests": []}`; seq22 `stage.started commit` directly after it (no verify stage); seq25 `receipt.sealed ... "verdict": "SPEC_CONFLICT"` | The brief rule "existing test files are read-only" (implement.ts:33) turned a normal task into `spec_conflict`, and `earlyExit` (machine.ts:55) then skipped verify and the fix loop, so a sonnet diff that regressed two existing tests shipped untested. |
|
|
38
|
-
| jinja r2 | verify (blind), so no fix round | seq32 `stage.completed implement {"exit": "done", ..., "impacted_tests": ["examples/basic/loki_wall_test_namespace_tuple_assign.py"]}`; `test.result verify {"name": "pytest:tests/test_core_tags.py", "cmd": "python -m pytest -q tests/test_core_tags.py", "result": "not_run", "reason": "python not found on PATH"}`; no `fix` event; seq45 `run.completed {"verdict": "PARTIAL", ...}` | Verify picked the right file (`tests/test_core_tags.py` contains both regressed tests), but ran it as `python`. The host has only `python3` (`which python` prints `python not found`), and the task's own `work/.venv` was never tried, so the check was `not_run`, `failures_grouped` stayed empty, and the fix loop never started. |
|
|
39
|
-
|
|
40
|
-
What each session actually ran:
|
|
41
|
-
- jinja r2 (`.loki/logs/bash-audit.jsonl`): the implementer ran only the Wall test, with system `python3` and `PYTHONPATH=src`. It never ran `tests/test_core_tags.py`.
|
|
42
|
-
- Its log (`iteration-e10-20260928T190755Z-60df-impl.log`) says it added new tests "after `test_namespace_macro`". Seal's `weakened test: tests/test_core_tags.py` fires on any modification (seal.ts:176), not only on weakening.
|
|
43
|
-
- The two regressed tests are therefore most likely still intact in the sandbox. A working verify would then have failed them. This is likely, not proven: the EV-15 working trees are gone, so the E-98a/E-98b re-run settles it.
|
|
44
|
-
- jinja r1 needed two fixes to reach a fix round: the interpreter fix, and a verify that still runs after `spec_conflict`.
|
|
45
|
-
|
|
46
|
-
## 3. Engine-wide facts (all 14 v10 event logs)
|
|
47
|
-
|
|
48
|
-
Commands: the scripts `dump.py`, `sumall.py` and `cost.py` read every `EV/ev15-engine/v10-r*/*/.loki/runs/*/events.jsonl`.
|
|
49
|
-
|
|
50
|
-
- **Verify never ran a test.**
|
|
51
|
-
- 27 of 27 `test.result` pytest checks are `not_run` / `python not found on PATH`.
|
|
52
|
-
- 9 of 9 ruff checks are `not_run` / `ruff not found on PATH`.
|
|
53
|
-
- 0 checks passed and 0 failed.
|
|
54
|
-
- There were 0 `fix` events in 14 runs. The fix loop is gated on `failures_grouped` (machine.ts:54), which can only fill from a `fail`.
|
|
55
|
-
- **Verify was skipped in 5 of 14 runs.** Implement exited `spec_conflict` in jinja r1, werkzeug-3121 r1 and r2, and werkzeug-3271 r1 and r2.
|
|
56
|
-
- 4 of the 5 reasons cite the read-only rule for existing test files.
|
|
57
|
-
- 3121 r1 cites a Wall test that contradicts the plan.
|
|
58
|
-
- 9 verify stages completed, 5 did not start.
|
|
59
|
-
- **The implementer is never told which existing tests to run.**
|
|
60
|
-
- Implement reported `impacted_tests: []` in 9 of 14 runs. The 5 non-empty ones are faker x2 (`tests/test_proxy.py`, lean path) and 3 Wall-test-only lists.
|
|
61
|
-
- Root cause: `repomap.ts` extracts symbols only with a JS `export` regex (`SYMBOL_RE`, repomap.ts:23). Every Python repo gets `entries: []`. For example, jinja r2 `repomap.json` has 118 files and 0 entries.
|
|
62
|
-
- So `selectRelevantFiles` returns `[]` (`"relevant_files": []` in 8 of 8 plan stages).
|
|
63
|
-
- Then `impactedTests` (implement.ts:17) takes `[]` from `??` and never falls back to `namedFiles`.
|
|
64
|
-
- **Implement always ran on sonnet; raw ran on opus.**
|
|
65
|
-
- Every `session.started implement` has `"model": "claude-sonnet-5"`, because of the E-64 cascade (implement.ts:68, sizing.ts:63).
|
|
66
|
-
- Escalation to the run model happens only in a fix round with a test failure (fix.ts:60). That cannot happen while verify is blind.
|
|
67
|
-
- So on this harness the cascade is sonnet-only. This contributes to jinja, but is not proven as a cause: EV-14 v10 passed jinja 2/2.
|
|
68
|
-
- **Wall hit its 90s limit in 5 of 14 runs:** 3105 r1 and r2, 3121 r2, 3271 r2, click r2.
|
|
69
|
-
- Evidence: `stage.failed wall {"reason": "limit"}` and `session.ended wall exit=killed dur=90.0`.
|
|
70
|
-
- Wall sealed at least one test in only 3 of 14 runs (3121 r1, 3271 r1, jinja r2).
|
|
71
|
-
- The one jinja Wall test was written under `examples/basic/`. The implementer reports that it was defective: `test_recursive_loop_matches_bug_report` references an undefined `id`.
|
|
72
|
-
|
|
73
|
-
## 4. Cost: where v10 spends that raw does not
|
|
74
|
-
|
|
75
|
-
Measured from `cost` events (`usd` non-null) and from raw `arm_stdout.log` usage:
|
|
76
|
-
|
|
77
|
-
| | usd | cache read tokens | cache write tokens | output tokens |
|
|
78
|
-
|---|---|---|---|---|
|
|
79
|
-
| raw, 14 runs | $5.09 | 4.79M | 0.29M | 89k |
|
|
80
|
-
| v10 implement (sonnet), 14 | $4.91 | 9.23M | 0.41M | 137k |
|
|
81
|
-
| v10 wall (sonnet), 8 measured + 4 unmeasured | $1.11 | 0.32M | 0.15M | 40k |
|
|
82
|
-
| v10 plan (opus), 8 | $0.90 | 0.30M | 0.06M | 16k |
|
|
83
|
-
| v10 intake (sonnet, lean path), 2 | $0.17 | 0.08M | 0.03M | 1k |
|
|
84
|
-
| **v10 total measured** | **$7.09** | 9.93M | 0.66M | 195k |
|
|
85
|
-
|
|
86
|
-
- **Correction to EV-15's lower bound.** Measured v10 spend is at least $7.09, over 9 completions, so cost per completed is at least **$0.788**, not $0.5788. EV-15 summed only the 10 costed rows. It dropped the measured plan and implement dollars inside the 4 null rows ($0.32, $0.59, $0.25, $0.72 before Wall). Raw is $0.5085, so v10 is at least 55% more per completed task.
|
|
87
|
-
- **Priority-2 gap, root cause.** All 4 `cost_usd: null` rows (3105 r1 and r2, 3121 r2, 3271 r2) are runs where Wall was killed at its limit.
|
|
88
|
-
- Evidence: `cost wall usd=None ... in=0 out=0`. Only `result-cost-*-impl.json` and `result-cost-*-plan.json` exist under `.loki/metrics/` (for example 3105 r1).
|
|
89
|
-
- A killed session never receives the SDK result message, so no cost file is written. `iteration-2.json` is Wall's efficiency record.
|
|
90
|
-
- **Overhead stages.** Plan, Wall and intake cost $2.18, which is 31% of v10's measured spend. Wall bought a sealed test in 3 of 14 runs.
|
|
91
|
-
- **Latency.** Implement waits for the whole `["plan", "wall"]` group. When Wall is killed at 90s beside a 15-31s plan, that adds about 60-75s before implement starts.
|
|
92
|
-
- **Implement burns 1.9x raw's cache reads** (9.23M vs 4.79M), on a cheaper model. Most of it is in the long runs:
|
|
93
|
-
- attrs r2: 286s, 2.49M cache read, $0.97.
|
|
94
|
-
- jinja r2: 360s, 2.34M, $0.94.
|
|
95
|
-
- werkzeug-3105 r2: 1.11M, $0.47.
|
|
96
|
-
- werkzeug-3271 r2: 239s, 0.94M, $0.63.
|
|
97
|
-
- The brief gives no test to run, so the session explores instead of converging.
|
|
98
|
-
|
|
99
|
-
Completed runs where v10 was slower or costlier than raw on the same task and run:
|
|
100
|
-
- attrs r2: $1.06 and 317s vs $0.28 and 60s. Implement ran 286s.
|
|
101
|
-
- click r2: 212s vs 49s. Wall was killed at 90s, then implement ran 121s.
|
|
102
|
-
- faker r2: 128s vs 227s, a v10 win on time.
|
|
103
|
-
- 3121 r2: 141s vs 29s. Wall was killed at 90s, then implement ended in `spec_conflict`.
|
|
104
|
-
- 3271 r2: 330s, a v10 win. Wall was killed at 90s, then implement ran 239s.
|
|
105
|
-
|
|
106
|
-
In every slow case the time went to Wall hitting its limit, or to a long implement session with no test to run.
|
|
107
|
-
|
|
108
|
-
## 5. Root causes, ranked by lost completions explained
|
|
109
|
-
|
|
110
|
-
| rank | cause | lost completions explained | other effect |
|
|
111
|
-
|---|---|---|---|
|
|
112
|
-
| 1 | Verify runs pytest as bare `python`: not on PATH, and the task `.venv` is ignored (verify.ts:31) | 2 of 2 (r2 directly; r1 once cause 2 is fixed) | 27/27 checks `not_run`; 0 fix rounds; cascade escalation unreachable |
|
|
113
|
-
| 2 | `spec_conflict` early exit skips verify and fix (machine.ts:55), triggered by the "existing test files are read-only" rule (implement.ts:33) | 1 (jinja r1) | 5/14 runs unverified; 4 of the 5 caused by the read-only rule |
|
|
114
|
-
| 3 | Implementer is given no impacted tests: Python repomap has 0 entries (repomap.ts:23), and `[]` blocks the `namedFiles` fallback (implement.ts:17) | contributing to 2 (the implementer never ran `test_core_tags.py`) | 9/14 implement runs had no tests to run; long, cache-heavy sessions |
|
|
115
|
-
| 4 | Implement pinned to sonnet by the cascade, with escalation only through verify failures | contributing, unproven (EV-14 v10 passed jinja 2/2) | cheaper tokens, but 1.9x the cache reads |
|
|
116
|
-
| 5 | Wall 90s limit kills and low yield | 0 | all 4 null-cost rows; +60-75s latency; 3/14 useful |
|
|
117
|
-
|
|
118
|
-
## 6. Fix slice cards
|
|
119
|
-
|
|
120
|
-
D33: the core is 4,942 lines against a 5,000 cap, so there are 58 lines of headroom. Card deltas below total +34 or fewer. IDs are E-98a to E-98f, to avoid clashing with an E-102 that exists on a local main.
|
|
121
|
-
|
|
122
|
-
Re-running the failed tasks uses `eval/loki10/run.sh` with a separate `--out` per run. There is no `--runs` flag, so use n=3 per task: EV-14 passed jinja 2/2, so n=2 cannot tell a fix from noise. Copy each run's `work/.loki` out before cleanup (E-101), with the output under `/Users/lokesh/loki-ci-logs/eval/e98-*`.
|
|
123
|
-
|
|
124
|
-
### E-98a: verify uses the project interpreter
|
|
125
|
-
- Goal: pytest checks run on the repo's own environment, so a regression shows up as `fail` and drives a fix round.
|
|
126
|
-
- File set:
|
|
127
|
-
- `loki-ts/src/engine10/stages/verify.ts`: `runnerCmd` resolves `<repoDir>/.venv/bin/python`, then `<repoDir>/venv/bin/python`, then `$VIRTUAL_ENV/bin/python`, then `python3`, then `python`.
|
|
128
|
-
- The same file: each check records the interpreter it used. A check that ran on a system interpreter adds "tests ran on the system interpreter" to not_proven, because system `python3` imported the installed Jinja2 3.1.6, not `src/`, in jinja r2.
|
|
129
|
-
- `loki-ts/tests/engine10/verify*.test.ts`.
|
|
130
|
-
- Net core delta: at most +12.
|
|
131
|
-
- Wall check:
|
|
132
|
-
- Red first: a fixture with a `.venv/bin/python` shim and no `python` on PATH gives `not_run` before the change and `pass`/`fail` after. A second fixture with system python3 only records `interpreter: system` plus the not_proven line.
|
|
133
|
-
- Then `eval/loki10/run.sh --arm v10 --tasks pub-jinja-1413 --out /Users/lokesh/loki-ci-logs/eval/e98a-r{1,2,3}`.
|
|
134
|
-
- Expected: `test.result` for `pytest:tests/test_core_tags.py` is `pass` or `fail` (never `not_run`) in 3 of 3 runs, and completed in at least 2 of 3.
|
|
135
|
-
- Budget: 30 min. Tier: HIGH (verify).
|
|
136
|
-
|
|
137
|
-
### E-98b: spec_conflict still verifies
|
|
138
|
-
- Goal: a `spec_conflict` implement exit still runs verify and the fix loop. Only `already_satisfied` short-circuits. The receipt keeps the `SPEC_CONFLICT` verdict and reason.
|
|
139
|
-
- File set: `loki-ts/src/engine10/machine.ts` (`earlyExit`, plus the verdict carry-through only if seal needs it), `loki-ts/tests/engine10/machine*.test.ts`. Net core delta: at most +3.
|
|
140
|
-
- Wall check:
|
|
141
|
-
- A fake-stage test: implement `spec_conflict`, then verify runs, then a `fail` triggers `fix`, then seal still says `SPEC_CONFLICT`. It must fail on current main.
|
|
142
|
-
- Then re-run `pub-jinja-1413`, `pub-werkzeug-3121` and `pub-werkzeug-3271` at n=3 into `EV/e98b-*`, with E-98a merged.
|
|
143
|
-
- Expected: every run with a `spec_conflict` exit has a `stage.completed verify`. Completions are at least EV-15's on these tasks (jinja 0/2, 3121 2/2, 3271 1/2).
|
|
144
|
-
- Budget: 30 min. Tier: HIGH (moat flow).
|
|
145
|
-
|
|
146
|
-
### E-98c: brief allows adding tests; impacted tests fall back
|
|
147
|
-
- Goal: existing test files are append-only (add new test functions, never edit or delete existing ones). Wall files stay read-only and are restored as today; seal.ts:176 still reports any modification. `impactedTests` falls back to `namedFiles` when `relevant_files` is empty, not only when it is missing.
|
|
148
|
-
- File set: `loki-ts/src/engine10/stages/implement.ts` (the brief line at :33, and `impactedTests` at :17 using `?.length ?` in place of `??`), plus its test. Net core delta: at most +2.
|
|
149
|
-
- Wall check:
|
|
150
|
-
- A unit test: a brief with `relevant_files: []` and a task naming `parser.py` lists that file's tests.
|
|
151
|
-
- Re-run `pub-werkzeug-3121` and `pub-werkzeug-3271` at n=3 into `EV/e98c-*`.
|
|
152
|
-
- Expected: no run exits `spec_conflict` citing read-only existing tests (4 of 14 did in EV-15), and completions do not drop.
|
|
153
|
-
- Budget: 15 min. Tier: MEDIUM.
|
|
154
|
-
|
|
155
|
-
### E-98d: Python symbols in the repo map
|
|
156
|
-
- Goal: `buildRepoMap` extracts Python top-level `def` and `class` names, alongside the JS `export` regex, so `selectRelevantFiles` and the impacted-test map work on Python repos.
|
|
157
|
-
- File set: `loki-ts/src/engine10/repomap.ts`, `loki-ts/tests/engine10/repomap*.test.ts`. Net core delta: at most +4 (a second regex applied to `.py`).
|
|
158
|
-
- Wall check:
|
|
159
|
-
- Offline, no model: on each of the 7 medium task repos at their `repo_ref`, `relevant_files` is non-empty and contains the file the upstream refdiff touches (`eval/loki10/refdiff/`). At least 5 of 7 must pass. EV-15 had 0 of 7, 8 of 8 plan stages empty.
|
|
160
|
-
- Keyword ties across a package directory are a known ceiling. Record the rank of the upstream file.
|
|
161
|
-
- Budget: 30 min. Tier: MEDIUM.
|
|
162
|
-
|
|
163
|
-
### E-98e: killed sessions still report cost
|
|
164
|
-
- Goal: a session killed at its stage limit writes a cost record from the per-message usage already streamed, marked `source: "partial-stream"`, so the harness row is never `cost_usd: null` because Wall was killed.
|
|
165
|
-
- File set: `loki-ts/src/engine10/session.ts`, `loki-ts/src/engine10/cost.ts`, and a test. Net core delta: at most +10, or offset by deleting dead code in cost.ts.
|
|
166
|
-
- Wall check:
|
|
167
|
-
- A unit test: a fake stream killed after 2 assistant messages gives a non-null usd equal to the summed usage price.
|
|
168
|
-
- Re-run `pub-werkzeug-3105`, `pub-werkzeug-3121` and `pub-werkzeug-3271` at n=3 into `EV/e98e-*`.
|
|
169
|
-
- Expected: `cost_usd` is non-null on every row, and `eval/loki10/summarize` reports a numeric `cost_per_completed`.
|
|
170
|
-
- Budget: 30 min. Tier: MEDIUM.
|
|
171
|
-
|
|
172
|
-
### E-98f: A/B of Wall and cascade on medium (eval-first, then a sizing change)
|
|
173
|
-
- Goal: measure whether Wall (`LOKI_E10_WALL=0`) and the sonnet cascade (`LOKI_E10_CASCADE=0`) pay for themselves on medium, with E-98a to E-98c merged. Only if a knob wins on completions without losing on cost, change `sizing.ts` so that `size: "normal"` takes that path by default.
|
|
174
|
-
- File set: an eval run only, then `loki-ts/src/engine10/sizing.ts` (at most +3 core lines) and its test.
|
|
175
|
-
- Wall check:
|
|
176
|
-
- All 7 medium tasks at n=3 per arm: default, `LOKI_E10_WALL=0`, `LOKI_E10_CASCADE=0`, into `EV/e98f-{default,nowall,nocascade}-r{1,2,3}`.
|
|
177
|
-
- The chosen default must be at or above raw's EV-15 10/14 rate (71.4%) on completions, and below raw's $0.5085 on cost per completed.
|
|
178
|
-
- The results are published in this file as the "after" table.
|
|
179
|
-
- Budget: 60 min of eval, then a 15 min code change. Tier: HIGH (it changes the default flow).
|
|
180
|
-
|
|
181
|
-
## After (E-98f)
|
|
182
|
-
|
|
183
|
-
Eval run 2026-09-28, worktree `agent-a340b90dfe1a90ce0`, branch `slice-E-98f`,
|
|
184
|
-
harness_sha `3abb3ac6b5cdcb84467f247c56f15eba964b5b77-dirty` (dirty only from
|
|
185
|
-
`loki-ts/dist/cockpit.js`'s non-deterministic build output; source is
|
|
186
|
-
`main` with E-98a..e merged, dist rebuilt in this branch). `bin/loki
|
|
187
|
-
--version` = v10.4.1, `manifest.jsonl` `arm_binary` is this worktree's own
|
|
188
|
-
`bin/loki` (the nocascade arm through a `LOKI_EVAL_LOKI_BIN` shim, see
|
|
189
|
-
below), never a global install. Model `claude-opus-5-5`, the same 7 `pub-*`
|
|
190
|
-
medium tasks, 900s cap, `--parallel 3`, fresh clone per run, n=3 per arm (21
|
|
191
|
-
task-runs each). Raw is not re-run (per instruction); both prior raw
|
|
192
|
-
measurements are carried forward for comparison.
|
|
193
|
-
|
|
194
|
-
**nocascade note:** `LOKI_E10_CASCADE` is not in `eval/loki10/harness.py`'s
|
|
195
|
-
`V10_ENGINE_ENV_ALLOWLIST` (only `LOKI_E10_PLAN/WALL/WALL_TIER/CAP_S/
|
|
196
|
-
INVOKER/DASHBOARD_PORT` are listed), so it is dropped by `arm_env`'s blanket
|
|
197
|
-
`LOKI_*` scrub before reaching the arm. Worked around without a harness code
|
|
198
|
-
change: `LOKI_EVAL_LOKI_BIN` pointed at a one-line shim
|
|
199
|
-
(`LOKI_E10_CASCADE=0 exec <worktree>/bin/loki "$@"`) that sets the var in
|
|
200
|
-
the process `harness.py` execs, outside the scrub. Verified live: 21/21
|
|
201
|
-
nocascade implement sessions ran `session.started` with
|
|
202
|
-
`"model":"claude-opus-5-5"`; 21/21 default and nowall implement sessions ran
|
|
203
|
-
on `"model":"sonnet"`. nowall verified live too: 21/21 nowall runs show a
|
|
204
|
-
wall `stage.skipped` with `"reason":"LOKI_E10_WALL=0"`; 0/21 default or
|
|
205
|
-
nocascade runs show that skip. This allowlist gap should be closed
|
|
206
|
-
(`eval/loki10/harness.py`, add `LOKI_E10_CASCADE`) as a harness follow-up; it
|
|
207
|
-
was not fixed here (eval-only, no code changes).
|
|
208
|
-
|
|
209
|
-
**Auth incident, not concurrency.** r2 for all three arms was lost in full
|
|
210
|
-
(21/21 rows `auth_unavailable`) and had to be re-run. Cause: `harness.py`'s
|
|
211
|
-
per-row check, `arm_auth(cap + AUTH_MARGIN_S)` = `arm_auth(1020)`, refuses to
|
|
212
|
-
start a row unless the keychain OAuth access token has at least 1020s (17
|
|
213
|
-
min) left. Claude Code does not refresh that token until it is itself close
|
|
214
|
-
to expiry (observed: still only ~415s left immediately after running
|
|
215
|
-
`claude --print` as the operator, i.e. the refresh did not fire early), so
|
|
216
|
-
across a batch of many-minute arm sessions the token's remaining lifetime
|
|
217
|
-
can fall under 1020s well before it actually expires, and every row started
|
|
218
|
-
after that point is refused until the operator's own use of `claude`
|
|
219
|
-
eventually triggers a real refresh. The r1 `pub-werkzeug-3271` miss (last
|
|
220
|
-
task started in each arm) had the same cause; it was retried once
|
|
221
|
-
`arm_auth(1020)` and `arm_auth(3600)` both passed (`expiresAt` about 8h out
|
|
222
|
-
by then). This is an auth-lifecycle fact of the harness/environment, not
|
|
223
|
-
evidence of contention from running 3 arms concurrently (9-12 sessions at
|
|
224
|
-
once, load 2.5-4.7 of a 14-core box throughout). No rate-limit signal (429/
|
|
225
|
-
`rate_limit`/`overloaded`/529) was found in any arm's stdout/stderr logs, or
|
|
226
|
-
in the one apparent hit inside an `arm_stdout.log` (a `seal` receipt hash
|
|
227
|
-
substring, `5963429c...`, a false positive).
|
|
228
|
-
|
|
229
|
-
**Dedupe rule.** Each result file can hold more than one attempt per task
|
|
230
|
-
(an `auth_unavailable`/`interrupted` attempt from a lost run, followed by a
|
|
231
|
-
real attempt after re-running that same r-file's `--out`). Rows are deduped
|
|
232
|
-
to exactly one per (arm, run-file, task): the latest `status: ok` attempt if
|
|
233
|
-
one exists in that run-file, else its latest attempt overall (by `started`,
|
|
234
|
-
falling back to file order). This never collapses across r1/r2/r3, since
|
|
235
|
-
those are separate files/reps, and it matches EV-15's own "pool the real
|
|
236
|
-
rows, one per task per run" method, made explicit here because unlike EV-15
|
|
237
|
-
this run needed retries. Rows dropped by this rule (superseded
|
|
238
|
-
`auth_unavailable`/`interrupted` attempts, all from the r2 auth incident
|
|
239
|
-
above, plus each arm's r1 werkzeug-3271 retry): 22 for default, 15 for
|
|
240
|
-
nowall, 15 for nocascade. Each arm's final pooled table has exactly 21 rows,
|
|
241
|
-
7 tasks times 3 runs, matching `--tasks` times n=3.
|
|
242
|
-
|
|
243
|
-
### Before (raw, carried forward)
|
|
244
|
-
|
|
245
|
-
| source | arm | completed | rate | cost per completed | p50 / p90 |
|
|
246
|
-
|---|---|---|---|---|---|
|
|
247
|
-
| EV-14 (docs/v10/METRICS.md; raw result files lost, METRICS.md entry is the record) | raw `claude -p` | 12/14 | 85.7% | $0.5119 | 70s / 239s |
|
|
248
|
-
| EV-15 (this doc, section 1/4) | raw `claude -p` | 10/14 | 71.4% | $0.5085 | 56s / 104s |
|
|
249
|
-
| EV-15 (this doc, section 1/4) | v10 default knobs | 9/14 | 64.3% | >= $0.788 (corrected lower bound, section 4) | 128s / 330s |
|
|
250
|
-
|
|
251
|
-
### After (E-98f, n=3, 21 task-runs per arm)
|
|
252
|
-
|
|
253
|
-
| arm | completed | rate | cost per completed | null-cost rows | p50 / p90 |
|
|
254
|
-
|---|---|---|---|---|---|
|
|
255
|
-
| default | 15/21 | 71.4% | n/a | 10/21 (lower bound $0.6958) | 209s / 457s |
|
|
256
|
-
| `LOKI_E10_WALL=0` (nowall) | 16/21 | 76.2% | n/a | 2/21 (lower bound $0.786) | 214s / 500s |
|
|
257
|
-
| `LOKI_E10_CASCADE=0` (nocascade) | 15/21 | 71.4% | n/a | 11/21 (lower bound $0.3233, unreliable at this null rate) | 138s / 218s |
|
|
258
|
-
|
|
259
|
-
p50/p90 were measured at up to 12 concurrent arm sessions (3 arms times
|
|
260
|
-
`--parallel 3`, plus single-task retries) against EV-15's 3; not apples to
|
|
261
|
-
apples with the before rows. The decision rule below does not use latency.
|
|
262
|
-
|
|
263
|
-
Null-cost rows persist well above zero in every arm despite E-98e's fix
|
|
264
|
-
being present and firing correctly at the iteration level. Root cause,
|
|
265
|
-
confirmed by reading both files for one null row
|
|
266
|
-
(`e98f-engine/default-r1/pub-werkzeug-3121.../.loki/metrics/`): the killed
|
|
267
|
-
wall iteration's `efficiency/iteration-2.json` does carry a real,
|
|
268
|
-
non-zero `cost_usd` (`0.0628`) from E-98e, but with `"cost_source":
|
|
269
|
-
"partial-stream"`. `eval/loki10/harness.py`'s `provider_cost()` (line
|
|
270
|
-
~698) sums a row's cost only if every one of its iteration files has
|
|
271
|
-
`cost_source == "provider"` exactly; `"partial-stream"` fails that check by
|
|
272
|
-
design, so the entire row's `cost_usd` is `null` even though the money was
|
|
273
|
-
correctly recorded. This is not a bug in E-98e or a bug in the harness
|
|
274
|
-
reading the wrong field; it is the harness's deliberate "only trust a
|
|
275
|
-
provider-reported number" policy colliding with E-98e's necessarily
|
|
276
|
-
estimated number for a killed session, and it fires on any stage kill, not
|
|
277
|
-
only Wall's: nowall's 2 null rows both trace to `implement` itself hitting
|
|
278
|
-
its own stage limit (`stage.failed implement {"reason":"limit"}`), since
|
|
279
|
-
Wall is skipped there and has nothing left to kill. This explains the
|
|
280
|
-
per-arm null counts directionally: default and nocascade run Wall for real
|
|
281
|
-
(more stage-limit kills, more nulls: 10/21 and 11/21) while nowall skips it
|
|
282
|
-
(fewer kills, fewer nulls: 2/21). Cost per completed is therefore `n/a`
|
|
283
|
-
under the harness's own rule (every evaluated row must have a cost) for all
|
|
284
|
-
three arms; the lower bounds above sum only the rows with a `provider`
|
|
285
|
-
cost and likely understate the true figure (see MEDIUM-ANALYSIS section 4's
|
|
286
|
-
own correction of EV-15's lower bound for the same reason). A harness
|
|
287
|
-
follow-up (not made here, eval-only): accept `cost_source in ("provider",
|
|
288
|
-
"partial-stream")` in `provider_cost()`, or report the two sums separately.
|
|
289
|
-
|
|
290
|
-
**Misses**, all three arms: only `pub-werkzeug-3105` (hidden tests failed
|
|
291
|
-
in all 9 of 9 attempts across the three arms) and `pub-werkzeug-3271`
|
|
292
|
-
(missed in 8 of 9: 7 hidden-tests-failed plus 1 no-branch-pushed, that one
|
|
293
|
-
also `hidden_pass: false` so a genuine miss, not EV-15 raw r2's "correct fix
|
|
294
|
-
never pushed" pattern; nowall r3 completed it) -- the same two
|
|
295
|
-
task-difficulty misses EV-15 found shared with raw (section 1). Unlike
|
|
296
|
-
EV-15, `pub-jinja-1413` completed in all 9 attempts across all three arms
|
|
297
|
-
(0 misses): the E-98a/E-98b/E-98c fixes (project interpreter, spec_conflict
|
|
298
|
-
still verifies, append-only existing tests) removed the jinja regression
|
|
299
|
-
that was EV-15's only pure v10-side loss.
|
|
300
|
-
|
|
301
|
-
**Fix-effect counts** (from `events.jsonl`, filtered to the engine slot of
|
|
302
|
-
each `status: ok` row; 21 files per arm):
|
|
303
|
-
|
|
304
|
-
| arm | pytest not_run / total | ruff not_run / total | fix rounds started | runs with >=1 fix round | spec_conflict runs | spec_conflict, verify started | spec_conflict, verify completed |
|
|
305
|
-
|---|---|---|---|---|---|---|---|
|
|
306
|
-
| default | 0/80 | 11/25 | 5 | 3 | 1 | 1 | 1 |
|
|
307
|
-
| nowall | 0/72 | 16/24 | 6 | 5 | 2 | 2 | 1 (1 verify killed at its own limit) |
|
|
308
|
-
| nocascade | 0/58 | 19/22 | 3 | 2 | 1 | 1 | 1 |
|
|
309
|
-
|
|
310
|
-
pytest `not_run` is 0 of 80/72/58 in every arm, and every one of those
|
|
311
|
-
checks ran on the `project` interpreter (0 on `system`): E-98a's interpreter
|
|
312
|
-
resolution holds up at n=21 per arm, and this is the evidence the jinja
|
|
313
|
-
regression's root cause (a test run against the installed package instead
|
|
314
|
-
of `src/`) is closed. ruff `not_run` is high but not a resolution failure:
|
|
315
|
-
every `not_run` reason is "ruff not found on PATH" (genuinely absent from
|
|
316
|
-
that task's own venv, not a wrong-interpreter miss), and every ruff check
|
|
317
|
-
that did find a binary resolved it to the `project` interpreter, same as
|
|
318
|
-
pytest (14 of 25 for default, 8 of 24 nowall, 3 of 22 nocascade). E-98a's
|
|
319
|
-
resolver (commit `cabf16ef`, verify.ts:148) does cover ruff; most task repos
|
|
320
|
-
here simply do not ship ruff in their own environment. Every `spec_conflict`
|
|
321
|
-
implement exit started a real `verify` stage in all three arms (E-98b;
|
|
322
|
-
unlike EV-15's 0 of 5 verify starts). Of the 4 spec_conflict runs, verify
|
|
323
|
-
itself then completed in 3; the 4th (nowall) had verify killed at its own
|
|
324
|
-
limit (`stage.failed verify {"reason":"limit"}`), so "spec_conflict reaching
|
|
325
|
-
verify" in the table below counts verify *starting*, and the completed/
|
|
326
|
-
failed split is called out per arm.
|
|
327
|
-
|
|
328
|
-
### Decision
|
|
329
|
-
|
|
330
|
-
Rule (founder, 2026-09-28): the chosen arm must complete at or above raw's
|
|
331
|
-
best measured medium rate, EV-14's 85.7% (12/14, 18/21 at this n), and its
|
|
332
|
-
cost per completed must be at or below raw's EV-15 $0.5085.
|
|
333
|
-
|
|
334
|
-
| arm | vs EV-14 85.7% (18/21) | vs EV-15 71.4% (15/21) | vs EV-15 $0.5085 |
|
|
335
|
-
|---|---|---|---|
|
|
336
|
-
| default | fails (15/21) | ties exactly (15/21) | fails on its own lower bound ($0.6958); true cost n/a |
|
|
337
|
-
| nowall | fails (16/21) | passes (16/21) | fails on its own lower bound ($0.786); true cost n/a |
|
|
338
|
-
| nocascade | fails (15/21) | ties exactly (15/21) | undetermined: lower bound $0.3233 is below the bar, but 11/21 rows (52%) are uncosted, too many to trust the bound |
|
|
339
|
-
|
|
340
|
-
No arm reaches 18/21 (85.7%): nowall is highest at 16/21 (76.2%), default
|
|
341
|
-
and nocascade both at 15/21 (71.4%, an exact tie with EV-15's raw rate). No
|
|
342
|
-
arm's cost per completed is a clean number under the harness's own rule
|
|
343
|
-
(`n/a` in all three; see the null-cost cause above). **No arm meets the
|
|
344
|
-
founder's rule. `sizing.ts` is left unchanged.**
|
|
345
|
-
|
|
346
|
-
Order: a, b, c, d and e in parallel (their file sets do not overlap), then f. The "after" table for the founder is the E-98f default arm next to section 1 above.
|