pi-crew 0.11.2 → 0.11.4

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 (58) hide show
  1. package/CHANGELOG.md +44 -1
  2. package/dist/index.mjs +491 -493
  3. package/package.json +5 -2
  4. package/skills/real-test-pi-crew/SKILL.md +19 -11
  5. package/src/extension/async-notifier.ts +32 -8
  6. package/src/extension/crew-input-router.ts +9 -2
  7. package/src/extension/plan-orchestrate.ts +19 -3
  8. package/src/extension/registration/commands/shared.ts +11 -10
  9. package/src/extension/registration/foreground-run-controller.ts +2 -2
  10. package/src/extension/registration/lazy-configurers.ts +4 -1
  11. package/src/extension/registration/lifecycle-handlers.ts +16 -10
  12. package/src/extension/registration/lifecycle.ts +2 -0
  13. package/src/extension/registration/observability.ts +27 -18
  14. package/src/extension/registration/team-tool.ts +9 -2
  15. package/src/extension/registration/wire-cross-extension.ts +2 -0
  16. package/src/extension/team-manager-command.ts +3 -2
  17. package/src/extension/team-tool/goal-wrap.ts +7 -0
  18. package/src/extension/team-tool/goal.ts +12 -0
  19. package/src/extension/team-tool/parallel-dispatch.ts +16 -1
  20. package/src/extension/team-tool/run-intent.ts +1 -1
  21. package/src/extension/team-tool/run.ts +1 -1
  22. package/src/runtime/async-runner.ts +36 -0
  23. package/src/runtime/broker/crew-broker.ts +61 -62
  24. package/src/runtime/broker/delegate/delegate-event.ts +12 -8
  25. package/src/runtime/broker/protocol/connection-state.ts +10 -0
  26. package/src/runtime/broker/protocol/lock-busy.ts +76 -0
  27. package/src/runtime/delegate-spawn.ts +16 -2
  28. package/src/runtime/deterministic-ast.ts +14 -2
  29. package/src/runtime/goal-workflow/dynamic-workflow-context.ts +78 -58
  30. package/src/runtime/goal-workflow/dynamic-workflow-runner.ts +14 -2
  31. package/src/runtime/goal-workflow/goal-loop-runner.ts +32 -0
  32. package/src/runtime/group-join.ts +11 -3
  33. package/src/runtime/live-session/live-session-runtime.ts +1 -1
  34. package/src/runtime/model/runtime-warmup.ts +2 -0
  35. package/src/runtime/output/output-validator.ts +10 -5
  36. package/src/runtime/plan-approval.ts +14 -1
  37. package/src/runtime/recovery/crash-recovery.ts +75 -52
  38. package/src/runtime/subagent-manager.ts +43 -13
  39. package/src/runtime/task-runner/child-executor.ts +17 -6
  40. package/src/runtime/task-runner/post-execution.ts +44 -14
  41. package/src/runtime/task-runner/prompt-builder.ts +8 -0
  42. package/src/runtime/task-runner/retrieval-orchestrator.ts +36 -14
  43. package/src/runtime/task-runner.ts +7 -0
  44. package/src/runtime/team-runner.ts +4 -1
  45. package/src/runtime/verification/verification-worktree.ts +3 -0
  46. package/src/state/coordination/mailbox.ts +7 -2
  47. package/src/state/stores/state-store.ts +8 -1
  48. package/src/ui/dashboard-panes/agents-pane.ts +11 -8
  49. package/src/ui/inline-panel/index.ts +1 -1
  50. package/src/ui/render-diff.ts +19 -6
  51. package/src/ui/run-dashboard.ts +11 -1
  52. package/src/ui/run-snapshot-cache.ts +9 -3
  53. package/src/ui/widget/task-list.ts +8 -5
  54. package/src/ui/widget/widget-model.ts +3 -1
  55. package/tsconfig.json +2 -0
  56. package/src/ui/card-colors.ts +0 -168
  57. package/src/utils/completion-dedupe.ts +0 -63
  58. package/src/utils/resolve-shell.ts +0 -36
package/CHANGELOG.md CHANGED
@@ -1,6 +1,49 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased]
3
+ ## [0.11.4] — test-gate hardening + RR-023 battery fixes (2026-09-29)
4
+
5
+ ### fix: grandchild relay empty — inherit the parent task's model on model-less delegate (RR-023, 2026-09-29 battery finding #3)
6
+
7
+ - **Root cause (run `team_20260929041427_5c40c4fd7e950443`)**: the relay/capture chain (`delegate-spawn.ts` capture → broker fence/mailbox → prompt-runtime poll) was FAITHFUL — all 3 delegate calls omitted `model`, so the broker spawned the grandchild model-less, the child pi booted on the pi GLOBAL default (`minimax/MiniMax-M3` while the parents ran `zai/glm-5.3`), and that model returned empty completions (assistant `content: []` ×3, per the gc session jsonl) — `rawFinalText` undefined + stdout `""` → the relay delivered an empty fenced body as `ok:true`. Same family as finding #1 (75502b68). **Fix**: the `delegate.request` admission now threads the parent task's `model` out of the locked record read and the spawner inherits it when the request omits `model` (explicit `model` still wins; no-model-everywhere passthrough unchanged) — the grandchild can no longer silently fall through to the global default. **Diagnosability guard**: the capture expression is extracted as pure `grandchildResultText()` and an exit-0-with-zero-assistant-text result now renders `[grandchild exited 0 with no assistant output]` instead of an empty mailbox body indistinguishable from a relay bug. Pinned RED-first by `test/unit/runtime/broker/delegate-grandchild-model.test.ts` (fake-spawner harness, 3 ACs) + `test/unit/runtime/delegate-grandchild-result-text.test.ts` (5 unit cases on the helper).
8
+
9
+ ### fix: broker run.lock contention — typed busy frame instead of connection kill (RR-023, 2026-09-29 battery finding #4)
10
+
11
+ - **`wait.request`/`delegate.request` busy degradation**: both handlers ran their state RMW inside `withRunLockSync`; a live cross-process run.lock holder (e.g. the detached runner persisting task state) made `acquireLockWithRetry` throw immediately and the throw escaped `handleData` → `closeConnection` — direct-async workers saw an untyped `code=close` socket death within ~5ms (evidence: `team_20260929041005` ask-probe / `team_20260929041020` delegate-probe; the sync foreground run was the zero-contention control). New `protocol/lock-busy.ts` classifies the lock-busy throw by its exported message identity, retries on a bounded async-back-off schedule (new `CrewBrokerOptions.lockBusyRetryDelaysMs`, default 50/100/200/400/800ms), then answers a typed `busy` error frame with the connection SURVIVING (ping still answers); the delegate path additionally records `delegate.rejected(reason=run-lock-busy)` in events.jsonl — never silent. `locks.ts` steal semantics untouched (lock family v0.9.26 invariant). Pinned by `test/unit/runtime/broker/crew-broker-lock-contention.test.ts` (3 tests incl. the default-schedule retry-absorbs-transient-hold case).
12
+
13
+ ### fix: test-gate integrity (RR-021 review rounds 2-3)
14
+
15
+ - **Test runner cancelled-test guard** (`scripts/test-runner.mjs`): a dual reporter keeps stdout UX unchanged (spec under TTY, TAP otherwise) while a full TAP stream is written to a temp file; `# cancelled N > 0` now fails the run loudly in BOTH the single-run and batch paths — independent of node:test's exit-code mapping. Belt-and-suspenders against the round-1 incident class (unref'd-race-timer tests cancelled while the harness reported green).
16
+ - **Test runner missing-file pre-check** (round-3 B1): node:test v22 silently skips an explicitly-listed file that does not exist (when other files still run) and exits 0 — a renamed/deleted test file would silently drop out of `test:critical`-style gates forever. The runner now refuses to spawn and names the missing paths; glob-shaped args are left to node:test's own expansion.
17
+ - **`test:bundle` now routes through the guarded runner** (was a bare `node --test` bypass — the only CI gate without the cancelled/missing-file/fail-closed wrappers).
18
+ - **`check:lazy-imports` hardened**: composite `import()` forms that escaped every earlier rule are now caught (`[(,\[\{]\s*import(`, `>\s*import(`, `=\s*import(`); a zero-match `git grep` (fully-clean `src/`) no longer crashes the gate; the type-annotation skip now requires a member-access suffix `import("...").T` so compound runtime forms are never false-skipped; dist-side regex is whitespace-proof. Remaining gaps (ternary-else, object-property, case/label) are documented in the script.
19
+
20
+ ## [0.11.3] — optimization audit fixes: correctness, hang-risks, bundle, DX, dead code (2026-09-27)
21
+
22
+ ### fix: correctness + hang-risks (RR-021 M1)
23
+
24
+ - **`classifyReviewOutcome` word-boundary bug**: the `"\baccept\b"`/`"\breject\b"` signals were TS string literals — `\b` is a BACKSPACE char there, so the two strongest verdict signals never matched anything. All 49 signals are now precompiled module-scope regex literals, and a negation guard stops "I cannot accept this" counting as approval. Reject-first precedence unchanged.
25
+ - **Git precondition probes** (`rev-parse`/`status` in the verification worktree sandbox) gained a 5s timeout — a wedged git no longer blocks the extension forever; the existing catch degrades to `available:false`.
26
+ - **`detectRipgrep` hardening**: a spawned-but-wedged `rg --version` is SIGKILLed by an unref'd 3s timer (defaults to unavailable); concurrent first calls share ONE in-flight detection promise instead of spawning one rg per caller.
27
+ - **`markDeadAsyncRunIfNeeded`** reroutes to the async `withRunLock` (same v0.9.26 lock family — live-token interop); the 5s notifier tick no longer holds the event loop on a sync acquisition. The notifier tick keeps no-overlap semantics. `async-runner.ts`'s in-process test seam keeps its one-shot sync lock by design.
28
+ - **`reconcileAllStaleRuns`** is async and reconciles runs with `mapConcurrent` bound 4 (per-run lock files are independent); results keep snapshot order, plan-approval re-check and re-read-inside-lock semantics unchanged.
29
+
30
+ ### perf: bundle + startup hygiene (RR-021 M2)
31
+
32
+ - esbuild/acorn/diff load lazily through sync `createRequire` shims (model: `syntax-highlight.ts`) — three eager module-scope imports no longer paid on every extension load; `diff` wildcard import narrowed to `diffWords` (+ type-only `Change`).
33
+ - `ajv` marked external (it is only reached via a lazy `await import`) — the bundle shrank 1.65 MB → 1.53 MB and skips parse cost for a rarely-taken path.
34
+ - `check:lazy-imports` catches the common runtime `import()` positions (the old gate matched only `await import(` — audit blind-spot #2) and asserts the committed `dist/index.mjs` contains no module-scope hoisted import of esbuild/acorn/diff/jiti/cli-highlight/yaml/ajv. 23 runtime import sites across 9 files gained `// LAZY:` markers. (Wording corrected post-0.11.3: exotic positions — ternary-else, object-property, case/label — remain documented gaps; see Unreleased.)
35
+
36
+ ### perf(dx): incremental typecheck + flake-resistant waits (RR-021 M3)
37
+
38
+ - `tsconfig.json` enables `incremental` + a cached `tsBuildInfoFile` (gitignored) — measured with TS 7.0.2: cold 4.10s → warm 1.41s.
39
+ - Three flake-prone suites (`post-exit-stdio-guard`, `preload-idle-render`, `prompt-runtime-steer-boot-window`) replace fixed sleeps with poll-based `waitFor`/`waitForQuiet` (25ms poll, deadlines sized ≥2× the worst-case timer, quiet windows derived from a measured render timeline). Each file verified ×3 consecutive runs with zero flakes.
40
+
41
+ ### perf: scale + hygiene (RR-021 M4)
42
+
43
+ - The notifier tick and run picker read a bounded `listRecentRuns` window (40→20 after the session filter) instead of scanning the full run index every debounce window; the startup seed keeps its full scan by design.
44
+ - Dead code deleted (−1.6k lines, all verified 0-production-consumer): `src/benchmark/` + its two test files, `ui/card-colors.ts`, `utils/completion-dedupe.ts`, `utils/resolve-shell.ts` + their tests; the affected suites were trimmed to their live checks.
45
+ - Eleven drive-by fixes: Set/Map lookups for hot `includes`/`find` loops (settled batch filter, task-list dependency labels, agents-pane first-wins live-handle map, group-join task resolution), allocation-free reverse scans replacing `[...arr].reverse().find()` copies (×3), a 256-entry cap for `stableComponentCache`, `TypeCompiler.Compile(TeamToolParams)` compiled once (STATIC) instead of per-call `Value.Check` schema walks, a 30-min WALL-CLOCK poll deadline (the old 1800-poll cap silently assumed a 1s configurable interval), a bounded `waitForRecord` (300s deadline racing wedged promises; expiry returns the current record — never undefined), collision-free `msg_<randomUUID>` mailbox ids, and module-scope precompiled regexes for the crew-input router + implicit-tag detector.
46
+ - Spinner isolation (`run-dashboard` `spinnerBucket`/`metricsSig`) deferred to a follow-up — needs a live TUI profile first.
4
47
 
5
48
  ## [0.11.2] — runtime hygiene, in-process async test seam, slash-command fixes (2026-09-26)
6
49