pi-crew 0.9.51 → 0.9.53

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 (611) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +216 -20
  3. package/dist/build-meta.json +2090 -1638
  4. package/dist/index.mjs +18057 -17119
  5. package/docs/actions-reference.md +431 -1
  6. package/index.ts +39 -10
  7. package/package.json +19 -9
  8. package/schema.json +41 -0
  9. package/scripts/check-bundle-size.mjs +38 -0
  10. package/scripts/test-runner.mjs +11 -1
  11. package/dist/index.mjs.map +0 -7
  12. package/docs/FEATURE_INTAKE.md +0 -126
  13. package/docs/HARNESS.md +0 -87
  14. package/docs/HARNESS_BACKLOG.md +0 -89
  15. package/docs/PROJECT_REVIEW.md +0 -270
  16. package/docs/PROJECT_REVIEW_FIXES.md +0 -342
  17. package/docs/PROJECT_REVIEW_ROUND4.md +0 -156
  18. package/docs/PROJECT_REVIEW_ROUND5.md +0 -86
  19. package/docs/REVIEW-FINDINGS-2026-06 +0 -357
  20. package/docs/REVIEW-FINDINGS-2026-07-CORE.md +0 -139
  21. package/docs/REVIEW-FINDINGS-2026-07.md +0 -125
  22. package/docs/TEST_MATRIX.md +0 -51
  23. package/docs/archive/README.md +0 -91
  24. package/docs/archive/followup-review-round3-2026-05-12.md +0 -342
  25. package/docs/archive/followup-review-round4-2026-05-13.md +0 -107
  26. package/docs/archive/pi-crew-bugs.md +0 -961
  27. package/docs/archive/pi-crew-test-final.md +0 -120
  28. package/docs/archive/pi-crew-test-results.md +0 -260
  29. package/docs/archive/pi-crew-test-round2.md +0 -136
  30. package/docs/archive/pi-crew-test-round4.md +0 -100
  31. package/docs/archive/pi-crew-test-round5.md +0 -70
  32. package/docs/archive/pi-crew-test-round6.md +0 -110
  33. package/docs/archive/pi-crew-v0.5.10-audit-fix-plan.md +0 -60
  34. package/docs/archive/pi-crew-v0.5.11-audit-fix-plan.md +0 -92
  35. package/docs/archive/pi-crew-v0.5.12-audit-fix-plan.md +0 -76
  36. package/docs/archive/pi-crew-v0.5.13-audit-fix-plan.md +0 -75
  37. package/docs/archive/pi-crew-v0.5.14-audit-fix-plan.md +0 -75
  38. package/docs/archive/pi-crew-v0.5.16-audit-fix-plan.md +0 -35
  39. package/docs/archive/pi-crew-v0.5.17-audit-fix-plan.md +0 -80
  40. package/docs/archive/pi-crew-v0.5.5-audit-fix-plan.md +0 -133
  41. package/docs/archive/pi-crew-v0.5.9-audit-fix-plan.md +0 -88
  42. package/docs/archive/pi-mono-opportunities.md +0 -969
  43. package/docs/archive/pi-mono-review.md +0 -291
  44. package/docs/archive/pi-subagent4-comparison.md +0 -261
  45. package/docs/archive/pi-subagents3-deep-analysis.md +0 -508
  46. package/docs/bugs/bug-021-notification-badge-counter-misleading.md +0 -293
  47. package/docs/bugs/bug-023-chain-windows-path-resolution.md +0 -106
  48. package/docs/bugs/bug-quota-display-truncation.md +0 -223
  49. package/docs/bugs/cross-session-notification-leakage.md +0 -82
  50. package/docs/code-review-2026-05-11.md +0 -592
  51. package/docs/coding-agent-optimization.md +0 -268
  52. package/docs/comparison-pi-subagents-vs-pi-crew.md +0 -303
  53. package/docs/decisions/0001-durable-state.md +0 -41
  54. package/docs/decisions/0002-child-process-for-async.md +0 -42
  55. package/docs/decisions/0003-depth-guard.md +0 -36
  56. package/docs/decisions/0004-execfile-over-exec.md +0 -34
  57. package/docs/decisions/0005-no-parameter-properties.md +0 -49
  58. package/docs/decisions/0006-publish-bundled-esm.md +0 -63
  59. package/docs/decisions/0007-active-run-binary-index.md +0 -54
  60. package/docs/decisions/0008-child-pi-warm-pool.md +0 -61
  61. package/docs/decisions/2026-07-21-broker-phase4-default-on.md +0 -77
  62. package/docs/decisions/2026-07-21-broker-windows-perms.md +0 -91
  63. package/docs/decisions/2026-07-22-broker-phase4-gated-on.md +0 -99
  64. package/docs/decisions/2026-07-24-oidc-trusted-publishing.md +0 -112
  65. package/docs/decisions/2026-07-26-c6-mascot-visibility-not-wired.md +0 -84
  66. package/docs/decisions/README.md +0 -26
  67. package/docs/deep-review-report.md +0 -384
  68. package/docs/distillation/cybersecurity-patterns.md +0 -294
  69. package/docs/feature-analysis-subagent4.md +0 -305
  70. package/docs/fix-plan-disabletools-exit-null.md +0 -219
  71. package/docs/fixes/BATCH_A_H1_H2.md +0 -86
  72. package/docs/fixes/bug-006-foreground-cancel-concurrent.md +0 -78
  73. package/docs/fixes/bug-007-async-notifier-stale-ctx.md +0 -112
  74. package/docs/fixes/bug-008-child-process-silent-timeout.md +0 -100
  75. package/docs/fixes/bug-009-executor-yield-limit-needs-attention.md +0 -75
  76. package/docs/fixes/bug-010-child-process-api-key-filtered.md +0 -109
  77. package/docs/fixes/bug-011-spawn-pi-enoent.md +0 -92
  78. package/docs/fixes/bug-012-essential-env-stripped.md +0 -89
  79. package/docs/fixes/bug-013-background-runner-death.md +0 -84
  80. package/docs/fixes/bug-014-infinite-retry-loop-needs-attention.md +0 -82
  81. package/docs/fixes/bug-015-background-runner-sigterm.md +0 -65
  82. package/docs/fixes/bug-017-background-runner-session-shutdown.md +0 -66
  83. package/docs/fixes/bug-017-background-runner-sigkill-double-fork.md +0 -28
  84. package/docs/fixes/bug-018-child-pi-worker-stdin-hang.md +0 -61
  85. package/docs/fixes/bug-019-phantom-runs-temp-workspace.md +0 -52
  86. package/docs/fixes/bug-020-infinite-retry-loop-needs-attention.md +0 -47
  87. package/docs/fixes/v0.9.10/locks-fix-verify.md +0 -3
  88. package/docs/fixes/v0.9.10/smoke-test.md +0 -12
  89. package/docs/followup-plan-2026-05-12.md +0 -463
  90. package/docs/followup-review-2026-05-12.md +0 -297
  91. package/docs/goals.md +0 -59
  92. package/docs/implementation-plan-top3.md +0 -333
  93. package/docs/issue-29-analysis.md +0 -189
  94. package/docs/live-mailbox-runtime.md +0 -36
  95. package/docs/migration/atomic-write-v2-migration.md +0 -299
  96. package/docs/next-upgrade-roadmap.md +0 -808
  97. package/docs/oh-my-pi-research.md +0 -509
  98. package/docs/optimization-plan-2026-07.md +0 -366
  99. package/docs/optimization-plan.md +0 -644
  100. package/docs/patterns/command-agent-skill.md +0 -71
  101. package/docs/perf/baseline-2026-05.md +0 -113
  102. package/docs/perf/final-report-2026-05.md +0 -206
  103. package/docs/perf/optimization-plan-2026-07-verified.md +0 -396
  104. package/docs/perf/performance-audit-report-2026-07.md +0 -948
  105. package/docs/perf/performance-review-2026-07.md +0 -287
  106. package/docs/perf/sprint-1-report.md +0 -71
  107. package/docs/perf/sprint-2-report.md +0 -81
  108. package/docs/perf/sprint-2.5-report.md +0 -53
  109. package/docs/perf/sprint-3-report.md +0 -36
  110. package/docs/perf/sprint-4-report.md +0 -47
  111. package/docs/perf/sprint-5-report.md +0 -51
  112. package/docs/perf/sprint-6-report.md +0 -94
  113. package/docs/perf/sprint-7-report.md +0 -74
  114. package/docs/perf/upgrade-plan-2026-05.md +0 -147
  115. package/docs/performance-optimization-execution-plan.md +0 -520
  116. package/docs/phase4-triage.md +0 -58
  117. package/docs/pi-crew-investigation-report.md +0 -411
  118. package/docs/product/README.md +0 -31
  119. package/docs/product/platform.md +0 -27
  120. package/docs/product/runtime-safety.md +0 -37
  121. package/docs/product/team-run.md +0 -39
  122. package/docs/product/team-tool.md +0 -37
  123. package/docs/runtime-analysis-child-vs-live.md +0 -171
  124. package/docs/runtime-migration-in-process-analysis.md +0 -250
  125. package/docs/skills/REFERENCE.md +0 -138
  126. package/docs/stories/README.md +0 -32
  127. package/docs/stories/US-DEPS-major-upgrade.md +0 -62
  128. package/docs/stories/backlog.md +0 -36
  129. package/docs/superpowers/plans/2026-06-09-fallow-patterns-adoption.md +0 -1270
  130. package/docs/templates/decision.md +0 -27
  131. package/docs/templates/story.md +0 -44
  132. package/docs/templates/validation-report.md +0 -32
  133. package/docs/ui-optimization-plan.md +0 -447
  134. package/src/adapters/claude-adapter.ts +0 -23
  135. package/src/adapters/codex-adapter.ts +0 -21
  136. package/src/adapters/cursor-adapter.ts +0 -17
  137. package/src/adapters/export-util.ts +0 -143
  138. package/src/adapters/index.ts +0 -15
  139. package/src/adapters/registry.ts +0 -18
  140. package/src/adapters/types.ts +0 -23
  141. package/src/agents/agent-config.ts +0 -194
  142. package/src/agents/agent-search.ts +0 -98
  143. package/src/agents/agent-serializer.ts +0 -38
  144. package/src/agents/discover-agents.ts +0 -623
  145. package/src/benchmark/benchmark-runner.ts +0 -313
  146. package/src/benchmark/feedback-loop.ts +0 -73
  147. package/src/config/config.ts +0 -1269
  148. package/src/config/defaults.ts +0 -193
  149. package/src/config/drift-detector.ts +0 -290
  150. package/src/config/markers.ts +0 -330
  151. package/src/config/resilient-parser.ts +0 -117
  152. package/src/config/role-tools.ts +0 -118
  153. package/src/config/suggestions.ts +0 -75
  154. package/src/config/types.ts +0 -278
  155. package/src/errors.ts +0 -194
  156. package/src/extension/action-suggestions.ts +0 -117
  157. package/src/extension/async-notifier.ts +0 -179
  158. package/src/extension/autonomous-policy.ts +0 -209
  159. package/src/extension/command-completions.ts +0 -120
  160. package/src/extension/context-status-injection.ts +0 -185
  161. package/src/extension/crew-autocomplete.ts +0 -131
  162. package/src/extension/crew-cleanup.ts +0 -168
  163. package/src/extension/crew-input-router.ts +0 -93
  164. package/src/extension/crew-shortcuts.ts +0 -87
  165. package/src/extension/crew-vibes/cat-frames.ts +0 -18
  166. package/src/extension/crew-vibes/config.ts +0 -195
  167. package/src/extension/crew-vibes/figures.ts +0 -101
  168. package/src/extension/crew-vibes/font-detect.ts +0 -71
  169. package/src/extension/crew-vibes/footer.ts +0 -292
  170. package/src/extension/crew-vibes/index.ts +0 -432
  171. package/src/extension/crew-vibes/provider-usage.ts +0 -396
  172. package/src/extension/crew-vibes/render.ts +0 -206
  173. package/src/extension/crew-vibes/speed.ts +0 -286
  174. package/src/extension/cross-extension-rpc.ts +0 -350
  175. package/src/extension/help.ts +0 -62
  176. package/src/extension/import-index.ts +0 -74
  177. package/src/extension/knowledge-injection.ts +0 -402
  178. package/src/extension/management.ts +0 -571
  179. package/src/extension/message-renderers.ts +0 -108
  180. package/src/extension/notification-router.ts +0 -152
  181. package/src/extension/notification-sink.ts +0 -54
  182. package/src/extension/pi-api.ts +0 -56
  183. package/src/extension/plan-orchestrate.ts +0 -302
  184. package/src/extension/project-init.ts +0 -170
  185. package/src/extension/register.ts +0 -113
  186. package/src/extension/registration/artifact-cleanup.ts +0 -20
  187. package/src/extension/registration/command-registration.ts +0 -58
  188. package/src/extension/registration/command-utils.ts +0 -58
  189. package/src/extension/registration/commands.ts +0 -1228
  190. package/src/extension/registration/compaction-guard.ts +0 -333
  191. package/src/extension/registration/context-builder.ts +0 -135
  192. package/src/extension/registration/crash-recovery-cache.ts +0 -54
  193. package/src/extension/registration/foreground-run-controller.ts +0 -238
  194. package/src/extension/registration/hook-registration.ts +0 -119
  195. package/src/extension/registration/lazy-configurers.ts +0 -124
  196. package/src/extension/registration/lifecycle-handlers.ts +0 -923
  197. package/src/extension/registration/lifecycle.ts +0 -259
  198. package/src/extension/registration/observability.ts +0 -322
  199. package/src/extension/registration/registration-types.ts +0 -158
  200. package/src/extension/registration/runtime-cleanup.ts +0 -230
  201. package/src/extension/registration/subagent-helpers.ts +0 -125
  202. package/src/extension/registration/subagent-manager-setup.ts +0 -330
  203. package/src/extension/registration/subagent-tools.ts +0 -456
  204. package/src/extension/registration/team-tool.ts +0 -220
  205. package/src/extension/registration/tool-registration.ts +0 -50
  206. package/src/extension/registration/ui.ts +0 -172
  207. package/src/extension/registration/viewers.ts +0 -121
  208. package/src/extension/registration/wire-cross-extension.ts +0 -37
  209. package/src/extension/result-watcher.ts +0 -139
  210. package/src/extension/rpc-hmac.ts +0 -256
  211. package/src/extension/run-bundle-schema.ts +0 -104
  212. package/src/extension/run-export.ts +0 -97
  213. package/src/extension/run-import.ts +0 -168
  214. package/src/extension/run-index.ts +0 -131
  215. package/src/extension/run-maintenance.ts +0 -190
  216. package/src/extension/session-summary.ts +0 -18
  217. package/src/extension/team-manager-command.ts +0 -153
  218. package/src/extension/team-onboard.ts +0 -177
  219. package/src/extension/team-recommendation.ts +0 -288
  220. package/src/extension/team-tool/anchor.ts +0 -172
  221. package/src/extension/team-tool/api.ts +0 -1244
  222. package/src/extension/team-tool/auto-summarize.ts +0 -142
  223. package/src/extension/team-tool/cache-control.ts +0 -19
  224. package/src/extension/team-tool/cancel.ts +0 -337
  225. package/src/extension/team-tool/chain-dispatch.ts +0 -95
  226. package/src/extension/team-tool/chain-executor.ts +0 -379
  227. package/src/extension/team-tool/config-patch.ts +0 -50
  228. package/src/extension/team-tool/context.ts +0 -149
  229. package/src/extension/team-tool/destructive-gate.ts +0 -52
  230. package/src/extension/team-tool/doctor.ts +0 -431
  231. package/src/extension/team-tool/explain.ts +0 -282
  232. package/src/extension/team-tool/failure-patterns.ts +0 -118
  233. package/src/extension/team-tool/goal-wrap.ts +0 -330
  234. package/src/extension/team-tool/goal.ts +0 -556
  235. package/src/extension/team-tool/handle-schedule.ts +0 -332
  236. package/src/extension/team-tool/handle-settings.ts +0 -520
  237. package/src/extension/team-tool/health-monitor.ts +0 -481
  238. package/src/extension/team-tool/inspect.ts +0 -88
  239. package/src/extension/team-tool/intent-policy.ts +0 -45
  240. package/src/extension/team-tool/lifecycle-actions.ts +0 -615
  241. package/src/extension/team-tool/orchestrate.ts +0 -98
  242. package/src/extension/team-tool/parallel-dispatch.ts +0 -183
  243. package/src/extension/team-tool/plan.ts +0 -50
  244. package/src/extension/team-tool/respond.ts +0 -150
  245. package/src/extension/team-tool/run-not-found.ts +0 -49
  246. package/src/extension/team-tool/run.ts +0 -1035
  247. package/src/extension/team-tool/status.ts +0 -260
  248. package/src/extension/team-tool/workflow-manage.ts +0 -261
  249. package/src/extension/team-tool-types.ts +0 -26
  250. package/src/extension/team-tool.ts +0 -1116
  251. package/src/extension/tool-result.ts +0 -16
  252. package/src/extension/validate-resources.ts +0 -108
  253. package/src/hooks/registry.ts +0 -200
  254. package/src/hooks/types.ts +0 -69
  255. package/src/i18n.ts +0 -212
  256. package/src/observability/correlation.ts +0 -50
  257. package/src/observability/event-bus.ts +0 -86
  258. package/src/observability/event-to-metric.ts +0 -170
  259. package/src/observability/exporters/adapter.ts +0 -27
  260. package/src/observability/exporters/otlp-exporter.ts +0 -356
  261. package/src/observability/exporters/prometheus-exporter.ts +0 -54
  262. package/src/observability/metric-registry.ts +0 -100
  263. package/src/observability/metric-retention.ts +0 -64
  264. package/src/observability/metric-sink.ts +0 -99
  265. package/src/observability/metrics-primitives.ts +0 -219
  266. package/src/plugins/plugin-define.ts +0 -6
  267. package/src/plugins/plugin-registry.ts +0 -32
  268. package/src/plugins/plugins/index.ts +0 -3
  269. package/src/plugins/plugins/nextjs.ts +0 -19
  270. package/src/plugins/plugins/vite.ts +0 -10
  271. package/src/plugins/plugins/vitest.ts +0 -9
  272. package/src/prompt/prompt-runtime.ts +0 -380
  273. package/src/runtime/adaptive-plan.ts +0 -563
  274. package/src/runtime/agent-control.ts +0 -215
  275. package/src/runtime/agent-memory.ts +0 -81
  276. package/src/runtime/agent-observability.ts +0 -122
  277. package/src/runtime/anchor-manager.ts +0 -475
  278. package/src/runtime/async-marker.ts +0 -32
  279. package/src/runtime/async-runner.ts +0 -381
  280. package/src/runtime/attention-events.ts +0 -28
  281. package/src/runtime/auto-summarize.ts +0 -344
  282. package/src/runtime/background-runner.ts +0 -837
  283. package/src/runtime/batch-barrier.ts +0 -147
  284. package/src/runtime/broker-issuer.ts +0 -37
  285. package/src/runtime/cancellation-token.ts +0 -99
  286. package/src/runtime/cancellation.ts +0 -99
  287. package/src/runtime/capability-inventory.ts +0 -137
  288. package/src/runtime/chain-parser.ts +0 -237
  289. package/src/runtime/chain-runner.ts +0 -606
  290. package/src/runtime/checkpoint.ts +0 -291
  291. package/src/runtime/child-pi-constants.ts +0 -42
  292. package/src/runtime/child-pi-kill.ts +0 -180
  293. package/src/runtime/child-pi-pool.ts +0 -68
  294. package/src/runtime/child-pi-spawn.ts +0 -287
  295. package/src/runtime/child-pi-steering.ts +0 -128
  296. package/src/runtime/child-pi-streams.ts +0 -296
  297. package/src/runtime/child-pi-transcript.ts +0 -169
  298. package/src/runtime/child-pi.ts +0 -1105
  299. package/src/runtime/coalesce-tasks.ts +0 -268
  300. package/src/runtime/code-summary.ts +0 -292
  301. package/src/runtime/command-trace.ts +0 -105
  302. package/src/runtime/compact-pipeline.ts +0 -56
  303. package/src/runtime/compact-stages/ansi-strip-stage.ts +0 -25
  304. package/src/runtime/compact-stages/blank-collapse-stage.ts +0 -31
  305. package/src/runtime/compact-stages/deduplicate-stage.ts +0 -34
  306. package/src/runtime/compact-stages/head-snap-stage.ts +0 -57
  307. package/src/runtime/compact-stages/index.ts +0 -23
  308. package/src/runtime/compact-stages/tail-capture-stage.ts +0 -77
  309. package/src/runtime/compact-stages/truncation-stage.ts +0 -74
  310. package/src/runtime/compaction-summary.ts +0 -278
  311. package/src/runtime/completion-guard.ts +0 -207
  312. package/src/runtime/concurrency.ts +0 -58
  313. package/src/runtime/crash-classification.ts +0 -229
  314. package/src/runtime/crash-recovery.ts +0 -577
  315. package/src/runtime/crew-agent-records.ts +0 -593
  316. package/src/runtime/crew-agent-runtime.ts +0 -62
  317. package/src/runtime/crew-broker-child.ts +0 -88
  318. package/src/runtime/crew-broker-client.ts +0 -673
  319. package/src/runtime/crew-broker-tokens.ts +0 -84
  320. package/src/runtime/crew-broker.ts +0 -1276
  321. package/src/runtime/crew-hooks.ts +0 -227
  322. package/src/runtime/cross-extension-rpc.ts +0 -143
  323. package/src/runtime/custom-tools/irc-tool.ts +0 -282
  324. package/src/runtime/custom-tools/submit-result-tool.ts +0 -102
  325. package/src/runtime/deadletter.ts +0 -47
  326. package/src/runtime/delivery-coordinator.ts +0 -211
  327. package/src/runtime/delta-conflict.ts +0 -348
  328. package/src/runtime/deterministic-ast.ts +0 -161
  329. package/src/runtime/diagnostic-export.ts +0 -171
  330. package/src/runtime/direct-run.ts +0 -45
  331. package/src/runtime/dwf-state-store.ts +0 -102
  332. package/src/runtime/dynamic-workflow-context.ts +0 -1016
  333. package/src/runtime/dynamic-workflow-runner.ts +0 -310
  334. package/src/runtime/effectiveness.ts +0 -90
  335. package/src/runtime/errors/crew-errors.ts +0 -162
  336. package/src/runtime/event-stream-bridge.ts +0 -98
  337. package/src/runtime/foreground-control.ts +0 -193
  338. package/src/runtime/foreground-watchdog.ts +0 -132
  339. package/src/runtime/global-worker-cap.ts +0 -96
  340. package/src/runtime/goal-achievement.ts +0 -148
  341. package/src/runtime/goal-evaluator.ts +0 -361
  342. package/src/runtime/goal-loop-runner.ts +0 -828
  343. package/src/runtime/goal-state-store.ts +0 -219
  344. package/src/runtime/green-contract.ts +0 -55
  345. package/src/runtime/group-join.ts +0 -267
  346. package/src/runtime/handoff-manager.ts +0 -598
  347. package/src/runtime/heartbeat-gradient.ts +0 -36
  348. package/src/runtime/heartbeat-watcher.ts +0 -239
  349. package/src/runtime/hidden-handoff.ts +0 -407
  350. package/src/runtime/important-line-classifier.ts +0 -140
  351. package/src/runtime/intercom-bridge.ts +0 -187
  352. package/src/runtime/iteration-hooks.ts +0 -305
  353. package/src/runtime/live-agent-control.ts +0 -136
  354. package/src/runtime/live-agent-manager.ts +0 -704
  355. package/src/runtime/live-control-realtime.ts +0 -56
  356. package/src/runtime/live-extension-bridge.ts +0 -148
  357. package/src/runtime/live-irc.ts +0 -97
  358. package/src/runtime/live-session-health.ts +0 -108
  359. package/src/runtime/live-session-runtime.ts +0 -1139
  360. package/src/runtime/loop-gates.ts +0 -128
  361. package/src/runtime/manifest-cache.ts +0 -375
  362. package/src/runtime/mcp-proxy.ts +0 -105
  363. package/src/runtime/metric-parser.ts +0 -36
  364. package/src/runtime/model-fallback.ts +0 -409
  365. package/src/runtime/model-resolver.ts +0 -126
  366. package/src/runtime/model-scope.ts +0 -158
  367. package/src/runtime/orphan-worker-registry.ts +0 -465
  368. package/src/runtime/output-validator.ts +0 -202
  369. package/src/runtime/overflow-recovery.ts +0 -206
  370. package/src/runtime/parallel-research.ts +0 -68
  371. package/src/runtime/parallel-utils.ts +0 -160
  372. package/src/runtime/parent-guard.ts +0 -134
  373. package/src/runtime/path-overlap.ts +0 -150
  374. package/src/runtime/peer-dep.ts +0 -292
  375. package/src/runtime/per-write-validator.ts +0 -181
  376. package/src/runtime/phase-progress.ts +0 -217
  377. package/src/runtime/phase-tracker.ts +0 -385
  378. package/src/runtime/pi-args.ts +0 -655
  379. package/src/runtime/pi-json-output.ts +0 -170
  380. package/src/runtime/pi-spawn.ts +0 -273
  381. package/src/runtime/pipeline-runner.ts +0 -523
  382. package/src/runtime/plan-templates.ts +0 -201
  383. package/src/runtime/policy-engine.ts +0 -115
  384. package/src/runtime/post-checks.ts +0 -142
  385. package/src/runtime/post-exit-stdio-guard.ts +0 -104
  386. package/src/runtime/process-lifecycle.ts +0 -491
  387. package/src/runtime/process-status.ts +0 -154
  388. package/src/runtime/progress-event-coalescer.ts +0 -44
  389. package/src/runtime/progress-tracker.ts +0 -124
  390. package/src/runtime/prose-compressor.ts +0 -162
  391. package/src/runtime/recovery-recipes.ts +0 -203
  392. package/src/runtime/replace.ts +0 -570
  393. package/src/runtime/resilient-edit.ts +0 -153
  394. package/src/runtime/result-extractor.ts +0 -213
  395. package/src/runtime/retry-executor.ts +0 -100
  396. package/src/runtime/retry-runner.ts +0 -336
  397. package/src/runtime/role-permission.ts +0 -59
  398. package/src/runtime/run-coalesced-task-group.ts +0 -308
  399. package/src/runtime/run-drift.ts +0 -219
  400. package/src/runtime/run-tracker.ts +0 -116
  401. package/src/runtime/runtime-policy.ts +0 -29
  402. package/src/runtime/runtime-resolver.ts +0 -172
  403. package/src/runtime/runtime-warmup.ts +0 -160
  404. package/src/runtime/scheduler.ts +0 -353
  405. package/src/runtime/semaphore.ts +0 -141
  406. package/src/runtime/sensitive-paths.ts +0 -93
  407. package/src/runtime/session-resources.ts +0 -25
  408. package/src/runtime/session-snapshot.ts +0 -59
  409. package/src/runtime/session-usage.ts +0 -79
  410. package/src/runtime/settings-store.ts +0 -155
  411. package/src/runtime/sidechain-output.ts +0 -35
  412. package/src/runtime/single-agent-compose.ts +0 -84
  413. package/src/runtime/skill-effectiveness.ts +0 -524
  414. package/src/runtime/skill-instructions.ts +0 -391
  415. package/src/runtime/stale-reconciler.ts +0 -680
  416. package/src/runtime/stream-preview.ts +0 -184
  417. package/src/runtime/streaming-output.ts +0 -50
  418. package/src/runtime/subagent-manager.ts +0 -561
  419. package/src/runtime/subprocess-tool-registry.ts +0 -70
  420. package/src/runtime/supervisor-contact.ts +0 -64
  421. package/src/runtime/task-display.ts +0 -52
  422. package/src/runtime/task-graph-scheduler.ts +0 -227
  423. package/src/runtime/task-graph.ts +0 -290
  424. package/src/runtime/task-health.ts +0 -83
  425. package/src/runtime/task-id.ts +0 -161
  426. package/src/runtime/task-output-context.ts +0 -602
  427. package/src/runtime/task-packet.ts +0 -268
  428. package/src/runtime/task-quality.ts +0 -199
  429. package/src/runtime/task-runner/capabilities.ts +0 -78
  430. package/src/runtime/task-runner/context-retrieval.ts +0 -163
  431. package/src/runtime/task-runner/live-executor.ts +0 -227
  432. package/src/runtime/task-runner/output-splitter.ts +0 -152
  433. package/src/runtime/task-runner/progress.ts +0 -157
  434. package/src/runtime/task-runner/prompt-builder.ts +0 -278
  435. package/src/runtime/task-runner/prompt-pipeline.ts +0 -88
  436. package/src/runtime/task-runner/result-utils.ts +0 -16
  437. package/src/runtime/task-runner/retrieval-orchestrator.ts +0 -310
  438. package/src/runtime/task-runner/run-projection.ts +0 -125
  439. package/src/runtime/task-runner/state-helpers.ts +0 -176
  440. package/src/runtime/task-runner/tail-read.ts +0 -34
  441. package/src/runtime/task-runner.ts +0 -1420
  442. package/src/runtime/team-runner-artifacts.ts +0 -13
  443. package/src/runtime/team-runner.ts +0 -1993
  444. package/src/runtime/tool-output-pruner.ts +0 -333
  445. package/src/runtime/tool-progress.ts +0 -278
  446. package/src/runtime/usage-tracker.ts +0 -73
  447. package/src/runtime/verification-gates.ts +0 -571
  448. package/src/runtime/verification-integrity.ts +0 -105
  449. package/src/runtime/verification-worktree.ts +0 -186
  450. package/src/runtime/worker-heartbeat.ts +0 -25
  451. package/src/runtime/worker-startup.ts +0 -83
  452. package/src/runtime/workflow-state.ts +0 -195
  453. package/src/runtime/workspace-lock.ts +0 -443
  454. package/src/runtime/workspace-tree.ts +0 -312
  455. package/src/runtime/yield-handler.ts +0 -224
  456. package/src/runtime/zombie-scanner.ts +0 -298
  457. package/src/schema/config-schema.ts +0 -327
  458. package/src/schema/team-tool-schema.ts +0 -415
  459. package/src/schema/validation-types.ts +0 -159
  460. package/src/skills/discover-skills.ts +0 -197
  461. package/src/skills/skill-templates.ts +0 -456
  462. package/src/skills/validate.ts +0 -285
  463. package/src/state/active-run-registry.ts +0 -439
  464. package/src/state/artifact-store.ts +0 -176
  465. package/src/state/atomic-write.ts +0 -903
  466. package/src/state/blob-store.ts +0 -308
  467. package/src/state/contracts.ts +0 -158
  468. package/src/state/crew-init.ts +0 -269
  469. package/src/state/decision-ledger.ts +0 -345
  470. package/src/state/event-log-rotation.ts +0 -342
  471. package/src/state/event-log.ts +0 -1311
  472. package/src/state/event-reconstructor.ts +0 -229
  473. package/src/state/gitignore-manager.ts +0 -46
  474. package/src/state/health-store.ts +0 -79
  475. package/src/state/hook-instinct-bridge.ts +0 -94
  476. package/src/state/hook-integrations.ts +0 -51
  477. package/src/state/instinct-store.ts +0 -275
  478. package/src/state/jsonl-writer.ts +0 -107
  479. package/src/state/locks.ts +0 -562
  480. package/src/state/mailbox.ts +0 -916
  481. package/src/state/observation-store.ts +0 -176
  482. package/src/state/run-cache.ts +0 -193
  483. package/src/state/run-graph.ts +0 -183
  484. package/src/state/run-metrics.ts +0 -165
  485. package/src/state/schedule.ts +0 -166
  486. package/src/state/session-state-map.ts +0 -51
  487. package/src/state/state-store.ts +0 -958
  488. package/src/state/task-claims.ts +0 -61
  489. package/src/state/tiered-eval.ts +0 -480
  490. package/src/state/types-eval.ts +0 -58
  491. package/src/state/types.ts +0 -440
  492. package/src/state/usage.ts +0 -138
  493. package/src/state/worker-atomic-writer.ts +0 -194
  494. package/src/subagents/async-entry.ts +0 -1
  495. package/src/subagents/index.ts +0 -3
  496. package/src/subagents/live/control.ts +0 -1
  497. package/src/subagents/live/manager.ts +0 -1
  498. package/src/subagents/live/realtime.ts +0 -1
  499. package/src/subagents/live/session-runtime.ts +0 -1
  500. package/src/subagents/manager.ts +0 -1
  501. package/src/subagents/spawn.ts +0 -1
  502. package/src/teams/discover-teams.ts +0 -187
  503. package/src/teams/team-config.ts +0 -27
  504. package/src/teams/team-serializer.ts +0 -38
  505. package/src/tools/safe-bash-extension.ts +0 -54
  506. package/src/tools/safe-bash.ts +0 -505
  507. package/src/types/diff.d.ts +0 -18
  508. package/src/types/new-api-types.ts +0 -35
  509. package/src/ui/agent-management-overlay.ts +0 -160
  510. package/src/ui/card-colors.ts +0 -139
  511. package/src/ui/crew-footer.ts +0 -102
  512. package/src/ui/crew-select-list.ts +0 -111
  513. package/src/ui/dashboard-panes/agents-pane.ts +0 -164
  514. package/src/ui/dashboard-panes/cancellation-pane.ts +0 -66
  515. package/src/ui/dashboard-panes/capability-pane.ts +0 -77
  516. package/src/ui/dashboard-panes/health-pane.ts +0 -31
  517. package/src/ui/dashboard-panes/mailbox-pane.ts +0 -35
  518. package/src/ui/dashboard-panes/metrics-pane.ts +0 -37
  519. package/src/ui/dashboard-panes/progress-pane.ts +0 -38
  520. package/src/ui/dashboard-panes/transcript-pane.ts +0 -10
  521. package/src/ui/deploy-bundled-themes.ts +0 -71
  522. package/src/ui/dwf-phase-display.ts +0 -151
  523. package/src/ui/dynamic-border.ts +0 -35
  524. package/src/ui/heartbeat-aggregator.ts +0 -74
  525. package/src/ui/key-utils.ts +0 -42
  526. package/src/ui/keybinding-map.ts +0 -248
  527. package/src/ui/layout-primitives.ts +0 -106
  528. package/src/ui/live-conversation-overlay.ts +0 -183
  529. package/src/ui/live-duration.ts +0 -55
  530. package/src/ui/live-run-sidebar.ts +0 -293
  531. package/src/ui/loaders.ts +0 -6
  532. package/src/ui/mascot.ts +0 -449
  533. package/src/ui/overlays/agent-picker-overlay.ts +0 -65
  534. package/src/ui/overlays/confirm-overlay.ts +0 -60
  535. package/src/ui/overlays/help-overlay.ts +0 -177
  536. package/src/ui/overlays/mailbox-compose-overlay.ts +0 -181
  537. package/src/ui/overlays/mailbox-compose-preview.ts +0 -78
  538. package/src/ui/overlays/mailbox-detail-overlay.ts +0 -154
  539. package/src/ui/pi-ui-compat.ts +0 -68
  540. package/src/ui/powerbar-publisher.ts +0 -459
  541. package/src/ui/render-coalescer.ts +0 -101
  542. package/src/ui/render-diff.ts +0 -160
  543. package/src/ui/render-scheduler.ts +0 -278
  544. package/src/ui/run-action-dispatcher.ts +0 -182
  545. package/src/ui/run-dashboard.ts +0 -904
  546. package/src/ui/run-event-bus.ts +0 -381
  547. package/src/ui/run-snapshot-cache.ts +0 -1057
  548. package/src/ui/settings-overlay.ts +0 -1067
  549. package/src/ui/shared-overlay-scheduler.ts +0 -96
  550. package/src/ui/snapshot-types.ts +0 -90
  551. package/src/ui/spinner.ts +0 -17
  552. package/src/ui/status-colors.ts +0 -143
  553. package/src/ui/syntax-highlight.ts +0 -136
  554. package/src/ui/terminal-status.ts +0 -269
  555. package/src/ui/theme-adapter.ts +0 -271
  556. package/src/ui/theme-discovery.ts +0 -199
  557. package/src/ui/tool-progress-formatter.ts +0 -93
  558. package/src/ui/tool-render.ts +0 -453
  559. package/src/ui/tool-renderers/brief-mode.ts +0 -225
  560. package/src/ui/tool-renderers/index.ts +0 -726
  561. package/src/ui/transcript-cache.ts +0 -128
  562. package/src/ui/transcript-entries.ts +0 -256
  563. package/src/ui/transcript-viewer.ts +0 -424
  564. package/src/ui/widget/index.ts +0 -391
  565. package/src/ui/widget/widget-formatters.ts +0 -182
  566. package/src/ui/widget/widget-model.ts +0 -110
  567. package/src/ui/widget/widget-renderer.ts +0 -182
  568. package/src/ui/widget/widget-types.ts +0 -36
  569. package/src/utils/bm25-search.ts +0 -235
  570. package/src/utils/completion-dedupe.ts +0 -63
  571. package/src/utils/conflict-detect.ts +0 -668
  572. package/src/utils/env-allowlist.ts +0 -30
  573. package/src/utils/env-filter.ts +0 -155
  574. package/src/utils/file-coalescer.ts +0 -98
  575. package/src/utils/fingerprint.ts +0 -180
  576. package/src/utils/frontmatter.ts +0 -70
  577. package/src/utils/fs-watch.ts +0 -37
  578. package/src/utils/gh-protocol.ts +0 -556
  579. package/src/utils/git.ts +0 -260
  580. package/src/utils/guards.ts +0 -107
  581. package/src/utils/ids.ts +0 -24
  582. package/src/utils/incremental-reader.ts +0 -220
  583. package/src/utils/internal-error.ts +0 -10
  584. package/src/utils/names.ts +0 -36
  585. package/src/utils/ndjson.ts +0 -115
  586. package/src/utils/paths.ts +0 -227
  587. package/src/utils/project-detector.ts +0 -160
  588. package/src/utils/redaction.ts +0 -347
  589. package/src/utils/resolve-shell.ts +0 -36
  590. package/src/utils/run-watcher-registry.ts +0 -152
  591. package/src/utils/safe-paths.ts +0 -383
  592. package/src/utils/scan-cache.ts +0 -144
  593. package/src/utils/session-utils.ts +0 -110
  594. package/src/utils/sleep.ts +0 -54
  595. package/src/utils/socket-path.ts +0 -127
  596. package/src/utils/sse-parser.ts +0 -129
  597. package/src/utils/task-name-generator.ts +0 -337
  598. package/src/utils/timings.ts +0 -33
  599. package/src/utils/token-counter.ts +0 -200
  600. package/src/utils/visual.ts +0 -207
  601. package/src/workflows/cost-estimator.ts +0 -34
  602. package/src/workflows/discover-workflows.ts +0 -290
  603. package/src/workflows/intermediate-store.ts +0 -166
  604. package/src/workflows/preflight-validator.ts +0 -168
  605. package/src/workflows/topology-analyzer.ts +0 -203
  606. package/src/workflows/validate-workflow.ts +0 -50
  607. package/src/workflows/workflow-config.ts +0 -70
  608. package/src/workflows/workflow-serializer.ts +0 -32
  609. package/src/worktree/branch-freshness.ts +0 -112
  610. package/src/worktree/cleanup.ts +0 -341
  611. package/src/worktree/worktree-manager.ts +0 -1200
@@ -1,287 +0,0 @@
1
- # Performance Review — pi-crew v0.9.17 (2026-07-02)
2
-
3
- > Deep-dive review toàn bộ codebase (~434 file TS, ~82.7k dòng) tập trung vào hiệu năng.
4
- > Mọi phát hiện đều có file:line cụ thể và đã được xác minh trực tiếp trên source.
5
- > Bổ sung cho `docs/perf/final-report-2026-05.md` và `docs/optimization-plan.md` (các vòng tối ưu trước).
6
- >
7
- > **Cập nhật sau pull v0.9.17**: ban đầu review trên v0.9.16, sau đó user pull 40 commits mới
8
- > (`1418fa7..22a8e72`, ~20k dòng thay đổi trong `src/`). Mọi phát hiện đã được re-verify trên
9
- > code mới. Xem thêm [§5 — Delta v0.9.17](#5-delta-v0917--những-gì-đã-fix-và-regressed).
10
-
11
- ## 1. Đánh giá tổng quan
12
-
13
- ### Điểm mạnh (đã làm tốt)
14
-
15
- | Hạng mục | Bằng chứng |
16
- |---|---|
17
- | Render path zero-fs-IO | `register.ts:1744+` — renderTick chỉ đọc từ frame preload, không chạm disk |
18
- | Snapshot cache 2 tầng (TTL 1.5s + stamp mtime/size) | `run-snapshot-cache.ts:21-25, 79-97` — tail-read 32KB, không bao giờ parse full events.jsonl |
19
- | Event tail đọc theo byte-offset | `utils/incremental-reader.ts:23` — `readJsonlSince` dùng openSync/readSync từ offset |
20
- | Concurrency có hard cap | `config/defaults.ts:46-56` — hardCap 8, per-workflow 2-4, enforced qua `mapConcurrent` |
21
- | Capture stdout/stderr bounded | `child-pi.ts:53` — tail cap 512KiB, có backpressure soft watermark 256KiB |
22
- | Timer nền đều `unref()` | auto-repair, temp-reconcile, notifier — không giữ event loop |
23
- | Watcher bounded theo active runs | `register.ts:1690-1706` — reconcile watcher chỉ O(active runs) |
24
- | Lazy import có kỷ luật | `// LAZY:` markers + `npm run check:lazy-imports` |
25
-
26
- Kiến trúc 3 layer rõ ràng, defensive coding tốt (CAS, lock, terminal-state guard). Vấn đề hiệu năng chủ yếu KHÔNG nằm ở thuật toán mà ở **tần suất lặp lại của I/O đồng bộ nhỏ** trên hot path.
27
-
28
- ### Điểm yếu tổng quát
29
-
30
- 1. **State layer ghi-toàn-file + fsync per-event**: mỗi thay đổi status của 1 task ghi lại toàn bộ tasks.json (pretty-printed), mỗi event append kèm 1 fsync + 1 atomic write sidecar.
31
- 2. **Cache tồn tại nhưng tự vô hiệu hóa**: manifest cache bị global-generation invalidation, discovery cache TTL 500ms, config hoàn toàn không cache.
32
- 3. **Sync I/O chặn event loop**: `execFileSync` (git), `withRunLockSync` + `sleepSync`, `statSync` chuỗi — chạy trong extension host của Pi, chặn cả UI.
33
- 4. **Hạ tầng batching/coalescing đã viết nhưng không được dùng**: `appendEventBuffered`, `saveRunTasksCoalesced` đều 0 call site.
34
-
35
- ---
36
-
37
- ## 2. Phát hiện chi tiết theo layer
38
-
39
- ### 2.1 State layer
40
-
41
- #### F1 — HIGH: Global generation counter phá cache của TẤT CẢ runs
42
- - `src/state/state-store.ts:73, 125-128`
43
- ```ts
44
- let manifestCacheGeneration = 0;
45
- function invalidateRunCache(stateRoot: string): void {
46
- manifestCache.delete(stateRoot);
47
- manifestCacheGeneration++; // <-- vô hiệu hóa MỌI entry, không chỉ run này
48
- }
49
- ```
50
- - Cache hit yêu cầu `cached.generation === manifestCacheGeneration` (`:589, :685`). Mỗi `saveRunTasks`/`saveRunManifest` của BẤT KỲ run nào đều bump counter, nên khi có 1 run active, hit-rate của cache sụp về ~0. Mỗi miss = 2 statSync + 2 readFileSync + JSON.parse trong retry loop tối đa 5 vòng (`:617-631`).
51
- - **Fix đề xuất**: generation counter per-stateRoot (`Map<string, number>`) thay vì global. Mtime/size check đã đủ chống spoof cho từng entry.
52
-
53
- #### F2 — HIGH: `persistSingleTaskUpdate` — sync CAS loop tối đa 100 vòng, mỗi vòng đọc lại full state
54
- - `src/runtime/task-runner/state-helpers.ts:28-110`, gọi tại `task-runner.ts:233, 424, 538, 617, 1347` (mỗi lần task đổi status/checkpoint)
55
- ```ts
56
- return withRunLockSync(manifest, () => {
57
- retryLoop: for (let attempt = 0; attempt < 100; attempt++) {
58
- const latest = loadRunManifestById(manifest.cwd, manifest.runId)?.tasks ?? fallbackTasks;
59
- // ... 3x statSync mtime check ...
60
- ```
61
- - Toàn bộ sync, dưới `withRunLockSync` (poll bằng `sleepSync` chặn event loop). Kết hợp F1 (cache lạnh) nghĩa là mỗi checkpoint = lock + full read manifest.json + tasks.json + full rewrite tasks.json.
62
- - **Fix đề xuất**: (a) đã cầm run lock thì mtime-CAS 3 lần stat là thừa — lock loại trừ writer khác cùng process-tree, chỉ cần 1 lần đọc + 1 lần ghi; (b) chuyển sang async variant; (c) giữ tasks in-memory per-run và chỉ ghi diff-triggered.
63
-
64
- #### F3 — HIGH → PARTIALLY FIXED (v0.9.17): Mỗi event append = fsync + atomic-write sidecar `.seq`
65
- - `src/state/event-log.ts:583-611` (sync path không đổi)
66
- ```ts
67
- fs.appendFileSync(eventsPath, `${JSON.stringify(redactSecrets(fullEvent))}\n`, "utf-8");
68
- const fd = fs.openSync(eventsPath, "r+");
69
- fs.fsyncSync(fd); ...
70
- persistSequence(eventsPath, seq); // full atomicWriteFile của .seq mỗi event
71
- ```
72
- - **Đã fix một phần (v0.9.17)**: `appendEventBuffered` giờ đã có call site — `task.progress` trong
73
- `task-runner.ts:395` và `team-runner.ts:1054` đi qua buffered path (coalesce 20ms, 1 lock acquire).
74
- Bench trong code comment: p95 producer giảm từ ~13µs → ~0µs. Tuy nhiên:
75
- - Các event terminal/vài event khác vẫn đi `appendEvent`/`appendEventAsync` → per-event fsync + `.seq` sidecar.
76
- - `persistSequence` vẫn ghi sidecar per event (trong batch, gọi tuần tự trong lock nhưng mỗi event 1 lần).
77
- - **Fix đề xuất còn lại**: chỉ fsync cho terminal events (`TERMINAL_EVENT_TYPES`); persist `.seq` theo batch
78
- hoặc mỗi N events (recovery scan đã tự sửa được khi sidecar tụt hậu); mở rộng `appendEventBuffered`
79
- cho thêm các event loại informational (`task.checkpoint`, `worker.lifecycle`, ...).
80
-
81
- #### F4 — HIGH → REGRESSED (v0.9.17): tasks.json ghi lại toàn bộ, pretty-printed, mỗi thay đổi + fsync data+dir
82
- - `state-store.ts:365-377` → `atomicWriteJson` dùng `JSON.stringify(value, null, 2)` (`atomic-write.ts:523`).
83
- - Task graph chứa attempts, verification, usage, diagnostics per task → file lớn dần trong run dài; stringify + write cost tỉ lệ O(tổng state) cho MỖI thay đổi 1 field.
84
- - **REGRESSED (v0.9.17, commit `13f4490`)**: `atomicWriteFile` giờ thêm `fs.fsyncSync(fd)` trên data file
85
- (`atomic-write.ts:384`) **và** `fs.fsyncSync(dirFd)` trên parent directory (`:410`, POSIX only).
86
- Mỗi `atomicWriteJson` call = write + fsync(data) + fsync(dir) + rename. Comment trong code ước lượng
87
- "~1ms per write" nhưng thực tế trên Windows fsync đắt hơn nhiều; CI timeout đã phải bump 600s→900s
88
- chính vì overhead này (`9bbeb45`). `persistSingleTaskUpdate` (F2) gọi `saveRunTasks` ~5 lần mỗi task,
89
- mỗi lần giờ tốn thêm 2× fsync.
90
- - `saveRunTasksCoalesced` (50ms debounce) đã có tại `state-store.ts:428` nhưng **vẫn 0 call site** (v0.9.17 xác nhận).
91
- - **Fix đề xuất**: bỏ pretty-print cho tasks.json (giữ cho manifest nếu cần đọc tay), wire `saveRunTasksCoalesced`
92
- vào checkpoint path (checkpoint là informational, mất 50ms cuối khi crash chấp nhận được vì đã có crash-recovery);
93
- cân nhắc fsync chỉ trên terminal write (manifest final), không phải mỗi checkpoint.
94
-
95
- #### F5 — MEDIUM: `isSymlinkSafePath` walk toàn bộ ancestor chain, chạy 2 lần mỗi atomic write
96
- - `atomic-write.ts:43-56, 287, 359-361`: mỗi write = 2 × (lstatSync per path level đến root). Với path sâu điển hình `.crew/state/runs/{runId}/` là ~10+ lstat × 2 mỗi write, nhân với mọi finding ở trên.
97
- - `withFileLockSync` còn gọi lại check này MỖI vòng retry (`locks.ts:319`).
98
- - **Fix đề xuất**: cache kết quả validate theo (dirname, generation) trong process — thư mục cha của state root không đổi trong suốt run; chỉ re-validate khi ghi vào path mới.
99
-
100
- #### F6 — HIGH → REGRESSED (v0.9.17): Mailbox — mỗi message = 2 lock + full rewrite delivery.json + lstat chain × 3 + fsync data+dir
101
- - `src/state/mailbox.ts:380-430`: `mailboxFile(...)` tính lại 3 lần (mỗi lần re-run lstat validation), `writeDeliveryState` (`:353`) sort đến 10k entries + atomic rewrite toàn bộ pretty-printed delivery.json cho MỖI message.
102
- - **REGRESSED (v0.9.17)**: `atomicWriteFile` giờ fsync data + parent dir (commit `13f4490`), nên mỗi delivery.json rewrite tốn thêm 2× fsync. CI flake mailbox-replay chính là lý do commit này tồn tại, nhưng代价 là mọi write path đều nặng hơn.
103
- - Reads: `safeReadMailboxFile` (`:246`) readdirSync tìm archive MỖI lần đọc; `readAllMessages` (`:321`) O(tasks × dir entries); `updateMailboxMessageReply` (`:463`) quét mọi mailbox file, mỗi file full read + full rewrite.
104
- - **Fix đề xuất**: delivery state chuyển sang append-only JSONL + compaction (giống events), hoặc ít nhất coalesce write; cache danh sách archive theo mtime của dir; chỉ fsync khi reply/terminal, không phải mỗi informational message.
105
-
106
- #### F7 — MEDIUM/HIGH: active-run-registry O(N runs) full manifest parse mỗi register/unregister
107
- - `active-run-registry.ts:249-344`: `filterAliveEntries` đọc + parse manifest.json của từng run, 2× existsSync + 2× symlink walk + `process.kill(pid,0)` per entry; `registerActiveRun` gọi 2 lần; `unregisterActiveRun` chạy trên MỖI terminal transition (`state-store.ts:508`). Registry còn ghi 2 định dạng (JSON + binary mirror) = 4 temp-file ops mỗi update (`:183`).
108
- - **Fix đề xuất**: liveness chỉ cần pid probe + heartbeat stat, không cần parse manifest; bỏ dual-format write nếu binary mirror không còn consumer.
109
-
110
- ### 2.2 Runtime / process layer
111
-
112
- #### F8 — HIGH: Worktree prep = 5-6 git subprocess `execFileSync` tuần tự + full checkout, chặn event loop
113
- - `src/worktree/worktree-manager.ts:1,30,331-425`: mỗi task cần worktree chạy lần lượt `rev-parse --show-toplevel`, `status --porcelain` trên leader repo (O(repo size)), `worktree list --porcelain`, `worktree prune`, `rev-parse --verify`, `worktree add -b ... HEAD`. Tất cả `execFileSync` → dù tasks chạy "song song" qua `mapConcurrent`, phần chuẩn bị worktree bị serialize và chặn toàn bộ extension host (UI đơ theo).
114
- - Reuse path vẫn tốn `worktree list` + `status` + leader `status` lần 2. Cleanup gọi lại `findGitRoot` 3 lần (tới 6 git spawn).
115
- - **v0.9.17 note**: M6 coalesce (`coalesceMicroTasks`) giảm số spawn cho workflow có nhiều task nhỏ read-only (3 task → 1 child + 1 worktree), nhưng bản thân worktree prep vẫn sync. Khi M6 mở rộng sang mutating roles, vấn đề sẽ tái xuất.
116
- - **Fix đề xuất**: (a) chuyển sang `execFile` async (promisify) — thay đổi cục bộ, tác động lớn nhất; (b) cache `findGitRoot`/`assertCleanLeader` per (repo, batch) — leader status chỉ cần check 1 lần mỗi batch chứ không phải mỗi task; (c) cân nhắc `git worktree add --no-checkout` + sparse checkout cho task chỉ đọc một phần repo.
117
-
118
- #### F9 — HIGH: `ChildPiLineObserver` giữ mảng không giới hạn trong suốt run
119
- - `child-pi.ts` (~:528): `rawTextEvents` push mọi fragment assistant-text KHÔNG cap ("RAW (uncapped)"), chỉ dùng entry cuối qua `getRawFinalText()`. `intermediateFindings` cũng push-only, chỉ trim khi đọc (`slice(-20)`).
120
- - Run dài + worker nói nhiều = memory tăng tuyến tính theo output, nhân với số worker song song.
121
- - **Fix đề xuất**: giữ tối đa N entry cuối ngay khi push (ring buffer), vì consumer chỉ cần tail.
122
-
123
- #### F10 — MEDIUM: Double JSON.parse mỗi dòng stdout + sync transcript write per line
124
- - Mỗi JSON line từ child bị parse 2 lần (`emitLine` → `extractText` và `compactChildPiLine`).
125
- - `appendTranscript` (`child-pi.ts:387-414`): mỗi dòng = realpath validation + openSync/writeSync/closeSync. Nên parse 1 lần rồi truyền object; giữ fd mở per-task (mở 1 lần, đóng khi task kết thúc) và validate path 1 lần.
126
-
127
- #### F11 — MEDIUM: `appendBoundedTail` rebuild chuỗi O(cap) mỗi dòng
128
- - `child-pi.ts:53, 927, 1121`: `current + chunk` rồi slice với cap 512KiB → copy ~512KB mỗi dòng khi buffer đầy. Fix: array-of-chunks + tổng byte, chỉ join khi đọc.
129
-
130
- #### F12 — MEDIUM: Latency floor 5s mỗi task thành công (final-drain)
131
- - `finalDrainMs = 5000` (`defaults.ts:13`): sau final assistant event, chờ 5s rồi mới SIGTERM child. Workflow 5 task tuần tự cộng thêm ~25s chết. Fix: khi đã nhận `message_end` + stopReason=stop, rút xuống 1-1.5s, hoặc drain kết thúc sớm khi stdout im lặng >300ms.
132
-
133
- #### F13 — MEDIUM: Interrupt guard poll 250ms sync fs suốt đời background run
134
- - `background-runner.ts:144`: existsSync + readFileSync + JSON.parse foreground-control.json mỗi 250ms, per background run (4 Hz × N runs). Fix: `fs.watch` file cha + fallback poll thưa (2s), hoặc chỉ stat mtime trước khi read.
135
-
136
- #### F14 — MEDIUM: Temp-reconcile parse cùng manifest tới 4 lần mỗi tick
137
- - `stale-reconciler.ts:516-700`: tick 5 phút, batch 50 dirs, nhưng mỗi dir parse manifest.json + tasks.json rồi re-scan thêm tối đa 3 pass cho TOCTOU check. Fix: đọc 1 lần, truyền parsed object qua các pass, chỉ re-stat mtime để phát hiện thay đổi.
138
-
139
- #### F15 — MEDIUM: Discovery cache TTL 500ms gần như vô dụng ở steady state
140
- - `discover-agents.ts:453`: TTL 500ms → scheduler loop re-scan 4 thư mục (readdir + readFile + ~12 regex pass sanitize mỗi file .md) ~2 lần/giây. `discoverTeams`/`discoverWorkflows` **không có cache nào**.
141
- - **Fix đề xuất**: nâng TTL lên 5-10s kèm invalidation theo mtime của các dir gốc (stat dir rẻ hơn nhiều so với scan), dùng chung 1 cache module cho cả agents/teams/workflows.
142
-
143
- ### 2.3 Extension / UI layer
144
-
145
- #### F16 — HIGH: `loadConfig()` không có cache, bị gọi trên mọi hot path
146
- - `config/config.ts:1358-1425`: mỗi lần gọi = tới 4 file (legacy, user, `.crew/config.json`, `.pi/pi-crew.json`) × (existsSync + statSync + readFileSync + JSON.parse với reviver) + full TypeBox `Value.Check` + nhiều pass sanitize/merge.
147
- - Caller trên hot path:
148
- - Preload tick: `register.ts:1684` — 1 Hz idle, ~6 Hz khi có run active
149
- - **Mỗi write/edit tool_result**: `register.ts:2088` (`perWriteValidation` check)
150
- - Mỗi subagent completion (`register.ts:265`), mỗi notification
151
- - **Fix đề xuất (quick win lớn nhất)**: cache mtime+TTL giống pattern `manifest-cache.ts` đã có sẵn trong repo. Stat 4 file (~4 syscall) thay vì parse + validate lại. Ước lượng loại bỏ hàng nghìn parse/validate mỗi phiên.
152
-
153
- #### F17 — HIGH: Powerbar re-scan toàn bộ workflows tới ~5 lần/giây khi run active
154
- - `ui/powerbar-publisher.ts:215`:
155
- ```ts
156
- const workflows = allWorkflows(discoverWorkflows(run.cwd));
157
- ```
158
- - Chạy trong `updatePiCrewPowerbar` (coalesce 200ms). `discoverWorkflows` = 2× readdirSync × 3 roots + readFileSync + regex-parse mọi `.workflow.md`, không cache. Fix: TTL cache 5-10s như F15, hoặc chỉ resolve workflow 1 lần khi run bắt đầu (workflow của run không đổi giữa chừng).
159
-
160
- #### F18 — MEDIUM: Preload loop không bao giờ nghỉ khi idle
161
- - `register.ts:1727-1741`: tick 1 Hz kể cả khi 0 run, mỗi tick gọi `loadConfig` (F16) + `manifestCache.list(20)` (list-cache TTL chỉ 500ms tại `manifest-cache.ts:36` → readdirSync + statSync per manifest gần như mỗi tick). Fix: khi N tick liên tiếp không có run active và không có event bus activity, giãn xuống 5-10s hoặc dừng hẳn, đánh thức bằng event-bus/`run` action.
162
-
163
- #### F19 — MEDIUM: `mailboxStamp` O(N task dirs) statSync mỗi lần check stale
164
- - `run-snapshot-cache.ts:110-129`: mỗi refresh check = readdirSync(mailbox/tasks) + 2 statSync per task dir, sync trên UI path. Code đã từng bỏ per-agent output stamp vì lý do này (comment `:604-608`) nhưng mailbox stamp còn giữ pattern cũ. Fix: 1 stamp file tổng do writer touch, hoặc dựa vào event-bus invalidation (đã có) và bỏ stamp mailbox.
165
-
166
- #### F20 — LOW/MEDIUM: `delivery.json` parse 2 lần, `outbox.jsonl` tail-read 2 lần mỗi snapshot rebuild
167
- - `run-snapshot-cache.ts:484, 507`. Fix: đọc 1 lần, chia sẻ kết quả giữa `mailboxFrom` và `groupJoinsFrom`.
168
-
169
- #### F21 — MEDIUM: `async-notifier` full `readEvents` mỗi 5s cho run nghi ngờ chết
170
- - `async-notifier.ts:74`: `markDeadAsyncRunIfNeeded` đọc + parse toàn bộ events.jsonl (tới 50MB). Fix: dùng `readEventsCursor` với byte offset lưu lại, hoặc chỉ cần tail vài KB cuối để tìm terminal event.
171
-
172
- ---
173
-
174
- ## 3. Kế hoạch tối ưu đề xuất (ưu tiên theo tác động / rủi ro)
175
-
176
- ### Đợt 1 — Quick wins (thay đổi cục bộ, rủi ro thấp, tác động lớn)
177
-
178
- | # | Việc | File | Tác động |
179
- |---|---|---|---|
180
- | 1 | Cache `loadConfig` theo mtime+TTL (2s) | config.ts | Loại bỏ nguồn CPU lặp lại lớn nhất ở extension layer (F16) |
181
- | 2 | Generation counter per-stateRoot | state-store.ts | Khôi phục hit-rate manifest cache khi run active (F1) |
182
- | 3 | TTL cache cho `discoverWorkflows`/`discoverTeams`, nâng TTL agents lên 5-10s + mtime dir check | discover-*.ts | Diệt 5 Hz scan của powerbar (F17) + steady-state scan (F15) |
183
- | 4 | Bỏ pretty-print cho tasks.json | atomic-write.ts caller | Giảm ~40-60% byte ghi mỗi update (F4) |
184
- | 5 | Ring-buffer cho `rawTextEvents`/`intermediateFindings` | child-pi.ts | Chặn memory growth run dài (F9) |
185
- | 6 | Giảm `finalDrainMs` 5000 → 1500 (config đã có sẵn override) | defaults.ts | Bớt 3.5s/task latency (F12) |
186
- | 7 | Đọc delivery.json/outbox 1 lần mỗi snapshot rebuild | run-snapshot-cache.ts | (F20) |
187
-
188
- ### Đợt 2 — Batching và giảm fsync (cần chạy lại integration tests)
189
-
190
- | # | Việc | Tác động |
191
- |---|---|---|
192
- | 8 | Wire `appendEventBuffered` cho event không-terminal; fsync chỉ terminal events; persist `.seq` mỗi N events | Giảm mạnh syscall/fsync per event (F3), hạ tầng đã viết sẵn |
193
- | 9 | Wire `saveRunTasksCoalesced` vào checkpoint path của task-runner | Gộp burst checkpoint writes (F4) |
194
- | 10 | Đơn giản hóa `persistSingleTaskUpdate`: bỏ mtime-CAS khi đã cầm run lock, chuyển async | Bỏ 3× statSync + retry loop 100 vòng (F2) |
195
- | 11 | Cache kết quả `isSymlinkSafePath` theo dirname trong process | Bỏ 2× ancestor lstat walk mỗi write (F5) |
196
- | 12 | Idle backoff cho preload loop + nâng list-cache TTL khi idle | (F18) |
197
-
198
- ### Đợt 3 — Cấu trúc (cần thiết kế, test kỹ)
199
-
200
- | # | Việc | Tác động |
201
- |---|---|---|
202
- | 13 | Chuyển worktree-manager sang async `execFile`, cache leader-status per batch | Hết chặn event loop khi fanout, worktree prep song song thật (F8) |
203
- | 14 | Mailbox delivery-state append-only + compaction; archive-list cache | (F6) |
204
- | 15 | Registry liveness không cần parse manifest; bỏ dual-format write | (F7) |
205
- | 16 | In-memory task state per active run (write-through), disk chỉ là bản persist | Về lâu dài loại bỏ read-modify-write cycle hoàn toàn (F1/F2/F4) |
206
- | 17 | `readEvents` mặc định đi qua cursor/tail; notifier dùng offset | (F21, F6 read path) |
207
-
208
- ### Cách đo và nghiệm thu
209
-
210
- - Repo đã có `src/benchmark/` — thêm micro-bench cho: `loadConfig` (trước/sau cache), `persistSingleTaskUpdate` (thời gian/syscall mỗi checkpoint), `appendEvent` throughput (events/s), worktree prep wall-time với N task song song.
211
- - Đo end-to-end: `time` của 1 run `fast-fix` scaffold-mode (loại bỏ nhiễu model) trước/sau từng đợt.
212
- - Windows là môi trường nhạy nhất (fsync, spawn, stat đều đắt hơn) — benchmark trên Windows trước.
213
- - Sau mỗi đợt: `npm run typecheck` + `npm test` + `npm run check:lazy-imports`.
214
-
215
- ### Ước lượng tác động tổng
216
-
217
- - Đợt 1: giảm rõ CPU nền khi idle (config parse 1 Hz → 0), powerbar scan (5 Hz → ~0), latency mỗi task -3.5s, memory ổn định cho run dài.
218
- - Đợt 2: giảm 5-10× số syscall/fsync trên đường ghi state trong run active (mỗi task hiện tốn ~5 checkpoint × [lock + 2 read + 3 stat + full rewrite] + ~10-20 event × [fsync + sidecar write]).
219
- - Đợt 3: hết hiện tượng UI đơ khi fanout worktree trên repo lớn; state layer scale theo số run/task.
220
-
221
- ---
222
-
223
- ## 4. Ghi chú không phải hiệu năng (quan sát thêm)
224
-
225
- - `PluginRegistry` builtin trong team-runner.ts được register nhưng chưa có integration point (chính comment trong code thừa nhận) — dead weight nhỏ.
226
- - Nhiều file lớn >1500 dòng (register.ts 79KB, team-runner.ts 69KB) — không phải vấn đề runtime nhưng làm chậm typecheck/test và khó review; đã có xu hướng tách (`team-tool/*.ts`), nên tiếp tục.
227
- - Sync lock với `sleepSync` (locks.ts:244, event-log.ts:143) chặn event loop khi contention — Đợt 2/3 nên ưu tiên các async variant đã có sẵn.
228
-
229
- ---
230
-
231
- ## 5. Delta v0.9.17 — những gì đã fix và regressed
232
-
233
- > 40 commits pulled (`1418fa7..22a8e72`), ~20k dòng thay đổi trong `src/`.
234
- > Re-verify từng phát hiện trên code mới. Bảng tổng hợp:
235
-
236
- ### 5.1 Đã cải thiện (positive)
237
-
238
- | Commit | Thay đổi | Tác động hiệu năng |
239
- |---|---|---|
240
- | `task-runner.ts:395`, `team-runner.ts:1054` | `appendEventBuffered` wired cho `task.progress` | **F3 partial fix** — event tần suất cao nhất giờ coalesce 20ms, 1 lock acquire. p95 producer ~0µs (bench trong comment). Terminal events vẫn per-fsync. |
241
- | `21ac434` M6 coalesce micro-tasks | `coalesceMicroTasks` workflow flag + `coalesce-tasks.ts` | Giảm số child process spawn khi workflow có nhiều task nhỏ read-only (3 task → 1 spawn). Trực tiếp giảm F8/F9/F12 cho workload phù hợp. |
242
- | `0543966` M5 serialize on write-path overlap | `path-overlap.ts` | Tránh conflict khi 2 task song song ghi cùng file. Không phải tối ưu tốc độ nhưng giảm retry/conflict overhead. |
243
- | `48aae01` L4 trim dependency output | `task-output-context.ts` + `MAX_TOTAL_DEP_INLINE_BYTES` | Giảm context size truyền cho child → giảm prompt build cost + model input tokens. |
244
- | `8a68825`+`06f16d7` Bundle as default entry | `dist/index.mjs` 2.9MB, esbuild | **Cold-start −31.6%** (2509ms → 1717ms p50, bench `scripts/bench-cold-start.mjs`). Tác động lớn nhất đến latency khởi động. |
245
- | `5281074` Split register.ts | `registration/{lifecycle,observability,ui}.ts` + LAZY markers | Giảm module-graph warmup cost; lazy import boundary rõ hơn. |
246
- | `cbaa572` Drop withRunLock from catch path | `team-runner.ts` | Sửa closeout lock race (run.completed rồi run.failed 500ms sau). Không phải perf nhưng sửa 1 nguồn spurious failed run → giảm retry waste. |
247
-
248
- ### 5.2 Đã regressed (negative)
249
-
250
- | Commit | Thay đổi | Tác động |
251
- |---|---|---|
252
- | `13f4490` fsync data + parent dir | `atomic-write.ts:384,410` | **F4 + F6 regressed** — mỗi `atomicWriteFile` giờ thêm `fs.fsyncSync(fd)` + `fs.fsyncSync(dirFd)` (POSIX). CI timeout phải bump 600s→900s (`9bbeb45`). `persistSingleTaskUpdate` gọi ~5 lần mỗi task × 2 fsync = +10 fsync/task. Trên Windows fsync đặc biệt đắt. |
253
- | `test:integration` timeout 120s→300s | `22a8e72` | Phản ánh tổng overhead tăng do fsync + bundle + M6. |
254
-
255
- ### 5.3 Không đổi (xác nhận vẫn còn trên v0.9.17)
256
-
257
- | Finding | Trạng thái | Bằng chứng |
258
- |---|---|---|
259
- | F1 — global generation counter | **Vẫn còn** | `state-store.ts:132` `manifestCacheGeneration++` |
260
- | F2 — persistSingleTaskUpdate 100-iteration sync CAS | **Vẫn còn** | `state-helpers.ts:57` `attempt < 100` |
261
- | F4 — saveRunTasksCoalesced 0 caller | **Vẫn còn** | grep toàn src, chỉ definition tại `state-store.ts:428` |
262
- | F5 — isSymlinkSafePath ancestor walk ×2 | **Vẫn còn** | `atomic-write.ts` không đổi logic validate |
263
- | F8 — worktree execFileSync | **Vẫn còn** | `worktree-manager.ts:1,33` — `execFileSync` unchanged |
264
- | F9 — rawTextEvents unbounded | **Vẫn còn** | `child-pi.ts:600` `private readonly rawTextEvents: string[] = []` |
265
- | F12 — finalDrainMs 5000 | **Vẫn còn** | `defaults.ts:13` `finalDrainMs: 5000` |
266
- | F15 — discovery cache TTL 500ms | **Vẫn còn** | `discover-agents.ts:493` `DISCOVERY_CACHE_TTL_MS = 500` |
267
- | F16 — loadConfig không cache | **Vẫn còn** | `config.ts` không có configCache (grep confirmed) |
268
- | F17 — discoverWorkflows không cache, gọi ~5Hz | **Vẫn còn** | `powerbar-publisher.ts:284` `discoverWorkflows(run.cwd)` — không cache trong discover-workflows.ts (grep confirmed) |
269
- | F21 — async-notifier full readEvents | **Vẫn còn** | `async-notifier.ts:90` `readEvents(run.eventsPath)` |
270
-
271
- ### 5.4 Khuyến nghị cập nhật cho Đợt 1
272
-
273
- Sau v0.9.17, thứ tự ưu tiên Đợt 1 cần điều chỉnh:
274
-
275
- 1. **F4 fsync mitigation** (NEW urgent): thêm tham số `durability: "full" | "best-effort"` cho `atomicWriteJson`.
276
- Checkpoint/informational writes dùng `best-effort` (bỏ fsync data+dir, chỉ rename). Terminal/manifest writes giữ `full`.
277
- Đây là fix nhanh nhất cho regression `13f4490` mà không mất durability cho data quan trọng.
278
- 2. **F16 loadConfig cache** (giữ #1): vẫn là quick win lớn nhất, không bị ảnh hưởng bởi pull.
279
- 3. **F1 generation per-stateRoot** (giữ #2): không đổi.
280
- 4. **F3 expand buffered events** (nâng hạng): đã có hạ tầng, chỉ cần mở rộng cho thêm event types.
281
- 5. Các mục #3-#7 còn lại trong Đợt 1 không đổi.
282
-
283
- ### 5.5 Ghi chú thêm
284
-
285
- - `atomic-write-v2.ts` đã xuất hiện (file mới, `fs.fsyncSync` tại `:30`) nhưng grep `atomic-write-v2` trên toàn `src/` trả về **0 import** — có vẻ là work-in-progress hoặc dead code. Cần xác minh xem có plan migrate không.
286
- - Bundle entry (`dist/index.mjs`) là default từ v0.9.17. Nếu `dist/` không tồn tại (dev clone), fallback sang strip-types. Bundle giảm cold-start nhưng **không ảnh hưởng** đến các hot-path I/O findings trong review này.
287
- - `coalesceMicroTasks` (M6) hiện MVP, chỉ hoạt động cho `READ_ONLY` roles. Khi mở rộng sang mutating roles, cần chú ý F8 (worktree prep cho coalesced group vẫn sync).
@@ -1,71 +0,0 @@
1
- # pi-crew Sprint 1 Report — Low-risk UI smoothness
2
-
3
- Date: 2026-05-14
4
- Branch: `perf/sprint-1` (cut from `perf/baseline-bench`)
5
- Status: complete
6
-
7
- ## Items shipped
8
-
9
- | ID | Item | Commit |
10
- |---|---|---|
11
- | 1.1 | renderTick zero-fs-IO (skip sync `cache.list` fallback) | 888fdf5 |
12
- | 1.2 | Drop sync `refreshIfStale` fallback on hot render path (widget + powerbar) | 23080c0 |
13
- | 1.4 | Events stamp via `.seq` sequence file (correct under rotation) | a9b63d9 |
14
- | 1.5 | Drop per-agent `outputStamp` from SnapshotStamps (rely on agents.json + event-bus) | a9b63d9 |
15
- | 1.8 | Per-segment powerbar dedup keying full payload (text/suffix/bar/color) | 794a59d |
16
- | 1.9 | Coalesce `onInvalidate` per runId in RenderScheduler (default 50 ms) | 727e07c |
17
- | 1.10 | Mascot pause idle | **Skipped** — mascot is splash with autoCloseMs=7s, not always-on; no perf benefit. |
18
-
19
- ## Bench delta (Sprint 0 baseline → Sprint 1 baseline)
20
-
21
- | Metric | Sprint 0 | Sprint 1 | Delta |
22
- |---|---|---|---|
23
- | register-startup.import.p95 | 655.39 ms | 542.49 ms | **−17.2 %** |
24
- | register-startup.register.p95 | 27.51 ms | 25.49 ms | **−7.3 %** |
25
- | render-flush.p95 (100 iters) | 0.36 ms (50 iters) | 0.25 ms | **−30.6 %** |
26
- | snapshot-cache.cold.p95 | 3.06 ms | 2.82 ms | **−7.8 %** |
27
- | snapshot-cache.warm.p95 | 3.06 ms | 2.70 ms | **−11.8 %** |
28
-
29
- Notes:
30
- - `register-startup.import` improvement is partly noise / hot disk cache (no Sprint-2 lazy-import work yet); Sprint 2 (item 2.7) is the planned big drop here.
31
- - `render-flush` bench iters bumped 50 → 100 for stable p95 (the 19 % regression seen with 50 iters was within noise at sub-ms scale).
32
- - `snapshot-cache` improvement modest because the bench has zero agent records, so item 1.5 (drop outputStamp) does not yet show. Real runs with N agents will see the bigger win — Sprint 3's pane-independent rendering bench will exercise that.
33
-
34
- ## Tests added
35
-
36
- - `test/unit/render-scheduler.test.ts` — 2 new cases for invalidate coalesce.
37
- - `test/unit/powerbar-publisher.test.ts` — 1 new case for per-segment dedup.
38
-
39
- Total: 3 new test cases. All sprint-1 unit suites green (44 / 44 across 9 touched files).
40
-
41
- ## Code touched
42
-
43
- - `src/extension/register.ts` (1.1)
44
- - `src/ui/run-snapshot-cache.ts` (1.4, 1.5)
45
- - `src/ui/render-scheduler.ts` (1.9)
46
- - `src/ui/powerbar-publisher.ts` (1.8, 1.2)
47
- - `src/ui/crew-widget.ts` (1.2)
48
- - `test/bench/render-flush.bench.ts` (iters → 100)
49
- - `test/bench/baseline.json` (re-captured)
50
-
51
- ## Risks / follow-up
52
-
53
- - 1.5 trade-off: a worker that appends to its own `output.log` without
54
- triggering an `agents.json` rewrite *and* without firing a `crew.subagent.*`
55
- event would see stale UI until either fires. crew-agent-records already
56
- bumps the aggregate on every `appendCrewAgentOutput`, so this is a
57
- theoretical concern, but call it out for Sprint 4 stability review.
58
- - 1.9 50 ms coalesce window introduces at most one render delay between
59
- bursty subagent completions and cache invalidation. RenderScheduler
60
- fallback (750 ms) and event-bus invalidations on `crew.subagent.*` keep
61
- staleness bounded.
62
- - 1.2 left `live-run-sidebar.ts` and `run-dashboard.ts` on sync
63
- `refreshIfStale`. Both are user-action paths, but Sprint 3 (1.6 pane
64
- independence) should re-examine.
65
-
66
- ## Exit gate
67
-
68
- - `npm run typecheck` — pass.
69
- - `npm run check:lazy-imports` — pass.
70
- - `npm run bench` + `npm run bench:check` — pass (see `test/bench/baseline.json`).
71
- - 44 unit-test cases across hot UI/runtime modules — pass.
@@ -1,81 +0,0 @@
1
- # pi-crew Sprint 2 Report — Cut I/O sync hot path (partial)
2
-
3
- Date: 2026-05-14
4
- Branch: `perf/sprint-2`
5
- Status: 4/8 shipped + 1 skipped (4.4); 3 deferred to Sprint 2.5
6
-
7
- ## Items shipped
8
-
9
- | ID | Item | Commit |
10
- |---|---|---|
11
- | 2.10 | Cache `findRepoRoot` results (TTL-LRU 30 s, 32 entries) | ef52162 |
12
- | 2.7 | Lazy-load OTLPExporter, LiveRunSidebar, crash-recovery | 9bdd42d |
13
- | 4.1 | Keep metric-sink fd open per UTC date | 1e8f8b8 |
14
- | 2.3 | Lower events.jsonl rotation threshold 5 MB → 4 MB | ccf2a45 |
15
-
16
- ## Items skipped
17
-
18
- - **4.4 (sample task.progress 1/10)**: existing
19
- `shouldAppendProgressEventUpdate` already implements smarter-than-sample
20
- coalescing (append on activity_changed / tool_changed / tool_count++ /
21
- turns++ / tokens ≥ 256 / interval ≥ 1 s, otherwise drop). Adding a fixed
22
- 1/10 sample on top would lose information. Closed as already-addressed.
23
-
24
- ## Items deferred to Sprint 2.5 (medium/heavy)
25
-
26
- These need dedicated branches, recovery integration tests, and ADRs where
27
- applicable. Splitting them out so this branch stays small and reviewable.
28
-
29
- - **1.3 FS watcher native** — replace 1 s polling with `fs.watch` recursive
30
- + ENOSYS fallback. Needs OS coverage on Windows ReFS / macOS / Linux ext4.
31
- - **2.1 atomic-write coalescer** — 50 ms window for `saveRunTasks` /
32
- `saveRunManifest`; needs crash-recovery integration test
33
- (`test/integration/atomic-write-coalescer-crash.test.ts`).
34
- - **2.2 events.jsonl buffer 20 ms** — flushSync on cleanupRuntime +
35
- session_before_switch; needs `test/integration/event-log-buffer-crash.test.ts`.
36
-
37
- ## Bench delta (Sprint 1 → end of Sprint 2)
38
-
39
- | Metric | Sprint 1 | Sprint 2 | Delta |
40
- |---|---|---|---|
41
- | register-startup.import.p95 | 542.49 | 531.35 | **−2.1 %** |
42
- | register-startup.register.p95 | 25.49 | 24.67 | **−3.2 %** |
43
- | render-flush.p95 | 0.25 | 0.30 | (sub-ms; within abs 0.5 ms gate) |
44
- | snapshot-cache.cold.p95 | 2.82 | 2.63 | **−6.7 %** |
45
- | snapshot-cache.warm.p95 | 2.70 | ≈2.6 | **≈ −4 %** |
46
-
47
- ### Cumulative delta vs Sprint 0 baseline
48
-
49
- | Metric | Sprint 0 | Sprint 2 | Delta |
50
- |---|---|---|---|
51
- | register-startup.import.p95 | 655.39 | 531.35 | **−18.9 %** |
52
- | register-startup.register.p95 | 27.51 | 24.67 | **−10.3 %** |
53
- | render-flush.p95 | 0.36 | 0.30 | **−16.7 %** |
54
- | snapshot-cache.cold.p95 | 3.06 | 2.63 | **−14.1 %** |
55
- | snapshot-cache.warm.p95 | 3.06 | ~2.60 | **≈ −15 %** |
56
-
57
- ## Tooling delta
58
-
59
- - `scripts/bench-check.mjs`: sub-ms metrics now use absolute delta cap
60
- (+0.5 ms) instead of strict 15 % to avoid noise-driven false positives.
61
- - `test/bench/render-flush.bench.ts`: iters bumped 50 → 100 → 200 across
62
- Sprint 1+2 to stabilise the p95.
63
-
64
- ## Tests
65
-
66
- - 12/12 paths.test.ts (1 new for 2.10).
67
- - 1/1 register-observability-lifecycle.test.ts (verifies 2.7 lazy paths).
68
- - 3/3 metric-sink + metric-retention.
69
- - 12/12 event-log-rotation.
70
-
71
- All `npm run typecheck` + `npm run check:lazy-imports` + bench:check green.
72
-
73
- ## Files touched
74
-
75
- - `src/utils/paths.ts` (2.10)
76
- - `src/extension/register.ts` (2.7 + 2.10 dispose hook)
77
- - `src/observability/metric-sink.ts` (4.1)
78
- - `src/state/event-log-rotation.ts` (2.3)
79
- - `scripts/bench-check.mjs` (sub-ms gate)
80
- - `test/bench/render-flush.bench.ts` (iters)
81
- - `test/unit/paths.test.ts` (+1 case)
@@ -1,53 +0,0 @@
1
- # pi-crew Sprint 2.5 Report — deferred I/O items
2
-
3
- Date: 2026-05-14
4
- Branch: `perf/sprint-2.5`
5
- Status: 1/3 shipped, 2 deferred to a later durability sprint.
6
-
7
- ## Items shipped
8
-
9
- | ID | Item | Commit |
10
- |---|---|---|
11
- | 1.3 | Native FS watcher on `<crewRoot>/state` with poll fallback | ea39c40 |
12
-
13
- The watcher feeds into renderScheduler.schedule({runId}) and reuses the
14
- per-runId invalidate coalesce (1.9). On filesystems that don't support
15
- recursive `fs.watch` it falls back to the existing 1 s preload tick.
16
-
17
- Test added: `watchCrewState fires onRunChange when a run file is touched (1.3)`.
18
-
19
- ## Items deferred again
20
-
21
- ### 2.1 Atomic-write coalescer
22
-
23
- Defining "coalesce 50 ms window on saveRunTasks/saveRunManifest" requires:
24
-
25
- 1. A buffered write path that hands `loadRunManifestById` and other readers
26
- a coherent in-memory view (otherwise reads after a buffered write race).
27
- 2. flushSync hooks in cleanupRuntime + session_before_switch + every
28
- process exit code path.
29
- 3. A crash-recovery integration test that proves no data loss when the
30
- process is killed mid-window.
31
-
32
- This is a state-store redesign, not a tiny lane change. Punted to a
33
- follow-up "durability/coalescer" sprint that owns it end-to-end.
34
-
35
- ### 2.2 events.jsonl buffer 20 ms
36
-
37
- Same blocker: `appendEvent` runs under a cross-process file lock, computes
38
- a monotonic `seq` from the on-disk file, and emits to `runEventBus`
39
- synchronously. Buffering writes without redesigning the sequence cache and
40
- lock protocol corrupts seq under concurrent appenders.
41
-
42
- Punted with 2.1.
43
-
44
- ## Bench
45
-
46
- No measurable bench delta (1.3 only fires on real FS events; bench harness
47
- does not stress that path). Existing gates green.
48
-
49
- ## Files
50
-
51
- - `src/utils/fs-watch.ts` (+createRecursiveWatcher, watchCrewState, runIdFromStateRelativePath)
52
- - `src/extension/register.ts` (wire crewWatcher in session_start, dispose in cleanupRuntime)
53
- - `test/unit/fs-watch.test.ts` (+2 new cases)
@@ -1,36 +0,0 @@
1
- # pi-crew Sprint 3 Report — Refactor & UI selectors (partial)
2
-
3
- Date: 2026-05-14
4
- Branch: `perf/sprint-3`
5
- Status: 3/5 shipped, 1.6 + 1.7 deferred.
6
-
7
- ## Items shipped
8
-
9
- | ID | Item | Commit |
10
- |---|---|---|
11
- | 5.1 | test:unit `--test-concurrency=4 --test-isolation=process` | fb72d45 |
12
- | 2.8 | Extract adaptive-plan.ts (team-runner.ts 57 KB → 43 KB) | 72efeaa |
13
- | 2.9 | Extract config types.ts (config.ts 38 KB → 34 KB) | 1093c6c |
14
-
15
- ## Items deferred
16
-
17
- - **1.6 Dashboard pane independent rendering** — needs pane-level state
18
- isolation across run-dashboard.ts (24 KB) + 8 dashboard panes; will
19
- break overlapping renders if not done atomically. Defer to "UI
20
- selectors" follow-up that owns pane API surface.
21
- - **1.7 Memoized snapshot slice with Object.is** — depends on 1.6 to be
22
- meaningful. Same defer.
23
-
24
- ## Bench
25
-
26
- 5.1 cuts unit-test wall time and lets later sprints iterate faster.
27
- 2.8 / 2.9 are pure refactors with no expected runtime delta.
28
- Bench:check still green; numbers unchanged within noise band.
29
-
30
- ## Files
31
-
32
- - `src/runtime/adaptive-plan.ts` (new, 338 lines)
33
- - `src/runtime/team-runner.ts` (-1 import block, -260 lines body)
34
- - `src/config/types.ts` (new, 199 lines)
35
- - `src/config/config.ts` (-191 lines body, +60 re-exports)
36
- - `package.json` (test:unit script)
@@ -1,47 +0,0 @@
1
- # pi-crew Sprint 4 Report — Stability & telemetry (partial)
2
-
3
- Date: 2026-05-14
4
- Branch: `perf/sprint-4`
5
- Status: 6/10 shipped, 1 skipped (already-addressed), 3 deferred to medium-risk follow-up.
6
-
7
- ## Items shipped
8
-
9
- | ID | Item | Commit |
10
- |---|---|---|
11
- | 3.4 | atomic-write rename: jitter ±20%, cap 8 retries | d4cdfc1 |
12
- | 3.6 | HeartbeatWatcher deadletter cooldown (default 60 s) | b5cb0ff |
13
- | 3.2 | HeartbeatWatcher poll backoff: stale → 1 s, healthy → 5 s | 9bf1451 |
14
- | 4.3 | Pre-tuned histogram buckets for run/task duration + tokens | 2db3584 |
15
- | 4.2 | OTLP exporter gzips body (`content-encoding: gzip`) | 990281b |
16
- | 3.7 | Idempotent resume — already preserved by path-keyed artifact map | (skip-with-note) |
17
-
18
- ## Items deferred (medium risk, need stress tests)
19
-
20
- - **3.1 Backpressure on child-pi stdout** — needs a stress harness that
21
- forces sustained > 4 MB/s child output to verify watermark + pause/resume
22
- semantics; existing test infra mocks child pi.
23
- - **3.5 Cancel propagate < 200 ms** — needs partial-stream parsing of
24
- `pi-json-output.ts` plus signal checks every N lines; requires either
25
- redesigning parsePiJsonOutput or a new stream-parse path.
26
- - **3.3 Mailbox auto-archive at 10 MB** — needs new mailbox rotation
27
- format compatible with existing readers + blob-store integration.
28
- - **3.8 Kill-tree fallback on Windows SIGKILL non-effect** — needs a
29
- test harness for stuck child processes (mocking pi.exe spawn). Risk of
30
- killing wrong PID tree if process died and PID was reused; needs
31
- /T flag + age check.
32
-
33
- These 4 items keep their ADR-style write-up status from the original
34
- plan and will land in their own branch.
35
-
36
- ## Bench
37
-
38
- No expected delta (all changes are stability-oriented, not perf path).
39
- Bench:check still green. Histogram-bucket change improves
40
- Prometheus quantile accuracy (visible only via /team-metrics output).
41
-
42
- ## Files
43
-
44
- - `src/state/atomic-write.ts` (3.4)
45
- - `src/runtime/heartbeat-watcher.ts` (3.2 + 3.6)
46
- - `src/observability/event-to-metric.ts` (4.3)
47
- - `src/observability/exporters/otlp-exporter.ts` (4.2)
@@ -1,51 +0,0 @@
1
- # pi-crew Sprint 5 Report — High-risk + ADRs
2
-
3
- Date: 2026-05-14
4
- Branch: `perf/sprint-5`
5
- Status: 1/5 shipped (5.2). 3 high-risk items have proposed ADRs ready
6
- for prototyping in dedicated branches; not implemented in this batch.
7
-
8
- ## Items shipped
9
-
10
- | ID | Item | Commit |
11
- |---|---|---|
12
- | 5.2 | `npm run test:watch` script | (this branch) |
13
-
14
- ## ADRs filed (Proposed)
15
-
16
- | ADR | Item | Status |
17
- |---|---|---|
18
- | `docs/decisions/0006-publish-bundled-esm.md` | 5.5 Bundle ESM (esbuild) | Proposed |
19
- | `docs/decisions/0007-active-run-binary-index.md` | 2.4 active-run-registry binary index | Proposed |
20
- | `docs/decisions/0008-child-pi-warm-pool.md` | 2.6 child-pi warm pool | Proposed |
21
-
22
- Each ADR captures context, alternatives, decision, consequences, and
23
- next steps. None of the three are implemented in this sprint.
24
-
25
- ## Items deferred again
26
-
27
- - **2.5 Lazy materialize crew-agent-records** — depends on 2.2 events
28
- buffer (already deferred from Sprint 2.5) for safe in-memory flush
29
- semantics.
30
-
31
- ## Why proposed-only?
32
-
33
- The three high-risk items all share characteristics:
34
-
35
- 1. They change a contract that other parts of the codebase or external
36
- users depend on (extension entrypoint, registry on-disk format,
37
- child-process lifecycle).
38
- 2. They need OS-coverage smoke tests before defaulting on.
39
- 3. They each warrant their own dedicated branch + soak window so a
40
- regression in one doesn't block the other two.
41
-
42
- Filing them as Proposed ADRs lets the next maintenance cycle pick any
43
- one of them up cleanly. The ADRs include cost estimates and rollback
44
- paths.
45
-
46
- ## Files
47
-
48
- - `package.json` (test:watch)
49
- - `docs/decisions/0006-publish-bundled-esm.md`
50
- - `docs/decisions/0007-active-run-binary-index.md`
51
- - `docs/decisions/0008-child-pi-warm-pool.md`