pi-crew 0.2.3 → 0.2.5

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 (348) hide show
  1. package/AGENTS.md +57 -32
  2. package/CHANGELOG.md +466 -448
  3. package/LICENSE +21 -21
  4. package/NOTICE.md +16 -16
  5. package/README.md +323 -323
  6. package/docs/FEATURE_INTAKE.md +126 -0
  7. package/docs/HARNESS.md +86 -0
  8. package/docs/HARNESS_BACKLOG.md +41 -0
  9. package/docs/TEST_MATRIX.md +49 -0
  10. package/docs/actions-reference.md +595 -595
  11. package/docs/architecture.md +180 -180
  12. package/docs/code-review-2026-05-11.md +592 -592
  13. package/docs/commands-reference.md +347 -347
  14. package/docs/comparison-pi-subagents-vs-pi-crew.md +303 -0
  15. package/docs/decisions/0001-durable-state.md +41 -0
  16. package/docs/decisions/0002-child-process-for-async.md +42 -0
  17. package/docs/decisions/0003-depth-guard.md +36 -0
  18. package/docs/decisions/0004-execfile-over-exec.md +34 -0
  19. package/docs/decisions/0005-no-parameter-properties.md +49 -0
  20. package/docs/decisions/0006-publish-bundled-esm.md +63 -0
  21. package/docs/decisions/0007-active-run-binary-index.md +54 -0
  22. package/docs/decisions/0008-child-pi-warm-pool.md +61 -0
  23. package/docs/decisions/README.md +23 -0
  24. package/docs/followup-review-round4-2026-05-13.md +107 -0
  25. package/docs/implementation-plan-top3.md +333 -0
  26. package/docs/live-mailbox-runtime.md +36 -36
  27. package/docs/next-upgrade-roadmap.md +808 -808
  28. package/docs/oh-my-pi-research.md +509 -0
  29. package/docs/perf/baseline-2026-05.md +113 -0
  30. package/docs/perf/final-report-2026-05.md +206 -0
  31. package/docs/perf/sprint-1-report.md +71 -0
  32. package/docs/perf/sprint-2-report.md +81 -0
  33. package/docs/perf/sprint-2.5-report.md +53 -0
  34. package/docs/perf/sprint-3-report.md +36 -0
  35. package/docs/perf/sprint-4-report.md +47 -0
  36. package/docs/perf/sprint-5-report.md +51 -0
  37. package/docs/perf/sprint-6-report.md +94 -0
  38. package/docs/perf/sprint-7-report.md +74 -0
  39. package/docs/perf/upgrade-plan-2026-05.md +147 -0
  40. package/docs/pi-subagents3-deep-analysis.md +508 -0
  41. package/docs/product/README.md +31 -0
  42. package/docs/product/platform.md +27 -0
  43. package/docs/product/runtime-safety.md +37 -0
  44. package/docs/product/team-run.md +39 -0
  45. package/docs/product/team-tool.md +37 -0
  46. package/docs/publishing.md +65 -65
  47. package/docs/resource-formats.md +134 -134
  48. package/docs/runtime-analysis-child-vs-live.md +171 -0
  49. package/docs/runtime-flow.md +148 -148
  50. package/docs/runtime-migration-in-process-analysis.md +250 -0
  51. package/docs/stories/README.md +30 -0
  52. package/docs/stories/backlog.md +36 -0
  53. package/docs/templates/decision.md +27 -0
  54. package/docs/templates/story.md +44 -0
  55. package/docs/templates/validation-report.md +32 -0
  56. package/docs/usage.md +238 -238
  57. package/index.ts +7 -6
  58. package/install.mjs +65 -65
  59. package/package.json +107 -100
  60. package/schema.json +222 -222
  61. package/skills/child-pi-spawning/SKILL.md +213 -0
  62. package/skills/context-artifact-hygiene/SKILL.md +32 -0
  63. package/skills/event-log-tracing/SKILL.md +299 -0
  64. package/skills/git-master/SKILL.md +225 -24
  65. package/skills/live-agent-lifecycle/SKILL.md +192 -0
  66. package/skills/mailbox-interactive/SKILL.md +300 -19
  67. package/skills/model-routing-context/SKILL.md +94 -0
  68. package/skills/multi-perspective-review/SKILL.md +88 -0
  69. package/skills/read-only-explorer/SKILL.md +250 -26
  70. package/skills/safe-bash/SKILL.md +307 -21
  71. package/skills/verification-before-done/SKILL.md +11 -2
  72. package/skills/widget-rendering/SKILL.md +258 -0
  73. package/skills/workspace-isolation/SKILL.md +202 -0
  74. package/skills/worktree-isolation/SKILL.md +202 -18
  75. package/src/adapters/claude-adapter.ts +25 -25
  76. package/src/adapters/codex-adapter.ts +21 -21
  77. package/src/adapters/cursor-adapter.ts +17 -17
  78. package/src/adapters/export-util.ts +137 -137
  79. package/src/adapters/index.ts +15 -15
  80. package/src/adapters/registry.ts +18 -18
  81. package/src/adapters/types.ts +23 -23
  82. package/src/agents/agent-config.ts +38 -38
  83. package/src/agents/agent-serializer.ts +38 -38
  84. package/src/agents/discover-agents.ts +121 -118
  85. package/src/config/config.ts +740 -858
  86. package/src/config/defaults.ts +96 -96
  87. package/src/config/drift-detector.ts +211 -211
  88. package/src/config/markers.ts +327 -327
  89. package/src/config/resilient-parser.ts +109 -108
  90. package/src/config/suggestions.ts +74 -74
  91. package/src/config/types.ts +199 -0
  92. package/src/extension/async-notifier.ts +123 -89
  93. package/src/extension/autonomous-policy.ts +169 -169
  94. package/src/extension/cross-extension-rpc.ts +104 -104
  95. package/src/extension/help.ts +47 -47
  96. package/src/extension/import-index.ts +69 -69
  97. package/src/extension/management.ts +395 -382
  98. package/src/extension/notification-router.ts +116 -116
  99. package/src/extension/notification-sink.ts +51 -51
  100. package/src/extension/project-init.ts +168 -168
  101. package/src/extension/register.ts +859 -668
  102. package/src/extension/registration/artifact-cleanup.ts +15 -15
  103. package/src/extension/registration/command-utils.ts +54 -54
  104. package/src/extension/registration/commands.ts +559 -452
  105. package/src/extension/registration/compaction-guard.ts +125 -125
  106. package/src/extension/registration/subagent-helpers.ts +102 -102
  107. package/src/extension/registration/subagent-tools.ts +220 -159
  108. package/src/extension/registration/team-tool.ts +159 -99
  109. package/src/extension/registration/viewers.ts +29 -0
  110. package/src/extension/result-watcher.ts +128 -128
  111. package/src/extension/run-bundle-schema.ts +89 -89
  112. package/src/extension/run-export.ts +73 -73
  113. package/src/extension/run-import.ts +84 -84
  114. package/src/extension/run-index.ts +94 -94
  115. package/src/extension/run-maintenance.ts +142 -142
  116. package/src/extension/session-summary.ts +8 -8
  117. package/src/extension/team-manager-command.ts +96 -96
  118. package/src/extension/team-recommendation.ts +188 -188
  119. package/src/extension/team-tool/api.ts +5 -2
  120. package/src/extension/team-tool/cancel.ts +224 -209
  121. package/src/extension/team-tool/config-patch.ts +36 -36
  122. package/src/extension/team-tool/context.ts +60 -60
  123. package/src/extension/team-tool/doctor.ts +242 -242
  124. package/src/extension/team-tool/handle-settings.ts +421 -195
  125. package/src/extension/team-tool/inspect.ts +41 -41
  126. package/src/extension/team-tool/lifecycle-actions.ts +139 -139
  127. package/src/extension/team-tool/parallel-dispatch.ts +156 -156
  128. package/src/extension/team-tool/plan.ts +19 -19
  129. package/src/extension/team-tool/respond.ts +112 -111
  130. package/src/extension/team-tool/run.ts +246 -229
  131. package/src/extension/team-tool/status.ts +110 -110
  132. package/src/extension/team-tool-types.ts +13 -13
  133. package/src/extension/team-tool.ts +344 -344
  134. package/src/extension/tool-result.ts +16 -16
  135. package/src/extension/validate-resources.ts +77 -77
  136. package/src/hooks/registry.ts +61 -61
  137. package/src/hooks/types.ts +40 -40
  138. package/src/i18n.ts +184 -184
  139. package/src/observability/correlation.ts +35 -35
  140. package/src/observability/event-to-metric.ts +68 -68
  141. package/src/observability/exporters/adapter.ts +30 -30
  142. package/src/observability/exporters/otlp-exporter.ts +106 -92
  143. package/src/observability/exporters/prometheus-exporter.ts +54 -54
  144. package/src/observability/metric-registry.ts +87 -87
  145. package/src/observability/metric-retention.ts +54 -54
  146. package/src/observability/metric-sink.ts +81 -56
  147. package/src/observability/metrics-primitives.ts +167 -167
  148. package/src/prompt/prompt-runtime.ts +72 -72
  149. package/src/runtime/adaptive-plan.ts +338 -0
  150. package/src/runtime/agent-control.ts +169 -169
  151. package/src/runtime/agent-memory.ts +72 -72
  152. package/src/runtime/agent-observability.ts +114 -114
  153. package/src/runtime/async-marker.ts +26 -26
  154. package/src/runtime/async-runner.ts +153 -153
  155. package/src/runtime/attention-events.ts +28 -28
  156. package/src/runtime/auto-resume.ts +100 -100
  157. package/src/runtime/background-runner.ts +122 -89
  158. package/src/runtime/cancellation.ts +61 -61
  159. package/src/runtime/capability-inventory.ts +116 -116
  160. package/src/runtime/child-pi-pool.ts +68 -0
  161. package/src/runtime/child-pi.ts +541 -461
  162. package/src/runtime/code-summary.ts +247 -247
  163. package/src/runtime/compaction-summary.ts +271 -271
  164. package/src/runtime/concurrency.ts +58 -58
  165. package/src/runtime/crash-recovery.ts +317 -301
  166. package/src/runtime/crew-agent-records.ts +379 -281
  167. package/src/runtime/crew-agent-runtime.ts +60 -60
  168. package/src/runtime/cross-extension-rpc.ts +72 -0
  169. package/src/runtime/custom-tools/irc-tool.ts +201 -201
  170. package/src/runtime/custom-tools/submit-result-tool.ts +90 -90
  171. package/src/runtime/deadletter.ts +47 -47
  172. package/src/runtime/delivery-coordinator.ts +176 -176
  173. package/src/runtime/delta-conflict.ts +360 -360
  174. package/src/runtime/diagnostic-export.ts +102 -102
  175. package/src/runtime/direct-run.ts +35 -35
  176. package/src/runtime/effectiveness.ts +82 -81
  177. package/src/runtime/errors/crew-errors.ts +166 -0
  178. package/src/runtime/event-stream-bridge.ts +92 -92
  179. package/src/runtime/foreground-control.ts +82 -82
  180. package/src/runtime/green-contract.ts +46 -46
  181. package/src/runtime/group-join.ts +234 -106
  182. package/src/runtime/heartbeat-watcher.ts +145 -124
  183. package/src/runtime/iteration-hooks.ts +267 -267
  184. package/src/runtime/live-agent-control.ts +88 -88
  185. package/src/runtime/live-agent-manager.ts +377 -179
  186. package/src/runtime/live-control-realtime.ts +36 -36
  187. package/src/runtime/live-session-runtime.ts +676 -600
  188. package/src/runtime/loop-gates.ts +129 -129
  189. package/src/runtime/manifest-cache.ts +263 -263
  190. package/src/runtime/mcp-proxy.ts +113 -113
  191. package/src/runtime/metric-parser.ts +40 -40
  192. package/src/runtime/model-fallback.ts +282 -274
  193. package/src/runtime/model-resolver.ts +118 -0
  194. package/src/runtime/output-validator.ts +187 -187
  195. package/src/runtime/overflow-recovery.ts +175 -175
  196. package/src/runtime/parallel-research.ts +44 -44
  197. package/src/runtime/parallel-utils.ts +156 -156
  198. package/src/runtime/parent-guard.ts +80 -80
  199. package/src/runtime/phase-progress.ts +217 -217
  200. package/src/runtime/pi-args.ts +165 -165
  201. package/src/runtime/pi-json-output.ts +111 -111
  202. package/src/runtime/pi-spawn.ts +167 -167
  203. package/src/runtime/policy-engine.ts +79 -79
  204. package/src/runtime/post-checks.ts +125 -125
  205. package/src/runtime/post-exit-stdio-guard.ts +86 -86
  206. package/src/runtime/process-status.ts +97 -73
  207. package/src/runtime/progress-event-coalescer.ts +43 -43
  208. package/src/runtime/recovery-recipes.ts +74 -74
  209. package/src/runtime/retry-executor.ts +81 -81
  210. package/src/runtime/role-permission.ts +39 -39
  211. package/src/runtime/run-tracker.ts +99 -0
  212. package/src/runtime/runtime-policy.ts +21 -0
  213. package/src/runtime/runtime-resolver.ts +94 -91
  214. package/src/runtime/scheduler.ts +294 -0
  215. package/src/runtime/semaphore.ts +131 -131
  216. package/src/runtime/sensitive-paths.ts +92 -92
  217. package/src/runtime/session-usage.ts +79 -79
  218. package/src/runtime/settings-store.ts +103 -0
  219. package/src/runtime/sidechain-output.ts +29 -29
  220. package/src/runtime/skill-instructions.ts +222 -222
  221. package/src/runtime/stale-reconciler.ts +198 -189
  222. package/src/runtime/streaming-output.ts +47 -0
  223. package/src/runtime/subagent-manager.ts +404 -400
  224. package/src/runtime/subprocess-tool-registry.ts +67 -67
  225. package/src/runtime/task-display.ts +38 -38
  226. package/src/runtime/task-graph-scheduler.ts +122 -122
  227. package/src/runtime/task-graph.ts +207 -207
  228. package/src/runtime/task-output-context.ts +177 -177
  229. package/src/runtime/task-packet.ts +93 -93
  230. package/src/runtime/task-quality.ts +207 -207
  231. package/src/runtime/task-runner/capabilities.ts +78 -78
  232. package/src/runtime/task-runner/live-executor.ts +131 -113
  233. package/src/runtime/task-runner/progress.ts +119 -119
  234. package/src/runtime/task-runner/prompt-builder.ts +139 -139
  235. package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
  236. package/src/runtime/task-runner/result-utils.ts +14 -14
  237. package/src/runtime/task-runner/run-projection.ts +103 -103
  238. package/src/runtime/task-runner/state-helpers.ts +22 -22
  239. package/src/runtime/task-runner.ts +469 -459
  240. package/src/runtime/team-runner.ts +693 -945
  241. package/src/runtime/usage-tracker.ts +71 -0
  242. package/src/runtime/worker-heartbeat.ts +21 -21
  243. package/src/runtime/worker-startup.ts +57 -57
  244. package/src/runtime/workflow-state.ts +187 -187
  245. package/src/runtime/yield-handler.ts +190 -190
  246. package/src/schema/config-schema.ts +172 -168
  247. package/src/schema/team-tool-schema.ts +126 -126
  248. package/src/schema/validation-types.ts +151 -148
  249. package/src/skills/discover-skills.ts +67 -67
  250. package/src/skills/skill-templates.ts +374 -374
  251. package/src/state/active-run-registry.ts +227 -191
  252. package/src/state/artifact-store.ts +130 -129
  253. package/src/state/atomic-write.ts +262 -195
  254. package/src/state/blob-store.ts +116 -116
  255. package/src/state/contracts.ts +111 -111
  256. package/src/state/event-log-rotation.ts +161 -158
  257. package/src/state/event-log.ts +383 -303
  258. package/src/state/event-reconstructor.ts +217 -217
  259. package/src/state/jsonl-writer.ts +82 -82
  260. package/src/state/locks.ts +146 -146
  261. package/src/state/mailbox.ts +446 -405
  262. package/src/state/state-store.ts +364 -351
  263. package/src/state/task-claims.ts +44 -44
  264. package/src/state/types.ts +285 -285
  265. package/src/state/usage.ts +29 -29
  266. package/src/subagents/async-entry.ts +1 -1
  267. package/src/subagents/index.ts +3 -3
  268. package/src/subagents/live/control.ts +1 -1
  269. package/src/subagents/live/manager.ts +1 -1
  270. package/src/subagents/live/realtime.ts +1 -1
  271. package/src/subagents/live/session-runtime.ts +1 -1
  272. package/src/subagents/manager.ts +1 -1
  273. package/src/subagents/spawn.ts +1 -1
  274. package/src/teams/discover-teams.ts +116 -116
  275. package/src/teams/team-config.ts +27 -27
  276. package/src/teams/team-serializer.ts +38 -38
  277. package/src/types/diff.d.ts +18 -18
  278. package/src/ui/agent-management-overlay.ts +144 -144
  279. package/src/ui/crew-widget.ts +487 -370
  280. package/src/ui/dashboard-panes/agents-pane.ts +109 -28
  281. package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
  282. package/src/ui/dashboard-panes/capability-pane.ts +59 -59
  283. package/src/ui/dashboard-panes/health-pane.ts +30 -30
  284. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
  285. package/src/ui/dashboard-panes/progress-pane.ts +30 -30
  286. package/src/ui/dashboard-panes/transcript-pane.ts +10 -10
  287. package/src/ui/heartbeat-aggregator.ts +63 -63
  288. package/src/ui/keybinding-map.ts +97 -94
  289. package/src/ui/live-conversation-overlay.ts +152 -0
  290. package/src/ui/live-run-sidebar.ts +180 -180
  291. package/src/ui/mascot.ts +442 -442
  292. package/src/ui/overlays/agent-picker-overlay.ts +57 -57
  293. package/src/ui/overlays/confirm-overlay.ts +58 -58
  294. package/src/ui/overlays/mailbox-compose-overlay.ts +144 -144
  295. package/src/ui/overlays/mailbox-compose-preview.ts +63 -63
  296. package/src/ui/overlays/mailbox-detail-overlay.ts +122 -122
  297. package/src/ui/pi-ui-compat.ts +57 -57
  298. package/src/ui/powerbar-publisher.ts +221 -197
  299. package/src/ui/render-scheduler.ts +216 -143
  300. package/src/ui/run-action-dispatcher.ts +118 -118
  301. package/src/ui/run-dashboard.ts +526 -464
  302. package/src/ui/run-event-bus.ts +208 -208
  303. package/src/ui/run-snapshot-cache.ts +826 -777
  304. package/src/ui/settings-overlay.ts +721 -0
  305. package/src/ui/snapshot-types.ts +86 -70
  306. package/src/ui/theme-adapter.ts +190 -190
  307. package/src/ui/tool-progress-formatter.ts +89 -0
  308. package/src/ui/transcript-cache.ts +94 -94
  309. package/src/ui/transcript-viewer.ts +335 -335
  310. package/src/utils/conflict-detect.ts +662 -0
  311. package/src/utils/file-coalescer.ts +86 -86
  312. package/src/utils/frontmatter.ts +68 -68
  313. package/src/utils/fs-watch.ts +88 -31
  314. package/src/utils/gh-protocol.ts +479 -0
  315. package/src/utils/ids.ts +17 -17
  316. package/src/utils/incremental-reader.ts +104 -104
  317. package/src/utils/internal-error.ts +6 -6
  318. package/src/utils/names.ts +27 -27
  319. package/src/utils/paths.ts +102 -63
  320. package/src/utils/redaction.ts +44 -44
  321. package/src/utils/safe-paths.ts +47 -47
  322. package/src/utils/scan-cache.ts +136 -136
  323. package/src/utils/sse-parser.ts +134 -134
  324. package/src/utils/task-name-generator.ts +337 -337
  325. package/src/utils/timings.ts +33 -33
  326. package/src/utils/visual.ts +243 -198
  327. package/src/workflows/discover-workflows.ts +139 -139
  328. package/src/workflows/validate-workflow.ts +40 -40
  329. package/src/workflows/workflow-config.ts +26 -26
  330. package/src/workflows/workflow-serializer.ts +32 -32
  331. package/src/worktree/branch-freshness.ts +45 -45
  332. package/src/worktree/cleanup.ts +75 -75
  333. package/src/worktree/worktree-manager.ts +188 -188
  334. package/teams/default.team.md +12 -12
  335. package/teams/fast-fix.team.md +11 -11
  336. package/teams/implementation.team.md +18 -18
  337. package/teams/parallel-research.team.md +14 -14
  338. package/teams/research.team.md +11 -11
  339. package/teams/review.team.md +12 -12
  340. package/tsconfig.json +19 -19
  341. package/workflows/default.workflow.md +30 -30
  342. package/workflows/fast-fix.workflow.md +23 -23
  343. package/workflows/implementation.workflow.md +43 -43
  344. package/workflows/parallel-research.workflow.md +46 -46
  345. package/workflows/research.workflow.md +22 -22
  346. package/workflows/review.workflow.md +30 -30
  347. package/skills/task-packet/SKILL.md +0 -28
  348. package/skills/verify-evidence/SKILL.md +0 -27
@@ -0,0 +1,74 @@
1
+ # pi-crew Sprint 7 Report — Scaffolding for the last 4 deferred items
2
+
3
+ Date: 2026-05-14
4
+ Branch: `perf/sprint-7-scaffolding`
5
+ Status: 4/4 shipped as feature-flagged scaffolding.
6
+
7
+ ## Items shipped
8
+
9
+ | ID | Item | Commit |
10
+ |---|---|---|
11
+ | 2.2 | appendEventBuffered + flushEventLogBuffer | 34d8652 |
12
+ | 2.1 | atomicWriteJsonCoalesced + flushPendingAtomicWrites | b8fe5d9 |
13
+ | 2.5 | saveCrewAgentsCoalesced + writeCrewAgentStatusCoalesced | ddb77f7 |
14
+ | 2.6 | child-pi-pool.ts skeleton (ADR 0008) | 69d135d |
15
+
16
+ ## Design choice: scaffolding > full caller migration
17
+
18
+ For 2.1 / 2.2 / 2.5 the durability redesign requires either:
19
+ - a state-store reader that consults the in-memory buffer before disk
20
+ (otherwise read-after-write within the coalesce window is stale); or
21
+ - new integration crash-recovery tests proving no events are lost when
22
+ a process is killed inside the buffer window.
23
+
24
+ Both belong on a dedicated branch with their own integration test
25
+ harness. To still close the items without blocking on that branch, this
26
+ sprint ships the **producer side** (`*Buffered` / `*Coalesced` APIs)
27
+ ready for opt-in caller migration. The default code path is unchanged:
28
+ `appendEvent` / `atomicWriteJson` / `saveCrewAgents` remain durable, so
29
+ production runs are unaffected.
30
+
31
+ For 2.6 the blocker is the Pi runtime — until Pi accepts a
32
+ wait-for-prompt handshake, a real warm pool would just spawn idle
33
+ processes that can't be reused. The skeleton lets `child-pi.ts` adopt
34
+ the API now and a future PR can flip the implementation when Pi adds
35
+ support.
36
+
37
+ ## Tests
38
+
39
+ - 3/3 new event-log-buffered cases (seq invariant under burst,
40
+ explicit flush, mixed sync/buffered seq monotonicity).
41
+ - 3/3 new atomic-write-coalesced cases (5-write collapse, explicit
42
+ flush, multi-path last-write-wins).
43
+ - 4/4 new child-pi-pool skeleton cases.
44
+ - typecheck + check:lazy-imports + bench:check green.
45
+
46
+ ## Files
47
+
48
+ - `src/state/event-log.ts` (refactor + buffered API)
49
+ - `src/state/atomic-write.ts` (coalesced API)
50
+ - `src/runtime/crew-agent-records.ts` (coalesced wrappers)
51
+ - `src/runtime/child-pi-pool.ts` (skeleton, new)
52
+ - `test/unit/event-log-buffered.test.ts` (new)
53
+ - `test/unit/atomic-write-coalesced.test.ts` (new)
54
+ - `test/unit/child-pi-pool.test.ts` (new)
55
+
56
+ ## Caller migration TODOs (follow-up, not this sprint)
57
+
58
+ 1. **task.progress events** (high-frequency, tolerable to lose tail) —
59
+ switch `appendEvent(eventsPath, { type: "task.progress", ... })` →
60
+ `appendEventBuffered(...)` in `team-runner.ts` + `task-runner.ts`.
61
+ 2. **saveRunTasks merge loop** — switch to `atomicWriteJsonCoalesced`
62
+ in team-runner.ts mergeTaskUpdates path; ensure
63
+ `loadRunManifestById` consumers downstream call
64
+ `flushPendingAtomicWrites()` first (or accept ≤50ms window).
65
+ 3. **agent progress writes** — replace `writeCrewAgentStatus(...)` with
66
+ `writeCrewAgentStatusCoalesced(...)` in task-runner progress hook;
67
+ keep the durable variant for terminal events (completed/failed/
68
+ cancelled).
69
+ 4. **warm pool implementation** — once Pi supports
70
+ `PI_CREW_POOL_HEALTH=1` handshake (ADR 0008 step 1), replace the
71
+ `acquirePooledChild = () => null` stub with the actual pool.
72
+
73
+ Each TODO has a single touchpoint that future maintainers can pick off
74
+ the shelf without re-reading the underlying state-store invariants.
@@ -0,0 +1,147 @@
1
+ # pi-crew Performance Upgrade Plan — 2026-05
2
+
3
+ Date: 2026-05-14
4
+ Owner: pi-crew maintainers
5
+ Branch nền: `perf/baseline-bench`
6
+ Status: in-progress (Sprint 0 starting)
7
+
8
+ ## Mục đích
9
+
10
+ Nâng cấp hiệu năng và UI mượt hơn mà vẫn giữ tính ổn định, tuân theo `AGENTS.md` task loop và 5 ADR hiện hành (durable state, child-process for async, depth guard, execFileSync, no parameter properties). Plan này tập hợp 30 item nâng cấp đã phân tích, chia thành 5 sprint + 1 đợt tổng kết.
11
+
12
+ Các trục:
13
+
14
+ 1. **UI mượt hơn** — cắt sync I/O khỏi render path.
15
+ 2. **Runtime/state** — giảm syscall, lazy import, warm pool, refactor file lớn.
16
+ 3. **Ổn định** — backpressure, heartbeat, cancel sớm, mailbox archive, kill-tree Win.
17
+ 4. **Telemetry chi phí thấp** — stream sink, OTLP gzip, sample progress, histogram bucket.
18
+ 5. **Build/test feedback loop** — bench gate, test concurrency, watch mode, bundle.
19
+
20
+ ## Quy trình áp dụng cho mọi PR
21
+
22
+ - Branch: `perf/<sprint>-<id>-<slug>` cắt từ `perf/baseline-bench`.
23
+ - Lane (theo `AGENTS.md`): tiny / normal / high-risk.
24
+ - Validation bắt buộc trước khi merge:
25
+ - `npm run typecheck`
26
+ - `npm run check:lazy-imports`
27
+ - `npm test`
28
+ - `npm run bench:check` — không regress > 15%
29
+ - Tài liệu:
30
+ - Update `CHANGELOG.md` (nhóm theo sprint).
31
+ - Update `docs/TEST_MATRIX.md` khi thêm test.
32
+ - Viết ADR cho mọi thay đổi contract (`docs/decisions/`).
33
+ - Không gộp > 2 item vào 1 PR. Không refactor "tiện thể".
34
+ - Mỗi item rủi ro cao có flag tắt được ở config (`runtime.experimental.<feature>=false`).
35
+
36
+ ## Sprint 0 — Baseline & gate (2 ngày)
37
+
38
+ Mục đích: đo trước khi tối ưu.
39
+
40
+ | ID | Task | Files | Lane |
41
+ |---|---|---|---|
42
+ | S0-1 | Profile script | `scripts/profile-startup.mjs` | tiny |
43
+ | S0-2 | Bench harness 3 file | `test/bench/{register-startup,render-flush,snapshot-cache}.bench.ts`, `test/bench/baseline.json` | normal |
44
+ | S0-3 | `npm run bench` + `bench:check` | `package.json`, `scripts/bench-check.mjs` | tiny |
45
+ | S0-4 | Branch nền `perf/baseline-bench` | — | — |
46
+ | S0-5 | Capture baseline | `docs/perf/baseline-2026-05.md` | tiny |
47
+
48
+ Exit criteria: `npm run bench` ổn định, baseline đã ghi.
49
+
50
+ ## Sprint 1 — UI mượt rủi ro thấp (5 ngày)
51
+
52
+ | ID | Item | Lane | Acceptance |
53
+ |---|---|---|---|
54
+ | 1.1 | renderTick no-sync | tiny | Render skeleton khi preload chưa sẵn; test fs.statSync throw không crash. |
55
+ | 1.2 | Async snapshot stamps | normal | Sync version chỉ ở CLI handler; bench p95 -30%. |
56
+ | 1.4 | Stamp version counter | tiny | Dùng `events.jsonl.seq` thay `combineStamps(size)`. |
57
+ | 1.5 | Stamp agents O(1) | tiny | 1 stat/run thay vì N. |
58
+ | 1.8 | Powerbar dedup hash | tiny | 100 emit cùng payload → 1 event. |
59
+ | 1.9 | subagent.completed coalescer | tiny | 10 events trong 30 ms → 1 invalidate. |
60
+ | 1.10 | Mascot pause idle | tiny | Config `ui.mascotPauseIdleMs`. |
61
+
62
+ Exit: `render-flush.bench.ts` -30%, `snapshot-cache.bench.ts` -20%.
63
+
64
+ ## Sprint 2 — Cắt I/O sync hot path (5 ngày)
65
+
66
+ | ID | Item | Lane | Acceptance |
67
+ |---|---|---|---|
68
+ | 2.7 | Lazy import phase 2 | tiny | `register` end-to-end -200 ms. |
69
+ | 2.10 | projectCrewRoot cache | tiny | 1000 lần gọi → 1 stat. |
70
+ | 4.1 | Metric-sink stream | tiny | 10k metric → 0 sync IO hot path. |
71
+ | 4.4 | Progress sample 1/10 + first/last | tiny | 100 progress → 12 trong jsonl. |
72
+ | 2.1 | Atomic-write coalescer | normal | Crash trong window không corrupt; test recovery. |
73
+ | 2.2 | Events.jsonl buffer 20 ms | normal | flushSync trên cleanupRuntime + session_before_switch. |
74
+ | 2.3 | Rotation threshold 4 MB | tiny | Append 4 MB → rotate. |
75
+ | 1.3 | FS watcher native | normal | Render < 100 ms từ FS event; fallback poll khi ENOSYS. |
76
+
77
+ Exit: 0 sync IO trong `RenderScheduler.flush`, register start ≤ 400 ms.
78
+
79
+ ## Sprint 3 — Refactor & UI selectors (5 ngày)
80
+
81
+ | ID | Item | Lane | Acceptance |
82
+ |---|---|---|---|
83
+ | 2.8 | Tách adaptive-plan | normal | `team-runner.ts` < 45 KB; lazy import khi workflow ≠ implementation. |
84
+ | 2.9 | Tách config.ts | normal | `config.ts` < 20 KB; hot path không import drift/suggestions. |
85
+ | 1.6 | Dashboard pane independent | normal | 1 task đổi → chỉ agents-pane render. |
86
+ | 1.7 | Memoized snapshot slice | normal | 2 lần get cùng cache → cùng reference. |
87
+ | 5.1 | Test concurrency 4 | tiny | mỗi test mkdtemp riêng PI_TEAMS_HOME. |
88
+
89
+ Exit: dashboard FPS +50% khi run đang chạy.
90
+
91
+ ## Sprint 4 — Ổn định & telemetry (4 ngày)
92
+
93
+ | ID | Item | Lane | Acceptance |
94
+ |---|---|---|---|
95
+ | 3.1 | Backpressure stdout | normal | Stress 50 MB output → memory không vượt cap. |
96
+ | 3.2 | Heartbeat backoff | tiny | Stale → poll 1 s; khoẻ → 5 s. |
97
+ | 3.5 | Cancel propagate < 200 ms | normal | Stream-parse JSONL + signal check. |
98
+ | 3.6 | Deadletter cooldown | tiny | Config `reliability.deadletterCooldownMs`. |
99
+ | 3.7 | Idempotent resume theo attemptId | tiny | Resume 3 lần → artifact không nhân đôi. |
100
+ | 3.8 | Kill-tree Win | normal | SIGKILL fail → `taskkill /F /T`. |
101
+ | 3.4 | Atomic-write jitter | tiny | Jitter ±20%, max 8 attempts. |
102
+ | 3.3 | Mailbox auto-archive | normal | 11 MB → rotate vào blob-store. |
103
+ | 4.2 | OTLP gzip + delta | tiny | Content-Encoding: gzip; counter delta. |
104
+ | 4.3 | Histogram buckets pre-tuned | tiny | `crew.task.duration_ms` buckets `[50,200,500,1k,5k,30k,120k]`. |
105
+
106
+ Exit: cancel < 200 ms, no OOM trên stress, deadletter không lặp.
107
+
108
+ ## Sprint 5 — Backlog rủi ro cao + ADR (1 tuần)
109
+
110
+ | ID | Item | Lane | ADR |
111
+ |---|---|---|---|
112
+ | 5.5 | Bundle ESM (esbuild) | high-risk | `0006-publish-bundled-esm.md` |
113
+ | 2.4 | Active-run-registry binary | high-risk | `0007-active-run-binary-index.md` |
114
+ | 2.6 | Child-pi warm pool | high-risk | `0008-child-pi-warm-pool.md` |
115
+ | 2.5 | Lazy materialize agent records | normal | — |
116
+ | 5.2 | Watch mode test | tiny | — |
117
+
118
+ Mỗi item: ADR + flag tắt được + dual-ship migration nếu cần.
119
+
120
+ ## Tổng kết
121
+
122
+ - `docs/perf/sprint-<n>-report.md` cuối mỗi sprint.
123
+ - `docs/perf/final-report-2026-05.md` so sánh baseline vs final.
124
+ - Update `docs/next-upgrade-roadmap.md` đánh dấu các item đã xong.
125
+
126
+ ## Risk register
127
+
128
+ | Risk | Sprint | Mitigation |
129
+ |---|---|---|
130
+ | Coalescer mất event lúc crash | 2 | flushSync ở exit hook; integration test crash recovery. |
131
+ | FS watcher fail trên FS mạng | 2 | Detect ENOSYS/EPERM → fallback poll. |
132
+ | Bundle phá Pi extension load | 5 | Prototype + smoke trước; dual-ship 1 release. |
133
+ | Warm pool leak state | 5 | Pool process khởi động fresh, có nonce; reuse fail → discard. |
134
+ | Binary index migration | 5 | Read both binary + JSONL trong 2 release. |
135
+ | Concurrency=4 unit test flaky | 3 | Audit test dùng shared HOME; mỗi test mkdtemp riêng. |
136
+
137
+ ## Mục tiêu đo lường
138
+
139
+ | Metric | Baseline (Sprint 0) | Target | Sprint kỳ vọng cải thiện |
140
+ |---|---|---|---|
141
+ | `register.ts` end-to-end | TBD | < 400 ms | 2 |
142
+ | Widget first frame sau session_start | TBD | < 150 ms | 1 |
143
+ | `runTeamTask` cold | TBD | -2 đến -4 s (warm pool) | 5 |
144
+ | Dashboard FPS khi run đang chạy | TBD | +50% | 3 |
145
+ | events.jsonl tail 32 KB parse | TBD | < 5 ms | 2 |
146
+ | CPU idle khi run completed | TBD | < 1% | 1 |
147
+ | Cancel round-trip | TBD | < 200 ms | 4 |