pi-crew 0.2.2 → 0.2.4
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 -413
- 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 -0
- 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-plan-2026-05-12.md +463 -0
- package/docs/followup-review-2026-05-12.md +297 -0
- package/docs/followup-review-round3-2026-05-12.md +342 -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 -99
- 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 -103
- 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 -158
- package/src/extension/registration/team-tool.ts +159 -98
- 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 -95
- 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 -228
- package/src/extension/team-tool/status.ts +110 -110
- package/src/extension/team-tool-types.ts +13 -13
- package/src/extension/team-tool.ts +16 -4
- 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 -79
- package/src/runtime/attention-events.ts +28 -28
- package/src/runtime/auto-resume.ts +100 -100
- package/src/runtime/background-runner.ts +122 -88
- 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 -463
- 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 -264
- 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 -599
- 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 -122
- 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 -90
- 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 -395
- 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 -458
- 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 -189
- package/src/schema/config-schema.ts +172 -168
- package/src/schema/team-tool-schema.ts +126 -125
- 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 -178
- 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 -240
- package/src/state/event-reconstructor.ts +217 -217
- package/src/state/jsonl-writer.ts +82 -82
- package/src/state/locks.ts +146 -148
- 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 -117
- 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/env-filter.ts +30 -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/resolve-shell.ts +34 -0
- package/src/utils/safe-paths.ts +47 -47
- package/src/utils/scan-cache.ts +136 -136
- package/src/utils/sleep.ts +2 -1
- 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 -72
- package/src/worktree/worktree-manager.ts +188 -146
- 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,107 @@
|
|
|
1
|
+
# Follow-up Review Round 4 — 2026-05-13
|
|
2
|
+
|
|
3
|
+
Review of commits `c7bd455` through `5f47e92` (7 commits on top of `faa81e4`).
|
|
4
|
+
|
|
5
|
+
## Summary
|
|
6
|
+
|
|
7
|
+
These commits harden live-session runtime cleanup, async runner lifecycle, crew-agent persistence, and Windows test flakiness. Overall quality is high and the fixes address real production issues. However, one commit introduces a **regression** that breaks the resume/follow-up capability for completed live-session agents. Two other issues could cause crashes or races in edge cases.
|
|
8
|
+
|
|
9
|
+
**All identified bugs have been fixed in commits `a8a43b4` through current working tree.**
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Critical — FIXED
|
|
14
|
+
|
|
15
|
+
### BUG-014: `removeLiveAgentHandle` on normal completion destroys resume capability
|
|
16
|
+
|
|
17
|
+
**File:** `src/runtime/live-session-runtime.ts` (finally block, line ~610)
|
|
18
|
+
**Commit:** `7a25644` → **Fixed in a8a43b4**
|
|
19
|
+
|
|
20
|
+
The finally block calls `removeLiveAgentHandle(agentId)` for non-aborted completions. This **deletes the live-agent handle from the registry entirely**, including its terminal status.
|
|
21
|
+
|
|
22
|
+
**Impact:** After a live-session task completes normally, `steerLiveAgent`, `followUpLiveAgent`, and `resumeLiveAgent` all fail with "Live agent '...' is not registered in this process."
|
|
23
|
+
|
|
24
|
+
**Fix:** Added `disposeLiveAgentSession()` in `live-agent-manager.ts` — disposes session resources but keeps the handle in the registry for resume/follow-up.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## High — FIXED
|
|
29
|
+
|
|
30
|
+
### BUG-015: `withAgentsLock` crashes on `EISDIR` from corrupted lock path
|
|
31
|
+
|
|
32
|
+
**File:** `src/runtime/crew-agent-records.ts`
|
|
33
|
+
**Commit:** `c7bd455` → **Fixed in a8a43b4**
|
|
34
|
+
|
|
35
|
+
`withAgentsLock` only caught `EEXIST`; if lock path was a directory, `EISDIR` crashed the process.
|
|
36
|
+
|
|
37
|
+
**Fix:** Handle `EISDIR` by removing the directory and retrying.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Medium — FIXED
|
|
42
|
+
|
|
43
|
+
### BUG-016: `markActiveTasksAndAgentsFailed` lacks run-level lock, races with crash recovery
|
|
44
|
+
|
|
45
|
+
**File:** `src/extension/async-notifier.ts`
|
|
46
|
+
**Commit:** `d6d466d` → **Fixed in current working tree**
|
|
47
|
+
|
|
48
|
+
`markActiveTasksAndAgentsFailed` called `saveRunTasks` and `saveCrewAgents` without `withRunLockSync`. Crash recovery (`cancelOrphanedRuns`) uses `withRunLockSync`. Concurrent execution on the same run risks lost updates.
|
|
49
|
+
|
|
50
|
+
**Fix:** Wrapped `markDeadAsyncRunIfNeeded` mutations inside `withRunLockSync(run, () => { ... })`. Also reloaded fresh manifest inside the lock to avoid operating on stale data.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Low — FIXED
|
|
55
|
+
|
|
56
|
+
### BUG-017: `safeDisposeLiveSession` catches all errors silently
|
|
57
|
+
|
|
58
|
+
**File:** `src/runtime/live-agent-manager.ts`
|
|
59
|
+
**Commit:** `7a25644` → **Fixed in current working tree**
|
|
60
|
+
|
|
61
|
+
Any exception from `dispose()` was swallowed without logging.
|
|
62
|
+
|
|
63
|
+
**Fix:** Log disposal errors via `logInternalError`.
|
|
64
|
+
|
|
65
|
+
### BUG-018: `effectiveRuntime` in `run.ts` is manually constructed
|
|
66
|
+
|
|
67
|
+
**File:** `src/extension/team-tool/run.ts`
|
|
68
|
+
**Commit:** `2486051` → **Fixed in current working tree**
|
|
69
|
+
|
|
70
|
+
The async fallback runtime was manually built field-by-field. If `CrewRuntimeCapabilities` gains a new required field, this site won't inherit it.
|
|
71
|
+
|
|
72
|
+
**Fix:** Use spread of original runtime with overrides: `{ ...runtime, kind: "child-process", steer: false, resume: false, liveToolActivity: false, fallback: "child-process", reason: "..." }`.
|
|
73
|
+
|
|
74
|
+
### NIT-007: `removeStaleAgentsLock` reads unlimited file size
|
|
75
|
+
|
|
76
|
+
**File:** `src/runtime/crew-agent-records.ts`
|
|
77
|
+
**Commit:** `c7bd455` → **Fixed in current working tree**
|
|
78
|
+
|
|
79
|
+
`fs.readFileSync(lockPath, "utf-8")` reads entire file into memory. Corrupted multi-megabyte file causes memory pressure.
|
|
80
|
+
|
|
81
|
+
**Fix:** Check `fs.statSync(lockPath).size > 1024` before reading; skip stale removal if oversized.
|
|
82
|
+
|
|
83
|
+
### NIT-008: `maxCollectedJsonEvents` cap is hardcoded at 200
|
|
84
|
+
|
|
85
|
+
**File:** `src/runtime/live-session-runtime.ts`
|
|
86
|
+
**Commit:** `c7bd455` → **Fixed in current working tree**
|
|
87
|
+
|
|
88
|
+
Long-running agents drop older JSON events needed for debugging/yield detection.
|
|
89
|
+
|
|
90
|
+
**Fix:** Increased cap from 200 to 1000.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Verification
|
|
95
|
+
|
|
96
|
+
- `npm run typecheck` passes.
|
|
97
|
+
- Targeted tests (`async-notifier`, `isolation-policy`, `live-agent-manager`, `live-session-runtime`, `team-tool-dispatch`) pass: **31 pass / 0 fail**.
|
|
98
|
+
- Full unit test suite not run due to time constraints; no new failures observed in targeted runs.
|
|
99
|
+
|
|
100
|
+
## Files Changed in Fixes
|
|
101
|
+
|
|
102
|
+
- `src/extension/async-notifier.ts` — BUG-016 (run lock)
|
|
103
|
+
- `src/runtime/live-agent-manager.ts` — BUG-014 (disposeLiveAgentSession), BUG-017 (log dispose errors)
|
|
104
|
+
- `src/runtime/live-session-runtime.ts` — BUG-014 (use disposeLiveAgentSession), NIT-008 (cap 1000)
|
|
105
|
+
- `src/runtime/crew-agent-records.ts` — BUG-015 (EISDIR), NIT-007 (size cap)
|
|
106
|
+
- `src/extension/team-tool/run.ts` — BUG-018 (spread runtime)
|
|
107
|
+
- `test/unit/live-agent-manager.test.ts` — test for disposeLiveAgentSession
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# Implementation Plan: Top 3 Features from oh-my-pi v15
|
|
2
|
+
|
|
3
|
+
> Date: 2026-05-13
|
|
4
|
+
> Based on: `D:/my/my_project/source/oh-my-pi` research
|
|
5
|
+
> Target: pi-crew v0.2.x
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Priority Order
|
|
10
|
+
|
|
11
|
+
1. **Typed Crew Errors** — Quick win, no dependencies
|
|
12
|
+
2. **Conflict Detection** — High value, standalone module
|
|
13
|
+
3. **Issue-PR Protocol** — Medium complexity, GitHub integration
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. Typed Crew Errors
|
|
18
|
+
|
|
19
|
+
### Why
|
|
20
|
+
Current pi-crew uses generic `Error` types with string matching:
|
|
21
|
+
```typescript
|
|
22
|
+
catch (e) {
|
|
23
|
+
if (e instanceof Error && e.message.includes("deadletter")) { ... }
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Pattern from oh-my-pi: use typed sentinel errors with `instanceof` discrimination.
|
|
28
|
+
|
|
29
|
+
### Files to create/modify
|
|
30
|
+
|
|
31
|
+
**Create:** `src/runtime/errors/crew-errors.ts`
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
/**
|
|
35
|
+
* Typed error sentinels for pi-crew operations.
|
|
36
|
+
* Follows oh-my-pi pattern from compaction/errors.ts.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
export class CrewCancelledError extends Error {
|
|
40
|
+
readonly name = "CrewCancelledError" as const;
|
|
41
|
+
constructor(message = "Crew run cancelled") { super(message); }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export class CrewTimeoutError extends Error {
|
|
45
|
+
readonly name = "CrewTimeoutError" as const;
|
|
46
|
+
constructor(public readonly maxDurationMs: number) {
|
|
47
|
+
super(`Crew run exceeded timeout of ${maxDurationMs}ms`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export class CrewDeadletterError extends Error {
|
|
52
|
+
readonly name = "CrewDeadletterError" as const;
|
|
53
|
+
constructor(
|
|
54
|
+
public readonly agentId: string,
|
|
55
|
+
public readonly reason: string,
|
|
56
|
+
) {
|
|
57
|
+
super(`Agent ${agentId} deadlettered: ${reason}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export class CrewAbortError extends Error {
|
|
62
|
+
readonly name = "CrewAbortError" as const;
|
|
63
|
+
constructor(message = "Crew run aborted") { super(message); }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export class CrewManifestError extends Error {
|
|
67
|
+
readonly name = "CrewManifestError" as const;
|
|
68
|
+
constructor(message: string, public readonly runId?: string) { super(message); }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export class CrewLockError extends Error {
|
|
72
|
+
readonly name = "CrewLockError" as const;
|
|
73
|
+
constructor(message: string, public readonly lockPath?: string) { super(message); }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Outcome of a crew run attempt.
|
|
78
|
+
* Used by RunTracker and HealthWatcher.
|
|
79
|
+
*/
|
|
80
|
+
export type CrewRunOutcome = "ok" | "cancelled" | "deadletter" | "failed" | "timeout" | "aborted";
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Update:** `src/runtime/task-runner.ts`, `src/runtime/team-runner.ts`, `src/runtime/crash-recovery.ts`
|
|
84
|
+
|
|
85
|
+
Replace string matching with `instanceof` checks.
|
|
86
|
+
|
|
87
|
+
### Implementation
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# 1. Create file
|
|
91
|
+
cat > src/runtime/errors/crew-errors.ts << 'EOF'
|
|
92
|
+
// (content above)
|
|
93
|
+
EOF
|
|
94
|
+
|
|
95
|
+
# 2. Update imports in affected files
|
|
96
|
+
# From: catch (e) { if (e instanceof Error && e.message.includes("deadletter")) ... }
|
|
97
|
+
# To: catch (e) { if (e instanceof CrewDeadletterError) ... }
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Effort: LOW (1-2 hours)
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 2. Conflict Detection
|
|
105
|
+
|
|
106
|
+
### Why
|
|
107
|
+
When multiple pi-crew agents edit the same file in a worktree, git merge conflicts can occur. Current pi-crew has no conflict detection — agents see garbled `<<<<<<< HEAD` markers with no structured way to resolve them.
|
|
108
|
+
|
|
109
|
+
### Architecture
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
pi-crew worktree agents edit files
|
|
113
|
+
↓
|
|
114
|
+
WorktreeManager detects file change
|
|
115
|
+
↓
|
|
116
|
+
ConflictDetector.scanFileForConflicts(path)
|
|
117
|
+
↓
|
|
118
|
+
Returns ConflictBlock[] + registers in ConflictHistory
|
|
119
|
+
↓
|
|
120
|
+
Read tool appends conflict warning footer
|
|
121
|
+
↓
|
|
122
|
+
Agent calls write({ path: "conflict://<id>", content })
|
|
123
|
+
↓
|
|
124
|
+
ConflictResolver.spliceConflict() → clean file
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Files to create
|
|
128
|
+
|
|
129
|
+
**Create:** `src/utils/conflict-detect.ts` (fork from oh-my-pi, ~400 lines)
|
|
130
|
+
|
|
131
|
+
Key exports:
|
|
132
|
+
- `scanConflictLines(lines, firstLineNumber)` → `ConflictBlock[]`
|
|
133
|
+
- `scanFileForConflicts(path)` → `{ blocks, scanTruncated }`
|
|
134
|
+
- `ConflictHistory` class
|
|
135
|
+
- `ConflictEntry` interface
|
|
136
|
+
- `parseConflictUri(raw)` → `ParsedConflictUri | null`
|
|
137
|
+
- `spliceConflict(text, entry, replacement)` → `string`
|
|
138
|
+
- `expandContentTokens(content, entry)` → `string` (handles @ours/@theirs/@base/@both)
|
|
139
|
+
- `renderConflictRegion(entry, scope)` → `{ lines, startLine }`
|
|
140
|
+
- `formatConflictWarning(entries)` → `string`
|
|
141
|
+
|
|
142
|
+
**Create:** `src/runtime/conflict-registry.ts`
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
/**
|
|
146
|
+
* Global conflict registry for pi-crew.
|
|
147
|
+
* Attaches ConflictHistory to each live session.
|
|
148
|
+
*/
|
|
149
|
+
import { ConflictHistory, getConflictHistory } from "../utils/conflict-detect.ts";
|
|
150
|
+
import type { LiveAgentHandle } from "./live-agent-manager.ts";
|
|
151
|
+
|
|
152
|
+
export function getAgentConflicts(handle: LiveAgentHandle): ConflictHistory {
|
|
153
|
+
if (!handle.conflictHistory) {
|
|
154
|
+
handle.conflictHistory = new ConflictHistory();
|
|
155
|
+
}
|
|
156
|
+
return handle.conflictHistory;
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Modify:** `src/extension/registration/tools/read-tool.ts`
|
|
161
|
+
|
|
162
|
+
After reading file content:
|
|
163
|
+
1. Call `scanConflictLines(lines, 1)`
|
|
164
|
+
2. For each block, call `conflictHistory.register(...)`
|
|
165
|
+
3. Append `formatConflictWarning(entries)` to output
|
|
166
|
+
|
|
167
|
+
**Modify:** `src/extension/registration/tools/write-tool.ts`
|
|
168
|
+
|
|
169
|
+
Add `conflict://<N>` handling:
|
|
170
|
+
1. Parse URI with `parseConflictUri(path)`
|
|
171
|
+
2. Look up `ConflictEntry` from `ConflictHistory`
|
|
172
|
+
3. Call `expandContentTokens(content, entry)`
|
|
173
|
+
4. Call `spliceConflict(originalText, entry, expandedContent)`
|
|
174
|
+
5. Write result to `entry.absolutePath`
|
|
175
|
+
|
|
176
|
+
### Integration points
|
|
177
|
+
|
|
178
|
+
| File | Change |
|
|
179
|
+
|------|--------|
|
|
180
|
+
| `src/extension/registration/tools/read-tool.ts` | Append conflict warning to file content |
|
|
181
|
+
| `src/extension/registration/tools/write-tool.ts` | Handle `conflict://` protocol |
|
|
182
|
+
| `src/runtime/live-agent-manager.ts` | Add `conflictHistory?: ConflictHistory` to handle |
|
|
183
|
+
| `src/utils/conflict-detect.ts` | New file (fork from oh-my-pi) |
|
|
184
|
+
| `src/runtime/conflict-registry.ts` | New file (global registry) |
|
|
185
|
+
|
|
186
|
+
### Edge cases to handle
|
|
187
|
+
|
|
188
|
+
1. **Nested conflicts** — oh-my-pi handles by requiring strict marker shape
|
|
189
|
+
2. **Multi-file conflicts** — `ConflictHistory.invalidatePath()` when file is resolved
|
|
190
|
+
3. **Retry after partial resolution** — `ConflictEntry` id stays stable
|
|
191
|
+
4. **Large files** — `scanFileForConflicts` caps at 10MB
|
|
192
|
+
5. **Diff3 conflicts** — Support `|||||||` base section
|
|
193
|
+
|
|
194
|
+
### Test plan
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
// test/unit/conflict-detect.test.ts
|
|
198
|
+
test("scanConflictLines detects single 2-way block", () => {
|
|
199
|
+
const lines = ["<<<<<<< HEAD", "our changes", "=======", "their changes", ">>>>>>> feature"];
|
|
200
|
+
const blocks = scanConflictLines(lines, 1);
|
|
201
|
+
assert(blocks.length === 1);
|
|
202
|
+
assert(blocks[0].oursLines[0] === "our changes");
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
test("scanConflictLines ignores non-column-0 markers", () => {
|
|
206
|
+
const lines = [" <<<<<<< indented", "=======", ">>>>>>>"];
|
|
207
|
+
const blocks = scanConflictLines(lines, 1);
|
|
208
|
+
assert(blocks.length === 0);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test("scanConflictLines detects diff3 3-way block", () => {
|
|
212
|
+
// ...with ||||||| base marker
|
|
213
|
+
});
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Effort: MEDIUM (4-8 hours)
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 3. Issue-PR Protocol
|
|
221
|
+
|
|
222
|
+
### Why
|
|
223
|
+
pi-crew workflow agents can benefit from issue/PR integration:
|
|
224
|
+
- Create issue from failed task
|
|
225
|
+
- Link workflow tasks to GitHub issues
|
|
226
|
+
- PR review workflow (`pr://` protocol)
|
|
227
|
+
|
|
228
|
+
### URL shapes to support
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
issue:// — list recent issues (default repo from cwd)
|
|
232
|
+
issue://owner/repo — list issues for repo
|
|
233
|
+
issue://123 — single issue (repo from cwd)
|
|
234
|
+
issue://owner/repo/123 — fully qualified
|
|
235
|
+
issue://owner/repo/123?comments=0 — suppress comments
|
|
236
|
+
|
|
237
|
+
pr:// — list recent PRs
|
|
238
|
+
pr://owner/repo — list PRs for repo
|
|
239
|
+
pr://owner/repo/456 — single PR
|
|
240
|
+
pr://owner/repo/456/diff — PR diff
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Files to create/modify
|
|
244
|
+
|
|
245
|
+
**Create:** `src/internal-urls/issue-pr-protocol.ts` (port from oh-my-pi, ~577 lines)
|
|
246
|
+
|
|
247
|
+
Key exports:
|
|
248
|
+
- `IssuePrProtocol` class implementing `ProtocolHandler`
|
|
249
|
+
- `parseIssueUrl(url)` → `ParsedIssue`
|
|
250
|
+
- `parsePrUrl(url)` → `ParsedPr`
|
|
251
|
+
- `fetchIssue(parsed)` → `string` (markdown)
|
|
252
|
+
- `fetchPr(parsed)` → `string` (markdown)
|
|
253
|
+
- `fetchPrDiff(parsed)` → `string` (unified diff)
|
|
254
|
+
|
|
255
|
+
**Modify:** `src/internal-urls/router.ts`
|
|
256
|
+
|
|
257
|
+
Register `issue://` and `pr://` handlers.
|
|
258
|
+
|
|
259
|
+
**Create:** `src/tools/gh-cache.ts` (fork from oh-my-pi `tools/github-cache.ts`)
|
|
260
|
+
|
|
261
|
+
SQLite-backed cache for GitHub API responses. Shared across sessions.
|
|
262
|
+
|
|
263
|
+
### Dependencies
|
|
264
|
+
|
|
265
|
+
1. **GitHub CLI (`gh`)** — oh-my-pi uses `gh issue list`, `gh pr list`, `gh api`
|
|
266
|
+
2. **SQLite** — via `better-sqlite3` or similar
|
|
267
|
+
3. **Git config** — Need to resolve default repo from `git remote get-url origin`
|
|
268
|
+
|
|
269
|
+
### Implementation details
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
interface ParsedIssue {
|
|
273
|
+
kind: "single" | "list";
|
|
274
|
+
repo?: string; // undefined = derive from cwd
|
|
275
|
+
number?: number;
|
|
276
|
+
state?: "open" | "closed" | "all";
|
|
277
|
+
limit?: number;
|
|
278
|
+
comments?: boolean;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
interface ParsedPr {
|
|
282
|
+
kind: "single" | "list" | "diff";
|
|
283
|
+
repo?: string;
|
|
284
|
+
number?: number;
|
|
285
|
+
state?: "open" | "closed" | "merged" | "all";
|
|
286
|
+
limit?: number;
|
|
287
|
+
diffMode?: "list" | "all";
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Fetching:**
|
|
292
|
+
- List: `gh issue list --repo owner/repo --state open --limit 30`
|
|
293
|
+
- Single: `gh issue view 123 --repo owner/repo --comments`
|
|
294
|
+
- PR: `gh pr view 456 --repo owner/repo --comments`
|
|
295
|
+
- Diff: `gh pr diff 456 --repo owner/repo`
|
|
296
|
+
|
|
297
|
+
**Caching:**
|
|
298
|
+
- Cache key: `{repo, number, type}` hash
|
|
299
|
+
- TTL: 5 minutes for list, 1 hour for single items
|
|
300
|
+
- Invalidate on write operations (create/close/reopen)
|
|
301
|
+
|
|
302
|
+
### Integration with pi-crew
|
|
303
|
+
|
|
304
|
+
**New tool:** `read-issue` / `read-pr`
|
|
305
|
+
```typescript
|
|
306
|
+
// agents có thể gọi:
|
|
307
|
+
// read({ path: "issue://123" }) → markdown của issue
|
|
308
|
+
// read({ path: "pr://456" }) → markdown của PR
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**New slash command:** `/issue` hoặc dùng existing `/crew`:
|
|
312
|
+
```
|
|
313
|
+
/crew create-issue "Task failed: fix memory leak in cache" --labels=bug --assignee=me
|
|
314
|
+
/crew link-issue TICKET-123 --task=explorer-1
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Effort: MEDIUM-HIGH (8-12 hours)
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Summary
|
|
322
|
+
|
|
323
|
+
| Feature | Effort | Risk | Priority |
|
|
324
|
+
|---------|--------|------|----------|
|
|
325
|
+
| Typed Crew Errors | LOW | None | 1 |
|
|
326
|
+
| Conflict Detection | MEDIUM | Git operations, large file handling | 2 |
|
|
327
|
+
| Issue-PR Protocol | MEDIUM-HIGH | GitHub auth, gh CLI dependency | 3 |
|
|
328
|
+
|
|
329
|
+
## Recommended execution order
|
|
330
|
+
|
|
331
|
+
1. **Day 1:** Typed Crew Errors (quick win)
|
|
332
|
+
2. **Day 2-3:** Conflict Detection
|
|
333
|
+
3. **Day 4-5:** Issue-PR Protocol (if time permits)
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
# Live Mailbox Runtime Direction
|
|
2
|
-
|
|
3
|
-
`pi-crew` currently uses workflow child-process orchestration: a run materializes tasks, executes them through the scheduler, writes artifacts/events, and optionally launches child Pi workers.
|
|
4
|
-
|
|
5
|
-
A full live mailbox runtime is intentionally out of scope for the current stable surface. Current foundational mailbox files are intentionally simple and local:
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
{stateRoot}/mailbox/inbox.jsonl
|
|
9
|
-
{stateRoot}/mailbox/outbox.jsonl
|
|
10
|
-
{stateRoot}/mailbox/delivery.json
|
|
11
|
-
{stateRoot}/mailbox/tasks/{taskId}/inbox.jsonl
|
|
12
|
-
{stateRoot}/mailbox/tasks/{taskId}/outbox.jsonl
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
They are exposed through safe API operations (`read-mailbox`, `send-message`, `ack-message`, `read-delivery`, `validate-mailbox`) but do not yet imply always-on long-lived workers. If a full runtime is added later, it should build on the foundations already present:
|
|
16
|
-
|
|
17
|
-
- `src/state/contracts.ts` for status/event contracts
|
|
18
|
-
- `src/state/task-claims.ts` for claim/lease safety
|
|
19
|
-
- `src/runtime/worker-heartbeat.ts` for liveness
|
|
20
|
-
- `src/state/locks.ts` for run-level mutation safety
|
|
21
|
-
- `action: "api"` for safe interop boundaries
|
|
22
|
-
|
|
23
|
-
## Proposed phases
|
|
24
|
-
|
|
25
|
-
1. **Read-only interop** — already started with `api` operations.
|
|
26
|
-
2. **Heartbeat writers** — allow workers to update heartbeat/progress safely.
|
|
27
|
-
3. **Claim-safe task lifecycle** — expose claim/release/transition operations with tokens.
|
|
28
|
-
4. **Mailbox** — add worker inbox/leader inbox files and delivery state.
|
|
29
|
-
5. **Live workers** — only after the above contracts are stable.
|
|
30
|
-
|
|
31
|
-
## Non-goals for now
|
|
32
|
-
|
|
33
|
-
- No always-on background worker pool.
|
|
34
|
-
- No automatic destructive cleanup of dirty worktrees.
|
|
35
|
-
- No recursive team spawning by workers.
|
|
36
|
-
- No mailbox mutation without locks and schema validation.
|
|
1
|
+
# Live Mailbox Runtime Direction
|
|
2
|
+
|
|
3
|
+
`pi-crew` currently uses workflow child-process orchestration: a run materializes tasks, executes them through the scheduler, writes artifacts/events, and optionally launches child Pi workers.
|
|
4
|
+
|
|
5
|
+
A full live mailbox runtime is intentionally out of scope for the current stable surface. Current foundational mailbox files are intentionally simple and local:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
{stateRoot}/mailbox/inbox.jsonl
|
|
9
|
+
{stateRoot}/mailbox/outbox.jsonl
|
|
10
|
+
{stateRoot}/mailbox/delivery.json
|
|
11
|
+
{stateRoot}/mailbox/tasks/{taskId}/inbox.jsonl
|
|
12
|
+
{stateRoot}/mailbox/tasks/{taskId}/outbox.jsonl
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
They are exposed through safe API operations (`read-mailbox`, `send-message`, `ack-message`, `read-delivery`, `validate-mailbox`) but do not yet imply always-on long-lived workers. If a full runtime is added later, it should build on the foundations already present:
|
|
16
|
+
|
|
17
|
+
- `src/state/contracts.ts` for status/event contracts
|
|
18
|
+
- `src/state/task-claims.ts` for claim/lease safety
|
|
19
|
+
- `src/runtime/worker-heartbeat.ts` for liveness
|
|
20
|
+
- `src/state/locks.ts` for run-level mutation safety
|
|
21
|
+
- `action: "api"` for safe interop boundaries
|
|
22
|
+
|
|
23
|
+
## Proposed phases
|
|
24
|
+
|
|
25
|
+
1. **Read-only interop** — already started with `api` operations.
|
|
26
|
+
2. **Heartbeat writers** — allow workers to update heartbeat/progress safely.
|
|
27
|
+
3. **Claim-safe task lifecycle** — expose claim/release/transition operations with tokens.
|
|
28
|
+
4. **Mailbox** — add worker inbox/leader inbox files and delivery state.
|
|
29
|
+
5. **Live workers** — only after the above contracts are stable.
|
|
30
|
+
|
|
31
|
+
## Non-goals for now
|
|
32
|
+
|
|
33
|
+
- No always-on background worker pool.
|
|
34
|
+
- No automatic destructive cleanup of dirty worktrees.
|
|
35
|
+
- No recursive team spawning by workers.
|
|
36
|
+
- No mailbox mutation without locks and schema validation.
|