loki-mode 10.11.0 → 10.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/dashboard/__init__.py +1 -1
  4. package/docs/CLI-REFERENCE.md +1 -1
  5. package/docs/INSTALLATION.md +1 -1
  6. package/docs/v10/BOARD.md +3 -3
  7. package/docs/v10/DEPS.md +3 -0
  8. package/docs/v10/FAILURE-CLASSES.md +17 -0
  9. package/docs/v10/PROGRESS.md +6 -0
  10. package/loki-ts/dist/loki.js +640 -639
  11. package/mcp/__init__.py +1 -1
  12. package/package.json +1 -1
  13. package/packages/control-plane/dist/server.js +214 -209
  14. package/packages/control-plane/package.json +3 -1
  15. package/packages/control-plane/src/ask/tools.ts +111 -0
  16. package/packages/control-plane/src/ask/tools_server.ts +46 -0
  17. package/packages/control-plane/src/server/routes/artifacts.ts +3 -3
  18. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  19. package/web-app/dist/assets/{AdminPage-qTfCHm93.js → AdminPage-CmgIgBFY.js} +1 -1
  20. package/web-app/dist/assets/{Avatar-V5Wfzf34.js → Avatar-Dm3ypJzh.js} +1 -1
  21. package/web-app/dist/assets/{Badge-B7fNko8Z.js → Badge-0siYUwAA.js} +1 -1
  22. package/web-app/dist/assets/{Button-C_3eInAe.js → Button-EMKQXvZe.js} +1 -1
  23. package/web-app/dist/assets/{CockpitPage-Ir2wag2q.js → CockpitPage-Z60eDvJ9.js} +1 -1
  24. package/web-app/dist/assets/{ComparePage-qbC63b0U.js → ComparePage-D4L7nViy.js} +1 -1
  25. package/web-app/dist/assets/{ErrorBoundary-BTEqFTCi.js → ErrorBoundary--v9DugrJ.js} +1 -1
  26. package/web-app/dist/assets/{EvidenceReceiptPanel-CcICm1gj.js → EvidenceReceiptPanel-CA866XsM.js} +1 -1
  27. package/web-app/dist/assets/{GitHubIssuesPanel-CXCWYQqX.js → GitHubIssuesPanel-Bi6FJmR2.js} +1 -1
  28. package/web-app/dist/assets/{GitHubPRsPanel-DmzhZYpS.js → GitHubPRsPanel-CgSfcWOg.js} +1 -1
  29. package/web-app/dist/assets/{HomePage-BRPspBy7.js → HomePage-BxQtk9Ec.js} +2 -2
  30. package/web-app/dist/assets/{LoginPage-C1Nb7Vf9.js → LoginPage-CCSxWlFA.js} +1 -1
  31. package/web-app/dist/assets/{MagicPage-CeXc60VN.js → MagicPage-B4eYm0jJ.js} +1 -1
  32. package/web-app/dist/assets/{MetricsPage-MuDDdqNu.js → MetricsPage-Bp4Hh0p2.js} +1 -1
  33. package/web-app/dist/assets/{NotFoundPage-8iOaj85A.js → NotFoundPage-DTXk_JK4.js} +1 -1
  34. package/web-app/dist/assets/{ProjectPage-DOKcPhxr.js → ProjectPage-6S1v0GHS.js} +3 -3
  35. package/web-app/dist/assets/{ProjectsPage-CNKaqvuO.js → ProjectsPage-9foqEwG2.js} +1 -1
  36. package/web-app/dist/assets/{SettingsPage-uZT6dOT1.js → SettingsPage-CWOG_hhD.js} +1 -1
  37. package/web-app/dist/assets/{ShowcasePage-CHzrwMZ3.js → ShowcasePage-Du9LYlao.js} +1 -1
  38. package/web-app/dist/assets/{SystemSettingsPage-DMHj5Xub.js → SystemSettingsPage-BQconaDX.js} +1 -1
  39. package/web-app/dist/assets/{TeamsPage-IGY1oZ2o.js → TeamsPage-_NsqtVmC.js} +1 -1
  40. package/web-app/dist/assets/{TemplatesPage-Byxc8XyZ.js → TemplatesPage-DyTEGBpR.js} +1 -1
  41. package/web-app/dist/assets/{TerminalOutput-CRamR4sR.js → TerminalOutput-XHOYTpky.js} +1 -1
  42. package/web-app/dist/assets/{activity-DQfL1H8b.js → activity-B9KiMdEs.js} +1 -1
  43. package/web-app/dist/assets/{bell-CVksERF2.js → bell-Oe4lG6kK.js} +1 -1
  44. package/web-app/dist/assets/{bot-jSx_C-35.js → bot-D86Qmxfy.js} +1 -1
  45. package/web-app/dist/assets/{check-o3bOhMvE.js → check-BvW6_ni0.js} +1 -1
  46. package/web-app/dist/assets/{chevron-left-DBhM8Y2E.js → chevron-left-DYA62-3g.js} +1 -1
  47. package/web-app/dist/assets/{circle-alert-vCzO_mB8.js → circle-alert-CHW8ye4p.js} +1 -1
  48. package/web-app/dist/assets/{clock-Bj125ZaJ.js → clock-QbQ2XfbM.js} +1 -1
  49. package/web-app/dist/assets/{cloud-DpLr6uQJ.js → cloud-ylzrY7eL.js} +1 -1
  50. package/web-app/dist/assets/{code-xml-VuYrHYvT.js → code-xml-DdKKw2Y9.js} +1 -1
  51. package/web-app/dist/assets/{database-DBmPbwaG.js → database-BLY_OWs3.js} +1 -1
  52. package/web-app/dist/assets/{dollar-sign-DEajFwH1.js → dollar-sign-CsFIa1e2.js} +1 -1
  53. package/web-app/dist/assets/{file-code-corner-BidTyjV_.js → file-code-corner-Df4nyrCW.js} +1 -1
  54. package/web-app/dist/assets/{file-plus-DJ4dSvxw.js → file-plus-_MWEY2WY.js} +1 -1
  55. package/web-app/dist/assets/{globe-BnGEwsOq.js → globe-Dpc7QU9m.js} +1 -1
  56. package/web-app/dist/assets/{hammer-KCPviXRE.js → hammer-B-PldT0c.js} +1 -1
  57. package/web-app/dist/assets/{index-CdK6NQG3.js → index-gq0R3j-o.js} +3 -3
  58. package/web-app/dist/assets/{layers-7G4hsaDk.js → layers-BjcNwHLZ.js} +1 -1
  59. package/web-app/dist/assets/{loader-circle-CWVxvRmJ.js → loader-circle-CoTgcqkV.js} +1 -1
  60. package/web-app/dist/assets/{lock-BEH3dNM0.js → lock-JEI8O6TS.js} +1 -1
  61. package/web-app/dist/assets/{package-DvijfmPC.js → package-CXWkNS40.js} +1 -1
  62. package/web-app/dist/assets/{plus-CEwJzXGx.js → plus-CRK4U5b0.js} +1 -1
  63. package/web-app/dist/assets/{refresh-cw-Ct7rMsNS.js → refresh-cw-CrzWr4cw.js} +1 -1
  64. package/web-app/dist/assets/{rotate-ccw-CoTyya_B.js → rotate-ccw-DV7UZyUw.js} +1 -1
  65. package/web-app/dist/assets/{scroll-text-CbsOnRXr.js → scroll-text-CXEqRrXU.js} +1 -1
  66. package/web-app/dist/assets/{server-MUPVBbag.js → server-CDFfFP10.js} +1 -1
  67. package/web-app/dist/assets/{shield-alert-CWwdqRUv.js → shield-alert-B5EC_m6_.js} +1 -1
  68. package/web-app/dist/assets/{thumbs-up-CPVKKyLS.js → thumbs-up-BeLDemd2.js} +1 -1
  69. package/web-app/dist/assets/{trash-2-BqzCzljk.js → trash-2-B7kS86-0.js} +1 -1
  70. package/web-app/dist/assets/{trending-down-DAo5VuPc.js → trending-down-BGvuLayo.js} +1 -1
  71. package/web-app/dist/assets/{trending-up-BCUggli9.js → trending-up-BkPM2tiK.js} +1 -1
  72. package/web-app/dist/assets/{upload-iQijlCY2.js → upload-CXVI0GRU.js} +1 -1
  73. package/web-app/dist/assets/{usePolling-B6kojZR_.js → usePolling-CMGMVsMA.js} +1 -1
  74. package/web-app/dist/assets/{user-DR3XkyHZ.js → user-DPcXNtfj.js} +1 -1
  75. package/web-app/dist/index.html +1 -1
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: An autonomous software factory that knows what it is supposed to deliver, and proves it did. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
4
4
  ---
5
5
 
6
- # Loki Mode v10.11.0
6
+ # Loki Mode v10.11.2
7
7
 
8
8
  **Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the legacy engine, which still ships and is being removed (`loki start owner/repo#N` still routes to it; prefer `loki owner/repo#N`).
9
9
 
@@ -483,4 +483,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
483
483
 
484
484
  ---
485
485
 
486
- **v10.11.0 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v10.11.2 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 10.11.0
1
+ 10.11.2
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "10.11.0"
10
+ __version__ = "10.11.2"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -1,6 +1,6 @@
1
1
  # CLI reference
2
2
 
3
- Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v10.11.0. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v10.11.2. Do not edit by hand.
4
4
  Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
5
5
 
6
6
  | Command | Description |
@@ -2,7 +2,7 @@
2
2
 
3
3
  The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
4
4
 
5
- **Version:** v10.11.0
5
+ **Version:** v10.11.2
6
6
 
7
7
  **Engine note:** `loki "<task>"`, `loki owner/repo#N` and `loki quick` run the Loki 10 engine. `loki start` still routes to the legacy engine, which is being removed (planned work resumes 2026-10-07); prefer `loki owner/repo#N`. See [docs/v10/GUIDE.md](v10/GUIDE.md).
8
8
 
package/docs/v10/BOARD.md CHANGED
@@ -880,6 +880,6 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
880
880
  | CP-ASK | Founder 22:03Z: "we are not a vibe coding tool". The CP home box becomes Ask Loki: search, learn, compare runs, and ask anything about Loki Mode, past runs, receipts, repos and issues. Default provider claude (or any configured provider and model the user picks); the model gets all of that data (read-only tools or MCP over runs, receipts, events, METRICS, repos, gh issues and PRs); answers are async jobs the user can leave and come back to, listed in the CP. Read-only: Ask never edits a repo or starts a build | Architect slices first (10-40 slices, feature flag); packages/control-plane routes and ui, a read-only data layer, provider invocation | HIGH | the founder asks "compare my last two runs on FireLater" and gets a cited answer async in the CP; Ask cannot write to any repo | building@2026-10-04T00:06Z | Plan docs/v10/CP-ASK-PLAN.md (15 slices behind LOKI_CP_ASK=1, waves {1,4,6,8} {2,5,7} {3,9} 10 11 {12,13} 14 15); founder questions decided as FOUNDER-QUEUE row 20. Slice 1 (MCP read-only mode) seated. Founder direct directive 22:03Z. Architect plan first. | 00:33Z: slices 1 (9f454444a, plus fix-forward F1/F2 7bcffc70f, opus APPROVE), 4 (2a0ad3fc1) and 8 (d1b38e508) merged; flag off; next wave 2/5/6/7.
881
881
  | FC-21 | FC-21: (a) a limit in implement still runs verify on the existing work plus the fix rounds the budget allows, never seal directly; (b) the run cap scales with task size (sizing and Project Model), with a generous subscription default set in loki.yaml; (c) implement is told its remaining time; (d) the CLI summary, CP and PR body read receipt.verdict (one outcome) | loki-ts/src/engine10 run orchestration, the budget and sizing modules, the CLI summary, plus tests | MEDIUM | a fake implement limit is followed by verify; CLI outcome equals receipt.verdict for 4 verdicts; a large task gets a larger cap; core cap under 5000 | released@2026-10-03T23:33Z | Released in v10.10.5. FireLater#17 gate on 10.10.3 PARTIAL (steering 22:08Z). P0 tier with FC-16/FC-15. Built 21fec9deb; opus review-fc21 APPROVE on merge e80abc63a (suites 1719/0, budget 27/0, tsc rc=0 with real node_modules); merged 881f1275f. Advisories A1-A4 filed as FC-21b. Ships in one train with FC-15 and FC-16. |
882
882
  | FC-21b | FC-21 follow-ups, next train (steering 23:00Z): (1) an implement limit forces PARTIAL only while checks are red or unrun; if the fix rounds make the impacted checks green with n>0 the run earns VERIFIED (L3: what ran is the evidence, not how long implement took); (2) size the run cap from the Project Model and plan (packages and files touched) or a plan-session estimate, never from task-text character count (L0); (3) the CLI outcome must equal receipt.verdict, so a cap stop after a limit cannot print BUDGET_STOP over a PARTIAL or FAILED receipt (L7, was advisory A4); (A1) machine.ts:145 mustJump keys on reason limit only, require r.killed too; (A2) a spec-conflict resume gets the full original budget in the time note and limitS, and the note lands after FINISH_LINE; (A3) yamlRunCapS matches run_cap_s at any depth under budgets, CRLF yaml falls back silently, ls-files count off by one | loki-ts/src/engine10/machine.ts, stages/implement.ts, stages/seal.ts, output.ts, src/util/run_cap.ts, project_model sizing, plus tests | HIGH | a limit then fix-green with n>0 seals VERIFIED, a limit with a red or unrun check seals PARTIAL; the cap for a short task touching many packages exceeds the cap for one file; CLI outcome equals receipt.verdict on a cap stop after a limit; a thrown limit without a kill never reaches VERIFIED; nested per_stage run_cap_s is ignored; a resumed implement gets the remaining time | building@2026-10-03T23:59Z | Plan docs/v10/FC21B-FC22-PLAN.md (slices S1 graph+yaml_key, S5 cap sizing, S4 verdict+L7+A1+A2; S4 last). From review-fc21 22:53Z plus steering 23:00Z. HIGH because it changes the verdict rule (opus reviewer). Architect plan first for the sizing source. e10ext is 1 line under its 1500 cap. Queue after the FireLater#17 gate on 10.10.4. |
883
- | FC-16b | FC-16 follow-ups: package_suite.ts:33 detects go by first token only (make test, GOFLAGS=x go test fall to the generic path); go -json parsing; load_owner killTree process-group kill; unittest atexit forged trailer | loki-ts/src/engine10 package_suite, load_owner, test classify, plus tests | MEDIUM | make test wrapping go test classifies with runner go; a forged unittest trailer from atexit is not a pass | building@2026-10-03T23:59Z | Engineer fix-fc16b in worktree. From review-fc16-fc02-integ rounds 4-6. package_suite results never feed seal proof today. Also owed: an end-to-end test running a go Wall file through RealBaseTestRunner (the seal.test.ts case does not guard wall.ts). | 00:33Z: review-fc16b BLOCKED 1b3f594cb (forged go events, unittest multi-Ran); fix 626b46c74 in opus re-review.
884
- | FC-22 | FC-22: (a) impacted-test selection is scoped by the Project Model, touched packages plus their real dependents (manifest or import edges), never every package; (b) a selected package with no installed deps gets the Project Model's own install command run once before verify, recorded as a check with its cwd, opt-out by config | loki-ts/src/e10ext/select.ts, project_model resolve and gather, engine10 verify pre-step, plus tests | HIGH | a backend-only change in the monorepo-fc01 fixture selects no frontend test; a selected package without node_modules gets one recorded install check; no guessed command; e10ext under 1500 | building@2026-10-03T23:59Z | Plan docs/v10/FC21B-FC22-PLAN.md (S1 then S2 selection and S3 install). FireLater#17 gate on 10.10.5 (run e10-20261003T233414Z-30ca) PARTIAL only from 4 over-selected frontend tests (steering 23:47Z). HIGH because selection feeds verify proof. Architect plan first; e10ext is 1 line under its cap. Next train with FC-21b and FC-23. | 00:33Z: S1 merged 88e9e43fb (review-s1 APPROVE). S2 e9e04fe1d in opus review-s2; S3 cb6486550 in opus review-s3.
885
- | FC-23 | FC-23: the Wall writes tests matching the package's module system and test conventions from the Project Model; a lint or type error inside a Wall file is harness-owned, the Wall file is regenerated once or discarded with a NOT PROVEN note, and no fix round is spent on it | loki-ts/src/engine10/stages/wall.ts, the fix-round target filter, project_model conventions, plus tests | MEDIUM | a CommonJS package gets a Wall test with no import.meta; a forced type error in a Wall file yields regenerate-or-discard and zero fix rounds | building@2026-10-03T23:59Z | merged@2026-10-04T00:23Z | Merged c0a1c43c2 (38c782386, review-fc23 sonnet APPROVE; nits: duplicate NOT PROVEN line for a discarded file, merged comment in verify.ts).
883
+ | FC-16b | FC-16 follow-ups: package_suite.ts:33 detects go by first token only (make test, GOFLAGS=x go test fall to the generic path); go -json parsing; load_owner killTree process-group kill; unittest atexit forged trailer | loki-ts/src/engine10 package_suite, load_owner, test classify, plus tests | MEDIUM | make test wrapping go test classifies with runner go; a forged unittest trailer from atexit is not a pass | merged@2026-10-04T00:55Z | Engineer fix-fc16b in worktree. From review-fc16-fc02-integ rounds 4-6. package_suite results never feed seal proof today. Also owed: an end-to-end test running a go Wall file through RealBaseTestRunner (the seal.test.ts case does not guard wall.ts). | 00:33Z: review-fc16b BLOCKED 1b3f594cb (forged go events, unittest multi-Ran); fix 626b46c74 in opus re-review.
884
+ | FC-22 | FC-22: (a) impacted-test selection is scoped by the Project Model, touched packages plus their real dependents (manifest or import edges), never every package; (b) a selected package with no installed deps gets the Project Model's own install command run once before verify, recorded as a check with its cwd, opt-out by config | loki-ts/src/e10ext/select.ts, project_model resolve and gather, engine10 verify pre-step, plus tests | HIGH | a backend-only change in the monorepo-fc01 fixture selects no frontend test; a selected package without node_modules gets one recorded install check; no guessed command; e10ext under 1500 | merged@2026-10-04T01:08Z | Plan docs/v10/FC21B-FC22-PLAN.md (S1 then S2 selection and S3 install). FireLater#17 gate on 10.10.5 (run e10-20261003T233414Z-30ca) PARTIAL only from 4 over-selected frontend tests (steering 23:47Z). HIGH because selection feeds verify proof. Architect plan first; e10ext is 1 line under its cap. Next train with FC-21b and FC-23. | 00:33Z: S1 merged 88e9e43fb (review-s1 APPROVE). S2 e9e04fe1d in opus review-s2; S3 cb6486550 in opus review-s3. 01:08Z: S3 merged 736f4d436 (review-s3 APPROVE on d2e61c2ff, 3627/0, tsc 0; discard.ts L2 tension to CTO). S2 merged b4022e6fb (review-s2 APPROVE on a62aba7b2, 3624/0, tsc 0) behind LOKI_E10_SCOPE default off. Before the flag flips: F1 root-owned keep test with a non-relative import, F2 verify test.scoped_out event test. The install library is wired by S4.
885
+ | FC-23 | FC-23: the Wall writes tests matching the package's module system and test conventions from the Project Model; a lint or type error inside a Wall file is harness-owned, the Wall file is regenerated once or discarded with a NOT PROVEN note, and no fix round is spent on it | loki-ts/src/engine10/stages/wall.ts, the fix-round target filter, project_model conventions, plus tests | MEDIUM | a CommonJS package gets a Wall test with no import.meta; a forced type error in a Wall file yields regenerate-or-discard and zero fix rounds | building@2026-10-03T23:59Z | released@2026-10-04T00:51Z | Merged c0a1c43c2 (38c782386, review-fc23 sonnet APPROVE; nits: duplicate NOT PROVEN line for a discarded file, merged comment in verify.ts).
package/docs/v10/DEPS.md CHANGED
@@ -16,6 +16,7 @@ Inventory only. No dependency, lockfile, workflow or image was changed to produc
16
16
  | `loki-ts/tests/engine10/fixtures/testmap/package.json` | `vitest` | `^2.0.0` | `5.0.3` | MAJOR | test fixture, not a real dependency |
17
17
  | `loki-ts/tests/fixtures/monorepo-fc01/backend/package.json` | `vitest` | `^1.0.0` | `5.0.3` | MAJOR | test fixture, not a real dependency |
18
18
  | `loki-ts/tests/fixtures/project-model/firelater-17/backend/package.json` | `vitest` | `^1.0.0` | `5.0.3` | MAJOR | test fixture, not a real dependency |
19
+ | `loki-ts/tests/fixtures/monorepo-fc22/backend/package.json` | `vitest` | `^1.0.0` | `5.0.3` | MAJOR | test fixture, not a real dependency |
19
20
  | `package.json` | `@resvg/resvg-wasm` | `^2.6.2` | `2.6.2` | up-to-date | |
20
21
  | `package.json` | `@types/node` | `^25.2.0` | `26.6.4` | MAJOR | |
21
22
  | `package.json` | `jest` | `^29.7.0` | `30.5.2` | MAJOR | |
@@ -75,6 +76,8 @@ Inventory only. No dependency, lockfile, workflow or image was changed to produc
75
76
  | `web-app/package.json` | `vite` | `^6.2.0` | `8.3.2` | MAJOR | |
76
77
  | `loki-ts/tests/fixtures/monorepo-fc01/frontend/package.json` | `(none found)` | `` | `-` | n/a | test fixture; no dependencies or devDependencies declared |
77
78
  | `loki-ts/tests/fixtures/project-model/firelater-17/frontend/package.json` | `(none found)` | `` | `-` | n/a | test fixture; no dependencies or devDependencies declared |
79
+ | `loki-ts/tests/fixtures/monorepo-fc22/package.json` | `(none found)` | `` | `-` | n/a | test fixture; no dependencies or devDependencies declared |
80
+ | `loki-ts/tests/fixtures/monorepo-fc22/frontend/package.json` | `(none found)` | `` | `-` | n/a | test fixture; no dependencies or devDependencies declared |
78
81
 
79
82
  ## Python (requirements*.txt)
80
83
 
@@ -287,3 +287,20 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
287
287
  - Siblings: every harness-authored file that later runs under the user's tooling (Wall tests, presealed Wall in modernize, generated fixtures); every place a fix round can target a file the model is forbidden to edit.
288
288
  - Mechanism: the Wall reads the package's module system and test conventions from the Project Model (type, module, test runner, import style) and writes to match; a lint or type error located inside a Wall file is harness-owned: the Wall file is regenerated once or discarded with a NOT PROVEN note, and no fix round is ever spent on it.
289
289
  - Fixture: loki-ts/tests/engine10/fc23_wall_conventions.test.ts (a CommonJS package: the Wall brief carries the convention and an import.meta Wall file is discarded with a NOT PROVEN note; a Wall-only tsc error yields not_run, owner harness, zero grouped failures; control: a user-code type error still fails and gets a fix round). Readers: loki-ts/src/project_model/conventions.ts, loki-ts/src/util/wall_owned.ts.
290
+
291
+ ## FC-24 Agent-written code in the runner's process can forge a pass (summary and exit code)
292
+ - User saw: nothing yet (found in the FC-16b round 2 review, 2026-10-04). Reproduced at f28b15d78 with pytest on python 3.14.6: a conftest.py `pytest_sessionfinish` hook writes "===== 5 passed in 0.01s =====" and calls `os._exit(0)`; the only test is `assert False`; classifyCheck returns {"result":"pass","n":5}. The Go form (init or TestMain prints RUN and PASS for a failing test, then os.Exit(0)) defeated every name check in FC-16b.
293
+ - Law: L2 (fail closed on trust), L3 (what ran is the evidence); Seal accuracy.
294
+ - Siblings (code-path reasoning, only pytest and go reproduced): unittest (atexit or os._exit before the real trailer), jest and vitest (config, globalSetup, setupFiles patch stdout or call process.exit(0)), bun test (preload), node --test (--import or --require hooks), cargo (the test binary is the code), npm test (an arbitrary script). A harness-owned reporter or result file (pytest plugin, jest reporter, JUnit XML) is written inside the same process, so it is forgeable too.
295
+ - Mechanism: none closes it per runner. The runner's summary and exit code come from a process that runs agent-written code. Decision: a test pass is recorded as runner-reported, not tamper-proof (a known L2 limit). Go exit 0 is never a pass (FC-16b, not_run, owner harness, honest L5 reason) because Go has no parseable summary that survives the forgery at lower cost. Candidate later mechanisms: harness re-runs each named Wall test in a fresh process with harness-controlled entry and flags (setup code still runs), and the receipt states the limit in its evidence text.
296
+ - Fixture: the FC-16b forgery fixtures (go init/TestMain early exit asserts not_run); a pytest conftest forgery fixture that documents the limit is a follow-up slice, not a fix.
297
+
298
+ ## FC-25 A git call from the token-holding supervisor runs a plant in the agent's repo config (moat P9 red since v10.10.4)
299
+ - User saw: nothing visible; the moat job of Tests has failed on main since 4fa4e8015 (runs 37160286598 through 37165257952, all "REGRESSION P9.injection-cannot-reach-token": "a plant in the agent's repo config ran holding the real GitHub token: fsmonitor"). 65ce2060b was the last green. The range touched no bash, only loki-ts.
300
+ - Law: L2 (fail closed on trust); moat P9 Rule of Two.
301
+ - Suspect: FC-21 (881f1275f) added util/run_cap.ts resolveRunCapS, called at engine10/supervisor.ts:330 before the worker spawns. It runs `git ls-files` in repoDir with env process.env, which still holds the token. Local probe (git, 2026-10-04): a repo with core.fsmonitor set to a recorder script fires it on plain `git ls-files` with GH_TOKEN in env; `git diff --name-only` and `git status --porcelain` did not fire in that probe.
302
+ - Siblings: every git call made by a process that holds the token (supervisor, CLI before withholding) with cwd in the agent's repo: run_cap.ts, runner/load_owner.ts changedSince and worktree add (when called outside the worker), and any later addition. supervisor.ts:206 and e10ext/commit_filter.ts already pass core.fsmonitor=false and core.hooksPath=/dev/null.
303
+ - Mechanism: one shared helper for git in the agent's repo from a trusted process: hardened config (core.fsmonitor=false, core.hooksPath=/dev/null, and no credential helper) plus a token-free env; plus a static guard that fails on a git spawn in loki-ts/src that does not use it, or is not listed with a reason.
304
+ - Fixture: a bun test that plants core.fsmonitor and a canary GH_TOKEN, then calls resolveRunCapS and asserts the plant never ran; and the moat case P9.injection-cannot-reach-token passes locally (`bash tests/moat/run.sh`, P9 line).
305
+ - FC-25b (sibling, found in the opus review, 2026-10-04T01:02Z): the hooks, fsmonitor and sshCommand flag set alone still lets three plant classes run holding the canary token (git 2.55.0). (1) filter.<drv>.clean or process, declared in .gitattributes or .git/info/attributes, fires on status --porcelain, diff --name-only HEAD, add and commit. (2) diff.<drv>.textconv fires on log -p and on a diff with patch output. (3) gpg.program with commit.gpgSign=true fires on commit. A scrubbed env does not close the hole, because a running plant can still read the gh hosts file or the keyring. Execution itself has to be stopped. Mechanism: the same safeGit helper blanks each configured filter and textconv key, and sets diff.external=, commit.gpgSign=false, core.attributesFile=/dev/null and GIT_ATTR_SOURCE=<empty tree>. Fixture: fc25_safe_git.test.ts adds one plant per class.
306
+ - FC-25c (follow-ups from the opus review of d82aec15a, 2026-10-04T01:15Z; not reachable with a real token today). (a) The allowToken path still honors repo-local core.sshCommand, remote.*.uploadpack and receivepack, and a repo-scope credential.helper; the canary fired on an ssh origin and on a local-path uploadpack. Its only caller is the base_guard fetch, reached from intake in the worker with the sentinel env, and supervisor.ts baseLine passes fetchRemote=false. Fix: harden allowToken itself, or add a guard that pins it to that single worker-side caller. (b) The raw-spawn guard misses an indirect argv (`const GIT = "git"`) and does not scan packages/control-plane. ship_hook.ts reaches control-plane shipper/discover.ts gitOrigin (`git config --get`, real-token env) from the supervisor. Fix: convert it to safeGit and widen the guard. (c) preflight's safeGitArgv path does not set GIT_CONFIG_NOSYSTEM. Low risk, because system config is root-owned.
@@ -2237,3 +2237,9 @@ The swarm is stopped: .loki/V10-STOP exists, the loop has no wake-ups, and the c
2237
2237
  - FC-23 (Wall module system): first full bun test failed 3 (two L0 guards, one brief test); fixed by key-based reading. Commit and gate evidence requested.
2238
2238
  - Building: FC-16b, S1 (Project Model graph). Main CI on 04c8915a9 pending; npm latest=10.10.5.
2239
2239
  - Usage: week 83 percent, session 28 percent at 00:02Z. Stop new seats at 90 percent (D87).
2240
+
2241
+ ## 2026-10-04T00:53Z (CoS)
2242
+ - v10.11.0 released: release run 37165257915 success, promote.yml success, `npm view loki-mode dist-tags` = { latest: '10.11.0', next: '10.11.0' }. Steering smoke PASS 00:50Z (VERIFIED in 39s, $0.10). FC-23 released (549a14850).
2243
+ - P0 FC-25: the Tests moat job has been red on main since 4fa4e8015 (runs 37160286598 through 37165257952, REGRESSION P9.injection-cannot-reach-token: fsmonitor plant ran holding the canary token). Last green is 65ce2060b = v10.10.3. Suspect: run_cap.ts `git ls-files` from the token-holding supervisor (supervisor.ts:330); a local probe fired an fsmonitor plant on plain `git ls-files`. Row a79dc2f2a. Engineer fix-fc25-p9 (sonnet) is building safeGit() plus a sweep plus a guard; opus review next; 10.11.1 needs P9 green on the release commit (not waived by D88). Rollback is not via promote.yml (it refuses to go backwards); a manual dist-tag move needs the founder's direct word.
2244
+ - FC-24 (dc4671ee8): in-process runner forgery (pytest conftest repro at f28b15d78) is a known L2 limit; a pass is runner-reported.
2245
+ - In review: FC-16b round 3 8859584c7, FC-22 S2 a62aba7b2, FC-22 S3 d2e61c2ff (all opus). Building: FC-22 S5. Seats are frozen except P0 and FireLater#17 (week 84 percent at 00:43Z).