Skip to content

Commit 6542989

Browse files
committed
docs: prepare CHANGELOG for v0.29.0
Rename [Unreleased] section to [0.29.0] - 2026-05-09 and add Fixed entries for the two post-PR-#556 hotfixes that landed in commits ff02265 + 4a8aea6 (#559) and 34b303a (#560): - #559: orchestrator parent crashes on first IPC frame from engine-worker (ReferenceError: batchState is not defined). Affected every batch. Fix uses orchBatchState.batchId — sage post-mortem on first attempted fix that used supervisorState.batchId. - #560: Pi CLI path resolution broken after @mariozechner@earendil-works rename. resolvePiCliPath() now searches both scopes (new first, legacy fallback). Backward compat preserved. The TP-187 / TP-189 / dashboard polish entries that already existed in [Unreleased] (from PR #556's main batch) are preserved verbatim in the new [0.29.0] section. New empty [Unreleased] placeholder inserted at the top for the next release cycle.
1 parent 1288ebc commit 6542989

1 file changed

Lines changed: 68 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)