loki-mode 11.74.2 → 11.75.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +2 -3
  3. package/VERSION +1 -1
  4. package/autonomy/completion-council.sh +10 -10
  5. package/autonomy/council-v2.sh +4 -4
  6. package/autonomy/grill.sh +1 -1
  7. package/autonomy/lib/browser-open.sh +1 -1
  8. package/autonomy/lib/chat.sh +1 -1
  9. package/autonomy/lib/cockpit-render.sh +1 -1
  10. package/autonomy/lib/done-recognition.sh +4 -4
  11. package/autonomy/lib/efficiency_cost.py +1 -1
  12. package/autonomy/lib/engine10-push.sh +2 -2
  13. package/autonomy/lib/prd-enrich.sh +1 -1
  14. package/autonomy/lib/proof-check.sh +1 -1
  15. package/autonomy/lib/proof-generator.py +3 -3
  16. package/autonomy/lib/proof-pr.sh +1 -1
  17. package/autonomy/lib/skill-link-heal.sh +1 -1
  18. package/autonomy/lib/voter-agents.sh +1 -1
  19. package/autonomy/loki +26 -37
  20. package/autonomy/prd-checklist.sh +1 -1
  21. package/autonomy/receipt_jwt.py +1 -1
  22. package/autonomy/run.sh +28 -28
  23. package/autonomy/trigger-schedule.py +6 -414
  24. package/autonomy/tui.sh +1 -1
  25. package/autonomy/verify.sh +4 -4
  26. package/completions/loki.bash +0 -5
  27. package/dashboard/__init__.py +1 -1
  28. package/docs/ARCHITECTURE.md +1 -2
  29. package/docs/CLI-REFERENCE.md +1 -1
  30. package/docs/COMPONENTS.md +1 -1
  31. package/docs/INSTALLATION.md +1 -1
  32. package/docs/ROUTING-EVIDENCE.md +1 -2
  33. package/docs/V10-RESEARCH.md +1 -1
  34. package/docs/dev/architecture-reference.md +3 -7
  35. package/docs/dev/project-structure.md +1 -4
  36. package/docs/dev/release-checklist.md +13 -31
  37. package/docs/research-2026-07/OBSERVABILITY-TOOL-SPEC.md +1 -1
  38. package/docs/v11/MARKET-SLICES.md +1 -1
  39. package/docs/v11/REGISTRIES.md +1 -1
  40. package/docs/v11/ROUTER-1.md +2 -2
  41. package/loki-ts/dist/loki.js +2 -2
  42. package/mcp/__init__.py +1 -1
  43. package/package.json +2 -2
  44. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  45. package/skills/extending.md +2 -3
  46. package/skills/factory-operations.md +11 -18
  47. package/skills/release-cadence.md +2 -2
  48. package/web-app/dist/assets/{AdminPage-jkjilfbl.js → AdminPage-xKgtIhk2.js} +1 -1
  49. package/web-app/dist/assets/{Avatar-bd5JWkSJ.js → Avatar-Q14AHox9.js} +1 -1
  50. package/web-app/dist/assets/{Badge-DVRit2Xw.js → Badge-yk5M-lip.js} +1 -1
  51. package/web-app/dist/assets/{Button-BNAB-pVZ.js → Button-ynznk0At.js} +1 -1
  52. package/web-app/dist/assets/{CockpitPage-DpG29h_w.js → CockpitPage-C8B765za.js} +1 -1
  53. package/web-app/dist/assets/{ComparePage-Dasg5V41.js → ComparePage-DqzmWKnf.js} +1 -1
  54. package/web-app/dist/assets/{ErrorBoundary-DJojse6b.js → ErrorBoundary-DdBPd_Lq.js} +1 -1
  55. package/web-app/dist/assets/{EvidenceReceiptPanel-Blxw7_u1.js → EvidenceReceiptPanel-jb4Tp38b.js} +1 -1
  56. package/web-app/dist/assets/{GitHubIssuesPanel-BBvSFj80.js → GitHubIssuesPanel-xJQiLcxs.js} +1 -1
  57. package/web-app/dist/assets/{GitHubPRsPanel-BCIKeSBg.js → GitHubPRsPanel-84W3Dhk_.js} +1 -1
  58. package/web-app/dist/assets/{HomePage-C7d__oNG.js → HomePage-St1Xl2tu.js} +2 -2
  59. package/web-app/dist/assets/{LoginPage-BXljL3yY.js → LoginPage-jRt0NUHb.js} +1 -1
  60. package/web-app/dist/assets/{MagicPage-Xjkts_yE.js → MagicPage-CQLFe7LR.js} +1 -1
  61. package/web-app/dist/assets/{MetricsPage-kQvVp-j2.js → MetricsPage-zzX9eTC5.js} +1 -1
  62. package/web-app/dist/assets/{NotFoundPage-D-4ZlEaO.js → NotFoundPage-DDu023SY.js} +1 -1
  63. package/web-app/dist/assets/{ProjectPage-DfzR5RXP.js → ProjectPage-D60UURaH.js} +3 -3
  64. package/web-app/dist/assets/{ProjectsPage-DFDsWzkV.js → ProjectsPage-DqVsKxlt.js} +1 -1
  65. package/web-app/dist/assets/{SettingsPage-CLPIoYT3.js → SettingsPage-G7pPKvo0.js} +1 -1
  66. package/web-app/dist/assets/{ShowcasePage-PZKkyGeY.js → ShowcasePage-CrU_aKgS.js} +1 -1
  67. package/web-app/dist/assets/{SystemSettingsPage-BsBlcnzo.js → SystemSettingsPage-ClKGQFsB.js} +1 -1
  68. package/web-app/dist/assets/{TeamsPage-BSjgNhoU.js → TeamsPage-B530vSNe.js} +1 -1
  69. package/web-app/dist/assets/{TemplatesPage-W2KeAzbg.js → TemplatesPage-COmv_Cqd.js} +1 -1
  70. package/web-app/dist/assets/{TerminalOutput-BjroTiCC.js → TerminalOutput-CufG9YzF.js} +1 -1
  71. package/web-app/dist/assets/{activity-BXZ5YYes.js → activity-Ct1Updr6.js} +1 -1
  72. package/web-app/dist/assets/{bell-D1urp5pa.js → bell-rcvhQuGr.js} +1 -1
  73. package/web-app/dist/assets/{bot-Chedf2bF.js → bot-DzeqEI-b.js} +1 -1
  74. package/web-app/dist/assets/{check-DhaCuOCV.js → check-zacnZHyC.js} +1 -1
  75. package/web-app/dist/assets/{chevron-left-D7BpQyA6.js → chevron-left-Lxnkl8Qg.js} +1 -1
  76. package/web-app/dist/assets/{circle-alert-DnGvQ_AQ.js → circle-alert-DoqSdQdB.js} +1 -1
  77. package/web-app/dist/assets/{clock-CqfxWhHM.js → clock-B7bJcVIC.js} +1 -1
  78. package/web-app/dist/assets/{cloud-BKxp5AWB.js → cloud-DdA9Bu6q.js} +1 -1
  79. package/web-app/dist/assets/{code-xml-BDQ6GBtt.js → code-xml-CAZEZ9T8.js} +1 -1
  80. package/web-app/dist/assets/{database-BmpEx1y_.js → database-Da2GkEIN.js} +1 -1
  81. package/web-app/dist/assets/{dollar-sign-DYNY9R_C.js → dollar-sign-DjDiG-37.js} +1 -1
  82. package/web-app/dist/assets/{file-code-corner-BJi0IBFd.js → file-code-corner-CSL-Jij-.js} +1 -1
  83. package/web-app/dist/assets/{file-plus-Dqyb2bcQ.js → file-plus-02DRA8pV.js} +1 -1
  84. package/web-app/dist/assets/{globe-DPh4RWfM.js → globe-CGyB90kK.js} +1 -1
  85. package/web-app/dist/assets/{hammer-B3xnuoA1.js → hammer-BaQB96TG.js} +1 -1
  86. package/web-app/dist/assets/{index-BpX8DcTr.js → index-lcoI1_Kk.js} +3 -3
  87. package/web-app/dist/assets/{layers-BRCmyCW8.js → layers-BWJBvoeg.js} +1 -1
  88. package/web-app/dist/assets/{loader-circle-n07Pky0M.js → loader-circle-CdcI0FeS.js} +1 -1
  89. package/web-app/dist/assets/{lock-BWqOuQmS.js → lock-BBkw5NJx.js} +1 -1
  90. package/web-app/dist/assets/{package-BJlB_Z-Z.js → package-BpPRO3LM.js} +1 -1
  91. package/web-app/dist/assets/{plus-oH17BZu2.js → plus-D7XbyK29.js} +1 -1
  92. package/web-app/dist/assets/{refresh-cw-CPQ476LL.js → refresh-cw-DLG3hyAi.js} +1 -1
  93. package/web-app/dist/assets/{rotate-ccw-7hLvOcnS.js → rotate-ccw-Bqau4R_S.js} +1 -1
  94. package/web-app/dist/assets/{scroll-text-BCmLauQn.js → scroll-text-BtIL3cNk.js} +1 -1
  95. package/web-app/dist/assets/{server-DfTfvW84.js → server-tZCmZ4yH.js} +1 -1
  96. package/web-app/dist/assets/{shield-alert-CaeGRq19.js → shield-alert-K5JXzFKg.js} +1 -1
  97. package/web-app/dist/assets/{thumbs-up-Dz-l2GPC.js → thumbs-up-CHCVyJdw.js} +1 -1
  98. package/web-app/dist/assets/{trash-2-B-OsDmSo.js → trash-2-DncNxVq0.js} +1 -1
  99. package/web-app/dist/assets/{trending-down-CXTFOxzq.js → trending-down-D8Bp0azX.js} +1 -1
  100. package/web-app/dist/assets/{trending-up-FQEdqr3v.js → trending-up-AixETdKR.js} +1 -1
  101. package/web-app/dist/assets/{upload-CacWSNTg.js → upload-VCbjFn2H.js} +1 -1
  102. package/web-app/dist/assets/{usePolling-cIjZ9qd2.js → usePolling-CQvKD2Jj.js} +1 -1
  103. package/web-app/dist/assets/{user-DAouWFHi.js → user-SK-YguQ6.js} +1 -1
  104. package/web-app/dist/index.html +1 -1
  105. package/autonomy/company-seats.json +0 -82
  106. package/docs/COMPETITIVE-INTEL-2026-09.md +0 -444
  107. package/docs/FOUNDER-DECISIONS-TRUST-SEMANTICS-2026-08-01.md +0 -145
  108. package/docs/FOUNDER-STATUS-AND-DECISIONS-2026-07-01.md +0 -132
  109. package/docs/LOKI-10-BUILD-PROMPT.md +0 -350
  110. package/docs/STRATEGY-2026-2028.md +0 -124
  111. package/docs/V10-VISION.md +0 -161
  112. package/docs/v10/ADOPTION-PLAN.md +0 -375
  113. package/docs/v10/ARCHITECT-CUTS.md +0 -744
  114. package/docs/v10/BACKLOG.md +0 -231
  115. package/docs/v10/BOARD.md +0 -1403
  116. package/docs/v10/CONTROL-PLANE.md +0 -120
  117. package/docs/v10/CONTROL.md +0 -36
  118. package/docs/v10/CP-ASK-PLAN.md +0 -85
  119. package/docs/v10/CP-ENTERPRISE-UI.md +0 -537
  120. package/docs/v10/D51-PHASE-B.md +0 -120
  121. package/docs/v10/D61-SPEED.md +0 -105
  122. package/docs/v10/D63-CARDS.md +0 -354
  123. package/docs/v10/DECISIONS.md +0 -915
  124. package/docs/v10/E2E-D65.md +0 -123
  125. package/docs/v10/ENGINE-LAWS.md +0 -163
  126. package/docs/v10/ENGINE-MEASURE.md +0 -69
  127. package/docs/v10/ENGINE.md +0 -743
  128. package/docs/v10/FAILURE-CLASSES.md +0 -2026
  129. package/docs/v10/FC21B-FC22-PLAN.md +0 -107
  130. package/docs/v10/FIRST-RUN-GATE.md +0 -39
  131. package/docs/v10/FOUNDER-QUEUE.md +0 -29
  132. package/docs/v10/GAP-RESEARCH-1003.md +0 -32
  133. package/docs/v10/GUARDS.md +0 -883
  134. package/docs/v10/L0-WAVE1.md +0 -81
  135. package/docs/v10/LEGACY-REMOVAL.md +0 -408
  136. package/docs/v10/MEDIUM-ANALYSIS.md +0 -346
  137. package/docs/v10/METRICS.md +0 -645
  138. package/docs/v10/MODERNIZE.md +0 -437
  139. package/docs/v10/OPENCODE-PARITY-PLAN.md +0 -84
  140. package/docs/v10/OPERATING-MODEL.md +0 -60
  141. package/docs/v10/PLAN-V12.md +0 -896
  142. package/docs/v10/PROGRESS.md +0 -2735
  143. package/docs/v10/RELEASE-11.md +0 -77
  144. package/docs/v10/RETRO-2026.md +0 -650
  145. package/docs/v10/ROADMAP-D63.md +0 -35
  146. package/docs/v10/SCALE.md +0 -140
  147. package/docs/v10/SCORECARD-PLAN.md +0 -250
  148. package/docs/v10/SWARM-PROMPT.md +0 -98
  149. package/docs/v10/SWARM.md +0 -293
  150. package/docs/v10/cp-redesign/PARITY.md +0 -188
  151. package/docs/v10/cp-redesign/legacy/INDEX.md +0 -1167
  152. package/docs/v10/roadmap-10/01-measurement.md +0 -113
  153. package/docs/v10/roadmap-10/02-cost.md +0 -75
  154. package/docs/v10/roadmap-10/03-speed.md +0 -65
  155. package/docs/v10/roadmap-10/04-first-run.md +0 -61
  156. package/docs/v10/roadmap-10/05-deploy.md +0 -61
  157. package/docs/v10/roadmap-10/06-stability.md +0 -64
  158. package/docs/v10/roadmap-10/07-quality.md +0 -57
  159. package/docs/v10/roadmap-10/08-proof.md +0 -48
  160. package/docs/v10/roadmap-10/09-safety.md +0 -74
  161. package/docs/v10/roadmap-10/README.md +0 -1464
  162. package/skills/sdlc-fleet.md +0 -170
  163. package/tools/cockpit/SPEC.md +0 -275
  164. package/tools/cockpit/index.html +0 -146
  165. package/tools/cockpit/roi-basis.json +0 -33
  166. package/tools/cockpit/server.py +0 -946
@@ -1,915 +0,0 @@
1
- # Decisions
2
-
3
- One entry per decision: context, choice, why, how to reverse. Newest last.
4
-
5
- ## D1. 2026-09-25: stash pre-existing uncommitted work
6
-
7
- - Context: six modified files at v10 start, not made by the loop.
8
- - Choice: `git stash push -u -m "pre-v10 leftover (founder review)"` (stash commit `2c00b2eb`), recorded as founder queue item 1.
9
- - Why: build prompt 1b. Committing them would ship unreviewed work; discarding them would lose it.
10
- - Reverse: `git stash apply 2c00b2eb`.
11
-
12
- ## D2. 2026-09-25: moat suite reports honestly and ratchets instead of blocking on unbuilt properties
13
-
14
- - Context: the build prompt makes the moat suite a release blocker, but four audits found only parts of P1, P2 and P6 built; P3, P4, P5, P7, P8 and P9 are mostly unbuilt. Blocking every release until M2/M3/M9 land would stop the "each milestone ships" loop.
15
- - Choice: every property gets real executable cases now. A case that fails because its feature is not built yet is listed in `tests/moat/pending.txt` with its milestone. The runner fails the release on: any failing case not pending (regression), any passing case still pending (must be promoted), any pending id that stopped being emitted, any crash or vacuous script, and any pending id that was not pending at every exact vX.Y.Z release tag reachable from HEAD that carries the file (tags at HEAD excluded). The list can only shrink. A second list, `tests/moat/cases.txt`, can only grow (union of those releases), so deleting a case is not a way out either. The summary prints "moat: X of 9 properties proven"; nothing may call the moat green while X < 9.
16
- - Why: pending cases still run every time, so nothing is disabled. The tag ratchet stops "move a red case into pending" from ever being a way to go green. This mirrors the Seal's own NOT PROVEN list.
17
- - Reverse: delete `pending.txt` handling from `tests/moat/run.sh`; every failing case then blocks.
18
-
19
- ## D3. 2026-09-25: the verifier exit-code contract binds to `loki proof verify` now, `loki verify` at v10.0.0
20
-
21
- - Context: contract 0/1/2/3/20/64/66. `loki proof chain` already follows it. `loki verify` uses 2=BLOCKED, 3=ERROR and `--fast` exits 0 on INCONCLUSIVE, pinned by docs and tests; renumbering is a breaking change, which the build prompt defers to v10.0.0.
22
- - Choice: `loki proof verify` (the Seal verifier-to-be) adopts 64 (usage) and 66 (input missing) now on both routes. `loki verify` and `--fast` get moat cases that are pending `v10.0.0`.
23
- - Why: the contract lives where the Seal is verified; no existing caller distinguishes "not found" from "tampered" beyond non-zero.
24
- - Reverse: restore exit 1 for not-found and 2 for missing id in `autonomy/loki` and `loki-ts/src/commands/proof.ts`.
25
-
26
- ## D4. 2026-09-25: a supplied key plus an unsigned proof is a failure, not a pass
27
-
28
- - Context: `loki proof verify <id> --jwks <keys>` printed `attestation: ABSENT` and exited 0 when the signature was stripped, so deleting the signature defeated portable proof. The Bun route ignored `--jwks` entirely.
29
- - Choice: ABSENT with `--jwks` exits 1; NOT CHECKED (verifier could not run) exits 2; Bun honors `--jwks`.
30
- - Why: moat property 1. A verifier asked to check a signature must not pass a proof that has none.
31
- - Reverse: revert the attestation exit mapping in `autonomy/loki`.
32
-
33
- ## D5. 2026-09-25: main-red fix pushed with the local pre-push pytest skipped once
34
-
35
- - Context: main was red since `87ec48dc` (the tamper-claim scanner flagged the build prompt's own prohibition line). The local `.githooks/pre-push` runs full pytest and fails on this host on one test, `tests/dashboard/test_build_supervisor.py::...test_host_seatbelt_blocks_docker_ports_and_sibling_reads` (exit 32, deterministic, also on untouched `origin/main`). The host is macOS 27.0; `/usr/bin/python3` exits 69 at an unaccepted Xcode license prompt. Root cause of the exit 32 is not established.
36
- - Choice: ran the full suite with only that test deselected (3403 passed, 12 skipped), then pushed the one-file fix `35c0daaa` with `PRE_PUSH_SKIP=1`. CI runs the Python suite independently.
37
- - Why: fixing main is the only job when it is red; the one failure is host-specific, predates the change, and is tracked (BACKLOG, founder queue for the Xcode license).
38
- - Reverse: nothing to reverse; the skip applied to one push. Future pushes use the hook normally once the host test is resolved.
39
-
40
- ## D6. 2026-09-25: a gap found after a release goes to the backlog; its case lands with the fix
41
-
42
- - Context: once a release carries `tests/moat/pending.txt`, the ratchet refuses new pending entries (D2). A newly discovered gap therefore cannot be filed as a failing moat case (council round 7).
43
- - Choice: keep the rule. A gap found after a release is recorded in `docs/v10/BACKLOG.md` with its evidence; the moat case that pins it lands in the same change as the fix, passing from day one. No exception path for "pending but ahead of the current milestone".
44
- - Why: any exception path is a way to re-park a regression under a new ID. The backlog keeps the gap visible without weakening the gate.
45
- - Reverse: add a reviewed exception list to `tests/moat/run.sh` for new pending IDs whose milestone is later than the current release.
46
-
47
- ## D7. 2026-09-25: verifiers run Python with -E and never import from the checkout
48
-
49
- - Context: council rounds 6 and 7 showed the checkout under verification could supply the verifier's modules: `python3 -` puts the cwd on `sys.path`, an empty `PYTHONPATH` component adds it as an absolute path, and a committed `sitecustomize.py` runs before any in-script guard.
50
- - Choice: every Python invocation on a verify path runs `python3 -E`: `proof verify` (bash and Bun), the remote and deploy verifiers, `proof passport`, `proof chain`, and each chain stage that `tools/verify-chain.py` spawns (a council round 8 finding: the stages had inherited `PYTHONPATH`). The inline heredocs also drop `''` and `'.'` from `sys.path` first. Running `tools/verify-chain.py` directly without `-E` is outside this guarantee for the parent process (its stages are still protected); `loki proof chain` is the covered entry point. `-I` was rejected: it drops the user site, so a user-site `cryptography` would degrade every check to NOT CHECKED.
51
- - Why: an in-script guard cannot stop code that runs during interpreter start-up; `-E` ignores `PYTHON*` variables, so the environment cannot re-add the cwd.
52
- - Reverse: remove `-E` from those calls (tests in `tests/test-proof-verify-jwks.sh` section 13 go red).
53
-
54
- ## D8. 2026-09-26: removing a console control that did nothing is not a breaking change
55
-
56
- - Context: the cycle-4 P7 sweep found console controls whose effect was never stored or sent: team remove-member and change-role, the RBAC role editor, team sharing checkboxes, settings Save buttons, "Test Connection", a fake QR code, a newsletter signup, invented testimonials.
57
- - Choice: remove them (or relabel them as browser-only) in a v9.x minor. A control that had no effect is a fabrication, not a feature a user depends on.
58
- - Why: moat property P7. Before v10.0.0 releases are additive, and deleting something that never worked adds honesty without taking away a capability.
59
- - Reverse: restore from `0afb6e2c^`, wired to a real endpoint.
60
-
61
- ## D9. 2026-09-26: a security or sovereignty default may tighten in a v9.x minor only with an opt-out that restores the old behavior and is itself reported
62
-
63
- - Context: cycle 5 found two defaults that send data or power where the user did not choose: engine side steps sent prompts to the claude CLI when another provider was selected (P5), and the provider process inherited GH_TOKEN/GITHUB_TOKEN (P9).
64
- - Choice: tighten the default now. `LOKI_ALLOW_CLAUDE_SIDECALLS=1` restores claude side steps (and `doctor --airgap` reports it as required egress); `LOKI_ALLOW_AGENT_GITHUB_TOKEN=1` restores the token to the agent (and `loki start` warns). The exact value `1` is required.
65
- - Why: the vision's P5 says data leaves only to endpoints the user chooses; P9 says untrusted text never shares a step with the power to push. The opt-out keeps every v9.x minor additive for a user who relied on the old behavior.
66
- - Reverse: default the two variables to `1`.
67
-
68
- ## D10. 2026-09-26: keep sonnet defaults; top, floor and routed are opt-in spellings until v10.0.0
69
-
70
- - Context: since v7.104.0 every Claude tier defaults to sonnet, so `high` and `small` dispatch sonnet on both routes. The Bun route rejected `--session-model opus` and ignored `LOKI_CLAUDE_MODEL_*`. `docs/environment-variables.md` still says high is an Opus model.
71
- - Choice: add `claude-opus-5-5` to the catalog (confirmed by a real CLI call) and make top, floor and routed reachable on both routes through the existing opt-in spellings (`--session-model opus`, `small` with `--allow-haiku`, `LOKI_CLAUDE_MODEL_*`). Defaults do not change.
72
- - Why: before v10.0.0 releases are additive, and changing what `high` or `small` dispatches changes every existing user's cost. The docs contradict each other, so this is not simply a documented-behavior bug.
73
- - Reverse: remove the alias values from `VALID_TIERS` in `loki-ts/src/commands/start.ts` and the opus-pin branch in `claudeModelFor`. At v10.0.0, decide whether `high`/`small` dispatch the catalog tier model.
74
-
75
- ## D11. 2026-09-26: the @claude bot workflow is deleted; the issue composite is agent-only
76
-
77
- - Context: `.github/workflows/claude.yml` fed the whole issue or PR thread, including outsiders' text, to an agent holding an app token that can push; an author gate on the trigger does not remove the untrusted thread. The issue-to-pr composite action combined the agent and the push.
78
- - Choice: delete `claude.yml` (repo-internal, last successful run February 2026). Split `loki-issue-to-pr.yml` into an agent job (read-only token, no persisted credential) and a publish job (write token, no agent); the composite runs only the agent and refuses a persisted push token.
79
- - Why: moat property P9. Copied workflows pin a version tag, so existing users are unaffected until they re-pin; re-pinning without re-copying fails closed with a clear message.
80
- - Reverse: `git revert` the deletion; restore the PR step in `.github/actions/issue-to-pr`.
81
-
82
- ## D12. 2026-09-26: council review needs unanimous APPROVE; a vote count never overrides a reproduced blocking finding
83
-
84
- - Context: a swarm proposal for cycle 5 onward would have scored HIGH-tier review as "3 of 4 approve" and let one CONCERN with a reproduction be outvoted. CLAUDE.md's SDLC fleet pattern requires unanimous APPROVE and a full council re-run on any CONCERN or REJECT. Cycle-4 round 3 was itself APPROVE, APPROVE, CONCERN, and the concern (a false PROVEN on P7) was real; a 2-of-3 or 3-of-4 count would have shipped it.
85
- - Choice: every review round still needs unanimous APPROVE. A HIGH-tier round may add a fourth adversarial reviewer for extra recall, but any reviewer's blocking finding with a working reproduction blocks the slice regardless of how many others voted APPROVE, and the whole council re-runs after a fix. A vote count only ever settles dissent that comes with no reproduction, and even then the default is to re-run, not to override.
86
- - Why: moat property P2 and the honest-verdict discipline generally. A reviewer count is exactly the kind of aggregate "looks good" the moat exists to refuse; three agreeing votes are not evidence against one reproduced defect.
87
- - Reverse: adopt a quorum threshold for HIGH-tier review and drop the mandatory full re-run after a CONCERN.
88
-
89
- ## D13. 2026-09-26: every council or review agent pins its model explicitly
90
-
91
- - Context: cycle-4 council round 4 was launched with two of three lenses left to inherit the session model. The session model changed mid-conversation (Opus 5.5 to Sonnet 5) between launching the workflow and its lenses resolving, so a round meant to run 2 Opus + 1 Sonnet in fact ran 3 Sonnet-5 lenses. It was killed before completing and re-run correctly.
92
- - Choice: every council, review or HIGH-tier agent call sets `model` explicitly in the workflow script. None inherit the session model. Composition (for example "2 Opus + 1 Sonnet") is enforced by the script, not assumed from context.
93
- - Why: an unpinned model silently changes what was reviewed by what, and a session model change is invisible to a running workflow unless it is checked.
94
- - Reverse: drop the explicit `model` fields and rely on a documented session-model convention instead.
95
-
96
- ## D14. 2026-09-26: root-caused three session terminations to an unscoped pkill -f in a test
97
-
98
- - Context: this session's CLI process terminated cleanly (no crash report, no OOM/jetsam entry, no logged kill signal) three times in about 25 minutes, each time 2-4 minutes into a 4-agent HIGH-tier council review running tests against the main checkout. `tests/test-backend-floor.sh:43` ran `pkill -f "index.mjs"` with no path or PID scoping. Reproduced directly: a decoy process started with an unrelated "index.mjs" substring in its argv was killed by that line. In a shared process namespace (concurrent worktree agents, workflow subagents, the harness's own process tree), this can kill any process whose command line happens to contain that substring, including, plausibly, the session's own process or a concurrent agent's.
99
- - Choice: fixed to find the PID actually listening on the target port via `lsof -ti tcp:<port> -sTCP:LISTEN` and kill only that PID (`61547203`). The already-scoped trap-line pkill on the unique mktemp path was left unchanged.
100
- - Why: this is exactly the pattern global CLAUDE.md's cleanup rules and `docs/v10/SWARM.md`'s guardrails already ban (never kill by name or pattern, only by a PID you recorded), and it is the first concrete, reproduced explanation for an otherwise-unexplained class of session death.
101
- - Reverse: revert `61547203`. Not recommended; the decoy reproduction is on record above and in the commit message.
102
-
103
- ## D15. 2026-09-26: kill_provider_child scoped to this run's own process group
104
-
105
- - Context: user report, reproduced directly: every time a loki-mode session ended via a signal path (a supervisor signal, double Ctrl+C, a single Ctrl+C in perpetual/autonomous mode, or general interrupted-session cleanup), `kill_provider_child()` in `autonomy/run.sh` ran `pkill -f "^${proc}( |$)"` for proc in claude/codex/aider/cline with no scoping to a PID, process group, or working directory. `pkill -f` matches the full command line of every process on the machine, so this killed unrelated Claude Code sessions in other terminals and other projects the instant any loki-mode run ended that way, not just the one that was ending. Confirmed with a decoy process sharing no relationship to the run except the matching command-line substring.
106
- - Choice: scope the reparented-leaf sweep to processes sharing this run's own process group id (a reparented process keeps its process group unless it explicitly calls setpgid/setsid, so this still catches the intended cleanup target). Fixed in the same change as a new regression test, `tests/test-kill-provider-child-scoping.sh`, that proves both directions: a same-process-group leak is still cleaned up, and a different-process-group "unrelated session" decoy survives.
107
- - Why: this is a severe, live defect in the shipped product, not a test-only issue (see also D14, which found the sibling bug in a test script). It directly contradicts the moat's P9 (Rule of Two / safe by construction) spirit even though it is not one of P9's enumerated cases: a completing session should never be able to reach outside its own boundary and terminate another user's unrelated work.
108
- - Why this ships ahead of the swarm queue: reported by the founder as actively recurring and affecting real, concurrent sessions right now. Treated as the single highest-priority fix, landed and reviewed on its own rather than batched into cycle 4 or a PO-cut slice.
109
- - Reverse: revert to the bare `pkill -f "^${proc}( |$)"` sweep. Not recommended; this is confirmed to kill unrelated sessions.
110
-
111
- ## D16. 2026-09-26: a test can reintroduce the exact bug it guards against; verify the test's own kill/decoy logic as strictly as the fix
112
-
113
- - Context: the first version of `tests/test-kill-provider-child-scoping.sh` (committed alongside the D15 fix) picked its "unrelated other session" decoy with `pgrep -f 'claude --dangerously-skip-permissions --continue' | tail -1` -- the literal argv of a real Claude Code session -- and unconditionally `kill -9`'d whatever PID that returned, with no verification it was the decoy the test itself launched. A 4-reviewer HIGH-tier council (all 4 flagged it, one REJECT) reproduced that on a PID-wrapped machine `tail -1` would select the live review session instead of the decoy. Separately, its "reparented leaf in this run's own process group" decoy was a direct child of a bash subprocess never in the same process group as the one that later called `kill_provider_child`, so that assertion never exercised the fix at all. A further, real bug surfaced while fixing this: `setsid()` changes a process's own session and process group but never its PPID, so a plain `setsid ... &` (no enclosing subshell) stays a `pgrep -P $$` direct child for as long as the launching shell lives, making it collateral of `kill_provider_child`'s separate SIGKILL-escalation pass regardless of the pgid fix.
114
- - Choice: every decoy now records its own PID by writing it to a file immediately after `setsid`, uses a unique per-run token in its argv (never a real CLI invocation string), and is launched inside a subshell that exits immediately so it becomes a genuine grandchild-orphan (ppid=1) invisible to any `pgrep -P $$` pass, whichever pgid it ends up in. Each decoy's setup is asserted explicitly (ppid, pgid, not-a-direct-child) before the real cleanup assertion runs, so the test cannot go vacuous silently again.
115
- - Why: a test whose own fixture logic reproduces the bug class under review is worse than no test, because it reads as a passing regression guard while remaining capable of the exact harm it exists to prevent. This generalizes past this one file: any test that kills, matches, or selects a live process by name or pattern must be reviewed at the same severity as product code that does the same thing.
116
- - Reverse: none; the corrected test is strictly more conservative than the one it replaces.
117
-
118
- ## D17. 2026-09-26: the kill_provider_child regression test isolates itself into its own process group
119
-
120
- - Context: round 2 of PF-1's council (3 APPROVE, 1 CONCERN with a reproduced blocking finding) found a fifth instance of the same bug class, this time in the test's own isolation rather than its decoy-selection logic (D16): once the decoys were fixed, the test still calls the REAL kill_provider_child in whatever process group it happens to inherit from its caller. That function's pgid sweep signals every claude/codex/aider/cline process sharing the CALLER's pgid, so a process the test never launched and never recorded (a sibling test-runner lane that does not detach its subprocesses, a CI step that backgrounds a provider before the suite runs, an agent harness with no job control) is exposed to it. Reproduced: an unrelated decoy sharing the test-runner shell's own pgid was terminated even though the test reported 6/6 pass.
121
- - Choice: the test relaunches itself into a fresh session (fork, then setsid, then exec) as its very first action, before sourcing the function under test, so the only processes ever in its process group are its own. Also added a tripwire: pkill/killall are shadowed to log-and-fail rather than execute, so a future regression that reintroduces a bare pkill inside kill_provider_child fails the test loudly instead of depending on what happens to be running in the test's process group at that moment.
122
- - Why: a test that calls the real function under test can be exposed to exactly the hazard that function exists to avoid, if the test itself is not equally isolated. This generalizes past this one file: any test that exercises a process-signaling function must isolate its own process group first, not just sanitize its fixtures.
123
- - Reverse: remove the self-relaunch block and the tripwire shadows. Not recommended; both are reproduced, real protections with no behavioral cost to the test's own assertions.
124
-
125
- ## D18. 2026-09-26: docs/v10/BOARD.md emptied by a python3 heredoc with no read-back verification
126
-
127
- - Context: commit `de3a8503` committed `docs/v10/BOARD.md` as 0 bytes, silently destroying 13189 bytes of real coordination state (every GF/PF/S-NN row). Root cause not fully isolated, but the mechanism is clear: a `python3 -c <<'EOF' ... open(p,'w').write(s) ... EOF` heredoc pattern was used to apply a targeted edit via `re.sub` guarded only by an `assert old in s`; an assertion failure aborts the script, but if the write happens (or a prior failed attempt already wrote a partial/empty `s`) before or independent of that guard, nothing catches it, and the empty file was staged and committed with no diff review, no size check, and no read-back.
128
- - Choice: recovered the file from the last known-good commit (`a82a021a`) in `9ca9c4b9`. Going forward, every edit to a hot coordination file (`docs/v10/BOARD.md`, `PROGRESS.md`, `DECISIONS.md`, `BACKLOG.md`, `METRICS.md`) uses Read then Edit (which refuses to run if the file wasn't read in this session, and fails loudly on a no-match rather than silently writing something else) or, if a script is genuinely needed, checks the resulting file's byte size against a sane lower bound and runs `git diff --stat` before `git add`, never committing a docs file whose diff shows only deletions with no matching insertions.
129
- - Why: this file is the swarm's single source of truth for what is in flight; corrupting it doesn't just lose history, it makes every in-flight slice's true status unrecoverable except by reasoning back through chat transcripts and task notifications, which is exactly the failure mode a coordination file exists to prevent.
130
- - Reverse: none; the fix is the recovery itself plus the changed editing discipline.
131
-
132
- ## D19. 2026-09-26: a "confirmed solid" council verdict on autonomy/verify.sh's round-2 fix was wrong
133
-
134
- - Context: PF-3 round 3's council unanimously confirmed the round-2 `verify.sh` teardown fix (`84ffda82`, the `pgid == app_pid` ownership arm added for a GNU-`timeout`-launched daemon that forks and exits) as solid, mutation-tested from several angles. I told the builder agent "do not touch verify.sh again." Round 4's fresh sweep found this was wrong: `tests/test-runtime-gate.sh` case I fails on every run against that exact fix, because its fixture daemonizes via `node spawn({detached: true})`, which calls `setsid()`. A `setsid`'d process becomes its own session and process group leader (pgid equals its own PID, ppid is 1), which none of verify.sh's three ownership arms (`pgid==child_pgid`, `ppid==app_pid`, `pgid==app_pid`) can match -- the round-2 fix assumed the orphan inherits `timeout`'s process group, which `setsid()` specifically prevents. `verify.sh`'s own comment already names this as an accepted trade-off; the test asserting the opposite is what surfaced the contradiction. Two independent round-4 reviewers reproduced this consistently (4 runs, always red) and traced it to the identical mechanism.
135
- - Choice: sent back for a fifth round to close this gap, either by giving the teardown an ownership proof that survives `setsid` (a per-run token in the daemon's environment, checked via `ps eww`/`/proc/<pid>/environ`), or by changing case I's fixture to a plain-fork daemon (which the existing arm covers) and recording the setsid gap honestly in this file rather than silently accepting a contradiction between the code's own comment and a test that claims otherwise.
136
- - Why: a unanimous "confirmed solid" council verdict, even one built on real mutation testing, is not infallible -- it tested the scenarios it was told to test (the GNU-timeout daemonize case, the direct-child case), and a genuinely different orphaning mechanism (setsid) fell outside all of them until a later round's fresh, independent sweep looked at the registered test suite as a whole rather than re-verifying the specific fix in isolation. The lesson generalizes: "confirmed solid" from a targeted review is a statement about what was tested, not a guarantee against every process-lifecycle shape a fixture can produce.
137
- - Reverse: none; resolved in PF-3 round 5/6 (a per-run environment token checked via `ps -E`/`/proc/<pid>/environ`, plus a port-arithmetic overflow bug in the fixture that round 5 introduced and round 6 fixed). See BOARD.md PF-3, now merged.
138
-
139
- ## D20. 2026-09-26: council_evaluate_member's zero-test-run ordering bug, and the sibling bug it left open
140
-
141
- - Context: BACKLOG 33. `council_evaluate_member`'s affirmative-evidence parser checked `runner=='none'` before `status=='no_tests_run'`, so a zero-test record defaulting to (or explicitly carrying) `runner:none` was read as affirmative pass for `requirements_verifier`/`devils_advocate`, contradicting the #82 anti-fake-green rule that a suite which ran and found nothing must never read as green.
142
- - **Correction to the original draft**: the first version claimed `council_evidence_gate` (~line 1968) "was already correct" and "already excludes runner=='none' and zero-test-run identically or appropriately." This was independently reproduced FALSE by review: `council_evidence_gate`'s own parser reads `{"pass":"inconclusive","status":"no_tests_run"}` (runner omitted) as `PASS:none:true` -- the identical ordering bug, one function away, still open at the time of the original draft.
143
- - **Second correction (rework #1 got the fix shape wrong)**: rework #1 applied the ordering fix at both sites (status checked before the runner=='none' sentinel -- this part is correct and stays), but ALSO narrowed the `runner=='none'` sentinel to require a paired `pass:true` boolean, describing this as "the shape a genuine no-test-tooling project writes." This was independently reproduced FALSE by a second review: the only real writer of a `runner:"none"` no-test-tooling record, `enforce_test_coverage` (`autonomy/run.sh:12691-12692`, via `ensure_completion_test_evidence`), writes `pass:"inconclusive"`, never a bare boolean `true`. The `pass:true` narrowing therefore caught and inconclusive-ized the REAL production no-test-tooling shape too, not just the exploit shape -- dropping the heuristic-council fallback vote (used whenever the voter-agents dispatch fails; covers non-Claude providers and older CLIs) on a genuine no-test-tooling project from 2-of-3 COMPLETE to 0-of-3 COMPLETE, and silently defeating `LOKI_EVIDENCE_NO_TESTS_AFFIRMATIVE=1` for the real shape. Rework #1's own test fixture for the "legit no-test completion preserved" case used a hand-written `pass:true` JSON that is not what `run.sh` actually writes, which is why this regression passed review's first pass and needed a second review round to surface.
144
- - **Resolution (rework #2)**: dropped the `pass:true` narrowing entirely -- `runner=='none'` is unconditional again at both sites, matching the pre-existing (never-broken) behavior for the legitimate no-test-tooling case, while the `status=='no_tests_run'`-checked-first ordering fix stays. Confirmed by two independent reviewers, each building their own fixtures: (1) the exploit does not reopen, because both parsers are a plain top-to-bottom `if/elif` where `status` is checked unconditionally before `runner=='none'` can ever be reached -- a crafted `runner:"none"` + `status:"no_tests_run"` record cannot bypass the check; (2) the real writer's shape now correctly reads as affirmative (2-of-3 heuristic-council COMPLETE), restoring rework #1's regression; (3) the original bug (a zero-test run with a real runner reading as affirmative) stays fixed. New tests in `tests/test-zero-test-inconclusive.sh` source and run the REAL `enforce_test_coverage` against a live no-test-tooling fixture rather than a hand-typed literal, and `tests/test-evidence-gate-no-tests.sh` adds a source-drift anchor that greps `run.sh` for the exact writer literal and fails loudly if it stops matching -- both specifically to prevent this class of test-fixture-diverges-from-writer regression from recurring silently. 78/78, 24/24, 41/41, 5/5 across the four regression suites, no moat regression.
145
- - Why: "no test tooling applies here" and "a suite ran and found nothing" are not equally uninformative -- the second is a worse signal (a check was expected and produced nothing). Treating them identically permissive was an accidental hole in #82's hardening, at two sites, one of which was reachable only through a documented escape hatch. All three corrections above matter independent of the code fix: a decision record that overclaims parity or overclaims a fix's shape misleads every future reader who trusts DECISIONS.md over re-deriving the fact themselves -- exactly the failure mode this file exists to prevent. The sharpest lesson, driving both the fix and the new tests: verifying a fix's own test fixture actually matches what production code writes is not optional, even when the fix's INTENT is obviously right -- a test fixture invented to make an assertion pass, rather than derived from the real writer, can hide a regression from the same review pass that approved the fix's shape. The fix that survived review derives its fixtures from the real writer function directly, closing that gap structurally rather than by discipline alone.
146
- - Reverse: revert to the unconditional `runner=='none'` (pre-D20) at both sites. Not recommended for the ordering half (a RED test run against the unmodified parser scores a zero-test-with-a-real-runner project as MORE trustworthy than a no-test-tooling one, which is backwards); the `pass:true` narrowing itself should never be reintroduced -- it is confirmed to regress the legitimate no-test-tooling path.
147
- - Reverse: revert both ordering changes. Not recommended; a RED test run against the unmodified parsers scores a zero-test project as MORE trustworthy than an identical result under a real runner name, and under the opt-out flag this was a genuine, reachable false-pass at the `council_evidence_gate` site.
148
-
149
- ## D21. 2026-09-26: a unanimous-approval bar applies to "is this diff a strict improvement," never "is this artifact perfect"
150
-
151
- - Context: `tests/moat/p7-no-fabricated-data.sh` (PF-2, the fabricated-data scanner) failed 5 consecutive HIGH-tier review rounds. Each round's diff genuinely closed a real bypass a prior round found, yet each round's reviewers also found a NEW bypass shape the fix didn't cover and voted REJECT/CONCERN on that basis -- an unsatisfiable bar for any heuristic text scanner, since a determined reviewer can always construct one more bypass. D12 (unanimous APPROVE required, a reproduced blocking finding always vetoes) was being applied to the wrong question.
152
- - Choice: round 5's review classified every candidate finding into exactly one bucket before voting: **(a) introduced by this diff** -- a genuine regression, a false positive on real repo code, or a weakening of an existing check; or **(b) pre-existing gap** -- a bypass shape main's scanner (the version before this diff) also misses, which this diff does not worsen. Only bucket (a) is blocking. A bucket (b) finding is never a veto; it becomes a named candidate for its own follow-up slice (see BACKLOG 125 for the 10 candidates this round's review produced). D12 itself is unchanged -- a reproduced bucket-(a) finding still vetoes unanimously, and the reviewer count/pinning requirements are untouched.
153
- - Why: a scanner-hardening slice's job is to be a strict improvement over what ships today, not to reach an unreachable "complete" state in one diff. Applying "would a sufficiently creative adversary still find something" as the pass bar to every incremental hardening slice guarantees an infinite review loop and blocks real, shippable improvements indefinitely while the weaker, already-shipped scanner stays live on main -- vetoing protects nothing in that situation, it just keeps the worse version. This generalizes past P7: any slice whose job is "close one more gap in a heuristic/best-effort detector" (the P7 sweep, PF-3's kill-scan, D7-pattern hardening) should be reviewed against this same two-bucket split, not an unbounded "is it perfect now" bar.
154
- - Reverse: revert to treating every remaining gap as blocking. Not recommended; this is confirmed to have produced 5 rounds of real-but-partial fixes with zero ships, while the bucket split produced a unanimous 4/4 APPROVE and 10 well-scoped follow-up candidates in one round.
155
-
156
- ## D22. 2026-09-27: release.yml changes ship alone, founder-unavailable clause invoked
157
-
158
- - Context: GF-3 (P9 slice) touches `.github/workflows/*.yml` including `release.yml`. Its BOARD row cited "a validation PR (auto-merge OFF; see SWARM.md Captain step 6)" as a required process before counting it, a rule I could not locate anywhere: grepped `docs/v10/SWARM.md` and `docs/LOKI-10-BUILD-PROMPT.md` for "validation PR", "auto-merge", and "release.yml" and found no such section. The citation was itself stale or invented, surfaced by an advisor consultation rather than my own inspection.
159
- - Choice: per the founder-unavailable clause (LOKI-10-BUILD-PROMPT.md's standing authorization to decide and record when a needed rule isn't written), deciding now: a slice that touches `release.yml` ships alone (no other slice merges to main in the same window), and after it merges, its own triggered CI/release run is watched to green before anything else lands. This replaces the unverifiable "validation PR with auto-merge OFF" citation with a rule that is actually written down and can be followed.
160
- - Why: `release.yml` changes are the highest-blast-radius file in the repo (it is what publishes to npm/Docker/GitHub Releases) -- a broken change here doesn't fail loud in a normal PR check, it fails at the next release attempt, potentially mid-publish. Isolating it in its own merge window, watched to green, is the minimum safe bar; no other slice should compound the risk of a bad release.yml diff while it is unverified.
161
- - Reverse: revert to allowing release.yml changes to merge alongside other slices without isolation. Not recommended without first locating (or writing) an actual documented process for it; until then this decision is the standing rule.
162
-
163
- ## D23. 2026-09-27: security-critical findings escalate past the normal review queue, founder-unavailable clause invoked
164
-
165
- - Context: S-18's builder (dispatched against BACKLOG 44, a routine test-coverage ticket) found and empirically reproduced a real, live, currently-exploitable credential-exfiltration vulnerability: Rule-of-Two's GH-token withhold protected only 4 env vars, leaving the GitHub CLI's own `hosts.yml`/keyring-backed credential resolution completely reachable through the provider session's intentionally-live `$HOME`. No written rule in `docs/v10/SWARM.md` or `LOKI-10-BUILD-PROMPT.md` addresses how a security finding discovered mid-build on an unrelated ticket should be triaged against the standing swarm queue and review-tier assignment.
166
- - Choice: escalated the ticket from BACKLOG 44 (LOW/test-coverage framing) to a new BACKLOG 149 entry at HIGH tier, dispatched the fix in the same turn it was discovered ahead of every other queued item (routine P7-scanner rework, the release-blocker chase, S-44's CI fix), and required a 2-reviewer adversarial HIGH-tier quorum given the confirmed live exploitability -- exceeding what a routine MEDIUM-tier moat-scanner slice would normally receive. When the first fix round's own reviewer 2 found a REAL bypass (macOS Keychain-backed `gh` auth and git's default credential helper both survive the fix's `GH_CONFIG_DIR` scoping) and correctly REJECTED, the rework was dispatched immediately rather than queued behind other in-flight work, and the reviewer's own safety incident (a real OAuth token printed to the session transcript during adversarial testing) was surfaced directly to the founder via PushNotification with an explicit rotation recommendation, not merely logged.
167
- - Why: a real, live, currently-exploitable credential-exfiltration path is qualitatively different from a moat-scanner false-negative or a documentation gap -- every turn it stays unfixed is a turn the actual product ships exploitable. The standing autonomous mandate's "decide and record the reason" clause for founder-unavailable moments applies most clearly here: no reasonable interpretation of the swarm's priority order (moat > seal accuracy > delivered accuracy > cost > speed, per CONTROL.md) would rank a live credential leak below routine queue order, and the safety-incident escalation (direct notification, not just a BOARD note) matches the same standing rule that real user-facing harm gets surfaced immediately, not batched into routine status reporting.
168
- - Reverse: treat a mid-build security finding as a normal BACKLOG item queued at its ticket's original tier. Not recommended -- a live, reproduced exploit sitting in the normal queue for even one release cycle is a materially worse outcome than the queue disruption of escalating it immediately.
169
-
170
- ## D24. 2026-09-27: pre-push gate skip for a confirmed pre-existing, host-specific test failure (BACKLOG 21/D5)
171
-
172
- - Context: after landing S-29's merge and several BOARD.md status commits (10 commits total, including a real 2-parent merge onto `tests/moat/p7-no-fabricated-data.sh`), the local pre-push hook's full `python3.12 -m pytest -q` run (1228.61s) failed on exactly one test: `tests/dashboard/test_build_supervisor.py::BuildSupervisorTests::test_host_seatbelt_blocks_docker_ports_and_sibling_reads`, `AssertionError: 32 != 0`. This is BACKLOG 21 ("Seatbelt test fails on this host... Exit 32 unexplained; investigate on macOS 27"), already tracked and cross-referenced from D5, predating this entire session.
173
- - Verification performed before deciding: (1) reran the single test in isolation, reproduced the identical `32 != 0` failure deterministically (0.62s, not a timing flake); (2) checked out `tests/dashboard/test_build_supervisor.py` at the `v9.55.0` release tag (predating every commit in this session) into the working tree and reran the same test against that historical version -- it fails identically. This confirms the failure is not caused or worsened by anything in this session's 10 pending commits; it is a pre-existing, host/macOS-version-specific defect in the test itself (or in what it exercises), consistent with D5's own framing.
174
- - Choice: push with `PRE_PUSH_SKIP=1`, disclosed here rather than silently bypassed, since 3461 of 3462 other Python tests plus every other local-ci check (bash -n, shellcheck, etc.) passed clean, and the one failure is independently confirmed pre-existing and host-specific, not a regression from any change in this push.
175
- - Why: the standing rule is "never disable a test or guard to get green" -- this is not that. No test was disabled, weakened, or edited; the single documented pre-existing failure was verified against the last release tag to confirm it is not this session's regression before the decision was made, and the choice is disclosed here rather than silently worked around. Blocking 10 real, reviewed commits (including a security-adjacent merge review chain and BOARD-of-record bookkeeping) behind an unrelated, already-tracked host defect would not improve product safety and would compound the NO_RECENT_RELEASE violation for no benefit.
176
- - Reverse: never skip the pre-push gate under any circumstance, even for a confirmed pre-existing failure; investigate and fix BACKLOG 21 first. Not chosen now because BACKLOG 21 is explicitly host-environment-scoped (macOS 27 seatbelt behavior), out of scope for this turn's release-blocking work, and already tracked with its own backlog entry for a dedicated investigation.
177
- - **Resolved 2026-09-27 (S-61, merged 46bd86a1):** the dedicated investigation this decision promised found a genuine root cause, not a platform-unfixable gap. On macOS 27.0, `sandbox-exec`'s `(deny network-bind (local tcp "*:PORT"))` silently fails to match an actual bind (the confined process could bind the "denied" port); `tcp4` denies it correctly. Verified via direct `sandbox-exec` reproduction outside the test/Python entirely, ruled out rule-ordering as a cause, and confirmed the real production gate (`smoke_probe_host_seatbelt`) already failed CLOSED before this fix -- it correctly refused to advertise confinement rather than silently exposing a hole, so this was an availability/test-accuracy bug, not a live security exposure. 37/37 tests in the file pass post-fix; the specific test used as this decision's basis now genuinely passes. This retires the D24 skip pattern going forward -- a future recurrence of this exact test failing would be a new regression, not the same accepted pre-existing gap, and should be investigated fresh rather than reflexively skipped under this same D24 precedent.
178
-
179
- ## D25. 2026-09-27: founder directive -- release-train model replaces push-per-merge, first train ships without waiting on S-18 (SUPERSEDED by D96: every approved slice is a release; no trains, no batching. The Train cycle script scripts/train-cycle.sh stays live)
180
-
181
- - Context: the founder identified, correctly, that the swarm's own operating pattern (push to main roughly every 20 minutes, `cancel-in-progress: true` on the Tests workflow, a 26-34 minute real Tests runtime) was self-inflicted CI churn: 10 of the last 12 Tests runs were cancelled by the swarm's own subsequent pushes landing mid-run, not by any real code defect. Only 2 releases shipped in 24h against 139 unreleased commits. This independently confirms and generalizes what this session's own drift audits (turns 102, 120, 132, 138, 144) had already been finding piecemeal (each individual cancellation investigated and disclosed, but never addressed at the systemic level: the push cadence itself).
182
- - Choice, per the founder's explicit directive, six parts:
183
- 1. **Release-train model**: stop pushing on every merge. Batch approved merges locally, push once per train, freeze main (no further pushes) until Tests, Bun Parity, and Security Audit are all green on that exact SHA, then bump VERSION and release, then open the next train. Target cadence: one train per 35-45 minutes, ceiling roughly 30 releases/day.
184
- 2. **Ship the first train now**, covering all 139 currently-unreleased commits, explicitly WITHOUT waiting for S-18/BACKLOG 149's still-in-review security fix -- the founder's own reasoning: the vulnerability S-18 fixes is already live in the published v9.55.0, so shipping the other 139 commits without it does not make the security posture any worse than it already is today. S-18 ships in its OWN train the moment its review reaches unanimous APPROVE. This explicitly overrides this session's own earlier-established practice (turns 132-144) of treating S-18 as the thing nothing else should be pushed ahead of -- that practice was correct for MERGING (S-18 still gets full adversarial review before landing), but wrong for RELEASING (holding an entire release train hostage to one HIGH-tier review, when 139 other commits are ready and the vulnerability is already shipped, was the actual mistake).
185
- 3. **CI config fix** (MEDIUM slice, cut as S-69): scope `cancel-in-progress` to pull-request events only, never cancel a run triggered by a push to main.
186
- 4. **CI speed fix** (MEDIUM slice, cut as S-70): measure real per-shard durations, rebalance/increase sharding (4 to 8) so a Tests run completes under 15 minutes, record before/after in METRICS.md.
187
- 5. **Pulse blind-spot fixes** (LOW slice, cut as S-71): add CI_CANCELLED_STREAK (3+ consecutive cancelled runs on main), MERGED_UNRELEASED (45+ min even when CI reads UNKNOWN), and fix the suppression bug where a main-CI UNKNOWN reading currently masks other violations that should still fire independently.
188
- 6. **Worktree disk cleanup** (cut as S-72): `.claude/worktrees` holds 112 worktrees / ~20GB; remove every worktree whose slice is merged/released/rejected/parked after confirming its branch is fully merged or its work is otherwise recorded, keep at most 10, add a pulse violation for more than 15.
189
- - Why: the founder's diagnosis is correct and matches this session's own accumulated evidence (BACKLOG 150, this session's own turn-102/120/132/138/144 self-corrections about push-triggered cancellations) but draws the conclusion this session itself had not yet reached: the fix is not "push more carefully" or "wait out the cancelled run," it's "stop pushing on every merge, batch into trains." The S-18 sequencing correction is also right on its own logic: this session had over-indexed S-18 as a MERGE-priority signal into also being a RELEASE-priority signal, which are different questions -- review rigor before merge should never be compromised, but a completed, unrelated 139-commit release should not wait on one still-in-review slice when the vulnerability it fixes is already public.
190
- - Reverse: continue push-per-merge and continue holding releases for S-18. Not chosen -- directly countermanded by an explicit founder directive with clear reasoning on both counts.
191
-
192
- ## D26. 2026-09-27: founder directive -- guardrails-as-code, evidence discipline, and agent-budget/context discipline; does not interrupt the in-flight release train
193
-
194
- - Context: a second founder directive arrived while train 1's Tests run was in progress on the frozen SHA (`c31cb1e8`). The directive explicitly instructs not to interrupt the current train, and names 7 concrete guardrail requirements: (1) a PreToolUse hook (`scripts/v10-guard.sh`, wired via local-only `.claude/settings.local.json`) blocking a named set of dangerous Bash patterns (pkill/killall by name, force-push/hard-reset on main, `git add -A`/`git add .`, a BOARD.md commit that drops existing rows, `rm -rf` outside safe roots, VERSION writes outside `scripts/release.sh`); (2) no subagents for trivial orchestration work (commit messages, status checks, BOARD.md row edits, version/CI checks) -- these go through the orchestrator directly or `scripts/v10-ops.sh`; (3) explicit per-role agent time budgets (LOW builder 15m, MEDIUM 30m, reviewer 30m, HIGH adversarial 60m, any shell command 10m under `timeout`) with a new `AGENT_OVER_BUDGET` pulse violation; (4) an evidence-or-it-didn't-happen rule for any claim of "verified"/"green"/"fixed"/"confirmed"/"no fix needed" in PROGRESS.md/BOARD.md/commit messages, with a new `UNEVIDENCED_CLAIM` pulse check over the last 20 doc changes; (5) an incident-to-guard rule requiring every incident to get a `docs/v10/GUARDS.md` entry (incident, root cause with evidence, the guard, the test proving it fires), with named backfills required now (D14/D15 pkill, D18 BOARD.md-emptied, the CI self-cancellation this session repeatedly hit and D25 fixed, the pulse UNKNOWN-suppression bug S-71 just fixed, the hung worktree classifier from this very session, and the over-budget trivial-agent pattern the founder cites as freshly observed); (6) small slice cards (60 lines max) for subagents instead of full conversation history, keeping only CONTROL.md/pulse/BOARD.md in the orchestrator's own live view; (7) a guard review every 50 turns checking for recurring incident classes.
195
- - Choice: build guards 1-3 now as slices through the normal review process (per the founder's own instruction: "each as a slice through normal review"), without interrupting or pushing anything onto the currently-frozen release train (train 1 remains frozen at `c31cb1e8` until Tests/Bun Parity/Security Audit are all green there). Guards 4-7 are process/documentation changes that also queue as slices, cut alongside 1-3, but are not blocking the reply the founder asked for (the founder's own instruction is to reply once guards 1-3 are live).
196
- - Why: this directive is itself direct, textbook evidence for guard 5's own thesis -- this session has repeatedly found and disclosed the SAME classes of near-miss (an agent spending disproportionate time/tokens on trivial work, a stuck background classification process, a BOARD.md edit that could have dropped rows, self-inflicted CI cancellation) as one-off narrative corrections in PROGRESS.md's drift audits, without ever converting any of them into a structural guard that makes the mistake mechanically non-repeatable. The founder's framing ("prompts drift; guards do not") is the correct fix for a pattern this session's own turn-102/120/132/138/144 audits kept re-discovering piecemeal.
197
- - Reverse: continue relying on per-turn discipline and drift-audit self-correction without codifying guards. Not chosen -- directly countermanded, and this session's own history is the founder's strongest evidence against it.
198
-
199
- ## D27. 2026-09-27: Loki directive -- speed: a train every 20 minutes, CI replaces local gates, trains pipelined
200
-
201
- - Context: train 2 sat unpushed for more than 89 minutes. The local-ci fast tier took more than 10 minutes under swarm load (90 of 173 checks at the 600s cap, EXIT=124), and the pre-push hook's serial pytest alone exceeded 10 minutes. The first push attempt was killed by its own timeout. The second reported success through a pipe while `git ls-remote` still showed b651b98d. Loki directed: push train 2 now with PRE_PUSH_SKIP=1 (Loki-authorized; CI is the gate), never pipe git push, and verify each push by ls-remote.
202
- - Choice (Loki approved):
203
- 1. The "Local CI Before Every Push" mandate (2026-07-31) is retired. Before a push, run only syntax checks (`bash -n`, `py_compile`) plus the slice's own tests, capped at 60 seconds. GitHub CI (Tier B) is the release gate.
204
- 2. `.githooks/pre-push` becomes identity check + `bash -n` + red-main warning only (no pytest), target under 5 seconds; a LOW slice in train 3 (S-97).
205
- 3. A push is done only when `git ls-remote origin refs/heads/main` equals `git rev-parse HEAD`; recorded as evidence and enforced by a guard (S-98).
206
- 4. Train 3 carries the release-speed fixes first as each is approved (Part C items 1-7: S-79, S-80, S-84, S-81, the needs:gate removal inside S-84, S-82, S-83); other approved slices ride along but never delay a train.
207
- 5. Trains are pipelined: a train counts as released when publish-npm succeeds. The next train opens immediately, without waiting for npm's availability lag, Docker or Homebrew; train N+1 can run Tier B while train N publishes.
208
- 6. Cadence: push a train every 20 minutes whenever at least one merged slice exists, even a single one. New pulse violation TRAIN_LATE: more than 25 minutes since the last train push while merged-unreleased commits exist (S-98).
209
- - Release Manager exception, disclosed: until S-16 makes `scripts/release.sh` bump every checklist file without prompting or pushing, the Release Manager bumps VERSION with the editor tool (not a shell command) as part of the release commit. v9.57.0 (5332bfc3) was bumped this way. This is the only permitted VERSION write outside release.sh, and it ends when S-16 merges.
210
- - Evidence: train 2 push, `PRE_PUSH_SKIP=1 git push origin main` at 15:48:18Z: rc=0; `git rev-parse HEAD` = `git ls-remote origin refs/heads/main` = 89e350bd641a4b659faa405587a9db5bb7bcc201. Release push at 15:50:09Z: rc=0; both = 5332bfc35ccf801bdf8c67bff9fc07537ac4240f. The per-SHA concurrency from S-80 held on its first real push: Tests on 89e350bd kept running (`in_progress`) after 5332bfc3 was pushed.
211
- - Reverse: keep local CI as a precondition. Not chosen: it cannot finish inside the 10-minute command cap under swarm load, and it duplicates GitHub CI.
212
-
213
- ## D28. 2026-09-27: Loki P0 directive -- restore green, release only verified trees, protect the machine
214
-
215
- - Context: v9.57.0, v9.58.0 and v9.59.0 were bumped and pushed but none had published (npm 9.56.0 at 16:18Z; `npm view loki-mode version`). Causes:
216
- - `pytest -n auto` (S-86) turned the test_build_supervisor lineage race into a near-certain failure (runs 36330898897, 36331204715, 36332036570, 36333026958).
217
- - A shell shard failed on the runtime-gate port-scoping positive control.
218
- - The release job could not push its tag for releases that change workflow files.
219
- - Machine load reached 136: a stale kind cluster (loki-smoke-control-plane) was crash-looping, and an orphaned tests/detect-mock-problems.sh had run for 12.5 hours; Loki stopped both. At 16:30Z a second orphan, PID 79553 tests/test-resource-monitor-sleep-reaped.sh (PPID 1, etime 23:48:17) with its child sleep 69161, was stopped by exact PID (0 remaining).
220
- - Choice (Loki approved):
221
- 1. Restore green by the fastest path. `pytest -n auto` is reverted as its own commit (b01bd36c); item 9 returns after S-102. The shard 0 suite, tests/test-runtime-gate-port-scoping.sh (not moat, not review), is quarantined until 2026-10-03 (ea8ecf1c) while S-106 fixes the race.
222
- 2. Release rule: never bump VERSION on a tree without a green Tier B run on that exact tree; a release is a lookup of a verified commit. Enforced by S-108 (release.sh refuses the bump without a green Tests and Bun Parity run for HEAD) and S-109 (RELEASE_ON_RED pulse violation). Versions bumped but never published are recorded as such in CHANGELOG.
223
- 3. Machine protection:
224
- - Local load must stay under 2x the core count (28 on 14 cores).
225
- - Engineers run only their slice's tests locally, never full suites, and no local `pytest -n auto`.
226
- - Every swarm container gets --cpus=2 and a memory limit, no restart policy, and is removed when done. The S-102 container s102-repro-a167 was capped at 16:30Z (`docker update --cpus 2 --memory 4g`; restart=no).
227
- - New pulse violations HIGH_LOAD (load > 28), ORPHAN_TEST (a tests/* process with PPID 1 or running more than 30 min) and STRAY_CONTAINER (a swarm container older than 1 hour) (S-109).
228
- 4. Release the first green tree, then continue the 20-minute trains.
229
- - Found while acting: train 5 (S-18) introduced a P9 moat regression on Linux: the opt-out positive control, "the hosts.yml probe is blind under the opt-out" (moat job 108658485224). It fails closed (no leak) but blocks every tree from 1cde81a7 onward. P0 S-107 is fixing it forward in a capped Linux container.
230
- - Version accounting: tags v9.57.0 through v9.62.0 were pushed at 16:25Z and 16:29Z to work around the release job's tag-permission failure (S-105), before this rule. v9.60.0 is already tagged at 1cde81a7 (red: P9 and the Python race), so the "first green tree" cannot reuse 9.60.0 without moving a published tag. Train 4 (08d64f4e, v9.59.0) went green on Tests after reruns and contains no S-18, so its full Release rerun is the first verified-tree release. The next release after S-107 takes the next unused version.
231
-
232
- ## D29. 2026-09-27: Loki P0 directive -- rebuild as the Loki 10 engine, task completion is the first release gate
233
-
234
- - Problem as stated: users report Loki Mode does not complete tasks; augmentiq #52 ("add a search bar") ran 40+ minutes with 0 tasks done. Claude Code, Devin and Factory droids finish comparable issues in about 5 minutes.
235
- - Mandate: a new TypeScript/Bun engine in loki-ts (under 5K lines, one state machine: Intake 15s, Plan + Wall 45s, Implement 3 min as ONE provider-CLI session, Fast verify 60s with at most 2 fix rounds, Seal + PR 15s, async Deep verify, hard cap 15 minutes then a DRAFT PR). One append-only JSONL event log per run. Per-repo cache keyed by tree hash. Rule of Two kept. New CLI and one-screen SSE dashboard. One integration adapter interface.
236
- - Everything ships behind LOKI_ENGINE=v10 on the trains, additive only; the old engine stays reachable as legacy until the new one beats it on the eval.
237
- - Release gate (published in full, misses included): on at least 25 tasks with hidden tests, v10 completion at or above raw `claude -p` at the same model and budget, p50 time to PR 5 minutes or less, p90 10 minutes or less, cost per completed task at or below raw Claude Code.
238
- - Deadline: if the gate is not met by 23:00 ET (03:00 UTC), release v10.0.0 with the default still legacy, v10 opt-in, and the measured gap stated plainly.
239
- - All non-P0 backlog paused at 21:43Z: batch 10 stopped with every builder's commit kept on its branch (list in ~/loki-ci-logs/paused-branches.txt and the BOARD rows); ready rows parked.
240
- - Orphan: `timeout 240 bash .../worktrees/agent-afe77b46fbe4962fa/autonomy/run.sh` (PID 22960, child 22986, running 1 day 00:17) ignored SIGTERM and was stopped with SIGKILL by PID at 21:42Z (`ps -o pid= -p 22960` and `-p 22986` both empty afterwards). ORPHAN guard slice E-00 in flight.
241
-
242
- ## D30. 2026-09-28: Loki directive -- any size in one run; accuracy is the lever; 2x gate; modernization program
243
-
244
- - Supersedes the D29 gate and keeps everything in it. North star: Loki 10 completes work of any size in one autonomous run, from a one-line issue to a million-line modernization, with no back-and-forth. Moat order holds; nothing weakens the Seal, the Wall, Rule of Two or honest verdicts.
245
- - Part 1 gate (v10.0.0, small-task engine), against raw `claude -p`, same tasks and model family, all numbers published: at least 2x fewer failures (96.5% or higher vs raw 93.1%; stretch 98.6%); cost per completed task at least 2x lower ($0.118 or less vs $0.2363); time to a correct result at most 1x raw on small tasks and at least 2x faster on medium and large; never worse than raw on any axis in any tier.
246
- - Eval tiers: small (29 tasks, done), medium (15 multi-file, EV-11), large (10 feature or legacy, EV-12); arms raw, v10, legacy.
247
- - v10.0.0 ships tonight. The default flips only if v10 beats raw on the measured tiers; otherwise opt-in with the numbers. No public "2-5x" claim until all three tiers are measured.
248
- - Part 2 (v10.x): `loki modernize <repo> --to "<target>"`; design in docs/v10/MODERNIZE.md (CTO and Architect), Part 2 slices M-01.. cut from it; engineers take them when Part 1 slices stop filling the queue. PROGRESS.md every 30 minutes with Part 1 gate numbers, Part 2 slices done, top blocker; pulse enforces it (E-63 STALE_PROGRESS, over 35 minutes).
249
-
250
- ## D31. 2026-09-28: small tasks must be leaner than raw
251
-
252
- - For tasks sizing.ts rates small: one sonnet implement session with the cached repo map, then impacted tests, then PR. No separate plan or Wall call; the Wall stays for medium and large tasks, or when the repo has no relevant tests. Escalate to opus only on a test failure (E-64).
253
- - Measured before this rule (EV-8, 5 tasks, raw opus 5/5 $0.2161 per completed, p50 41s): full design 4/5 $0.5954; Wall off 5/5 $0.3976; all-sonnet no plan no Wall 4/5 $0.294 p50 44s (~/loki-ci-logs/ev8r-{A,B,C}/results.jsonl). One sonnet session costing more than raw opus's whole task means the per-session overhead is the cost driver; E-65 measures and cuts it.
254
-
255
- ## D32. 2026-09-28: augmentiq #52 user report fixed in v10 only
256
-
257
- - Built into the v10 engine, no legacy fixes: "already implemented" is a first-class outcome with evidence, receipt and issue comment, no PR (E-66; aiq-52 expected outcome in the eval, EV-13); no pause state, anything unfinishable ends as a draft PR or an issue comment with the reason within the 15-minute cap (E-67); per-call deadline, progress every 30s, every exit code classified including 125 and 143 (E-68); cost shows "not measured", never $0 when unmeasured (E-69); the dashboard shows its version and the CLI's, warns on mismatch, and replaces an older dashboard on its port (E-70).
258
- - Legacy stays as it is until v10 becomes the default; then legacy is deleted.
259
-
260
- ## D33. 2026-09-28: engine10 line budgets split, core cap held at 5,000
261
-
262
- - The E-02 budget test went red at 5,288 (Tests run 36377688703) because modernize/ (M-01, M-02, M-05, M-06) was counted inside the D29 "under 5K lines" core.
263
- - Core engine (engine10 minus modernize/) stays under 5,000 lines, counted as today (raw lines, blanks and comments included). Not raised, not recounted as SLOC: that would add about 920 lines by redefinition, and the cap is the auditability part of the moat.
264
- - Pending core slices (E-67, E-66, E-61, M-14) share the 92-line headroom (core 4,907 at 983dda58). Each card states its net core delta; anything over is offset by deleting dead or duplicated core code in the same slice. Deleting comments on Seal, Wall, verify or Rule of Two logic is not an offset.
265
- - modernize/ gets its own cap of 4,000 lines in the same test: 25 planned modules (MODERNIZE.md section 13) at about 150 lines each plus 15% slack. M-24's view moves to mod/dashboard.ts. M-14 stays under 20 lines in wall.ts and calls into mod/oracle/.
266
- - Core never imports modernize/ (the cli.ts TABLE string is exempt), so the split cannot hide core code.
267
- - Hitting either cap means re-slice or delete, never raise. Ruled by the CTO (opus) on the Chief of Staff's request; implemented by E-76.
268
- - 2026-10-15 (M-22/M-23 integration): loki-ts/src/util/ may host engine10 entry points and modernize helpers that would push modernize/ past its cap (util/modernize_unit.ts for remote unit jobs, util/python.ts for pytest running and parsing); they import engine10, engine10 core never imports them.
269
-
270
- ## D34. 2026-09-28: large tier is real upstream PRs, one size gate, legacy moves to M-27
271
-
272
- - EV-12 failed 4 reviews: synthetic lg-* tasks met the size bar mainly by deleting starter docstrings (added lines 93-106), came from an uncommitted generator, had 0 legacy tasks, and their size script exited 0 on a miss. They are closed, not merged (branches slice-EV-12a/b/c kept).
273
- - Size is one command for every tier (eval/loki10/measure-size.py, run in test-harness.sh, exits 1 on any miss): files = touched non-test .py source files; lines = added non-blank lines; deletions never count. Medium: at least 2 files. Large: at least 4 files, at least 150 added lines, and above the largest medium task (74 today; the old "137" counted CI, config and deletions).
274
- - Large tasks use the medium pub-* pipeline: upstream repo, ref = merge^1, verbatim upstream hidden tests, RED/GREEN through run.sh, deletion mutants recorded.
275
- - Amends D30: legacy coverage leaves the large tier and lives in the modernize eval (M-27). The large tier is 10 feature tasks.
276
- - EV-14 may decide the default flip on 5 real large tasks, 2 runs per arm: v10 completions, cost per completed task and p50 time all at or better than raw. No large-tier speed claim until 10 tasks; at 10, EV-14 re-runs, and a loss on any axis reverts the default.
277
- - Ruled by the CTO (opus) on the Chief of Staff's request.
278
-
279
- ## D35. 2026-09-28: DEP workstream (dependency modernization), founder directive
280
-
281
- - Goal: every dependency, runtime, GitHub Action, image, chart, Terraform provider and the Homebrew formula on its latest stable version, nothing broken.
282
- - Priority: E, EV and M slices always first. DEP uses at most 3 builders, only when the ready queue has spare capacity, never holds a train and never blocks a release.
283
- - Order: DEP-01 inventory (docs/v10/DEPS.md, deterministic, no upgrades), then small slices: patch and minor grouped per ecosystem (LOW, lockfiles regenerated and committed); every MAJOR its own slice (MEDIUM, release notes and migration guide read first, breaking changes fixed in the slice, notable changes recorded); Actions on the latest major pinned by full commit SHA with the version in a comment; EOL runtimes dropped and current stable Node, Python, Bun added, keeping one previous supported version where users still run it; Agent SDK and Anthropic SDK upgrades re-run the v10 small-tier eval on 5 tasks (completion, cost, time no worse); Docker, Helm, Terraform on latest stable with digests pinned.
284
- - Safety: every new or changed package passes the hallucinated-dependency guard and npm/pip audit with no new high or critical findings; full Tier B plus the moat suite green per slice, ratchet never regresses; anything unfixable within budget is parked in DEPS.md with the exact error, never force-merged; upgrades ride normal trains and are listed in each train's CHANGELOG.
285
- - Keep current: a weekly scheduled check (or pulse DEPS_STALE) reports anything more than one minor behind or past EOL and cuts a DEP slice.
286
-
287
- ## D36. 2026-09-28: release notes are fully written for every version (founder directive)
288
-
289
- - Every VERSION bump carries a full CHANGELOG section: a one-line summary, `###` sections with a bullet for every user-visible change, and the full sections of any version it carries that never reached npm. The GitHub release body is that section, never the "Release vX.Y.Z" placeholder.
290
- - Found: release.yml matched `^## v$VERSION$` against dated headings, so v9.80.1, v9.81.0, v10.0.1, v10.1.0, v10.1.1 and v10.2.1 were published with the placeholder while every gate stayed green. All six backfilled on 2026-09-28 with `gh release edit --notes-file`; the v10.1.1 entry was also rewritten in full.
291
- - Enforcement (E-88): the release fails without a full section, and the pre-push hook refuses a VERSION bump without one. Until E-88 merges the Release Manager checks `gh release view` after every publish.
292
-
293
- ## D37. 2026-09-28: fixed release cadence, overlapping trains, release blockers are P0 (founder directive)
294
-
295
- - The Release Manager cuts a release at :00, :20 and :40 whenever main is green (Tests and Bun Parity at HEAD) and at least 1 merged-unreleased slice exists (a slice commit that is not an ancestor of the latest published tag). Never wait to batch more. Target 3 releases per hour.
296
- - Trains overlap: the next cut waits only for the previous release's publish-npm job to succeed, not for npm availability, Docker or Homebrew.
297
- - Anything blocking a release (security finding, gate refusal, dispatch problem) is a P0 with a 10-minute response, and its class gets a guard so it never blocks twice (so far: E-86 gitleaks pre-push, E-87 dispatch path, E-88 release notes).
298
- - The pulse raises RELEASE_CADENCE when more than 25 minutes pass with a green main and merged-unreleased work (E-89).
299
- - Found at 16:20Z: the "20 merged slices waiting" were stale BOARD cells, all already in v10.1.0 to v10.2.1 by git ancestry; flipped to released with the tag. E-90 makes the Release Manager flip rows automatically after each publish.
300
-
301
- ## D38. 2026-09-28: large tier uses upstream-first hidden tests with a requirements map; the flip may proceed on small plus medium
302
-
303
- - Two D34 rounds: 0 large tasks passed; every candidate (werkzeug 1513/1680/1769, httpx 1522/1550/3319, attrs 660) fell to a 6 to 40 line reviewer shortcut, because upstream PR tests cover fragments of a feature.
304
- - Amends D34: hidden tests are upstream-first (verbatim PR tests, then later upstream tests of the feature, then authored public-API tests). Each non-verbatim test fails at ref by assertion and passes at merge; all hidden files are sha256-frozen before any arm run; authors never see arm output.
305
- - A shortcut is a patch that omits a requirement the prompt states. Each task lists R1..Rn covering its sized refdiff; each Ri names a test that fails on the refdiff-minus-Ri mutant; all known shortcuts are committed as must-fail fixtures; one 45-minute independent opus attempt must pass nothing. Prompt trimming to fit the tests is forbidden. No private names; -k only with a NOTES justification; touched upstream test files also run whole as a regression check.
306
- - Rejected: shortcut-size thresholds and deletion-only bars (they mismeasure delivered accuracy); an alternative oracle (only its regression part is kept).
307
- - 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.
308
- - 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.
309
-
310
- ## D39. 2026-09-28: usage governor first; engineers are an output of the budget (founder directive 17:44Z)
311
-
312
- - 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.
313
- - 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.
314
- - 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.
315
- - 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.
316
- - 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).
317
- - 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).
318
-
319
- ## D40. 2026-09-28: fix v10 before scaling; cut cost; results are durable (founder directive 18:36Z)
320
-
321
- - Order: (1) failure analysis of the medium tier (EV-14: raw 12/14, v10 10/14): for each task raw completed and v10 did not, name the stage that lost it from the v10 event log, fix the cause, re-run those tasks, publish before and after; target v10 at or above raw on medium, then the small plus medium flip (D38). (2) Cut cost: cache reads dominate spend; subagents get short slice cards and fresh contexts; the Chief of Staff stops re-reading long files; cost per merged slice is measured before and after. (3) Headcount holds at the governor's current level; no ramp toward 50 until v10 beats raw on medium and cost per merged slice has dropped. (4) Eval result files are never lost again: durable copies outside the repo and a redacted in-repo archive before any worktree is removed, with a guard (E-101). (5) Over-budget agents are stopped and re-sliced; load stays under 28.
322
- - Actions 18:40Z: wave E27 stopped (over budget, load 50); its four approved slices (E-89, E-94, E-95, E-88a) are kept and three merged; the rest re-sliced from their committed branches. EV-15 (medium re-run, results under ~/loki-ci-logs/eval) and E-98 (CTO stage-by-stage analysis) and E-101 (durability guard) dispatched.
323
-
324
- ## D41. 2026-09-28: win the balanced scorecard on every model tier (founder directive 21:22Z)
325
-
326
- - The bar, per model tier tested: Loki at or above raw on completion, at or below raw on cost per completed task, and at or below raw on p50 time, all three together. The v10 default flips only when the scorecard is green on small and medium (supersedes the completion-only flip rule in D38/D40).
327
- - Build order, highest leverage first, each measured before and after on the eval: finish E-98f; then (1) cheap model plus verification: implement on the cheapest capable model, 2 parallel attempts on medium and large selected by the Wall plus impacted tests actually passing, escalate to the top model only on a deterministic failure; eval arms for raw sonnet, raw opus and loki on sonnet, headline target loki on sonnet at or above raw opus on completion at 2x lower cost or better; (2) cut re-reading cost (76% of spend is cache reads): a small stable cached prefix, load only relevant files from the repo map and test map keyed by tree hash, rule-based trajectory trimming, tokens per task by type before and after; then (3) repo memory (build and test commands, flaky tests, conventions, failure causes) measured cold versus warm, warm cheaper and faster; (4) speed: Wall in parallel with implement, dependency install cached by lockfile hash, impacted tests only in fast verify, p50 at or below raw on every tier; (5) backlog throughput: loki <label or milestone> runs N issues in parallel, a single writer each, one PR per issue.
328
- - Reporting: a scorecard table per model tier in METRICS.md after each change (completion, cost per completed, p50, with raw alongside).
329
- - Staffing: an opus Architect splits (1) and (2) into slices now so builders start the moment E-98f reports; E-98f stays first.
330
-
331
- ## D42. 2026-09-28: e10ext/ approved with amendments; Wall red means a real assertion failure; S41-16 before all Wall work; S41-14 deferred; M-13 binds normalizers to the M-12 seal
332
-
333
- - (1) e10ext/ APPROVED, amended. `loki-ts/src/e10ext/` gets a 1,500-line cap in budget.test.ts; D33's never-raise rule applies. Core may import it; it may not import stages/, and the test also bans any e10ext import of seal.ts, verify.ts, wall.ts or verify_cmd.ts except `import type`. e10ext returns data only (a choice of model, prompt, files or candidate diff); it never runs tests, never computes pass or fail, never writes Wall files or Seal inputs. Candidate selection ranks on results core's verify already produced, and core re-runs verify and Seal on the final primary tree. With that, D33's purpose holds: every verdict path stays in the 5,000-line core. Core's call sites into e10ext are part of the audit surface and count against core.
334
- - (2) S41-14 is DEFERRED, not run in wave 2. E-98f shows no speed win (Wall-off p50 214s vs default 209s; opus implement 138s), and it touches the moat for nothing measurable; speed work goes to implement (item 1, S41-06) and lockfile-cached installs. It may be revived only on new evidence that Wall is 15% or more of p50 wall-clock, and then only under this invariant: the Wall files are sha256-sealed and proven red on the base tree BEFORE the implement diff exists anywhere the Wall author or runner can read it (Wall reads base only, in its temp dir); red-on-base runs on a pristine base checkout, never by resetting the implement worktree; implement never sees Wall files. A post-implement red check is rejected.
335
- - (3) S41-16 is P0, confirmed: wall.ts:48-51 counts any throw as fail, and `/bin/sh -c 'python -m pytest ...'` exits 127 here (command -v python rc=1), so every pytest red-first check today is vacuous and already_satisfied cannot fire. It merges before any other wave-1 card that touches wall.ts, verify or Seal, and before any eval run counts Wall seals. Classification: red = the runner started and reported at least one failed test (pytest exit 1; jest/vitest/bun non-zero with a parsed failed-test count above 0). A collection error (pytest exit 2) is red only when its error is ImportError, AttributeError or NameError on a name inside the repo under test (the feature does not exist yet); otherwise it is not_run. Exit 126/127, tool not found, pytest exit 3, 4 or 5, a timeout, or no parsed count is not_run, which refuses the seal (NOT PROVEN) and never counts as red. The mutation test must include a launch failure that goes red today.
336
- - (4) M-13: fix (a) is the only allowed fix; (b) is rejected because event order is not a binding. M-12's sealOracle takes the card's normalizers (default: tolerance 0, empty skip_fields), writes their sha256 into sealed.json and the oracle.captured event, and equiv refuses PROVEN when the normalizers it uses do not hash-match, or when the seal has no hash. The separate sealNormalizers call is deleted. M-13 may edit the M-12 seal file under modernize/ for this sealing change only, as the single writer while no other slice holds it.
337
-
338
- ## D43 (founder, 2026-09-28T22:25Z): the scorecard decides only outside its noise
339
-
340
- Raw claude -p swung 85.7% to 71.4% between two runs on the same 7 medium tasks, so the sample is smaller than the effects being measured. Before any flip decision:
341
- 1. Cost capture first (S41-01): no scorecard counts while any evaluated cost row is null (already n/a = red in SCORECARD-PLAN section 2).
342
- 2. The medium tier holds at least 20 tasks and every arm runs at least 3 reps. The scorecard reports 95% intervals; a mark is green or red only when the interval of the Loki minus raw difference excludes 0, otherwise it is inconclusive, and inconclusive never flips a default (S41-17, S41-20a to c).
343
- 3. Speed is v10's worst medium axis (p50 138 to 214s against raw 56 to 70s): profile stage wall-clock per run and cut the slowest stage first (S41-19, then a cut slice named by its result).
344
- 4. Auth is checked before every rep (S41-03 auth_guard) and an interrupted eval resumes from its out files, never re-runs from scratch (S41-18).
345
-
346
- ## D44 (founder, 2026-09-30T17:51Z): green main by construction, releases on a 10-minute clock
347
-
348
- Main went red four times on 2026-09-30 from structural checks CI caught after a push. From now on:
349
- 1. Trains. The Release Manager merges approved slices onto train/N and pushes it; Tier B (Tests, Bun Parity, Coverage) runs there. Main is fast-forwarded only to a train commit whose Tier B is green (scripts/train-promote.sh refuses otherwise). Unverified merges are never pushed to main. A red train drops or fixes the failing slice and re-runs; main stays releasable.
350
- 2. Release clock at :00/:10/:20/:30/:40/:50: if main has a green commit newer than the last release, bump VERSION (verdict reuse through version-bump-only) and publish. Trains overlap. Target 3 or more releases per hour, stretch 6.
351
- 3. Structural checks (shard-durations rows, hardcoded path scans, test registration, doc-drift, line budgets) run in Tier A and as a pre-merge check, each under 10 seconds. A slice is not approved while one fails.
352
- 4. Staff 8 or more builders; clear waiting reviews with sonnet for LOW/MEDIUM; opus stays under 30 percent.
353
- 5. Pulse gains RELEASE_CADENCE (a green unreleased commit on main older than 20 minutes) and MAIN_RED_BY_MERGE (a push to main failing Tier B). Releases per hour are reported in METRICS.md hourly.
354
- Bootstrap: train/1 is verified through a pull request to main (pull_request already triggers Tier B) and carries the train/** push triggers so later trains verify on push.
355
-
356
- ## D45 (founder, 2026-09-30, relayed by the autonomi-dev-dc steering session): the product runs against a delivery contract
357
-
358
- Loki's definition: "autonomous software factory that runs with the knowledge of what it's supposed to deliver". Binding for Tier 0 and loki-seal:
359
- - Every run starts from an explicit delivery contract: the acceptance criteria derived from the issue, spec or task (intake plus the Wall).
360
- - A run is judged only against that contract. Done means the contract's checks ran and passed.
361
- - The receipt states the contract, what was proven against it, and what was not.
362
- - If the contract cannot be derived, the run ends BLOCKED with one question; it never guesses and calls it done.
363
- - loki-seal follows the same rule: it reads what the user asked for (the task or issue) and refuses "done" until the checks tied to that request pass, not only "the suite is green".
364
- - Wording: README line 1 stays "Your agent says done. Loki proves it." (founder queue row 10, veto pending). Line 2 is the category line "An autonomous software factory that knows what it is supposed to deliver, and proves it did.", used verbatim in package.json description and SKILL.md. The GitHub About text stays in the founder queue.
365
- - Competitive intel: the steering session scans rivals twice daily (list at ~/git/autonomi-dev/research/2026-09-30-adoption/COMPETITOR-WATCHLIST.md) and proposes at most 3 backlog rows per scan, each naming the metric it moves. Until the first-run gate passes on a `next` version, only threats to the moat (for example a rival shipping portable verifiable receipts) jump the queue; everything else, including enterprise asks (SSO, audit, policy), queues behind Tier 0 and never carries certification claims.
366
-
367
- ## D46 Release SLO: 3 to 6 `next` releases per rolling hour (2026-10-01, founder directive relayed by the steering session at 00:20Z)
368
- - Founder's words, as relayed: "I WANT 3-6 releases every hour, no excuses, no push back, no compromise."
369
- - SLO: at least 3 `next` releases in every rolling 60 minutes, target 6. Speed comes from the pipeline, never from weaker checks: no skipped or quarantined moat tests, nothing added to tests/moat/pending.txt to get green, `latest` only via the first-run gate, every Never-list item stands.
370
- - Pipeline, effective immediately:
371
- 1. Green slices only: a slice merges into main only after its own branch passed full Tier B Tests (slice branches are pushed so CI runs in parallel). Trains only collect already-green slices.
372
- 2. Drop, don't fix forward: a red train is re-cut within 5 minutes without the offending slice (identified per slice or by the failing suite's owner) and shipped; the slice returns to its engineer. Fix forward only for failures that live in main.
373
- 3. Stacked trains every 15 minutes from the green slices merged so far, with 2 to 3 in flight; ship whichever goes green, newest first.
374
- 4. Release reuses the train's verdict for the identical tree (D28). E-156 removes the gitleaks key-file false positive at the source.
375
- 5. Roles: one Release Captain (sonnet) cuts and ships trains; one CI-health engineer (sonnet) owns red shards, environment problems and flake history; the Chief of Staff checks the SLO every 20 minutes.
376
- 6. A v10-pulse RELEASE_SLO alarm fires below 3 `next` releases in the trailing 60 minutes; on it, the Chief of Staff ships the newest green train or the last green tree first, then fixes the cause.
377
- 7. Slices stay small enough to build and pass in under 30 minutes; bigger work is split.
378
- - NOT applied without direct founder approval: moving the release-blocking full-history gitleaks scan (`--all`) out of the Release path (item 4 of the relay). It weakens a security gate on a relayed instruction; queued as FOUNDER-QUEUE row 14.
379
-
380
- ## D47 (CTO, 2026-10-01): honest exits on the default path, and UNSIGNED is never a pass
381
- 1. Legacy `loki quick` exits 3 when the diff weakens tests: a skip marker added, test runner config changed, or an existing test file deleted or renamed. Edited assertion lines are disclosed in the receipt and keep rc 0. A NOT VERIFIED headline from unproven gates alone keeps rc 0.
382
- 2. The signal is a proof fact (tests_integrity in degraded[]), never the headline. It only raises an inner rc of 0, in quiet and verbose modes alike. first-run-gate G1 counts green only as pass 2 and fail 0, so a skip is not green.
383
- 3. `loki verify` exits 3 on UNSIGNED on both engines, on any machine, with or without a local key, because a stripped receipt must never rank above UNCHECKED (rc 2).
384
- 4. Recording the kid outside the hash and markers inside the body were rejected: verification is already unhashed and a forger can rewrite any body field.
385
- 5. `--allow-unsigned` or LOKI_VERIFY_ALLOW_UNSIGNED=1 accepts UNSIGNED with an explicit line. It never changes TAMPERED or UNCHECKED, and verify never creates a key.
386
- 6. Both slices (A-118, A-121b) are HIGH tier with red-first fixtures (skip, config, rename, downgrade, fresh HOME). They land before `latest` is promoted, together with A-115.
387
-
388
- ## D48 (founder, relayed by autonomi-dev-dc at 02:35Z): "10/10 on everything" by 04:35Z
389
- 1. Ten rows, each with a CI acceptance test, scored against the best competitor; 10/10 means the test passes in CI, never a claim. Quality bar and the Never list unchanged; D46 cadence continues.
390
- 2. Rows: (1) gaming matrix on both engines ends non-VERIFIED with rc != 0; (2) portable receipt: `loki keys export` + `loki verify --pubkey`; (3) quiet default output at most 8 lines, real-mode wall within 1.5x raw `claude -p`; (4) first-run gate on node:test, pytest and go test repos, only fix files change; (5) exit ladder on legacy quick plus a --json schema validated against real output; (6) `loki doctor --fix`, doctor under 2s; (7-9) lean v10 engine default for `loki "<task>"`, issue mode and `loki quick` on next, legacy escape hatch kept, non-null cost on every gate run; (10) repo-root .claude-plugin/marketplace.json listing packages/loki-seal, tested in a clean Claude Code HOME, one README install line.
391
- 3. Rows 7-9 flip the default only after A-117, A-118 and A-119b are merged and the gaming matrix (row 1) passes; until then they are built behind the existing flag.
392
- 4. Staffing is bounded by machine load (max 28) and the worktree cap (15); rows run in waves, not all at once. Status per row is written to PROGRESS.md at 03:35Z and 04:35Z as pass, fail or not started, with what is missing.
393
-
394
- ## D49 (founder, CONFIRMED directly in the Release Manager session at 02:42Z): promote to `latest` now and auto-promote every release
395
- - Relayed text: "everything should be released asap, no holding of anything done so far as well", "and going forward". Asks to promote 10.5.16 to `latest` now and trigger promote.yml automatically after every Release.
396
- - Not applied by the Release Manager because it contradicts the standing instruction in this session ("NEVER run promote or move `latest`") and SWARM-PROMPT-ADOPTION, and a peer relay is not the founder's direct approval for a hard-to-reverse, user-facing change. Awaiting the founder's direct confirmation in the Release Manager session. Prepared evidence: first-run gate stub against the npm-installed 10.5.16.
397
- - 02:42Z: the founder answered directly in the Release Manager session: "Apply D49 fully" and, for D48 rows 7-9, "Flip on next now". Applied: the first-run gate stub on the npm-installed 10.5.16 passed (0 assertions failed, wall 34s); promote.yml dispatched for 10.5.16 (run 36807172046). Auto-promotion on every green Release (stub gate plus Post-Release Smoke) is a slice. A-117, A-118, A-119b and the real-provider run are no longer `latest` blockers; they ship as they land.
398
-
399
- ## D50 (founder, relayed by autonomi-dev-dc at 02:45Z): the harness is the product; proof is the floor
400
- 1. Finish only the in-flight proof work (A-117, A-118, A-119b, gaming matrix, verify --pubkey); move most engineers to the harness.
401
- 2. North-star metric: model lift on our own eval (hidden tests, small and medium tiers): Loki+model vs raw `claude -p` same model, and Loki+cheap vs raw stronger. Targets: Loki+haiku >= raw sonnet completion at lower cost; Loki+sonnet >= raw opus at lower cost; Loki+X never below raw X, and at most 1.2x its time. Full matrix in METRICS.md, losses included; a slice that lowers lift is dropped.
402
- 3. Harness items, one slice each: (1) intent contract; (2) context engine (symbol retrieval, real commands, ranked pack per model budget); (3) project memory in .loki/knowledge with decay; (4) cross-repo and user knowledge sources via .loki/config.yaml, read-only; (5) model-adaptive profiles in model_catalog.json, step routing, escalate only on a failing check; (6) speed (parallel context, cached prefix, trimming, impacted tests, harness overhead under 5s); (7) cost (cascade, caps, measured cost on every provider); (8) enterprise config (allowed models and endpoints, budgets, redaction, an audit log of model calls; no certification claims).
403
- 4. Context and memory live in loki-ts/src/engine10/context/ with their own line budget set by the CTO; the 5000-line core cap (D33) stays.
404
- 5. Order: multi-model baseline eval first, then items 1, 2, 3 and 6 in parallel, then 5 and 4 (8 with 4). Eval runs count against the usage governor.
405
-
406
- ## D51 (founder, relayed by autonomi-dev-dc at 02:55Z): the product surface the harness powers
407
- 1. Local: install, `loki` opens a browser UI; onboarding (provider, GitHub PAT stored 0600, repo); a backlog view with complete-selected or complete-all, each issue its own worktree, branch and PR with receipt and evidence; live status, BLOCKED questions answerable in the UI.
408
- 2. Headless parity: `loki backlog owner/repo --all|--label|--issues`, one loki.yaml driving both UI and headless (provider and models, git auth env var, repos, concurrency, budgets, knowledge sources, notifications). Slack via autonomy/notify.sh on the v10 path.
409
- 3. 10x defined: merge-ready PRs per hour of wall clock and per hour of human attention on a 20-issue backlog vs one raw Claude Code session; target 10x on both, from parallelism, zero babysitting and attached evidence. Measured and published.
410
- 4. Reuse dashboard/, notify.sh, deploy/helm, docker-compose, terraform, playwright-verify.sh and issue-providers.sh; delete UI and endpoints that do not serve the flow. One UI, one config file, one engine.
411
- 5. Phase A (today): first-run UI, backlog view, headless plus loki.yaml, Slack. Phase B: workspaces, cross-repo runs, combined integration testing with evidence. Phase C: one container image, Helm and ECS, org connect, audit log.
412
-
413
- ## D39 amendment (founder, relayed 03:16Z): "Sprint, then pace"
414
- 1. Full speed until the D48 deadline at 04:35Z.
415
- 2. From 04:35Z the governor paces to about 0.48% of the weekly limit per hour (projected <= 75% used at the 2026-10-07T17:00Z reset), about 7 concurrent engineers at today's burn; the ceiling is recomputed hourly from new /usage readings (docs/v10/usage-readings.tsv; first reading 2026-10-01T03:14Z: window 11%, weekly 25%).
416
- 3. Priority inside the paced budget: release flow, then D50 harness and lift eval, then D51 Phase A, then docs, then the remaining D48 polish.
417
- 4. Builders run as cloud sessions first (the 250 USD cloud credit is used before plan usage).
418
- 5. If the 5h window passes 80%, pause new work until it resets; never let a run die mid-release.
419
-
420
- ## D52 (founder, relayed 03:25Z) and overnight mandate (03:40Z): least tokens, fastest release
421
- 1. Target about 10x less plan usage per merged slice and per release, measured from `claude -p "/usage"`. Haiku for mechanical work, sonnet to build, opus only for moat or latest-moving reviews; `model:` set explicitly on every agent; small briefs with file paths; read line ranges, not whole files; agent returns of 10 lines or fewer; fresh agent per slice; the lead session hands off at about 120k context.
422
- 2. Overnight until about 11:00Z: sprint to 04:35Z, then pace (D39 amendment). Priority: release flow, D48 rows plus the 04:35Z report, D51 Phase A ready to test (LOKI MORNING TEST in PROGRESS), D50 lift baseline then harness slices, docs, then D51 Phase B/C as budget allows. a morning brief (60 lines or fewer, since removed) at 10:30Z, honest about what is not done.
423
-
424
- ## D53 (founder delegation "do what's best, don't ask me anything", ruled by autonomi-dev-dc, relayed 12:39Z; reversible): spec-required test updates
425
- 1. An existing assertion may be changed, and the run may be VERIFIED, only when all of these hold, each checked deterministically (never by model judgement): (a) the new expected value appears verbatim as a string or number literal in the task, issue or spec text; (b) the edit changes only that literal in an existing assertion, with no assertion removed, no skip, xfail or .only added, no tolerance or comparator loosened and no other line changed (the D50-F2r classifier decides; any doubt means weakened); (c) the Wall checks, written without the implementation, and the project's other tests pass.
426
- 2. When all three hold, the receipt discloses "spec-required test update: file:line old -> new (source: issue text)". When any one fails, the verdict is PARTIAL with the weakened-test flag, as before.
427
- 3. Scoring: PARTIAL never counts as completed in the harness or eval scoring. Lift comes from honest VERIFIED outcomes only.
428
- 4. The append-only test rule (loki-ts/src/e10ext/context.ts:23) is relaxed only for case 1, using the same check; everything else stays append-only. It ships with red tests for: a loosened tolerance, if True changed to if False, a deleted assertion, and a literal not present in the issue.
429
- 5. Rationale: no model opinion produces a pass, and the checks really ran, so the moat holds. It matches what users expect when an issue says "should return X instead of Y". Raw agents edit tests freely; Loki allows only the edit the spec literally demands. Implementation is HIGH tier (opus review), built after D50-F2r merges (D50-F2-S3).
430
-
431
- ## D46 amendment (founder, relayed 14:12Z): "6 releases an hour, strictly and no compromise"
432
- 1. Target: 6 `next` releases every hour (one every 10 minutes), inside D52 pacing; the throughput comes from automation and cheap slices, not more opus.
433
- 2. The release captain is automated: scripts/train-cycle.sh (slice RC-AUTO) runs every 10 minutes and cuts trains, promotes green trains to main and cuts the patch release with no model calls. Red trains drop slices per D46 rule 2.
434
- 3. Slice supply: a standing queue of small user-visible haiku slices (15 min or less) keeps at least one merged-green slice per 10-minute window; sonnet builders feed the larger D50, D48 and D51 items into the same queue.
435
- 4. The quality bar is unchanged: green slices only, the two-leg gate before `latest`, no weakened checks. Releases per hour are reported in every PROGRESS entry.
436
-
437
- ## D50-W1 ruling (founder delegation, ruled by autonomi-dev-dc, relayed 14:20Z; reversible): the Wall sees the test surface, never implementation
438
- 1. The Wall session may see: the detected test runner and its config, the test directory layout, one or two existing test files as style examples (imports, fixtures, naming), and the public signatures and exports of the modules the task names (names, parameters, docstrings, type signatures).
439
- 2. It never sees function bodies or the run's diff. This keeps the Wall's from-spec independence while fixing blind tests (a Jest test written into a node:test repo, a test for a symbol that does not exist).
440
- 3. Ships with a lift row on the affected tasks.
441
-
442
- ## D53 amendment, D53-Q1 ruling (same delegation, relayed 14:20Z; reversible): the licensing literal must be the expected value
443
- 1. D53(a) tightened: the new literal must appear as the EXPECTED value in the delivery contract's acceptance criteria, which intake extracts with the quoted source span; appearing anywhere in the issue text is not enough. A literal that appears only as an observed or actual value ("returns 5", "currently 5", "got 5") never licenses an edit.
444
- 2. D53(c) tightened: at least one Wall check must cover the same behaviour; a Wall written from the requirement asserts the correct value, so an edit to the buggy value fails it.
445
- 3. If intake cannot classify the literal as expected versus observed, the run stays PARTIAL.
446
- 4. Red test required: an issue saying "returns 5, should return 7" with a test edit to 5 is never VERIFIED.
447
-
448
- ## D54 (founder, relayed 14:30Z; amended 15:05Z): a well-scoped product, free
449
- 1. Product statement and v1 scope are in docs/PRODUCT.md: issue backlog to merge-ready pull requests, tested, evidence attached, on your infrastructure, any model. v1 builds only: first run, backlog to PRs, the reviewer-first PR body, cost and control, scale (workspaces, container, Helm, ECS, audit log, team budgets), and the loki-seal wedge.
450
- 2. Out of scope for v1 (frozen unless a bug blocks v1): loki modernize, new verification features, the gaming matrix, extra dashboards, extra providers, certifications, new engines. Verification is bug-fix only.
451
- 3. Amendment 15:05Z, the founder's words: "I want sellable product but I don't need to sell right now, don't price anything, everything is still free to use". There is no paid edition and no pricing anywhere; remove "paid", "Team edition", "commercial editions" and "pricing TBD" from docs, README, CLI help and UI. No feature gating, license keys or upgrade prompts in code. LICENSE is untouched (FOUNDER-QUEUE row 7).
452
- 4. Order: P0 first-run bugs, first run end to end with a recorded demo, PR body and cost cap, D51 Phase B, D51 Phase C. D50 continues only where it raises completion or merge rate. Every release note leads with the user-visible v1 change.
453
-
454
- ## D55 (CTO, 2026-10-01; reversible via repo variable LOKI_E160_REUSE=0): a push to main reuses a train's verdict for the identical SHA
455
- 1. Rule (E-160, scripts/ci/train-verdict-reuse.sh). A push to refs/heads/main skips the heavy jobs only when ALL hold: LOKI_E160_REUSE is not 0; the workflow-runs listing for the SHA has total_count of 100 or less; among completed push runs of the same workflow file, other than this run, whose head_branch starts with train/, there is at least one success and no failure, timed_out or startup_failure (cancelled, skipped and neutral count for nothing); and, for Tests only, BEFORE is not all zeros and the BEFORE...SHA compare succeeded, lists fewer than 300 files and touches none of loki-ts/bun.lock, requirements-test.txt, legacy-ui/package-lock.json. Any parse or API error means reuse=false and the full suite runs. The newest success by created_at is recorded (run id, attempt, branch) in the step summary and a notice; attempts above 1 are accepted.
456
- 2. Wiring. test.yml: the version-bump-gate skip output is true when either the S-132 gate or the reuse step says so. bun-parity, coverage, first-run-gate and security-audit get a first job train-reuse; every other job needs it and runs under `!cancelled() && needs.train-reuse.outputs.reuse != 'true'`. security-audit sast (CodeQL) is never gated: it always runs on main. coverage and first-run-gate take test.yml's concurrency block (per-ref with cancel for pull_request and train/**, per-SHA without cancel on main).
457
- 3. Rationale: D28 and D46 item 4 (same SHA means same tree means same workflow YAML). required-ci, train-cycle, the pulse and the version-bump gate already read the train run by head_sha, so no gate gains new trust. Dependency lockfiles are excluded because a fast-forward from an older main can change resolved dependencies that the train run did not see.
458
- ## D56 (founder, relayed 15:40Z; numbered D56 because D55 is the E-160 CTO ruling): the Loki Control Plane replaces the dashboards
459
- 1. One service plus one UI, `loki control`, replaces dashboard/, legacy-ui/ and engine10/dashboard. It runs locally with zero config or is deployed once for many runs. It is stateless and horizontally scalable, keeps all state in a DB (SQLite locally, Postgres via DATABASE_URL), and is self-healing (/health, /ready, migrations on boot, spool replay, CLI restart of a dead local instance, k8s probes, version-checked reuse).
460
- 2. Stack: TypeScript on Bun with Hono and Drizzle; React, Vite and Tailwind built into static assets served by the same service; one container image.
461
- 3. Ingest: engine10 ships batched events with idempotent ids to LOKI_CONTROL_URL, with retry; the run's own events.jsonl is the spool. `loki control backfill` imports existing runs.
462
- 4. Every number comes from ingested events; no placeholders or invented data; an empty panel says so. Localhost-only by default, token auth when bound non-local, no secrets in events.
463
- 5. Built in packages/control-plane/ behind LOKI_CONTROL=1 until it passes its acceptance tests (real runs in, correct counts out), then the default flips and the old UIs are deleted. v0 (service, SQLite, ingest, shipper, Runs list and detail) ships on D46 trains first; the other views follow train by train.
464
- 6. Design: docs/v10/CONTROL-PLANE.md (architect slice in progress). Old-dashboard bug work is retired, except the P0 that shipped in 10.5.34.
465
- ## D55 (CTO, 2026-10-01; reversible via repo variable LOKI_E160_REUSE=0): a push to main reuses a train's verdict for the identical SHA
466
- 1. Rule (E-160, scripts/ci/train-verdict-reuse.sh). A push to refs/heads/main skips the heavy jobs only when ALL hold: LOKI_E160_REUSE is not 0; the workflow-runs listing for the SHA has total_count of 100 or less; among completed push runs of the same workflow file, other than this run, whose head_branch starts with train/, there is at least one success and no failure, timed_out or startup_failure (cancelled, skipped and neutral count for nothing); and, for Tests only, BEFORE is not all zeros and the BEFORE...SHA compare succeeded, lists fewer than 300 files and touches none of loki-ts/bun.lock, requirements-test.txt, legacy-ui/package-lock.json. Any parse or API error means reuse=false and the full suite runs. The newest success by created_at is recorded (run id, attempt, branch) in the step summary and a notice; attempts above 1 are accepted.
467
- 2. Wiring. test.yml: the version-bump-gate skip output is true when either the S-132 gate or the reuse step says so. bun-parity, coverage, first-run-gate and security-audit get a first job train-reuse; every other job needs it and runs under `!cancelled() && needs.train-reuse.outputs.reuse != 'true'`. security-audit sast (CodeQL) is never gated: it always runs on main. coverage and first-run-gate take test.yml's concurrency block (per-ref with cancel for pull_request and train/**, per-SHA without cancel on main).
468
- 3. Rationale: D28 and D46 item 4 (same SHA means same tree means same workflow YAML). required-ci, train-cycle, the pulse and the version-bump gate already read the train run by head_sha, so no gate gains new trust. Dependency lockfiles are excluded because a fast-forward from an older main can change resolved dependencies that the train run did not see.
469
-
470
- ## D57 (founder, relayed 16:50Z; "faster" 16:52Z): remove everything legacy, v10 only
471
- 1. The founder's words: "completely eliminate, deprecate and delete everything legacy, just v10 is enough since our user base so far is super low and we don't have to support anything from legacy". Supersedes the E-35 deprecation, `loki legacy` as an escape hatch, and the legacy leg of the promote gate.
472
- 2. Wave 1 (10.6.0, minor bump because it breaks the legacy path, within 1 to 2 trains): every entry point routes to v10; `loki legacy`, LOKI_ENGINE and the legacy fallback are removed; when bun cannot run, loki prints a plain error with the one-line fix and exits non-zero (never runs legacy); promote gate leg 2 asserts that error and exit code; README, docs, wiki, CLI help and CHANGELOG say v10 only, with the migration note "legacy removed in 10.6.0; use loki \"<task>\", loki owner/repo#N, loki backlog".
473
- 3. Wave 2 (following trains): delete legacy code, tests, CI jobs and fixtures in parallel slices, one directory each, every slice independently green (v10 suite, Bun Parity, first-run gate, moat on v10). Anything v10, loki-seal or the Control Plane imports at runtime is kept or ported, never deleted blind. The Python dashboard goes only once Control Plane v0 is the default (D56). Lines deleted are tracked in METRICS.
474
- 4. Guard: a test fails if any shipped file references run.sh, LOKI_ENGINE or `loki legacy` outside CHANGELOG and the migration note.
475
- 5. Inventory: docs/v10/LEGACY-REMOVAL.md (architect, 20 minutes, routing and docs surface first).
476
- 6. D57 product calls (founder delegation, ruled by autonomy-dev-dc, relayed 17:19Z; reversible): (a) PRD and spec start (`loki start ./prd.md`, `--openspec`) have no legacy path; `loki <file>` and `loki "<task>"` read an existing .md, .txt or .yaml file as the task and spec text for one v10 run; greenfield multi-phase PRD builds are dropped (out of D54 v1). (b) `loki quickstart` and templates are removed; first run is `loki` (UI) or `loki "<task>"`; `npx loki-mode tour` stays only if it has no legacy dependency. (c) `loki modernize` already runs on v10 (M-08): code kept, hidden from help and docs as experimental (D54 freeze). (d) The MCP server and the legacy loki-mode Claude Code plugin are removed if they front legacy; only MCP tools that call v10 directly survive; loki-seal stays the only marketplace plugin. (e) Council, gates, RARV, swarms, agent types, voice, grill, BMAD, OpenSpec and Mirofish adapters, `loki heal`, `loki migrate`, and Jira sync if legacy-only are deleted with their docs. (f) Anything else with no v10 equivalent is deleted unless it is in D54 v1 scope; when unsure, it is listed in LEGACY-REMOVAL.md as "deleted, no v10 equivalent" without asking.
477
-
478
- ## D58 (founder, relayed 17:40Z: "are we even of any use at all for users now?"): basics first, freeze the rest
479
- 1. Overrides D46 release-rate chasing, D48 and INTEL until all five basics pass. Release count is not the metric until then; pass or fail per basic is reported every hour.
480
- 2. The five basics, staffed together: (1) `loki start <owner/repo#N | "task" | file>` runs v10 and no user entry point ever invokes legacy (D57 W1-ROUTE); (2) no test binds 57374-57399, the CLI prints and opens the bound port, and Control Plane v0 shows a live run (stage, elapsed time, files touched, PR link); (3) v10 scope control: the committed diff contains only files the task needs, unrelated source edits are reverted, never committed, and listed in NOT PROVEN; (4) install is clean, with no npm allow-scripts warning (BUN-OPT); (5) the real-repo acceptance gate passes before `latest` moves.
481
- 3. Real-repo gate: from a clean `npm i -g` in a throwaway HOME, `loki start <real issue> --no-pr` on 3 real repos: asklokesh/augmentiq#52 (cloned, no push; expected ALREADY_SATISFIED in under 60s with no diff; 10.5.35 v10 already does this in 24s at $0.07, while legacy ran 18+ minutes and touched 19 files), plus 2 public eval-corpus repos with real open issues that need a change, so the PR path is covered. Pass: v10 engine, 15 minutes or less, diff limited to relevant files, tests green, receipt verifies, dashboard shows the run. Wall time, cost and diff stat per repo go in METRICS. Any failure keeps `latest` where it is.
482
- 4. D57 Wave 2 deletions continue only as part of basic 1.
483
-
484
- ## D59: two-hour finish, then stop until next week (founder, 2026-10-01 18:10Z, override 18:14Z)
485
- Founder: "complete all loki mode work faster ... everything complete in two hours with least tokens used and highest code push and releases ... even if means no testing". Override given directly at 18:14Z: until 20:10Z, merge and release without waiting for Tests, Bun Parity, Coverage or Security Audit. Kept: rollback of `latest` by dist-tag if Post-Release Smoke shows `npm i -g loki-mode` or `loki --version` broken. Each release's CI result is recorded in docs/v10/PROGRESS.md (section 'Release CI results, 10.6.x'). Order: 10.6.0, W1-ROUTE, D58-SCOPE, LEAK3, CP-RELAND, D57 W1 docs, one real-repo gate run against latest. Target 19:15Z, hard stop 20:10Z, then no agents, loops or crons until next week. Workflow-level gates (release.yml required-ci, pre-push secret scan) are not edited.
486
-
487
- ## D60: one-hour user-impact sprint (founder via the autonomi-dev session, 2026-10-02 22:45Z)
488
- Ends the D59 pause early for this sprint only. Five slices, released as soon as each is green: (1) `loki start` runs Loki 10, after porting moat P9 to the v10 issue path and re-landing b2e3afc43; (2) the dashboard opens the port it bound (LEAK3, with test-ui-bare-loki fixed); (3) an evidence-rich PR body (INTEL-3); (4) the shipped GitHub Action runs `loki owner/repo#N`, plus a documented nightly `loki backlog` cron; (5) a visible cost cap (INTEL-2) in the v10 start line. CI gates are unchanged: Tests, Bun Parity, Coverage and Security Audit must be green before a release, plus the two-leg promote. Anything red at about minute 50 is dropped. Report at minute 60, then stop per the D59 handoff (see docs/v10/PROGRESS.md).
489
-
490
- ## D61: speed for users (founder via the autonomi-dev session, 2026-10-02 22:50Z)
491
- A product feature, not a build-process change: `loki "small task"` should finish in seconds, at or below raw Claude Code time and tokens. `loki "big task"` and `loki backlog` should decide by themselves whether the work splits, run the units in parallel worktrees on the user's machine, merge, test once and open one PR, using no more tokens than one sequential session, visible live and with no flags. Design only for now: docs/v10/D61-SPEED.md (an opus architect). Builders start after D60 and after the founder's go. Every target is measured on an eval arm and published in METRICS, losses included.
492
-
493
- ## D60-5 default cost cap (2026-10-02 23:05Z)
494
- A Loki 10 run caps priced spend at $20.00 by default. `--max-cost N` beats loki.yaml `budgets.per_run`, which beats the default. The start line prints the cap and its source. Hitting the cap ends the run as BUDGET_STOP with exit 3. Unpriced sessions (no cost event) never count toward the cap, so a subscription or local provider never stops on it.
495
-
496
- ## D62: resume now, no pause until 2026-10-07 (founder via the autonomi-dev session, 2026-10-03 about 00:05Z)
497
- Founder: "don't have to pause until wed oct 7th, remove that and resume now". Ends the D59 pause. Pacing follows the usage governor: week at 44% with about 4.6 days to reset, so about 0.5% per hour, seats scaled to live /usage. Trains and the D49 auto-promote continue unchanged. Priorities in order: (1) D61 speed (slice 17 large eval arm, then warm maps, then decomposer, integrator and parallel units, all behind LOKI_SPEED until the eval holds); (2) Vorflux gaps: visual evidence in PRs (local screenshots of changed pages when the repo has Playwright or a web app), multi-repo workspaces (D51 Phase B behind LOKI_WORKSPACES), Jira and Linear issue intake into v10 reusing autonomy/issue-providers.sh (intake only, no sync claims), project memory (D50 item 3); later merge queue, PR review risk score, REST API; (3) small fixes: root action.yml routes to v10 instead of `loki start --simple`, and one real end-to-end BUDGET_STOP exit 3 test. Each release reports its version and what users can now do to the autonomi-dev session.
498
-
499
- ## D63: industry-standard autonomous software factory roadmap (founder via the autonomi-dev session, 2026-10-03 00:15Z)
500
- Founder: "I want everything top notch features and UI and connections and updates to make loki mode the industry standard best tool comparable to cognition devin, factory.ai and even 8090.ai and claude code, but fully autonomous super intelligence software factory". Recorded as the roadmap in docs/v10/ROADMAP-D63.md (nine pillars, each with a measurable bar). D50, D51, D56 and D61 slot into it. No row is done without a test or an eval row. User-facing text makes no superintelligence or benchmark claims. Build order this week, under the governor: D61 eval and warm start, visual evidence in PRs, Control Plane default with the BLOCKED answer UI, two-way Slack, Jira and Linear intake, spec to contract, multi-repo, MCP run/verify server, containers.
501
-
502
- ## D64 (WITHDRAWN 2026-10-03 00:25Z, never acted on): win every Vorflux row, 10/10 ease of use, max pace (founder via the autonomi-dev session, 2026-10-03 00:20Z)
503
- Founder: "i want to win on all things versus vorflux and rated 10/10 in ease of use for users, anything that says vorflux wins should become loki, complete all releases towards that in fastest way and I want everything done right now". Raises D63 to max pace. The 0.5%/h pacing is lifted: as many parallel builders as the machine and CI allow (sonnet builders, haiku for docs and mechanical work, opus only for moat reviews). One hard floor: no new work starts when live /usage shows the week at 90% or above. CI gates and the two-leg promote stay. Every "Us" row in ~/git/autonomi-dev/research/vorflux/docs-teardown.md section 6 becomes a local, free Loki win, each on its own train: visual evidence (local Playwright screenshots, trace or video, in the PR and the receipt); browser testing in verify (Playwright or Cypress when present; mobile only when an emulator or simulator is already installed, said plainly otherwise; never claim coverage that did not run); D61 parallel units; triggers (`loki serve` webhooks for GitHub, Linear, Jira, plus cron); multi-repo (D51-B); merge queue (`loki merge`); PR review with a deterministic risk score (`loki review <pr>`); plan mode (`loki plan`); project memory; Jira, Linear and Sentry intake plus two-way Slack; Control Plane default with mobile layout and a REST API for runs. Ease of use is measured and gated: fresh machine to first merge-ready PR under 5 minutes, zero config with at most one decision, `loki` with no args opens the UI with guided onboarding, every error names the one fix, and an "ease" row in the first-run gate (time to first PR, prompt count) is published.
504
-
505
- D64 withdrawn (founder via the autonomi-dev session, 00:25Z): "I think your build order is better, just follow that, ignore my last message". Recorded only; no D64 builder was started. Pacing and order return to D63: about 0.5% of the week per hour at a staffing of 4, order as in docs/v10/ROADMAP-D63.md. The Vorflux section 6 rows remain a reference for later D63 items.
506
-
507
- ## D65: build all nine D63 items today, then one end-to-end pass (founder via the autonomi-dev session, 2026-10-03 00:35Z)
508
- Founder: "this looks amazing ... i want everything done today, no testing required, first develop and complete all releases, then do one end to end testing of all things and fix bugs and make improvements". Phase 1: build all nine D63 items in D63 order, in parallel; builder-side test runs and review rounds are off (builders run typecheck and the structural dash check only, because a red train is dropped, not waited on); each slice merges and ships on trains as built. CI and the release gates are unchanged (required-ci, Tests, Bun Parity, Coverage, Security Audit, two-leg promote). The 0.5%/h pace is lifted for today; hard floor: no new work starts once live /usage shows the week at 85%, and the autonomi-dev session is told. Phase 2: from a clean `npm i -g loki-mode@latest` in a throwaway HOME, exercise every D63 feature on real push-disabled clones (augmentiq#52 plus two public eval repos), record pass or fail with evidence in docs/v10/E2E-D65.md, then fix bugs in priority order on trains. Phase 2 real-repo runs need provider auth present in the session environment; stored keys are never read.
509
-
510
- ## D66: D65 feature code lives in loki-ts/src/features/ under its own cap (CTO call, 2026-10-03 02:00Z)
511
- The D61 decomposer (125 lines) does not fit: engine10 core is at 4,993 of its 5,000-line cap (D29, D33, never raised) and e10ext at 1,490 of 1,500 (D42). New D65 modules (decomposer, warm start, visual evidence, contract, Slack inbound, Jira/Linear fetch) go in loki-ts/src/features/, with its own 3,000-line cap and the D42 import rules (no import of stages/, seal, verify, wall or verify_cmd except whole-statement `import type`), enforced in budget.test.ts. Core and e10ext caps are unchanged; each slice's edit to engine10 or e10ext is a hook of at most a few lines, and a slice that pushes core or e10ext over its cap is trimmed or dropped at the train.
512
-
513
- ## D67: authored speed tier is separate from the D34 large tier (CTO, 2026-10-03, on the Chief of Staff's request)
514
- - D61 slice 17 added 8 authored tasks under the lg- name with tier "large" and excluded lg-* from the D34 size gate. Rejected: the real D34/D38 large tasks are also named lg-<repo>-<issue> (EV-12F, EV-12G), so the exclusion would have exempted them on merge, and D34 already closed synthetic lg-* tasks.
515
- - Authored decomposition tasks are a separate tier: id prefix spd-, "tier": "speed", a boolean "decomposable", and D38 hidden-test provenance, sha256 freeze and a requirements map. No refdiff and no size gate. validate enforces the prefix and the tier in both directions.
516
- - D34 and D38 are unchanged. lg- and tier "large" mean only real upstream PR tasks. measure-size.py runs over every task with no name exclusion, and a test proves an unsized lg- task fails it.
517
- - Speed-tier results measure decomposer choice and wall-time ratio only. They are never published as large-tier, "any size" or completion-at-scale claims.
518
- - The LOKI_SPEED default flips only when D61 section 5 B and 5 C hold on the speed tier and LOKI_SPEED=1 is no worse than LOKI_SPEED=0 on completion, p50 wall and tokens per completed across the real medium tasks and any D34 large tasks on main, at 2 runs per arm. A loss on any axis keeps the default off.
519
-
520
- ## D68: D65 12-hour mandate (founder, about 03:00Z 2026-10-03, relayed by autonomi-dev-76)
521
- - Founder's words: "steer with highest velocity for releasing asap everything to complete all implementation roadmap within this time.. no excuses". Deadline 15:00Z 2026-10-03; work continues after it.
522
- - Goal: every D63 item released to npm latest with flags ON and documented. An item whose opus D12 review has not passed ships flags-off and is named in the handoff.
523
- - The per-hour governor pace is lifted for 12 hours. The only usage floor is 85% of the week on live /usage (03:01Z reading: 46%). Builders scale with CI and machine load. train-cycle runs every 10 to 15 minutes; red slices are dropped, never held.
524
- - Unchanged: CI gates (no waivers), no stored credentials read (real-model E2E legs stay parked), P9 rerun once in full with the new diagnostics, never added to pending.txt.
525
- - Every release carries a CHANGELOG sentence, README and docs in the same slice, and a version report to the peer. a morning brief (since removed) is written at 14:30Z (60 lines max).
526
-
527
- ## D69: no founder waits (founder, about 03:05Z 2026-10-03, relayed by autonomi-dev-76)
528
- - Founder's words: "lokimode session should never prompt me or wait for me for anything ... complete all work with chief of staff and software factory it is".
529
- - The Chief of Staff and the CTO role decide every call that would go to the founder: product, scope, ordering, D12 sign-offs through the opus reviewer, and flag flips. Each decision is logged here with its rationale so the founder can reverse it.
530
- - Anything only the founder can physically do (credentials, licensing, external accounts, posting as himself) becomes a non-blocking FOUNDER-QUEUE.md row; work goes around it.
531
- - Safety rules are not founder waits and still hold: CI gates, no stored keys read, never kill by pattern, the Never list, and repo configuration (CLAUDE.md, .claude/settings.json) is not edited on a relayed request.
532
-
533
- ## D70: contract and visual evidence default ON (Chief of Staff and CTO role, 03:08Z 2026-10-03, under D68 and D69)
534
- - The opus D12 HIGH re-review (af6ddde5) approved both after reproducing C1 and B1-B3 on the pre-fix parent and showing them fixed. D68 asks for flags on once D12 passes.
535
- - LOKI_CONTRACT and LOKI_VISUAL_EVIDENCE default to on; `=0` turns each off. Contract only acts when .loki/contract.json exists. Visual evidence only acts when Playwright is present and pages changed, inside its 25s budget, and otherwise writes a NOT PROVEN line, never a failure.
536
- - Rationale: both fail closed or advisory (neither can raise a verdict to VERIFIED); the remaining should-fixes (D65-SPEC-F1, D62-VIS-F1, D65-SPEC-F2) are non-blocking and build in parallel. Reverse by setting the defaults back to off.
537
-
538
- ## D71: D61 parallel-units code lives under loki-ts/src/features/speed (CTO role, 03:08Z 2026-10-03)
539
- - Core engine10 measures 4936 lines against the 5000 cap (D29, D33, D42), so 64 lines remain. The cap is a gate and is not raised.
540
- - New D61 modules (decompose check, unit mode, integrator, group seal helpers, group output) go under loki-ts/src/features/speed/ (features budget 3000, 993 used). Each slice may add at most 10 lines of hook code to core engine10; the wave's total stays under 60, and structural-checks.sh must pass on every merge.
541
- - engine10/decompose.ts (slice 8) stays where it is.
542
-
543
- ## D72: drop D63-C12 (stub invoker via LOKI_CLAUDE_CLI alone) (CoS with CTO, 04:13Z 2026-10-03)
544
- - Opus HIGH review blocked 7a83f2fa8: setting LOKI_CLAUDE_CLI alone switches to the CLI invoker, so a paid run records $0 with source "cli-invoker-unmetered", and supervisor.ts disagrees with the receipt. That breaks cost honesty in the receipt.
545
- - The card marked C12 optional, and an explicit LOKI_E10_INVOKER=cli already selects the CLI invoker for the stub-provider gate. Dropping it costs no user capability.
546
- - C11b and the D65 stub E2E use LOKI_E10_INVOKER=cli explicitly. Row set to rejected; no founder input needed (D69).
547
-
548
-
549
- ## D60-5 addendum: INTEL-2 closed (visible cost cap)
550
- The $20.00 default per-run cap stays. It is a hard stop on priced sessions only; lower it with one line in loki.yaml (`budgets.per_run`) or `--max-cost`. Every v10 start line shows the cap and its source (`--max-cost`, `loki.yaml` or `default`). A run that reaches it ends BUDGET_STOP with exit 3. Unpriced sessions (subscription or local providers) never count, so the cap never fires on a guess. Proven end to end through the CLI for the flag, the yaml key and flag-over-yaml precedence (loki-ts/tests/engine10/budget_stop_e2e.test.ts, commit 0cc189106). The typical cost of a fast run has not been measured yet; the default is not justified by a run-cost figure.
551
-
552
- ## D73: drop D61-12 (integrator) from the 10-03 window (CoS with CTO, 04:47Z 2026-10-03, under D68 and D69)
553
- - Round 8 opus review of 35a7b0c32 reproduced four cases (C1-C4) and one regression (S3) where a unit's change is missing from HEAD while the group reports merged and ready, plus a false failure on a mode-only change (E6). Probe: scratchpad rev-d61-12-r8/r8.test.ts.
554
- - Round 8 was declared final. Eight rounds on a HIGH Seal-adjacent surface without convergence means the per-path containment design needs rework, not another patch.
555
- - D61-12 is parked. D61 ships without an integrator: parallel units stay behind their flag and the integrator is not in the shipped feature set. Named in the handoff as not shipped.
556
- - Next window: redesign around per-resolution-commit containment (B at R^1, X at R, H at HEAD) and a revert guard for covered units, as the reviewer proposed.
557
-
558
-
559
- ## D74: gitleaks job timeout 15 -> 30 min (CoS under D69, 07:25Z 2026-10-03)
560
- - Evidence: the gitleaks full-history scan took 8-15 min on trains 83-87 and was cancelled at the 15 min limit on trains 86, 88, 89 and 90 ("gitleaks scan (all reachable history) ##[error]The operation was canceled", run 37104195817 attempt 2). Every other Security Audit job passed.
561
- - Decision: raise timeout-minutes to 30. Same scan, same config, same blocking posture; nothing is narrowed or skipped, so this is not a gate weakening.
562
- - Follow-up slice: make the scan scale (incremental scan against a reviewed baseline commit) before history doubles again. Any change to scan scope needs a CTO pass.
563
-
564
- ## D75: gitleaks range scan on train/** pushes, full scan stays the release authority (CTO, 07:45Z 2026-10-03)
565
- - Decision: train/** pushes scan merge-base(origin/main)..SHA through scripts/security-audit-gitleaks.sh (release-tag config, net .gitleaks.toml refusal, first-parent merges); any doubt falls back to the full scan.
566
- - Gap found: E-160 reuse (train-verdict-reuse.sh:53-64) plus parent reuse in release.yml required-ci (fetch_runs:423, no branch filter) would let a range-only train verdict reach npm; train-cycle.sh:53 Phase C never waits on Security Audit.
567
- - Conditions: secret-scan on main always runs full (no E-160 skip); required-ci reuses only main-branch or dispatch audit verdicts; the weekly cron becomes daily and a red daily scan halts releases.
568
- - No base-config fallback (r3 class). PR, slice-*, main, schedule and dispatch stay full. HIGH tier, unanimous opus review. Proposed by peer autonomi-dev-76; decided by the CTO advisor.
569
- - Saves about 15 min per promotion; release latency may still include the main full scan, accepted (moat over speed). Unmeasured hypothesis for a later CTO pass: --all on a fetch-depth 0 checkout also scans stale remote slice branches.
570
-
571
- ## D76: legacy `loki verify` treats an unknown-kid attestation as not verified (CoS under D69, 08:32Z 2026-10-03)
572
- - Decision: on legacy, a well-formed token whose kid matches no local key and no `--pubkey` exits rc 2 with `attestation: UNCHECKED` and a VERDICT that is not VERIFIED, matching engine10. This supersedes the D47 carve-out for legacy UNCHECKED.
573
- - Why: anyone can mint a token with a foreign kid, so rc 0 is a downgrade forgery path. Moat order puts Seal accuracy above convenience, and D48 row 2 gives honest cross-machine verification an explicit path (`loki verify --pubkey`).
574
- - Also in scope: a missing .loki/state/last-proof-id.txt must not skip the receipt check silently; it reports not verified (A-134 class).
575
- - Users who relied on rc 0 for foreign tokens must pass `--pubkey`; the error message names that flag. CHANGELOG and docs say so. HIGH tier, unanimous opus review.
576
-
577
- ## D77 (CTO, reversible; amends the D50-W1 ruling): the Wall gets a sealed base-tree manifest, never the repo; its cap scales with task size
578
- 1. Rejected: read-only repo access for the Wall. A read-only mount still exposes function bodies to Read and Grep, and that cannot be blocked the same way across five provider CLIs, so "never bodies" would be unenforceable.
579
- 2. Rejected on its own: a longer cap. The two 90s kills came from blind exploration; more time alone buys more blind tests.
580
- 3. Adopted: core code builds wall_manifest.txt from the intake base tree before the Wall session starts and places it in the empty temp cwd next to task.md and repomap.txt. It holds only the detected runner and its config file, the test directory layout, at most 2 existing test files as style examples, and the public signatures and exports of the modules the task names. Capped at 400 lines; its sha256 is emitted on wall.sealed and listed in the receipt.
581
- 4. The Wall never sees function or method bodies, the run diff or implement-worktree content, plan output, the implement transcript, git history, any .loki/ run directory, or prior Wall files. A style-example test must not import a module the task names (keeps D53-Q1 sound).
582
- 5. Ordering is unchanged from D42(2): manifest from the base tree only, Wall sealed and red-on-base before implement runs.
583
- 6. Cap: 90s small, 180s normal, LOKI_E10_WALL_LIMIT_S may override up to 300s, fixed before the session. A Wall timeout stays not_run, never red or already_satisfied, and Seal discloses it.
584
- 7. Ships behind LOKI_E10_WALL_MANIFEST with a lift row (augmentiq#52 plus 2 brownfield tasks, manifest off versus on). Lower lift drops the change. Slices W1-S1..W1-S4 on BOARD; S1 to S3 touch the engine10 core and wait for core budget room.
585
-
586
- 8. P12-05 holdout, behind LOKI_WALL_HOLDOUT_RATIO (superseded by D99 item 4: default ratio 0.2, on, active at 5+ Wall checks, a holdout failure blocks the Seal; opt out with LOKI_WALL_HOLDOUT=0): a deterministic subset (sha256 of run id and test id, max(1, round(ratio*N)), none under 5 Wall tests) is kept outside the repo and runDir, copied in only by verify as blocking holdout:N checks, and its private store is removed when the run ends. Shipped state (C-C4, C-C4b): on by default. Preconditions (a), (b), (d) and (e) (pin hashes outside the store, drop targetDir from the manifest, close the tmp symlink race, define resume) are NOT yet done: the manifest still carries targetDir and is self-attesting beyond the per-file sha256 check, and a missing or altered store fails closed. Precondition (c) is done in C-C4b: held-out checks are excluded from failures_grouped, and the fix stage receives only an opaque holdout_failed count, never a held-out name, command or failure text.
587
-
588
- ## D78
589
- 2026-10-03T10:39Z, CoS (D69). GitHub push protection rejected train/94 because commit 04f62ff4e (SEC-SCAN-1) carried planted fake AWS key literals in tests/test-secret-scan.sh. Nothing in the range was on origin, so the 124 unpushed main commits were rewritten locally (filter-branch index-filter on that one file): each literal is split with an adjacent empty single-quoted string, so bash builds the same value and the scanner test still blocks it (6/0). The tree diff from the old head was that file only. This was not a force-push, and no protection bypass was requested. Commit SHAs cited on BOARD and PROGRESS for 10:25Z and earlier today, after a185ce16, are pre-rewrite and resolve only through the reflog. Rule: a test fixture never holds a scanner-matching secret literal, split it at write time.
590
-
591
- ## D79
592
- 2026-10-03T10:48Z, CoS (D69). S-218r round 5: the untracked-status snapshot needs git 2.44 or newer. On an older or unparseable version it refuses, returns 1 and prints a clear message; the callers already treat a failed snapshot as no snapshot. Why: on older git the repo's own config can fake the GIT_CONFIG_COUNT sentinel, and GIT_NO_LAZY_FETCH does not exist, so a hostile repo could run a filter driver or an ssh command (both reproduced by opus). Apple git on current macOS is 2.54; Ubuntu 22.04 (2.34) and Debian 12 (2.39) degrade to no untracked snapshot rather than an unprotected one.
593
-
594
- ## D80
595
- 2026-10-03T12:54Z, CoS (D69), moat change pending CTO ratification in the SEAL r9 opus review. SEAL r8 BLOCK: in a single-process run (`node --test --test-isolation=none`, or a test file run directly with `node file.js`) a test can write a complete fake summary block and call process.exit(0) before the runner prints its own, so a failing test that never ran is reported VERIFIED. No output parsing can tell the difference, because the test wrote the whole output. Decision: (1) loki-seal grants test coverage only when the npm test script is `node --test` with process isolation (the default), where the parent runner always prints its own summary after the child exits; isolation=none, a direct `node file.js` script, or any script it cannot classify as that gives NOT VERIFIED with a stated reason. (2) As a second layer, a test file that calls process.exit, process.reallyExit, process.abort or process.kill is an integrity finding (NOT VERIFIED). (3) The truncation check gets its own unit test that does not rely on the end-of-output rule. Over-refusing honest single-process setups is accepted (fail closed).
596
-
597
- ## D80 amendment (2026-10-03T13:14Z, CoS per D69, from the SEAL r9 opus review)
598
- The r9 reviewer amended D80 and the CoS adopts the amendment as binding. The reason is a reproduced finding: the classifier matched `node\s+--test` anywhere in the script, so "node --test-reporter=spec t.js", "node --test-only t.js", "node --test && node fake.js" and "echo node --test; node t.js" were all classified as node --test (a node -e run at 13:13Z). Amended rule:
599
- - loki-seal grants coverage from npm test only when the whole trimmed script is exactly `node --test` plus allowlisted flags (--test-reporter=<name>, --test-reporter-destination=stdout, --test-isolation=process, --test-concurrency=<n>, --test-timeout=<n>) and plain path arguments.
600
- - NOT VERIFIED, with a stated reason, applies on: any other token or a shell metacharacter (; & | $ ` quotes # < >); a pretest or posttest script; a project .npmrc setting node-options or script-shell; or NODE_OPTIONS set in the hook environment.
601
- - The exit/abort/kill scan remains as defense in depth and is not the trust boundary.
602
- - The truncation check keeps its own unit test.
603
- The CTO ratifies this in the r10 HIGH review.
604
-
605
- ## D80 amendment 2 (2026-10-03T13:26Z, CoS per D69, from the SEAL r10 opus HIGH review)
606
- The r10 reviewer reproduced four forged PASS results ("Verified by Loki" on a repo with broken code) under the 13:14Z amendment. Each one used an npm test script that passed the allowlist:
607
- - a node_modules/.bin/node shim
608
- - `--test-reporter=<the package's own name>`
609
- - a reporter in node_modules
610
- - npm_config_node_options, a user ~/.npmrc, or a quoted .npmrc key
611
- That amendment is NOT ratified. It is replaced by this rule, which the CoS adopts as binding:
612
- 1. Coverage is granted only from a runner that loki-seal launches itself. The npm test script must be exactly `node --test` plus allowlisted flags and plain relative file paths. loki-seal then does NOT run `npm test`. It spawns `process.execPath` (an absolute path, no PATH lookup) with those exact arguments, with cwd set to the project root and NODE_OPTIONS, NODE_PATH, NODE_TEST_CONTEXT and every `npm_*` variable removed from the environment. No npm config file (project, user or global) is consulted.
613
- 2. Allowlisted flags:
614
- - `--test-reporter=` one of spec, tap, dot, junit or lcov (built-ins only, so a bare package name gives NOT VERIFIED)
615
- - `--test-reporter-destination=stdout`
616
- - `--test-isolation=process`
617
- - `--test-concurrency=<n>`
618
- - `--test-timeout=<n>`
619
- 3. A pretest or posttest script, any other token, or any shell metacharacter gives NOT VERIFIED, with a stated reason.
620
- 4. jest, vitest and any other runner resolved from the project (node_modules/.bin, or reporters and setup files defined in config) does not grant coverage. It gives NOT VERIFIED with a stated reason, and its red/green result still counts. Over-refusing is accepted (fail closed).
621
- 5. The exit/abort/kill scan stays as defense in depth; it is not the trust boundary. The truncation check keeps its own unit test.
622
- 6. Every case in 1 to 4 has a negative test that asserts its specific reason. That includes the six reproduced forges above.
623
-
624
- ## D81 (2026-10-03T14:43Z, CoS per D68/D69): train/101 red is fixed forward with a revert deadline
625
- - train/101 (e14834e53) Tests run 37129766523 failed on two reproducible, deterministic causes. Neither is the P9 flake.
626
- - Shard 2: seal.test.js:1031 runs `node --test-isolation=none`, which the CI Node rejects ("bad option").
627
- - Shard 3: cloud-dispatch R2-3. On GNU the writer overwrote a duplicated BOARD row (rc 0, want 15).
628
- - Decision: two sonnet builders fix them forward on main, with a deadline of about 15:05Z.
629
- - Any slice not fixed and TL-approved by then is reverted for train/102, and the rest ships as v10.6.15. This is the D68 rule "drop red slices".
630
- - A failed rerun is not attempted, because both failures are deterministic.
631
- - Each fix must keep fail-closed semantics: no skip, no weakened assertion, and nothing added to tests/moat/pending.txt.
632
-
633
- ## D82 (2026-10-03T14:54Z, CoS per D69): founder directive 14:55Z, all features on by default, cost-cap rework, 10/10 program
634
- Source: the founder's words, relayed by the peer session (autonomi-dev-76) at 14:55Z. Recorded as given; executed without founder waits.
635
- 1. Default-on: visual evidence, spec-to-contract, D61 parallel/speed, Slack two-way, MCP tools, Control Plane and workspaces become default-on in the next train. Each env var stays as an opt-out (=0).
636
- - A feature still in D12 review ships the same day its review passes.
637
- - CTO guardrails, from security, which outranks speed:
638
- - A default-on network listener binds loopback only.
639
- - Anything that sends data off the machine (for example a Slack webhook) stays inert until its credential is configured. Default-on means "on when configured", never "prompt for or read stored secrets".
640
- 2. Cost cap: the $20 default is removed.
641
- - Subscription runs (CLI login, no API key) have no dollar cap and print one info line: "subscription: no dollar cap; usage counts against your plan limits".
642
- - API-key runs default to a $100 cap.
643
- - --max-cost and loki.yaml budgets.per_run override both. BUDGET_STOP stays exit 3.
644
- - The start line, docs and tests are updated.
645
- 3. 10/10 program, built in order (a) to (j):
646
- - (a) browser e2e with a Playwright video and trace
647
- - (b) loki merge queue
648
- - (c) loki review with a deterministic risk score
649
- - (d) project memory across runs
650
- - (e) Control Plane mobile layout, roles and sign-in (single-admin token, then OIDC)
651
- - (f) mobile emulator tests when the tools are installed
652
- - (g) a REST API for runs
653
- - (h) VS Code and JetBrains via ACP
654
- - (i) Sentry intake
655
- - (j) the D50 Sonnet lift fixes
656
- - Plus a fresh gap-research pass (Devin, Factory, 8090, Vorflux, Claude Code). New items join the queue.
657
- - An architect slices each item into small slices that keep CI green.
658
- 4. Amended by the founder at 15:00Z and 15:02Z, relayed by the peer: "no testing", "10 releases every hour", "use least tokens".
659
- - Until about 17:00Z, LOW and MEDIUM slices merge as built, with no agent-side review round. CI Tier A and Tier B are the gate, because nothing reaches npm without a green Tier B on its exact tree (D55).
660
- - HIGH slices (moat, Seal, verifier, auth/sign-in, security) keep one opus D12 review. A peer relay cannot waive it.
661
- - Models (D52): haiku for docs, flag flips, pins and mechanical edits; sonnet for feature code; opus only for HIGH review. Fresh agents get small briefs and return short results.
662
- - Trains: cut one from whatever has merged as soon as the previous train's push has registered its CI runs. Never push while a release is running: a push during a release cancels its Tests (GUARD, memory "Pushing during a release cancels its Tests"). Never cancel a releasing train.
663
- - The real ceiling is about 12 min per Tests run plus the release, so roughly 4 releases per hour. The achieved rate is reported honestly.
664
- 5. Usage: the 85% weekly floor stands. At the floor, stop starting new work and record what is left in the handoff.
665
-
666
- ## D83 (2026-10-03 15:20Z, founder via peer relay): enterprise-grade Control Plane UI
667
- 1. Founder words: "i want enterprise grade UI, not just a dummy simple page ... make sure the previous UI design is used, I meant fonts, colors, UI looks and design ... even if it's a rewrite, I like Old UI".
668
- 2. Supersedes the minimal CP-UI-SHELL look. The Control Plane reuses the legacy dashboard design system (fonts, serif wordmark, purple palette, light and dark themes, sidebar and right panel, card, KPI, badge, table and timeline components).
669
- 3. Step 1: an opus architect writes docs/v10/CP-ENTERPRISE-UI.md (legacy inventory with KEEP/REWORK/DROP, design tokens, feature set drawn from Devin, Factory, 8090, Vorflux and Claude.ai, and the v10 API each page needs). Step 2: parallel sonnet builders, one per page, on a shared token package. Every number from real ingested data. Start-run and stop endpoints get an opus security review. Ships as 10.8.0; legacy dashboard code is deleted at parity.
670
- 4. Does not hold 10.7.0, which ships at its cutoff. D82 also waived the D61 gate E evidence for the LOKI_SPEED default flip.
671
- 5. Addendum (15:24Z, founder via peer relay): "i want fully controllable loki mode of sessions, configurations and anything from UI, but keep it super clean and lean like claude.ai UI and chatgpt UI, but with loki mode's old dashboard look, should feel amazing for users". Guiding principle of CP-ENTERPRISE-UI.md: full CLI parity in the UI, a lean conversation-style structure (session list plus one main pane, one New run input, run as a thread, everything else behind one settings entry), the legacy look on top, and no placeholder panels. loki.yaml write-back and the run control endpoints are HIGH.
672
- 6. Spec open questions decided by the CoS under D69 (15:28Z): ground color is the shell light grey #F1F2F6, the mascot stays beside the wordmark (both are the old look the founder asked for; one screenshot pair goes to FOUNDER-QUEUE for a later veto). Merge queue (`loki merge`) and PR risk review (`loki review --risk --json`) DO have backends as of 10.7.0, so they get UI slices CPE-25 and CPE-26 wrapping those commands instead of staying hidden; schedules, memory and modernize stay hidden until a v10 backend exists.
673
-
674
- ## D84 (2026-10-03 16:14Z, CoS per D68/D69): 10.7.0 re-cut content, CP shell fields read-only
675
- 1. 10.7.0 ships the LOKI_SPEED default flip with the D82-FIXREDS fix. D82-WALL0 is reverted for 10.7.0 because it fails the engine e2e done run (the stub writes no Wall file, so the run seals FAILED); it returns in 10.7.1 with the e2e stub writing a Wall check.
676
- 2. The quiet-mode LiveLine moves from engine10/output.ts to e10ext/liveline.ts: it is presentation, and core was 5026 lines against the D29 5,000 cap. The cap is unchanged.
677
- 3. Control Plane settings API (CPE-14): shell command fields (workspaces.*.integration.command, workspaces.*.repos[].setup) are read-only over HTTP and return 422; they are edited in loki.yaml directly. A browser must never be able to plant a command the engine later runs.
678
-
679
- ## D85 (2026-10-03 16:30Z, CoS per D68/D69): train/102 reds fixed in place, not dropped
680
- 1. train/102 Tests failed on registration and pin defects only: acp missing from help and completions, merge missing from zsh completion, `loki web --port` skipping the port validator after CP-LEGACY, a ProcessEnv type lost in CP-INGEST watch.ts, and the E-123 gitleaks baseline count after the reviewed Sentry fixture fingerprint.
681
- 2. Dropping ACP, merge, CP-LEGACY and CP-INGEST would remove four headline 10.7.0 features and needs four reverts plus a dist rebuild, which is slower and riskier than five one-line registration fixes. The peer's "drop, do not fix forward" rule targets behaviour regressions; these are wiring gaps. Fixed in d9704dfc4 and every failing suite was rerun locally green before train/103.
682
- 3. `loki web` routes to the Control Plane only in its bare form (optionally --no-open); any other flag reaches the classic validator.
683
-
684
- ## D86 (2026-10-03 17:00Z, founder via the steering session, CoS records): Engine Laws are the engine constitution
685
- 1. Merges the steering session's earlier "D76" message (harness never worse than raw) with its later "ENGINE LAWS" directive. The label clashed with our D76, so both are recorded here under one number.
686
- 2. Trigger: FireLater#17. Plain claude took about 2 min; Loki took 11 min and $2.66 and ended in a FAILED draft. Root causes are classes, not one-offs:
687
- - testmap runs fixed commands from repoDir;
688
- - scope.ts reverts edits on keyword overlap;
689
- - sizing.ts cascade pins implement to sonnet;
690
- - verify has no ERROR versus FAIL split;
691
- - pr_body prints "not recorded" over real data;
692
- - there is no terminal-state invariant across sinks.
693
- 3. docs/v10/ENGINE-LAWS.md (L1 to L7) is binding for every stage, present and future:
694
- - L1 never below raw;
695
- - L2 fail closed on trust, fail open on work;
696
- - L3 the authority ladder;
697
- - L4 the Project Model;
698
- - L5 every failure has an owner;
699
- - L6 every run terminates everywhere;
700
- - L7 outputs are contracts.
701
- 4. Steering rule, added to OPERATING-MODEL.md: no bug becomes a fix slice until it has a row in docs/v10/FAILURE-CLASSES.md. Each row answers what the user saw against raw, the law broken, a sibling sweep, the one shared mechanism, and a regression fixture. Reviewers reject stage-only patches when siblings exist.
702
- 5. Sequencing:
703
- - Wave 0 ships in 10.7.1, with five builders in flight plus a cascade-off builder and a PR-body golden builder:
704
- - scope becomes advisory;
705
- - the cascade is off and escalation goes up only;
706
- - a load error or zero tests collected becomes harness ERROR, with no fix rounds and a ready PR;
707
- - a golden PR body;
708
- - run.completed ingest plus a reconciler.
709
- - Waves 1 and 2 go to the next train. Wave 1 covers the Project Model, the result classifier, the authority ladder in seal, a lifecycle e2e and static checks. Wave 2 covers the Repo Shape Matrix and the Parity Gate against raw `claude -p`, gating latest.
710
- - An opus Architect is checking the plan against the code and slicing it into EL-W0/W1/W2 rows.
711
- 6. Acceptance: a FireLater#17 rerun ends VERIFIED with a ready PR, the route edits kept, within raw plus 30s and at most 1.2x raw cost. The real-model legs stay parked until the founder provides keys (FOUNDER-QUEUE 15/16). The parity leg runs once keys exist; until then, recorded replays gate.
712
-
713
- ## D87 (2026-10-03 19:00Z, founder via the steering session, CoS records): parallel lanes today, usage stop raised to 95%
714
- 1. For today this supersedes the one-lane governor, the 81% weekly stop and the 85% floor. Up to 4 sonnet builders run in separate worktrees, and opus D12 reviews only HIGH slices.
715
- 2. Hard stop: no new dispatch at 95% of the weekly limit. The last 5% is reserved for releases, smoke checks and steering, because 100% stops everything, this session included, until Oct 7 12:59 ET.
716
- 3. Never hold completed work. Every green slice ships on the next train, and nobody pushes during a running release.
717
- 4. Usage readings are logged hourly in usage-readings.tsv from direct /usage readings. The pulse weekly projection is not used as a governor input while it reads 450%+.
718
- 5. Order: 10.7.1, then 10.8.0 (UI, CPE-24 if green, else 10.8.1), then MW-1 to MW-3, which replace mods M0 to M3 per the research in autonomi-dev/research/2026-10-03-claude-mods, then EL-W1.
719
-
720
- ## D88 (number reserved, stub recorded 2026-10-07 by the CoS at CTO request): CI waiver cited in PROGRESS.md, never written here
721
- PROGRESS.md (the FC-25 P9 entry) cites a D88 CI waiver that was never recorded in this log. This stub keeps the number taken, so D89 is unambiguous. The waiver's scope is only what that PROGRESS.md entry states. It never waived P9 on a release commit, and it grants nothing beyond that entry.
722
-
723
- ## D89 (2026-10-07, founder directive, CoS records): Haiku 5.5 executes, Opus advises, router decides; L1 means outcome parity
724
- 1. Founder directive, verbatim excerpts: "haiku 5.5 is released today ... it's going to cut down all costs drastically ... opus can be the advisor and haiku doing all the engineering work inside loki mode's engine ... sonnet is optional and routed by opus if haiku isn't performing well enough ... have that router perfectly ... model decides."
725
- 2. Engine Law L1 is amended (docs/v10/ENGINE-LAWS.md): "never below raw" means OUTCOME parity (solve rate, time and cost on the B9 corpus and the Parity Gate), not model identity.
726
- 3. A Haiku executor runs only in a configuration with Parity Gate evidence: with the Opus advisor attached, or without it only if the no-advisor arm also meets the Parity Gate. Otherwise the executor is Sonnet 5.5. The executor, the advisor state and any fallback reason are printed on the start line and in the receipt, so nothing is silently reduced.
727
- 4. The escalation ladder goes up, always before STALLED: Haiku -> Sonnet 5.5 for the rest of the run -> Opus for a repeated failure on Sonnet.
728
- 5. H4 is defined in ENGINE-LAWS.md: self-improving per-repo, per-shape routing from recorded outcomes. Sonnet becomes the default on a shape where Haiku lost 2 of the last 3 runs (code-owned, per H4).
729
- 6. Opus makes the routing decision as schema-checked JSON (L0). The harness adds no repo-shape or task-wording logic beyond the H4 evidence lookup, which may only move the executor up.
730
- 7. Rollback and parity: `LOKI_ROUTER=0` restores the prior behavior exactly. A shape where Haiku fails the Parity Gate runs on Sonnet 5.5. A shape where Sonnet also fails runs on the pre-router default until a Parity Gate row shows the routed executor at parity.
731
- 8. Implementation: docs/v11/ROUTER-1.md (slices R1-01 to R1-21). This slice is R1-04.
732
- 9. Default-on only after parity: while slices are built, `LOKI_ROUTER` unset means off. R1-19 flips the default to on only when, on the release candidate SHA, the FireLater#17 gate is green (VERIFIED, ready PR, time within raw + 30s, cost <= raw x 1.2) and the B9 corpus shows correctness parity with raw `claude -p` on every shape not listed in the seeded router-shape-defaults.json. After the flip, `LOKI_ROUTER=0` is the opt-out and restores the exact pre-router model behavior, pins included (R1-21 golden).
733
- 10. Accepted risk (CTO, 2026-10-07): B9 measures about 5 of the 14 or more Repo Shape Matrix shapes, so an unmeasured shape starts on Haiku without shape-level parity evidence; the backstops are the in-run escalation ladder (Haiku -> Sonnet 5.5 before STALLED, so a miss costs time and money, not correctness) and the H4 history floor, the receipt records shape parity as NOT PROVEN for any shape with no B9 row, and each matrix shape gains a B9 row as it becomes runnable.
734
-
735
- Amendment to D89 (2026-10-07 21:40Z, CTO decision, refined by the founder at 21:45Z, CoS records). This amends only R1-19, the default-on flip that follows the CTO gate; 11.1.0 and 11.2.0 still ship the router OFF. (1) The default executor is Sonnet 5.5; Haiku 5.5 per work unit when Opus assigns it. (2) Roles: Opus 5.5 is the architect, router and advisor, plans and assigns each unit, and is consulted on hard calls. Sonnet is the senior engineer and the default for implementation and fixes. Haiku does tests, docs and small low-risk changes only when Opus assigns them in the plan. Haiku is never the blanket default. (3) L0 holds: the harness never routes by task type or path regex; it only executes, verifies and escalates. (4) The route schema is `units: [{id, kind, executor, reason}]` plus a run default of sonnet; a missing or invalid unit route goes to sonnet with NOT PROVEN. A haiku unit that fails a code-owned check is redone on sonnet, then escalates to opus; a Wall assigned to haiku gets an Opus review before implement. The receipt lists the executor, assigner and reason per unit. The per-unit schema lands in 11.2.0 or 11.2.1 depending on what is merged. (5) Escalation stays evidence-gated (haiku -> sonnet -> opus, and sonnet -> opus), and `LOKI_ROUTER=0` equals pre-router behavior exactly (the R1-21 golden). (6) The R1-16 shape-defaults semantics are inverted (a shape is listed as `haiku` once it has earned it; an absent listing means Sonnet), and R1-16 history is an input to Opus, not a harness rule. Rationale: a wrong PR costs the user far more than the token savings, B9 covers only about 5 of 14 shapes (item 10), and under L0 a model earns the cheaper tier with evidence. Items 3, 5, 7 and 9 above are read with this amendment; their text is kept as recorded. See docs/v11/ROUTER-1.md sections 4.1, 4.3 and 4.6.
736
-
737
- Amendment 2 to D89 (2026-10-08 00:15Z, steering finding, CoS records; tightens a gate, so it binds until the CTO relaxes it). R1-19 gains one more gate line: on the trivial fixture (the steering Node off-by-one fixture), router-on cost must be <= router-off cost x 1.05, measured with n>=3 per arm and recorded per arm as cache-read input tokens, fresh input tokens, output tokens, dollars and wall time (R1-17 B9). Evidence that prompted it (n=1, may be variance): 11.2.0 smoke, router on cost +15% tokens, +27% dollars and +38s with zero advisor calls and no route change. If the advisor tool definition costs tokens on sessions that never consult it, the advisor is enabled only on the sessions Opus marks as needing it (plan and fix rounds), not on every stage. Measure before changing code.
738
-
739
- ## D90 (2026-10-08, founder directive, CoS records; CTO approved): the push and release gate is the fast gate, full suites run nightly
740
- Founder directive, verbatim: "why tests take 15 to 20min? cut it down to only needed ones and keep only less than 2min total in git".
741
-
742
- 1. This supersedes D55 for the release gate. D55 required a full Tier B verdict on the exact tree of every main commit. The blocking gate on slice-*, train/**, main and PRs (test.yml, name "Tests") is now: tsc plus the dist build once (reused as an artifact), the moat P9 case only (tests/moat/p9-rule-of-two.sh, with every registered P9 id required to PASS), the structural guards, and the impacted bun and shell suites selected from the diff since the last release tag by scripts/ci/fast-gate.sh (it wraps scripts/select-tests.sh and adds path-to-guard mapping for the paths the selector sends to R0: workflows, Dockerfiles, package manifests, tests/lib, dist, VERSION). Shards are packed to stay under 90s each.
743
- 2. Fail safe: if the diff cannot be computed, the planner selects the FULL set (test.yml calls full-suite.yml).
744
- 3. Deferral: any selected suite estimated over 80s (from tests/shard-durations.tsv) is not run in the push gate; it is listed in deferred.tsv and covered by the nightly.
745
- 4. Backstop: full-suite.yml (all 8 shell shards, full bun, python matrix, helm, Node 20/24, the full moat registry) runs from nightly.yml on a schedule and by workflow_dispatch. It is non-blocking for the push. A red nightly opens a FAILURE-CLASSES fix slice and blocks the NEXT release: release.yml required-ci fails while the latest completed nightly on main is red and newer than the previous release tag, until a newer nightly is green. The block fails closed if the API cannot be read.
746
- 5. Removed as duplicates: tier-a.yml (its job is now the fast gate in test.yml, same triggers), first-run-gate.yml (moved to a continue-on-error job in nightly.yml; promote.yml and the post-release smoke already run an installed first-run check), and tests/test-tier-a-r0-timeout-budget.sh (its workflow no longer exists).
747
- 6. Release: publish-npm packs once, verifies the PACKED tarball, uploads it and publishes that tarball with no second prepack build; the registry-visibility wait is its own job (npm-visible) so the publish job ends when the publish does. Post-Release Smoke npm leg shrinks to a fresh install plus loki version plus the doctor assertion with a short backoff.
748
- 7. Not done here, tracked as deferred: publishing the tarball built by the Tests run across workflows, the stubbed-run smoke step, and the full moat registry ratchet in the push gate (kept nightly).
749
- 8. Risks accepted: selected tests are an estimate of impact, not proof; the nightly is the proof, and the NEXT release pays for a miss. Timings are estimates until measured on push.
750
-
751
- ## D91 (2026-10-08, founder directive relayed by the CTO at 04:35Z, CoS records): releases by clock, continuous merge, hotspot registries
752
- Founder directive, verbatim: "faster faster, increase velocity and releases and feature count in each release and updates/enhancements/bug-fixes in each release, strategize and steer that way".
753
-
754
- 1. Releases by clock, not scope (amends D25 and D37). From 11.3.2 on, the Release Manager cuts a release every 45 minutes from whatever is approved and green on main. No cut waits for a slice; a slice that misses a cut takes the next one. Each release targets at least 3 user-visible features plus at least 5 enhancements or fixes, with a user-facing CHANGELOG. A cut short of that target still ships what is green; the shortfall is recorded in METRICS.md and the backlog is refilled.
755
- 2. Continuous merge to main. An approved slice rebases and merges right away behind tsc, its impacted tests, the always-run global guards and moat P9. Long-lived train branches end after 11.3.1. Risky features merge flag-gated and default off, never held.
756
- 3. Hotspot registries (pure refactor, goldens byte-identical). The seal verdict chain, the PR body, the supervisor start line, plan output and start dispatch each become a registry of contributors, so a new feature adds one file plus one registry line. One Opus architect plus 2 engineers own it.
757
- 4. Pipeline budget: push to npm latest under 10 minutes; publish-npm under 1 minute; smoke plus promote under 3 minutes. Measured on every release and reported to steering.
758
- 5. Backlog: at least 30 specced ready slices at all times, split evenly between features, enhancements and fixes, each with acceptance tests. Seat cap 14 while weekly usage is under 50%.
759
- 6. Dogfood: once MASS-1 ships, Loki runs `loki issues run --label bug --draft` against asklokesh/loki-mode's own issues; each VERIFIED PR is a candidate fix for the next cut, reviewed like any slice.
760
- 7. Host: local gates are tsc, impacted tests and global guards; remote CI is the authority. Worktrees stay under 40, pruned by recorded path on every merge (never by timestamp).
761
- 8. Reviews keep the bar (D12/D13) and run in pair mode for every HIGH slice: the reviewer reviews live as commits land, not serially after the build. Unchanged: moat > Seal accuracy, a moat regression still blocks a cut (it is never waived by the clock), and Tier B on the release SHA is still required (D90).
762
- 9. Amendments relayed by steering, 04:40Z to 04:55Z. The cadence drops to 30 minutes once CI-FAST is live (from 11.3.2), and each cut carries 3+ features and 8+ enhancements or fixes. The seat cap rises to 20 once the hotspot registries land. Acceptance-first: an Opus-written acceptance test is committed before the code of every feature slice. Real-run harness: `scripts/real-run.sh <scenario>` installs the packed tarball into a temp prefix and asserts on receipt.json plus the console contract; Post-Release Smoke runs trivial-sum. Finding-to-guard: every review finding becomes an FC row plus an automated guard test.
763
- 10. 10x rule. Each release names one headline metric measured 10x better than a named competitor baseline, and publishes it only when measured: 11.3.2 unattended throughput (MASS-1), 11.3.3 cost per verified fix, 11.3.4 human review time, 11.3.5 babysitting interventions, 11.3.6 time to first verified PR.
764
- 11. COST-HALF. Loki's dollars per VERIFIED task must be at most 0.5x raw `claude -p` on the B9 set (n>=3, with intervals), measured and published every release. Levers: one warm session, model-decided stage skipping (verify and seal never skip), per-unit Haiku, the advisor only where Opus marks it, a context diet under 100K, a byte-identical cache prefix with a test, and harness prefetch of the repomap, test command and failing output. B9 gains a raw arm and a loki arm.
765
-
766
- ## D92 (2026-10-08, founder directive relayed by steering at 05:00Z, CoS records): 40x efficiency in 12 hours
767
- Founder directive, verbatim: "research and update all things in loki mode per latest docs, features, updates in the industry, latest standards and much better ways of doing things so our efficiency increases by 40 times overall by tomorrow morning, all should complete in 12hrs, run everything like a software company including researchers and scientists ... consider us to become the best for next 5yrs right now".
768
-
769
- 1. Definition: EFFICIENCY = verified tasks / (dollars x wall-minutes x human-minutes), measured with B9 raw-vs-loki on a fixed set (trivial-sum, two-bug, one medium real issue, a 10-issue mass run). Baseline is 11.3.1, measured the moment it ships. Target by about 17:00Z: 40x, as a product of factors (about 2x cost, 2x wall time, 10x human-minutes), each reported separately in METRICS.md every release.
770
- 2. Organization: a research division (paper-scout, docs-scout, market-scout; Opus with web access) feeds slice specs through steering. Engineering programs with named owners: COST-HALF, SPEED, HUMAN-TIME, REGISTRIES, ACCURACY, PLATFORM-UPDATE, STANDARDS. One measurement owner runs the B9 raw arm and the 40x scoreboard script. Seat cap 20 while weekly usage is under 50%.
771
- 3. Cadence and bar: a release every 30 minutes once CI-FAST is live, each with 3+ features, 8+ fixes or enhancements and a scoreboard row. A moat regression blocks a cut, P9 is never waived, and nothing unmeasured is claimed.
772
-
773
- ## D93 (2026-10-08, CTO amendment relayed by the CoS, Architect records): the router plan becomes a routing call; the full plan is conditional
774
- Amends FC-35 (the router-on plan no longer skips small tasks) and D89 Amendment 2 for COST-HALF (D91 item 11).
775
-
776
- 1. Under LOKI_ROUTER=1, Opus ALWAYS makes the routing decision, as one short structured-output call: cache-stable prefix (COST-HALF CP-01), effort low, output {size: trivial|small|medium|large, units[], needs_full_plan: bool}. Measured target cost: under $0.01 per run.
777
- 2. The full Opus plan session runs only when needs_full_plan is true. Trivial and small tasks go straight to the routed executor on the lean path.
778
- 3. One plan gate. The implement session's LOKI_NEED_PLAN marker is a second input to the same gate: it can raise it (plan runs once, implement resumes), never lower it. With the router off, the gate's inputs are the marker and the Project Model. The receipt records the reason: route_call, marker, project_model or skipped.
779
- 4. FC-35 R-B holds unchanged: always emit a route or a recorded reason. A failed, timed-out or malformed routing call writes routed:false with the reason to route.json and runs the full plan as before (fail-safe toward more planning, never less). Wall, verify, commit, seal and pr never skip.
780
- 5. Measurement gate: the B9 row on trivial-sum shows the routing call below 10% of total run cost (n>=3), and router-on cost at most 1.05x router-off (D89 Amendment 2). Router-off output stays byte-identical with the flags off.
781
- 6. Slices: COST-HALF LD-01 (gate plus routing call) and LD-02 (marker as a late input), HIGH tier.
782
-
783
- ## D94 (2026-10-08, CTO ruling relayed by the CoS): main holds the last pushed release until npm has it; RG-06 contrib cap
784
- 1. Main stays at the last pushed release commit until that version is on npm. Later approved slices merge onto a train branch (train-<version>), which fast-forwards or merges into main only after the cut is published. Origin: 11.3.2 train merges sat on main while 11.3.1 was blocked on a red nightly (NIGHTLY-BLOCK), which forced a cherry-pick-only push.
785
- 2. Line budgets are never raised to admit a feature. Overflow is extracted along docs/v11/REGISTRIES.md.
786
- 3. RG-06 approved: loki-ts/src/contrib/ with a 1200-line cap and the D66 import rules. Binding guards: core (engine10) never imports contrib; each contrib module is optional (deleting one leaves core compiling and flag-off goldens unchanged); no verdict logic in contrib (D42); the cap failure lists per-file line counts.
787
-
788
- ## D96 (2026-10-08, founder directive relayed by steering at 17:45Z, CoS records): every approved slice is a release; next by merge, latest by promotion (point 3 SUPERSEDED by D102: latest and next publish together)
789
- Founder: "you are taking hours long for releases, I wanted 3 releases to 10 releases per hour ... release asap to accommodate that many". Supersedes D94 point 1 (trains) and the D91 clock cut; D90 moves from publish to promotion. D94 points 2 and 3 stand.
790
- 1. A slice that passes merge-gate merges straight to main, and main publishes a PATCH to npm `next` within 15 minutes. There are no trains and no batching. Target: 3 or more releases per hour, 10 when the queue allows.
791
- 2. `next` gate (budget 10 min from push to npm): tsc, impacted tests plus always-run guards, moat P9 (never waived), dist guard, pack smoke.
792
- 3. `latest` is promotion only, never a separate build. promote.yml moves `latest` to the newest `next` version whose SHA, or a descendant of it, has a green full-suite backstop and a green Post-Release Smoke. The backstop runs on main HEAD every 60 minutes. A red backstop blocks promotion, not publishing, and opens a P0 fix slice within the hour.
793
- 4. Pipeline: the workflow bumps the version on push to main (no human bump), CHANGELOG lines come from slice cards and verdicts, the backstop runs hourly, and promotion is driven by a green backstop. Every existing release guard stays: never-backwards, the gitHead stamp, the release-actor tag check. First slice: D96-GATE (move the red-nightly block from release.yml to promote.yml).
794
- 5. Slices are 20-40 minutes of build, one concern, with a user-visible line on the card. Large features ship as a sequence of small flag-gated slices.
795
- 6. HIGH reviews run in pair mode. A TL reviews LOW and MEDIUM with the machine gate, and merge-gate is the hard check. There is no serial review queue.
796
- 7. Every tick reports merge-to-`next` minutes for each release and releases per hour.
797
-
798
- ## D98 (2026-10-08, CTO ruling relayed by steering at 19:22Z, RM records): guard review standard and the HIGH review round limit
799
- 1. A guard (a test that fails a build on a shape it detects) blocks a merge only on findings that a realistic change would trigger: an ordinary workflow edit or an ordinary contributor mistake. A realistic finding always blocks.
800
- 2. Contrived adversarial bypasses (exit 256, eval rc=0, writes hidden in arithmetic or through an indirect name, deliberately obfuscated shell) are logged as LOW follow-up rows in FAILURE-CLASSES.md and do not block. These guards protect against our own mistakes; an attacker who controls workflow files is covered by branch protection and review.
801
- 3. HIGH reviews have a 2-round limit. Round 3 escalates to the CTO with the finding list, and the CTO decides. Reason: opus share was about 50% against the 30% budget (D13).
802
-
803
- ## D99 (2026-10-16, founder grant at 19:33Z "make all decisions on my behalf to make loki mode better than anything in the world", CoS records): every open founder and CTO decision is decided
804
- Standing: from this grant on, the CoS decides founder-queue items without waiting and records each here. Items needing a credential or money beyond the caps below still go to FOUNDER-QUEUE.md. Claude stays the primary provider and `loki start` stays the primary entry point (founder, standing).
805
- 1. C-C1 gateway lane wording: a non-Anthropic model routed behind the claude CLI is labelled "gateway lane (unqualified)". `loki doctor` prints that label and a feature-loss list (prompt caching, extended thinking, server tools and hooks are not guaranteed on that lane). Claude routes stay unlabelled and default. Unblocks P12-27.
806
- 2. C-C2 permission default: the compiled permission policy becomes the default once P12-26g-c merges with a HIGH approve. The legacy skip-permissions path stays reachable only with LOKI_PERMISSION_POLICY=legacy, and run start prints which mode is active. Flip slice is HIGH.
807
- 3. C-C3 cost moat overlap: COST-2 and COST-3 fold into P12-32. One scoring module computes expected accepted-outcome cost (price divided by the measured acceptance rate); no parallel moat change. Unparks COST-2/3 as P12-32 inputs.
808
- 4. C-C4 Wall holdout: ratio 0.2, active when a Wall has 5 or more checks (at least 1 held out). A holdout failure blocks the Seal (NOT_PROVEN with the holdout reason), never a warning. Default on. Reason: moat and Seal accuracy rank above cost and speed.
809
- 5. C-F1 paid evaluation: approved, hard cap 150 USD for this cycle across COST-6 n=3, the B9 live run and the S-112 ablation unpark. Each run sets a per-run cost cap; spend lands in METRICS.md. The 50 USD/day line (queue item 3) still binds.
810
- 6. C-F5 hosted Company OS: out of scope until cost at or under 0.5x raw Claude Code is proven. The CLI and `loki start` stay the product.
811
- 7. C-F6 enterprise commitments: no SCIM, HA or named support owner yet. P12-48 (retention and backup) proceeds.
812
- 8. C-F7 comparative external pilot: deferred until C-F1 runs prove the cost claim; no external spend now.
813
- 9. C-F8 stale version references: the CoS refreshes in-repo docs (PLAN-V12) to the shipped VERSION; the source plan outside the repo is left as an archived input.
814
- 10. M-27 Legacy-Bench pilot: use the public set named in MODERNIZE.md; calibrate the cap from the first 3 pilot runs inside the C-F1 cap.
815
- 11. M-27E defaults: D1 (multi-file units NOT_PROVEN), D2 (a wave with no detected integration tests verifies with a warning; build and original suite still block) and D3 (overflow goes to util/, the modernize/ cap stays 4,000) are adopted as built.
816
- 12. P12-13b journeys: the U1-U8 list is confirmed as the journey set; add the gh pr edit and comment stubs.
817
-
818
- ## D100 (2026-10-16, CTO call under D99, CoS records): features cap raised from 3,000 to 3,300 lines
819
- - FC-09u round 1 HIGH review reproduced 7 bypasses of a hand-rolled YAML key reader in runner_config.ts. The builder had folded that code onto a single line of about 600 characters to stay under the D66 features cap, and the folded code hid the bypasses.
820
- - The parser-based round 2 fix, unfolded, takes src/features to 3,012 lines.
821
- - Rejected: folding again, which hurts review. Also rejected: moving the helper into src/util only to dodge the cap, which games the gate.
822
- - Rule: never fold code to fit a cap. When a correct, readable change crosses a cap, the cap owner raises it in the same slice and records why.
823
- - Unchanged: the engine10 core cap (D29, D33), the e10ext cap (D42) and the contrib cap.
824
- - Reverse: lower the cap back once A-150 or a features split frees lines.
825
-
826
- ## D101 (2026-10-16, CTO call under D99, CoS records): runner config files cap trust on any byte change
827
- - FC-09v round 1 HIGH review reproduced a bypass with real pnpm 11.1.3: a block scalar indicator on its own line made Bun.YAML swallow `overrides` into a string while js-yaml 4 installed a malicious `link:` override. A fuzz found more parser disagreements (`1_000`, timestamps, block indentation indicators).
828
- - Rule: never trust a second parser's view of a file another tool will load. For YAML runner config, byte-identical means unchanged; any other byte change caps trust. Changed `*.patch` files and paths under `patches/` cap as well.
829
- - Cost: an unrelated edit to pnpm-workspace.yaml now caps. Accepted: such edits are rare and moat beats convenience.
830
- - Rejected: more regexes on a strict subset (round 1 showed the class is open); bundling js-yaml (pnpm can change parsers between versions).
831
- - Reverse: only by comparing with the exact parser the installed package manager uses, proven by a differential fuzz against it.
832
-
833
- ## D102 (2026-10-17, founder directive, CoS records): a VERSION push publishes npm `latest` and `next` at once; no CI gate before npm
834
- Founder: "stability I don't want nightly delaying latest version in npm, make an update and always a release should get into npm as well asap, but never cost time of testing, i hate delays, i want fastest releases into npm, significantly fastest and much faster than anyone in the world. within seconds." Supersedes D96 point 3 (latest by promotion), the `next` gate wait of D96 point 2, and the required-ci wait described in earlier release docs.
835
- 1. A push to main that changes VERSION runs release.yml. The new `publish-npm` job needs only `pack-npm` (which already verifies the packed tarball carries a fresh dist and records its sha256). It does not wait on `gate`, Tests, Security Audit, nightly, the backstop, Post-Release Smoke, the git tag or the GitHub Release.
836
- 2. `publish-npm` verifies the tarball digest, publishes with `--tag next`, then moves `latest` and `next` to VERSION only behind a `sort -V` never-backwards guard (VERSION must be the highest). A rerun for a version npm already serves only re-asserts the dist-tags; any other publish failure is fatal. The TypeScript SDK does the same (publish `--tag next`, then guarded tag moves).
837
- The `release-npm` concurrency group (and `release-npm-sdk` for the SDK, `cancel-in-progress: false`) keeps one pending job, so an intermediate version can be skipped on npm while `latest` still ends at the newest.
838
- 3. Deleted: the `required-ci` job, `.github/workflows/promote.yml` and their tests (test-promote-head-stamp.sh, test-promote-smoke-sha.sh, test_release_required_ci.py). The Docker `:latest` tag and the Homebrew formula bump that promote.yml performed now run inside release.yml after the release job.
839
- 4. Tests, Security Audit, the nightly and the backstop still run in parallel on every push. They are fix-forward signals: a red result opens a P0 fix slice, never delays or blocks npm. `gate`, tag, GitHub Release, SBOM, notify, docker and the SDKs still use it. `npm-visible` stays informational.
840
- 5. Safety net unchanged: never unpublish; `npm deprecate` is allowed for a bad version, then ship the fix as the next PATCH. The never-backwards guard now lives in publish-npm (publish under next, move latest and next only if VERSION is the highest by sort -V; serialized by a release-npm concurrency group); the gitHead stamp, packed-version check and release-actor tag guards stay.
841
- 6. Pulse: a promotion lag violation, if one exists, fires only when npm `latest` differs from `next`.
842
- - Cost accepted: a red build can reach `latest` for minutes. Reason: the founder ranks speed of release over pre-publish testing, and deprecate plus fix-forward bounds the damage.
843
- - Reverse: only by a founder directive.
844
-
845
- ## D103 (2026-10-17, CoS under D99, founder directive "faster releases and faster strategy to 10/10 asap"): throughput levers
846
- 1. Seat cap 20 and worktree cap 21 (was 14 and 15). The founder ruled cost irrelevant on the Max plan; the limit is this machine (14 CPUs, 24 GB). Load average above 20 or free memory under 3 GB pauses new dispatch.
847
- 2. HIGH-tier slices are built by opus. Evidence: TEN-P9-FIX (opus builder) was approved in round 1, while sonnet-built HIGH slices DEPLOY-02 and COST-11 each took 3 rounds.
848
- 3. Every builder brief carries the anti-BLOCK checklist: run the row's exact Wall command; for each new guard, show the mutation that turns it red, including the boundary case (numeric vs string compare, the token removed from one of two places); test through the real entry path (bin/loki start, runMachine), not only the helper; sweep siblings of the same mechanism. Most of today's BLOCKs were one of these.
849
- 4. Every approved slice is merged and released in the same CoS turn (D102 unchanged). TEN-RELEASE-FAST extends scripts/release.sh so one command bumps, writes the notes, rebuilds dist, commits, runs the push checks and pushes.
850
- - Reverse: by founder directive, or by the CoS if load or memory limits are hit twice in an hour.
851
-
852
- ## D104 (2026-10-17, CTO call under D99, CoS records): Seal VERIFIED requires agent-independent proof, default on (TEN-GATES-02)
853
- FC-AGENT-PROOF: a run whose only executed passing check is a test file the same run ADDED proves nothing an independent party wrote; the agent graded its own work.
854
- 1. Every receipt check gains an additive `provenance` key from the TEN-GATES-01 classifier (`checkProvenance` in loki-ts/src/util/check_result.ts): exogenous, independent (a Wall file or the holdout), agent_authored (a runner on a path with status A in the run diff) or llm_judge. A receipt without the key (sealed before this change) still verifies: the hash covers whatever keys the body holds.
855
- 2. seal.ts uses `hasExogenousProof` instead of `hasExecutedProof`. A green Wall base run still counts. When the only executed passes are agent_authored or llm_judge, the verdict caps at PARTIAL and NOT PROVEN gains "only agent-authored tests executed (no agent-independent proof)".
856
- 3. receipt.md splits `### Agent-independent checks` (exogenous, independent) from `### Agent-authored / advisory checks` (agent_authored, llm_judge; an unknown value lands here, fail closed). A receipt without provenance keeps the single `### Checks` section.
857
- 4. Default on. Opt-out: LOKI_EXOGENOUS_PROOF=0 (exact string "0"; any other value, including "00" or "false", keeps the gate) restores the FC-16 executed-proof verdict. Provenance is still recorded under the opt-out.
858
- - Cost accepted: some honest runs that only add new tests for new code now seal PARTIAL until a Wall or a pre-existing suite covers them. Reason: Seal accuracy ranks above delivered accuracy (operating model order).
859
- - Reverse: only by a CTO call recorded here with a measured false-PARTIAL rate.
860
-
861
- ## D105 (2026-10-17, CTO call under D99, TEN-GATES-10): VERIFIED needs one agent-independent fact beside the agent's own suite
862
- 1. The agent writes both the code and its test suite, so a green suite alone is the agent grading its own work. `proof-generator.py` now records a pre-headline degraded item `exogenous_evidence` ("no agent-independent evidence (only the agent's own test suite passed)") when tests are verified and no exogenous fact passed, which turns that VERIFIED into VERIFIED WITH GAPS.
863
- 2. Counts as corroboration: build verified, healthcheck ok, functional_status verified, a security scan that ran and came back clean, or an exogenous quality gate that passed. An advisory (model-authored) gate pass never counts, including the `unit_tests` gate derived from the suite itself.
864
- 3. The item is a headline input (no `post_headline` flag), so `proof-verify.py` re-derives the same amber headline from the recorded ledger with no verifier change. The rule never moves a headline to green and never touches NOT VERIFIED.
865
- 4. Opt-out: `LOKI_PROOF_REQUIRE_EXOGENOUS=0` (exact string "0" after trimming; any other value keeps the requirement, fail-closed).
866
- 5. Ordering: the primary `loki start` route already writes build-results.json (TEN-GATES-09) and an exogenous security_scan gate (TEN-GATES-08), so a run with a real build or scan keeps VERIFIED. Health and functional facts arrive with TEN-GATES-07 (not yet merged when this landed); until then a route run whose stack has no build step and no scan result reads amber, which is the honest reading.
867
- - Reverse: CTO call if field receipts show honest runs with real exogenous checks reading amber; the opt-out covers one-off needs.
868
-
869
- ## D106 (2026-10-19, founder decision, FireLater#20 follow-up): the up-front dependency install is locked and fails closed
870
- 1. The founder kept the intake dependency install shipped in 11.17.68 (intakeDeps installs each package whose dependencies are absent, before the baseline and the Wall base run) and asked that it meet industry-standard, enterprise practice. This supersedes the "only when a selected check fails" wording of FOUNDER-QUEUE row 19 part (b); the evidence-triggered path stays as well.
871
- 2. Locked: install.ts `lockedInstall` maps (package root contents, model command) to the ecosystem's frozen form through one table. Lockfile to form: package-lock.json or npm-shrinkwrap.json `npm ci`; pnpm-lock.yaml `pnpm install --frozen-lockfile`; yarn.lock `yarn install --immutable` (Berry: .yarnrc.yml or packageManager yarn@>=2) else `--frozen-lockfile`; bun.lock or bun.lockb `bun install --frozen-lockfile`; uv.lock `uv sync --locked`; poetry.lock `poetry install` (already lock-honoring, kept as written); Pipfile.lock `pipenv install --deploy`; Cargo.lock `cargo fetch --locked`; Gemfile.lock `BUNDLE_FROZEN=true bundle install`; composer.lock `composer install`. A lockfile governs a package only if it is in the package directory or in an ancestor that declares a workspace containing the package (package.json workspaces for npm, yarn and bun; pnpm-workspace.yaml; Cargo [workspace] members; uv tool.uv.workspace members); otherwise the command is kept and recorded unlocked. A `cd X` segment moves the lookup to X. An already-locked model command is kept byte for byte; flags are kept; a command that names packages, a missing lockfile or no matching rule keeps the model command and the check records `locked: false` with `lock_note`.
872
- 3. poetry: `poetry install` already honors poetry.lock and is kept unchanged. `--no-root` is deliberately not added (it skips installing the project itself and breaks src-layout imports) and neither is `--sync` (it removes environment packages the lock lacks).
873
- 4. Fail closed: a locked install that fails (for example a lockfile out of sync with its manifest) is a harness-owned NOT PROVEN with the real output excerpt; the harness never falls back to a mutating install. A command containing a `||` anywhere is left entirely as written (every install in it, `locked: false`, lock_note "fallback masks install failure"), because the shell reads `a && b || c` as `(a && b) || c` and the fallback masks a failure in any earlier segment; so is any command outside an allowlist (lock_note "unparsed shell construct"), since there is no shell parser: after trimming trailing whitespace and `;`/newline separators and joining `\<newline>` continuations, the command may contain only [A-Za-z0-9 _./=:@+,%~-], tabs and the separators `&&`, `;` and newline (so no quotes, backticks, parens, braces, `$`, redirects, `|` or lone `&`), every segment before the first install must be `cd <path>`, `export VAR=value` or pure VAR=value assignments (so set, pushd, trap, function, alias, shopt, eval, source, exec and the like are refused), and any assignment to PATH, NODE_OPTIONS, BASH_ENV or ENV, bare, exported or as an install prefix, is refused. A command that passes is rewritten only where each install and every segment after it are joined by `&&`: runDetached runs `bash -c` without -e, so a later `;` or newline command (for example `npm install; echo done`) would mask a failed locked install, and the whole command is then left as written with `locked: false` and lock_note "later command masks install failure". Separators before the install (`cd x; npm install`) are fine. pnpm `--no-frozen-lockfile` is dropped when `--frozen-lockfile` is added.
874
- 5. Visible: the install check and the deps.install event carry `cmd` (what ran), `locked`, `lock_note` and, when rewritten, `model_cmd`.
875
- 6. The project's own install scripts (for example npm postinstall) run exactly as they do for a developer; opt-out is LOKI_E10_INSTALL=0 or loki.yaml `verify.install_deps: false`, documented in docs/environment-variables.md.
876
- - Amendment (D99): uv uses `uv sync --locked` (fails on an out-of-sync uv.lock; `--frozen` is replaced) and pipenv uses `pipenv install --deploy` (fails on an out-of-date Pipfile.lock; `pipenv sync` is replaced); pnpm-workspace.yaml is read in inline-list, block and unindented-block forms with `!` exclusions.
877
- - Reverse: founder call; the opt-out covers one-off needs.
878
-
879
- ## D107 (2026-10-23, CoS records): #246 stays OFF by default (KEEP OFF)
880
- 1. The #246 behavior ships disabled by default; it is enabled only by an explicit opt-in.
881
- 2. Reversing this needs a new decision entry with field evidence.
882
-
883
- ## D108 (2026-10-22, founder grant, CoS records on 2026-10-23): paid Claude and loki runs are pre-approved, each use is logged
884
- 1. The founder pre-approved paid Claude runs and paid loki runs (LOKI_BENCH_SPEND_APPROVED) without a per-run question.
885
- 2. Every use is logged (what ran, why, when) so the spend stays auditable. This extends D99.
886
-
887
- ## D109 (2026-10-23, CoS records): weaktest and 246 are retired
888
- 1. The weaktest and 246 work items are closed as retired; they are not reopened without a new decision entry.
889
- 2. Related: D107 keeps the #246 behavior OFF by default.
890
-
891
- ## D110 (2026-10-23, CoS under D99, slice pd/npmskip GO): npm dist-tag moves are fail-closed on any registry read failure
892
- 1. scripts/npm-dist-tags.sh moves latest and next only to the highest published stable version, never backwards. It re-reads the tags after writing and restores an overtaken tag.
893
- 2. Any failed or empty read of latest, next or the published versions refuses before ANY write (exit 1, "refusing to move latest (fail closed)"). The same script serves loki-mode and loki-mode-sdk. Class: FC-DIST-TAG-MOVED-BACKWARDS in FAILURE-CLASSES.md.
894
- 3. Companion guards in the same slice: a verify-npm-registry job proves the registry serves the version, and release.sh --ship refuses notes that release-notes.sh rejects (not bypassable by LOKI_RELEASE_SKIP_GUARDS).
895
-
896
- ## D111 (2026-10-23, CoS records, CW-04, #337): LOKI_SPEC_STRICT=1 is opt-in, default off
897
- 1. Strict spec handling runs only when LOKI_SPEC_STRICT=1 is set; the default behavior is unchanged.
898
- 2. Making it the default needs a new decision entry.
899
-
900
- ## D112 (2026-10-23, founder mandate, CoS records): full autonomy and the 10/10 mandate
901
- 1. The founder granted full decision authority and set 10/10 as the standing target; the CoS decides, ships and logs without per-step approval. This restates D99 and the 2026-10-22 grant.
902
- 2. The never-do list in docs/LOKI-10-BUILD-PROMPT.md and the zero-mis-anything bar still bind.
903
-
904
- ## D113 (2026-10-23, CoS records): test-only council changes are MEDIUM tier, not HIGH
905
- 1. A change that touches only tests (no product code, gate, verifier, Seal, auth or release policy) is reviewed at MEDIUM by Tech Leads under D12, not by HIGH opus reviewers.
906
- 2. Any change that also touches the moat, verifier, Seal, auth, security or release policy stays HIGH.
907
-
908
- ## D114 (2026-10-23, CoS records, #343): Codex MCP secrets never go on argv
909
- 1. Secret names are passed to Codex through env_vars; secret values travel only in the process environment.
910
- 2. No secret value appears in a command line, where ps and shell history can read it.
911
-
912
- ## D115 (2026-10-23, founder standing rule, CoS records, RQ-106): SDKs are never more than 7 days behind
913
- 1. @anthropic-ai/sdk, @anthropic-ai/claude-agent-sdk and the PyPI anthropic package are never pinned behind the newest release that is older than 7 days.
914
- 2. Dependabot (daily, group anthropic-sdks) opens the bump; `python3 scripts/dep-inventory.py --sdk-freshness` runs daily from .github/workflows/sdk-freshness.yml and goes red naming the package.
915
- 3. A red caused by an SDK release is never cleared by a plain rerun: bump the pin and fix forward.