pi-crew 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,509 @@
1
+ # Research: oh-my-pi v15.0.0 — Tính năng có thể áp dụng vào pi-crew
2
+
3
+ > Date: 2026-05-13
4
+ > Source: `D:/my/my_project/source/oh-my-pi` (v15.0.0)
5
+ > Purpose: Tìm features có thể port vào pi-crew
6
+
7
+ ---
8
+
9
+ ## 1. Feature: Hashline Engine (`hashline/`)
10
+
11
+ ### Mục đích
12
+ Thay thế hoàn toàn hashline cũ bằng engine mới hỗ trợ:
13
+ - Line-level content addressing (hash mỗi dòng)
14
+ - Semantic anchors (không chỉ line number mà hash content)
15
+ - Recovery mode (phục hồi từ crash)
16
+ - Conflict resolution (3-way merge)
17
+ - Streaming diff output
18
+
19
+ ### Cách hoạt động
20
+
21
+ **Core types** (`hashline/types.ts`):
22
+ ```typescript
23
+ export type Anchor = { line: number; hash: string; contentHint?: string };
24
+ export type HashlineCursor =
25
+ | { kind: "bof" }
26
+ | { kind: "eof" }
27
+ | { kind: "before_anchor"; anchor: Anchor }
28
+ | { kind: "after_anchor"; anchor: Anchor };
29
+ export type HashlineEdit =
30
+ | { kind: "insert"; cursor: HashlineCursor; text: string; lineNum: number; index: number }
31
+ | { kind: "delete"; anchor: Anchor; lineNum: number; index: number; oldAssertion?: string };
32
+ ```
33
+
34
+ **Key modules:**
35
+ - `hash.ts` (694→) — Line hashing với bigram index
36
+ - `parser.ts` (192 lines) — Parse hashline input
37
+ - `apply.ts` (716 lines) — Apply edits với validation
38
+ - `recovery.ts` (72 lines) — Recovery từ crash state
39
+ - `execute.ts` (267 lines) — Execute hashline commands
40
+ - `diff.ts` / `diff-preview.ts` — Streaming diff
41
+
42
+ ### Potential apply cho pi-crew
43
+
44
+ **Option A — Dùng trực tiếp (nếu oh-my-pi tách hashline thành package riêng):**
45
+ - Pi-crew cần edit files trong worktree
46
+ - Hashline engine có thể giúp detect conflicts khi nhiều agents edit cùng file
47
+
48
+ **Option B — Conflict detection (đã có `conflict-detect.ts` rồi):**
49
+ - Xem feature tiếp theo
50
+
51
+ **Effort: HIGH** — hashline strongly coupled với oh-my-pi internals (ToolSession, LSP batch request, etc.)
52
+
53
+ ### Risk/Dependency
54
+ - Requires oh-my-pi package hoặc fork lại
55
+ - Strong dependency on oh-my-pi tool execution model
56
+
57
+ ---
58
+
59
+ ## 2. Feature: Conflict Detection & Resolution (`conflict-detect.ts`)
60
+
61
+ ### Mục đích
62
+ Detect git merge conflicts (<<<<<<, =======, >>>>>>>) trong file content mà không cần extra I/O. Mỗi conflict block được assign stable id, agent có thể resolve bằng cách write vào `conflict://<id>`.
63
+
64
+ ### Cách hoạt động
65
+
66
+ ```typescript
67
+ export interface ConflictBlock {
68
+ startLine: number; // 1-indexed line of <<<<<<<
69
+ separatorLine: number; // 1-indexed line of =======
70
+ endLine: number; // 1-indexed line of >>>>>>>
71
+ baseLine?: number; // 1-indexed line of ||||||| (diff3 only)
72
+ oursLabel?: string;
73
+ baseLabel?: string;
74
+ theirsLabel?: string;
75
+ oursLines: string[];
76
+ baseLines?: string[];
77
+ theirsLines: string[];
78
+ }
79
+
80
+ // scanConflictLines: scan array of lines (no extra I/O)
81
+ // registerConflict: assign stable id via ConflictHistory
82
+ // resolveConflict: write chosen content via conflict://<id>
83
+ ```
84
+
85
+ **Workflow:**
86
+ 1. `read` collects lines từ disk
87
+ 2. `scanConflictLines` inspects cho `<<<<<<<` / `=======` / `>>>>>>>` markers
88
+ 3. Each completed block → `ConflictHistory` (stable id)
89
+ 4. Read output trả về kèm footer với conflict ids
90
+ 5. Agent gọi `write({ path: "conflict://<id>", content })` để resolve
91
+
92
+ **Key insight:** Marker shape phải strict — column-0, exact prefix length, followed by EOL or single space + label.
93
+
94
+ ### Potential apply cho pi-crew
95
+
96
+ **HIGH VALUE cho pi-crew:**
97
+ - Khi nhiều agents edit cùng file trong worktree, có thể xảy ra conflicts
98
+ - Conflict detection giúp agent nhận biết và resolve tự động
99
+
100
+ **Implementation approach:**
101
+ 1. Fork `conflict-detect.ts` (license OK — MIT)
102
+ 2. Integrate vào pi-crew's file read path
103
+ 3. Register conflicts vào `LiveAgentHandle.activity` hoặc artifact store
104
+ 4. Provide `conflict://` protocol trong write tool
105
+ 5. Add `detect-conflicts` tool cho agents
106
+
107
+ **Effort: MEDIUM** — standalone module, có thể copy + adapt
108
+
109
+ ### Risk/Dependency
110
+ - Cần xử lý `conflict://` protocol trong write tool
111
+ - Cần update read tool để detect và report conflicts
112
+
113
+ ---
114
+
115
+ ## 3. Feature: ACP Client Bridge (`acp-client-bridge.ts`)
116
+
117
+ ### Mục đích
118
+ Bridge giữa oh-my-pi internal ClientBridge interface và ACP (Agent Client Protocol) SDK. Cho phép tools (read/write/bash/edit) route qua client khi client có capabilities.
119
+
120
+ ### Cách hoạt động
121
+
122
+ ```typescript
123
+ export interface ClientBridgeCapabilities {
124
+ readTextFile: boolean;
125
+ writeTextFile: boolean;
126
+ terminal: boolean;
127
+ requestPermission: boolean;
128
+ }
129
+
130
+ export interface ClientBridge {
131
+ capabilities: ClientBridgeCapabilities;
132
+ readTextFile?: (params: { path: string; line?: number; limit?: number }) => Promise<string>;
133
+ writeTextFile?: (params: { path: string; content: string }) => Promise<void>;
134
+ terminal?: (params: ClientBridgeCreateTerminalParams) => Promise<ClientBridgeTerminalHandle>;
135
+ requestPermission?: (params: ClientBridgePermissionToolCall) => Promise<ClientBridgePermissionOutcome>;
136
+ }
137
+ ```
138
+
139
+ **Pattern:** Feature detection → conditional implementation. Nếu client không có capability thì fallback sang default implementation.
140
+
141
+ ### Potential apply cho pi-crew
142
+
143
+ **LOW-MEDIUM VALUE:**
144
+
145
+ pi-crew đã có `LiveExtensionBridge` và `LiveAgentControl` — không cần ACP bridge. Tuy nhiên, pattern này hữu ích cho:
146
+
147
+ 1. **pi-crew tool permission system** — Có thể dùng pattern này để check permission trước khi cho phép tool execution
148
+ 2. **Cross-extension communication** — `ClientBridge` pattern có thể adapt cho `CrossExtensionRPC`
149
+
150
+ **Effort: LOW** — chỉ cần học pattern, không cần port code
151
+
152
+ ### Risk/Dependency
153
+ - ACP SDK là proprietary (`@agentclientprotocol/sdk`)
154
+ - Pattern có thể apply không cần SDK
155
+
156
+ ---
157
+
158
+ ## 4. Feature: Todo Helper (`todo.ts`)
159
+
160
+ ### Mục đích
161
+ Slash command helper cho phép agents quản lý todo list trong project. Hỗ trợ subcommands: `done`, `drop`, `rm`, và parsing markdown todo format.
162
+
163
+ ### Cách hoạt động
164
+
165
+ **Tokenize approach:**
166
+ ```typescript
167
+ // Handle escape sequences, quoted strings, whitespace
168
+ function tokenize(input: string): string[] {
169
+ let current = "";
170
+ let inQuote = false;
171
+ // ... parsing logic
172
+ }
173
+
174
+ // Subcommands:
175
+ // /todo done <phase> <task> — mark task done
176
+ // /todo drop <phase> <task> — remove task
177
+ // /todo rm <phase> <task> — alias for drop
178
+ ```
179
+
180
+ **Markdown ↔ Phases conversion:**
181
+ - `markdownToPhases` — Parse markdown todo format
182
+ - `phasesToMarkdown` — Convert back to markdown
183
+ - `getLatestTodoPhasesFromEntries` — Get latest version
184
+
185
+ **Tokenize features:**
186
+ - Quoted strings: `"task with spaces"`
187
+ - Escape sequences: `\<char>`
188
+ - Whitespace splitting
189
+
190
+ ### Potential apply cho pi-crew
191
+
192
+ **HIGH VALUE cho pi-crew:**
193
+
194
+ pi-crew có `YieldReminder` và `TaskRunner` — có thể tích hợp todo management:
195
+
196
+ 1. **Team task tracking** — Workflow tasks có thể represented as todos
197
+ 2. **Yield + Todo integration** — Khi agent yields với todo request, có thể parse và update todo list
198
+ 3. **Slash command `/crew todo`** — Management interface cho team tasks
199
+
200
+ **Implementation approach:**
201
+ 1. Fork `todo.ts` helper (279 lines)
202
+ 2. Integrate vào `CrewTaskRunner` hoặc `YieldHandler`
203
+ 3. Add `/crew todo` slash command
204
+ 4. Wire vào `TaskDisplay` component
205
+
206
+ **Effort: MEDIUM** — có thể copy module, cần integrate với existing task system
207
+
208
+ ### Risk/Dependency
209
+ - Dependency on `todo-write.ts` tool
210
+ - Cần sync với actual task state trong manifest
211
+
212
+ ---
213
+
214
+ ## 5. Feature: Compaction Error Types (`compaction/errors.ts`)
215
+
216
+ ### Mục đích
217
+ Typed error sentinels cho compaction operations. Dùng `instanceof` discrimination thay vì string matching.
218
+
219
+ ### Cách hoạt động
220
+
221
+ ```typescript
222
+ export class CompactionCancelledError extends Error {
223
+ readonly name = "CompactionCancelledError" as const;
224
+ constructor(message = "Compaction cancelled") { super(message); }
225
+ }
226
+
227
+ export type CompactionOutcome = "ok" | "cancelled" | "failed";
228
+ ```
229
+
230
+ **Pattern:**
231
+ - Sentinel class với `name` property readonly
232
+ - Downstream callers dùng `instanceof CompactionCancelledError`
233
+ - Source-agnostic: Esc, extension hook, programmatic abort đều cùng type
234
+
235
+ ### Potential apply cho pi-crew
236
+
237
+ **MEDIUM VALUE cho pi-crew:**
238
+
239
+ pi-crew có `YieldResult` và compaction tracking — có thể dùng pattern này:
240
+
241
+ 1. **Typed cancellation errors** — `CrewCancelledError`, `CrewTimeoutError`, `CrewDeadletterError`
242
+ 2. **Better error discrimination** — Thay vì string matching, dùng `instanceof`
243
+ 3. **Error outcome tracking** — `CrewRunOutcome = "ok" | "cancelled" | "failed" | "deadletter"`
244
+
245
+ **Implementation approach:**
246
+ ```typescript
247
+ // src/errors/crew-errors.ts
248
+ export class CrewCancelledError extends Error {
249
+ readonly name = "CrewCancelledError" as const;
250
+ }
251
+
252
+ export class CrewTimeoutError extends Error {
253
+ readonly name = "CrewTimeoutError" as const;
254
+ }
255
+
256
+ export class CrewDeadletterError extends Error {
257
+ readonly name = "CrewDeadletterError" as const;
258
+ constructor(public readonly agentId: string, public readonly reason: string) {
259
+ super(`Agent ${agentId} deadlettered: ${reason}`);
260
+ }
261
+ }
262
+ ```
263
+
264
+ **Effort: LOW** — chỉ cần create error classes và replace `instanceof Error` checks
265
+
266
+ ### Risk/Dependency
267
+ - None — pure TypeScript, có thể copy pattern
268
+ - Cần audit existing error handling để update
269
+
270
+ ---
271
+
272
+ ## 6. Feature: ACP Agent Session (`acp-agent.ts`)
273
+
274
+ ### Mục đích
275
+ ACP protocol handler trong oh-my-pi. Mở rộng từ `agent-session.ts` với:
276
+ - Fork sessions (clone session state)
277
+ - Session list/load/resume
278
+ - Model state management
279
+ - MCP server discovery
280
+
281
+ ### Cách hoạt động
282
+
283
+ **ACP Protocol types:**
284
+ ```typescript
285
+ type NewSessionRequest, ForkSessionRequest, LoadSessionRequest, ResumeSessionRequest
286
+ type SetSessionModelRequest, SetSessionModeRequest
287
+ type SessionInfo, SessionModelState, SessionModeState
288
+ type ClientCapabilities (fs, terminal, permission)
289
+ ```
290
+
291
+ **Key capabilities:**
292
+ - `forkSession` — Clone session với same conversation history
293
+ - `listSessions` — Enumerate active sessions
294
+ - `loadSession` / `resumeSession` — Restore previous session
295
+ - `setSessionModel` — Change model mid-session
296
+
297
+ ### Potential apply cho pi-crew
298
+
299
+ **HIGH VALUE cho pi-crew:**
300
+
301
+ 1. **Fork session** — Trong workflow orchestration, có thể fork một agent session để chạy parallel experiments
302
+ 2. **Session resume** — Resume a previous run từ manifest/events
303
+ 3. **Model switching** — Change model for specific tasks (e.g., cheap model for exploration, expensive model for final generation)
304
+
305
+ **Current pi-crew state:**
306
+ - pi-crew đã có `ResumeSession` cho team runs (re-spawn child Pi)
307
+ - Nhưng không có in-process session fork
308
+
309
+ **Implementation approach:**
310
+ - `forkLiveAgentSession()` — Clone `LiveAgentHandle` với same conversation
311
+ - Store forked sessions trong `live-agent-manager.ts`
312
+ - Add `fork-session` operation vào `team-tool api`
313
+
314
+ **Effort: HIGH** — cần deep understanding của `LiveSessionHandle` và session state
315
+
316
+ ### Risk/Dependency
317
+ - Requires oh-my-pi internals (AgentSession, ToolSession)
318
+ - pi-crew dùng child Pi process — fork có thể không tương thích
319
+
320
+ ---
321
+
322
+ ## 7. Feature: User Metrics (`stats/src/user-metrics.ts`)
323
+
324
+ ### Mục đích
325
+ Tracking và aggregation của user behavior metrics: edits, tools usage, model selection, cost, session quality.
326
+
327
+ ### Cách hoạt động
328
+
329
+ **Database schema:**
330
+ - Sessions table: session_id, start_time, end_time, model, cost
331
+ - Tool usage: session_id, tool_name, count, duration
332
+ - Edit patterns: session_id, lines_added, lines_removed, files_changed
333
+ - Behavior models: quality score, efficiency score
334
+
335
+ **Analytics:**
336
+ - Behavior chart: edits over time, tool usage distribution
337
+ - Model comparison: cost vs quality per model
338
+ - Session summary: duration, token usage, task completion rate
339
+
340
+ ### Potential apply cho pi-crew
341
+
342
+ **MEDIUM VALUE:**
343
+
344
+ pi-crew đã có `UsageTracker` và `MetricsRegistry` — có thể học:
345
+
346
+ 1. **Team metrics** — Track team run performance (workflow duration, agent utilization, cost)
347
+ 2. **Agent quality scoring** — Rate agent output quality
348
+ 3. **Cost tracking** — Per-agent, per-task, per-team cost
349
+
350
+ **Effort: MEDIUM** — Cần design database schema và API
351
+
352
+ ### Risk/Dependency
353
+ - SQLite hoặc separate database
354
+ - Privacy implications (storing user behavior data)
355
+
356
+ ---
357
+
358
+ ## 8. Feature: Shell Minimizer (`crates/pi-shell/src/minimizer/`)
359
+
360
+ ### Mục đích
361
+ Tự động minimize command output (loại bỏ noise như progress bars, ANSI codes) để LLM đọc được kết quả clean hơn.
362
+
363
+ ### Cách hoạt động
364
+
365
+ **100+ TOML config files:**
366
+ - `cargo.toml` — Filter cargo progress output
367
+ - `npm-install.toml` — Filter npm package output
368
+ - `terraform-plan.toml` — Simplify terraform plans
369
+ - etc.
370
+
371
+ **Engine:**
372
+ ```rust
373
+ // minimizer/engine.rs
374
+ pub struct Minimizer {
375
+ filters: Vec<Box<dyn Filter>>,
376
+ }
377
+
378
+ // Filter types: line removal, replacement, truncation
379
+ ```
380
+
381
+ ### Potential apply cho pi-crew
382
+
383
+ **HIGH VALUE cho pi-crew:**
384
+
385
+ pi-crew agents chạy bash commands — output có thể rất noisy. Minimizer giúp:
386
+ - Agent đọc được clean output
387
+ - Giảm context usage
388
+ - Tập trung vào important information
389
+
390
+ **Implementation approach:**
391
+ 1. Fork minimizer engine (Rust) hoặc port sang TypeScript
392
+ 2. Integrate vào `TaskRunner` bash execution
393
+ 3. Auto-detect command type và apply appropriate filter
394
+
395
+ **Effort: HIGH** — Rust code cần rewrite hoặc integration via FFI
396
+
397
+ ### Risk/Dependency
398
+ - Rust dependency
399
+ - May not be necessary nếu oh-my-pi tách thành standalone tool
400
+
401
+ ---
402
+
403
+ ## 9. Feature: MCP Helper (`slash-commands/helpers/mcp.ts`)
404
+
405
+ ### Mục đích
406
+ Helper cho MCP (Model Context Protocol) slash commands. Quản lý MCP server configuration và tool invocation.
407
+
408
+ ### Cách hoạt động
409
+
410
+ 532 lines TypeScript. **Key functions:**
411
+ - `resolveMcpServer` — Resolve MCP server config
412
+ - `invokeMcpTool` — Call MCP tool
413
+ - `listMcpResources` — List available resources
414
+ - `mcpServerStatus` — Check server health
415
+
416
+ ### Potential apply cho pi-crew
417
+
418
+ **MEDIUM VALUE:**
419
+
420
+ pi-crew đã có `McpProxy` trong `live-extension-bridge.ts` — có thể học thêm:
421
+ 1. **MCP server lifecycle** — Start/stop MCP servers per team
422
+ 2. **MCP tool routing** — Route MCP calls qua team session
423
+
424
+ **Effort: LOW** — chỉ cần học pattern, không cần port code
425
+
426
+ ### Risk/Dependency
427
+ - MCP protocol knowledge required
428
+ - Có thể reuse existing `buildMcpProxyFromSession`
429
+
430
+ ---
431
+
432
+ ## 10. Feature: Issue-PR Protocol (`internal-urls/issue-pr-protocol.ts`)
433
+
434
+ ### Mục đích
435
+ Protocol handler cho `issue://` và `pr://` internal URLs. Cho phép agents interact với GitHub/GitLab issues và PRs qua unified interface.
436
+
437
+ ### Cách hoạt động
438
+
439
+ ```typescript
440
+ // Handle URLs like:
441
+ // issue://github.com/owner/repo/123
442
+ // pr://github.com/owner/repo/456
443
+ // issue://gitlab.com/owner/repo/789
444
+ ```
445
+
446
+ **Operations:**
447
+ - `read` — Get issue/PR content
448
+ - `search` — Search issues/PRs
449
+ - `comment` — Add comment
450
+ - `close` / `reopen` — State transitions
451
+
452
+ ### Potential apply cho pi-crew
453
+
454
+ **HIGH VALUE cho pi-crew:**
455
+
456
+ pi-crew workflow agents có thể benefit từ issue/PR integration:
457
+ 1. **Task creation** — Create issue từ failed task
458
+ 2. **PR review** — Use `pr://` protocol trong review workflow
459
+ 3. **Task linking** — Link workflow tasks to issues
460
+
461
+ **Effort: MEDIUM** — Cần port `issue-pr-protocol.ts` (577 lines)
462
+
463
+ ### Risk/Dependency
464
+ - GitHub API authentication
465
+ - Complex state machine (open/close/reopen/merge)
466
+
467
+ ---
468
+
469
+ ## Summary: Recommendations
470
+
471
+ ### Tier 1 — High Value, Medium Effort (Ưu tiên cao)
472
+
473
+ | Feature | Why | Effort | Notes |
474
+ |---|---|---|---|
475
+ | **Conflict Detection** | Prevents data loss khi multiple agents edit same file | MEDIUM | Fork `conflict-detect.ts`, add `conflict://` protocol |
476
+ | **Typed Crew Errors** | Better error handling, cleaner code | LOW | Create `CrewCancelledError`, `CrewTimeoutError`, `CrewDeadletterError` |
477
+ | **Todo Integration** | Task tracking cho team workflows | MEDIUM | Fork `todo.ts`, integrate với `TaskRunner` |
478
+ | **Issue-PR Protocol** | Link team tasks với GitHub issues | MEDIUM | Port `issue-pr-protocol.ts` |
479
+
480
+ ### Tier 2 — High Value, High Effort (Ưu tiên thấp hơn)
481
+
482
+ | Feature | Why | Effort | Notes |
483
+ |---|---|---|---|
484
+ | **Shell Minimizer** | Clean command output cho agents | HIGH | Rust → TypeScript port hoặc FFI |
485
+ | **ACP Fork Session** | Parallel agent experiments | HIGH | Cần deep `LiveSessionHandle` understanding |
486
+ | **User Metrics** | Team performance analytics | MEDIUM | Design DB schema, build API |
487
+
488
+ ### Tier 3 — Low Value (Không ưu tiên)
489
+
490
+ | Feature | Why | Effort |
491
+ |---|---|---|
492
+ | Hashline Engine | Strongly coupled với oh-my-pi | HIGH |
493
+ | ACP Client Bridge | pi-crew đã có `LiveExtensionBridge` | LOW |
494
+ | MCP Helper | pi-crew đã có `McpProxy` | LOW |
495
+
496
+ ---
497
+
498
+ ## Next Steps
499
+
500
+ 1. **Conflict Detection** — Start với porting `conflict-detect.ts` vì nó standalone và high-value
501
+ 2. **Typed Errors** — Quick win, chỉ cần create error classes
502
+ 3. **Todo Integration** — Long-term, cần integrate với workflow engine
503
+
504
+ ## Files cần đọc thêm
505
+
506
+ - `packages/coding-agent/src/tools/conflict-detect.ts` (toàn bộ)
507
+ - `packages/coding-agent/src/tools/todo-write.ts` (dependency của todo.ts)
508
+ - `packages/coding-agent/src/session/agent-session.ts` (phần fork/resume session)
509
+ - `crates/pi-shell/src/minimizer/engine.rs` (nếu muốn port shell minimizer)
@@ -0,0 +1,113 @@
1
+ # pi-crew Performance Baseline — 2026-05
2
+
3
+ Date captured: 2026-05-14
4
+ Branch: `perf/baseline-bench`
5
+ Environment:
6
+ - OS: Windows (`win32`)
7
+ - Node: v24.10.0
8
+ - npm: 11.6.1
9
+ - Pi: installed at `C:\Users\baphu\AppData\Roaming\npm\pi.ps1`
10
+
11
+ ## How to capture
12
+
13
+ ```powershell
14
+ cd pi-crew
15
+ npm install # if node_modules missing
16
+ npm run typecheck
17
+ npm run bench:capture # writes test/bench/baseline.json
18
+ npm run profile:startup # writes .profile/summary.json
19
+ ```
20
+
21
+ ## How to verify against baseline (CI gate)
22
+
23
+ ```powershell
24
+ npm run bench
25
+ npm run bench:check # fails if any p95 regresses > 15%
26
+ ```
27
+
28
+ Override threshold or baseline path:
29
+
30
+ ```powershell
31
+ $env:THRESHOLD_PCT = 10 # tighter
32
+ $env:BASELINE = "test/bench/baseline-2026-05.json"
33
+ ```
34
+
35
+ ## Bench results (commit 2026-05-14, end of Sprint 1)
36
+
37
+ > Sprint 0 captured the original baseline; Sprint 1 re-captured at the
38
+ > end of the sprint. Subsequent sprint:check gates compare against this
39
+ > table (the JSON in `test/bench/baseline.json`).
40
+
41
+ ### register-startup (cold load via child process, 20 iters)
42
+
43
+ | Metric | min | p50 | p95 | p99 | max |
44
+ |---|---|---|---|---|---|
45
+ | import (ms) | 513.76 | 528.15 | 542.49 | 542.49 | 566.58 |
46
+ | register (ms) | 23.32 | 24.27 | 25.49 | 25.49 | 26.45 |
47
+
48
+ ### render-flush (200 events / iter, 100 iters)
49
+
50
+ | Metric | min | p50 | p95 | p99 | max |
51
+ |---|---|---|---|---|---|
52
+ | ms | 0.07 | 0.10 | 0.25 | 1.02 | 1.12 |
53
+
54
+ ### snapshot-cache (10 tasks, 200 events, 50 iters)
55
+
56
+ | Metric | min | p50 | p95 | p99 | max |
57
+ |---|---|---|---|---|---|
58
+ | cold (ms) | 2.14 | 2.42 | 2.82 | 2.92 | 3.01 |
59
+ | warm (ms) | 2.16 | 2.41 | 2.70 | 2.75 | 3.99 |
60
+
61
+ ### Delta vs Sprint-0 baseline
62
+
63
+ | Metric | Sprint 0 | Sprint 1 | Delta |
64
+ |---|---|---|---|
65
+ | register-startup.import.p95 | 655.39 | 542.49 | **−17.2 %** |
66
+ | register-startup.register.p95 | 27.51 | 25.49 | **−7.3 %** |
67
+ | render-flush.p95 | 0.36 | 0.25 | **−30.6 %** |
68
+ | snapshot-cache.cold.p95 | 3.06 | 2.82 | **−7.8 %** |
69
+ | snapshot-cache.warm.p95 | 3.06 | 2.70 | **−11.8 %** |
70
+
71
+ ## Profile-startup (5 iters)
72
+
73
+ | Metric | Value |
74
+ |---|---|
75
+ | importMs | 609.48 |
76
+ | registerMs.p50 | 6.40 |
77
+ | registerMs.p95 | 9.02 |
78
+ | registerMs.max | 30.98 |
79
+
80
+ CPU profile: `.profile/startup-2026-05-14T14-38-20-180Z.cpuprofile` (open in Chrome DevTools → Performance → Load profile).
81
+
82
+ > `registerMs` thấp hơn bench register-startup vì profile chạy 5 iter trong cùng một process (module cache nóng sau iter 1). Bench `register-startup` mới phản ánh cold-start thực.
83
+
84
+ ## Sprint targets (so với baseline trên)
85
+
86
+ | Metric | Baseline | Target sau khi xong toàn bộ kế hoạch | Sprint kỳ vọng |
87
+ |---|---|---|---|
88
+ | register-startup.import.p95 | 655 ms | ≤ 400 ms (lazy) / ≤ 200 ms (bundled) | 2 / 5 |
89
+ | register-startup.register.p95 | 27.5 ms | ≤ 25 ms (giữ nguyên) | — |
90
+ | render-flush.p95 | 0.36 ms | ≤ 0.5 ms (giữ nguyên) | — |
91
+ | snapshot-cache.cold.p95 | 3.06 ms | ≤ 2.1 ms (-30%) | 1, 2 |
92
+ | snapshot-cache.warm.p95 | 3.06 ms | ≤ 1.5 ms (-50%) | 1, 2 |
93
+ | dashboard FPS khi run đang chạy | n/a | +50% | 3 |
94
+ | events.jsonl tail 32 KB parse p95 | n/a | < 5 ms | 2 |
95
+ | cancel round-trip | n/a | < 200 ms | 4 |
96
+
97
+ ## Files committed for the gate
98
+
99
+ - `scripts/profile-startup.mjs` — CPU profile harness.
100
+ - `scripts/run-bench.mjs` — run all benches, collect to `results.json`.
101
+ - `scripts/bench-check.mjs` — gate; fails on > 15 % regression.
102
+ - `test/bench/register-startup.bench.ts`
103
+ - `test/bench/render-flush.bench.ts`
104
+ - `test/bench/snapshot-cache.bench.ts`
105
+ - `test/bench/baseline.json` — committed.
106
+ - `package.json` scripts: `bench`, `bench:check`, `bench:capture`, `profile:startup`.
107
+ - `.gitignore`: `.profile/`, `test/bench/results.json`, `*.cpuprofile`.
108
+
109
+ ## Caveats
110
+
111
+ - Baseline được ghi trên 1 máy Windows duy nhất. Các máy khác có CPU/disk khác nhau sẽ ra số khác. Khi cần re-baseline (Node major bump, OS upgrade, máy CI khác), copy `results.json → baseline.json` và viết file mới `baseline-<date>.md`.
112
+ - `register-startup` bench tốn ~13 s (20 iter × 600 ms); CI nên giữ. Local có thể `BENCH_ITERS=5` để debug nhanh.
113
+ - Bench không chạy trong `npm test` để giữ test suite nhanh; trigger riêng qua `npm run bench` hoặc CI step riêng.