loki-mode 11.17.78 → 11.17.80

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 (73) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +2 -2
  3. package/VERSION +1 -1
  4. package/dashboard/__init__.py +1 -1
  5. package/docs/CLI-REFERENCE.md +1 -1
  6. package/docs/INSTALLATION.md +1 -1
  7. package/docs/v10/BOARD.md +5 -0
  8. package/docs/v10/ENGINE.md +2 -2
  9. package/docs/v10/FAILURE-CLASSES.md +20 -0
  10. package/docs/v10/PROGRESS.md +6 -0
  11. package/loki-ts/dist/loki.js +1079 -1077
  12. package/mcp/__init__.py +1 -1
  13. package/package.json +2 -2
  14. package/packages/control-plane/dist/ask-tools-server.js +1 -1
  15. package/packages/control-plane/dist/server.js +9 -7
  16. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  17. package/web-app/dist/assets/{AdminPage-BoslZWzc.js → AdminPage-QLwIrSS3.js} +1 -1
  18. package/web-app/dist/assets/{Avatar-C-ZAtIND.js → Avatar-BaPhnX1d.js} +1 -1
  19. package/web-app/dist/assets/{Badge-Bw2EZcHr.js → Badge-BirVrAZz.js} +1 -1
  20. package/web-app/dist/assets/{Button-DGQiy07x.js → Button-DEHgJIsP.js} +1 -1
  21. package/web-app/dist/assets/{CockpitPage-BdAL44JO.js → CockpitPage-DQaTM4ph.js} +1 -1
  22. package/web-app/dist/assets/{ComparePage-uMtMNV8D.js → ComparePage-AZl6Oa2W.js} +1 -1
  23. package/web-app/dist/assets/{ErrorBoundary-FwszL_Fl.js → ErrorBoundary-BRjeBZwp.js} +1 -1
  24. package/web-app/dist/assets/{EvidenceReceiptPanel-Cqq_xOuO.js → EvidenceReceiptPanel-D_FovNPq.js} +1 -1
  25. package/web-app/dist/assets/{GitHubIssuesPanel-D-zQXrEN.js → GitHubIssuesPanel-CYAnJi34.js} +1 -1
  26. package/web-app/dist/assets/{GitHubPRsPanel-BnoHXaxv.js → GitHubPRsPanel-Df6RK68Y.js} +1 -1
  27. package/web-app/dist/assets/{HomePage-obvdqajI.js → HomePage-CT3GRbhF.js} +2 -2
  28. package/web-app/dist/assets/{LoginPage-B7yyAQab.js → LoginPage-wY5MUtwp.js} +1 -1
  29. package/web-app/dist/assets/{MagicPage-DwCFqTs1.js → MagicPage-CsjLM-vm.js} +1 -1
  30. package/web-app/dist/assets/{MetricsPage-BjZEONtI.js → MetricsPage-C79mzAA0.js} +1 -1
  31. package/web-app/dist/assets/{NotFoundPage-DBMxZATj.js → NotFoundPage-dENjpy_n.js} +1 -1
  32. package/web-app/dist/assets/{ProjectPage-DF_424uN.js → ProjectPage-lgkjfAkG.js} +3 -3
  33. package/web-app/dist/assets/{ProjectsPage-BApRzUl5.js → ProjectsPage-Du5s4dtQ.js} +1 -1
  34. package/web-app/dist/assets/{SettingsPage-CxdcwJCS.js → SettingsPage-umA0u9M2.js} +1 -1
  35. package/web-app/dist/assets/{ShowcasePage-CihetE6X.js → ShowcasePage-DHkvaHk1.js} +1 -1
  36. package/web-app/dist/assets/{SystemSettingsPage-DVsbk0uw.js → SystemSettingsPage-DbHn6xx8.js} +1 -1
  37. package/web-app/dist/assets/{TeamsPage-C--jIaSk.js → TeamsPage-CPjGhOZ5.js} +1 -1
  38. package/web-app/dist/assets/{TemplatesPage-BcQr2cLg.js → TemplatesPage-Aw1nl4kd.js} +1 -1
  39. package/web-app/dist/assets/{TerminalOutput-Cg1V5ewd.js → TerminalOutput--FUzyhJz.js} +1 -1
  40. package/web-app/dist/assets/{activity-D5ctzUmO.js → activity-KG8JL2eg.js} +1 -1
  41. package/web-app/dist/assets/{bell-C4kbb9oa.js → bell-BCrzsBqf.js} +1 -1
  42. package/web-app/dist/assets/{bot-QCjbOF4h.js → bot-DERf6xzU.js} +1 -1
  43. package/web-app/dist/assets/{check-ByrUB3RX.js → check-BH2wLEVl.js} +1 -1
  44. package/web-app/dist/assets/{chevron-left-D9gXxjmD.js → chevron-left-BZnpPXE2.js} +1 -1
  45. package/web-app/dist/assets/{circle-alert-BqVllZ74.js → circle-alert-CRzysuwj.js} +1 -1
  46. package/web-app/dist/assets/{clock-CodYVd5v.js → clock-B9XhNuqT.js} +1 -1
  47. package/web-app/dist/assets/{cloud-Dm_KWtXC.js → cloud-DVse6sIy.js} +1 -1
  48. package/web-app/dist/assets/{code-xml-DVV0nL6T.js → code-xml-dvWDQala.js} +1 -1
  49. package/web-app/dist/assets/{database-C7t0ns_S.js → database-Bp29eKc8.js} +1 -1
  50. package/web-app/dist/assets/{dollar-sign-D12EmKsn.js → dollar-sign-CNzaApYb.js} +1 -1
  51. package/web-app/dist/assets/{file-code-corner-BOS_92Fx.js → file-code-corner-CrVQy-6B.js} +1 -1
  52. package/web-app/dist/assets/{file-plus-BEsk0_85.js → file-plus-BgLYIajH.js} +1 -1
  53. package/web-app/dist/assets/{globe-DRtqG2el.js → globe-DtqHis8S.js} +1 -1
  54. package/web-app/dist/assets/{hammer-DrwFog9b.js → hammer-PkI6HORs.js} +1 -1
  55. package/web-app/dist/assets/{index-Cd4_IB6U.js → index-3CbER4ay.js} +3 -3
  56. package/web-app/dist/assets/{layers-BKdVdB-h.js → layers-B_u-EkUF.js} +1 -1
  57. package/web-app/dist/assets/{loader-circle-DejbchzI.js → loader-circle-CaO4JzZb.js} +1 -1
  58. package/web-app/dist/assets/{lock-q2lEJks5.js → lock-C5ZgbS-N.js} +1 -1
  59. package/web-app/dist/assets/{package-Nx6oFI3v.js → package-ERERbCnp.js} +1 -1
  60. package/web-app/dist/assets/{plus-ClMnEwsh.js → plus-DVFelvdb.js} +1 -1
  61. package/web-app/dist/assets/{refresh-cw-Dhd7WlDl.js → refresh-cw-D_G4HUju.js} +1 -1
  62. package/web-app/dist/assets/{rotate-ccw-Sbqbwt8s.js → rotate-ccw-Q-tv09ir.js} +1 -1
  63. package/web-app/dist/assets/{scroll-text-BUel3Fg_.js → scroll-text-BS1PxrfX.js} +1 -1
  64. package/web-app/dist/assets/{server-DSyMhSob.js → server-BwW_gZyH.js} +1 -1
  65. package/web-app/dist/assets/{shield-alert-uW0ymd5I.js → shield-alert-CkPbH62u.js} +1 -1
  66. package/web-app/dist/assets/{thumbs-up-Bkro9biq.js → thumbs-up-DagpLl8P.js} +1 -1
  67. package/web-app/dist/assets/{trash-2-SGTUL1j8.js → trash-2-CGQG--Dj.js} +1 -1
  68. package/web-app/dist/assets/{trending-down-DXJe8zLL.js → trending-down-Bu5yT_In.js} +1 -1
  69. package/web-app/dist/assets/{trending-up-iJSvZDuD.js → trending-up-vnW7t9v-.js} +1 -1
  70. package/web-app/dist/assets/{upload-P3AtZ2LV.js → upload-CfoW0QuP.js} +1 -1
  71. package/web-app/dist/assets/{usePolling-DYqHgENp.js → usePolling-BLG1x5NL.js} +1 -1
  72. package/web-app/dist/assets/{user-CnOJ9Vm5.js → user-DgoOEV4q.js} +1 -1
  73. package/web-app/dist/index.html +1 -1
package/README.md CHANGED
@@ -56,7 +56,7 @@ loki chat # interactive alternative: Plan and
56
56
 
57
57
  Every run starts from a delivery contract derived from your task, writes checks from the task alone before touching code, implements, verifies, and ends in exactly one outcome: VERIFIED, ALREADY_SATISFIED, FAILED, BUDGET_STOP, BLOCKED or STALLED ([exit codes](docs/exit-codes.md)). If the contract cannot be satisfied as written, the run stops and asks one question instead of guessing.
58
58
 
59
- - **A pull request** written for a quick review: what the issue asked, what changed, how it was tested, and what was NOT PROVEN. A run that did not verify opens a draft.
59
+ - **A pull request** written for a quick review: what the issue asked, what changed, how it was tested, and what was NOT PROVEN. Only a VERIFIED run pushes its branch and opens a PR; any other outcome keeps the branch local and prints where it is.
60
60
  - **A signed receipt** at `.loki/runs/<run-id>/receipt.json`, signed with a local Ed25519 key created on first run.
61
61
  - **A specialist review** when the review council runs: it selects reviewers from a specialist pool (`agents/types.json`, scored by `run.sh:FOCUS_KEYWORDS`) by matching the changed files and diff against each reviewer's keywords.
62
62
 
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 v11.17.78
6
+ # Loki Mode v11.17.80
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 previous bash loop. PRD-file starts (`loki start ./prd.md`) and the opencode provider still run on it until FC38-SWEEP ports them; the legacy-engine command and the LOKI_ENGINE switch remain removed. Prefer `loki owner/repo#N` for issues.
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
- **v11.17.78 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v11.17.80 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.17.78
1
+ 11.17.80
@@ -7,6 +7,6 @@ Modules:
7
7
  control: Session control helpers (status, atomic writes, origin check)
8
8
  """
9
9
 
10
- __version__ = "11.17.78"
10
+ __version__ = "11.17.80"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -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 v11.17.78. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.80. 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
  Loki Mode, by [Autonomi](https://www.autonomi.dev/), turns a spec or an issue into a verified pull request with a receipt you can check. This page covers installing it, a first run, and the options around it.
4
4
 
5
- **Version:** v11.17.78
5
+ **Version:** v11.17.80
6
6
 
7
7
  **Engine note:** `loki start` is the primary command. `loki start`, `loki "<task>"`, `loki owner/repo#N` and `loki quick` all run the Loki 10 engine, whatever the flag order or input form (PRD file, issue ref, task or one-word brief). The previous loop runs only on `--engine legacy`, `LOKI_ENGINE=legacy`, or for one call when a flag Loki 10 cannot honor is present. See the [user guide](v10/GUIDE.md) and the [5-minute quickstart](QUICKSTART.md).
8
8
 
package/docs/v10/BOARD.md CHANGED
@@ -1396,3 +1396,8 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
1396
1396
  | TEN-GATES-31 | fix: policyGate with LOKI_POLICY_REQUIRE_NODE=0 and no node says policy was NOT evaluated in the allow reason so prGate output shows it | loki-ts/src/util/run_outputs.ts, loki-ts/tests/engine10/policy_gate.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/policy_gate.test.ts -t "policy not evaluated" fails; green: passes | released v11.17.55 | Gap: run_outputs.ts:449 returns allow when the env opt-out is set and node is missing; the reason is easy to miss. Chain GATES-31, 32 (same file); serialize after none |
1397
1397
  | TEN-GATES-32 | fix: policyGate reports a check.js timeout as a timeout, not as node being unavailable | loki-ts/src/util/run_outputs.ts, loki-ts/tests/engine10/policy_gate.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/policy_gate.test.ts -t "policy timeout reason" fails; green: passes | released v11.17.55 | Gap: run_outputs.ts:452-453 spawnSync timeout 30000 sets r.error and the deny reason says node is unavailable. Chain GATES-31, 32; serialize after GATES-31 |
1398
1398
  | TEN-ADOPTION-36 | fix: loki issues run --limit and --parallel accept only plain decimal digits (reject 1e1 and 0x10) | loki-ts/src/commands/issues_run.ts, loki-ts/tests/commands/issues_run.test.ts | LOW | red: cd loki-ts && bun test tests/commands/issues_run.test.ts -t "strict int flags" fails; green: passes | released v11.17.55 | Gap: issues_run.ts:96 Number(val()) accepts 1e1 and 0x10 as integers. Serialize after TEN-STABILITY-54 (same file) |
1399
+ | TEN-QUALITY-41 | fix: outOfRepoTarget flags a string literal such as "/home/user/project/.git" that holds no home-derived value; a literal absolute path with no homedir, HOME or expanduser value must not flag | loki-ts/src/project_model/conventions.ts, loki-ts/tests/engine10/fc23_wall_conventions.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/fc23_wall_conventions.test.ts -t "literal path not flagged" fails; green: passes | ready@2026-10-19T07:00Z | Budget LOW 15m. Gap: conventions.ts:84 the home regex matches any quoted /(Users\|home\|root)/ literal, so a fixture path with no runtime home value is rejected and re-asked. Keep real homedir()/$HOME/~/ joins flagging. Generic, engine10 TypeScript. Chain QUALITY-41, 42 (same file); serialize after none |
1400
+ | TEN-QUALITY-42 | fix: outOfRepoTarget treats a file that assigns HOME anywhere as sandboxed and never flags it; narrow the exemption to lines after the assignment, or to a sandboxed (tmpdir-derived) HOME only | loki-ts/src/project_model/conventions.ts, loki-ts/tests/engine10/fc23_wall_conventions.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/fc23_wall_conventions.test.ts -t "home exemption scoped" fails; green: passes | ready@2026-10-19T07:00Z | Budget LOW 15m. Gap: conventions.ts:78 returns null for the whole file on any HOME assignment, so homedir() joined into an import before the assignment passes. Chain QUALITY-41, 42; serialize after QUALITY-41 |
1401
+ | TEN-COST-63 | fix: the Wall rewrite (re-ask) session for out-of-repo files runs without checking the remaining run budget, so a run at its cap still spends a model session; skip the re-ask when the budget is spent and discard the rejected files | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/fc23_wall_conventions.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/fc23_wall_conventions.test.ts -t "re-ask respects budget" fails; green: passes | ready@2026-10-19T07:00Z | Budget MEDIUM 30m. Gap: wall.ts:162 ctx.sessions.run for the -oor rewrite is gated only on bad1.length and signal.aborted; reuse the existing budget check other stages use rather than a new helper. Chain COST-63, QUALITY-43 (same file); serialize after none |
1402
+ | TEN-QUALITY-43 | enhancement: inside wallAuthor a local model variable shadows the outer one; rename it, no behaviour change | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall.test.ts | LOW | red: none (pure rename); green: cd loki-ts && bun test tests/engine10/wall.test.ts tests/engine10/fc23_wall_conventions.test.ts passes and bunx tsc --noEmit is clean | ready@2026-10-19T07:00Z | Budget LOW 15m. Gap: wall.ts:146 const model shadows the outer model; the rename must leave emitted data.model and the WallAuthored.model field unchanged. Chain COST-63, QUALITY-43; serialize after COST-63 |
1403
+ | TEN-QUALITY-44 | fix: the implement-stage bug-repro test is not covered by the outOfRepoTarget check, so a repro test that imports the code under test from the user home goes unflagged; apply the same check and re-ask path (sibling of FC-WALL-OUT-OF-REPO-TARGET) | loki-ts/src/engine10/stages/implement.ts, loki-ts/tests/engine10/implement.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/implement.test.ts -t "repro test out of repo" fails; green: passes | ready@2026-10-19T07:00Z | Budget MEDIUM 30m. Gap: implement.ts:38 REPRO_LINE asks for a new reproducing test but nothing checks its target; reuse outOfRepoTarget from project_model/conventions.ts, add the row to docs/v10/FAILURE-CLASSES.md sibling sweep. Serialize after QUALITY-41 and 42 |
@@ -171,7 +171,7 @@ After the session:
171
171
  - any modified or deleted pre-existing test file is restored from base and listed in `tests_reverted`;
172
172
  - any Wall file whose sha256 no longer matches is restored from `<runDir>/wall/` and listed.
173
173
 
174
- A spec conflict leads to Seal with verdict SPEC_CONFLICT: a DRAFT PR if the diff is non-empty, otherwise no PR.
174
+ A spec conflict leads to Seal with verdict SPEC_CONFLICT: no PR and no push: the branch stays local and its location is printed.
175
175
 
176
176
  **Fast verify:**
177
177
  - Changed files: impacted tests from the test map, plus changed test files, plus Wall tests, plus lint/typecheck of the changed files only (eslint/tsc for TS/JS, ruff or flake8 for Python, `bash -n`/shellcheck for shell).
@@ -199,7 +199,7 @@ A spec conflict leads to Seal with verdict SPEC_CONFLICT: a DRAFT PR if the diff
199
199
  It then appends a PR comment and a signed receipt addendum, and sets `loki/deep-verify` to success or failure. A refused or unavailable check is NOT PROVEN, never red.
200
200
 
201
201
  **Hard cap:**
202
- - At 14:00 elapsed, the machine aborts the running stage (process-group kill), commits whatever diff exists, seals with verdict PARTIAL and the missing checks as NOT PROVEN, and opens a DRAFT PR.
202
+ - At 14:00 elapsed, the machine aborts the running stage (process-group kill), commits whatever diff exists, seals with verdict PARTIAL and the missing checks as NOT PROVEN, and keeps the branch local (only VERIFIED pushes).
203
203
  - The cap is 900s by default. `LOKI_E10_CAP_S` exists for tests only.
204
204
  - `--deep` or auto-escalation raises it to 45 minutes and logs an `escalated` event (section 13).
205
205
 
@@ -1230,3 +1230,23 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
1230
1230
  - Siblings swept: Wall author (fixed); implement brief repro-test line (implementer-written tests are not statically checked; with an in-repo Wall the implementer has no reason to touch runner config); fix and plan stages write no tests.
1231
1231
  - Mechanism: one `outOfRepoTarget` detector in project_model/conventions.ts (homedir, Path.home, $HOME, ~/, absolute /Users|/home|/root; comments ignored); wallAuthor re-asks once with the precise reason, a file still failing is discarded (sealed copy only, listed in `discarded`); one sentence in the cache-stable Wall brief.
1232
1232
  - Fixture: loki-ts/tests/engine10/fc23_wall_conventions.test.ts describe "FC-WALL-OUT-OF-REPO-TARGET" (rejected, re-asked, discarded; repo-relative and tmpdir pass). Red before the fix, green after.
1233
+ ## FC-OUT-OF-REPO A request whose change has no target in the repository ran every stage before ending BLOCKED (OUT-OF-REPO-INTAKE)
1234
+ - User-visible vs raw: user-visible. `loki start anthropics/claude-code#21527` (a feature whose code lives in a hosted Slack/web service) on 11.17.60 to 11.17.74 spent plan, wall, implement and fix before ending BLOCKED. Raw: the plan session had nothing to name, but plan-scope.json with zero files was read as "no scope", so the flow continued into implement.
1235
+ - Law: cheap checks run before expensive stages; a run that cannot succeed says so at the first stage that knows; BLOCKED names the question, never a bare failure.
1236
+ - Siblings swept: intake already_satisfied (short-circuits to the tail, unchanged), intent_declined (returns before wall/implement), a missing or malformed plan-scope.json (unknown, deliberately NOT out-of-repo), a skipped plan on small tasks (no signal, implementer still decides).
1237
+ - Mechanism: one reader `planOutOfRepo` (util/run_cap.ts) fires only when plan-scope.json parses and names zero files, taking the planner's `out_of_repo` sentence as the reason; plan.ts records `out_of_repo` plus `spec_conflict_reason: "out-of-repo: <reason>"`; machine.ts seeds implement.exit = spec_conflict and jumps to the tail, so seal, outcomeOf, EXIT (4), the BLOCKED question comment and the receipt reuse the existing spec-conflict path (no new outcome). conflictReasonOf also reads the plan stage.
1238
+ - Fixture: loki-ts/tests/engine10/plan.test.ts "FC-OUT-OF-REPO" (named files never fire; missing or malformed scope never fires) and loki-ts/tests/engine10/machine.test.ts "FC-OUT-OF-REPO machine" (implement, verify and fix do not run; positive control runs them). Red before the fix, green after.
1239
+ ## FC-NO-PUSH-UNVERIFIED A run that did not end verified pushed its loki/e10-* branch to the user's remote (NO-PUSH-UNVERIFIED)
1240
+ - User-visible vs raw: user-visible. BLOCKED runs of anthropics/claude-code#21527 pushed loki/e10-* branches and opened draft PRs on the user's fork asklokesh/claude-code. Raw: supervisor.ts gated the pr step on `verdict !== "ALREADY_SATISFIED" && hasDiff`, so FAILED, PARTIAL and SPEC_CONFLICT with any diff left the machine.
1241
+ - Law: only a verified success leaves the machine; unverified work stays local as evidence.
1242
+ - Siblings swept: the supervisor pr step and modernize/ship.ts shipWave (which pushed draft PRs for unverified waves; now refuses unless the wave verified and every unit is PROVEN) are the callers of the push scripts (engine10-push.sh, engine10-push-gitlab.sh); ALREADY_SATISFIED already opened none; the E-67 backstop commit still lands locally on a killed worker; cancelled and tampered runs already skip it.
1243
+ - Mechanism: one gate in supervisor.ts, `verdict === "VERIFIED"`; every other verdict with a diff prints "branch loki/<runId> stays local (not pushed)" with the repo path. Supersedes the A-110 and E-67 draft-PR-on-unverified behaviour (tests updated in the same change).
1244
+ - Fixture: loki-ts/tests/engine10/supervisor_backstop.test.ts "FC-NO-PUSH-UNVERIFIED" (SPEC_CONFLICT, PARTIAL, FAILED call pr 0 times; VERIFIED once) and loki-ts/tests/engine10/modernize/ship.test.ts "FC-NO-PUSH-UNVERIFIED" (unverified wave pushes 0 times). Red before the fix, green after.
1245
+
1246
+ ## FC-LINT-PRE-RED: a lint check excused as failing on base still named the run's failure
1247
+ - User-visible vs raw: user-visible. A run whose only failing check was a lint check also failing on base (cc#81826, shellcheck SC2181 on both) printed `Reason: lint:shellcheck failed` and listed it under Failures in HANDOFF.md, so the founder read a base-relative pass as a blocker.
1248
+ - Law: a check verify excused as pre-existing (`pre_red_checks`, TEN-QUALITY-03) is never the stated reason, never a Failure; it is shown separately as already failing on base.
1249
+ - Cause (measured from .loki/runs events): verify judged lint base-relative correctly in all three rounds (`pre_red_checks: ["lint:shellcheck"]`, fix briefs excluded it, seal skipped it); only `reasonOf` (engine10/output.ts) and the handoff renderer (util/run_summary.ts) re-read raw `checks[].result` and ignored `pre_red_checks`.
1250
+ - Siblings swept: seal verdict (already honours pre_red_checks), failures_grouped and fix brief (already exclude), reasonOf and handoff Failures (fixed); commands/export_sarif.ts receiptFindings (reads pre_red_checks from the run events), util/failure_memory.ts failedCheckNames (engine10/supervisor.ts now passes verify's pre_red_checks), e10ext/select.ts lintFails via AttemptCandidate.preRedChecks (all fixed through the one `isBlockingFail` in util/failure_memory.ts). features/attempts.ts now fills `preRedChecks` through the optional `AttemptOps.preRed(i)`, but stays inert until `score()`'s caller supplies preRed (the real treeswapOps runs no lint). Open: supervisor.ts must pass verify `pre_red_checks` as failedCheckNames' second argument. Other linters share the same path (ruff, eslint via excuseLint; unparseable output stays fail-closed with the existing reason).
1251
+ - Mechanism: `pre_red_checks` read in `reasonOf`; `composeHandoff` tags failing checks in it `pre_red`, `renderHandoff` moves them to "Already failing on base".
1252
+ - Fixture: tests/engine10/output.test.ts and tests/util/run_summary.test.ts, "FC-LINT-PRE-RED". Red before the fix, green after.
@@ -2608,3 +2608,9 @@ v11.17.21 published (Release success on 462fbc40a; npm latest 11.17.21, next 11.
2608
2608
 
2609
2609
  ## 2026-10-19T06:50Z (CoS) v11.17.78
2610
2610
  - 11.17.78: main CI guard fixes (L0 project_model names, never_below_raw AST matcher, M1 anchor, modernize producer scan). Engineer chain 21187a2c7..9e17b7f75; HIGH review BLOCK x4 then APPROVE (134/0, 23 parent shapes still caught + 7 new, shipped source zero violations).
2611
+
2612
+ ## 2026-10-19T07:19Z (CoS) v11.17.79
2613
+ - 11.17.79: FC-OUT-OF-REPO + FC-NO-PUSH-UNVERIFIED (#21527 bugs b/c; HIGH BLOCK x2 then APPROVE) and FC-LINT-PRE-RED (TL BLOCK x2 then APPROVE, mutation 16/1 -> 88/0). Budget fold f5a1685b5: 383 pass 0 fail.
2614
+
2615
+ ## 2026-10-19T08:06Z (CoS) v11.17.80
2616
+ - 11.17.80: fix-forward for Tests run 39215298360 on c6db3c019 (D50-F4 backstop expectation, plan brief golden; 32 pass 0 fail) plus supervisor pre_red_checks wiring 411fdaf63 (red 106/1 -> green 107/0; 172 pass 0 fail incl. budget). P9 moat fixture ccccfc82f under HIGH review, ships next.