pi-crew 0.9.50 → 0.9.52

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 (609) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/README.md +216 -20
  3. package/dist/build-meta.json +2222 -1761
  4. package/dist/index.mjs +18636 -17603
  5. package/docs/actions-reference.md +431 -1
  6. package/package.json +19 -9
  7. package/schema.json +41 -0
  8. package/scripts/check-bundle-size.mjs +38 -0
  9. package/scripts/test-runner.mjs +11 -1
  10. package/skills/distill-software/SKILL.md +24 -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/README.md +0 -26
  66. package/docs/deep-review-report.md +0 -384
  67. package/docs/distillation/cybersecurity-patterns.md +0 -294
  68. package/docs/feature-analysis-subagent4.md +0 -305
  69. package/docs/fix-plan-disabletools-exit-null.md +0 -219
  70. package/docs/fixes/BATCH_A_H1_H2.md +0 -86
  71. package/docs/fixes/bug-006-foreground-cancel-concurrent.md +0 -78
  72. package/docs/fixes/bug-007-async-notifier-stale-ctx.md +0 -112
  73. package/docs/fixes/bug-008-child-process-silent-timeout.md +0 -100
  74. package/docs/fixes/bug-009-executor-yield-limit-needs-attention.md +0 -75
  75. package/docs/fixes/bug-010-child-process-api-key-filtered.md +0 -109
  76. package/docs/fixes/bug-011-spawn-pi-enoent.md +0 -92
  77. package/docs/fixes/bug-012-essential-env-stripped.md +0 -89
  78. package/docs/fixes/bug-013-background-runner-death.md +0 -84
  79. package/docs/fixes/bug-014-infinite-retry-loop-needs-attention.md +0 -82
  80. package/docs/fixes/bug-015-background-runner-sigterm.md +0 -65
  81. package/docs/fixes/bug-017-background-runner-session-shutdown.md +0 -66
  82. package/docs/fixes/bug-017-background-runner-sigkill-double-fork.md +0 -28
  83. package/docs/fixes/bug-018-child-pi-worker-stdin-hang.md +0 -61
  84. package/docs/fixes/bug-019-phantom-runs-temp-workspace.md +0 -52
  85. package/docs/fixes/bug-020-infinite-retry-loop-needs-attention.md +0 -47
  86. package/docs/fixes/v0.9.10/locks-fix-verify.md +0 -3
  87. package/docs/fixes/v0.9.10/smoke-test.md +0 -12
  88. package/docs/followup-plan-2026-05-12.md +0 -463
  89. package/docs/followup-review-2026-05-12.md +0 -297
  90. package/docs/goals.md +0 -59
  91. package/docs/implementation-plan-top3.md +0 -333
  92. package/docs/issue-29-analysis.md +0 -189
  93. package/docs/live-mailbox-runtime.md +0 -36
  94. package/docs/migration/atomic-write-v2-migration.md +0 -299
  95. package/docs/next-upgrade-roadmap.md +0 -808
  96. package/docs/oh-my-pi-research.md +0 -509
  97. package/docs/optimization-plan-2026-07.md +0 -366
  98. package/docs/optimization-plan.md +0 -644
  99. package/docs/patterns/command-agent-skill.md +0 -71
  100. package/docs/perf/baseline-2026-05.md +0 -113
  101. package/docs/perf/final-report-2026-05.md +0 -206
  102. package/docs/perf/optimization-plan-2026-07-verified.md +0 -396
  103. package/docs/perf/performance-audit-report-2026-07.md +0 -948
  104. package/docs/perf/performance-review-2026-07.md +0 -287
  105. package/docs/perf/sprint-1-report.md +0 -71
  106. package/docs/perf/sprint-2-report.md +0 -81
  107. package/docs/perf/sprint-2.5-report.md +0 -53
  108. package/docs/perf/sprint-3-report.md +0 -36
  109. package/docs/perf/sprint-4-report.md +0 -47
  110. package/docs/perf/sprint-5-report.md +0 -51
  111. package/docs/perf/sprint-6-report.md +0 -94
  112. package/docs/perf/sprint-7-report.md +0 -74
  113. package/docs/perf/upgrade-plan-2026-05.md +0 -147
  114. package/docs/performance-optimization-execution-plan.md +0 -520
  115. package/docs/phase4-triage.md +0 -58
  116. package/docs/pi-crew-investigation-report.md +0 -411
  117. package/docs/product/README.md +0 -31
  118. package/docs/product/platform.md +0 -27
  119. package/docs/product/runtime-safety.md +0 -37
  120. package/docs/product/team-run.md +0 -39
  121. package/docs/product/team-tool.md +0 -37
  122. package/docs/runtime-analysis-child-vs-live.md +0 -171
  123. package/docs/runtime-migration-in-process-analysis.md +0 -250
  124. package/docs/skills/REFERENCE.md +0 -138
  125. package/docs/stories/README.md +0 -32
  126. package/docs/stories/US-DEPS-major-upgrade.md +0 -62
  127. package/docs/stories/backlog.md +0 -36
  128. package/docs/superpowers/plans/2026-06-09-fallow-patterns-adoption.md +0 -1270
  129. package/docs/templates/decision.md +0 -27
  130. package/docs/templates/story.md +0 -44
  131. package/docs/templates/validation-report.md +0 -32
  132. package/docs/ui-optimization-plan.md +0 -447
  133. package/src/adapters/claude-adapter.ts +0 -23
  134. package/src/adapters/codex-adapter.ts +0 -21
  135. package/src/adapters/cursor-adapter.ts +0 -17
  136. package/src/adapters/export-util.ts +0 -143
  137. package/src/adapters/index.ts +0 -15
  138. package/src/adapters/registry.ts +0 -18
  139. package/src/adapters/types.ts +0 -23
  140. package/src/agents/agent-config.ts +0 -194
  141. package/src/agents/agent-search.ts +0 -98
  142. package/src/agents/agent-serializer.ts +0 -38
  143. package/src/agents/discover-agents.ts +0 -623
  144. package/src/benchmark/benchmark-runner.ts +0 -313
  145. package/src/benchmark/feedback-loop.ts +0 -73
  146. package/src/config/config.ts +0 -1269
  147. package/src/config/defaults.ts +0 -193
  148. package/src/config/drift-detector.ts +0 -290
  149. package/src/config/markers.ts +0 -330
  150. package/src/config/resilient-parser.ts +0 -117
  151. package/src/config/role-tools.ts +0 -118
  152. package/src/config/suggestions.ts +0 -75
  153. package/src/config/types.ts +0 -278
  154. package/src/errors.ts +0 -194
  155. package/src/extension/action-suggestions.ts +0 -117
  156. package/src/extension/async-notifier.ts +0 -179
  157. package/src/extension/autonomous-policy.ts +0 -209
  158. package/src/extension/command-completions.ts +0 -120
  159. package/src/extension/context-status-injection.ts +0 -185
  160. package/src/extension/crew-autocomplete.ts +0 -131
  161. package/src/extension/crew-cleanup.ts +0 -168
  162. package/src/extension/crew-input-router.ts +0 -93
  163. package/src/extension/crew-shortcuts.ts +0 -87
  164. package/src/extension/crew-vibes/cat-frames.ts +0 -18
  165. package/src/extension/crew-vibes/config.ts +0 -195
  166. package/src/extension/crew-vibes/figures.ts +0 -101
  167. package/src/extension/crew-vibes/font-detect.ts +0 -71
  168. package/src/extension/crew-vibes/footer.ts +0 -292
  169. package/src/extension/crew-vibes/index.ts +0 -432
  170. package/src/extension/crew-vibes/provider-usage.ts +0 -396
  171. package/src/extension/crew-vibes/render.ts +0 -206
  172. package/src/extension/crew-vibes/speed.ts +0 -286
  173. package/src/extension/cross-extension-rpc.ts +0 -350
  174. package/src/extension/help.ts +0 -62
  175. package/src/extension/import-index.ts +0 -74
  176. package/src/extension/knowledge-injection.ts +0 -402
  177. package/src/extension/management.ts +0 -571
  178. package/src/extension/message-renderers.ts +0 -108
  179. package/src/extension/notification-router.ts +0 -152
  180. package/src/extension/notification-sink.ts +0 -54
  181. package/src/extension/pi-api.ts +0 -56
  182. package/src/extension/plan-orchestrate.ts +0 -302
  183. package/src/extension/project-init.ts +0 -170
  184. package/src/extension/register.ts +0 -113
  185. package/src/extension/registration/artifact-cleanup.ts +0 -20
  186. package/src/extension/registration/command-registration.ts +0 -58
  187. package/src/extension/registration/command-utils.ts +0 -58
  188. package/src/extension/registration/commands.ts +0 -1228
  189. package/src/extension/registration/compaction-guard.ts +0 -333
  190. package/src/extension/registration/context-builder.ts +0 -135
  191. package/src/extension/registration/crash-recovery-cache.ts +0 -54
  192. package/src/extension/registration/foreground-run-controller.ts +0 -238
  193. package/src/extension/registration/hook-registration.ts +0 -119
  194. package/src/extension/registration/lazy-configurers.ts +0 -124
  195. package/src/extension/registration/lifecycle-handlers.ts +0 -923
  196. package/src/extension/registration/lifecycle.ts +0 -259
  197. package/src/extension/registration/observability.ts +0 -322
  198. package/src/extension/registration/registration-types.ts +0 -158
  199. package/src/extension/registration/runtime-cleanup.ts +0 -230
  200. package/src/extension/registration/subagent-helpers.ts +0 -125
  201. package/src/extension/registration/subagent-manager-setup.ts +0 -330
  202. package/src/extension/registration/subagent-tools.ts +0 -456
  203. package/src/extension/registration/team-tool.ts +0 -220
  204. package/src/extension/registration/tool-registration.ts +0 -50
  205. package/src/extension/registration/ui.ts +0 -172
  206. package/src/extension/registration/viewers.ts +0 -121
  207. package/src/extension/registration/wire-cross-extension.ts +0 -37
  208. package/src/extension/result-watcher.ts +0 -139
  209. package/src/extension/rpc-hmac.ts +0 -256
  210. package/src/extension/run-bundle-schema.ts +0 -104
  211. package/src/extension/run-export.ts +0 -97
  212. package/src/extension/run-import.ts +0 -168
  213. package/src/extension/run-index.ts +0 -131
  214. package/src/extension/run-maintenance.ts +0 -190
  215. package/src/extension/session-summary.ts +0 -18
  216. package/src/extension/team-manager-command.ts +0 -153
  217. package/src/extension/team-onboard.ts +0 -177
  218. package/src/extension/team-recommendation.ts +0 -288
  219. package/src/extension/team-tool/anchor.ts +0 -172
  220. package/src/extension/team-tool/api.ts +0 -1244
  221. package/src/extension/team-tool/auto-summarize.ts +0 -142
  222. package/src/extension/team-tool/cache-control.ts +0 -19
  223. package/src/extension/team-tool/cancel.ts +0 -337
  224. package/src/extension/team-tool/chain-dispatch.ts +0 -95
  225. package/src/extension/team-tool/chain-executor.ts +0 -379
  226. package/src/extension/team-tool/config-patch.ts +0 -50
  227. package/src/extension/team-tool/context.ts +0 -149
  228. package/src/extension/team-tool/destructive-gate.ts +0 -52
  229. package/src/extension/team-tool/doctor.ts +0 -431
  230. package/src/extension/team-tool/explain.ts +0 -282
  231. package/src/extension/team-tool/failure-patterns.ts +0 -118
  232. package/src/extension/team-tool/goal-wrap.ts +0 -330
  233. package/src/extension/team-tool/goal.ts +0 -556
  234. package/src/extension/team-tool/handle-schedule.ts +0 -332
  235. package/src/extension/team-tool/handle-settings.ts +0 -520
  236. package/src/extension/team-tool/health-monitor.ts +0 -481
  237. package/src/extension/team-tool/inspect.ts +0 -88
  238. package/src/extension/team-tool/intent-policy.ts +0 -45
  239. package/src/extension/team-tool/lifecycle-actions.ts +0 -615
  240. package/src/extension/team-tool/orchestrate.ts +0 -98
  241. package/src/extension/team-tool/parallel-dispatch.ts +0 -183
  242. package/src/extension/team-tool/plan.ts +0 -50
  243. package/src/extension/team-tool/respond.ts +0 -150
  244. package/src/extension/team-tool/run-not-found.ts +0 -49
  245. package/src/extension/team-tool/run.ts +0 -1035
  246. package/src/extension/team-tool/status.ts +0 -260
  247. package/src/extension/team-tool/workflow-manage.ts +0 -261
  248. package/src/extension/team-tool-types.ts +0 -26
  249. package/src/extension/team-tool.ts +0 -1116
  250. package/src/extension/tool-result.ts +0 -16
  251. package/src/extension/validate-resources.ts +0 -108
  252. package/src/hooks/registry.ts +0 -200
  253. package/src/hooks/types.ts +0 -69
  254. package/src/i18n.ts +0 -212
  255. package/src/observability/correlation.ts +0 -50
  256. package/src/observability/event-bus.ts +0 -86
  257. package/src/observability/event-to-metric.ts +0 -170
  258. package/src/observability/exporters/adapter.ts +0 -27
  259. package/src/observability/exporters/otlp-exporter.ts +0 -356
  260. package/src/observability/exporters/prometheus-exporter.ts +0 -54
  261. package/src/observability/metric-registry.ts +0 -100
  262. package/src/observability/metric-retention.ts +0 -64
  263. package/src/observability/metric-sink.ts +0 -99
  264. package/src/observability/metrics-primitives.ts +0 -219
  265. package/src/plugins/plugin-define.ts +0 -6
  266. package/src/plugins/plugin-registry.ts +0 -32
  267. package/src/plugins/plugins/index.ts +0 -3
  268. package/src/plugins/plugins/nextjs.ts +0 -19
  269. package/src/plugins/plugins/vite.ts +0 -10
  270. package/src/plugins/plugins/vitest.ts +0 -9
  271. package/src/prompt/prompt-runtime.ts +0 -380
  272. package/src/runtime/adaptive-plan.ts +0 -563
  273. package/src/runtime/agent-control.ts +0 -215
  274. package/src/runtime/agent-memory.ts +0 -81
  275. package/src/runtime/agent-observability.ts +0 -122
  276. package/src/runtime/anchor-manager.ts +0 -475
  277. package/src/runtime/async-marker.ts +0 -32
  278. package/src/runtime/async-runner.ts +0 -381
  279. package/src/runtime/attention-events.ts +0 -28
  280. package/src/runtime/auto-summarize.ts +0 -344
  281. package/src/runtime/background-runner.ts +0 -837
  282. package/src/runtime/batch-barrier.ts +0 -147
  283. package/src/runtime/broker-issuer.ts +0 -37
  284. package/src/runtime/cancellation-token.ts +0 -99
  285. package/src/runtime/cancellation.ts +0 -99
  286. package/src/runtime/capability-inventory.ts +0 -137
  287. package/src/runtime/chain-parser.ts +0 -237
  288. package/src/runtime/chain-runner.ts +0 -606
  289. package/src/runtime/checkpoint.ts +0 -291
  290. package/src/runtime/child-pi-constants.ts +0 -42
  291. package/src/runtime/child-pi-kill.ts +0 -180
  292. package/src/runtime/child-pi-pool.ts +0 -68
  293. package/src/runtime/child-pi-spawn.ts +0 -287
  294. package/src/runtime/child-pi-steering.ts +0 -128
  295. package/src/runtime/child-pi-streams.ts +0 -296
  296. package/src/runtime/child-pi-transcript.ts +0 -169
  297. package/src/runtime/child-pi.ts +0 -1105
  298. package/src/runtime/coalesce-tasks.ts +0 -268
  299. package/src/runtime/code-summary.ts +0 -292
  300. package/src/runtime/command-trace.ts +0 -105
  301. package/src/runtime/compact-pipeline.ts +0 -56
  302. package/src/runtime/compact-stages/ansi-strip-stage.ts +0 -25
  303. package/src/runtime/compact-stages/blank-collapse-stage.ts +0 -31
  304. package/src/runtime/compact-stages/deduplicate-stage.ts +0 -34
  305. package/src/runtime/compact-stages/head-snap-stage.ts +0 -57
  306. package/src/runtime/compact-stages/index.ts +0 -23
  307. package/src/runtime/compact-stages/tail-capture-stage.ts +0 -77
  308. package/src/runtime/compact-stages/truncation-stage.ts +0 -74
  309. package/src/runtime/compaction-summary.ts +0 -278
  310. package/src/runtime/completion-guard.ts +0 -207
  311. package/src/runtime/concurrency.ts +0 -58
  312. package/src/runtime/crash-classification.ts +0 -229
  313. package/src/runtime/crash-recovery.ts +0 -577
  314. package/src/runtime/crew-agent-records.ts +0 -593
  315. package/src/runtime/crew-agent-runtime.ts +0 -62
  316. package/src/runtime/crew-broker-child.ts +0 -88
  317. package/src/runtime/crew-broker-client.ts +0 -673
  318. package/src/runtime/crew-broker-tokens.ts +0 -84
  319. package/src/runtime/crew-broker.ts +0 -1276
  320. package/src/runtime/crew-hooks.ts +0 -227
  321. package/src/runtime/cross-extension-rpc.ts +0 -143
  322. package/src/runtime/custom-tools/irc-tool.ts +0 -282
  323. package/src/runtime/custom-tools/submit-result-tool.ts +0 -102
  324. package/src/runtime/deadletter.ts +0 -47
  325. package/src/runtime/delivery-coordinator.ts +0 -211
  326. package/src/runtime/delta-conflict.ts +0 -348
  327. package/src/runtime/deterministic-ast.ts +0 -161
  328. package/src/runtime/diagnostic-export.ts +0 -171
  329. package/src/runtime/direct-run.ts +0 -45
  330. package/src/runtime/dwf-state-store.ts +0 -102
  331. package/src/runtime/dynamic-workflow-context.ts +0 -1016
  332. package/src/runtime/dynamic-workflow-runner.ts +0 -310
  333. package/src/runtime/effectiveness.ts +0 -90
  334. package/src/runtime/errors/crew-errors.ts +0 -162
  335. package/src/runtime/event-stream-bridge.ts +0 -98
  336. package/src/runtime/foreground-control.ts +0 -193
  337. package/src/runtime/foreground-watchdog.ts +0 -132
  338. package/src/runtime/global-worker-cap.ts +0 -96
  339. package/src/runtime/goal-achievement.ts +0 -148
  340. package/src/runtime/goal-evaluator.ts +0 -361
  341. package/src/runtime/goal-loop-runner.ts +0 -828
  342. package/src/runtime/goal-state-store.ts +0 -219
  343. package/src/runtime/green-contract.ts +0 -55
  344. package/src/runtime/group-join.ts +0 -267
  345. package/src/runtime/handoff-manager.ts +0 -598
  346. package/src/runtime/heartbeat-gradient.ts +0 -36
  347. package/src/runtime/heartbeat-watcher.ts +0 -239
  348. package/src/runtime/hidden-handoff.ts +0 -407
  349. package/src/runtime/important-line-classifier.ts +0 -140
  350. package/src/runtime/intercom-bridge.ts +0 -187
  351. package/src/runtime/iteration-hooks.ts +0 -305
  352. package/src/runtime/live-agent-control.ts +0 -136
  353. package/src/runtime/live-agent-manager.ts +0 -704
  354. package/src/runtime/live-control-realtime.ts +0 -56
  355. package/src/runtime/live-extension-bridge.ts +0 -148
  356. package/src/runtime/live-irc.ts +0 -97
  357. package/src/runtime/live-session-health.ts +0 -108
  358. package/src/runtime/live-session-runtime.ts +0 -1139
  359. package/src/runtime/loop-gates.ts +0 -128
  360. package/src/runtime/manifest-cache.ts +0 -375
  361. package/src/runtime/mcp-proxy.ts +0 -105
  362. package/src/runtime/metric-parser.ts +0 -36
  363. package/src/runtime/model-fallback.ts +0 -409
  364. package/src/runtime/model-resolver.ts +0 -126
  365. package/src/runtime/model-scope.ts +0 -158
  366. package/src/runtime/orphan-worker-registry.ts +0 -465
  367. package/src/runtime/output-validator.ts +0 -202
  368. package/src/runtime/overflow-recovery.ts +0 -206
  369. package/src/runtime/parallel-research.ts +0 -68
  370. package/src/runtime/parallel-utils.ts +0 -160
  371. package/src/runtime/parent-guard.ts +0 -134
  372. package/src/runtime/path-overlap.ts +0 -150
  373. package/src/runtime/peer-dep.ts +0 -292
  374. package/src/runtime/per-write-validator.ts +0 -181
  375. package/src/runtime/phase-progress.ts +0 -217
  376. package/src/runtime/phase-tracker.ts +0 -385
  377. package/src/runtime/pi-args.ts +0 -655
  378. package/src/runtime/pi-json-output.ts +0 -170
  379. package/src/runtime/pi-spawn.ts +0 -273
  380. package/src/runtime/pipeline-runner.ts +0 -523
  381. package/src/runtime/plan-templates.ts +0 -201
  382. package/src/runtime/policy-engine.ts +0 -115
  383. package/src/runtime/post-checks.ts +0 -142
  384. package/src/runtime/post-exit-stdio-guard.ts +0 -104
  385. package/src/runtime/process-lifecycle.ts +0 -491
  386. package/src/runtime/process-status.ts +0 -154
  387. package/src/runtime/progress-event-coalescer.ts +0 -44
  388. package/src/runtime/progress-tracker.ts +0 -124
  389. package/src/runtime/prose-compressor.ts +0 -162
  390. package/src/runtime/recovery-recipes.ts +0 -203
  391. package/src/runtime/replace.ts +0 -570
  392. package/src/runtime/resilient-edit.ts +0 -153
  393. package/src/runtime/result-extractor.ts +0 -213
  394. package/src/runtime/retry-executor.ts +0 -100
  395. package/src/runtime/retry-runner.ts +0 -336
  396. package/src/runtime/role-permission.ts +0 -59
  397. package/src/runtime/run-coalesced-task-group.ts +0 -308
  398. package/src/runtime/run-drift.ts +0 -219
  399. package/src/runtime/run-tracker.ts +0 -116
  400. package/src/runtime/runtime-policy.ts +0 -29
  401. package/src/runtime/runtime-resolver.ts +0 -172
  402. package/src/runtime/runtime-warmup.ts +0 -160
  403. package/src/runtime/scheduler.ts +0 -353
  404. package/src/runtime/semaphore.ts +0 -141
  405. package/src/runtime/sensitive-paths.ts +0 -93
  406. package/src/runtime/session-resources.ts +0 -25
  407. package/src/runtime/session-snapshot.ts +0 -59
  408. package/src/runtime/session-usage.ts +0 -79
  409. package/src/runtime/settings-store.ts +0 -155
  410. package/src/runtime/sidechain-output.ts +0 -35
  411. package/src/runtime/single-agent-compose.ts +0 -84
  412. package/src/runtime/skill-effectiveness.ts +0 -524
  413. package/src/runtime/skill-instructions.ts +0 -391
  414. package/src/runtime/stale-reconciler.ts +0 -680
  415. package/src/runtime/stream-preview.ts +0 -184
  416. package/src/runtime/streaming-output.ts +0 -50
  417. package/src/runtime/subagent-manager.ts +0 -561
  418. package/src/runtime/subprocess-tool-registry.ts +0 -70
  419. package/src/runtime/supervisor-contact.ts +0 -64
  420. package/src/runtime/task-display.ts +0 -52
  421. package/src/runtime/task-graph-scheduler.ts +0 -227
  422. package/src/runtime/task-graph.ts +0 -290
  423. package/src/runtime/task-health.ts +0 -83
  424. package/src/runtime/task-id.ts +0 -161
  425. package/src/runtime/task-output-context.ts +0 -602
  426. package/src/runtime/task-packet.ts +0 -268
  427. package/src/runtime/task-quality.ts +0 -199
  428. package/src/runtime/task-runner/capabilities.ts +0 -78
  429. package/src/runtime/task-runner/context-retrieval.ts +0 -163
  430. package/src/runtime/task-runner/live-executor.ts +0 -227
  431. package/src/runtime/task-runner/output-splitter.ts +0 -152
  432. package/src/runtime/task-runner/progress.ts +0 -157
  433. package/src/runtime/task-runner/prompt-builder.ts +0 -278
  434. package/src/runtime/task-runner/prompt-pipeline.ts +0 -88
  435. package/src/runtime/task-runner/result-utils.ts +0 -16
  436. package/src/runtime/task-runner/retrieval-orchestrator.ts +0 -310
  437. package/src/runtime/task-runner/run-projection.ts +0 -125
  438. package/src/runtime/task-runner/state-helpers.ts +0 -176
  439. package/src/runtime/task-runner/tail-read.ts +0 -34
  440. package/src/runtime/task-runner.ts +0 -1420
  441. package/src/runtime/team-runner-artifacts.ts +0 -13
  442. package/src/runtime/team-runner.ts +0 -1993
  443. package/src/runtime/tool-output-pruner.ts +0 -333
  444. package/src/runtime/tool-progress.ts +0 -278
  445. package/src/runtime/usage-tracker.ts +0 -73
  446. package/src/runtime/verification-gates.ts +0 -571
  447. package/src/runtime/verification-integrity.ts +0 -105
  448. package/src/runtime/verification-worktree.ts +0 -186
  449. package/src/runtime/worker-heartbeat.ts +0 -25
  450. package/src/runtime/worker-startup.ts +0 -83
  451. package/src/runtime/workflow-state.ts +0 -195
  452. package/src/runtime/workspace-lock.ts +0 -443
  453. package/src/runtime/workspace-tree.ts +0 -312
  454. package/src/runtime/yield-handler.ts +0 -224
  455. package/src/runtime/zombie-scanner.ts +0 -298
  456. package/src/schema/config-schema.ts +0 -327
  457. package/src/schema/team-tool-schema.ts +0 -415
  458. package/src/schema/validation-types.ts +0 -159
  459. package/src/skills/discover-skills.ts +0 -197
  460. package/src/skills/skill-templates.ts +0 -456
  461. package/src/skills/validate.ts +0 -285
  462. package/src/state/active-run-registry.ts +0 -439
  463. package/src/state/artifact-store.ts +0 -176
  464. package/src/state/atomic-write.ts +0 -903
  465. package/src/state/blob-store.ts +0 -308
  466. package/src/state/contracts.ts +0 -158
  467. package/src/state/crew-init.ts +0 -269
  468. package/src/state/decision-ledger.ts +0 -345
  469. package/src/state/event-log-rotation.ts +0 -342
  470. package/src/state/event-log.ts +0 -1311
  471. package/src/state/event-reconstructor.ts +0 -229
  472. package/src/state/gitignore-manager.ts +0 -46
  473. package/src/state/health-store.ts +0 -79
  474. package/src/state/hook-instinct-bridge.ts +0 -94
  475. package/src/state/hook-integrations.ts +0 -51
  476. package/src/state/instinct-store.ts +0 -275
  477. package/src/state/jsonl-writer.ts +0 -107
  478. package/src/state/locks.ts +0 -562
  479. package/src/state/mailbox.ts +0 -916
  480. package/src/state/observation-store.ts +0 -176
  481. package/src/state/run-cache.ts +0 -193
  482. package/src/state/run-graph.ts +0 -183
  483. package/src/state/run-metrics.ts +0 -165
  484. package/src/state/schedule.ts +0 -166
  485. package/src/state/session-state-map.ts +0 -51
  486. package/src/state/state-store.ts +0 -958
  487. package/src/state/task-claims.ts +0 -61
  488. package/src/state/tiered-eval.ts +0 -480
  489. package/src/state/types-eval.ts +0 -58
  490. package/src/state/types.ts +0 -440
  491. package/src/state/usage.ts +0 -138
  492. package/src/state/worker-atomic-writer.ts +0 -194
  493. package/src/subagents/async-entry.ts +0 -1
  494. package/src/subagents/index.ts +0 -3
  495. package/src/subagents/live/control.ts +0 -1
  496. package/src/subagents/live/manager.ts +0 -1
  497. package/src/subagents/live/realtime.ts +0 -1
  498. package/src/subagents/live/session-runtime.ts +0 -1
  499. package/src/subagents/manager.ts +0 -1
  500. package/src/subagents/spawn.ts +0 -1
  501. package/src/teams/discover-teams.ts +0 -187
  502. package/src/teams/team-config.ts +0 -27
  503. package/src/teams/team-serializer.ts +0 -38
  504. package/src/tools/safe-bash-extension.ts +0 -54
  505. package/src/tools/safe-bash.ts +0 -505
  506. package/src/types/diff.d.ts +0 -18
  507. package/src/types/new-api-types.ts +0 -35
  508. package/src/ui/agent-management-overlay.ts +0 -160
  509. package/src/ui/card-colors.ts +0 -139
  510. package/src/ui/crew-footer.ts +0 -102
  511. package/src/ui/crew-select-list.ts +0 -111
  512. package/src/ui/dashboard-panes/agents-pane.ts +0 -164
  513. package/src/ui/dashboard-panes/cancellation-pane.ts +0 -66
  514. package/src/ui/dashboard-panes/capability-pane.ts +0 -77
  515. package/src/ui/dashboard-panes/health-pane.ts +0 -31
  516. package/src/ui/dashboard-panes/mailbox-pane.ts +0 -35
  517. package/src/ui/dashboard-panes/metrics-pane.ts +0 -37
  518. package/src/ui/dashboard-panes/progress-pane.ts +0 -38
  519. package/src/ui/dashboard-panes/transcript-pane.ts +0 -10
  520. package/src/ui/deploy-bundled-themes.ts +0 -71
  521. package/src/ui/dwf-phase-display.ts +0 -151
  522. package/src/ui/dynamic-border.ts +0 -35
  523. package/src/ui/heartbeat-aggregator.ts +0 -74
  524. package/src/ui/key-utils.ts +0 -42
  525. package/src/ui/keybinding-map.ts +0 -248
  526. package/src/ui/layout-primitives.ts +0 -106
  527. package/src/ui/live-conversation-overlay.ts +0 -183
  528. package/src/ui/live-duration.ts +0 -55
  529. package/src/ui/live-run-sidebar.ts +0 -301
  530. package/src/ui/loaders.ts +0 -176
  531. package/src/ui/mascot.ts +0 -436
  532. package/src/ui/overlays/agent-picker-overlay.ts +0 -65
  533. package/src/ui/overlays/confirm-overlay.ts +0 -60
  534. package/src/ui/overlays/help-overlay.ts +0 -177
  535. package/src/ui/overlays/mailbox-compose-overlay.ts +0 -181
  536. package/src/ui/overlays/mailbox-compose-preview.ts +0 -78
  537. package/src/ui/overlays/mailbox-detail-overlay.ts +0 -154
  538. package/src/ui/pi-ui-compat.ts +0 -68
  539. package/src/ui/powerbar-publisher.ts +0 -459
  540. package/src/ui/render-coalescer.ts +0 -101
  541. package/src/ui/render-diff.ts +0 -160
  542. package/src/ui/render-scheduler.ts +0 -224
  543. package/src/ui/run-action-dispatcher.ts +0 -182
  544. package/src/ui/run-dashboard.ts +0 -913
  545. package/src/ui/run-event-bus.ts +0 -381
  546. package/src/ui/run-snapshot-cache.ts +0 -1057
  547. package/src/ui/settings-overlay.ts +0 -1067
  548. package/src/ui/snapshot-types.ts +0 -90
  549. package/src/ui/spinner.ts +0 -17
  550. package/src/ui/status-colors.ts +0 -143
  551. package/src/ui/syntax-highlight.ts +0 -136
  552. package/src/ui/terminal-status.ts +0 -269
  553. package/src/ui/theme-adapter.ts +0 -271
  554. package/src/ui/theme-discovery.ts +0 -199
  555. package/src/ui/tool-progress-formatter.ts +0 -93
  556. package/src/ui/tool-render.ts +0 -453
  557. package/src/ui/tool-renderers/brief-mode.ts +0 -225
  558. package/src/ui/tool-renderers/index.ts +0 -726
  559. package/src/ui/transcript-cache.ts +0 -128
  560. package/src/ui/transcript-entries.ts +0 -256
  561. package/src/ui/transcript-viewer.ts +0 -424
  562. package/src/ui/widget/index.ts +0 -357
  563. package/src/ui/widget/widget-formatters.ts +0 -182
  564. package/src/ui/widget/widget-model.ts +0 -110
  565. package/src/ui/widget/widget-renderer.ts +0 -182
  566. package/src/ui/widget/widget-types.ts +0 -36
  567. package/src/utils/bm25-search.ts +0 -235
  568. package/src/utils/completion-dedupe.ts +0 -63
  569. package/src/utils/conflict-detect.ts +0 -668
  570. package/src/utils/env-allowlist.ts +0 -30
  571. package/src/utils/env-filter.ts +0 -155
  572. package/src/utils/file-coalescer.ts +0 -98
  573. package/src/utils/fingerprint.ts +0 -180
  574. package/src/utils/frontmatter.ts +0 -70
  575. package/src/utils/fs-watch.ts +0 -37
  576. package/src/utils/gh-protocol.ts +0 -556
  577. package/src/utils/git.ts +0 -260
  578. package/src/utils/guards.ts +0 -107
  579. package/src/utils/ids.ts +0 -24
  580. package/src/utils/incremental-reader.ts +0 -220
  581. package/src/utils/internal-error.ts +0 -10
  582. package/src/utils/names.ts +0 -36
  583. package/src/utils/ndjson.ts +0 -115
  584. package/src/utils/paths.ts +0 -227
  585. package/src/utils/project-detector.ts +0 -160
  586. package/src/utils/redaction.ts +0 -347
  587. package/src/utils/resolve-shell.ts +0 -36
  588. package/src/utils/run-watcher-registry.ts +0 -152
  589. package/src/utils/safe-paths.ts +0 -383
  590. package/src/utils/scan-cache.ts +0 -144
  591. package/src/utils/session-utils.ts +0 -110
  592. package/src/utils/sleep.ts +0 -54
  593. package/src/utils/socket-path.ts +0 -127
  594. package/src/utils/sse-parser.ts +0 -129
  595. package/src/utils/task-name-generator.ts +0 -337
  596. package/src/utils/timings.ts +0 -33
  597. package/src/utils/token-counter.ts +0 -200
  598. package/src/utils/visual.ts +0 -207
  599. package/src/workflows/cost-estimator.ts +0 -34
  600. package/src/workflows/discover-workflows.ts +0 -290
  601. package/src/workflows/intermediate-store.ts +0 -166
  602. package/src/workflows/preflight-validator.ts +0 -168
  603. package/src/workflows/topology-analyzer.ts +0 -203
  604. package/src/workflows/validate-workflow.ts +0 -50
  605. package/src/workflows/workflow-config.ts +0 -70
  606. package/src/workflows/workflow-serializer.ts +0 -32
  607. package/src/worktree/branch-freshness.ts +0 -112
  608. package/src/worktree/cleanup.ts +0 -341
  609. 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()`)