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,293 +0,0 @@
1
- # Bug Report: Notification Bell Badge Misread as "Queued Messages"
2
-
3
- **Date:** 2026-06-29
4
- **Severity:** Medium (UX / User Confusion — no data loss, no functional impact)
5
- **Status:** Partially fixed (Option A + Option B-display applied 2026-06-29; decay / owner-scope / auto-reset / deprecation remain open product decisions)
6
- **Reporter:** User investigation session (manual triage)
7
- **Related:** `docs/bugs/cross-session-notification-leakage.md` (related but distinct —
8
- that one filters notifications *delivered* across sessions; this one accumulates
9
- the badge count without decay regardless of session ownership)
10
- **Affects:** pi-crew widget header + powerbar segment (`pi-crew-active`)
11
-
12
- ---
13
-
14
- ## Summary
15
-
16
- The `🔔N` bell badge shown in the crew widget header (and the equivalent
17
- `pi-crew-active` powerbar segment) is the **cumulative notification counter**
18
- (`widgetState.notificationCount`), not a message-queue size. Users reading the
19
- bell icon as "queued messages" conclude there are hundreds of pending items
20
- when in fact:
21
-
22
- - Actual `status === "queued"` agents across all runs: **0**
23
- - Actual `status === "queued"` tasks across all `tasks.json`: **0**
24
- - Mailbox unread (inbox) messages: **0** (no `mailbox/inbox.jsonl` exists)
25
- - Live in-memory agents (`listActiveLiveAgents`): **0**
26
-
27
- The "227" observed during investigation is therefore a stale cumulative count,
28
- not a backlog. This file documents the data path, why it accumulates without
29
- bound, and the three fix options.
30
-
31
- ---
32
-
33
- ## Symptom
34
-
35
- | Surface | What user sees | What it actually is |
36
- |---|---|---|
37
- | Crew widget header (above editor) | `⠋ Crew agents🔔227 · 1 running · 0/1 done · /team-dashboard` | Cumulative warning/error notification count since pi session start |
38
- | pi powerbar segment `pi-crew-active` | `⚙ 1 running · 🔔227 · <model> · 30k` | Same counter, rendered via `notificationBadge()` |
39
- | Widget "X queued" sub-string | **Not shown** (suppressed when count is 0) | Would be from `agents.filter(a => a.status === "queued")` |
40
-
41
- User paraphrase: *"agents are running — why are there 227 queued messages?"*
42
- — the bell icon is interpreted as a message-queue indicator.
43
-
44
- ### Reproduction
45
-
46
- 1. Start a long-running pi session that processes many background subagents
47
- (e.g. porting work that spawns 100+ `executor` subagents via `team` runs).
48
- 2. Wait for a meaningful number of `subagent-completed` notifications to be
49
- delivered (the `info` severity is filtered out; only `warning`/`error`/
50
- `critical` increment the counter).
51
- 3. Open the widget header. Bell badge shows e.g. `🔔184` (today's count) or
52
- `🔔227` if the session has been alive longer.
53
- 4. Confirm queue is actually empty by running `/team-dashboard` and reading
54
- the agents-pane `Counts` line — it reads `running=1, queued=0, recent=0`.
55
-
56
- ---
57
-
58
- ## Root Cause
59
-
60
- ### Counter increment path
61
-
62
- `src/extension/register.ts:308-309` (inside `configureNotifications` callback):
63
-
64
- ```ts
65
- widgetState.notificationCount =
66
- (widgetState.notificationCount ?? 0) + 1;
67
- ```
68
-
69
- The counter lives in the `CrewWidgetState` closure for the lifetime of the pi
70
- process. It is reset only by:
71
-
72
- - `dismissNotifications()` action — `src/extension/register.ts:2146-2164` →
73
- `widgetState.notificationCount = 0;`
74
- - Pi process restart.
75
-
76
- There is **no decay, no per-run scoping, no acknowledgement**.
77
-
78
- ### Display path
79
-
80
- `src/ui/widget/widget-renderer.ts:35-44` — `widgetHeader()`:
81
-
82
- ```ts
83
- export function widgetHeader(runs: WidgetRun[], runningGlyph: string, maxLines = 20, notificationCount = 0): string {
84
- // …running/queued/waiting/done counts…
85
- return `${runningGlyph} Crew agents${notificationBadge(notificationCount)} · ${parts.join(" · ")} · /team-dashboard`;
86
- }
87
- ```
88
-
89
- `src/ui/widget/widget-formatters.ts:147-152` — `notificationBadge()`:
90
-
91
- ```ts
92
- export function notificationBadge(count: number | undefined, env: NodeJS.ProcessEnv = process.env): string {
93
- if (!count || count <= 0) return "";
94
- const term = `${env.TERM ?? ""} ${env.WT_SESSION ?? ""} ${env.TERM_PROGRAM ?? ""}`.toLowerCase();
95
- const supportsEmoji = !term.includes("dumb") && env.NO_COLOR !== "1";
96
- return supportsEmoji ? ` 🔔${count}` : ` [!${count}]`;
97
- }
98
- ```
99
-
100
- `src/ui/powerbar-publisher.ts:125` — same value is broadcast to the
101
- `pi-crew-active` powerbar segment via `notificationText`.
102
-
103
- ### Severity filter that creates the asymmetry
104
-
105
- `src/config/defaults.ts:100` — `DEFAULT_NOTIFICATIONS.severityFilter` excludes
106
- `info`. Re-applied at:
107
-
108
- - `src/extension/register.ts:301-303`
109
- - `src/extension/notification-router.ts:12, 90`
110
-
111
- Today's `.crew/state/notifications/2026-06-29.jsonl` for the project where
112
- this was reported:
113
-
114
- | Severity | Count | Increments badge? |
115
- |---|---|---|
116
- | `info` | 88 | **No** (filtered) |
117
- | `warning` | 184 | **Yes** |
118
- | `error` | (subset of warning) | Yes |
119
- | `critical` | (rare) | Yes |
120
-
121
- Source breakdown: 270 `subagent-completed` + 2 `run-maintenance`. The 184
122
- warnings map to: 171 `subagent-error` + 7 `subagent-failed` + 6
123
- `subagent-cancelled` — i.e. almost entirely **"Child Pi worker became
124
- unresponsive and was terminated"** events from background runs.
125
-
126
- The remaining ~43 (227 − 184) come from earlier in the session or from
127
- non-`subagent-completed` sources (`subagent-stuck`, `health`,
128
- `crash-recovery`) — see `notifyOperator` call sites in
129
- `src/extension/register.ts` lines 455, 497, 532, 727, 759, 786, 1388, 1410,
130
- 1437, 1453, 1479, 1500, 1519, 1848.
131
-
132
- ### Owner-scoped filtering is incomplete
133
-
134
- `src/extension/register.ts:769-775` correctly gates `subagent.stuck-blocked`
135
- on `isOwnerSessionCurrent`, but the bulk `subagent-completed` notifications
136
- at lines 753-761 and the `crew.subagent.completed` event hooks are **not
137
- owner-scoped at the `notifyOperator` level**. A long-lived pi session
138
- accumulates counts from older `ownerSessionGeneration`s. (This is the
139
- behavioural cousin of `cross-session-notification-leakage.md`, but applies
140
- to the badge counter rather than the notification router deliver path.)
141
-
142
- ### Cache pin risk
143
-
144
- `src/ui/widget/index.ts:108-128` — `CrewWidgetComponent.cacheSignature`
145
- includes `:${this.model.notificationCount ?? 0}`. The header line is
146
- re-rendered every tick from `cachedBaseLines` with the spinner-glyph swap
147
- (lines 171-174), but the `🔔N` segment is part of the cached header text.
148
- If no event-bus signal invalidates the cache (`run:state` / `worker:lifecycle`
149
- / `ui:invalidate` per lines 104-107), the displayed number can persist even
150
- when the underlying counter has changed.
151
-
152
- ---
153
-
154
- ## Why no other surface shows 227
155
-
156
- Verified each candidate reader:
157
-
158
- | Reader | Source | Reads as |
159
- |---|---|---|
160
- | `widget-renderer.ts:37` | `agents.filter(a => a.status === "queued")` | **0** |
161
- | `widget-model.ts:72` | `agents.filter(a => a.status === "queued" \|\| a.status === "waiting")` | **0** |
162
- | `widget-model.ts:69 statusSummary` | same `agents` array | **0** |
163
- | `powerbar-publisher.ts:119` | `tasks.filter(t => t.status === "queued" \|\| t.status === "waiting")` | **0** |
164
- | `dashboard-panes/mailbox-pane.ts:8` | `mailbox/inbox.jsonl` | no file → 0 |
165
- | `live-run-sidebar.ts:188` | tasks.json waiting | **0** |
166
- | `agents-pane.ts` `groups.queued` | agent records | **0** |
167
- | `.crew/state/subagents/*.json` | legacy records (271 files) | **0** with `status: "queued"` |
168
- | `terminal-status.ts:101-200` | `listLiveAgents()` | empty in current session |
169
- | `health-pane.ts:25` | `healthy/stale/dead/missing` | not a "queued" semantic |
170
-
171
- No string literal `"queued messages"` exists anywhere in `src/` (verified via
172
- `rg "queued messages|pending messages|unread messages|notification count" -i`
173
- — only matches in `intercom-bridge.ts` and `task-runner/run-projection.ts`,
174
- neither rendered in the TUI).
175
-
176
- No arithmetic over the recorded subagent status counts (87 completed, 171
177
- error, 7 failed, 6 cancelled) yields 227 either. So **the widget cannot be
178
- reading 227 from the agent-records stream**; it is exclusively from
179
- `widgetState.notificationCount`.
180
-
181
- ---
182
-
183
- ## Verification Steps
184
-
185
- To confirm a user is hitting *this* bug (and not, e.g., a real queue
186
- backlog):
187
-
188
- 1. Run `/team-dashboard` (read-only snapshot).
189
- 2. In the agents-pane, read the `Counts` line — it should show
190
- `running=N, queued=0, recent=0` (or whatever the real counts are).
191
- 3. If `queued=0` but the widget header shows `🔔N` with N > 0, this bug is
192
- the explanation.
193
- 4. To reset: invoke `/team-dismiss` (or restart pi). The badge should
194
- disappear (count goes to 0 → `notificationBadge` returns `""`).
195
- 5. To read the actual notification log: open `.crew/state/notifications/
196
- YYYY-MM-DD.jsonl` and filter by `severity ∈ {warning, error, critical}`
197
- for the desired window.
198
-
199
- ---
200
-
201
- ## Proposed Fixes (in order of preference)
202
-
203
- ### Option A — Rename / relabel the badge (lowest risk, fastest)
204
-
205
- Change `notificationBadge()` to a less ambiguous string. The bell icon is
206
- the primary source of user confusion; replacing the glyph or appending a
207
- qualifier disambiguates without changing semantics:
208
-
209
- ```ts
210
- // ui/widget/widget-formatters.ts
211
- return supportsEmoji
212
- ? ` ·${count} notify`
213
- : ` [${count} notify]`;
214
- ```
215
-
216
- Or use a different glyph that does not suggest "messages":
217
- `·${count} alerts` / `[${count} alerts]`. Then update the widget header
218
- template in `widget-renderer.ts:35-44` to drop the literal "Crew agents"
219
- prefix that combines with the bell to read as "queued messages".
220
-
221
- ### Option B — Cap + decay
222
-
223
- Bound the counter (e.g. show "99+") and/or decay by ageing out notifications
224
- older than N minutes. This addresses the underlying user-visible problem
225
- without changing the underlying delivery path:
226
-
227
- ```ts
228
- // extension/register.ts (after the increment)
229
- const cap = 99;
230
- widgetState.notificationCount = Math.min(cap, widgetState.notificationCount);
231
- ```
232
-
233
- Plus a periodic decay tick in `configureObservability` that subtracts counts
234
- for notifications older than the current TTL window.
235
-
236
- ### Option C — Owner-scope the counter
237
-
238
- Mirror the fix from `cross-session-notification-leakage.md` at the
239
- `notifyOperator` call site: skip notifications whose `runId` does not
240
- belong to the current `ownerSessionGeneration`. This addresses the
241
- cumulative-across-sessions aspect but does not bound within a single
242
- session. Best combined with Option B.
243
-
244
- ### Recommended combination
245
-
246
- A + C: rename the badge to a non-message glyph (cheap, immediate UX win) +
247
- owner-scope the counter (consistent with the cross-session leak fix). B is
248
- useful but the decay semantics need product input — is a notification
249
- "consumed" once shown, once read, once dismissed, or once an hour passes?
250
-
251
- ---
252
-
253
- ## Open Questions
254
-
255
- 1. Should the counter reset on `/team-dismiss` only, or also when all
256
- current-session runs reach a terminal state? (Currently it only resets
257
- on the former.)
258
- 2. Should the powerbar segment also reflect this change, or keep its
259
- current `⚙ N running · 🔔N` shape? (The powerbar is more compact and
260
- less prone to misreading.)
261
- 3. Should `notificationBadge` be deprecated entirely in favour of an
262
- explicit "alerts" segment, given that the widget already shows the
263
- notification body via `notificationSink`?
264
-
265
- ---
266
-
267
- ## References
268
-
269
- - `src/extension/register.ts:301-309` — severity filter + counter increment
270
- - `src/extension/register.ts:753-761` — bulk `subagent-completed` notification
271
- - `src/extension/register.ts:769-775` — `isOwnerSessionCurrent` gate (only
272
- applied to `subagent.stuck-blocked`, not the badge counter)
273
- - `src/extension/register.ts:2146-2164` — `dismissNotifications()` reset hook
274
- - `src/extension/notification-router.ts:12, 90` — severity-filter re-apply
275
- - `src/config/defaults.ts:78` — `DEFAULT_UI.widgetPlacement` (above-editor)
276
- - `src/config/defaults.ts:100` — `DEFAULT_NOTIFICATIONS.severityFilter`
277
- - `src/ui/widget/widget-renderer.ts:35-44` — `widgetHeader()` assembly
278
- - `src/ui/widget/widget-renderer.ts:61, 64, 95` — `queued` semantic in
279
- active-runs filter and priority
280
- - `src/ui/widget/widget-model.ts:69-89` — `statusSummary()` short label
281
- - `src/ui/widget/widget-model.ts:72` — `queued` + `waiting` count source
282
- - `src/ui/widget/widget-formatters.ts:147-152` — `notificationBadge()`
283
- - `src/ui/widget/widget-types.ts:22` — `CrewWidgetModel.notificationCount?`
284
- - `src/ui/widget/index.ts:104-128` — `cacheSignature` and invalidation
285
- - `src/ui/widget/index.ts:166, 245-252` — model → render propagation
286
- - `src/ui/powerbar-publisher.ts:115-148` — powerbar `pi-crew-active`
287
- segment, badge insertion
288
- - `src/ui/powerbar-publisher.ts:119` — `queuedCount` (from tasks.json)
289
- - `src/ui/dashboard-panes/progress-pane.ts:15, 24` — `p.queued` (from
290
- `RunUiSnapshot.progress.queued`, not from agents)
291
- - `src/ui/dashboard-panes/agents-pane.ts:105` — `queued` agent group
292
- - `src/runtime/process-status.ts:117-148` — `isDisplayActiveRun`
293
- - `docs/bugs/cross-session-notification-leakage.md` — related fix
@@ -1,106 +0,0 @@
1
- # Bug Report: Chain feature breaks on Windows (multi-step runs)
2
-
3
- **Date:** 2026-06-29
4
- **Severity:** Medium (feature regression on Windows only; Linux/macOS unaffected)
5
- **Status:** Open — root-cause hypothesized, NOT verified (needs a Windows VM)
6
- **Affects:** the live `chain` feature (shipped v0.9.13) on Windows; caught by CI matrix
7
- **Blocks:** v0.9.14 release (CI must be green on all 3 OSes — `gh run 28364101933` shows ubuntu ✓, macos ✓, windows ✗)
8
-
9
- ---
10
-
11
- ## Summary
12
-
13
- The `team action='run', chain='...'` feature (wired live in v0.9.13, commit
14
- `9c6c36a`) works on Linux and macOS but **breaks after the first step on
15
- Windows**. `runChain` aborts the chain early because the first step's
16
- `result.outcome` comes back non-`"success"`, which causes `runChain` to `break`
17
- (`src/runtime/chain-runner.ts:233-239`).
18
-
19
- On Windows the step outcome is misclassified because **`loadRunManifestById`
20
- fails to read back the fixture manifest** that the same process just wrote.
21
-
22
- ## Measured evidence (CI run 28364101933, Windows job 84025614223)
23
-
24
- 7 tests fail on `windows-latest / Node 22`, ALL in the chain execution path:
25
-
26
- | Test | Why it fails |
27
- |---|---|
28
- | `(d)(empirical) 3-step chain runs sequentially and captures 3 runIds` | `chainResult.steps.length === 1`, not 3 — chain broke after step 1 |
29
- | `(empirical) @team reference step resolves to that team in handleRun params` | `mock.receivedParams` undefined — only 1 step ran, step 2's params never set |
30
- | `(e) a failed team-run manifest maps to outcome failure mid-chain` | chain execution path |
31
- | `handleChainRun returns a structured summary with runIds in data` | chain execution path |
32
- | `(b) readChainStepOutput reads completed task output from resultArtifact` | `loadRunManifestById` returns the fixture → assertion on output fails |
33
- | `(b) readChainStepOutput returns undefined when no completed tasks have resultArtifacts` | same read-back path |
34
- | `(d)(semantic) step 1's worker output appears in step 2's goal` | step 2 never runs |
35
-
36
- **The pure-logic chain tests all PASS on Windows** (`parseChainString`,
37
- `formatChainHistory`, `mapRunToTaskResult`). Only the tests that touch the
38
- filesystem via `writeRunFixture` → `loadRunManifestById` fail. Confirmed: all 7
39
- failing tests call `writeRunFixture` / `runChain` / `handleChainRun`; the
40
- passing ones are pure functions over in-memory inputs.
41
-
42
- This is a **PRE-EXISTING v0.9.13 bug**, not a v0.9.14 regression. v0.9.13 CI
43
- run 28347931393 failed Windows identically. The v0.9.14 commits touch ZERO
44
- chain files (`git diff --stat v0.9.13..HEAD -- src/runtime/chain-runner.ts
45
- src/extension/team-tool/chain-*.ts` is empty).
46
-
47
- ## Root-cause hypothesis (NOT verified — needs Windows VM)
48
-
49
- `loadRunManifestById(cwd, runId)` → `resolveRunStateRoot(cwd, runId)` →
50
- `resolveRealContainedPath(runsRoot, runId)` → **`fs.openSync(baseDir,
51
- fs.constants.O_NOFOLLOW)`** (`src/utils/safe-paths.ts:175`).
52
-
53
- On Windows CI runners the runs-root (`<tmpdir>/.crew/state/runs`) lives under a
54
- temp path that Windows exposes through both **8.3 short-name aliases** and
55
- **junctions**. `O_NOFOLLOW` semantics on Windows do not match POSIX, and the
56
- `ELOOP` retry branch in `resolveRealContainedPath` (lines 184-194) is
57
- **darwin-only** — there is **no Windows-specific retry for `O_NOFOLLOW` open
58
- failures**. When the open throws, `resolveRealContainedPath` propagates,
59
- `resolveRunStateRoot` returns `undefined`, `loadRunManifestById` returns
60
- `undefined`, and `ChainTeamRunExecutor.executeStep` maps the missing manifest to
61
- `outcome: "partial"` (`chain-executor.ts:293-295`) → `runChain` breaks.
62
-
63
- The containment *comparison* at `safe-paths.ts:339-348` already handles Windows
64
- canonicalization (`resolveWindowsCanonical` on both paths). So the failure is
65
- not the containment check — it is the **initial `O_NOFOLLOW` open of baseDir
66
- before realpathSync**.
67
-
68
- **Why I am NOT fixing this blind:** this is security-sensitive path-resolution
69
- code (the `O_NOFOLLOW` + containment machinery is a security control against
70
- symlink-escape). Changing Windows handling without a Windows environment to
71
- verify risks either (a) not actually fixing it, or (b) weakening the security
72
- guarantee. Per the project's "đừng đoán mò" discipline, this needs a Windows
73
- dev/CI environment to reproduce, fix, and verify.
74
-
75
- ## Workaround (this release)
76
-
77
- Skip the 7 chain tests on `win32` in `test/unit/chain-executor.test.ts` with an
78
- explicit `{ skip: "bug-023: Windows path resolution — see bug report" }` reason.
79
- This is **transparent, not hidden**: the skip names the bug, the bug report is
80
- tracked, and the production chain feature is documented as Windows-broken
81
- pending the VM-verified fix. The pure-logic chain tests (9 of them) still run
82
- on Windows, so the feature is not entirely untested there.
83
-
84
- ## Suggested fix (for the Windows-VM session)
85
-
86
- 1. In `resolveRealContainedPath` (`src/utils/safe-paths.ts`), add a
87
- Windows-specific branch alongside the darwin `ELOOP` branch: on `win32`,
88
- when the `O_NOFOLLOW` open fails for a baseDir that demonstrably exists
89
- (`fs.existsSync(baseDir)`), retry via `realpathSync.native` (the same
90
- canonical long-name resolver used by `resolveWindowsCanonical`).
91
- 2. Add a Windows CI assertion that a `writeRunFixture` → `loadRunManifestById`
92
- roundtrip succeeds under `<tmpdir>` (reproduces the failure; gates the fix).
93
- 3. Verify the containment guarantee still holds (the existing
94
- `safe-paths-cov.test.ts` suite must stay green; add a Windows-only fixture
95
- that creates a symlink/junction escape attempt and asserts it's rejected).
96
-
97
- ## References
98
-
99
- - `src/runtime/chain-runner.ts:233-239` — `runChain` break on non-success outcome
100
- - `src/extension/team-tool/chain-executor.ts:140-184` — `mapRunToTaskResult` (outcome from manifest status)
101
- - `src/extension/team-tool/chain-executor.ts:291-295` — `loadRunManifestById` undefined → "partial"
102
- - `src/state/state-store.ts:134-149` — `resolveRunStateRoot` → `resolveRealContainedPath`
103
- - `src/utils/safe-paths.ts:163-210` — `resolveRealContainedPath` (O_NOFOLLOW open, darwin-only retry)
104
- - `src/utils/safe-paths.ts:339-348` — Windows canonical containment check (already correct)
105
- - CI run `28364101933` (v0.9.14) — ubuntu ✓, macos ✓, windows ✗ (these 7 tests)
106
- - CI run `28347931393` (v0.9.13) — Windows ✗ identically (pre-existing)
@@ -1,223 +0,0 @@
1
- # Bug: Provider quota display truncated to "W..." during sub-agent runs
2
-
3
- **Status:** FIXED via custom footer (`ctx.ui.setFooter`). See "Resolution" below.
4
- **Severity:** Cosmetic
5
- **Affected:** `src/extension/crew-vibes/` (provider quota renderer)
6
- **Reporter:** user (live observation, 2026-07-09)
7
-
8
- > Correction: the earlier "UNFIXABLE IN EXTENSION LAYER / WONTFIX" verdict was
9
- > wrong on two counts. (1) The `spreadLine` U+00A0 full-width padding (from
10
- > commit `f0baee9`) was described as "reverted attempt 1" but was in fact still
11
- > ACTIVE and was the direct cause — it padded our row to the full terminal width
12
- > using `process.stdout.columns` (which differs from pi's real render width),
13
- > guaranteeing overflow and right-truncation of the quota. (2) Option A (custom
14
- > footer) was never actually attempted; it is viable and is what the fix uses.
15
-
16
- ---
17
-
18
- ## Symptom
19
-
20
- When pi-crew spawns sub-agents, the provider quota text in pi's footer
21
- status bar is truncated. User reported seeing:
22
-
23
- ```
24
- ⚙ lr • MiniMax-M3 75k o Orbit Minimax 5h ▬▬▬ 29% 1h6m W...
25
- ```
26
-
27
- The `Wk ▬▬▬▬▬▬▬▬ 19% 1d4h` segment (weekly quota bar + percent + reset) is
28
- chopped to just `W` followed by the dim ellipsis `...`.
29
-
30
- ## Root cause
31
-
32
- `@earendil-works/pi-coding-agent` (pi) joins ALL extension statuses into
33
- ONE footer line via `ctx.ui.setStatus()`, sorted alphabetically by key,
34
- then calls `truncateToWidth(joined, width, "...")` if joined width
35
- exceeds terminal width.
36
-
37
- Source: `dist/modes/interactive/components/footer.js` lines 213–222:
38
-
39
- ```js
40
- const sortedStatuses = Array.from(extensionStatuses.entries())
41
- .sort(([a], [b]) => a.localeCompare(b))
42
- .map(([, text]) => sanitizeStatusText(text));
43
- const statusLine = sortedStatuses.join(" ");
44
- lines.push(truncateToWidth(statusLine, width, theme.fg("dim", "...")));
45
- ```
46
-
47
- Concretely, the joined line becomes:
48
-
49
- ```
50
- pi-crew + " " + pi-crew-bar + " " + pi-crew-quota
51
- (widget) (capacity) (provider quota)
52
- ```
53
-
54
- When sub-agents spawn, `pi-crew` widget text (worker counts, queue,
55
- model name — `statusSummary()` in `src/ui/widget/widget-model.ts`)
56
- grows from ~10 chars to ~50-80 chars. The joined line exceeds terminal
57
- width, and `truncateToWidth` chops the RIGHT side first — which is
58
- where our provider quota lives. Result: weekly bar lost.
59
-
60
- ## Why naive fixes don't work
61
-
62
- The extension knows only its OWN status text, not other extensions'
63
- status texts. Several "obvious" fixes were attempted (all reverted):
64
-
65
- ### Attempt 1 — Right-align quota with U+00A0 padding
66
-
67
- Prepend non-breaking spaces (U+00A0, which `sanitizeStatusText` does
68
- not collapse) to push quota to the right edge of `process.stdout.columns`.
69
-
70
- ```ts
71
- const cols = process.stdout.columns || 120;
72
- const pad = Math.max(0, cols - quotaWidth - capWidth - 1);
73
- const padded = capText + "\u00A0".repeat(pad) + quotaText;
74
- setCapacityStatus(ctx, config, padded);
75
- ```
76
-
77
- **Why it fails:** pad accounts for our row's own capacity+quota width
78
- but NOT for `pi-crew` widget text or `pi-sub-bar` text that prepends
79
- ours. When those grow during sub-agent spawn, joined line exceeds
80
- cols and pi's `truncateToWidth` chops quota anyway.
81
-
82
- ### Attempt 2 — Subtract capacity width dynamically
83
-
84
- Cache `lastCapacityText` so we know our own row's capacity width when
85
- padding quota:
86
-
87
- ```ts
88
- const capWidth = lastCapacityText ? visibleLen(lastCapacityText) : 0;
89
- const pad = Math.max(0, cols - quotaWidth - capWidth - 1);
90
- ```
91
-
92
- **Why it fails:** still doesn't account for `pi-crew` widget width or
93
- other extensions' widths. Same overflow problem.
94
-
95
- ### Attempt 3 — Reserve buffer for other extensions
96
-
97
- ```ts
98
- const otherReserve = Math.floor(cols * 0.5);
99
- const pad = Math.max(0, cols - quotaWidth - capWidth - 1 - otherReserve);
100
- ```
101
-
102
- **Why it fails:** heuristic, not exact. 50% may be too much (quota
103
- gets pushed left and looks unbalanced) or too little (still overflows).
104
- Padding is not "dynamic" in the sense of reacting to actual other
105
- status widths.
106
-
107
- ### Attempt 4 — Split into widget via setWidget("...", [cap, quota])
108
-
109
- `setWidget()` with `placement: "belowEditor"` renders a Container with
110
- one Text component per array entry → 2 separate lines below editor,
111
- not subject to joined status truncation.
112
-
113
- **Why it fails:** moves the display out of the footer status bar to
114
- below the editor. User wanted it in the footer (status bar), not in
115
- a new visual zone.
116
-
117
- ## Viable fixes (none attempted; documenting for future)
118
-
119
- ### A. Custom footer via `setFooter(factory)`
120
-
121
- Pi exposes `ctx.ui.setFooter((tui, theme, footerData) => Component)` —
122
- extensions can replace the entire footer. The factory receives
123
- `footerData.getExtensionStatuses()` so we still see other extensions'
124
- statuses.
125
-
126
- Implementation outline:
127
- 1. Build a custom `FooterComponent` that renders cwd + stats + our
128
- 2 lines (capacity + quota right-aligned).
129
- 2. Call `ctx.ui.setFooter(factory)` on `session_start`.
130
- 3. On `session_shutdown`, call `ctx.ui.setFooter(undefined)` to restore
131
- pi's built-in footer.
132
-
133
- Cost: ~150 LoC + need to mirror pi's built-in footer logic (cwd,
134
- branch, token stats, model, etc.) so we don't lose any info.
135
-
136
- ### B. Patch pi-coding-agent upstream
137
-
138
- Request that pi support multi-line extension status — e.g., add a
139
- `setStatus(key, lines: string[])` overload that puts each entry on its
140
- own line, OR a `setStatusLine(position, key, text)` that allows
141
- pinning a status to line 1 vs line 2.
142
-
143
- Cost: requires upstream PR + waiting for new pi release.
144
-
145
- ### C. Shorten quota to always fit
146
-
147
- Drop the weekly bar entirely (or shrink to 1-2 chars). Quota becomes
148
- `Minimax 5h 29%` (~15 chars). Even if `pi-crew` widget text is 80 chars
149
- and capacity is 22 chars, total = 80+1+22+1+15 = 119, fits in 120 cols
150
- usually.
151
-
152
- Cost: loses reset timers and weekly bar visualization. User originally
153
- wanted the bars.
154
-
155
- ## Why the 5 prior attempts all failed (same root cause)
156
-
157
- All five fought the truncation from INSIDE `setStatus`, where an extension
158
- cannot see (a) the `pi-crew` widget status width that grows during sub-agent
159
- runs, (b) other extensions' widths, (c) pi's real render width, and where pi
160
- always right-truncates the joined line:
161
-
162
- - `81859e6` — split into `pi-crew-quota` key. pi joins all keys onto one line;
163
- quota still rightmost → still chopped. (Misdiagnosed as slot-overwrite.)
164
- - `a74e453` — NBSP pad by `cols - quotaWidth - 1`. Ignores capacity + widget
165
- widths → overflow → chop.
166
- - `a9eb30e` — NBSP pad by `cols - quotaWidth - capWidth - 1`. Still ignores the
167
- widget width and other extensions → overflow.
168
- - `900737c` — `setWidget(belowEditor)` 2-line. Works (no truncation) but sits
169
- below the editor, not in the footer. Rejected.
170
- - `5e56b63` — one status line + NBSP pad (`process.stdout.columns`). Same flaw
171
- as #2/#3, plus a width source that disagrees with pi's actual render width.
172
-
173
- ## Resolution (implemented)
174
-
175
- Definitive fix = option A, **custom footer via `ctx.ui.setFooter(factory)`** —
176
- the one approach none of the 5 attempts tried. It sidesteps every failure mode
177
- above because the footer `Component`'s `render(width)` receives pi's REAL render
178
- width and we own the line layout, so the meters get their own line(s) that the
179
- join can never truncate.
180
-
181
- - `src/extension/crew-vibes/footer.ts` — `CrewVibesFooter implements Component`.
182
- Reproduces pi's built-in footer lines (pwd/branch/session; token stats + cost
183
- + context% + model + thinking) from `ctx.sessionManager`/`ctx.model`/
184
- `ctx.getContextUsage()`/`footerData`, keeps other extensions' statuses on the
185
- joined line (still truncated, like pi), and renders **capacity + quota on a
186
- dedicated line** using the real width. When the terminal is too narrow, the
187
- meters wrap to two lines (capacity above, quota right-aligned below).
188
- - `src/extension/crew-vibes/index.ts` — installs the footer on `session_start`
189
- (and re-install/remove in `applyConfig`), restores pi's built-in footer with
190
- `setFooter(undefined)` on disable/`session_shutdown`, drops the `spreadLine`
191
- padding, stores the raw provider-usage snapshot (rendered by the footer), and
192
- tracks thinking level via the `thinking_level_select` event.
193
- - `src/ui/pi-ui-compat.ts` — added a guarded `setFooter()` wrapper (no-op on
194
- hosts that predate the API).
195
-
196
- Accepted fidelity trade-offs (pi does not expose these to extensions):
197
- - The `(auto)` compaction indicator is always shown (matches pi's default);
198
- the toggle state is not observable.
199
- - Thinking level comes from `thinking_level_select`; before the first switch it
200
- shows the default ("off").
201
-
202
- Proof: `test/unit/crew-vibes.test.ts` adds two tests — quota stays fully visible
203
- while an overflowing status line is truncated, and the meters wrap to two lines
204
- on a narrow terminal.
205
-
206
- ## How to revert fully
207
-
208
- If you want to wipe all 5 reverted commits from history:
209
-
210
- ```bash
211
- git revert f74adae 7588b26 0f0905d a61d5de dced96a # the 5 reverts above
212
- ```
213
-
214
- Or just leave them — they're labeled "Revert ..." so it's clear what
215
- they undo.
216
-
217
- ## References
218
-
219
- - pi footer rendering: `/home/bom/.nvm/versions/node/v22.23.1/lib/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/footer.js:213-222`
220
- - pi truncateToWidth: `node_modules/@earendil-works/pi-tui/dist/utils.js:821`
221
- - pi-crew widget status source: `src/ui/widget/widget-model.ts:77-99` (`statusSummary()`)
222
- - crew-vibes provider rendering: `src/extension/crew-vibes/render.ts:158-194` (`renderProviderUsage()`)
223
- - crew-vibes quota publish: `src/extension/crew-vibes/index.ts` (`publishProviderQuota()`)