loki-mode 10.2.3 → 10.2.5
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/SKILL.md +2 -2
- package/VERSION +1 -1
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/BOARD.md +30 -16
- package/docs/v10/DECISIONS.md +9 -0
- package/docs/v10/GUARDS.md +45 -0
- package/docs/v10/METRICS.md +72 -0
- package/docs/v10/PROGRESS.md +11 -0
- package/docs/v10/SCALE.md +140 -0
- package/loki-ts/dist/loki.js +2 -2
- 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-DFhG92Cn.js → AdminPage-BOESW7uR.js} +1 -1
- package/web-app/dist/assets/{Avatar-BaN7EGuj.js → Avatar-Blm74_mD.js} +1 -1
- package/web-app/dist/assets/{Badge-DZnzjIJo.js → Badge-DdJmac3t.js} +1 -1
- package/web-app/dist/assets/{Button-MZYnOVBG.js → Button-Do43CF5O.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-DzQBvsb8.js → CockpitPage-DEPQn2Xm.js} +1 -1
- package/web-app/dist/assets/{ComparePage-CAmHIRPP.js → ComparePage-Dp4MSpts.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-o2QvQ4d_.js → ErrorBoundary-wTGWFgom.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-DmOwaNre.js → EvidenceReceiptPanel-ChvPQb1U.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-Cydl0IIy.js → GitHubIssuesPanel-uB0MpIb7.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-CChM5Om8.js → GitHubPRsPanel-B9FSjHfu.js} +1 -1
- package/web-app/dist/assets/{HomePage-CFOxMXsF.js → HomePage-CriEbwCE.js} +2 -2
- package/web-app/dist/assets/{LoginPage-C44cZi00.js → LoginPage-DHbNkrh_.js} +1 -1
- package/web-app/dist/assets/{MagicPage-BRGQ6NSI.js → MagicPage-BcpCAml7.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-BQPN9G8L.js → MetricsPage-j75KQpua.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-BlU8ddHI.js → NotFoundPage-CKbUnP7E.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-BuYrPAGP.js → ProjectPage-BjGf-x2u.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-BzYTj-8j.js → ProjectsPage-C3kHhUQ7.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-f9h3dA7D.js → SettingsPage-C1yjVDOm.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-BU6rK8ej.js → ShowcasePage-DhKkDB_5.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-CwuP2OiP.js → SystemSettingsPage-BfAiCemG.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-DNFsXPyM.js → TeamsPage-DGAEPPh1.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-q8ux3W2A.js → TemplatesPage-LvQ3hwuA.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-DcQUB3db.js → TerminalOutput-D8jsFsvX.js} +1 -1
- package/web-app/dist/assets/{activity-d4QLnoyi.js → activity-Hime0DJg.js} +1 -1
- package/web-app/dist/assets/{bell-4v-u0vrS.js → bell-CGbbuRF4.js} +1 -1
- package/web-app/dist/assets/{bot-C4uxmX9f.js → bot-CcTLPQ3e.js} +1 -1
- package/web-app/dist/assets/{check-CgBWZe8A.js → check-BzO3GwoU.js} +1 -1
- package/web-app/dist/assets/{chevron-left-DtMPx0RA.js → chevron-left-BRFaXiHd.js} +1 -1
- package/web-app/dist/assets/{circle-alert-BiSHrM_W.js → circle-alert-DDl3SqIA.js} +1 -1
- package/web-app/dist/assets/{clock-Cq-mFxyF.js → clock-CK7f8Yqa.js} +1 -1
- package/web-app/dist/assets/{cloud-uqCCEZZa.js → cloud-CbMCeoxr.js} +1 -1
- package/web-app/dist/assets/{code-xml-B5xZdDgW.js → code-xml-BpwdRqwP.js} +1 -1
- package/web-app/dist/assets/{database-CJdb8rSH.js → database-B4JofR5i.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-DHjQV_dH.js → dollar-sign-D3Uo_9Me.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-Cv17T-CO.js → file-code-corner-DWrhbnIl.js} +1 -1
- package/web-app/dist/assets/{file-plus-LF55st4A.js → file-plus-Bob-tb45.js} +1 -1
- package/web-app/dist/assets/{globe-C9IPv9Tq.js → globe-uJN2j0RG.js} +1 -1
- package/web-app/dist/assets/{hammer-CsRLx8hJ.js → hammer-DHg-1oSy.js} +1 -1
- package/web-app/dist/assets/{index-BPsP7cdU.js → index-NHr7F-mq.js} +2 -2
- package/web-app/dist/assets/{layers-DnqW4HpN.js → layers-CsbGfI1E.js} +1 -1
- package/web-app/dist/assets/{loader-circle-DjNTgrBx.js → loader-circle-C8iaLvST.js} +1 -1
- package/web-app/dist/assets/{lock-C3ZH5M8d.js → lock-B2ZA5xyD.js} +1 -1
- package/web-app/dist/assets/{package-BHCe5yRh.js → package-BIe5yA3N.js} +1 -1
- package/web-app/dist/assets/{plus-CdGL1V_Q.js → plus-Dutu3zwz.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-CWT--pRE.js → refresh-cw-DAodka-p.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-CvAgsMSd.js → rotate-ccw-BD6KP_Vv.js} +1 -1
- package/web-app/dist/assets/{scroll-text-Crlzhy1S.js → scroll-text-YKA_5gyw.js} +1 -1
- package/web-app/dist/assets/{server-IG5gUEky.js → server-C21dybST.js} +1 -1
- package/web-app/dist/assets/{shield-alert-lS1d1LBq.js → shield-alert-C70DSrSH.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-C4l0Ux9R.js → thumbs-up-Cc2gHDZ9.js} +1 -1
- package/web-app/dist/assets/{trash-2-yxfZkkUB.js → trash-2-Ch7SIljf.js} +1 -1
- package/web-app/dist/assets/{trending-down-BfzU3vFC.js → trending-down-Ssp5wdTa.js} +1 -1
- package/web-app/dist/assets/{trending-up-CZkEsQJx.js → trending-up-BnDZm4bU.js} +1 -1
- package/web-app/dist/assets/{upload-CuD3yJxp.js → upload-DtQjXwrK.js} +1 -1
- package/web-app/dist/assets/{usePolling-DQ25B_UE.js → usePolling-7rvTmkii.js} +1 -1
- package/web-app/dist/assets/{user-DPelMMuE.js → user-4s1moXeZ.js} +1 -1
- package/web-app/dist/index.html +1 -1
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: Autonomous spec-driven build system with a built-in trust layer. It does not call work done until it is verified (RARV-C closure loop, 8 quality gates, completion council, verified-completion evidence gate). Triggers on "Loki Mode". Takes a spec (PRD, GitHub issue, OpenAPI doc, etc.) to deployed product with minimal human intervention. Provider-agnostic. Requires --dangerously-skip-permissions flag.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v10.2.
|
|
6
|
+
# Loki Mode v10.2.5
|
|
7
7
|
|
|
8
8
|
**You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
|
|
9
9
|
|
|
@@ -470,4 +470,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
470
470
|
|
|
471
471
|
---
|
|
472
472
|
|
|
473
|
-
**v10.2.
|
|
473
|
+
**v10.2.5 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
10.2.
|
|
1
|
+
10.2.5
|
package/dashboard/__init__.py
CHANGED
package/docs/INSTALLATION.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
|
|
4
4
|
|
|
5
|
-
**Version:** v10.2.
|
|
5
|
+
**Version:** v10.2.5
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
package/docs/v10/BOARD.md
CHANGED
|
@@ -358,14 +358,14 @@ set is declared to avoid overlap with those and with each other.
|
|
|
358
358
|
| M-04 | Java graph via jdeps, import-scan fallback recorded | loki-ts/src/engine10/modernize/lang/java.ts, loki-ts/tests/engine10/modernize/java_graph.test.ts, loki-ts/tests/engine10/modernize/fixtures/java8/ | MEDIUM | cd loki-ts && bun test tests/engine10/modernize/java_graph.test.ts | released@2026-09-28T16:03Z | Source: MODERNIZE.md (D30). Depends on M-02. Wave E18, based on the M-02 branch, branch slice-M-04-java-graph. TL REJECT: wildcard and static imports silently dropped in the import-scan fallback. Rework wave E19. Rework r2 7713ad9b (branch slice-M-04-r2). TL REJECT (reproduced): an unresolved wildcard whose package has no local files is dropped silently (java.ts importScanGraph). Next: rework. Wave E21 (wf_39ab3f7d-8f3). r3. Rework r3 771ff0a0 TL APPROVE; merged into train E22 (9042e964): `bun test tests/engine10/` 547 pass 0 fail, tsc 0, `bash tests/test-v10-pulse.sh` 107 passed, `bash eval/loki10/test-harness.sh` 108 passed. Released in v10.2.1 (npm publish 2026-09-28T16:03Z; every cited commit is an ancestor of the v10.2.1 tag; `git merge-base --is-ancestor`). |
|
|
359
359
|
| M-05 | SCC clustering, 1,500-line unit cap, topological waves | loki-ts/src/engine10/modernize/cluster.ts, loki-ts/tests/engine10/modernize/cluster.test.ts | MEDIUM | cd loki-ts && bun test tests/engine10/modernize/cluster.test.ts | released@2026-09-28T05:00Z | Source: MODERNIZE.md (D30). Depends on M-02. Built on branch worktree-wf_4601e7b3-4d8-4 (777f6cdd M-01, 212a7404 M-02, 6b00c05c M-05, 3d8edb5d M-06). TL CONCERN: cluster.ts tarjanSCC recursion overflows the stack on dependency chains of about 20-50k nodes (the M-28/M-29 scale); needs an iterative SCC. Wave E18 rework: iterative Tarjan, branch slice-M-05-iterative-scc. TL APPROVE (sonnet): iterative Tarjan 372ebe11, red on recursive (RangeError), 2000/2000 fuzz identical; merged f4d98c0b, `bun test tests/engine10/modernize/` 28 pass 0 fail. Released in v10.1.0 (npm publish 2026-09-28T05:00Z; every cited commit is an ancestor of the v10.1.0 tag; `git merge-base --is-ancestor`). |
|
|
360
360
|
| M-06 | Up-front estimate (cost, time, risk), --budget math, --dry-run print | loki-ts/src/engine10/modernize/estimate.ts, loki-ts/tests/engine10/modernize/estimate.test.ts | LOW | cd loki-ts && bun test tests/engine10/modernize/estimate.test.ts | released@2026-09-28T05:00Z | Source: MODERNIZE.md (D30). Depends on M-05. Built on branch worktree-wf_4601e7b3-4d8-4 (777f6cdd M-01, 212a7404 M-02, 6b00c05c M-05, 3d8edb5d M-06). TL CONCERN: cluster.ts tarjanSCC recursion overflows the stack on dependency chains of about 20-50k nodes (the M-28/M-29 scale); needs an iterative SCC. Wave E18 with M-05, branch slice-M-05-iterative-scc. Merged f4d98c0b with M-05. Released in v10.1.0 (npm publish 2026-09-28T05:00Z; every cited commit is an ancestor of the v10.1.0 tag; `git merge-base --is-ancestor`). |
|
|
361
|
-
| M-07 | modernize CLI and flag parsing; TABLE route in engine10 cli | loki-ts/src/engine10/modernize/cli.ts, loki-ts/src/engine10/cli.ts (TABLE and USAGE line only), loki-ts/tests/engine10/modernize/cli.test.ts | MEDIUM | cd loki-ts && bun test tests/engine10/modernize/cli.test.ts |
|
|
361
|
+
| M-07 | modernize CLI and flag parsing; TABLE route in engine10 cli | loki-ts/src/engine10/modernize/cli.ts, loki-ts/src/engine10/cli.ts (TABLE and USAGE line only), loki-ts/tests/engine10/modernize/cli.test.ts | MEDIUM | cd loki-ts && bun test tests/engine10/modernize/cli.test.ts | building@2026-09-28T17:30Z | Source: MODERNIZE.md (D30). Depends on M-06, E-31 merged or parked. Wave E21 (wf_39ab3f7d-8f3). TL APPROVE of 13848b53, but merged after E-66/E-61/M-24 core reads exactly 5,000 (cap is under 5,000). Next: net core delta at most -1 (offset in cli.ts or dead core code), then merge. r2 TL REJECT (reproduced): modernize/cli.ts TABLE-routed but not in registry.ts (registry.test.ts red when merged); report claimed 40/0 but 39/1; --help lost its modernize line. Next: register it, keep the USAGE line, offset core elsewhere. Wave E26 (wf_9ba5fcaf-75a). Round 4. |
|
|
362
362
|
| M-08 | bin/loki modernize arm to engine10 regardless of default | bin/loki (modernize arm only), tests/test-modernize-dispatch.sh | MEDIUM | bash tests/test-modernize-dispatch.sh | ready@2026-09-28T02:45Z | Source: MODERNIZE.md (D30). Depends on M-07. |
|
|
363
363
|
| M-09 | py2/3 capture tracer with type-tagged JSON and branch coverage | autonomy/lib/modernize/py_capture.py, tests/test-modernize-py-capture.sh, tests/fixtures/modernize/py2/ | HIGH | bash tests/test-modernize-py-capture.sh | released@2026-09-28T14:26Z | Source: MODERNIZE.md (D30). Depends on M-01. Built a4fbf034 (branch worktree-wf_4601e7b3-4d8-5). Opus REJECT (reproduced): unsupported types (sets, Decimal, datetime, bytearray, custom classes) record as equal with no not_proven entry, so the oracle could certify unproven equivalence. Next: rework. Wave E18 rework: unsupported types yield not_proven, branch slice-M-09-not-proven-types. Opus REJECT of 3594eee5: subclasses of supported types (namedtuple, IntEnum, OrderedDict) tag as the base type with no not_proven. Rework wave E19. Rework 085bc2e0 Opus APPROVE; merged b8d40a34; `bash tests/test-modernize-py-capture.sh` Passed 50 Failed 0 Skipped 1 (no python2). Released in v10.1.1 (npm publish 2026-09-28T14:26Z; every cited commit is an ancestor of the v10.1.1 tag; `git merge-base --is-ancestor`). |
|
|
364
364
|
| M-10 | Coverage-guided input search (read-only session, plateau stop) | loki-ts/src/engine10/modernize/oracle/search.ts, loki-ts/tests/engine10/modernize/search.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/search.test.ts | merged@2026-09-28T17:20Z | Source: MODERNIZE.md (D30). Depends on M-09. Opus REJECT (reproduced): a failed seed capture is reported as a plateau. Next: rework. r2 d7db4fb1 Opus APPROVE; merged dc827b80 (on top of v10.2.2): full `cd loki-ts && bun test` 2277 pass 0 fail, `bash tests/test-engine10-dist.sh` 18 passed, `bash tests/test-v10-pulse.sh` 117 passed. |
|
|
365
|
-
| M-11 | Java capture: JUnit under JDK 8 with JaCoCo plus Randoop | autonomy/lib/modernize/java_capture.sh, loki-ts/src/engine10/modernize/oracle/java.ts, loki-ts/tests/engine10/modernize/java_capture.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/java_capture.test.ts |
|
|
365
|
+
| M-11 | Java capture: JUnit under JDK 8 with JaCoCo plus Randoop | autonomy/lib/modernize/java_capture.sh, loki-ts/src/engine10/modernize/oracle/java.ts, loki-ts/tests/engine10/modernize/java_capture.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/java_capture.test.ts | building@2026-09-28T17:30Z | Source: MODERNIZE.md (D30). Depends on M-04. Opus REJECT (reproduced): multi-line java -version breaks status.json (json_escape skips newlines). Next: rework. Wave E26 (wf_9ba5fcaf-75a). Round 3. |
|
|
366
366
|
| M-12 | Oracle seal, held-out split, 80% floor, up-front NOT PROVEN | loki-ts/src/engine10/modernize/oracle/seal.ts, loki-ts/tests/engine10/modernize/oracle_seal.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/oracle_seal.test.ts | merged@2026-09-28T17:20Z | Source: MODERNIZE.md (D30). Depends on M-09. Opus REJECT (reproduced): delete-and-reseal defeats tamper evidence (hashes stored beside the data). Next: rework. r2 d9026ec6 Opus APPROVE (reseal refused via the append-only log); merged dc827b80 (on top of v10.2.2): full `cd loki-ts && bun test` 2277 pass 0 fail, `bash tests/test-engine10-dist.sh` 18 passed, `bash tests/test-v10-pulse.sh` 117 passed. |
|
|
367
|
-
| M-13 | Equivalence checker with sealed normalizers and contract output | loki-ts/src/engine10/modernize/equiv.ts, loki-ts/tests/engine10/modernize/equiv.test.ts, loki-ts/tests/engine10/modernize/fixtures/equiv/ | HIGH | cd loki-ts && bun test tests/engine10/modernize/equiv.test.ts |
|
|
368
|
-
| M-14 | Wall pre-sealed mode: oracle plus conformance, green base is an error | loki-ts/src/engine10/stages/wall.ts (pre-sealed branch only), loki-ts/tests/engine10/modernize/wall_presealed.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/wall_presealed.test.ts |
|
|
367
|
+
| M-13 | Equivalence checker with sealed normalizers and contract output | loki-ts/src/engine10/modernize/equiv.ts, loki-ts/tests/engine10/modernize/equiv.test.ts, loki-ts/tests/engine10/modernize/fixtures/equiv/ | HIGH | cd loki-ts && bun test tests/engine10/modernize/equiv.test.ts | building@2026-09-28T17:30Z | Source: MODERNIZE.md (D30). Depends on M-12. Wave E27 (wf_bcacb1d1-e76). |
|
|
368
|
+
| M-14 | Wall pre-sealed mode: oracle plus conformance, green base is an error | loki-ts/src/engine10/stages/wall.ts (pre-sealed branch only), loki-ts/tests/engine10/modernize/wall_presealed.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/wall_presealed.test.ts | building@2026-09-28T17:30Z | Source: MODERNIZE.md (D30). Depends on M-12, E-54. D33: states its net core line delta; core must stay under 5,000 (92 lines of headroom shared by E-67, E-66, E-61, M-14, merge order E-67, E-66, E-61); offset any excess by deleting dead core code. Wave E27 (wf_bcacb1d1-e76). |
|
|
369
369
|
| M-15 | Unit runner: card to v10 run with oracle Wall and equiv check | loki-ts/src/engine10/modernize/unit.ts, loki-ts/tests/engine10/modernize/unit.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/unit.test.ts | ready@2026-09-28T02:45Z | Source: MODERNIZE.md (D30). Depends on M-13, M-14. |
|
|
370
370
|
| M-16 | Deterministic codemods first (futurize, OpenRewrite) or skipped | loki-ts/src/engine10/modernize/codemod.ts, loki-ts/tests/engine10/modernize/codemod.test.ts | MEDIUM | cd loki-ts && bun test tests/engine10/modernize/codemod.test.ts | released@2026-09-28T16:03Z | Source: MODERNIZE.md (D30). Depends on M-02. Built 0a8bbe6c (branch slice-M-16-codemods); TL review died on the 04:48Z access outage. Wave E21 (wf_39ab3f7d-8f3). TL review. TL APPROVE of 0a8bbe6c; merged into train E22 (9042e964): `bun test tests/engine10/` 547 pass 0 fail, tsc 0, `bash tests/test-v10-pulse.sh` 107 passed, `bash eval/loki10/test-harness.sh` 108 passed. Released in v10.2.1 (npm publish 2026-09-28T16:03Z; every cited commit is an ancestor of the v10.2.1 tag; `git merge-base --is-ancestor`). |
|
|
371
371
|
| M-17 | Scheduler: N workers, worktrees, cascade, best-of-2, budget stop | loki-ts/src/engine10/modernize/scheduler.ts, loki-ts/tests/engine10/modernize/scheduler.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/scheduler.test.ts | ready@2026-09-28T02:45Z | Source: MODERNIZE.md (D30). Depends on M-15. |
|
|
@@ -384,7 +384,7 @@ set is declared to avoid overlap with those and with each other.
|
|
|
384
384
|
| M-30 | User docs for loki modernize, no dashes, commands match USAGE | docs/v10/GUIDE-MODERNIZE.md, tests/test-modernize-docs.sh | LOW | bash tests/test-modernize-docs.sh | ready@2026-09-28T02:45Z | Source: MODERNIZE.md (D30). Depends on M-07. |
|
|
385
385
|
| E-66 | "Already implemented" outcome: evidence search in code, tests, docs, CHANGELOG; no change needed verdict, receipt, issue comment, no PR | loki-ts/src/engine10 (intake or plan, implement marker path, seal, pr) | HIGH | fixture with the feature ends no change needed, no implement session; fixture without proceeds | released@2026-09-28T16:03Z | Source: D32 (augmentiq #52). Opus REJECT (reproduced): no test that ALREADY_SATISFIED opens no PR; evidence search matched 652 hits for an unrelated task on this repo; confirmation need not cite files. Rework dispatched. Rework 1c7e1b09 (branch worktree-wf_b707f4ab-24f-1): all 3 blockers fixed (no-PR test F5, 0 hits for both review sentences on this repo, citation must name an existing code or test hit; evidence in receipt). Opus CONCERN: the real-repo test uses listRepoFiles capped at 2000 of 4784 files, so removing STOP_WORDS still passes; the existsSync branch of the citation check is untested. Next: small fix (full file list in that test, one existsSync test). Wave E18 small fix (uncapped file list, existsSync test), branch slice-E-66-test-fixes. Opus APPROVE of 0a64ea98 (uncapped list, existsSync test). Merge onto main conflicts in seal.ts, supervisor.ts, types.ts, rule_of_two.test.ts after E-68/E-69; rebase dispatched (wave E19). D33: states its net core line delta; core must stay under 5,000 (92 lines of headroom shared by E-67, E-66, E-61, M-14, merge order E-67, E-66, E-61); offset any excess by deleting dead core code. Rework 135ba06b Opus APPROVE, but merged it takes core to 5,189 (D33 cap 5,000; `bun test tests/engine10/budget.test.ts`). Not merged. Next: offset about 190 core lines in the same slice (dead or duplicated core code), then merge. Wave E21 (wf_39ab3f7d-8f3). r3: D33 offset. Rework r3 605f33b0 Opus APPROVE (core under 5,000 after offset); merged into train E22 (9042e964): `bun test tests/engine10/` 547 pass 0 fail, tsc 0, `bash tests/test-v10-pulse.sh` 107 passed, `bash eval/loki10/test-harness.sh` 108 passed. Released in v10.2.1 (npm publish 2026-09-28T16:03Z; every cited commit is an ancestor of the v10.2.1 tag; `git merge-base --is-ancestor`). |
|
|
386
386
|
| EV-13 | Eval expected_outcome no_change_needed; aiq-52 set to it | eval/loki10/harness.py, eval/loki10/tasks/aiq-52-searchbar, test-harness.sh | HIGH | bash eval/loki10/test-harness.sh | released@2026-09-28T05:00Z | Source: D32. Opus CONCERN: a correct v10 no-change run on aiq-52 is graded as a source change. Rework dispatched. Rework APPROVE (branch worktree-wf_b707f4ab-24f-5: 19224201, e0264724): v10 Wall side effect excluded from the diff check. Not merged yet. Merged c9c15f38 (trainE18); `bash eval/loki10/test-harness.sh` 103 passed 0 failed. Released in v10.1.0 (npm publish 2026-09-28T05:00Z; every cited commit is an ancestor of the v10.1.0 tag; `git merge-base --is-ancestor`). |
|
|
387
|
-
| E-67 | No pause state: unfinishable runs end as a draft PR or an issue comment with the reason within the cap; stdin never read | loki-ts/src/engine10 (machine, supervisor, worker, escalate, session) | HIGH | a stub provider that asks for input ends within the cap with a draft-PR or comment argv |
|
|
387
|
+
| E-67 | No pause state: unfinishable runs end as a draft PR or an issue comment with the reason within the cap; stdin never read | loki-ts/src/engine10 (machine, supervisor, worker, escalate, session) | HIGH | a stub provider that asks for input ends within the cap with a draft-PR or comment argv | building@2026-09-28T17:30Z | Source: D32. Opus REJECT (reproduced): a hung worker ended FAILED with no draft PR and no comment, after the cap. Rework dispatched. Rework ba679f4e (branch worktree-wf_b707f4ab-24f-2). Opus REJECT: at the default cap the supervisor backstop fires before the worker cap can seal; concern: the diff check misses untracked files and uncommitted work never reaches a PR. Next: rework. Held, no builder since 03:20Z (row was stale, not running). Dispatch after E-61 (session.ts) and the E-66 rebase (supervisor.ts) merge, from rework ba679f4e plus the Opus findings above. D33: states its net core line delta; core must stay under 5,000 (92 lines of headroom shared by E-67, E-66, E-61, M-14, merge order E-67, E-66, E-61); offset any excess by deleting dead core code. D33 update 14:50Z: E-66 and E-61 merged first, core is 4,998 (1 line of headroom); E-67 must be net core negative. r3 Opus REJECT (reproduced): backstopMs = max(0, capS-30)*1000 is 0 when capS <= 30, so the worker is killed at spawn. Next: rework. Wave E26 (wf_9ba5fcaf-75a). Round 5. |
|
|
388
388
|
| E-68 | Per-call deadline at the stage limit, progress every 30s, every exit code classified (125, 143 included), never "cause not classified" | loki-ts/src/engine10/session.ts, failures.ts | HIGH | per-code tests plus a grep test | released@2026-09-28T05:00Z | Source: D32. Opus REJECT (reproduced): a real limit kill reports "exit 143 (SIGTERM)" because the session child traps SIGTERM; the stub test missed it. Rework dispatched. Rework APPROVE (branch worktree-wf_b707f4ab-24f-3: 4dd05bf9, 922bd923): a limit kill is classified from the engine, not the child exit code. Not merged yet. Merged c9c15f38 (trainE18); engine10 `bun test tests/engine10/` 444 pass 0 fail. Released in v10.1.0 (npm publish 2026-09-28T05:00Z; every cited commit is an ancestor of the v10.1.0 tag; `git merge-base --is-ancestor`). |
|
|
389
389
|
| E-69 | Cost shows "not measured" (or partial), never $0 when unmeasured | output.ts, pr_body.ts, seal.ts, status.ts, dashboard/page.ts, cost.ts | MEDIUM | output and receipt tests for measured, partial, unmeasured | released@2026-09-28T05:00Z | Source: D32 (EV-8 printed $0.00 with 0 tokens). TL CONCERN: genuine-zero test never exercises it; partialCost bypasses the tamper guard; dashboard lacks the partial detail. Rework dispatched. Rework APPROVE (branch worktree-wf_b707f4ab-24f-4: b9825c4c, f42a2aee, 5c66dc55). Not merged yet. Merged c9c15f38 (trainE18); engine10 `bun test tests/engine10/` 444 pass 0 fail. Released in v10.1.0 (npm publish 2026-09-28T05:00Z; every cited commit is an ancestor of the v10.1.0 tag; `git merge-base --is-ancestor`). |
|
|
390
390
|
| E-70 | Dashboard shows its and the CLI's version, warns on mismatch; loki dashboard replaces an older Loki dashboard on its port, leaves a non-Loki listener alone | loki-ts/src/engine10/dashboard/ | MEDIUM | version, mismatch, replace and refuse tests | approved@2026-09-28T02:40Z | Source: D32. Built 1397a1f8, TL APPROVE. Merges in the next train. |
|
|
@@ -395,7 +395,7 @@ set is declared to avoid overlap with those and with each other.
|
|
|
395
395
|
| E-75 | Pulse main-CI check never reads UNKNOWN for a completed Tests run: fall back to `gh run list --commit <sha> --workflow Tests` when the cached check fails, and report RED with the run id | scripts/v10-pulse.sh (main CI check only), tests/test-v10-pulse.sh | MEDIUM | bash tests/test-v10-pulse.sh; a stubbed gh whose check call fails but whose run list says failure yields CI_RED, not UNKNOWN | released@2026-09-28T16:03Z | Source: main red at 5404b0c6, e26bf52b, 983dda58 (Tests run 36377688703) while the pulse printed Main CI UNKNOWN each turn. Wave E21 (wf_39ab3f7d-8f3). TL APPROVE of 8e989837; merged into train E22 (9042e964): `bun test tests/engine10/` 547 pass 0 fail, tsc 0, `bash tests/test-v10-pulse.sh` 107 passed, `bash eval/loki10/test-harness.sh` 108 passed. Released in v10.2.1 (npm publish 2026-09-28T16:03Z; every cited commit is an ancestor of the v10.2.1 tag; `git merge-base --is-ancestor`). |
|
|
396
396
|
| E-76 | Split the engine10 budget test per D33: core under 5,000, modernize/ under 4,000, core never imports modernize | loki-ts/tests/engine10/budget.test.ts | LOW | cd loki-ts && bun test tests/engine10/budget.test.ts; core limit 4900 turns test 1 red | released@2026-09-28T05:00Z | Source: D33 (CTO). Main red since 5404b0c6 on the combined 5,288 count. TL APPROVE (sonnet) on 797705bc: `bun test tests/engine10/budget.test.ts` 3 pass exit 0, core 4907, modernize 381, core limit 4900 goes red; merged 84fbf9b4, full `bun test tests/engine10/` 474 pass 0 fail. Released in v10.1.0 (npm publish 2026-09-28T05:00Z; every cited commit is an ancestor of the v10.1.0 tag; `git merge-base --is-ancestor`). |
|
|
397
397
|
| E-77 | Pulse SESSION_STALLED violation: no assistant turn for more than 20 minutes while the /loop is active (armed wakeup or live workflow), reading the newest session transcript mtime | scripts/v10-pulse.sh (one new check), tests/test-v10-pulse.sh | MEDIUM | bash tests/test-v10-pulse.sh; a fixture transcript 25 minutes old with an active-loop marker yields SESSION_STALLED, 10 minutes old does not, no marker does not | released@2026-09-28T16:03Z | Source: founder 14:00Z; session stalled 04:48Z to about 14:00Z on "organization has disabled Claude subscription access", pulse raised nothing. Wave E21 (wf_39ab3f7d-8f3). TL APPROVE of 409adb68; merged into train E22 (9042e964): `bun test tests/engine10/` 547 pass 0 fail, tsc 0, `bash tests/test-v10-pulse.sh` 107 passed, `bash eval/loki10/test-harness.sh` 108 passed. Marker .loki/state/loop-active. Released in v10.2.1 (npm publish 2026-09-28T16:03Z; every cited commit is an ancestor of the v10.2.1 tag; `git merge-base --is-ancestor`). |
|
|
398
|
-
| EV-14 | v10 against raw on the medium and large tiers (same model, same tasks, both arms), gate table per tier for the default-flip decision (E-31) | eval/loki10 results, docs/v10/METRICS.md (one section) | HIGH | eval/loki10/run.sh per tier for arms raw and v10; every task has a row in both arms, none arm_unavailable; METRICS.md table cites the result files |
|
|
398
|
+
| EV-14 | v10 against raw on the medium and large tiers (same model, same tasks, both arms), gate table per tier for the default-flip decision (E-31) | eval/loki10 results, docs/v10/METRICS.md (one section) | HIGH | eval/loki10/run.sh per tier for arms raw and v10; every task has a row in both arms, none arm_unavailable; METRICS.md table cites the result files | merged@2026-09-28T18:00Z | Source: founder priority 14:00Z (flip v10 to default once it beats raw on the measured tiers). Depends on EV-11 and EV-12 merged; paid run, one tier at a time. D34: may run on 5 real large tasks, 2 runs per arm; flip only if v10 is at or better than raw on completions, cost per completed and p50. D38: runs now on medium (small already measured), 2 runs per arm; claim limited to small plus medium, medium labelled not shortcut audited. Wave E25 (wf_46137a6b-367). Medium measurement running. Medium measured (0afef9e4, harness at 8f2179cd, claude-opus-5-5, 7 tasks x 2 runs): raw 12/14 (85.7%), $0.5119 per completed, p50 70s; v10 10/14 (71.4%), $0.5395, p50 83s. v10 worse on all three axes; default stays legacy (D38). Result files lost in the 17:36Z worktree incident; EV-15 re-runs with persisted results. |
|
|
399
399
|
| E-78 | v10-guard also blocks moving main without a checkout: `git branch -f main`, `git update-ref refs/heads/main` and `git checkout -B main` | scripts/v10-guard.sh (RULE2 only), tests/test-v10-guard.sh | MEDIUM | bash tests/test-v10-guard.sh; each spelling is refused while on another branch, `git branch -f other` still allowed | released@2026-09-28T16:03Z | Source: 14:12Z the Chief of Staff realigned local main with `git branch -f main origin/main` after RULE2 refused `git reset --hard`; the guard did not see it (harmless there: only an unpushed local merge was dropped, work kept on slice-E-66-r2). First build CONCERN (sonnet TL): update-ref check matches refs/heads/main anywhere in the args, blocking `git update-ref refs/heads/other refs/heads/main`. Next: match the target ref position only. r2 b6e5b389 TL APPROVE; `bash tests/test-v10-guard.sh` ALL TESTS PASSED. Released in v10.2.1 (npm publish 2026-09-28T16:03Z; every cited commit is an ancestor of the v10.2.1 tag; `git merge-base --is-ancestor`). |
|
|
400
400
|
| E-79 | Pulse LOW_READY counts M-NN rows whose Depends-on slices are all merged or released as ready, and names the ones blocked by dependencies | scripts/v10-pulse.sh (ready count only), tests/test-v10-pulse.sh | LOW | bash tests/test-v10-pulse.sh; an M row ready with deps merged counts, one with an unmerged dep does not | merged@2026-09-28T17:20Z | Source: pulse reported 3 to 4 ready while M-08, M-30 and other M rows were ready (14:12Z). E-79..E-81 branch REJECT (reproduced): widening ID_RE makes M rows visible, so IDLE_BUILDERS names dependency-blocked M rows as dispatch targets. Next: IDLE_BUILDERS reuses LOW_READY dependency filter. branch slice-E-79-81-r2 TL APPROVE; merged dc827b80 (on top of v10.2.2): full `cd loki-ts && bun test` 2277 pass 0 fail, `bash tests/test-engine10-dist.sh` 18 passed, `bash tests/test-v10-pulse.sh` 117 passed. |
|
|
401
401
|
| E-80 | Pulse PROGRESS.md age never negative: parse the entry timestamp as UTC and clamp future timestamps to a FUTURE_TIMESTAMP note | scripts/v10-pulse.sh (PROGRESS age only), tests/test-v10-pulse.sh | LOW | bash tests/test-v10-pulse.sh; an entry stamped 10 minutes ahead reads a note, not "-10 min ago" | merged@2026-09-28T17:20Z | Source: pulse printed "PROGRESS.md last entry: -6 min ago" at 04:39Z. branch slice-E-79-81-r2 TL APPROVE; merged dc827b80 (on top of v10.2.2): full `cd loki-ts && bun test` 2277 pass 0 fail, `bash tests/test-engine10-dist.sh` 18 passed, `bash tests/test-v10-pulse.sh` 117 passed. |
|
|
@@ -408,21 +408,35 @@ set is declared to avoid overlap with those and with each other.
|
|
|
408
408
|
| EV-12D | INDEX.md large rows and counts; synthetic lg-* noted rejected (D34), legacy moved to M-27 | eval/loki10/tasks/INDEX.md | LOW | measure-size rc=0 over all tiers; large count at least 5 on main; validate rc=0 | ready@2026-09-28T14:55Z | Source: D34. Depends on EV-12S, EV-12A, EV-12B, EV-12C. |
|
|
409
409
|
| E-83 | P0 fix-forward: main Tests red on 9d483688 (run 36438012977): modernize codemod spawn without env (spawn env guard) and the prStage bundle marker deleted by the E-66 line offset (dist test) | loki-ts/src/engine10/modernize/codemod.ts, loki-ts/src/engine10/stages/pr.ts | HIGH | `bun test tests/runner/spawn_env_guard.test.ts`; `bash tests/test-engine10-dist.sh` | released@2026-09-28T16:03Z | TL APPROVE (sonnet) on 10391f4a, both reverts reproduce red; merged c5ace6e1: full `cd loki-ts && bun test` 2239 pass 0 fail, dist test 18 passed 0 failed, core 4,999. Released in v10.2.1 (npm publish 2026-09-28T16:03Z; every cited commit is an ancestor of the v10.2.1 tag; `git merge-base --is-ancestor`). |
|
|
410
410
|
| E-84 | Pulse TRAIN_LATE reads the last train push from the reflog of refs/remotes/origin/main (moves on every push and on fetches of others' pushes), then push-*.log, then UNKNOWN | scripts/v10-pulse.sh (last_train_push_epoch only), tests/test-v10-pulse.sh | MEDIUM | bash tests/test-v10-pulse.sh; fixture: temp repo plus bare remote, a real `git push` makes the check read under 1 min with no push-*.log present; no reflog and no logs reads UNKNOWN | released@2026-09-28T16:03Z | Source: founder 15:09Z; TRAIN_LATE read 681.9 min while trains were pushed at 14:42Z and later, because plain `git push` writes no push-*.log. TL APPROVE (sonnet) on eeace3f6: `bash tests/test-v10-pulse.sh` 109 passed 0 failed; against the old pulse 106 passed 3 failed; live pulse after merge reads "Minutes since last train push: 12.1". Released in v10.2.1 (npm publish 2026-09-28T16:03Z; every cited commit is an ancestor of the v10.2.1 tag; `git merge-base --is-ancestor`). |
|
|
411
|
-
| E-85 | Security Audit: a narrowly scoped gitleaks allow rule for 40-hex commit pins in eval task.json (repo.ref, merge_sha) so pinned upstream SHAs stop tripping sourcegraph-access-token; CTO approval required (posture: no blanket suppressions) | .gitleaks.toml (or the workflow config), .github/workflows/security-audit.yml | HIGH | a fixture task.json with a 40-hex ref passes; the same string in any other file or key still fails |
|
|
411
|
+
| E-85 | Security Audit: a narrowly scoped gitleaks allow rule for 40-hex commit pins in eval task.json (repo.ref, merge_sha) so pinned upstream SHAs stop tripping sourcegraph-access-token; CTO approval required (posture: no blanket suppressions) | .gitleaks.toml (or the workflow config), .github/workflows/security-audit.yml | HIGH | a fixture task.json with a 40-hex ref passes; the same string in any other file or key still fails | building@2026-09-28T17:30Z | Source: v10.2.0 Release 36440534050 blocked by a pinned werkzeug SHA; EV-11b and EV-12A/B/C add more pins. Wave E27 (wf_bcacb1d1-e76). CTO-level opus review. |
|
|
412
412
|
| DEP-01 | Dependency inventory (D35): docs/v10/DEPS.md lists every manifest (all package.json incl. @anthropic-ai/sdk and claude-agent-sdk; every requirements*.txt and pyproject.toml; every uses: in .github/workflows and .github/actions; Node, Python, Bun matrices; Docker bases, Helm images, Terraform providers, Homebrew formula) with current and latest stable, patch/minor/MAJOR, and runtime EOL; no upgrades | docs/v10/DEPS.md, scripts/dep-inventory.py | LOW | python3 scripts/dep-inventory.py regenerates DEPS.md byte-identically on a second run (network results cached); every manifest found by `git ls-files` appears | released@2026-09-28T17:16Z | Source: founder directive 15:20Z (D35). DEP workstream: max 3 builders, never ahead of E/EV/M. Round 3 2794574b TL APPROVE (sonnet) after two REJECT rounds (bump column mismatch, Node 20 claim, 0.x class, Helm drift; then a missing helm/loki-mode chart and unverified floating tags); `bash tests/test-dep-inventory.sh` 5/5, `--self-test` 23/23. Released in v10.2.2 (npm gitHead 9a59750d). |
|
|
413
|
-
| E-87 | Release dispatch path: required-ci also accepts a completed workflow_dispatch Security Audit run at the exact SHA (Tests and Bun Parity stay push-only), so a tree whose VERSION is already bumped can publish after an audit fix | .github/workflows/release.yml (required-ci only), a test that runs the extracted step against a fixture run list | HIGH | fixture: dispatched audit success at the SHA counts; a dispatched audit at another SHA does not; Tests via dispatch still does not |
|
|
414
|
-
| E-88 | Release notes fully written (D36): scripts/release-notes.sh extracts the CHANGELOG section literally (dated headings), fails on a missing, empty, heading-only or placeholder section; release.yml fails instead of falling back and checks the published body; pre-push refuses a VERSION bump without a full section | scripts/release-notes.sh, .github/workflows/release.yml (extract step), .githooks/pre-push, docs/dev/release-checklist.md, tests/test-release-notes.sh | HIGH | bash tests/test-release-notes.sh; failing first against the old awk pattern | building@2026-09-
|
|
415
|
-
| E-89 | Pulse RELEASE_CADENCE (D37): violation when more than 25 minutes pass with main green (Tests and Bun Parity success at HEAD) and at least one merged-unreleased slice commit (not an ancestor of the latest published tag, docs-only commits excluded) | scripts/v10-pulse.sh (one check), tests/test-v10-pulse.sh | MEDIUM | bash tests/test-v10-pulse.sh; fixtures: green plus unreleased slice commit 26 min old fires; red main does not; docs-only commits do not; 24 min does not | building@2026-09-
|
|
416
|
-
| E-90 | Release Manager marks BOARD rows released after publish: scripts/board-mark-released.sh <tag> flips every merged row whose merge commit is an ancestor of <tag> to released@ with the tag and the ancestry evidence; pulse MERGED_NOT_RELEASED_STALE when a merged row is already in a published tag | scripts/board-mark-released.sh, scripts/v10-pulse.sh (one check), tests/test-board-mark-released.sh | MEDIUM | bash tests/test-board-mark-released.sh; a merged row in the tag flips, one not in it stays; BOARD line count unchanged | building@2026-09-
|
|
413
|
+
| E-87 | Release dispatch path: required-ci also accepts a completed workflow_dispatch Security Audit run at the exact SHA (Tests and Bun Parity stay push-only), so a tree whose VERSION is already bumped can publish after an audit fix | .github/workflows/release.yml (required-ci only), a test that runs the extracted step against a fixture run list | HIGH | fixture: dispatched audit success at the SHA counts; a dispatched audit at another SHA does not; Tests via dispatch still does not | building@2026-09-28T17:30Z | Source: v10.2.0 Release 36443541666 waited on an audit it could never count. CTO approval required (release gate). Wave E27 (wf_bcacb1d1-e76). CTO-level opus review. |
|
|
414
|
+
| E-88 | Release notes fully written (D36): scripts/release-notes.sh extracts the CHANGELOG section literally (dated headings), fails on a missing, empty, heading-only or placeholder section; release.yml fails instead of falling back and checks the published body; pre-push refuses a VERSION bump without a full section | scripts/release-notes.sh, .github/workflows/release.yml (extract step), .githooks/pre-push, docs/dev/release-checklist.md, tests/test-release-notes.sh | HIGH | bash tests/test-release-notes.sh; failing first against the old awk pattern | building@2026-09-28T17:30Z | Source: founder directive 16:05Z; six releases published with "Release vX.Y.Z" bodies (backfilled). Founder 17:22Z: stopped at 70 min and re-sliced as E-88a (auto-carry removed, explicit --include only). Wave E27 (wf_bcacb1d1-e76). |
|
|
415
|
+
| E-89 | Pulse RELEASE_CADENCE (D37): violation when more than 25 minutes pass with main green (Tests and Bun Parity success at HEAD) and at least one merged-unreleased slice commit (not an ancestor of the latest published tag, docs-only commits excluded) | scripts/v10-pulse.sh (one check), tests/test-v10-pulse.sh | MEDIUM | bash tests/test-v10-pulse.sh; fixtures: green plus unreleased slice commit 26 min old fires; red main does not; docs-only commits do not; 24 min does not | building@2026-09-28T17:30Z | Source: founder directive 16:20Z. Founder 17:22Z: stopped at 58 min; salvaged commit cce8f48a re-sliced as its own slice plus UNDERSTAFFED. Wave E27 (wf_bcacb1d1-e76). |
|
|
416
|
+
| E-90 | Release Manager marks BOARD rows released after publish: scripts/board-mark-released.sh <tag> flips every merged row whose merge commit is an ancestor of <tag> to released@ with the tag and the ancestry evidence; pulse MERGED_NOT_RELEASED_STALE when a merged row is already in a published tag | scripts/board-mark-released.sh, scripts/v10-pulse.sh (one check), tests/test-board-mark-released.sh | MEDIUM | bash tests/test-board-mark-released.sh; a merged row in the tag flips, one not in it stays; BOARD line count unchanged | building@2026-09-28T17:30Z | Source: 16:20Z the BOARD showed 20 merged slices that had all shipped in v10.1.0 to v10.2.1, which read as a 20-slice release backlog. Founder 17:22Z: stopped; salvaged commit 1d9dfae7 re-sliced after E-89. Wave E27 (wf_bcacb1d1-e76). |
|
|
417
417
|
| DEP-02 | actions/checkout v4 (runs on deprecated node20) to latest major v7, SHA-pinned with a "# v7.x.y" comment in every workflow and composite action; read the v5, v6, v7 release notes and fix breaking changes (fetch-depth, persist-credentials defaults) | .github/workflows/*.yml, .github/actions/**/action.yml (uses: actions/checkout lines, plus any input the migration requires) | MEDIUM | `grep -rn "actions/checkout@" .github` shows only full-SHA pins with a v7 comment; actionlint clean; a PR run of Tests, Bun Parity and Security Audit on the slice concludes success (run id cited) | building@2026-09-28T16:30Z | Source: DEP-01 inventory (D35). A release containing workflow changes needs the tag pushed by the Release Manager (GITHUB_TOKEN lacks the workflows permission; release.yml prints the workaround). |
|
|
418
418
|
| DEP-03 | actions/setup-node v4 (node20) to latest major v7, SHA-pinned with a version comment; read the v5..v7 release notes (cache and package-manager detection defaults) and fix breaking changes | .github/workflows/*.yml, .github/actions/**/action.yml (setup-node lines and required inputs) | MEDIUM | only SHA pins with a v7 comment; actionlint rc=0; PR run conclusion success (run id cited) | building@2026-09-28T16:30Z | Source: DEP-01 inventory (D35). |
|
|
419
419
|
| DEP-04 | Runtime matrix: drop Node 20 (EOL 2026-04-30) from every workflow matrix, keep 22 (previous supported, users still run it) and 24, add the current stable line if the inventory shows one newer and supported; update package.json engines and docs that name Node 20 | .github/workflows/*.yml (node-version values), package.json (engines only), docs naming the Node version | MEDIUM | no node 20 left in any matrix; engines matches; PR run conclusion success on every remaining version (run id cited) | building@2026-09-28T16:30Z | Source: DEP-01 inventory (D35). |
|
|
420
|
-
| E-91 | Pulse UNEVIDENCED_CLAIM and every row parser accept any slice id prefix ([A-Z]+-\d+, e.g. DEP-02, GF-1, PF-3), not a hardcoded S/E/EV/M list | scripts/v10-pulse.sh (row-id regexes only), tests/test-v10-pulse.sh | LOW | bash tests/test-v10-pulse.sh; a DEP row with "green" only in its Wall cell is not flagged, its notes cell still is |
|
|
420
|
+
| E-91 | Pulse UNEVIDENCED_CLAIM and every row parser accept any slice id prefix ([A-Z]+-\d+, e.g. DEP-02, GF-1, PF-3), not a hardcoded S/E/EV/M list | scripts/v10-pulse.sh (row-id regexes only), tests/test-v10-pulse.sh | LOW | bash tests/test-v10-pulse.sh; a DEP row with "green" only in its Wall cell is not flagged, its notes cell still is | building@2026-09-28T17:30Z | Source: pulse flagged DEP-03/DEP-04 Wall cells (df7dc134), the E-71 bug class again. Serialize after E-89/E-90 and E-79..81 (same file). Wave E27 (wf_bcacb1d1-e76). After E-90 (same file). |
|
|
421
421
|
| E-92 | P0 fix-forward: dep-inventory --self-test reached the real gh floating-tag resolver (actions/setup-node@v4), so CI without gh auth read bump unknown (Tests red since df7dc134, run 36451439320) | scripts/dep-inventory.py (self-test fixture) | HIGH | `env -u GH_TOKEN -u GITHUB_TOKEN PATH=/usr/bin:/bin python3 scripts/dep-inventory.py --self-test` rc=0; rc=1 on the previous version | released@2026-09-28T17:16Z | TL APPROVE (sonnet) on 81cdba4d: stripped-env self-test 23/23 rc=0, origin/main rc=1, fixture mutation goes red, no second network path in self_test(); merged 4f7f1487. Guard: E-93. Released in v10.2.2 (npm gitHead 9a59750d, Release run 36455687013). |
|
|
422
|
-
| E-93 | Guard (D37 same-class-never-twice): tests/test-dep-inventory.sh runs --self-test under a stripped environment (no GH_TOKEN/GITHUB_TOKEN, PATH=/usr/bin:/bin, empty HOME) so a network-dependent self-test fails locally, not only in CI; GUARDS.md entry | tests/test-dep-inventory.sh, docs/v10/GUARDS.md | LOW | a self-test that calls an unstubbed fetcher fails the leg locally |
|
|
423
|
-
| EV-12E | Upstream-first hidden-test enforcement (D38 criteria 1, 3, 4, 7, 9): validate requires hidden.provenance, hidden.sha256 and requirements[] on lg-* tasks; measure-size excludes typing-examples/, examples/, docs/; a test-harness leg applies every tasks/lg-*/shortcuts/*.patch and asserts not completed, and RED at ref is not collection-only; run.sh rows gain hidden_subset | eval/loki10/harness.py (validate only), eval/loki10/measure-size.py, eval/loki10/test-harness.sh (new section) | HIGH | fixture with a wrong sha256 fails validate rc=1; a passing shortcut fixture fails the leg; an attrs-602-shaped fixture reads medium |
|
|
424
|
-
| EV-12F | Retrofit lg-werkzeug-1513, 1680, 1769 and lg-httpx-1522 to D38 criteria 1-9 (requirements map, upstream-later tests first, authored public-API tests, sha256 freeze, saved shortcuts as must-fail fixtures from ~/loki-ci-logs/ev12-shortcuts/) | eval/loki10/tasks/lg-werkzeug-{1513,1680,1769}/, lg-httpx-1522/, their refdiffs | HIGH | per task: RED by assertion, GREEN at merge, every Ri-omission mutant fails, every shortcut fails, regression files pass, validate rc=0; independent opus 45-minute shortcut attempt passes nothing | ready@2026-09-
|
|
425
|
-
| EV-12G | Retrofit lg-httpx-1550, lg-httpx-3319, lg-attrs-660 to D38, then new upstream PRs (with later upstream tests first) until the large tier holds 10 | eval/loki10/tasks/lg-httpx-{1550,3319}/, lg-attrs-660/, new lg-* dirs, their refdiffs | HIGH | as EV-12F; at least 5 passing on main before the EV-14 large runs | ready@2026-09-
|
|
422
|
+
| E-93 | Guard (D37 same-class-never-twice): tests/test-dep-inventory.sh runs --self-test under a stripped environment (no GH_TOKEN/GITHUB_TOKEN, PATH=/usr/bin:/bin, empty HOME) so a network-dependent self-test fails locally, not only in CI; GUARDS.md entry | tests/test-dep-inventory.sh, docs/v10/GUARDS.md | LOW | a self-test that calls an unstubbed fetcher fails the leg locally | merged@2026-09-28T18:00Z | Source: E-92 incident. Wave E25 (wf_46137a6b-367). TL APPROVE (sonnet); merged on main 18:00Z; `bash tests/test-dep-inventory.sh` 6 passed 0 failed. |
|
|
423
|
+
| EV-12E | Upstream-first hidden-test enforcement (D38 criteria 1, 3, 4, 7, 9): validate requires hidden.provenance, hidden.sha256 and requirements[] on lg-* tasks; measure-size excludes typing-examples/, examples/, docs/; a test-harness leg applies every tasks/lg-*/shortcuts/*.patch and asserts not completed, and RED at ref is not collection-only; run.sh rows gain hidden_subset | eval/loki10/harness.py (validate only), eval/loki10/measure-size.py, eval/loki10/test-harness.sh (new section) | HIGH | fixture with a wrong sha256 fails validate rc=1; a passing shortcut fixture fails the leg; an attrs-602-shaped fixture reads medium | building@2026-09-28T17:30Z | Source: D38. Needs EV-12S merged first (measure-size). Wave E27 (wf_bcacb1d1-e76). |
|
|
424
|
+
| EV-12F | Retrofit lg-werkzeug-1513, 1680, 1769 and lg-httpx-1522 to D38 criteria 1-9 (requirements map, upstream-later tests first, authored public-API tests, sha256 freeze, saved shortcuts as must-fail fixtures from ~/loki-ci-logs/ev12-shortcuts/) | eval/loki10/tasks/lg-werkzeug-{1513,1680,1769}/, lg-httpx-1522/, their refdiffs | HIGH | per task: RED by assertion, GREEN at merge, every Ri-omission mutant fails, every shortcut fails, regression files pass, validate rc=0; independent opus 45-minute shortcut attempt passes nothing | ready@2026-09-28T18:00Z | Source: D38. Two engineers (task pairs). Wave E25 (wf_46137a6b-367). Two engineers (task pairs). Wave E25 opus REJECT on every retrofitted task (requirements not covering the sized refdiff, -k deselecting the only Ri test, deprecation requirements untested, shortcuts that omit stated requirements still passing). Deprioritized at 18:00Z behind EV-15 and E-98: the flip is blocked by the medium-tier result regardless of the large tier. |
|
|
425
|
+
| EV-12G | Retrofit lg-httpx-1550, lg-httpx-3319, lg-attrs-660 to D38, then new upstream PRs (with later upstream tests first) until the large tier holds 10 | eval/loki10/tasks/lg-httpx-{1550,3319}/, lg-attrs-660/, new lg-* dirs, their refdiffs | HIGH | as EV-12F; at least 5 passing on main before the EV-14 large runs | ready@2026-09-28T18:00Z | Source: D38. Wave E25 (wf_46137a6b-367). Wave E25 opus REJECT on every retrofitted task (requirements not covering the sized refdiff, -k deselecting the only Ri test, deprecation requirements untested, shortcuts that omit stated requirements still passing). Deprioritized at 18:00Z behind EV-15 and E-98: the flip is blocked by the medium-tier result regardless of the large tier. |
|
|
426
|
+
| E-94 | Guard for red main df7dc134 (a test passed locally only because gh was authenticated): local-ci fast tier re-runs every changed test file under a stripped environment (no GH_TOKEN, gh or network credentials) and fails on a difference | scripts/local-ci.sh (one check), tests/test-local-ci-hermetic.sh, docs/v10/GUARDS.md | MEDIUM | a fixture test that calls gh fails the check; the pre-E-92 dep-inventory.py is caught | building@2026-09-28T17:30Z | Source: founder 17:22Z (each red main becomes a pre-merge guard). Wave E27 (wf_bcacb1d1-e76). |
|
|
427
|
+
| E-95 | Guard for red main 8f2179cd (App Runner Watchdog Health fixture server never came up; rerun 36453069628 passed): free port by binding 0, readiness poll up to 10s with a clear message; 20/20 under parallel load | tests/test-app-runner-watchdog-health.sh, docs/v10/GUARDS.md | LOW | 20 consecutive passes while 4 parallel pulse suites run | building@2026-09-28T17:30Z | Source: founder 17:22Z. Wave E27 (wf_bcacb1d1-e76). |
|
|
428
|
+
| E-86 | Pre-push gitleaks for eval task fixtures (founder 15:16Z): pinned v8.30.0 with hardcoded checksums, every pushed commit scanned in dir mode from the pushed commit (not the working tree), refusal names file, line and rule, never the secret | .githooks/pre-push, scripts/install-gitleaks.sh, tests/test-pre-push-gitleaks.sh, .gitleaksignore | HIGH | real-push fixtures: a sourcegraph URL plus 40-hex pin is refused; opus security review | building@2026-09-28T17:30Z | Source: v10.2.0 blocked by gitleaks. Rounds 1-3 opus REJECT with reproduced fail-opens (non-ASCII dirs, unfetched force-push, working-tree scan, checksum bypass; intermediate commits; root commits, history leak, case collisions). Round 4 building as one squashed commit off main. |
|
|
429
|
+
| E-96 | Safe worktree pruning: scripts/prune-worktrees.sh removes a .claude/worktrees entry only when it is not locked, has no process with a cwd inside it (lsof), and its branch has no commit or file change in the last 30 minutes measured with git and stat (never find -newermt), refusing when any check cannot run; the pulse WORKTREE_COUNT NEXT ACTION names the script | scripts/prune-worktrees.sh, tests/test-prune-worktrees.sh, scripts/v10-pulse.sh (NEXT ACTION text only) | MEDIUM | fixture: a worktree with a live process inside is kept; an idle one is removed; an unsupported check refuses | ready@2026-09-28T17:40Z | Source: 17:36Z incident: the Chief of Staff pruned by `find -newermt "-25 minutes"` (unsupported on BSD find, matched nothing) and force-removed 7 live builder worktrees (M-07 r4, M-11 r3, EV-14, EV-12F-a, EV-12G, E-95, E-87); every branch had its work committed, uncommitted edits since the last commit were lost. |
|
|
430
|
+
| DEP-05 | npm/bun patch and minor batch from docs/v10/DEPS.md (web-app, dashboard-ui, vscode-extension, root; lockfiles regenerated and committed; 0.x packages excluded) | the package.json and lockfiles DEPS.md names for patch/minor only | LOW | npm audit: no new high or critical; hallucinated-dependency guard rc=0; full Tier B plus the moat suite on a PR run | ready@2026-09-28T17:45Z | Source: DEP-01 inventory (D35). |
|
|
431
|
+
| DEP-06 | Python patch and minor batch from docs/v10/DEPS.md (dashboard, mcp, web-app requirements, sdk/python pyproject; 0.x excluded) | those requirements*.txt and pyproject.toml | LOW | pip-audit: no new high or critical; guard rc=0; PR run of Tests conclusion success (run id cited) | ready@2026-09-28T17:45Z | Source: DEP-01 (D35). |
|
|
432
|
+
| DEP-07 | SHA-pin every remaining tag-pinned action already on its latest major (anchore/sbom-action, anthropics/claude-code-action, contributor-assistant/github-action, oven-sh/setup-bun) with a version comment | .github/workflows/*.yml (those uses: lines only) | LOW | every uses: is a full SHA with a vX comment; actionlint rc=0; PR run | ready@2026-09-28T17:45Z | Source: DEP-01 (D35). Serialize after DEP-02/DEP-03 merge (same files). |
|
|
433
|
+
| G-01 | Usage governor (D39): scripts/usage-governor.py sums usage (output, input, cache read, cache write) from ~/.claude/projects/**/*.jsonl per model, role (from workflow labels and agent types where recorded) and hour; stores founder plan-percentage readings (docs/v10/usage-readings.tsv) and fits tokens-per-percent as a labelled estimate; projects 5-hour window and weekly usage; outputs max engineers for the next hour; checks and records whether Claude Code exposes plan usage directly (statusline input rate-limit fields, /usage) and uses it when it does | scripts/usage-governor.py, docs/v10/usage-readings.tsv, tests/test-usage-governor.sh | HIGH | fixture jsonl plus readings gives a stated projection and max-engineer number; missing readings reads "uncalibrated", never a number presented as fact | building@2026-09-28T17:50Z | Source: founder 17:44Z. First in the queue; everything obeys it. |
|
|
434
|
+
| G-02 | Pulse BUDGET_BURN and OPUS_SHARE violations plus an hourly METRICS.md usage section (tokens per role and model, cost per merged slice, window and weekly projections, max engineers, releases per hour, merged slices per hour and per million tokens), all from G-01 | scripts/v10-pulse.sh (two checks), tests/test-v10-pulse.sh, docs/v10/METRICS.md (section header only) | MEDIUM | fixtures: opus 31% fires OPUS_SHARE; a projection of 86% fires BUDGET_BURN; uncalibrated reads UNKNOWN | ready@2026-09-28T17:50Z | Source: founder 17:44Z. Depends on G-01. Serialize after E-89..E-91 (same file). |
|
|
435
|
+
| G-03 | docs/v10/SCALE.md: what the Max 20x plan sustains around the clock (from G-01 measurements and calibration), what 50 parallel engineers need (API pay-as-you-go with a rate-limit tier, or Team/Enterprise), cost per day estimates labelled as estimates, and the ramp gates (governor allows, merged slices per hour rising, merged work per token not falling) | docs/v10/SCALE.md | HIGH | every number cites a measurement or is labelled an estimate with its basis | building@2026-09-28T17:50Z | Source: founder 17:44Z. CTO (opus) authors. Billing is the founder decision. |
|
|
436
|
+
| G-04 | Cloud fan-out (HIGH, CTO-owned): dispatch ready slices with no file overlap with in-flight work as Claude Code cloud sessions that open PRs from their own branches; the Release Manager merges PRs whose checks concluded success with gh pr merge; every dispatch recorded in BOARD.md with its cloud session id; ramp 25 to 50 only when the governor allows and merged slices per hour rose | scripts/cloud-dispatch.sh, docs/v10/SWARM.md (one section), tests/test-cloud-dispatch.sh | HIGH | dry-run dispatch prints the exact command and the BOARD row it would write; refuses when the governor max is reached or file sets overlap | ready@2026-09-28T17:50Z | Source: founder 17:44Z. Depends on G-01 (governor) and G-03 (plan ceiling). Verify the real cloud-session CLI syntax before building. |
|
|
437
|
+
| G-05 | The same fan-out as loki modernize remote-worker mode (POST /jobs kind unit, Helm worker.engine v10): align G-04 with M-23 | (design note in docs/v10/MODERNIZE.md, one section) | MEDIUM | the note maps G-04 dispatch fields to the M-23 job schema | ready@2026-09-28T17:50Z | Source: founder 17:44Z. Depends on G-04 and M-17. |
|
|
438
|
+
| EV-15 | Re-run the medium tier (7 tasks, raw and v10, 2 runs each, same model) with every result file written under ~/loki-ci-logs/eval/ev15-<arm>-r<n>/ (outside any worktree) and a per-task table of which runs failed and why (hidden-test failure, timeout, no PR, cost) | eval/loki10 results (outside the repo), docs/v10/METRICS.md (one section) | HIGH | 28 rows, 0 arm_unavailable; per-task failure reasons cited from the result files | ready@2026-09-28T18:00Z | Source: EV-14 evidence lost (17:36Z incident) and v10 lost on all three medium axes. Governor-gated (paid run). |
|
|
439
|
+
| E-98 | Diagnose why v10 loses to raw on medium (EV-15 per-task failures): for each task v10 failed and raw completed, read the v10 run log and name the stage and cause (plan, Wall, implement, verify, fix rounds, cap), then cut fix slices | docs/v10/ENGINE.md (findings section) | HIGH | each finding cites a result file path and a log line | ready@2026-09-28T18:00Z | Source: EV-14. Depends on EV-15. CTO (opus) analysis. |
|
|
426
440
|
| E-58 | Issue-ref runs: supervisor creates runDir before the fetch child writes issue.json; makes E-47 green | loki-ts/src/engine10/supervisor.ts (one line before fetchIssueToFile), E-47 test files from 544348a7 | MEDIUM | cd loki-ts && bun test tests/engine10/issue_ref_e2e.test.ts (3 pass) | released@2026-09-28T02:38Z | Source: E-47 finding (TL reproduced). Merged 646a6cd7 (train E13): engine10 388 pass 0 fail, tsc exit 0, test-engine10-dist 18/0, test-engine10-docs 26 passed, test-harness 82/0. APPROVE (6384fff9); issue_ref_e2e 3 pass. Released v9.81.0 (npm view loki-mode time: 2026-09-28T02:38:54Z). |
|
|
427
441
|
| E-59 | Receipt model and summary tokens match the provider: cost.ts takes model from the result-cost file; events.ts fold sums cache read and creation tokens; makes E-50 green | loki-ts/src/engine10/cost.ts, loki-ts/src/engine10/events.ts, E-50 test files from 716618d4 | HIGH | cd loki-ts && bun test tests/engine10/model_report.test.ts tests/engine10/output.test.ts | released@2026-09-28T02:38Z | Source: E-50 finding. Reconcile with E-44 (output.ts already folds cache tokens at render). Opus reviewer (cost numbers feed the gate). Opus CONCERN: writeResultCost writes no model, so real records still use the caller model; summary tokens at supervisor.ts still exclude cache. Rework dispatched. Merged 3ab2a8fa (train E14, rebased on main): engine10 404 pass 0 fail (402 pass 0 fail with claude removed from PATH), tsc exit 0, test-harness 86/0, test-local-ci-gitleaks 6/0, test-engine10-dist 18/0. Released v9.81.0 (npm view loki-mode time: 2026-09-28T02:38:54Z). |
|
|
428
442
|
| EV-8 | v10 cost check on 5 tasks before the full arm (CEO 23:31Z): v10 arm, same model, after E-42 and E-45 merge | eval/loki10 results (gitignored) plus docs/v10/METRICS.md block | HIGH | eval/loki10/run.sh --arm v10 --tasks <5 ids> reports completed, time to PR and provider cost per task | released@2026-09-28T02:38Z | Target cost per completed task at or below $0.2363 (raw claude -p full arm). Depends on E-42, E-45, E-38 (--tasks). Incident 01:38Z: first run 0/5 on both variants measured the wrong code. The harness default arm binary is the global loki (loki --version: v9.78.0), and the main checkout node_modules still had agent SDK 0.3.267 (package.json pins 0.3.283), whose bundled Claude Code 2.1.267 rejects claude-opus-5-5, so every session exited "error" in about 1s with 0 tokens. Fixed in 7c3dea3d: bun install (node_modules 0.3.283), repro with the harness arm_env and arm_auth now completes on claude-opus-5-5 ($0.11, 13s); dist rebuilt. Rerun started with LOKI_EVAL_LOKI_BIN=<repo>/bin/loki. Guards E-61, E-62. Rerun measured (not a code slice): A 4/5 $0.5954, B 5/5 $0.3976, C (all sonnet, no plan, no Wall) 4/5 $0.294, raw 5/5 $0.2161 (~/loki-ci-logs/ev8r-{A,B,C}/results.jsonl). Gate not met on cost; D31 and E-64, E-65 follow. Released v9.81.0 (npm view loki-mode time: 2026-09-28T02:38:54Z). |
|
package/docs/v10/DECISIONS.md
CHANGED
|
@@ -305,3 +305,12 @@ One entry per decision: context, choice, why, how to reverse. Newest last.
|
|
|
305
305
|
- Rejected: shortcut-size thresholds and deletion-only bars (they mismeasure delivered accuracy); an alternative oracle (only its regression part is kept).
|
|
306
306
|
- Amends D34's EV-14 clause: EV-14 and the E-31 flip may proceed on small plus medium. The claim is limited to those tiers; medium is labelled "not shortcut audited"; no large, "any size" or 2-5x claim. The large re-check runs at 5 tasks and a loss on any axis reverts the default. Large completion is published on both the verbatim subset and the full set, and the stricter governs.
|
|
307
307
|
- Cards: EV-12E (enforcement), EV-12F and EV-12G (retrofits, then new tasks to 10). Ruled by the CTO (opus) on the Chief of Staff's request.
|
|
308
|
+
|
|
309
|
+
## D39. 2026-09-28: usage governor first; engineers are an output of the budget (founder directive 17:44Z)
|
|
310
|
+
|
|
311
|
+
- Plan: Claude Max 20x; two limits, a 5-hour session window and a weekly limit resetting Wednesday 13:00 ET. Every agent draws on both (local, workflow, cloud); opus draws faster than sonnet; model pinning stays.
|
|
312
|
+
- Budget: projected 5-hour window usage at or below 85% at window end; weekly at or below 90% by the reset. The governor sets the next hour's maximum engineers from measured burn per engineer. Cut order when tight: cloud engineers, then MEDIUM and LOW local engineers, then opus reviewers down to the HIGH minimum; never the Release Manager or a P0. Spend on release blockers, then EV-14 and the flip, then engine accuracy, then modernization.
|
|
313
|
+
- On a limit ("limit reached", 429, or the org-access error of 2026-09-28): checkpoint, stop dispatching, resume after the reset; never lose finished work.
|
|
314
|
+
- Pulse: BUDGET_BURN (projection over 85% window or 90% weekly) and OPUS_SHARE (opus over 30% of output tokens in the last hour). METRICS.md hourly: tokens per role and model, cost per merged slice, window and weekly projection, current max engineers, releases per hour, merged slices per hour and per million tokens.
|
|
315
|
+
- Measured from ~/.claude/projects/**/*.jsonl, counted once per API response (Claude Code repeats usage on every content-block row, so a per-row sum double counts; corrected by the G-03 CTO review): last 1h output 1.87M tokens (sonnet 1.62M, opus 0.24M, opus share 13%), cache read 0.634B; last 5h output 6.01M. About 14 concurrent local agents on average in that hour (8 to 21 per 5-minute slot); local transcripts only, so a lower bound. Plan percentage per token is not yet calibrated: until a founder reading arrives, no new engineers are dispatched beyond the waves already running (baseline: about 16 agents took the window from low to 91% on 2026-09-27).
|
|
316
|
+
- Scaling to 50 (cloud fan-out, remote workers) is gated on the governor and on merged slices per token rising; SCALE.md states what the Max plan sustains and what 50 would need (billing is the founder's call).
|
package/docs/v10/GUARDS.md
CHANGED
|
@@ -569,3 +569,48 @@ previously mismarked two merged guards (S-16, S-74) as PENDING.
|
|
|
569
569
|
old `test-start-update-hint.sh`) reproduces the incident directly: exit 1,
|
|
570
570
|
reporting both `9.99.0` lines by file:line. Run:
|
|
571
571
|
`bash tests/test-no-stale-future-version.sh`.
|
|
572
|
+
|
|
573
|
+
## 17. `--self-test` reached the network only in CI, not locally (E-92)
|
|
574
|
+
|
|
575
|
+
- **Incident:** `scripts/dep-inventory.py --self-test` passed on the
|
|
576
|
+
engineer's machine but went red on main in CI. The fixture for
|
|
577
|
+
`actions/setup-node@v4` stubbed only the `gh_release` cache bucket; ref
|
|
578
|
+
`v4` also matches the bare-major-tag pattern in `collect_actions`, which
|
|
579
|
+
resolves it through `resolve_floating_tag()` and the `floating_tag` cache
|
|
580
|
+
bucket. With that bucket unstubbed, the resolver fell through to a real
|
|
581
|
+
`gh api` call. Locally that call succeeded (a working, authenticated `gh`
|
|
582
|
+
was on PATH), so the fixture's gap was invisible; in CI (no `gh`, no auth,
|
|
583
|
+
no network) it failed, `resolve_entry["ok"]` was `False`, and the row's
|
|
584
|
+
bump fell back to `"unknown"` instead of the expected `"MAJOR"`.
|
|
585
|
+
- **Root cause with evidence:** commit `81cdba4d` ("stub the floating_tag
|
|
586
|
+
cache in --self-test for actions/setup-node@v4") states it directly: the
|
|
587
|
+
self-test "passed locally only because gh happened to be authenticated
|
|
588
|
+
there." No leg of `tests/test-dep-inventory.sh` ran the self-test with
|
|
589
|
+
`gh`/network absent, so the environment gap that separates "green
|
|
590
|
+
locally" from "green in CI" was never exercised before main did it for
|
|
591
|
+
real.
|
|
592
|
+
- **The guard:** `tests/test-dep-inventory.sh` T6 runs
|
|
593
|
+
`python3 scripts/dep-inventory.py --self-test` under
|
|
594
|
+
`env -i HOME=<empty temp dir> PATH=/usr/bin:/bin`, which drops
|
|
595
|
+
`GH_TOKEN`/`GITHUB_TOKEN` and every other inherited variable and wipes
|
|
596
|
+
`gh`'s own `~/.config/gh` auth store by emptying `HOME`; it also excludes
|
|
597
|
+
`gh` from PATH wherever it is installed outside `/usr/bin:/bin` (true on
|
|
598
|
+
this machine: `/opt/homebrew/bin/gh`). Either way -- `gh` absent, or
|
|
599
|
+
present but with no credentials to present -- any cache bucket a fixture
|
|
600
|
+
forgets to stub hits a `gh api` call that fails the way it failed in CI,
|
|
601
|
+
instead of a developer's real, authenticated one. This does not block
|
|
602
|
+
outbound network access; the npm/PyPI/endoflife fetchers can still reach
|
|
603
|
+
it, so an unstubbed bucket for one of those is not caught by T6.
|
|
604
|
+
- **The test that proves it fires:** reproduced the incident directly by
|
|
605
|
+
removing the `floating_tag` fixture E-92 added (the
|
|
606
|
+
`cache4.data["floating_tag"] = {...}` block for
|
|
607
|
+
`actions/setup-node@v4`, `scripts/dep-inventory.py` lines 1281-1286) and
|
|
608
|
+
running `bash tests/test-dep-inventory.sh`: T1 (the script's own
|
|
609
|
+
self-test, run with the developer's normal, authenticated `gh`) still
|
|
610
|
+
showed `[PASS] dep-inventory.py --self-test passed` -- proving the
|
|
611
|
+
existing leg is blind to this class -- while T6 showed `[FAIL]
|
|
612
|
+
self-test failed unauthenticated/gh-less`; overall `Results: 5 passed, 1
|
|
613
|
+
failed`, exit 1. The fixture was then restored from a backup
|
|
614
|
+
(`git diff --quiet scripts/dep-inventory.py` exit 0, confirming an exact
|
|
615
|
+
restore) and a clean rerun showed `Results: 6 passed, 0 failed`, exit 0.
|
|
616
|
+
Run: `bash tests/test-dep-inventory.sh`.
|
package/docs/v10/METRICS.md
CHANGED
|
@@ -260,3 +260,75 @@ All arms on claude-opus-5-5, 29 small tasks with hidden tests, fresh clone per r
|
|
|
260
260
|
- Lean configuration misses: aiq-52-searchbar, pub-humanize-174. It matches raw on completion and time and is 32% cheaper; it does not meet the 2x targets and is not the default until E-64 lands and is re-measured.
|
|
261
261
|
- Lean-session evidence, 5 tasks (EV-8 D/E, not the full arm): opus lean 4/5 at $0.1571 per completed, p50 28s; sonnet lean 4/5 at $0.1519, p50 27.5s; raw opus on the same 5: 5/5, $0.2161, p50 41s (~/loki-ci-logs/ev8r-{D,E}/results.jsonl). The lean small path is not the default yet (E-64 in rework).
|
|
262
262
|
- Medium and large tiers: not built (EV-11 3 of 15 verified, EV-12 in rework). No "2-5x" claim.
|
|
263
|
+
|
|
264
|
+
## Loki 10 gate report, medium tier (upstream tests, deletion-mutant audited, not shortcut audited) (2026-09-28, D38; EV-14)
|
|
265
|
+
|
|
266
|
+
Evidence note (Chief of Staff, 18:00Z): the per-run result files (eval/loki10/results/ev14-medium-{raw,v10}-r{1,2}/results.jsonl, gitignored) were lost when the EV-14 worktree was force-removed in the 17:36Z pruning incident (PROGRESS.md, E-96). The table below is the run agent's report from those files before removal (commit 0afef9e4); it cannot be re-audited. EV-15 re-runs the tier with results kept outside any worktree.
|
|
267
|
+
|
|
268
|
+
D38 permits the flip decision on small plus medium; medium is explicitly "not
|
|
269
|
+
shortcut audited" (no requirements map, no independent shortcut-attempt
|
|
270
|
+
review, unlike the large tier's D38 criteria). All 7 medium tasks (`pub-*`
|
|
271
|
+
with `"tier": "medium"`) carry upstream-verbatim hidden tests with at least
|
|
272
|
+
one deletion-mutant check recorded in their `NOTES.md` (see
|
|
273
|
+
`eval/loki10/tasks/pub-attrs-1313/NOTES.md` for one worked example). Both
|
|
274
|
+
arms on claude-opus-5-5 (same model as the small-tier gate), harness
|
|
275
|
+
8f2179cdea1544f855eca0ec4c8a18b525cad152 (origin/main, not dirty), fresh
|
|
276
|
+
clone per run, provider-sourced cost only, 2 runs per arm, `--parallel 3`,
|
|
277
|
+
900s cap per task. `loki-ts/node_modules` reinstalled from `bun.lock`
|
|
278
|
+
(`bun install --frozen-lockfile`) before the v10 runs per E-62.
|
|
279
|
+
|
|
280
|
+
| arm | completed | rate | cost per completed | p50 / p90 time to PR | arm_unavailable | invalid |
|
|
281
|
+
|---|---|---|---|---|---|---|
|
|
282
|
+
| raw `claude -p` | 12/14 | 85.7% | $0.5119 | 70s / 239s | 0 | 0 |
|
|
283
|
+
| v10 (default knobs, main 8f2179cd) | 10/14 | 71.4% | $0.5395 | 83s / 100s | 0 | 0 |
|
|
284
|
+
|
|
285
|
+
Per-run breakdown (`eval/loki10/summarize <file> --markdown`, all under
|
|
286
|
+
`eval/loki10/results/`, the harness's normal `--out` location; none of these
|
|
287
|
+
are committed, see below):
|
|
288
|
+
|
|
289
|
+
| run | file | completed | cost per completed | p50 / p90 |
|
|
290
|
+
|---|---|---|---|---|
|
|
291
|
+
| raw r1 | `eval/loki10/results/ev14-medium-raw-r1/results.jsonl` | 5/7 | $0.6194 | 102s / 149s |
|
|
292
|
+
| raw r2 | `eval/loki10/results/ev14-medium-raw-r2/results.jsonl` | 7/7 | $0.4352 | 69s / 256s |
|
|
293
|
+
| v10 r1 | `eval/loki10/results/ev14-medium-v10-r1/results.jsonl` | 5/7 | $0.5702 | 83s / 121s |
|
|
294
|
+
| v10 r2 | `eval/loki10/results/ev14-medium-v10-r2/results.jsonl` | 5/7 | $0.5088 | 98s / 100s |
|
|
295
|
+
|
|
296
|
+
The pooled row is not something `summarize` can produce directly: it dedupes
|
|
297
|
+
to the newest row per `(task, arm)`, which would silently drop one of the two
|
|
298
|
+
runs per task. The pooled numbers were computed by hand over the 14
|
|
299
|
+
concatenated rows per arm (both runs, un-deduped), reimplementing
|
|
300
|
+
`summarize`'s own rules: completion rate over evaluated runs; cost per
|
|
301
|
+
completed = total `cost_usd` of every evaluated run in the pool divided by
|
|
302
|
+
the number completed (this is "evaluated", not "completed only" -- confirmed
|
|
303
|
+
by reproducing raw r1's own $0.6194 figure by hand); p50/p90 by nearest-rank
|
|
304
|
+
over completed runs' `time_to_pr_s`. The pooling script reproduced all four
|
|
305
|
+
single-run files' own `summarize --markdown` numbers exactly (completed
|
|
306
|
+
count, cost per completed, p50 and p90) before its pooled output was
|
|
307
|
+
trusted. All 28 task-runs (7 tasks x 2 arms x 2 runs) came back
|
|
308
|
+
`status: ok`; none were `arm_unavailable`, `auth_unavailable`,
|
|
309
|
+
`harness_error` or `task_invalid`.
|
|
310
|
+
|
|
311
|
+
Misses: raw-claude missed `pub-faker-1817` and `pub-werkzeug-3271` (both
|
|
312
|
+
hidden-test failures, r1 only; r2 was 7/7). v10 missed `pub-werkzeug-3105`
|
|
313
|
+
and `pub-werkzeug-3271` in both runs (hidden-test failures both times).
|
|
314
|
+
|
|
315
|
+
Verdict per axis, v10 vs raw on this tier:
|
|
316
|
+
- Completions: v10 is WORSE (71.4% vs 85.7%; 10/14 vs 12/14).
|
|
317
|
+
- Cost per completed task: v10 is WORSE (higher; $0.5395 vs $0.5119, about
|
|
318
|
+
5.4% more expensive).
|
|
319
|
+
- p50 time to PR: v10 is WORSE (slower; 83s vs 70s, about 19% slower). v10's
|
|
320
|
+
p90 (100s) beats raw's p90 (239s, `pub-werkzeug-3271`); raw's single
|
|
321
|
+
slowest run was `pub-werkzeug-3105` r2 at 256s, rank 12 of 12, past the p90
|
|
322
|
+
cutoff so it does not set the p90 value. Neither changes the p50 verdict.
|
|
323
|
+
|
|
324
|
+
v10 is not at or better than raw on any of the three axes on this tier. This
|
|
325
|
+
does not by itself change the small-tier default decision (D30: default
|
|
326
|
+
stays legacy, v10 opt-in); it is additional evidence for whoever rules on the
|
|
327
|
+
flip under D38's small-plus-medium scope.
|
|
328
|
+
|
|
329
|
+
No result file was committed: `eval/loki10/.gitignore` ignores the whole
|
|
330
|
+
`results/` directory (the README also warns to treat `--out` as sensitive,
|
|
331
|
+
since `arm_stdout.log` can hold env), so there are no harness result files
|
|
332
|
+
tracked in git to commit, matching every earlier EV entry in this file. Only
|
|
333
|
+
this METRICS.md section is committed. The raw result files above remain on
|
|
334
|
+
disk in this worktree at `eval/loki10/results/ev14-medium-{raw,v10}-r{1,2}/`.
|
package/docs/v10/PROGRESS.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Progress
|
|
2
2
|
|
|
3
|
+
## 2026-09-28T18:00Z: EV-14 says no flip; v10.2.4 out; governor first
|
|
4
|
+
- EV-14 medium tier (7 tasks, 2 runs per arm, claude-opus-5-5, harness at 8f2179cd): raw 12/14 completed (85.7%), $0.5119 per completed, p50 70s; v10 10/14 (71.4%), $0.5395, p50 83s. v10 is worse on completions, cost and p50; the default stays legacy (D38). Per-run result files were lost in the 17:36Z worktree incident (numbers survive in METRICS.md from commit 0afef9e4); EV-15 re-runs with results kept outside worktrees and E-98 diagnoses the v10 losses.
|
|
5
|
+
- EV-12 large retrofits (EV-12F-a, EV-12F-b, EV-12G): opus REJECT on every task; deprioritized behind EV-15 and E-98, since the flip is blocked by the medium result regardless of the large tier.
|
|
6
|
+
- v10.2.4 (13:40 slot): cut 17:42:40Z (22730334), publish-npm done 17:51:04Z (Release run 36460058157).
|
|
7
|
+
- Founder 17:44Z (D39): usage governor first. Burn counted once per API response: last hour 1.87M output (sonnet 1.62M, opus 0.24M, opus share 13%), 0.634B cache read. G-01 governor building; G-03 SCALE.md merged (Max 20x sustains about 5 to 16 engineers around the clock, ESTIMATE, uncalibrated; 50 engineers at API list price about $11.5K to $14.5K per day, ESTIMATE). New dispatch frozen until calibrated; waiting on a founder plan-percentage reading.
|
|
8
|
+
|
|
9
|
+
## 2026-09-28T17:40Z: release slots measured; staffing; worktree incident
|
|
10
|
+
- Slot log (cut = release commit pushed; publish = npm time). v10.2.3 detail: cut 17:27:02Z, publish-npm job done 17:34:47Z, npm time 17:40:56Z (`npm view loki-mode time`), GitHub body backfilled from CHANGELOG (placeholder until E-88a lands). 13:00 local slot: skipped, main red (8f2179cd Tests failure, rerun success at 17:05Z). v10.2.2: cut 17:07Z (9a59750d), npm 17:16Z. 13:20 slot: cut late at 17:27:02Z as v10.2.3 (d366d9de) after Tests went green on 4f6b441d at 17:26Z; publish-npm success by 17:35Z. Next train pushed 17:35:35Z (1f04c040, EV-12S) for the 13:40 slot.
|
|
11
|
+
- Staffing: founder 17:22Z (keep 12 or more building). The BOARD showed 5 because rows were not flipped when waves were dispatched; now 19 rows building. E-88 (70 min) and E-89/E-90 (58 min) stopped and re-sliced; the salvaged E-89 and E-90 commits are reviewed as their own slices. RELEASE_CADENCE and UNDERSTAFFED are in E-89 (wave E27). Guards for today's red mains: E-94 (changed tests re-run without credentials, pre-merge) and E-95 (watchdog fixture readiness).
|
|
12
|
+
- Incident 17:36Z: pruning worktrees with `find -newermt "-25 minutes"` (unsupported on BSD find, matched nothing) force-removed 7 live builder worktrees (M-07 r4, M-11 r3, EV-14, EV-12F-a, EV-12G, E-95, E-87). Every branch had its work committed (`git log origin/main..<branch>` shows 1 to 9 commits, the latest 3 to 48 minutes old); edits after the last commit were lost. Guard E-96 (safe prune script); memory recorded.
|
|
13
|
+
|
|
3
14
|
## 2026-09-28T17:10Z: v10.2.2 cut (npm gitHead 9a59750d); two red mains handled (E-92 at 4f7f1487, flake rerun 36453069628 success); D38; drift audit (turn 486)
|
|
4
15
|
- Main red at df7dc134 to 793870f3 (Tests run 36451439320): the DEP-01 self-test reached the real gh floating-tag resolver and read bump unknown on the CI runner. P0 fix E-92 (81cdba4d, TL APPROVE; stripped-env self-test rc=0 vs rc=1 on the old code), merged 4f7f1487. Guard E-93 (stripped-env leg) building.
|
|
5
16
|
- 8f2179cd then failed once on "App Runner Watchdog Health" (healthy fixture server never came up); `gh run rerun 36453069628 --failed` concluded success on the same SHA, so it was a flake, not a code change.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# SCALE: what the plan sustains and what 50 engineers would need (G-03, D39)
|
|
2
|
+
|
|
3
|
+
Written 2026-09-28 by the CTO (opus). Every number is either MEASURED (command and window
|
|
4
|
+
given), PUBLISHED (source URL given) or ESTIMATE (basis given). Billing is the founder's call.
|
|
5
|
+
|
|
6
|
+
## 1. Measured burn (MEASURED, local jsonl only)
|
|
7
|
+
|
|
8
|
+
Source: `~/.claude/projects/**/*.jsonl`, assistant rows with a `usage` field, window ending
|
|
9
|
+
2026-09-28 17:47Z. Local transcripts miss cloud and remote agents, so every figure is a lower bound.
|
|
10
|
+
|
|
11
|
+
Counting method matters. Claude Code writes one jsonl row per content block and repeats the
|
|
12
|
+
same `usage` on each row. Two methods, same hour:
|
|
13
|
+
|
|
14
|
+
| Last 1h (17:47Z) | Raw sum of rows (D39 method) | Deduplicated (max per message id + requestId) |
|
|
15
|
+
|----------------------------|------------------------------|-----------------------------------------------|
|
|
16
|
+
| Output tokens | 2.07M | 1.87M (sonnet 1.62M, opus 0.24M, haiku 0.005M) |
|
|
17
|
+
| Cache-read tokens | 1.17B | 0.634B (sonnet 552M, opus 81M) |
|
|
18
|
+
| Cache-write tokens | not summed | 6.51M (sonnet 5.03M, opus 1.40M); 92% 5-minute TTL |
|
|
19
|
+
| Uncached input tokens | not summed | 6.3K |
|
|
20
|
+
| API requests | 5,824 rows | 3,119 (peak 114 per minute) |
|
|
21
|
+
|
|
22
|
+
- The deduplicated count is the basis below. The D39 cache-read figure (1.15B) double counts
|
|
23
|
+
about 1.8x; D39 and METRICS.md should carry the deduplicated numbers.
|
|
24
|
+
- Last 5h, deduplicated: output 6.01M (sonnet 5.21M, opus 0.80M), cache read 1.85B.
|
|
25
|
+
- Models seen in the last hour: claude-sonnet-5 (2,808 requests), claude-opus-5-5 (305),
|
|
26
|
+
claude-haiku-4-5 (6). Opus share of output: 13%.
|
|
27
|
+
- Concurrency, measured: distinct transcript files with at least one request per 5-minute slot
|
|
28
|
+
over the hour: 11, 11, 8, 12, 9, 12, 11, 21, 18, 20, 17, 17 (average 13.9). The stated
|
|
29
|
+
16 to 19 agents matches the last 25 minutes.
|
|
30
|
+
- Peak minute (deduplicated): 66K output tokens, 561K ITPM-counted input (uncached input plus
|
|
31
|
+
cache writes; cache reads do not count toward ITPM), 114 requests.
|
|
32
|
+
|
|
33
|
+
## 2. API-equivalent cost of the measured hour (PUBLISHED prices)
|
|
34
|
+
|
|
35
|
+
Prices from https://platform.claude.com/docs/en/about-claude/pricing (fetched 2026-09-28):
|
|
36
|
+
|
|
37
|
+
| Model | Input | 5m cache write | 1h cache write | Cache read | Output |
|
|
38
|
+
|------------------|-------|----------------|----------------|------------|--------|
|
|
39
|
+
| claude-sonnet-5 | $2 | $2.50 | $4 | $0.20 | $10 |
|
|
40
|
+
| claude-opus-5-5 | $4 | $5 | $8 | $0.20 | $20 |
|
|
41
|
+
| claude-haiku-4-5 | $1 | $1.25 | $2 | $0.10 | $5 |
|
|
42
|
+
|
|
43
|
+
(USD per million tokens. Sonnet 5 $2/$10 is now the standard price, per the pricing page footnote.)
|
|
44
|
+
|
|
45
|
+
Measured hour at list price (cache writes priced at the 5-minute rate; the 1h share adds under $1):
|
|
46
|
+
- Sonnet: cache read $110.49 + output $16.25 + cache write $12.59 = $139.34
|
|
47
|
+
- Opus: cache read $16.26 + cache write $6.99 + output $4.75 = $28.00
|
|
48
|
+
- Haiku: $0.14. Total: $167.5 per hour, of which cache reads are 76% and output 12%.
|
|
49
|
+
- Upper bound with the raw D39 counting: about $275 per hour.
|
|
50
|
+
|
|
51
|
+
Per engineer-hour (ESTIMATE): $167.5 / 13.9 measured agents = $12.0; $167.5 / 17.5 stated agents
|
|
52
|
+
= $9.6. Range $9.6 to $12.0 per engineer-hour, $230 to $289 per engineer-day.
|
|
53
|
+
|
|
54
|
+
## 3. What the Max 20x plan sustains around the clock (ESTIMATE, uncalibrated)
|
|
55
|
+
|
|
56
|
+
The conversion from tokens to plan percent is NOT calibrated. G-01 fits it from founder
|
|
57
|
+
readings of the 5-hour and weekly meters. Until then, this is a range with its basis, not a number.
|
|
58
|
+
|
|
59
|
+
- Window ceiling: on 2026-09-27 about 16 agents took the 5-hour window from low to 91%. At the
|
|
60
|
+
D39 target of 85% at window end, that is 15 to 17 agents for one window, if the 9-27 mix
|
|
61
|
+
(tokens per agent, opus share) matches today.
|
|
62
|
+
- Weekly bound: 24/7 is 33.6 five-hour windows per week. If the weekly cap equals W full
|
|
63
|
+
windows, sustainable 24/7 headcount = window ceiling x min(1, W / 33.6). W is unknown; it is
|
|
64
|
+
exactly what G-01 must measure.
|
|
65
|
+
- ESTIMATE: 5 to 16 engineers around the clock. 16 holds only if the weekly cap is not binding;
|
|
66
|
+
the low end assumes the weekly cap is about 10 full windows. Neither end is a measurement.
|
|
67
|
+
- Calibration input for G-01: use API-equivalent dollars per agent-hour (section 2), not raw
|
|
68
|
+
tokens, as the regressor. It weights opus against sonnet the way the plan meter likely does,
|
|
69
|
+
and it collapses four token kinds into one number.
|
|
70
|
+
- The API value of what the plan is delivering today is about $4,000 per day at list price.
|
|
71
|
+
|
|
72
|
+
## 4. What 50 parallel engineers would need (ESTIMATE on PUBLISHED prices)
|
|
73
|
+
|
|
74
|
+
Assumptions: measured mix of section 1 (sonnet 87% of output, opus 13%); caching as today
|
|
75
|
+
(99% of input from cache); 24 hours a day; list prices, no volume discount; no US-only
|
|
76
|
+
inference (`inference_geo: "us"` adds 1.1x); local-only burn, so real cost is at least this.
|
|
77
|
+
|
|
78
|
+
| Engineers | Per day | Per 30 days | Fits under (API spend cap) |
|
|
79
|
+
|-----------|-------------------|----------------------|---------------------------------------|
|
|
80
|
+
| 16 | $3,675 to $4,627 | $110K to $139K | Scale ($200K per month) |
|
|
81
|
+
| 25 | $5,742 to $7,230 | $172K to $217K | Scale at the low end; over it at high |
|
|
82
|
+
| 50 | $11,484 to $14,460| $345K to $434K | Custom tier only (no cap; via sales) |
|
|
83
|
+
|
|
84
|
+
Rate limits are not the binding constraint; the spend cap is. Source:
|
|
85
|
+
https://platform.claude.com/docs/en/api/rate-limits (fetched 2026-09-28).
|
|
86
|
+
- Monthly spend caps: Start $500, Build $1,000, Scale $200,000, Custom none. At 16 engineers the
|
|
87
|
+
Start cap lasts about 3 hours and the Build cap about 6 hours. Tier placement is automatic
|
|
88
|
+
from account history; new orgs may start in a lower Evaluation tier.
|
|
89
|
+
- Peak minute scaled from 13.9 to 50 agents: 238K output per minute, 2.0M ITPM-counted input,
|
|
90
|
+
410 requests per minute. Sonnet 5 limits: Start 2M ITPM / 400K OTPM / 1,000 RPM; Build 5M /
|
|
91
|
+
1M / 5,000; Scale 10M / 2M / 10,000. Opus 5.5 has its own bucket at the same numbers. So
|
|
92
|
+
Build clears 50 agents on rate limits; Start is at its ITPM edge.
|
|
93
|
+
- Cache reads do not count toward ITPM on these models, which is why 99% cached input keeps
|
|
94
|
+
the fleet far under the limits.
|
|
95
|
+
- The rate-limit page warns of acceleration limits on sharp ramps: step headcount up, never jump.
|
|
96
|
+
|
|
97
|
+
Plans (https://claude.com/pricing, fetched 2026-09-28; limits UNVERIFIED beyond the page text):
|
|
98
|
+
- Team: standard seat $20 to $25, premium seat $100 to $125 per month, "5x more usage than
|
|
99
|
+
standard seats". Seat usage limits apply per seat; published numbers for agent-hours per
|
|
100
|
+
seat were not found. UNVERIFIED for a 50-agent fleet.
|
|
101
|
+
- Enterprise: "seat price + usage at API rates", $20 per seat per month billed annually. Economics
|
|
102
|
+
equal the API table above plus seat fees; custom limits and volume discounts are negotiated.
|
|
103
|
+
- Stacking several subscriptions to multiply limits for one automated fleet is not proposed;
|
|
104
|
+
any such question goes to Anthropic.
|
|
105
|
+
|
|
106
|
+
## 5. Ramp gates (D39)
|
|
107
|
+
|
|
108
|
+
Headcount rises one step per hour, and only when all three hold for the last full hour:
|
|
109
|
+
1. Governor allows: projected 5-hour window at or under 85% at window end and weekly at or
|
|
110
|
+
under 90% by the Wednesday 13:00 ET reset (on API billing: projected month under the tier cap
|
|
111
|
+
and any workspace spend limit).
|
|
112
|
+
2. Merged slices per hour rose versus the previous step.
|
|
113
|
+
3. Merged work per token did not fall: merged slices per million output tokens is no more than
|
|
114
|
+
10% below the previous step.
|
|
115
|
+
Step size: +4 engineers (never more than +25%). Any gate failing: hold. Two failing hours in a
|
|
116
|
+
row: step back one. The cut order in D39 applies (cloud, then MEDIUM and LOW local, then opus
|
|
117
|
+
reviewers down to the HIGH minimum; never the Release Manager or a P0).
|
|
118
|
+
|
|
119
|
+
What to measure first, this week: merged slices per million tokens.
|
|
120
|
+
- Numerator: distinct slice IDs (BOARD row IDs such as E-88 or DEP-05) whose commits became
|
|
121
|
+
ancestors of origin/main in the window. Not commit count: 933 commits reached main in 7 days,
|
|
122
|
+
which says nothing about slices.
|
|
123
|
+
- Denominator: deduplicated output tokens in millions, reported alongside API-equivalent
|
|
124
|
+
dollars. Not total tokens: those are 99% cache reads and would make the ratio noisy and tiny.
|
|
125
|
+
- Record hourly in METRICS.md with the headcount of that hour. This is the baseline every
|
|
126
|
+
ramp step is judged against; without it gate 3 cannot be evaluated and the ramp stays shut.
|
|
127
|
+
|
|
128
|
+
## 6. The founder's decision
|
|
129
|
+
|
|
130
|
+
| Option | What it is | Headcount | Cost (ESTIMATE) |
|
|
131
|
+
|--------|-----------|-----------|-----------------|
|
|
132
|
+
| A. Max 20x only | Governor-limited, as today | 5 to 16 around the clock (uncalibrated) | Current plan fee only |
|
|
133
|
+
| B. Max core + API overflow | Max for the core; API key with a workspace spend limit for engineers above the Max ceiling | Core + N | $230 to $289 per extra engineer-day; +10 = $2.3K to $2.9K per day |
|
|
134
|
+
| C. API only, Scale tier | All engineers on API billing | Up to about 25 inside the $200K cap | 16: $110K to $139K per month; 25: $172K to $217K |
|
|
135
|
+
| D. Enterprise or Custom tier | Sales-negotiated limits and discount | 50 | $345K to $434K per month at list, less any discount |
|
|
136
|
+
|
|
137
|
+
CTO recommendation: A now; G-01 calibrates within the week. Move to B only after the section 5
|
|
138
|
+
baseline exists and gate 3 holds at the Max ceiling, because extra engineers are worth buying
|
|
139
|
+
only if merged work per token does not fall as headcount rises. Open the sales conversation for
|
|
140
|
+
D before any plan to exceed 25, since Custom limits are not self-serve.
|
package/loki-ts/dist/loki.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var Un=Object.create;var{getPrototypeOf:On,defineProperty:zG,getOwnPropertyNames:Mn}=Object;var Nn=Object.prototype.hasOwnProperty;function jn($){return this[$]}var Ln,An,Cn=($,Z,Q)=>{var X=$!=null&&typeof $==="object";if(X){var J=Z?Ln??=new WeakMap:An??=new WeakMap,K=J.get($);if(K)return K}Q=$!=null?Un(On($)):{};let Y=Z||!$||!$.__esModule?zG(Q,"default",{value:$,enumerable:!0}):Q;for(let V of Mn($))if(!Nn.call(Y,V))zG(Y,V,{get:jn.bind($,V),enumerable:!0});if(X)J.set($,Y);return Y};var sJ=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var Tn=($)=>$;function Dn($,Z){this[$]=Tn.bind(null,Z)}var R0=($,Z)=>{for(var Q in Z)zG($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:Dn.bind(Z,Q)})};var v=($,Z)=>()=>($&&(Z=$($=0)),Z);var D7=import.meta.require;var lC={};R0(lC,{lokiDir:()=>T0,homeLokiDir:()=>E4,findRepoRootForVersion:()=>qG,REPO_ROOT:()=>i0});import{resolve as F7,dirname as WG}from"path";import{fileURLToPath as Fn}from"url";import{existsSync as rJ}from"fs";import{homedir as In}from"os";function wn(){let $=cC;for(let Z=0;Z<6;Z++){if(rJ(F7($,"VERSION"))&&rJ(F7($,"autonomy/run.sh")))return $;let Q=WG($);if(Q===$)break;$=Q}return F7(cC,"..","..","..")}function qG($){let Z=$;for(let Q=0;Q<6;Q++){if(rJ(F7(Z,"VERSION"))&&rJ(F7(Z,"autonomy/run.sh")))return Z;let X=WG(Z);if(X===Z)break;Z=X}return F7($,"..","..","..")}function T0(){return process.env.LOKI_DIR??F7(process.cwd(),".loki")}function E4(){return F7(In(),".loki")}var cC,i0;var X8=v(()=>{cC=WG(Fn(import.meta.url));i0=wn()});import{readFileSync as Rn}from"fs";import{resolve as Pn,dirname as En}from"path";import{fileURLToPath as kn}from"url";function I7(){if(k4!==null)return k4;let $="10.2.
|
|
2
|
+
var Un=Object.create;var{getPrototypeOf:On,defineProperty:zG,getOwnPropertyNames:Mn}=Object;var Nn=Object.prototype.hasOwnProperty;function jn($){return this[$]}var Ln,An,Cn=($,Z,Q)=>{var X=$!=null&&typeof $==="object";if(X){var J=Z?Ln??=new WeakMap:An??=new WeakMap,K=J.get($);if(K)return K}Q=$!=null?Un(On($)):{};let Y=Z||!$||!$.__esModule?zG(Q,"default",{value:$,enumerable:!0}):Q;for(let V of Mn($))if(!Nn.call(Y,V))zG(Y,V,{get:jn.bind($,V),enumerable:!0});if(X)J.set($,Y);return Y};var sJ=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var Tn=($)=>$;function Dn($,Z){this[$]=Tn.bind(null,Z)}var R0=($,Z)=>{for(var Q in Z)zG($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:Dn.bind(Z,Q)})};var v=($,Z)=>()=>($&&(Z=$($=0)),Z);var D7=import.meta.require;var lC={};R0(lC,{lokiDir:()=>T0,homeLokiDir:()=>E4,findRepoRootForVersion:()=>qG,REPO_ROOT:()=>i0});import{resolve as F7,dirname as WG}from"path";import{fileURLToPath as Fn}from"url";import{existsSync as rJ}from"fs";import{homedir as In}from"os";function wn(){let $=cC;for(let Z=0;Z<6;Z++){if(rJ(F7($,"VERSION"))&&rJ(F7($,"autonomy/run.sh")))return $;let Q=WG($);if(Q===$)break;$=Q}return F7(cC,"..","..","..")}function qG($){let Z=$;for(let Q=0;Q<6;Q++){if(rJ(F7(Z,"VERSION"))&&rJ(F7(Z,"autonomy/run.sh")))return Z;let X=WG(Z);if(X===Z)break;Z=X}return F7($,"..","..","..")}function T0(){return process.env.LOKI_DIR??F7(process.cwd(),".loki")}function E4(){return F7(In(),".loki")}var cC,i0;var X8=v(()=>{cC=WG(Fn(import.meta.url));i0=wn()});import{readFileSync as Rn}from"fs";import{resolve as Pn,dirname as En}from"path";import{fileURLToPath as kn}from"url";function I7(){if(k4!==null)return k4;let $="10.2.5";if(typeof $==="string"&&$.length>0)return k4=$,k4;try{let Z=En(kn(import.meta.url)),Q=qG(Z);k4=Rn(Pn(Q,"VERSION"),"utf-8").trim()}catch{k4="unknown"}return k4}var k4=null;var I$=v(()=>{X8()});var tC={};R0(tC,{runOrThrow:()=>an,run:()=>D0,readStreamCapped:()=>tJ,commandVersion:()=>nn,commandExists:()=>J9,ShellError:()=>HG,MAX_STDOUT_BYTES:()=>rC});async function tJ($,Z=rC){let Q=$.getReader(),X=new TextDecoder,J="",K=0;try{while(K<Z){let{done:Y,value:V}=await Q.read();if(Y)break;if(!V)continue;if(K+=V.byteLength,K>Z){let z=V.byteLength-(K-Z);J+=X.decode(V.subarray(0,z),{stream:!0});break}J+=X.decode(V,{stream:!0})}J+=X.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return J}async function D0($,Z={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:Z.env?{...process.env,...Z.env}:process.env,cwd:Z.cwd}),X,J;if(Z.timeoutMs&&Z.timeoutMs>0)X=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}J=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},Z.timeoutMs);try{let[K,Y,V]=await Promise.all([tJ(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:Y,exitCode:V}}finally{if(X)clearTimeout(X);if(J)clearTimeout(J)}}async function an($,Z={}){let Q=await D0($,Z);if(Q.exitCode!==0)throw new HG(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function J9($){let Z=on($),Q=await D0(["sh","-c",`command -v ${Z}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function on($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function nn($,Z="--version"){if(!await J9($))return null;let X=await D0([$,Z],{timeoutMs:5000});if(X.exitCode!==0)return null;return((X.stdout||X.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var rC=16777216,HG;var K9=v(()=>{HG=class HG extends Error{message;exitCode;stdout;stderr;constructor($,Z,Q,X){super($);this.message=$;this.exitCode=Z;this.stdout=Q;this.stderr=X;this.name="ShellError"}}});function w7($){return sn?"":$}var sn,k0,P8,d0,T28,J8,j8,Y9,p;var l5=v(()=>{sn=(process.env.NO_COLOR??"").length>0;k0=w7("\x1B[0;31m"),P8=w7("\x1B[0;32m"),d0=w7("\x1B[1;33m"),T28=w7("\x1B[0;34m"),J8=w7("\x1B[0;36m"),j8=w7("\x1B[1m"),Y9=w7("\x1B[2m"),p=w7("\x1B[0m")});import{accessSync as Ys,constants as Vs,existsSync as zs,statSync as Ws}from"fs";async function r6(){if(w$!==void 0)return w$;let $="/opt/homebrew/bin/python3.12";if(zs($))return w$=$,$;let Z=await J9("python3.12");if(Z)return w$=Z,Z;let Q=await J9("python3");return w$=Q,Q}async function M6($,Z={}){let Q=await r6();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return D0([Q,"-c",$],Z)}async function R7(){let $=(process.env.PATH??"").split(":").filter((Z)=>Z.startsWith("/"));for(let Z of[...Gs,...$.map((Q)=>`${Q}/python3`)])try{if(!Ws(Z).isFile())continue;if(Ys(Z,Vs.X_OK),(await D0([Z,"-I","-S","-c",""],{timeoutMs:1e4})).exitCode===0)return Z}catch{}return null}var w$,qs,Gs;var C5=v(()=>{K9();qs=["/usr/bin/python3","/bin/python3"],Gs=qs});var jT={};R0(jT,{runStatus:()=>fs});import{existsSync as V9,readFileSync as $2,readdirSync as qT,statSync as GT}from"fs";import{resolve as u8,basename as Rs}from"path";import{homedir as Ps}from"os";function HT($){let Z=Math.trunc($);if(Z>=1e6)return`${(Math.trunc(Z/1e6*10)/10).toFixed(1)}M`;if(Z>=1000)return`${(Math.trunc(Z/1000*10)/10).toFixed(1)}K`;return String(Z)}function BT($,Z,Q){if(Z===0)return null;let X=Math.trunc($*100/Z),J=Math.trunc($*$K/Z);if(J>$K)J=$K;let K=$K-J,Y=P8;if(X>=80)Y=k0;else if(X>=50)Y=d0;let V="=".repeat(Math.max(0,J))+" ".repeat(Math.max(0,K)),z=HT($),W=HT(Z);return` ${j8}${Q}${p} ${Y}[${V}]${p} ${X}% (${z} / ${W})`}async function ks(){if(await J9("jq"))return!0;return process.stdout.write(`${k0}Error: jq is required but not installed.${p}
|
|
3
3
|
`),process.stdout.write(`Install with:
|
|
4
4
|
`),process.stdout.write(` brew install jq (macOS)
|
|
5
5
|
`),process.stdout.write(` apt install jq (Debian/Ubuntu)
|
|
@@ -1494,4 +1494,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
|
|
|
1494
1494
|
`),2}case"start":{let{runStart:X}=await Promise.resolve().then(() => (el(),tl));return X(Q)}case"engine10":{let{runEngine10:X}=await Promise.resolve().then(() => (Qi(),Zi)),{registryLoader:J}=await Promise.resolve().then(() => (wq(),Kn));return X(Q,J)}default:return process.stderr.write(`Unknown command: ${Z}
|
|
1495
1495
|
`),process.stderr.write(Yn),2}}zT();process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var J28=await X28(Bun.argv.slice(2));process.exit(J28);
|
|
1496
1496
|
|
|
1497
|
-
//# debugId=
|
|
1497
|
+
//# debugId=D29AE2E1D30DAC5CB97EC82D1BAB6747
|
package/mcp/__init__.py
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loki-mode",
|
|
3
3
|
"mcpName": "io.github.asklokesh/loki-mode",
|
|
4
|
-
"version": "10.2.
|
|
4
|
+
"version": "10.2.5",
|
|
5
5
|
"description": "Loki Mode by Autonomi. Autonomous spec-to-product system: takes a PRD, GitHub issue, OpenAPI/JSON/YAML, or one-line brief to a deployed app via the RARV-C closure loop with 8 quality gates. Provider-agnostic (Claude Code, OpenAI Codex, Cline, Aider, opencode).",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"agent",
|