pi-crew 0.2.3 → 0.2.5
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/AGENTS.md +57 -32
- package/CHANGELOG.md +466 -448
- package/LICENSE +21 -21
- package/NOTICE.md +16 -16
- package/README.md +323 -323
- package/docs/FEATURE_INTAKE.md +126 -0
- package/docs/HARNESS.md +86 -0
- package/docs/HARNESS_BACKLOG.md +41 -0
- package/docs/TEST_MATRIX.md +49 -0
- package/docs/actions-reference.md +595 -595
- package/docs/architecture.md +180 -180
- package/docs/code-review-2026-05-11.md +592 -592
- package/docs/commands-reference.md +347 -347
- package/docs/comparison-pi-subagents-vs-pi-crew.md +303 -0
- package/docs/decisions/0001-durable-state.md +41 -0
- package/docs/decisions/0002-child-process-for-async.md +42 -0
- package/docs/decisions/0003-depth-guard.md +36 -0
- package/docs/decisions/0004-execfile-over-exec.md +34 -0
- package/docs/decisions/0005-no-parameter-properties.md +49 -0
- package/docs/decisions/0006-publish-bundled-esm.md +63 -0
- package/docs/decisions/0007-active-run-binary-index.md +54 -0
- package/docs/decisions/0008-child-pi-warm-pool.md +61 -0
- package/docs/decisions/README.md +23 -0
- package/docs/followup-review-round4-2026-05-13.md +107 -0
- package/docs/implementation-plan-top3.md +333 -0
- package/docs/live-mailbox-runtime.md +36 -36
- package/docs/next-upgrade-roadmap.md +808 -808
- package/docs/oh-my-pi-research.md +509 -0
- package/docs/perf/baseline-2026-05.md +113 -0
- package/docs/perf/final-report-2026-05.md +206 -0
- package/docs/perf/sprint-1-report.md +71 -0
- package/docs/perf/sprint-2-report.md +81 -0
- package/docs/perf/sprint-2.5-report.md +53 -0
- package/docs/perf/sprint-3-report.md +36 -0
- package/docs/perf/sprint-4-report.md +47 -0
- package/docs/perf/sprint-5-report.md +51 -0
- package/docs/perf/sprint-6-report.md +94 -0
- package/docs/perf/sprint-7-report.md +74 -0
- package/docs/perf/upgrade-plan-2026-05.md +147 -0
- package/docs/pi-subagents3-deep-analysis.md +508 -0
- package/docs/product/README.md +31 -0
- package/docs/product/platform.md +27 -0
- package/docs/product/runtime-safety.md +37 -0
- package/docs/product/team-run.md +39 -0
- package/docs/product/team-tool.md +37 -0
- package/docs/publishing.md +65 -65
- package/docs/resource-formats.md +134 -134
- package/docs/runtime-analysis-child-vs-live.md +171 -0
- package/docs/runtime-flow.md +148 -148
- package/docs/runtime-migration-in-process-analysis.md +250 -0
- package/docs/stories/README.md +30 -0
- package/docs/stories/backlog.md +36 -0
- package/docs/templates/decision.md +27 -0
- package/docs/templates/story.md +44 -0
- package/docs/templates/validation-report.md +32 -0
- package/docs/usage.md +238 -238
- package/index.ts +7 -6
- package/install.mjs +65 -65
- package/package.json +107 -100
- package/schema.json +222 -222
- package/skills/child-pi-spawning/SKILL.md +213 -0
- package/skills/context-artifact-hygiene/SKILL.md +32 -0
- package/skills/event-log-tracing/SKILL.md +299 -0
- package/skills/git-master/SKILL.md +225 -24
- package/skills/live-agent-lifecycle/SKILL.md +192 -0
- package/skills/mailbox-interactive/SKILL.md +300 -19
- package/skills/model-routing-context/SKILL.md +94 -0
- package/skills/multi-perspective-review/SKILL.md +88 -0
- package/skills/read-only-explorer/SKILL.md +250 -26
- package/skills/safe-bash/SKILL.md +307 -21
- package/skills/verification-before-done/SKILL.md +11 -2
- package/skills/widget-rendering/SKILL.md +258 -0
- package/skills/workspace-isolation/SKILL.md +202 -0
- package/skills/worktree-isolation/SKILL.md +202 -18
- package/src/adapters/claude-adapter.ts +25 -25
- package/src/adapters/codex-adapter.ts +21 -21
- package/src/adapters/cursor-adapter.ts +17 -17
- package/src/adapters/export-util.ts +137 -137
- package/src/adapters/index.ts +15 -15
- package/src/adapters/registry.ts +18 -18
- package/src/adapters/types.ts +23 -23
- package/src/agents/agent-config.ts +38 -38
- package/src/agents/agent-serializer.ts +38 -38
- package/src/agents/discover-agents.ts +121 -118
- package/src/config/config.ts +740 -858
- package/src/config/defaults.ts +96 -96
- package/src/config/drift-detector.ts +211 -211
- package/src/config/markers.ts +327 -327
- package/src/config/resilient-parser.ts +109 -108
- package/src/config/suggestions.ts +74 -74
- package/src/config/types.ts +199 -0
- package/src/extension/async-notifier.ts +123 -89
- package/src/extension/autonomous-policy.ts +169 -169
- package/src/extension/cross-extension-rpc.ts +104 -104
- package/src/extension/help.ts +47 -47
- package/src/extension/import-index.ts +69 -69
- package/src/extension/management.ts +395 -382
- package/src/extension/notification-router.ts +116 -116
- package/src/extension/notification-sink.ts +51 -51
- package/src/extension/project-init.ts +168 -168
- package/src/extension/register.ts +859 -668
- package/src/extension/registration/artifact-cleanup.ts +15 -15
- package/src/extension/registration/command-utils.ts +54 -54
- package/src/extension/registration/commands.ts +559 -452
- package/src/extension/registration/compaction-guard.ts +125 -125
- package/src/extension/registration/subagent-helpers.ts +102 -102
- package/src/extension/registration/subagent-tools.ts +220 -159
- package/src/extension/registration/team-tool.ts +159 -99
- package/src/extension/registration/viewers.ts +29 -0
- package/src/extension/result-watcher.ts +128 -128
- package/src/extension/run-bundle-schema.ts +89 -89
- package/src/extension/run-export.ts +73 -73
- package/src/extension/run-import.ts +84 -84
- package/src/extension/run-index.ts +94 -94
- package/src/extension/run-maintenance.ts +142 -142
- package/src/extension/session-summary.ts +8 -8
- package/src/extension/team-manager-command.ts +96 -96
- package/src/extension/team-recommendation.ts +188 -188
- package/src/extension/team-tool/api.ts +5 -2
- package/src/extension/team-tool/cancel.ts +224 -209
- package/src/extension/team-tool/config-patch.ts +36 -36
- package/src/extension/team-tool/context.ts +60 -60
- package/src/extension/team-tool/doctor.ts +242 -242
- package/src/extension/team-tool/handle-settings.ts +421 -195
- package/src/extension/team-tool/inspect.ts +41 -41
- package/src/extension/team-tool/lifecycle-actions.ts +139 -139
- package/src/extension/team-tool/parallel-dispatch.ts +156 -156
- package/src/extension/team-tool/plan.ts +19 -19
- package/src/extension/team-tool/respond.ts +112 -111
- package/src/extension/team-tool/run.ts +246 -229
- package/src/extension/team-tool/status.ts +110 -110
- package/src/extension/team-tool-types.ts +13 -13
- package/src/extension/team-tool.ts +344 -344
- package/src/extension/tool-result.ts +16 -16
- package/src/extension/validate-resources.ts +77 -77
- package/src/hooks/registry.ts +61 -61
- package/src/hooks/types.ts +40 -40
- package/src/i18n.ts +184 -184
- package/src/observability/correlation.ts +35 -35
- package/src/observability/event-to-metric.ts +68 -68
- package/src/observability/exporters/adapter.ts +30 -30
- package/src/observability/exporters/otlp-exporter.ts +106 -92
- package/src/observability/exporters/prometheus-exporter.ts +54 -54
- package/src/observability/metric-registry.ts +87 -87
- package/src/observability/metric-retention.ts +54 -54
- package/src/observability/metric-sink.ts +81 -56
- package/src/observability/metrics-primitives.ts +167 -167
- package/src/prompt/prompt-runtime.ts +72 -72
- package/src/runtime/adaptive-plan.ts +338 -0
- package/src/runtime/agent-control.ts +169 -169
- package/src/runtime/agent-memory.ts +72 -72
- package/src/runtime/agent-observability.ts +114 -114
- package/src/runtime/async-marker.ts +26 -26
- package/src/runtime/async-runner.ts +153 -153
- package/src/runtime/attention-events.ts +28 -28
- package/src/runtime/auto-resume.ts +100 -100
- package/src/runtime/background-runner.ts +122 -89
- package/src/runtime/cancellation.ts +61 -61
- package/src/runtime/capability-inventory.ts +116 -116
- package/src/runtime/child-pi-pool.ts +68 -0
- package/src/runtime/child-pi.ts +541 -461
- package/src/runtime/code-summary.ts +247 -247
- package/src/runtime/compaction-summary.ts +271 -271
- package/src/runtime/concurrency.ts +58 -58
- package/src/runtime/crash-recovery.ts +317 -301
- package/src/runtime/crew-agent-records.ts +379 -281
- package/src/runtime/crew-agent-runtime.ts +60 -60
- package/src/runtime/cross-extension-rpc.ts +72 -0
- package/src/runtime/custom-tools/irc-tool.ts +201 -201
- package/src/runtime/custom-tools/submit-result-tool.ts +90 -90
- package/src/runtime/deadletter.ts +47 -47
- package/src/runtime/delivery-coordinator.ts +176 -176
- package/src/runtime/delta-conflict.ts +360 -360
- package/src/runtime/diagnostic-export.ts +102 -102
- package/src/runtime/direct-run.ts +35 -35
- package/src/runtime/effectiveness.ts +82 -81
- package/src/runtime/errors/crew-errors.ts +166 -0
- package/src/runtime/event-stream-bridge.ts +92 -92
- package/src/runtime/foreground-control.ts +82 -82
- package/src/runtime/green-contract.ts +46 -46
- package/src/runtime/group-join.ts +234 -106
- package/src/runtime/heartbeat-watcher.ts +145 -124
- package/src/runtime/iteration-hooks.ts +267 -267
- package/src/runtime/live-agent-control.ts +88 -88
- package/src/runtime/live-agent-manager.ts +377 -179
- package/src/runtime/live-control-realtime.ts +36 -36
- package/src/runtime/live-session-runtime.ts +676 -600
- package/src/runtime/loop-gates.ts +129 -129
- package/src/runtime/manifest-cache.ts +263 -263
- package/src/runtime/mcp-proxy.ts +113 -113
- package/src/runtime/metric-parser.ts +40 -40
- package/src/runtime/model-fallback.ts +282 -274
- package/src/runtime/model-resolver.ts +118 -0
- package/src/runtime/output-validator.ts +187 -187
- package/src/runtime/overflow-recovery.ts +175 -175
- package/src/runtime/parallel-research.ts +44 -44
- package/src/runtime/parallel-utils.ts +156 -156
- package/src/runtime/parent-guard.ts +80 -80
- package/src/runtime/phase-progress.ts +217 -217
- package/src/runtime/pi-args.ts +165 -165
- package/src/runtime/pi-json-output.ts +111 -111
- package/src/runtime/pi-spawn.ts +167 -167
- package/src/runtime/policy-engine.ts +79 -79
- package/src/runtime/post-checks.ts +125 -125
- package/src/runtime/post-exit-stdio-guard.ts +86 -86
- package/src/runtime/process-status.ts +97 -73
- package/src/runtime/progress-event-coalescer.ts +43 -43
- package/src/runtime/recovery-recipes.ts +74 -74
- package/src/runtime/retry-executor.ts +81 -81
- package/src/runtime/role-permission.ts +39 -39
- package/src/runtime/run-tracker.ts +99 -0
- package/src/runtime/runtime-policy.ts +21 -0
- package/src/runtime/runtime-resolver.ts +94 -91
- package/src/runtime/scheduler.ts +294 -0
- package/src/runtime/semaphore.ts +131 -131
- package/src/runtime/sensitive-paths.ts +92 -92
- package/src/runtime/session-usage.ts +79 -79
- package/src/runtime/settings-store.ts +103 -0
- package/src/runtime/sidechain-output.ts +29 -29
- package/src/runtime/skill-instructions.ts +222 -222
- package/src/runtime/stale-reconciler.ts +198 -189
- package/src/runtime/streaming-output.ts +47 -0
- package/src/runtime/subagent-manager.ts +404 -400
- package/src/runtime/subprocess-tool-registry.ts +67 -67
- package/src/runtime/task-display.ts +38 -38
- package/src/runtime/task-graph-scheduler.ts +122 -122
- package/src/runtime/task-graph.ts +207 -207
- package/src/runtime/task-output-context.ts +177 -177
- package/src/runtime/task-packet.ts +93 -93
- package/src/runtime/task-quality.ts +207 -207
- package/src/runtime/task-runner/capabilities.ts +78 -78
- package/src/runtime/task-runner/live-executor.ts +131 -113
- package/src/runtime/task-runner/progress.ts +119 -119
- package/src/runtime/task-runner/prompt-builder.ts +139 -139
- package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
- package/src/runtime/task-runner/result-utils.ts +14 -14
- package/src/runtime/task-runner/run-projection.ts +103 -103
- package/src/runtime/task-runner/state-helpers.ts +22 -22
- package/src/runtime/task-runner.ts +469 -459
- package/src/runtime/team-runner.ts +693 -945
- package/src/runtime/usage-tracker.ts +71 -0
- package/src/runtime/worker-heartbeat.ts +21 -21
- package/src/runtime/worker-startup.ts +57 -57
- package/src/runtime/workflow-state.ts +187 -187
- package/src/runtime/yield-handler.ts +190 -190
- package/src/schema/config-schema.ts +172 -168
- package/src/schema/team-tool-schema.ts +126 -126
- package/src/schema/validation-types.ts +151 -148
- package/src/skills/discover-skills.ts +67 -67
- package/src/skills/skill-templates.ts +374 -374
- package/src/state/active-run-registry.ts +227 -191
- package/src/state/artifact-store.ts +130 -129
- package/src/state/atomic-write.ts +262 -195
- package/src/state/blob-store.ts +116 -116
- package/src/state/contracts.ts +111 -111
- package/src/state/event-log-rotation.ts +161 -158
- package/src/state/event-log.ts +383 -303
- package/src/state/event-reconstructor.ts +217 -217
- package/src/state/jsonl-writer.ts +82 -82
- package/src/state/locks.ts +146 -146
- package/src/state/mailbox.ts +446 -405
- package/src/state/state-store.ts +364 -351
- package/src/state/task-claims.ts +44 -44
- package/src/state/types.ts +285 -285
- package/src/state/usage.ts +29 -29
- package/src/subagents/async-entry.ts +1 -1
- package/src/subagents/index.ts +3 -3
- package/src/subagents/live/control.ts +1 -1
- package/src/subagents/live/manager.ts +1 -1
- package/src/subagents/live/realtime.ts +1 -1
- package/src/subagents/live/session-runtime.ts +1 -1
- package/src/subagents/manager.ts +1 -1
- package/src/subagents/spawn.ts +1 -1
- package/src/teams/discover-teams.ts +116 -116
- package/src/teams/team-config.ts +27 -27
- package/src/teams/team-serializer.ts +38 -38
- package/src/types/diff.d.ts +18 -18
- package/src/ui/agent-management-overlay.ts +144 -144
- package/src/ui/crew-widget.ts +487 -370
- package/src/ui/dashboard-panes/agents-pane.ts +109 -28
- package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
- package/src/ui/dashboard-panes/capability-pane.ts +59 -59
- package/src/ui/dashboard-panes/health-pane.ts +30 -30
- package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
- package/src/ui/dashboard-panes/progress-pane.ts +30 -30
- package/src/ui/dashboard-panes/transcript-pane.ts +10 -10
- package/src/ui/heartbeat-aggregator.ts +63 -63
- package/src/ui/keybinding-map.ts +97 -94
- package/src/ui/live-conversation-overlay.ts +152 -0
- package/src/ui/live-run-sidebar.ts +180 -180
- package/src/ui/mascot.ts +442 -442
- package/src/ui/overlays/agent-picker-overlay.ts +57 -57
- package/src/ui/overlays/confirm-overlay.ts +58 -58
- package/src/ui/overlays/mailbox-compose-overlay.ts +144 -144
- package/src/ui/overlays/mailbox-compose-preview.ts +63 -63
- package/src/ui/overlays/mailbox-detail-overlay.ts +122 -122
- package/src/ui/pi-ui-compat.ts +57 -57
- package/src/ui/powerbar-publisher.ts +221 -197
- package/src/ui/render-scheduler.ts +216 -143
- package/src/ui/run-action-dispatcher.ts +118 -118
- package/src/ui/run-dashboard.ts +526 -464
- package/src/ui/run-event-bus.ts +208 -208
- package/src/ui/run-snapshot-cache.ts +826 -777
- package/src/ui/settings-overlay.ts +721 -0
- package/src/ui/snapshot-types.ts +86 -70
- package/src/ui/theme-adapter.ts +190 -190
- package/src/ui/tool-progress-formatter.ts +89 -0
- package/src/ui/transcript-cache.ts +94 -94
- package/src/ui/transcript-viewer.ts +335 -335
- package/src/utils/conflict-detect.ts +662 -0
- package/src/utils/file-coalescer.ts +86 -86
- package/src/utils/frontmatter.ts +68 -68
- package/src/utils/fs-watch.ts +88 -31
- package/src/utils/gh-protocol.ts +479 -0
- package/src/utils/ids.ts +17 -17
- package/src/utils/incremental-reader.ts +104 -104
- package/src/utils/internal-error.ts +6 -6
- package/src/utils/names.ts +27 -27
- package/src/utils/paths.ts +102 -63
- package/src/utils/redaction.ts +44 -44
- package/src/utils/safe-paths.ts +47 -47
- package/src/utils/scan-cache.ts +136 -136
- package/src/utils/sse-parser.ts +134 -134
- package/src/utils/task-name-generator.ts +337 -337
- package/src/utils/timings.ts +33 -33
- package/src/utils/visual.ts +243 -198
- package/src/workflows/discover-workflows.ts +139 -139
- package/src/workflows/validate-workflow.ts +40 -40
- package/src/workflows/workflow-config.ts +26 -26
- package/src/workflows/workflow-serializer.ts +32 -32
- package/src/worktree/branch-freshness.ts +45 -45
- package/src/worktree/cleanup.ts +75 -75
- package/src/worktree/worktree-manager.ts +188 -188
- package/teams/default.team.md +12 -12
- package/teams/fast-fix.team.md +11 -11
- package/teams/implementation.team.md +18 -18
- package/teams/parallel-research.team.md +14 -14
- package/teams/research.team.md +11 -11
- package/teams/review.team.md +12 -12
- package/tsconfig.json +19 -19
- package/workflows/default.workflow.md +30 -30
- package/workflows/fast-fix.workflow.md +23 -23
- package/workflows/implementation.workflow.md +43 -43
- package/workflows/parallel-research.workflow.md +46 -46
- package/workflows/research.workflow.md +22 -22
- package/workflows/review.workflow.md +30 -30
- package/skills/task-packet/SKILL.md +0 -28
- package/skills/verify-evidence/SKILL.md +0 -27
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# pi-crew Sprint 7 Report — Scaffolding for the last 4 deferred items
|
|
2
|
+
|
|
3
|
+
Date: 2026-05-14
|
|
4
|
+
Branch: `perf/sprint-7-scaffolding`
|
|
5
|
+
Status: 4/4 shipped as feature-flagged scaffolding.
|
|
6
|
+
|
|
7
|
+
## Items shipped
|
|
8
|
+
|
|
9
|
+
| ID | Item | Commit |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| 2.2 | appendEventBuffered + flushEventLogBuffer | 34d8652 |
|
|
12
|
+
| 2.1 | atomicWriteJsonCoalesced + flushPendingAtomicWrites | b8fe5d9 |
|
|
13
|
+
| 2.5 | saveCrewAgentsCoalesced + writeCrewAgentStatusCoalesced | ddb77f7 |
|
|
14
|
+
| 2.6 | child-pi-pool.ts skeleton (ADR 0008) | 69d135d |
|
|
15
|
+
|
|
16
|
+
## Design choice: scaffolding > full caller migration
|
|
17
|
+
|
|
18
|
+
For 2.1 / 2.2 / 2.5 the durability redesign requires either:
|
|
19
|
+
- a state-store reader that consults the in-memory buffer before disk
|
|
20
|
+
(otherwise read-after-write within the coalesce window is stale); or
|
|
21
|
+
- new integration crash-recovery tests proving no events are lost when
|
|
22
|
+
a process is killed inside the buffer window.
|
|
23
|
+
|
|
24
|
+
Both belong on a dedicated branch with their own integration test
|
|
25
|
+
harness. To still close the items without blocking on that branch, this
|
|
26
|
+
sprint ships the **producer side** (`*Buffered` / `*Coalesced` APIs)
|
|
27
|
+
ready for opt-in caller migration. The default code path is unchanged:
|
|
28
|
+
`appendEvent` / `atomicWriteJson` / `saveCrewAgents` remain durable, so
|
|
29
|
+
production runs are unaffected.
|
|
30
|
+
|
|
31
|
+
For 2.6 the blocker is the Pi runtime — until Pi accepts a
|
|
32
|
+
wait-for-prompt handshake, a real warm pool would just spawn idle
|
|
33
|
+
processes that can't be reused. The skeleton lets `child-pi.ts` adopt
|
|
34
|
+
the API now and a future PR can flip the implementation when Pi adds
|
|
35
|
+
support.
|
|
36
|
+
|
|
37
|
+
## Tests
|
|
38
|
+
|
|
39
|
+
- 3/3 new event-log-buffered cases (seq invariant under burst,
|
|
40
|
+
explicit flush, mixed sync/buffered seq monotonicity).
|
|
41
|
+
- 3/3 new atomic-write-coalesced cases (5-write collapse, explicit
|
|
42
|
+
flush, multi-path last-write-wins).
|
|
43
|
+
- 4/4 new child-pi-pool skeleton cases.
|
|
44
|
+
- typecheck + check:lazy-imports + bench:check green.
|
|
45
|
+
|
|
46
|
+
## Files
|
|
47
|
+
|
|
48
|
+
- `src/state/event-log.ts` (refactor + buffered API)
|
|
49
|
+
- `src/state/atomic-write.ts` (coalesced API)
|
|
50
|
+
- `src/runtime/crew-agent-records.ts` (coalesced wrappers)
|
|
51
|
+
- `src/runtime/child-pi-pool.ts` (skeleton, new)
|
|
52
|
+
- `test/unit/event-log-buffered.test.ts` (new)
|
|
53
|
+
- `test/unit/atomic-write-coalesced.test.ts` (new)
|
|
54
|
+
- `test/unit/child-pi-pool.test.ts` (new)
|
|
55
|
+
|
|
56
|
+
## Caller migration TODOs (follow-up, not this sprint)
|
|
57
|
+
|
|
58
|
+
1. **task.progress events** (high-frequency, tolerable to lose tail) —
|
|
59
|
+
switch `appendEvent(eventsPath, { type: "task.progress", ... })` →
|
|
60
|
+
`appendEventBuffered(...)` in `team-runner.ts` + `task-runner.ts`.
|
|
61
|
+
2. **saveRunTasks merge loop** — switch to `atomicWriteJsonCoalesced`
|
|
62
|
+
in team-runner.ts mergeTaskUpdates path; ensure
|
|
63
|
+
`loadRunManifestById` consumers downstream call
|
|
64
|
+
`flushPendingAtomicWrites()` first (or accept ≤50ms window).
|
|
65
|
+
3. **agent progress writes** — replace `writeCrewAgentStatus(...)` with
|
|
66
|
+
`writeCrewAgentStatusCoalesced(...)` in task-runner progress hook;
|
|
67
|
+
keep the durable variant for terminal events (completed/failed/
|
|
68
|
+
cancelled).
|
|
69
|
+
4. **warm pool implementation** — once Pi supports
|
|
70
|
+
`PI_CREW_POOL_HEALTH=1` handshake (ADR 0008 step 1), replace the
|
|
71
|
+
`acquirePooledChild = () => null` stub with the actual pool.
|
|
72
|
+
|
|
73
|
+
Each TODO has a single touchpoint that future maintainers can pick off
|
|
74
|
+
the shelf without re-reading the underlying state-store invariants.
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# pi-crew Performance Upgrade Plan — 2026-05
|
|
2
|
+
|
|
3
|
+
Date: 2026-05-14
|
|
4
|
+
Owner: pi-crew maintainers
|
|
5
|
+
Branch nền: `perf/baseline-bench`
|
|
6
|
+
Status: in-progress (Sprint 0 starting)
|
|
7
|
+
|
|
8
|
+
## Mục đích
|
|
9
|
+
|
|
10
|
+
Nâng cấp hiệu năng và UI mượt hơn mà vẫn giữ tính ổn định, tuân theo `AGENTS.md` task loop và 5 ADR hiện hành (durable state, child-process for async, depth guard, execFileSync, no parameter properties). Plan này tập hợp 30 item nâng cấp đã phân tích, chia thành 5 sprint + 1 đợt tổng kết.
|
|
11
|
+
|
|
12
|
+
Các trục:
|
|
13
|
+
|
|
14
|
+
1. **UI mượt hơn** — cắt sync I/O khỏi render path.
|
|
15
|
+
2. **Runtime/state** — giảm syscall, lazy import, warm pool, refactor file lớn.
|
|
16
|
+
3. **Ổn định** — backpressure, heartbeat, cancel sớm, mailbox archive, kill-tree Win.
|
|
17
|
+
4. **Telemetry chi phí thấp** — stream sink, OTLP gzip, sample progress, histogram bucket.
|
|
18
|
+
5. **Build/test feedback loop** — bench gate, test concurrency, watch mode, bundle.
|
|
19
|
+
|
|
20
|
+
## Quy trình áp dụng cho mọi PR
|
|
21
|
+
|
|
22
|
+
- Branch: `perf/<sprint>-<id>-<slug>` cắt từ `perf/baseline-bench`.
|
|
23
|
+
- Lane (theo `AGENTS.md`): tiny / normal / high-risk.
|
|
24
|
+
- Validation bắt buộc trước khi merge:
|
|
25
|
+
- `npm run typecheck`
|
|
26
|
+
- `npm run check:lazy-imports`
|
|
27
|
+
- `npm test`
|
|
28
|
+
- `npm run bench:check` — không regress > 15%
|
|
29
|
+
- Tài liệu:
|
|
30
|
+
- Update `CHANGELOG.md` (nhóm theo sprint).
|
|
31
|
+
- Update `docs/TEST_MATRIX.md` khi thêm test.
|
|
32
|
+
- Viết ADR cho mọi thay đổi contract (`docs/decisions/`).
|
|
33
|
+
- Không gộp > 2 item vào 1 PR. Không refactor "tiện thể".
|
|
34
|
+
- Mỗi item rủi ro cao có flag tắt được ở config (`runtime.experimental.<feature>=false`).
|
|
35
|
+
|
|
36
|
+
## Sprint 0 — Baseline & gate (2 ngày)
|
|
37
|
+
|
|
38
|
+
Mục đích: đo trước khi tối ưu.
|
|
39
|
+
|
|
40
|
+
| ID | Task | Files | Lane |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| S0-1 | Profile script | `scripts/profile-startup.mjs` | tiny |
|
|
43
|
+
| S0-2 | Bench harness 3 file | `test/bench/{register-startup,render-flush,snapshot-cache}.bench.ts`, `test/bench/baseline.json` | normal |
|
|
44
|
+
| S0-3 | `npm run bench` + `bench:check` | `package.json`, `scripts/bench-check.mjs` | tiny |
|
|
45
|
+
| S0-4 | Branch nền `perf/baseline-bench` | — | — |
|
|
46
|
+
| S0-5 | Capture baseline | `docs/perf/baseline-2026-05.md` | tiny |
|
|
47
|
+
|
|
48
|
+
Exit criteria: `npm run bench` ổn định, baseline đã ghi.
|
|
49
|
+
|
|
50
|
+
## Sprint 1 — UI mượt rủi ro thấp (5 ngày)
|
|
51
|
+
|
|
52
|
+
| ID | Item | Lane | Acceptance |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| 1.1 | renderTick no-sync | tiny | Render skeleton khi preload chưa sẵn; test fs.statSync throw không crash. |
|
|
55
|
+
| 1.2 | Async snapshot stamps | normal | Sync version chỉ ở CLI handler; bench p95 -30%. |
|
|
56
|
+
| 1.4 | Stamp version counter | tiny | Dùng `events.jsonl.seq` thay `combineStamps(size)`. |
|
|
57
|
+
| 1.5 | Stamp agents O(1) | tiny | 1 stat/run thay vì N. |
|
|
58
|
+
| 1.8 | Powerbar dedup hash | tiny | 100 emit cùng payload → 1 event. |
|
|
59
|
+
| 1.9 | subagent.completed coalescer | tiny | 10 events trong 30 ms → 1 invalidate. |
|
|
60
|
+
| 1.10 | Mascot pause idle | tiny | Config `ui.mascotPauseIdleMs`. |
|
|
61
|
+
|
|
62
|
+
Exit: `render-flush.bench.ts` -30%, `snapshot-cache.bench.ts` -20%.
|
|
63
|
+
|
|
64
|
+
## Sprint 2 — Cắt I/O sync hot path (5 ngày)
|
|
65
|
+
|
|
66
|
+
| ID | Item | Lane | Acceptance |
|
|
67
|
+
|---|---|---|---|
|
|
68
|
+
| 2.7 | Lazy import phase 2 | tiny | `register` end-to-end -200 ms. |
|
|
69
|
+
| 2.10 | projectCrewRoot cache | tiny | 1000 lần gọi → 1 stat. |
|
|
70
|
+
| 4.1 | Metric-sink stream | tiny | 10k metric → 0 sync IO hot path. |
|
|
71
|
+
| 4.4 | Progress sample 1/10 + first/last | tiny | 100 progress → 12 trong jsonl. |
|
|
72
|
+
| 2.1 | Atomic-write coalescer | normal | Crash trong window không corrupt; test recovery. |
|
|
73
|
+
| 2.2 | Events.jsonl buffer 20 ms | normal | flushSync trên cleanupRuntime + session_before_switch. |
|
|
74
|
+
| 2.3 | Rotation threshold 4 MB | tiny | Append 4 MB → rotate. |
|
|
75
|
+
| 1.3 | FS watcher native | normal | Render < 100 ms từ FS event; fallback poll khi ENOSYS. |
|
|
76
|
+
|
|
77
|
+
Exit: 0 sync IO trong `RenderScheduler.flush`, register start ≤ 400 ms.
|
|
78
|
+
|
|
79
|
+
## Sprint 3 — Refactor & UI selectors (5 ngày)
|
|
80
|
+
|
|
81
|
+
| ID | Item | Lane | Acceptance |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| 2.8 | Tách adaptive-plan | normal | `team-runner.ts` < 45 KB; lazy import khi workflow ≠ implementation. |
|
|
84
|
+
| 2.9 | Tách config.ts | normal | `config.ts` < 20 KB; hot path không import drift/suggestions. |
|
|
85
|
+
| 1.6 | Dashboard pane independent | normal | 1 task đổi → chỉ agents-pane render. |
|
|
86
|
+
| 1.7 | Memoized snapshot slice | normal | 2 lần get cùng cache → cùng reference. |
|
|
87
|
+
| 5.1 | Test concurrency 4 | tiny | mỗi test mkdtemp riêng PI_TEAMS_HOME. |
|
|
88
|
+
|
|
89
|
+
Exit: dashboard FPS +50% khi run đang chạy.
|
|
90
|
+
|
|
91
|
+
## Sprint 4 — Ổn định & telemetry (4 ngày)
|
|
92
|
+
|
|
93
|
+
| ID | Item | Lane | Acceptance |
|
|
94
|
+
|---|---|---|---|
|
|
95
|
+
| 3.1 | Backpressure stdout | normal | Stress 50 MB output → memory không vượt cap. |
|
|
96
|
+
| 3.2 | Heartbeat backoff | tiny | Stale → poll 1 s; khoẻ → 5 s. |
|
|
97
|
+
| 3.5 | Cancel propagate < 200 ms | normal | Stream-parse JSONL + signal check. |
|
|
98
|
+
| 3.6 | Deadletter cooldown | tiny | Config `reliability.deadletterCooldownMs`. |
|
|
99
|
+
| 3.7 | Idempotent resume theo attemptId | tiny | Resume 3 lần → artifact không nhân đôi. |
|
|
100
|
+
| 3.8 | Kill-tree Win | normal | SIGKILL fail → `taskkill /F /T`. |
|
|
101
|
+
| 3.4 | Atomic-write jitter | tiny | Jitter ±20%, max 8 attempts. |
|
|
102
|
+
| 3.3 | Mailbox auto-archive | normal | 11 MB → rotate vào blob-store. |
|
|
103
|
+
| 4.2 | OTLP gzip + delta | tiny | Content-Encoding: gzip; counter delta. |
|
|
104
|
+
| 4.3 | Histogram buckets pre-tuned | tiny | `crew.task.duration_ms` buckets `[50,200,500,1k,5k,30k,120k]`. |
|
|
105
|
+
|
|
106
|
+
Exit: cancel < 200 ms, no OOM trên stress, deadletter không lặp.
|
|
107
|
+
|
|
108
|
+
## Sprint 5 — Backlog rủi ro cao + ADR (1 tuần)
|
|
109
|
+
|
|
110
|
+
| ID | Item | Lane | ADR |
|
|
111
|
+
|---|---|---|---|
|
|
112
|
+
| 5.5 | Bundle ESM (esbuild) | high-risk | `0006-publish-bundled-esm.md` |
|
|
113
|
+
| 2.4 | Active-run-registry binary | high-risk | `0007-active-run-binary-index.md` |
|
|
114
|
+
| 2.6 | Child-pi warm pool | high-risk | `0008-child-pi-warm-pool.md` |
|
|
115
|
+
| 2.5 | Lazy materialize agent records | normal | — |
|
|
116
|
+
| 5.2 | Watch mode test | tiny | — |
|
|
117
|
+
|
|
118
|
+
Mỗi item: ADR + flag tắt được + dual-ship migration nếu cần.
|
|
119
|
+
|
|
120
|
+
## Tổng kết
|
|
121
|
+
|
|
122
|
+
- `docs/perf/sprint-<n>-report.md` cuối mỗi sprint.
|
|
123
|
+
- `docs/perf/final-report-2026-05.md` so sánh baseline vs final.
|
|
124
|
+
- Update `docs/next-upgrade-roadmap.md` đánh dấu các item đã xong.
|
|
125
|
+
|
|
126
|
+
## Risk register
|
|
127
|
+
|
|
128
|
+
| Risk | Sprint | Mitigation |
|
|
129
|
+
|---|---|---|
|
|
130
|
+
| Coalescer mất event lúc crash | 2 | flushSync ở exit hook; integration test crash recovery. |
|
|
131
|
+
| FS watcher fail trên FS mạng | 2 | Detect ENOSYS/EPERM → fallback poll. |
|
|
132
|
+
| Bundle phá Pi extension load | 5 | Prototype + smoke trước; dual-ship 1 release. |
|
|
133
|
+
| Warm pool leak state | 5 | Pool process khởi động fresh, có nonce; reuse fail → discard. |
|
|
134
|
+
| Binary index migration | 5 | Read both binary + JSONL trong 2 release. |
|
|
135
|
+
| Concurrency=4 unit test flaky | 3 | Audit test dùng shared HOME; mỗi test mkdtemp riêng. |
|
|
136
|
+
|
|
137
|
+
## Mục tiêu đo lường
|
|
138
|
+
|
|
139
|
+
| Metric | Baseline (Sprint 0) | Target | Sprint kỳ vọng cải thiện |
|
|
140
|
+
|---|---|---|---|
|
|
141
|
+
| `register.ts` end-to-end | TBD | < 400 ms | 2 |
|
|
142
|
+
| Widget first frame sau session_start | TBD | < 150 ms | 1 |
|
|
143
|
+
| `runTeamTask` cold | TBD | -2 đến -4 s (warm pool) | 5 |
|
|
144
|
+
| Dashboard FPS khi run đang chạy | TBD | +50% | 3 |
|
|
145
|
+
| events.jsonl tail 32 KB parse | TBD | < 5 ms | 2 |
|
|
146
|
+
| CPU idle khi run completed | TBD | < 1% | 1 |
|
|
147
|
+
| Cancel round-trip | TBD | < 200 ms | 4 |
|