@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77
88## [ Unreleased]
99
10+ ## [ 0.29.0] - 2026-05-09
11+
1012### New
1113
1214- ** ` supervisor_takeover(reason) ` tool (TP-187, #538 ):** Non-destructive
@@ -225,6 +227,72 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
225227 platform guard in `isWindowsMaxPathError` correctly skips the
226228 fallback.
227229
230+ ### Fixed (post-PR-#556 hotfixes)
231+
232+ - **Orchestrator parent crashes on first IPC frame from engine-worker
233+ (#559):** `ReferenceError: batchState is not defined` thrown from
234+ `ipcBatchIdMatches` in the supervisor IPC closure crashed the
235+ orchestrator parent process the moment any engine-worker emitted its
236+ first `lane-terminated` or `lane-respawned` message. Affected every
237+ batch — the batch state file was left in `phase=executing` with 0
238+ progress, and git worktrees / `task/...` branches were orphaned.
239+ Root cause: TP-187's batchId-gating helper (added to fold sage's
240+ post-integration finding) referenced `batchState.batchId` 5 times,
241+ but `batchState` is NOT bound in the supervisor IPC closure — only
242+ `orchBatchState` and `supervisorState` are. The crash slipped through
243+ because (1) `node --experimental-strip-types` performs no
244+ name-resolution checks, only strips type annotations; (2) TP-187's
245+ in-batch tests mock IPC handlers at a different layer
246+ (engine-worker → supervisor callbacks via `executeOrchBatch`'s `deps`
247+ parameter), bypassing the actual extension closure under fault.
248+ Fix: switched 5 sites from `batchState.batchId` to
249+ `orchBatchState.batchId` (NOT `supervisorState.batchId` — sage's
250+ post-mortem on the first attempted fix flagged that
251+ `supervisorState.batchId` is only populated when the supervisor
252+ activates, so for batches where the supervisor never activates the
253+ gate would never fire and the zombie-alert filter would be defeated).
254+ `orchBatchState.batchId` is the canonical live runtime batch ID for
255+ the extension closure: declared next to `supervisorState`, populated
256+ reliably via state-sync IPC. Regression test in
257+ `extensions/tests/extension-ipc-batchid-scope.test.ts` (4 tests)
258+ asserts via source-pattern that the supervisor IPC closure region
259+ contains zero references to `batchState.batchId` and at least one
260+ reference to `orchBatchState.batchId`. Comments are stripped before
261+ the check so documentation-of-the-bug doesn't trigger false
262+ positives.
263+
264+ - **Pi CLI path resolution broken after `@mariozechner` →
265+ `@earendil-works` rename (#560):** Pi v0.74.0 republished under the
266+ `@earendil-works` npm scope. Taskplane's Runtime V2 spawn pathway
267+ resolves Pi's CLI on disk via `path-resolver.ts:resolvePiCliPath()`,
268+ which hardcoded `@mariozechner` as the only scope to search under
269+ `npm root -g`. Result: every Runtime V2 spawn (workers, reviewers,
270+ mergers) failed immediately with `Cannot find Pi CLI entrypoint` on
271+ any system whose only globally-installed Pi was the new scope.
272+ Critically, Pi's own extension loader bundles aliases for BOTH
273+ scopes at runtime (`<pi>/dist/core/extensions/loader.js` lines
274+ 41-45), so all of taskplane's `import type { ExtensionAPI } from
275+ "@mariozechner/pi-coding-agent"` and `import { Type } from
276+ "@mariozechner/pi-ai"` sites continue to resolve correctly via Pi's
277+ in-process aliasing — the rename only breaks **disk-side** lookup
278+ for child-process spawning. Fix is therefore narrowly scoped to
279+ `path-resolver.ts`: refactored `resolvePiCliPath()` to walk the cross
280+ product of base directories × scopes, with `@earendil-works` checked
281+ first and `@mariozechner` second within each base directory.
282+ Operators with EITHER scope installed get a working Pi resolution;
283+ operators with BOTH installed (e.g., during a transition window)
284+ pick up `@earendil-works`. The error message and the
285+ `worktree.ts` install hint now name both scopes for diagnosability.
286+ Other ~10 files that reference `@mariozechner` (TypeScript imports,
287+ test mocks, peerDependencies, docs) deliberately left as-is because
288+ Pi's bundled-alias handling makes them work at runtime regardless of
289+ scope, and updating them risks breaking compat for users on Pi
290+ versions older than v0.74.0 (which don't have the alias map).
291+ Regression test in
292+ `extensions/tests/path-resolver-pi-scope.test.ts` (4 tests) sets up
293+ temp directories with each scope combination and asserts the
294+ resolver behaves correctly via real `child_process` probes.
295+
228296## [0.28.8] - 2026-05-07
229297
230298### Enhanced
0 commit comments