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