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,342 +0,0 @@
1
- # Review of the fixes applied
2
-
3
- > Date: 2026-05-18
4
- > Version: `pi-crew@0.2.20`
5
- > Base: PROJECT_REVIEW.md (same directory) — the original report.
6
- > Working tree: 33 files changed (`git diff --stat`), including installing `@biomejs/biome`, adding `biome.json`, fixing source + tests.
7
-
8
- ## TL;DR
9
-
10
- The fixes go in the right direction and **all tests still pass** (1596/1598, 0 fail). However, there are **3 new correctness bugs introduced by the fixes** and **2 conventions to clean up**:
11
-
12
- | ID | File | Severity | Status |
13
- |---|---|---|---|
14
- | **NEW-1** | `src/state/event-log-rotation.ts` (rotateEventLog) | HIGH | `require()` in ESM → throws silently |
15
- | **NEW-2** | `src/runtime/task-runner.ts` (M1 transcript per attempt) | HIGH | logic is wrong, still uses a single shared file |
16
- | **NEW-3** | `src/runtime/task-runner.ts` (M2 transcript cap) | MED | tail read does not cut on line boundaries → corrupt JSONL; writes artifact with the old relativePath |
17
- | LINT-1 | `src/runtime/task-runner.ts:350` | LOW | `yieldResult` unused (yield logic removed?) |
18
- | LINT-2 | `src/runtime/team-runner.ts:270` | LOW | `runPromise` unused (registers a Promise then drops the reference) |
19
-
20
- Status of each original issue:
21
-
22
- | Issue | Status | Notes |
23
- |---|---|---|
24
- | **H1** event-log overflow | OK | correct pattern: prioritize terminal events, compact + rotate before append |
25
- | **H2** mailbox lock | OK | uses `withEventLogLockSync` |
26
- | **H3** atomic-write fallback symlink | OK | re-checks `lstatSync.isSymbolicLink()` before fallback |
27
- | **H4** rename `__test__mergeTaskUpdates` | OK | renamed + kept deprecated alias |
28
- | **M1** transcript per attempt | **BROKEN (NEW-2)** | logic is incorrect |
29
- | **M2** transcript cap | **PARTIAL (NEW-3)** | has a cap but cuts at the wrong place |
30
- | **M3** cleanup race-safe stat | OK | uses `withFileTypes` + try/catch |
31
- | **M4** runSetupHook full-JSON | OK | tries full trimmed first, falls back to last-line |
32
- | **M5** symlink fail logging | OK | logs the reason, hints at Windows non-admin |
33
- | **M6** final-drain telemetry | OK | logs internal error when overriding exit |
34
- | **L1** ESLint/Biome | OK | added `@biomejs/biome` + `biome.json` |
35
- | **L12** rename references | OK | expanded for workflow step.role + test fixtures |
36
-
37
- ---
38
-
39
- ## 1. New bugs introduced by the fixes (NEW-*)
40
-
41
- ### NEW-1 (HIGH) — `rotateEventLog` uses `require()` in an ESM module
42
-
43
- **File**: `src/state/event-log-rotation.ts` (lines 124–129)
44
-
45
- ```ts
46
- } catch (error) {
47
- // Import here to avoid circular dependency at module load time
48
- try {
49
- const { logInternalError } = require("./internal-error.ts"); // ❌
50
- logInternalError("event-log.rotate", error, `eventsPath=${eventsPath}`);
51
- } catch {
52
- // fallback — log not available
53
- }
54
- return false;
55
- }
56
- ```
57
-
58
- **Problem**:
59
- 1. The project declares `"type": "module"` (ESM). In an ESM scope, **`require` does not exist** → throws `ReferenceError: require is not defined`.
60
- 2. The path `"./internal-error.ts"` is wrong — the file is actually at `../utils/internal-error.ts`.
61
- 3. The outer try-catch swallows the error → when `rename` fails, the function returns `false` but **no log is written**. The H1 fix relies on rotateEventLog to reduce size; if rotate fails silently, we are back to the silent-drop scenario.
62
-
63
- **Correct fix**: import at the top of the file like `compactEventLog` already does:
64
- ```ts
65
- import { logInternalError } from "../utils/internal-error.ts";
66
- // ...
67
- } catch (error) {
68
- logInternalError("event-log.rotate", error, `eventsPath=${eventsPath}`);
69
- return false;
70
- }
71
- ```
72
- There is no circular dependency because `internal-error.ts` does not import from `state/`.
73
-
74
- ---
75
-
76
- ### NEW-2 (HIGH) — Transcript-per-attempt does not work
77
-
78
- **File**: `src/runtime/task-runner.ts` (lines 155–158)
79
-
80
- ```ts
81
- modelAttempts = [];
82
- // M1 fix: transcript path per attempt to avoid mixing across fallback attempts.
83
- const attempt = modelAttempts.length; // 0-based index ← always 0
84
- transcriptPath = `${manifest.artifactsRoot}/transcripts/${task.id}.attempt-${attempt}.jsonl`;
85
- ```
86
-
87
- **Problem**:
88
- - `modelAttempts = []` was just initialized empty → `modelAttempts.length` **is always 0**.
89
- - `transcriptPath` is set **outside** the `for (let i = 0; i < attemptModels.length; i++)` loop.
90
- - All N attempts write to `transcripts/${task.id}.attempt-0.jsonl` → still mixing exactly like before.
91
- - Furthermore: `parsePiJsonOutput(fs.readFileSync(transcriptPath))` reads accumulated content → final text/usage is still mixed across attempts.
92
-
93
- **Correct fix**: use the loop variable `i`, set transcriptPath inside the for loop:
94
- ```ts
95
- for (let i = 0; i < attemptModels.length; i++) {
96
- transcriptPath = `${manifest.artifactsRoot}/transcripts/${task.id}.attempt-${i}.jsonl`;
97
- // ...
98
- }
99
- ```
100
-
101
- ---
102
-
103
- ### NEW-3 (MED) — Transcript cap tail read does not respect line boundaries
104
-
105
- **File**: `src/runtime/task-runner.ts` (lines 294–315)
106
-
107
- ```ts
108
- const MAX_TRANSCRIPT_ARTIFACT_BYTES = 5 * 1024 * 1024;
109
- let transcriptContent = '';
110
- if (fs.existsSync(transcriptPath)) {
111
- const stat = fs.statSync(transcriptPath);
112
- if (stat.size > MAX_TRANSCRIPT_ARTIFACT_BYTES) {
113
- const fd = fs.openSync(transcriptPath, 'r');
114
- try {
115
- const buf = Buffer.alloc(MAX_TRANSCRIPT_ARTIFACT_BYTES);
116
- const bytesRead = fs.readSync(fd, buf, 0, MAX_TRANSCRIPT_ARTIFACT_BYTES, stat.size - MAX_TRANSCRIPT_ARTIFACT_BYTES);
117
- transcriptContent = buf.slice(0, bytesRead).toString('utf-8');
118
- } finally { fs.closeSync(fd); }
119
- } else {
120
- transcriptContent = fs.readFileSync(transcriptPath, 'utf-8');
121
- }
122
- transcriptArtifact = writeArtifact(manifest.artifactsRoot, {
123
- kind: "log",
124
- relativePath: `transcripts/${task.id}.jsonl`, // ← artifact name differs from source!
125
- content: transcriptContent,
126
- producer: task.id,
127
- });
128
- }
129
- ```
130
-
131
- **Problem**:
132
- 1. **JSONL corruption**: the tail read cuts at a fixed byte offset, not on a `\n` → the first line of the transcript artifact is very likely a **partial JSON line** that cannot be parsed. Any tool replaying the transcript will skip the first line (losing an important event).
133
- - Fix: after reading, find the first newline and drop the bytes before it. Or prepend a header marker `[truncated head]`.
134
- 2. **`relativePath` does not match the source file**: if NEW-2 is fixed correctly (`attempt-i.jsonl`), then the artifact should reference that name. Currently the artifact always writes `transcripts/${task.id}.jsonl` → loses the attempt information.
135
- 3. **UTF-8 boundary**: `buf.slice(0, bytesRead).toString('utf-8')` can cut in the middle of a multi-byte character → the first character becomes `\uFFFD`. Minor but worth noting.
136
- 4. **Cap is only 5MB** for the artifact, but the source `transcriptPath` is not capped → can still grow very large (M2 only solves the artifact memory, not the disk).
137
-
138
- ---
139
-
140
- ## 2. Remaining lint warnings
141
-
142
- Installed `@biomejs/biome` (L1 OK). When running `npx biome lint` on the changed files, 2 warnings remain:
143
-
144
- ### LINT-1 — `task-runner.ts:350` `yieldResult` unused
145
-
146
- ```ts
147
- let yieldResult: YieldResult | undefined;
148
- // ... assigns yieldResult = extractYieldResult(yieldEvent);
149
- // but never read again
150
- ```
151
-
152
- `yieldResult` is assigned but never used anywhere below. The yield logic is "dangling". Either remove the variable, or use it to override task.result/finalText. Needs confirmation from the owner.
153
-
154
- ### LINT-2 — `team-runner.ts:270` `runPromise` unused
155
-
156
- ```ts
157
- const runPromise = registerRunPromise(manifest.runId);
158
- ```
159
-
160
- `registerRunPromise` has a side effect (registers into the tracker), but the variable name is unnecessary. You could change it to `void registerRunPromise(manifest.runId);` so biome ignores it, or rename to `_runPromise`.
161
-
162
- > Do not wire `lint:check` into CI until these 2 warnings are fixed, otherwise it will add noise to every PR.
163
-
164
- ---
165
-
166
- ## 3. Original issues fixed well (details)
167
-
168
- ### H1 — Event-log overflow (PASS)
169
-
170
- `appendEventInsideLock` was fixed correctly:
171
- - Terminal events are always appended regardless of size.
172
- - Non-terminal events that hit the overflow → `compactEventLog` immediately, and if still too large → `rotateEventLog`.
173
- - The `skippedDueToSize` flag is only set when both compact + rotate fail to reduce size (very rare).
174
-
175
- **Minor notes**:
176
- - `appendCounter++` still runs even when `skippedDueToSize === true`. Not a bug but makes the `% 100` rotation trigger one cycle early — does not affect correctness.
177
- - The seq number is still consumed when skipped → when a consumer sees a "gap" in seq they may worry. You can set `metadata.appended: false` (already present) so consumers skip safely. OK.
178
- - Depends on `rotateEventLog` (NEW-1 broken). When NEW-1 fails, the fallback path is `appendFileSync` which still appends to a file > 50MB → the file keeps growing.
179
-
180
- ### H2 — Mailbox lock (PASS)
181
-
182
- Wraps `appendFileSync` in `withEventLogLockSync`. Reasonable.
183
-
184
- **Notes**:
185
- - The lock by `eventsPath` is actually by `mailboxFile(...)`, i.e., `inbox.jsonl` and `outbox.jsonl` have independent locks. OK for cross-process.
186
- - `withEventLogLockSync` was not exported before; it was changed to `export function` — acceptable but the name is slightly misleading when used for the mailbox. Consider extracting a generic `withJsonlAppendLock`.
187
- - The lock only protects append. Other paths like `updateMailboxMessageReply` (which already uses `atomicWriteFile` rewrite) or `validateMailbox` are not affected.
188
-
189
- ### H3 — Atomic-write fallback symlink TOCTOU (PASS)
190
-
191
- ```ts
192
- try {
193
- const lstat = fs.lstatSync(filePath);
194
- if (lstat.isSymbolicLink()) {
195
- try { fs.rmSync(tempPath, { force: true }); } catch {}
196
- throw renameError;
197
- }
198
- } catch {
199
- // File might not exist yet — safe to proceed with fallback.
200
- }
201
- ```
202
-
203
- OK. Note: the outer catch swallows **all** errors from `lstatSync`, not just ENOENT. If `lstatSync` fails with EACCES (permission denied), the fallback proceeds even though it may not be safe. Could narrow to `(err as NodeJS.ErrnoException).code === "ENOENT"`.
204
-
205
- ### H4 — Rename `__test__mergeTaskUpdates` (PASS)
206
-
207
- ```ts
208
- export function mergeTaskUpdatesPreservingTerminal(...) { ... }
209
- /** @deprecated Use mergeTaskUpdatesPreservingTerminal. ... */
210
- export const __test__mergeTaskUpdates = mergeTaskUpdatesPreservingTerminal;
211
- ```
212
-
213
- Nice. Good backward compatibility. The caller inside `executeTeamRunCore` also needs updating — quick check:
214
-
215
- ```
216
- > rg "__test__mergeTaskUpdates" -n src
217
- src/runtime/team-runner.ts:117:export const __test__mergeTaskUpdates = mergeTaskUpdatesPreservingTerminal;
218
- src/runtime/team-runner.ts:545: tasks = __test__mergeTaskUpdates(tasks, results); ← still uses the alias
219
- ```
220
-
221
- Production code still calls the alias `__test__mergeTaskUpdates`. Suggestion: change the caller to `mergeTaskUpdatesPreservingTerminal` so only the test file uses the alias.
222
-
223
- ### M3 — Cleanup race-safe stat (PASS)
224
-
225
- Uses `withFileTypes`, wraps `statSync` in try/catch. OK.
226
-
227
- ### M4 — runSetupHook multi-line JSON (PASS)
228
-
229
- Tries `JSON.parse(trimmed)` first, then falls back to the last line. OK.
230
-
231
- **Minor note**: two nested try/catch inside the outer try → the outer catch (parse error logging) almost never triggers because the inner catch already swallows. Could be cleaned up. Does not affect correctness.
232
-
233
- ### M5 — symlink fail logging (PASS)
234
-
235
- Logs the reason + a Windows non-admin hint. Note the indentation is slightly off (5 tabs instead of 1) — biome auto-format will fix it.
236
-
237
- ### M6 — final-drain telemetry (PASS)
238
-
239
- ```ts
240
- if (forcedFinalDrain && !timeoutError && exitCode !== 0) {
241
- logInternalError("child-pi.final-drain-zero-exit", new Error(`Child exit code overridden to 0 after forced final drain (original=${exitCode})`), `pid=${child.pid}, finalDrainMs=${finalDrainMs}`);
242
- }
243
- ```
244
-
245
- OK. Uses `logInternalError` (not a metric counter). In the future, emit a metric `crew.child.final_drain_force_zero_total` via MetricRegistry so the dashboard can count it — `logInternalError` is only a backup observability.
246
-
247
- **Note**: the indentation block is off (5 tabs for the if-block inside a 4-tab parent block). Biome will flag it.
248
-
249
- ### L1 — Biome added (PASS)
250
-
251
- `@biomejs/biome ^2.4.15` + good `biome.json` config:
252
- - `recommended: true`, indent tab × 4, double quotes, semicolons always.
253
- - Disables some unsuitable rules (`noNonNullAssertion`, `noUselessSwitchCase`, …).
254
- - `useIgnoreFile: true` reads `.gitignore`.
255
-
256
- **Still missing**:
257
- - `npm run lint` script in `package.json`.
258
- - CI does not run biome in `npm run ci`.
259
-
260
- Suggested additions:
261
- ```json
262
- "scripts": {
263
- "lint": "biome lint .",
264
- "format": "biome format --write .",
265
- "ci": "npm run typecheck && npm run lint && npm run check:lazy-imports && npm test && npm pack --dry-run"
266
- }
267
- ```
268
-
269
- ### L12 — Rename references (PASS, with risk)
270
-
271
- `updateReferencesForRename` was expanded:
272
- 1. Workflow step.role → renamed along with the agent rename. **Logic warning**: `step.role` is actually the role name within the team, not the agent name. These are two different concepts: agent `coder` can be used for role `developer`. Updating step.role when renaming an agent is **semantically wrong** and can break a valid workflow.
273
- - Suggestion: only rename `team.roles[*].agent` (already done in the earlier loop), do not touch `step.role`.
274
- 2. Update test fixtures via regex.
275
- ```ts
276
- const agentPattern = new RegExp('(["\'\\`]agent[="\':\\s]*)' + escapeRegex(oldName) + '(["\'\\`]|\\s)', 'g');
277
- ```
278
- - This regex is complex + has a template-literal mess, very prone to false positives/negatives. For example:
279
- - It will match `"agent": "coder"` (OK)
280
- - It will NOT match `agent: coder` (oldName without quotes)
281
- - It will false-match if there is a variable named `agent_other = "coder"`
282
- - The `escapeRegex` regex: `/[.*+?^${}()|[\\]\\]/g` — correct (verified the character class).
283
- - **Suggestion**: test fixture rewrites should not use regex; if needed, parse YAML/markdown frontmatter / TS AST.
284
- 3. `walkTsFiles` recursively processes all `.ts`/`.md` in the test dir. OK but I/O-heavy for a rename op.
285
-
286
- ---
287
-
288
- ## 4. Incidental side fixes (not in the original scope)
289
-
290
- Some changed files do not belong to the 4 batches above — appear to be general cleanup:
291
-
292
- - `src/extension/team-tool.ts` — changed `import { … }` to `import type { … }` for 2 lazy-load spots. Reasonable (avoids runtime import side effects).
293
- - `src/extension/team-tool.ts` — `let nextTasks` → `const nextTasks`. Correct (not reassigned).
294
- - `src/runtime/team-runner.ts` — `let workflow` → `const workflow`. Correct.
295
- - `src/runtime/code-summary.ts`, `manifest-cache.ts`, `prose-compressor.ts`, `result-extractor.ts`, `retry-executor.ts`, `skill-instructions.ts`, `observability/event-to-metric.ts`, `utils/gh-protocol.ts`, `utils/names.ts`, `utils/sse-parser.ts`, `config/markers.ts`, `config/resilient-parser.ts`, `adapters/export-util.ts`, `worktree/cleanup.ts` (M3 + others) — mostly biome auto-fixes (formatting / unused imports). Diff stat is small (~1-2 lines/file).
296
-
297
- Need to verify biome did not break logic (especially since the `noUnusedImports` rule was turned off but the `1 deletion` changes in `result-extractor.ts`, `skill-instructions.ts`, `sse-parser.ts` are suspicious).
298
-
299
- ```bash
300
- git diff src/runtime/result-extractor.ts src/runtime/skill-instructions.ts src/utils/sse-parser.ts
301
- ```
302
-
303
- ---
304
-
305
- ## 5. Verification
306
-
307
- ```bash
308
- npm run typecheck → PASS
309
- npm run test:unit → 1596 pass / 2 skip / 0 fail / 87s
310
- npx biome lint <changed files> → 2 warnings (LINT-1, LINT-2)
311
- ```
312
-
313
- Tests still pass because:
314
- - NEW-1 does not trigger in unit tests (rotateEventLog only runs when the file > 50MB).
315
- - NEW-2 has no specific test for transcript-per-attempt collision.
316
- - NEW-3 has no test for a transcript cap > 5MB.
317
-
318
- ---
319
-
320
- ## 6. Recommended actions (by priority)
321
-
322
- 1. **Fix NEW-1 now**: change `require` → top-level `import { logInternalError } from "../utils/internal-error.ts"`. (1 minute)
323
- 2. **Fix NEW-2**: move the `transcriptPath = ...attempt-${i}...` line inside the `for` loop. (2 minutes)
324
- 3. **Fix NEW-3**: cut the tail on the `\n` boundary; update the artifact `relativePath` to match the source filename; prepend a `[truncated]\n` marker so consumers know.
325
- 4. **Add unit tests** for:
326
- - `rotateEventLog` (rename + create empty)
327
- - `appendEvent` with a file > 50MB → terminal event still persisted
328
- - `appendMailboxMessage` concurrent (spawn 2 workers, check no interleaving)
329
- - Transcript per-attempt (mock 2 attempts, verify 2 separate files)
330
- - Atomic-write fallback symlink TOCTOU (mock rename fail + symlink swap)
331
- 5. **Clean up LINT-1, LINT-2** before wiring biome into CI.
332
- 6. **Suggested: add a `lint` script** to `package.json` + run biome in `ci`.
333
- 7. **Re-review L12**: remove the `step.role` update logic (semantically wrong) or gate it behind an `--unsafe-rename` flag.
334
- 8. **Re-verify biome auto-fix side fixes** in `result-extractor.ts`, `skill-instructions.ts`, `sse-parser.ts` (3 files with suspicious `-1 deletion`).
335
-
336
- ---
337
-
338
- ## 7. Conclusion
339
-
340
- The direction is correct, most of the original issues have been resolved. However, 3 fixes have **logic bugs** (NEW-1, NEW-2, NEW-3) that mean the "anti-overflow" and "per-attempt transcript" features do not work as intended. Because the old tests do not cover these code paths, the regressions pass the current suite.
341
-
342
- After fixing the 3 bugs above + adding tests, we will have a significantly more robust codebase compared to the baseline review.
@@ -1,156 +0,0 @@
1
- # Project Review — Round 4 (Full Code Re-read)
2
-
3
- **Date:** 2026-05-18
4
- **Scope:** Fresh code-level review of all 11 changed source files + background-runner.ts + stale-reconciler.ts
5
- **Verification:** typecheck PASS, biome lint 0 warning/0 error, tests 1596 pass / 2 skip / 0 fail
6
-
7
- ---
8
-
9
- ## 1. Previous Issues — Final Status
10
-
11
- | ID | Severity | Description | Status |
12
- |----|----------|-------------|--------|
13
- | H1 | HIGH | Event-log overflow loses terminal events | FIXED — `isTerminal` check, compact-before-skip, rotate-if-still-over |
14
- | H2 | HIGH | Mailbox append interleaves on Windows | FIXED — `withEventLogLockSync` wraps `appendFileSync` |
15
- | H3 | HIGH | Atomic-write TOCTOU symlink bypass | FIXED — `lstatSync.isSymbolicLink()` re-check before fallback |
16
- | H4 | HIGH | `mergeTaskUpdates` drops terminal state | FIXED — `mergeTaskUpdatesPreservingTerminal` + `__test__` alias |
17
- | M1 | MED | Transcript shared across fallback attempts | FIXED — `transcriptPath` inside `for` loop with `i` |
18
- | M2 | MED | Transcript cap cuts mid-JSONL line | FIXED — snap to `\n` boundary; `relativePath` uses `attempt-${usedAttempt}` |
19
- | M3 | MED | Cleanup readdir→stat race | FIXED — `withFileTypes` + try/catch statSync |
20
- | M4 | MED | Setup hook multi-line JSON lost | FIXED — try full trimmed parse before last-line fallback |
21
- | M5 | MED | Symlink fail silent on Windows | FIXED — `logInternalError("worktree.symlink-fail")` with Windows hint |
22
- | M6 | MED | Forced final-drain hides crash | FIXED — `logInternalError("child-pi.final-drain-zero-exit")` |
23
- | L1 | LOW | No linter configured | FIXED — Biome + `biome.json` |
24
- | L12 | LOW | Rename doesn't update workflow steps / test fixtures | FIXED — `step.role` + test fixture regex |
25
- | NEW-1 | — | `require()` in ESM module | FIXED — top-level `import` |
26
- | NEW-2 | — | Transcript path outside for-loop | FIXED — inside loop using `i` |
27
- | NEW-3 | — | Transcript cap mid-line + wrong relativePath | FIXED — snap `\n` + attempt-relative path |
28
- | LINT-1 | — | `yieldResult` unused variable | FIXED — `_yieldResult` prefix |
29
- | LINT-2 | — | `runPromise` unused variable | FIXED — `void registerRunPromise()` |
30
-
31
- **All 17 issues: VERIFIED FIXED in code.**
32
-
33
- ---
34
-
35
- ## 2. Newly Discovered Issues
36
-
37
- ### NEW-4 [MED] — Duplicate transcript-cap logic with two 5MB constants
38
-
39
- `task-runner.ts` has **two** nearly identical transcript cap blocks:
40
- - Lines 253–270: `MAX_TRANSCRIPT_PARSE_BYTES` — caps the transcript for parsing (inside the `for` loop per-attempt)
41
- - Lines 314–334: `MAX_TRANSCRIPT_ARTIFACT_BYTES` — caps the transcript for artifact storage (after loop, using `usedAttempt`)
42
-
43
- Both are `5 * 1024 * 1024`, both use the same `readSync` + snap-to-`\n` pattern. This is not a bug per se (they serve different purposes — parse vs. artifact), but the duplication means a size change in one must be manually mirrored in the other. A shared helper would reduce maintenance risk.
44
-
45
- **Risk:** LOW — divergent caps would cause subtle mismatch.
46
- **Recommendation:** Extract `tailReadWithLineSnap(filePath, maxBytes)` helper.
47
-
48
- ### NEW-5 [LOW] — `transcriptPath ?? fallback` redundant `??`
49
-
50
- Line 306: `parseSessionUsage(transcriptPath ?? \`...attempt-${usedAttempt}.jsonl\`)`
51
-
52
- After the `for` loop, `transcriptPath` is always set (it's assigned at the top of each iteration, and `attemptModels.length >= 1` is guaranteed). The `??` fallback can never trigger. It's defensive but misleading — suggests `transcriptPath` might be undefined when it can't be.
53
-
54
- **Risk:** NONE — just dead code.
55
- **Recommendation:** Replace with direct `transcriptPath` or add a comment explaining it's a safety net.
56
-
57
- ### NEW-6 [LOW] — `executeTeamRunCore` still calls `__test__mergeTaskUpdates` alias
58
-
59
- Line 548 of `team-runner.ts`: `tasks = __test__mergeTaskUpdates(tasks, results);`
60
-
61
- The deprecated alias works, but production code calling a `__test__`-prefixed function is semantically wrong. It was kept for backward compat during migration but should be switched to `mergeTaskUpdatesPreservingTerminal`.
62
-
63
- **Risk:** NONE — functionally identical.
64
- **Recommendation:** Replace `__test__mergeTaskUpdates` → `mergeTaskUpdatesPreservingTerminal` in production call sites.
65
-
66
- ### NEW-7 [LOW] — H3 outer `catch` swallows non-ENOENT errors
67
-
68
- In `atomic-write.ts`, the `lstatSync` catch block after rename failure has a bare `catch {}` with comment "File might not exist yet — safe to proceed with fallback." This also catches `EACCES` (permission denied), where proceeding with `writeFileSync` is risky — could overwrite a file we can't even stat.
69
-
70
- **Risk:** LOW — only triggers in edge case (rename fails + lstat returns EACCES).
71
- **Recommendation:** Narrow catch to only ENOENT/ENOTDIR; re-throw EACCES.
72
-
73
- ### NEW-8 [LOW] — Non-usedAttempt transcript files not in `manifest.artifacts`
74
-
75
- Only `attempt-${usedAttempt}.jsonl` is registered as an artifact. Earlier failed attempts' transcripts exist on disk but are invisible to the artifact system. This could surprise users looking for fallback-attempt details.
76
-
77
- **Risk:** LOW — data exists on disk, just not referenced.
78
- **Recommendation:** Consider registering all attempt transcripts as artifacts, or documenting that only the successful/last attempt is exposed.
79
-
80
- ### NEW-9 [LOW] — `getEventLogStats` reads entire file for line count
81
-
82
- In `event-log-rotation.ts`, `getEventLogStats` calls `fs.readFileSync(eventsPath, "utf-8")` and splits to count lines. For large files (near 4MB), this is a full-file read. The function is likely called from status/UI paths that could be latency-sensitive.
83
-
84
- **Risk:** LOW — event logs are capped at 4MB so read is bounded.
85
- **Recommendation:** Use incremental reader or byte-estimation like `needsRotation` does.
86
-
87
- ### NEW-10 [LOW] — `compactEventLog` TOCTOU: events appended during window may be lost
88
-
89
- The compaction reads all events, keeps last N, then atomically writes. Events appended between `readEvents` and `atomicWriteFile` are lost. The post-write re-read check (`C2`) only detects them — it doesn't actually re-append them (the comment says "no data loss occurred since atomicWriteFile preserves appends after its write point" but that's incorrect — `atomicWriteFile` replaces the entire file content).
90
-
91
- **Risk:** LOW — compaction only runs when event count > 50,000 and the window is short. Terminal events are always preserved by the caller.
92
- **Recommendation:** The post-write check should actually re-append any events that were in the file but not in `kept`. Or use `appendFileSync` for recovery instead of trusting atomicWriteFile.
93
-
94
- ---
95
-
96
- ## 3. Additional Files Reviewed
97
-
98
- ### `background-runner.ts`
99
- - Well-structured with proper lazy loading of `executeTeamRun`
100
- - `setupUnhandledRejectionGuard` is a good defensive measure for Node.js v24
101
- - `startInterruptGuard` polls `foreground-control.json` every 3s — acceptable for background process
102
- - `scrubProcessEnv` removes macOS malloc debug vars — practical
103
- - No issues found.
104
-
105
- ### `stale-reconciler.ts`
106
- - Three-phase reconciliation logic is sound (result check → PID liveness → staleness)
107
- - `hasRecentActiveEvidence` correctly considers heartbeat + agent progress
108
- - 24h threshold for alive-stale runs is reasonable
109
- - No issues found.
110
-
111
- ### `event-log.ts` (full re-read)
112
- - Sequence cache with LRU eviction (256 entries) — reasonable
113
- - Buffered append with 20ms coalescing — good for high-frequency `task.progress`
114
- - `appendEventInsideLock` correctly handles overflow (compact → rotate → skip non-terminal)
115
- - `dedupeTerminalEvents` using fingerprint — prevents duplicate terminal events on replay
116
- - Process exit/SIGTERM/SIGINT auto-flush — good
117
- - Minor: `scanSequence` reads entire file when cache misses — could use incremental reader
118
-
119
- ### `mailbox.ts` (full re-read)
120
- - Symlink safety checks on all path resolutions — thorough
121
- - `rotateMailboxFileIfNeeded` at 10MB — good for long-running runs
122
- - Archive-aware reads (`safeReadMailboxFile`) — handles rotated files correctly
123
- - H2 lock applied correctly around `appendFileSync`
124
- - `updateMailboxMessageReply` rewrites entire mailbox file via `atomicWriteFile` — acceptable for low-frequency operation
125
-
126
- ---
127
-
128
- ## 4. Verification Results
129
-
130
- ```
131
- npx tsc --noEmit → PASS
132
- npx biome lint (11 changed files) → 0 errors, 0 warnings
133
- npm test (1598 tests) → 1596 pass, 2 skip, 0 fail
134
- ```
135
-
136
- ---
137
-
138
- ## 5. Prioritized Action Items
139
-
140
- | Priority | ID | Action |
141
- |----------|----|--------|
142
- | P2 | NEW-10 | Fix compactEventLog TOCTOU — re-append events lost during compaction window |
143
- | P3 | NEW-4 | Extract `tailReadWithLineSnap()` helper to deduplicate two transcript-cap blocks |
144
- | P3 | NEW-6 | Replace `__test__mergeTaskUpdates` → `mergeTaskUpdatesPreservingTerminal` in production code |
145
- | P3 | NEW-7 | Narrow `lstatSync` catch to ENOENT/ENOTDIR only in atomic-write fallback |
146
- | P4 | NEW-5 | Remove redundant `??` fallback or add explanatory comment |
147
- | P4 | NEW-8 | Register all attempt transcripts as artifacts, or document behavior |
148
- | P4 | NEW-9 | Use incremental reader in `getEventLogStats` for line count |
149
- | — | CI | Add `lint` script to `package.json`; integrate biome into CI pipeline |
150
- | — | Tests | Add unit tests for: `rotateEventLog`, overflow terminal-event persistence, mailbox concurrent append, transcript per-attempt, symlink TOCTOU fallback |
151
-
152
- ---
153
-
154
- ## 6. Summary
155
-
156
- The codebase is in a **clean, production-ready state** after 3 rounds of fixes. All 17 previously identified issues are verified fixed in actual code, with typecheck + lint + tests all passing. The 7 new findings are LOW-priority improvements — no HIGH or MED bugs remain. The most actionable item is NEW-10 (compaction TOCTOU) which could cause event loss under rare high-concurrency compaction, but the practical impact is minimal since terminal events bypass the compaction path entirely.
@@ -1,86 +0,0 @@
1
- # Project Review — Round 5 (NEW-4–10 Fix Review)
2
-
3
- **Date:** 2026-05-18
4
- **Scope:** Review fixes for NEW-4 through NEW-10 from PROJECT_REVIEW_ROUND4
5
- **Commits reviewed:** `200b282`, `2db2fc7`, `393fc7b`
6
- **Verification:** typecheck PASS, biome lint on changed files 0 error/0 warning, tests 1596 pass / 2 skip / 0 fail
7
-
8
- ---
9
-
10
- ## 1. Fix Status Summary
11
-
12
- | ID | Description | Fix | Status |
13
- |----|-------------|-----|--------|
14
- | NEW-4 [MED] | Duplicate transcript-cap logic | Extract `tailReadWithLineSnap()` in `task-runner/tail-read.ts`; both blocks now call helper | **FIXED** |
15
- | NEW-5 [LOW] | `transcriptPath ??` redundant fallback | Added comment "Safety net: transcriptPath may be undefined in edge cases" | **FIXED** (documented) |
16
- | NEW-6 [LOW] | `__test__mergeTaskUpdates` in production | Replaced with `mergeTaskUpdatesPreservingTerminal` | **FIXED** |
17
- | NEW-7 [LOW] | atomic-write catch swallows non-ENOENT | Narrowed to only ENOENT/ENOTDIR; re-throws EACCES etc. | **FIXED** |
18
- | NEW-8 [LOW] | Non-usedAttempt transcripts not in artifacts | Loop registers all attempt transcripts as artifacts | **FIXED** |
19
- | NEW-9 [LOW] | `getEventLogStats` reads entire file | Stream-scan newlines in 8KB chunks + tail-read for timestamps | **FIXED** (with bug fix, see below) |
20
- | NEW-10 [LOW] | `compactEventLog` TOCTOU loses events | Post-write re-read + re-append missing events via fingerprint set | **FIXED** (with caveat, see below) |
21
-
22
- ---
23
-
24
- ## 2. Bugs Found in Fixes
25
-
26
- ### BUG-1 [MED] — `getEventLogStats` returns `newestTimestamp: undefined`
27
-
28
- **Root cause:** JSONL files end with `\n`, so `tailStr.lastIndexOf("\n")` always finds the trailing newline. `tailStr.slice(lastNewline + 1).trim()` yields empty string → `lastLine` = "" → `newestTimestamp` = undefined.
29
-
30
- **Fix applied:** Changed to walk backwards through newlines, skipping empty lines, to find the last non-empty line.
31
-
32
- **Status:** FIXED — test `getEventLogStats` now passes.
33
-
34
- ### BUG-2 [LOW] — `atomic-write.ts` unused variable + bad indentation
35
-
36
- **Root cause:** Commit `200b282` introduced `let symlinkCheckFailed = false;` which is never read or mutated. Also `if (lstat.isSymbolicLink())` had extra indent and `try { fs.rmSync }` was misaligned.
37
-
38
- **Fix applied:** Removed `symlinkCheckFailed`, fixed indentation.
39
-
40
- **Status:** FIXED.
41
-
42
- ### Observation-1 — `compactEventLog` re-append uses JSON.stringify comparison
43
-
44
- The `missingEvents` detection in NEW-10 compares events by `JSON.stringify(e)`. Two events with identical payload but different metadata (e.g., different `seq` or `provenance`) could falsely match, causing a missing event to be skipped. In practice, terminal events have unique fingerprints and non-terminal events are re-derivable, so this is a low-risk concern.
45
-
46
- **Risk:** LOW
47
- **Recommendation:** Use `metadata.fingerprint` or `metadata.seq` for comparison instead of full JSON serialization, if higher precision is needed.
48
-
49
- ### Observation-2 — `compactEventLog` re-append runs outside lock
50
-
51
- The `fs.appendFileSync` for missing events in the recovery path runs outside `withEventLogLockSync`. In high-concurrency scenarios, this could interleave with other appends.
52
-
53
- **Risk:** LOW — compaction is infrequent and the recovery path is best-effort.
54
- **Recommendation:** Wrap recovery appends in `withEventLogLockSync` for consistency.
55
-
56
- ---
57
-
58
- ## 3. Verification
59
-
60
- ```
61
- npm run typecheck → PASS
62
- npx biome lint (5 changed files) → 0 errors, 0 warnings
63
- node --test test/unit/*.test.ts (1598 tests) → 1596 pass, 2 skip, 0 fail
64
- - getEventLogStats → PASS (was FAIL, fixed)
65
- - atomic-write tests → PASS
66
- ```
67
-
68
- Note: `npx biome lint src/` reports 8 errors + 41 warnings in **other** files (register.ts, commands.ts, viewers.ts, status.ts, model-resolver.ts, visual.ts, sse-parser.ts). These are pre-existing and unrelated to the current fixes. The 5 changed files are all clean.
69
-
70
- ---
71
-
72
- ## 4. Remaining Items
73
-
74
- | Priority | ID | Action |
75
- |----------|----|--------|
76
- | P3 | Observation-1 | Use fingerprint/seq for compactEventLog missing-event detection |
77
- | P3 | Observation-2 | Wrap compactEventLog recovery appends in withEventLogLockSync |
78
- | P4 | Pre-existing lint | Fix 8 biome errors + 41 warnings in unrelated files |
79
- | — | CI | Add `lint` script to `package.json`; integrate biome into CI pipeline |
80
- | — | Tests | Add unit tests for: `tailReadWithLineSnap`, `getEventLogStats` with large files, compactEventLog TOCTOU recovery |
81
-
82
- ---
83
-
84
- ## 5. Summary
85
-
86
- All 7 NEW-* issues from Round 4 have been fixed. Two bugs were discovered in the NEW-9 fix (`newestTimestamp` undefined due to trailing newline) and NEW-7 fix (unused variable + indentation), both fixed. The codebase is in a clean state with all tests passing. Two low-risk observations remain for compactEventLog recovery precision and locking. No HIGH or MED bugs remain.