loki-mode 11.17.71 → 11.17.73

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 (79) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/dashboard/__init__.py +1 -1
  4. package/dashboard/api_start.py +1 -1
  5. package/docs/CLI-REFERENCE.md +1 -1
  6. package/docs/INSTALLATION.md +1 -1
  7. package/docs/environment-variables.md +1 -1
  8. package/docs/v10/DECISIONS.md +3 -2
  9. package/docs/v10/FAILURE-CLASSES.md +8 -0
  10. package/docs/v10/PROGRESS.md +6 -0
  11. package/loki-ts/dist/loki.js +1094 -1094
  12. package/mcp/__init__.py +1 -1
  13. package/mcp/tests/test_v10_tools.py +12 -0
  14. package/mcp/v10_tools.py +1 -1
  15. package/package.json +2 -2
  16. package/packages/control-plane/dist/ask-tools-server.js +6 -2
  17. package/packages/control-plane/dist/server.js +8 -3
  18. package/packages/control-plane/src/server/answer.ts +2 -1
  19. package/packages/control-plane/src/server/runs.ts +2 -2
  20. package/packages/control-plane/ui/dist/assets/{index-Dww-8G06.js → index-BJq1KhqJ.js} +1 -1
  21. package/packages/control-plane/ui/dist/index.html +1 -1
  22. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  23. package/web-app/dist/assets/{AdminPage-D9E5rMDa.js → AdminPage-CAw3IFCu.js} +1 -1
  24. package/web-app/dist/assets/{Avatar-2HIimGbJ.js → Avatar-D4-XntzA.js} +1 -1
  25. package/web-app/dist/assets/{Badge-X1pm0Suj.js → Badge-C1fHRqJG.js} +1 -1
  26. package/web-app/dist/assets/{Button-D3JPQKEY.js → Button-CzD_JfV1.js} +1 -1
  27. package/web-app/dist/assets/{CockpitPage-yg3fHf13.js → CockpitPage-biH-pfqC.js} +1 -1
  28. package/web-app/dist/assets/{ComparePage-CZcaSHhK.js → ComparePage-xMMPe6lI.js} +1 -1
  29. package/web-app/dist/assets/{ErrorBoundary-AbJVpUqd.js → ErrorBoundary-LISxmNUO.js} +1 -1
  30. package/web-app/dist/assets/{EvidenceReceiptPanel-c1YRf1qj.js → EvidenceReceiptPanel-BJ70o_uy.js} +1 -1
  31. package/web-app/dist/assets/{GitHubIssuesPanel-0wLSsoUy.js → GitHubIssuesPanel-D5ApCUhD.js} +1 -1
  32. package/web-app/dist/assets/{GitHubPRsPanel-BhY2M87Z.js → GitHubPRsPanel-BtTNo3-s.js} +1 -1
  33. package/web-app/dist/assets/{HomePage-BGGhvITG.js → HomePage-C9NPfbCn.js} +2 -2
  34. package/web-app/dist/assets/{LoginPage-SWb9qWEA.js → LoginPage-Dfei1DgX.js} +1 -1
  35. package/web-app/dist/assets/{MagicPage-M8MSb7l_.js → MagicPage-KUCdTZ47.js} +1 -1
  36. package/web-app/dist/assets/{MetricsPage-D_hgyPT5.js → MetricsPage-CMwW5kgY.js} +1 -1
  37. package/web-app/dist/assets/{NotFoundPage-DACxcv9V.js → NotFoundPage-DyK_dXex.js} +1 -1
  38. package/web-app/dist/assets/{ProjectPage-Crhlw7MG.js → ProjectPage--I3rB_p4.js} +3 -3
  39. package/web-app/dist/assets/{ProjectsPage-Da-dndE0.js → ProjectsPage-CW57oFYD.js} +1 -1
  40. package/web-app/dist/assets/{SettingsPage-DZVy9d-7.js → SettingsPage-cW-BXZGS.js} +1 -1
  41. package/web-app/dist/assets/{ShowcasePage-K549XnJu.js → ShowcasePage-__24vOZq.js} +1 -1
  42. package/web-app/dist/assets/{SystemSettingsPage-BzYX8exp.js → SystemSettingsPage-CM-54CV0.js} +1 -1
  43. package/web-app/dist/assets/{TeamsPage-B-NFe-RU.js → TeamsPage-NphA-ubY.js} +1 -1
  44. package/web-app/dist/assets/{TemplatesPage-B0rflxjJ.js → TemplatesPage-9ERZiFUR.js} +1 -1
  45. package/web-app/dist/assets/{TerminalOutput-Cztmzbib.js → TerminalOutput-BT2DzBO1.js} +1 -1
  46. package/web-app/dist/assets/{activity-D6OLvSTu.js → activity-CQJpef5Z.js} +1 -1
  47. package/web-app/dist/assets/{bell-CEbcuu6k.js → bell-Bxopl5iP.js} +1 -1
  48. package/web-app/dist/assets/{bot-DvUoBtIi.js → bot-BEjHVO92.js} +1 -1
  49. package/web-app/dist/assets/{check-k1SeYCYx.js → check-Do1juwL_.js} +1 -1
  50. package/web-app/dist/assets/{chevron-left-CeUTHzvt.js → chevron-left-Hn3UM-NM.js} +1 -1
  51. package/web-app/dist/assets/{circle-alert-C7qJ5LE9.js → circle-alert-Btc-PWto.js} +1 -1
  52. package/web-app/dist/assets/{clock-2mey5blZ.js → clock-9J88OP3M.js} +1 -1
  53. package/web-app/dist/assets/{cloud-DYOkaKXJ.js → cloud-JPIPzxJd.js} +1 -1
  54. package/web-app/dist/assets/{code-xml-BrfSPBeq.js → code-xml-iv1keZ9N.js} +1 -1
  55. package/web-app/dist/assets/{database-BT8Fq2mO.js → database-DwFbyMQf.js} +1 -1
  56. package/web-app/dist/assets/{dollar-sign-DxwW6pq5.js → dollar-sign-Bt1rF0Up.js} +1 -1
  57. package/web-app/dist/assets/{file-code-corner-BFcn4EtI.js → file-code-corner-BvhHgreH.js} +1 -1
  58. package/web-app/dist/assets/{file-plus-Nxp-eviU.js → file-plus-CeOevK8W.js} +1 -1
  59. package/web-app/dist/assets/{globe-lrcCFaSs.js → globe-BIMbYVfR.js} +1 -1
  60. package/web-app/dist/assets/{hammer-6dyrHj_E.js → hammer-CMG6alC6.js} +1 -1
  61. package/web-app/dist/assets/{index-CfG9cuZ-.js → index-D1-1DZ1A.js} +3 -3
  62. package/web-app/dist/assets/{layers-Beh61xd-.js → layers-Dwoys6vF.js} +1 -1
  63. package/web-app/dist/assets/{loader-circle-BkQN4_tt.js → loader-circle-CelYAWD2.js} +1 -1
  64. package/web-app/dist/assets/{lock-C614_wuJ.js → lock-BgFsHF5L.js} +1 -1
  65. package/web-app/dist/assets/{package-4CpdKErA.js → package-5sdo-e9y.js} +1 -1
  66. package/web-app/dist/assets/{plus-FozAX8-T.js → plus-CSzQUjW8.js} +1 -1
  67. package/web-app/dist/assets/{refresh-cw-DElhmy2T.js → refresh-cw-Bdo9tSnG.js} +1 -1
  68. package/web-app/dist/assets/{rotate-ccw-BiqvSaHk.js → rotate-ccw-BaY8Qfhk.js} +1 -1
  69. package/web-app/dist/assets/{scroll-text-BTOP8eTS.js → scroll-text-BN8nd88z.js} +1 -1
  70. package/web-app/dist/assets/{server-D_hT6jF9.js → server-Bi6RuZbH.js} +1 -1
  71. package/web-app/dist/assets/{shield-alert-UcwG-fFq.js → shield-alert-aZX8uTyl.js} +1 -1
  72. package/web-app/dist/assets/{thumbs-up-CCBQEpsU.js → thumbs-up-CJBtXUbH.js} +1 -1
  73. package/web-app/dist/assets/{trash-2-CURJAi5R.js → trash-2-bgGf4gkl.js} +1 -1
  74. package/web-app/dist/assets/{trending-down-BoiOB4Qf.js → trending-down-BJ0IybHJ.js} +1 -1
  75. package/web-app/dist/assets/{trending-up-BhFeoKLJ.js → trending-up-CGmXxQM4.js} +1 -1
  76. package/web-app/dist/assets/{upload-Dm4LbLvG.js → upload-rDccLEQm.js} +1 -1
  77. package/web-app/dist/assets/{usePolling-Dt1olG1R.js → usePolling-BN36YyBK.js} +1 -1
  78. package/web-app/dist/assets/{user-Dpu23ils.js → user-DeS27GvT.js} +1 -1
  79. 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 v11.17.71
6
+ # Loki Mode v11.17.73
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.71 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v11.17.73 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.17.71
1
+ 11.17.73
@@ -7,6 +7,6 @@ Modules:
7
7
  control: Session control helpers (status, atomic writes, origin check)
8
8
  """
9
9
 
10
- __version__ = "11.17.71"
10
+ __version__ = "11.17.73"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -245,7 +245,7 @@ def _read_outcome(workdir: str, rc: int) -> dict:
245
245
  d = e.get("data") or {}
246
246
  if e.get("type") == "pr.opened" and d.get("url"):
247
247
  pr_url = d["url"] if str(d["url"]).startswith("https://") else None
248
- if e.get("type") == "stage.completed" and e.get("stage") == "implement" and d.get("spec_conflict_reason"):
248
+ if e.get("type") == "stage.completed" and e.get("stage") in ("implement", "fix") and d.get("spec_conflict_reason"): # mirror of conflictReasonOf (loki-ts/src/engine10/events.ts): a later fix reason overwrites implement's
249
249
  question = str(d["spec_conflict_reason"])
250
250
  if rc == 0:
251
251
  return {"status": "pr_open", "pr_url": pr_url} if pr_url else {"status": "done", "detail": outcome or "no change needed"}
@@ -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.71. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.73. 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.71
5
+ **Version:** v11.17.73
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
 
@@ -50,7 +50,7 @@ interact and why hitting one is a failure rather than a success.
50
50
  | `LOKI_SUMMARY_JSON` | unset | `1` prints the end-of-run summary as one JSON line on the previous loop. |
51
51
  | `LOKI_TIER` | `oss` | **Not a model setting.** The open-core licensing seam. Leave it unset. |
52
52
  | `LOKI_E10_STABLE_PREFIX` | on | Engine10 sessions send the `claude_code` preset with `excludeDynamicSections: true`, so the system prompt is byte-identical across stages and runs and hits the prompt cache. `0` restores the previous preset. `LOKI_E10_PREFIX=lean` still wins when set. |
53
- | `LOKI_E10_INSTALL` | on | Up-front dependency install at intake. `0` disables it (same as `verify.install_deps: false` in loki.yaml); the run then reports the missing dependencies as NOT PROVEN. When on, each package whose dependencies are absent is installed once per run before the baseline, using the lockfile-frozen form when the package has a lockfile: `npm ci`, `pnpm install --frozen-lockfile`, `yarn install --immutable` (Yarn Berry) or `--frozen-lockfile`, `bun install --frozen-lockfile`, `uv sync --frozen`, `poetry install` (already lock-honoring, kept as written), `pipenv sync`, `cargo fetch --locked`, `BUNDLE_FROZEN=true bundle install`, `composer install`. These never rewrite the lockfile. A lockfile governs a package only when it sits in the package directory, or in an ancestor that declares a workspace containing it (package.json `workspaces`, pnpm-workspace.yaml, Cargo `[workspace]`, uv `tool.uv.workspace`); a standalone sub-project beside a root lockfile keeps its own install command. If the locked install fails (for example the lockfile is out of sync with the manifest), the run reports NOT PROVEN with the real error and does not retry with a mutating install. With no lockfile, or no matching rule, the project's own install command runs and the receipt records `locked: false`. The project's own install scripts (for example npm postinstall) run just as they do for a developer, so disable the install for a repo you do not trust. |
53
+ | `LOKI_E10_INSTALL` | on | Up-front dependency install at intake. `0` disables it (same as `verify.install_deps: false` in loki.yaml); the run then reports the missing dependencies as NOT PROVEN. When on, each package whose dependencies are absent is installed once per run before the baseline, using the lockfile-frozen form when the package has a lockfile: `npm ci`, `pnpm install --frozen-lockfile`, `yarn install --immutable` (Yarn Berry) or `--frozen-lockfile`, `bun install --frozen-lockfile`, `uv sync --locked`, `poetry install` (already lock-honoring, kept as written), `pipenv install --deploy`, `cargo fetch --locked`, `BUNDLE_FROZEN=true bundle install`, `composer install`. These never rewrite the lockfile. A lockfile governs a package only when it sits in the package directory, or in an ancestor that declares a workspace containing it (package.json `workspaces`, pnpm-workspace.yaml, Cargo `[workspace]`, uv `tool.uv.workspace`); a standalone sub-project beside a root lockfile keeps its own install command. The install command is rewritten only if it is simple enough to reason about without a shell parser; otherwise it is left as written and recorded `locked: false`: a `||` anywhere (lock_note "fallback masks install failure"); any character outside letters, digits, space, tab and `_./=:@+,%~-` besides the separators `&&`, `;` and newline, or anything before the first install other than `cd <path>`, `export VAR=value` or plain VAR=value assignments, or any PATH assignment (lock_note "unparsed shell construct"); and an install followed by a `;` or newline command, which would mask its failure (lock_note "later command masks install failure"), so after the install only `&&` is allowed. If the locked install fails (for example the lockfile is out of sync with the manifest), the run reports NOT PROVEN with the real error and does not retry with a mutating install. With no lockfile, or no matching rule, the project's own install command runs and the receipt records `locked: false`. The project's own install scripts (for example npm postinstall) run just as they do for a developer, so disable the install for a repo you do not trust. |
54
54
  | `LOKI_REPO_BASELINE` | unset | `0` skips the intake repo profile and baseline test run (see docs/HARNESS-INTELLIGENCE-PLAN.md). |
55
55
  | `LOKI_ALLOW_CLAUDE_SIDECALLS` | unset | `1` (exactly) lets PRD enrichment, done recognition, the council voters, the USAGE.md refresh and the quickstart intent check prompt the `claude` CLI under a non-claude provider; `loki doctor --airgap` then reports that as required egress to Anthropic. |
56
56
 
@@ -868,9 +868,10 @@ FC-AGENT-PROOF: a run whose only executed passing check is a test file the same
868
868
 
869
869
  ## D106 (2026-10-19, founder decision, FireLater#20 follow-up): the up-front dependency install is locked and fails closed
870
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 --frozen`; poetry.lock `poetry install` (already lock-honoring, kept as written); Pipfile.lock `pipenv sync`; 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`.
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
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 `||` fallback after an install is not rewritten and the check records `locked: false` with a note that it can mask failure. pnpm `--no-frozen-lockfile` is dropped when `--frozen-lockfile` is added.
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, 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
874
  5. Visible: the install check and the deps.install event carry `cmd` (what ran), `locked`, `lock_note` and, when rewritten, `model_cmd`.
875
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.
876
877
  - Reverse: founder call; the opt-out covers one-off needs.
@@ -1147,6 +1147,14 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
1147
1147
  - Mechanism: the fix loop condition stops when implement.exit is spec_conflict (verify still runs once, E-98b); FIXED_RULES and the stage prefix forbid docs, changelog or README text announcing behavior the code lacks and direct the agent to LOKI_SPEC_CONFLICT. The A-110/E-67 draft PR for a conflict with real implement work is kept.
1148
1148
  - Fixture: loki-ts/tests/engine10/machine.test.ts E-98b case (one verify, no fix round; red on the old loop), implement brief and spec-first goldens re-captured.
1149
1149
 
1150
+ ## FC-FIX-CONFLICT-STALLED A spec conflict declared by a fix round was ignored and the run ended STALLED (FIX-CONFLICT-STALLED)
1151
+ - User-visible vs raw: user-visible. `loki start asklokesh/FireLater#20` (run e10-20261019T020704Z-103b): fix round 2 ended with LOKI_SPEC_CONFLICT and no tree change; the fix stage dropped the marker, the anti-loop fired (loop.repeat) and the run ended STALLED "same failure 3 times" instead of BLOCKED with the agent's question and the `loki answer` next step.
1152
+ - Law broken: an agent's explicit, evidenced report that the task conflicts with the repository ends the run as a spec conflict wherever it is made; a stall verdict never hides the question.
1153
+ - Siblings: implement (the only stage that consumed the marker), the fix stage (dropped it), seal verdictOf and the receipt reason (read implement only), reasonOf and the supervisor blocked comment (read the implement event only). plan, wall and deep sessions are not told the marker exists and never consume it; swept, no change. A claim from a fix round that changed the tree is not believed (the agent did work; verify decides), so a conflict cannot escape a real failure.
1154
+ - Mechanism: one rule shared with implement (util/conflict_resume.ts): a fix session that signals the conflict gets the same single correction resume (resumeAfterConflict) and, if it still signals it with the tree unchanged, the fix stage reports exit spec_conflict with the reason; the machine records it on the implement output so seal, output and the supervisor use their existing SPEC_CONFLICT path, and the fix loop stops before the anti-loop.
1155
+ - Readers: conflictReasonOf (engine10/events.ts) is the one event reader (last fix reason, else implement's); output.ts, supervisor.ts, run_outputs.ts workItemBlockers, blocked_answer.ts readBlocked and slack_inbound.ts all use it. In deep mode implementLeftS may skip the correction resume; the unchanged-tree check still applies.
1156
+ - Fixture: loki-ts/tests/engine10/machine.test.ts (red: stopped "stalled" and verdict not SPEC_CONFLICT; green: BLOCKED path with reason; tree-changed claim is not believed).
1157
+
1150
1158
  ## FC-LINT-OOM Tests shard 0 died with "runner has received a shutdown signal" (exit 143) during ShellCheck Linting (LINT-OOM)
1151
1159
  - User-visible vs raw: user-visible (red Tests on main for 11.17.61 and 11.17.63). Raw: no suite failed; the hosted runner was killed mid-lint.
1152
1160
  - Law broken: a gate must fit its machine; resource exhaustion read as a red verdict hides real results.
@@ -2587,3 +2587,9 @@ v11.17.21 published (Release success on 462fbc40a; npm latest 11.17.21, next 11.
2587
2587
 
2588
2588
  ## 2026-10-19T02:46Z (CoS) v11.17.71
2589
2589
  - 11.17.71: install hardening d4170dc68+1b52683ed (cherry-picked d42be9af1, f1fa80b95). HIGH BLOCK B1/B2 fixed; HIGH re-review APPROVE: fc22+budget+intake 142/0, real npm ci in workspace member rc=0. On main: fc22+intake+budget 143 pass 0 fail. Follow-ups: pnpm yaml inline/unindented lists, uv --locked/pipenv --deploy, D106 || wording.
2590
+
2591
+ ## 2026-10-19T02:54Z (CoS) v11.17.72
2592
+ - 11.17.72: FC-FIX-CONFLICT-STALLED (FireLater#20 rerun 11.17.67 ended STALLED). 60f95df4f+1c43b5130+e5321f613 cherry-picked as 82f536d85, 9aa74fab0, b0b7b2066. HIGH: BLOCK x2 (sibling readers), then APPROVE: control-plane 539/0, pytest 35 passed, red 2 fail each without reader changes. On main: blocked_answer+machine+fix+budget 112 pass 0 fail.
2593
+
2594
+ ## 2026-10-19T03:12Z (CoS) v11.17.73
2595
+ - 11.17.73: P0 fix-forward for D106 install masking (live in 71/72). af838b55 commits 2bb2f0194..279f1ac5d cherry-picked as 2599744de..20cf84915 plus D106 wording fix. HIGH a1168a6d: BLOCK x5 (||, quoted separators, later ; list, trap/function/alias, set -n), APPROVE round 6 at 279f1ac5d: fc22_install+intake+budget 145 pass 0 fail, real npm stale-lock probes all rc=1 on rewritten shapes.