@llblab/pi-actors 0.42.3 → 0.43.1
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 +127 -175
- package/BACKLOG.md +189 -1
- package/CHANGELOG.md +183 -292
- package/README.md +115 -276
- package/dist/fixtures/protocol/control-endpoint.json +6 -0
- package/dist/fixtures/protocol/control-record.json +9 -0
- package/dist/fixtures/protocol/recipe-summary.json +4 -12
- package/dist/fixtures/protocol/trace-event.json +9 -0
- package/dist/index.js +1 -1
- package/dist/lib/async-runs.d.ts +15 -38
- package/dist/lib/async-runs.js +173 -111
- package/dist/lib/automatic-review-runtime.d.ts +1 -1
- package/dist/lib/automatic-review-runtime.js +5 -5
- package/dist/lib/command-templates.d.ts +2 -0
- package/dist/lib/command-templates.js +38 -4
- package/dist/lib/control-projection.d.ts +20 -0
- package/dist/lib/control-projection.js +66 -0
- package/dist/lib/control.d.ts +15 -0
- package/dist/lib/control.js +97 -0
- package/dist/lib/draft-sleep.js +3 -3
- package/dist/lib/execution-sessions.d.ts +17 -0
- package/dist/lib/execution-sessions.js +85 -0
- package/dist/lib/file-state.d.ts +2 -0
- package/dist/lib/file-state.js +114 -46
- package/dist/lib/inspector-actions.d.ts +2 -2
- package/dist/lib/inspector-actions.js +2 -2
- package/dist/lib/inspector-command.js +3 -3
- package/dist/lib/inspector-overlay.d.ts +54 -70
- package/dist/lib/inspector-overlay.js +576 -910
- package/dist/lib/inspector.d.ts +3 -71
- package/dist/lib/inspector.js +19 -665
- package/dist/lib/limits.d.ts +7 -3
- package/dist/lib/limits.js +7 -3
- package/dist/lib/observability.d.ts +16 -16
- package/dist/lib/observability.js +43 -82
- package/dist/lib/prompts.d.ts +1 -1
- package/dist/lib/prompts.js +3 -3
- package/dist/lib/recipe-control.d.ts +7 -0
- package/dist/lib/recipe-control.js +43 -0
- package/dist/lib/recipes-discovery.js +2 -0
- package/dist/lib/recipes-references.d.ts +1 -14
- package/dist/lib/recipes-references.js +6 -21
- package/dist/lib/review-control.d.ts +1 -1
- package/dist/lib/review-control.js +4 -5
- package/dist/lib/review-projection.js +1 -5
- package/dist/lib/run-ui-runtime.js +2 -2
- package/dist/lib/runs-control-delivery.d.ts +28 -0
- package/dist/lib/runs-control-delivery.js +150 -0
- package/dist/lib/runs-controls.d.ts +37 -0
- package/dist/lib/runs-controls.js +146 -0
- package/dist/lib/runs-retention.d.ts +7 -0
- package/dist/lib/runs-retention.js +27 -3
- package/dist/lib/runs-start.js +4 -2
- package/dist/lib/runs-status.js +11 -6
- package/dist/lib/runs-trace.d.ts +24 -0
- package/dist/lib/runs-trace.js +102 -0
- package/dist/lib/runtime-identity.d.ts +7 -0
- package/dist/lib/runtime-identity.js +35 -0
- package/dist/lib/runtime-notifier.d.ts +1 -1
- package/dist/lib/runtime-notifier.js +1 -1
- package/dist/lib/runtime-triage.d.ts +29 -0
- package/dist/lib/runtime-triage.js +76 -0
- package/dist/lib/tool-review-scheduler.js +7 -7
- package/dist/lib/tools-inspect.d.ts +3 -3
- package/dist/lib/tools-inspect.js +241 -707
- package/dist/lib/tools-local.js +2 -10
- package/dist/lib/tools-message.d.ts +6 -7
- package/dist/lib/tools-message.js +95 -396
- package/dist/lib/tools-response.d.ts +1 -5
- package/dist/lib/tools-response.js +5 -48
- package/dist/lib/tools-spawn.js +16 -28
- package/dist/lib/tools.d.ts +1 -1
- package/dist/lib/tools.js +2 -3
- package/dist/lib/trace-projection.d.ts +22 -0
- package/dist/lib/trace-projection.js +185 -0
- package/dist/recipes/draft-review.json +0 -10
- package/dist/recipes/lens-swarm.json +0 -14
- package/dist/recipes/music-player.json +10 -19
- package/dist/recipes/pipeline-architect-coordinator.json +0 -11
- package/dist/recipes/pipeline-artifact-bundle.json +1 -22
- package/dist/recipes/pipeline-artifact-report.json +1 -18
- package/dist/recipes/pipeline-artifact-write.json +1 -18
- package/dist/recipes/pipeline-async-run-ops.json +0 -12
- package/dist/recipes/pipeline-checkpoint-continuation.json +0 -14
- package/dist/recipes/pipeline-development-tasking.json +0 -12
- package/dist/recipes/pipeline-docs-maintenance.json +0 -12
- package/dist/recipes/pipeline-media-library.json +0 -12
- package/dist/recipes/pipeline-quorum-review.json +0 -12
- package/dist/recipes/pipeline-release-readiness.json +0 -12
- package/dist/recipes/pipeline-release-summary.json +0 -12
- package/dist/recipes/pipeline-repo-health.json +0 -12
- package/dist/recipes/pipeline-research-synthesis.json +0 -11
- package/dist/recipes/pipeline-review-readiness.json +0 -12
- package/dist/recipes/resource-locker.json +27 -0
- package/dist/recipes/subagent-artifact.json +0 -9
- package/dist/recipes/subagent-checkpoint.json +0 -10
- package/dist/recipes/subagent-conflict-report.json +0 -11
- package/dist/recipes/subagent-contradiction-map.json +0 -11
- package/dist/recipes/subagent-critic.json +0 -11
- package/dist/recipes/subagent-evidence-map.json +0 -11
- package/dist/recipes/subagent-followup.json +0 -10
- package/dist/recipes/subagent-judge.json +0 -11
- package/dist/recipes/subagent-merge.json +0 -11
- package/dist/recipes/subagent-normalize.json +0 -11
- package/dist/recipes/subagent-plan.json +0 -11
- package/dist/recipes/subagent-preflight.json +0 -11
- package/dist/recipes/subagent-prompt.json +0 -10
- package/dist/recipes/subagent-quorum.json +0 -10
- package/dist/recipes/subagent-review-coordinator.json +0 -14
- package/dist/recipes/subagent-review.json +0 -11
- package/dist/recipes/subagent-task-card.json +0 -11
- package/dist/recipes/subagent-tools.json +0 -10
- package/dist/recipes/subagent-verify.json +0 -11
- package/dist/recipes/subagents-prompts.json +0 -10
- package/dist/recipes/tool-review.json +0 -10
- package/dist/scripts/async-runner.mjs +25 -25
- package/dist/scripts/conformance.mjs +4 -2
- package/dist/scripts/locker.mjs +196 -69
- package/dist/scripts/music-player.mjs +162 -159
- package/dist/scripts/recipe-utils.mjs +6 -96
- package/dist/scripts/release-gates.mjs +91 -0
- package/dist/scripts/validate-recipe.mjs +8 -57
- package/dist/skills/actors/SKILL.md +57 -265
- package/dist/skills/swarm/SKILL.md +10 -34
- package/docs/0.43-baseline.md +39 -0
- package/docs/README.md +4 -6
- package/docs/actor-inspector.md +26 -64
- package/docs/async-runs.md +81 -328
- package/docs/command-templates.md +8 -118
- package/docs/recipe-library.md +55 -182
- package/docs/releasing.md +28 -0
- package/docs/template-recipes.md +76 -289
- package/docs/tool-registry.md +41 -161
- package/fixtures/protocol/control-endpoint.json +6 -0
- package/fixtures/protocol/control-record.json +9 -0
- package/fixtures/protocol/recipe-summary.json +4 -12
- package/fixtures/protocol/trace-event.json +9 -0
- package/index.ts +1 -1
- package/lib/async-runs.ts +218 -204
- package/lib/automatic-review-runtime.ts +7 -7
- package/lib/command-templates.ts +44 -4
- package/lib/control-projection.ts +105 -0
- package/lib/control.ts +117 -0
- package/lib/draft-sleep.ts +3 -3
- package/lib/execution-sessions.ts +111 -0
- package/lib/file-state.ts +84 -64
- package/lib/inspector-actions.ts +2 -2
- package/lib/inspector-command.ts +3 -3
- package/lib/inspector-overlay.ts +617 -1126
- package/lib/inspector.ts +46 -979
- package/lib/limits.ts +7 -3
- package/lib/observability.ts +60 -101
- package/lib/prompts.ts +3 -3
- package/lib/recipe-control.ts +52 -0
- package/lib/recipes-discovery.ts +2 -0
- package/lib/recipes-references.ts +9 -45
- package/lib/review-control.ts +4 -5
- package/lib/review-projection.ts +1 -5
- package/lib/run-ui-runtime.ts +2 -2
- package/lib/runs-control-delivery.ts +209 -0
- package/lib/runs-controls.ts +213 -0
- package/lib/runs-retention.ts +38 -3
- package/lib/runs-start.ts +4 -2
- package/lib/runs-status.ts +11 -6
- package/lib/runs-trace.ts +136 -0
- package/lib/runtime-identity.ts +39 -0
- package/lib/runtime-notifier.ts +1 -1
- package/lib/runtime-triage.ts +120 -0
- package/lib/tool-review-scheduler.ts +7 -7
- package/lib/tools-inspect.ts +283 -900
- package/lib/tools-local.ts +2 -12
- package/lib/tools-message.ts +112 -520
- package/lib/tools-response.ts +5 -64
- package/lib/tools-spawn.ts +16 -32
- package/lib/tools.ts +5 -6
- package/lib/trace-projection.ts +244 -0
- package/package.json +2 -1
- package/recipes/draft-review.json +0 -10
- package/recipes/lens-swarm.json +0 -14
- package/recipes/music-player.json +10 -19
- package/recipes/pipeline-architect-coordinator.json +0 -11
- package/recipes/pipeline-artifact-bundle.json +1 -22
- package/recipes/pipeline-artifact-report.json +1 -18
- package/recipes/pipeline-artifact-write.json +1 -18
- package/recipes/pipeline-async-run-ops.json +0 -12
- package/recipes/pipeline-checkpoint-continuation.json +0 -14
- package/recipes/pipeline-development-tasking.json +0 -12
- package/recipes/pipeline-docs-maintenance.json +0 -12
- package/recipes/pipeline-media-library.json +0 -12
- package/recipes/pipeline-quorum-review.json +0 -12
- package/recipes/pipeline-release-readiness.json +0 -12
- package/recipes/pipeline-release-summary.json +0 -12
- package/recipes/pipeline-repo-health.json +0 -12
- package/recipes/pipeline-research-synthesis.json +0 -11
- package/recipes/pipeline-review-readiness.json +0 -12
- package/recipes/resource-locker.json +27 -0
- package/recipes/subagent-artifact.json +0 -9
- package/recipes/subagent-checkpoint.json +0 -10
- package/recipes/subagent-conflict-report.json +0 -11
- package/recipes/subagent-contradiction-map.json +0 -11
- package/recipes/subagent-critic.json +0 -11
- package/recipes/subagent-evidence-map.json +0 -11
- package/recipes/subagent-followup.json +0 -10
- package/recipes/subagent-judge.json +0 -11
- package/recipes/subagent-merge.json +0 -11
- package/recipes/subagent-normalize.json +0 -11
- package/recipes/subagent-plan.json +0 -11
- package/recipes/subagent-preflight.json +0 -11
- package/recipes/subagent-prompt.json +0 -10
- package/recipes/subagent-quorum.json +0 -10
- package/recipes/subagent-review-coordinator.json +0 -14
- package/recipes/subagent-review.json +0 -11
- package/recipes/subagent-task-card.json +0 -11
- package/recipes/subagent-tools.json +0 -10
- package/recipes/subagent-verify.json +0 -11
- package/recipes/subagents-prompts.json +0 -10
- package/recipes/tool-review.json +0 -10
- package/scripts/async-runner.mjs +25 -25
- package/scripts/conformance.mjs +4 -2
- package/scripts/locker.mjs +196 -69
- package/scripts/music-player.mjs +162 -159
- package/scripts/recipe-utils.mjs +6 -96
- package/scripts/release-gates.mjs +91 -0
- package/scripts/validate-recipe.mjs +8 -57
- package/skills/actors/SKILL.md +57 -265
- package/skills/swarm/SKILL.md +10 -34
- package/dist/fixtures/protocol/actor-message-branch.json +0 -13
- package/dist/fixtures/protocol/mailbox-contract.json +0 -15
- package/dist/fixtures/protocol/room-message.json +0 -11
- package/dist/fixtures/protocol/room-roster.json +0 -11
- package/dist/fixtures/protocol/run-inbox-message.json +0 -9
- package/dist/fixtures/protocol/run-outbox-event.json +0 -9
- package/dist/lib/mailbox-loop.d.ts +0 -41
- package/dist/lib/mailbox-loop.js +0 -60
- package/dist/lib/messages.d.ts +0 -25
- package/dist/lib/messages.js +0 -122
- package/dist/lib/rooms.d.ts +0 -104
- package/dist/lib/rooms.js +0 -647
- package/dist/lib/runs-mailbox.d.ts +0 -25
- package/dist/lib/runs-mailbox.js +0 -146
- package/dist/lib/runs-messages.d.ts +0 -15
- package/dist/lib/runs-messages.js +0 -179
- package/dist/lib/runs-outbox.d.ts +0 -41
- package/dist/lib/runs-outbox.js +0 -87
- package/dist/lib/tools-mailbox.d.ts +0 -8
- package/dist/lib/tools-mailbox.js +0 -48
- package/dist/recipes/actor-worker.json +0 -39
- package/dist/recipes/coordinator-locker.json +0 -45
- package/dist/recipes/locker.json +0 -45
- package/dist/recipes/pipeline-room-swarm.json +0 -50
- package/dist/recipes/subagent-message.json +0 -32
- package/dist/recipes/utility-actor-message.json +0 -23
- package/dist/scripts/actor-worker.mjs +0 -214
- package/dist/scripts/coordinator.mjs +0 -799
- package/docs/actor-messages.md +0 -225
- package/docs/actors-deep-reference.md +0 -66
- package/docs/component-recipes.md +0 -148
- package/docs/task-first-recipes.md +0 -263
- package/fixtures/protocol/actor-message-branch.json +0 -13
- package/fixtures/protocol/mailbox-contract.json +0 -15
- package/fixtures/protocol/room-message.json +0 -11
- package/fixtures/protocol/room-roster.json +0 -11
- package/fixtures/protocol/run-inbox-message.json +0 -9
- package/fixtures/protocol/run-outbox-event.json +0 -9
- package/lib/mailbox-loop.ts +0 -144
- package/lib/messages.ts +0 -151
- package/lib/rooms.ts +0 -939
- package/lib/runs-mailbox.ts +0 -208
- package/lib/runs-messages.ts +0 -252
- package/lib/runs-outbox.ts +0 -144
- package/lib/tools-mailbox.ts +0 -56
- package/recipes/actor-worker.json +0 -39
- package/recipes/coordinator-locker.json +0 -45
- package/recipes/locker.json +0 -45
- package/recipes/pipeline-room-swarm.json +0 -50
- package/recipes/subagent-message.json +0 -32
- package/recipes/utility-actor-message.json +0 -23
- package/scripts/actor-worker.mjs +0 -214
- package/scripts/coordinator.mjs +0 -799
package/docs/actor-messages.md
DELETED
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
# Actor Messages
|
|
2
|
-
|
|
3
|
-
Protocol target for organic communication across pi-actors.
|
|
4
|
-
|
|
5
|
-
## Contract
|
|
6
|
-
|
|
7
|
-
Compress communication to three durable verbs:
|
|
8
|
-
|
|
9
|
-
- `spawn`: create an addressable actor from a recipe, template, or tool.
|
|
10
|
-
- `message`: send one typed message to one address.
|
|
11
|
-
- `inspect`: intentionally observe state, logs, actor messages, or artifacts.
|
|
12
|
-
|
|
13
|
-
Everything else is an adapter until proven otherwise.
|
|
14
|
-
|
|
15
|
-
## Nouns
|
|
16
|
-
|
|
17
|
-
- **Actor**: any addressable execution or coordination endpoint.
|
|
18
|
-
- **Address**: stable route string for an actor or sub-actor.
|
|
19
|
-
- **Message**: typed envelope flowing between addresses.
|
|
20
|
-
- **Artifact**: durable result path declared by recipe or produced by actor.
|
|
21
|
-
- **Inspection**: explicit diagnostic/read operation, not a coordination loop.
|
|
22
|
-
|
|
23
|
-
## Addresses
|
|
24
|
-
|
|
25
|
-
Initial address forms:
|
|
26
|
-
|
|
27
|
-
```text
|
|
28
|
-
run:<id>
|
|
29
|
-
branch:<run>/<branch>
|
|
30
|
-
coordinator
|
|
31
|
-
session:<id>
|
|
32
|
-
tool:<name>
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Cross-branch communication adds one organic endpoint kind:
|
|
36
|
-
|
|
37
|
-
```text
|
|
38
|
-
room:<run>
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
A room is the task's single shared discussion channel: an addressable mailbox with an append-only message log and a compact member roster stored under the owning run state. It is not a broker or coordinator: it accepts normal actor-message envelopes, records shared timeline entries, tracks join/leave presence, and lets actors discover peers for direct messages. `room:<run>` is the public address; named subrooms are intentionally not exposed in 0.17.
|
|
42
|
-
|
|
43
|
-
An alternate implementation shape is a dedicated non-LLM communication actor: a small script-backed service recipe, possibly singleton-scoped, that owns room timelines, rosters, subscriptions, and fanout. This is attractive when communication needs outgrow simple file-backed room state, but it should remain an implementation adapter behind the same `room:<run>` address and message envelope. The public model should not fork into a separate chat API.
|
|
44
|
-
|
|
45
|
-
That actor-backed shape can also reduce direct file storage. Instead of every protocol feature owning JSON files as primary state, a helper actor can keep live room/roster structures in memory or another local structure and write files only as snapshots, audit logs, artifacts, or recovery checkpoints. The decision boundary is practical: keep files when durability and inspectability are the main value; prefer actor-owned structures when live coordination, subscriptions, fanout, unread state, or mutation consistency becomes the main value.
|
|
46
|
-
|
|
47
|
-
Current backend decision: keep the file-backed adapter for now. The covered workload is append-heavy room coordination plus direct branch inbox queueing/claiming, where durable local files are still the useful source of truth for recovery and `inspect`. Live notification is a separate advisory wake layer: actors may subscribe to `wake.jsonl` changes through a cross-platform file notifier and still reconcile canonical mailbox files if a wake is missed. A communication helper should be introduced only when a real workflow needs long-lived subscriptions, live fanout policy, or shared mutable room state beyond the current lock/debounce/compaction safeguards.
|
|
48
|
-
|
|
49
|
-
Package-specific endpoints may still exist, but the envelope stays the same.
|
|
50
|
-
|
|
51
|
-
## Message Envelope
|
|
52
|
-
|
|
53
|
-
One shape covers upward, downward, lateral, parent-to-branch, and branch-to-parent traffic:
|
|
54
|
-
|
|
55
|
-
```json
|
|
56
|
-
{
|
|
57
|
-
"to": "run:review",
|
|
58
|
-
"from": "coordinator",
|
|
59
|
-
"type": "control.approve",
|
|
60
|
-
"summary": "Approve checkpoint",
|
|
61
|
-
"body": "approve",
|
|
62
|
-
"reply_to": "msg_123",
|
|
63
|
-
"correlation_id": "task_456",
|
|
64
|
-
"metadata": {}
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Field rules:
|
|
69
|
-
|
|
70
|
-
- `to`: required address.
|
|
71
|
-
- `from`: optional address; runtime fills when known.
|
|
72
|
-
- `type`: required semantic message type. Prefer compact dotted names such as `control.stop`, `task.claim`, or `player.next`, where the prefix is the interaction channel/domain and the suffix is the action. Many script-backed actors should be able to dispatch from `type` alone without requiring a structured body.
|
|
73
|
-
- `summary`: short human-facing line for notifications/follow-ups.
|
|
74
|
-
- `body`: optional string or JSON payload. Use it when extra context is needed: scripts may ignore it for action-only messages, while LLM-backed agents can accept free-form natural-language prompts without a rigid schema.
|
|
75
|
-
- Routing/delivery is inferred from `to`, actor ownership, and coordinator runtime policy; recipes should not expose delivery knobs. When a coordinator session is known, addressed run/branch/control messages fail closed before controlling or emitting from runs owned by another session.
|
|
76
|
-
- `reply_to`: optional message id for conversational checkpoints.
|
|
77
|
-
- `correlation_id`: optional task/run/workflow id.
|
|
78
|
-
- `metadata`: optional structured routing or domain hints.
|
|
79
|
-
|
|
80
|
-
## Symmetry
|
|
81
|
-
|
|
82
|
-
The same `message` primitive must represent:
|
|
83
|
-
|
|
84
|
-
```text
|
|
85
|
-
coordinator -> run
|
|
86
|
-
run -> coordinator
|
|
87
|
-
run -> run
|
|
88
|
-
parent -> branch
|
|
89
|
-
branch -> parent
|
|
90
|
-
branch -> room
|
|
91
|
-
room -> branch notification
|
|
92
|
-
coordinator -> tool
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Transports differ, but the public contract does not:
|
|
96
|
-
|
|
97
|
-
- `to: run:<id>` routes through the run-local control channel selected by that recipe or runtime adapter.
|
|
98
|
-
- `to: coordinator` routes to the runtime attention path when `from` names a run actor. `to: session:<id>` uses the same actor-message path only when the sender run is owned by that session, making explicit session-directed checkpoints possible without exposing runtime delivery knobs. Generic async-runner `command.done` messages and explicit coordinator/session-bound messages include the actor envelope fields alongside runtime metadata.
|
|
99
|
-
- `to: branch:<run>/<branch>` currently routes through the parent run mailbox with the full envelope preserved so the run or recipe-specific worker protocol can dispatch branch-local control. It also persists a queued branch-local copy under `branches/<branch>/inbox.jsonl`, inspectable with `inspect branch:<run>/<branch> view=mailbox`; compact inspection includes the inbox message `id`, status, route, type, and timestamps so worker protocols can correlate claims/retries. Branch-local inbox append and status rewrites are guarded by a small lock so direct delivery and coordinator claims do not overwrite each other during bursts. Status transitions preserve active queued/claimed records and compact older handled/failed terminal records with bounded retention, so persistent runners do not accumulate unbounded completed inbox history. Coordinator claim handling also assigns an ID to older/manual queued records that do not have one so they can still transition to `handled` or `failed` instead of repeating forever. It is not a broadcast room and it does not make an arbitrary prompt process consume the message automatically. Target direction: direct branch messages should become initiating inbox work for long-lived branch runners, delivered into the recipient's next prompt/context as soon as the runner can accept work.
|
|
100
|
-
- `to: room:<run>` appends the full envelope to the room timeline, updates room state for room-control types such as `actor.join` and `actor.leave`, and can route selected-recipient multicast when `metadata.recipients` contains same-run `branch:<run>/<branch>` addresses.
|
|
101
|
-
- `to: tool:<name>` invokes an executable pi tool by name. Object bodies become tool parameters; primitive bodies are passed as `{ "input": body }`.
|
|
102
|
-
|
|
103
|
-
Transport is not public API unless a recipe explicitly documents a custom endpoint.
|
|
104
|
-
|
|
105
|
-
## Rooms and Rosters
|
|
106
|
-
|
|
107
|
-
The task room is the discovery and shared-context layer for actors whose spawn-tree positions do not give them each other's addresses. The spawn tree remains the lifecycle/provenance structure; the task room describes the group communication graph. Direct messages and room messages can share the same semantic `type` such as `chat.message`; the route (`to: branch:*` versus `to: room:*`) determines whether delivery is private or group-wide.
|
|
108
|
-
|
|
109
|
-
Use direct branch messages only when the receiving branch is backed by a worker or recipe that reads the parent run mailbox or branch inbox and dispatches branch-targeted envelopes. Room roster contacts are discovery hints, not a guarantee that an independent prompt process is subscribed to its branch address. The current branch inbox records queued mailbox work; runner-side claiming/handling turns direct messages into prompt work for the recipient branch, while room messages remain shared transcript entries. A direct message may ask the recipient to inspect room history when broader shared context is needed. For ad hoc or transcript-driven swarms without such a runner, prefer room-visible replies and mentions so every participant can inspect the shared timeline.
|
|
110
|
-
|
|
111
|
-
Direct branch delivery is prompt steering for worker-backed branches, not a coordinator follow-up. Packaged coordinator flows claim queued branch inbox records immediately before launching the branch's next prompt, append a bounded "direct messages for you" section to that prompt, and then mark the claimed records `handled` or `failed` based on the prompt result. Generic one-shot `pi -p` children do not receive this injection automatically; a recipe must own the runner loop or use the packaged coordinator path for direct messages to become next-prompt work.
|
|
112
|
-
|
|
113
|
-
Selected-recipient multicast stays route-based: send one `to: room:<run>` envelope with `metadata.recipients` set to same-run branch addresses. The room timeline keeps the original room-visible envelope, and the runtime also forwards branch-targeted copies to each listed recipient. This is not a subroom; it is a shared transcript plus explicit direct delivery for actors whose worker protocol consumes branch envelopes.
|
|
114
|
-
|
|
115
|
-
A minimal join message:
|
|
116
|
-
|
|
117
|
-
```json
|
|
118
|
-
{
|
|
119
|
-
"to": "room:review",
|
|
120
|
-
"from": "branch:review/security",
|
|
121
|
-
"type": "actor.join",
|
|
122
|
-
"summary": "Security reviewer joined",
|
|
123
|
-
"body": {
|
|
124
|
-
"role": "reviewer",
|
|
125
|
-
"caps": ["security-review", "risk-analysis"],
|
|
126
|
-
"claim": "Review auth boundary risks"
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
A leave message removes that actor from the roster while preserving the timeline entry:
|
|
132
|
-
|
|
133
|
-
```json
|
|
134
|
-
{
|
|
135
|
-
"to": "room:review",
|
|
136
|
-
"from": "branch:review/security",
|
|
137
|
-
"type": "actor.leave"
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
Room messages require `from` so roster presence and provenance stay explicit. The sender must belong to the room's run (`run:<run>` or `branch:<run>/<branch>`), which prevents accidental cross-run roster pollution. Other room posts also refresh sender presence, defaulting the role hint to `actor` when no richer role is known.
|
|
142
|
-
|
|
143
|
-
Roster entries should keep identity axes separate:
|
|
144
|
-
|
|
145
|
-
- `address`: Stable route for direct messages.
|
|
146
|
-
- `parent`: Spawn-tree parent for provenance and ownership checks.
|
|
147
|
-
- `role`: Current task function; dynamic and prompt-dependent.
|
|
148
|
-
- `caps`: Capabilities the actor can offer.
|
|
149
|
-
- `claim`: Current work claim or focus.
|
|
150
|
-
- `status` / `last_seen`: Presence and staleness hints.
|
|
151
|
-
|
|
152
|
-
Compact roster inspection includes these hints when present so agents can discover direct-message targets without verbose JSON.
|
|
153
|
-
|
|
154
|
-
Actors should receive a compact visible communication snapshot rather than a full global tree: self, parent/root, joined rooms, relevant sibling/member addresses, and role/capability hints. Current run actors get `communication.json` in their state dir, and async templates receive `{communication_file}`, `{actor_address}`, and `{default_room}` values. The snapshot includes `self`, `root`, optional `parent`, the default room, current default-room members, direct-message `contacts` derived from the room roster, and `updated_at`. Branch-local snapshots are refreshed when a branch joins or posts in the default room, so actors can discover peers without reading full timelines. Full timelines and rosters remain intentional inspection surfaces. For TUI and compact operator display, `view=previews` returns bounded message preview records with `timestamp`, `from`, `to`, `type`, optional `summary`, and optional `body_preview`.
|
|
155
|
-
|
|
156
|
-
## Mailbox Declaration
|
|
157
|
-
|
|
158
|
-
Recipes can declare their conversational surface:
|
|
159
|
-
|
|
160
|
-
```json
|
|
161
|
-
{
|
|
162
|
-
"mailbox": {
|
|
163
|
-
"accepts": [
|
|
164
|
-
"control.continue",
|
|
165
|
-
"control.revise",
|
|
166
|
-
"control.approve",
|
|
167
|
-
"control.kill"
|
|
168
|
-
],
|
|
169
|
-
"emits": ["checkpoint.needs_scope", "branch.done", "run.done"]
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
`mailbox.accepts` is a contract for coordinator-to-actor messages. `mailbox.emits` is a contract for actor-to-coordinator or actor-to-actor messages. Packaged interactive and message-producing recipes declare mailbox metadata so coordinators can discover semantic message types without reading transport details. Message-producing recipes produce actor-message-envelope-shaped records with `to`, `from`, `type`, `summary`, `body`, optional `correlation_id`/`reply_to`, and optional `metadata` fields. Coordinator follow-ups preserve bounded body previews and metadata so checkpoints do not lose their actionable payload. Deterministic pipelines should prefer `utility-actor-message` for this wrapping so message shape is validated and guaranteed instead of delegated to a prompt; its recipe args intentionally mirror the envelope field names.
|
|
175
|
-
|
|
176
|
-
## Spawn
|
|
177
|
-
|
|
178
|
-
`spawn` creates an actor and returns its address:
|
|
179
|
-
|
|
180
|
-
```json
|
|
181
|
-
{
|
|
182
|
-
"recipe": "subagents-prompts.json",
|
|
183
|
-
"as": "run:review",
|
|
184
|
-
"values": {},
|
|
185
|
-
"artifacts": { "report": "{state_dir}/report.md" }
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
`spawn` creates detached `run:<id>` actors from a recipe file/name or inline command template. Public spawn state directories are runtime-owned so every actor remains addressable and retention cannot target a caller-selected directory; spawn metadata may include named `artifacts` for terminal follow-ups and inspection. Room rosters are durable but burst-safe: repeated messages that only update `last_seen` may be coalesced briefly, while semantic roster changes such as role/status/display still write immediately.
|
|
190
|
-
|
|
191
|
-
## Inspect
|
|
192
|
-
|
|
193
|
-
`inspect` reads state intentionally:
|
|
194
|
-
|
|
195
|
-
```json
|
|
196
|
-
{
|
|
197
|
-
"target": "run:review",
|
|
198
|
-
"view": "status"
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
The implementation supports `status`, `tail`, `messages`, `artifacts`, `files`, `mailbox`, and `communication` for `run:<id>` actors, `status`, `messages`, `previews`, `roster`, and `contacts` for `room:<run>` actors, `status`/`runs` for `coordinator`, `session:<id>`, and `session:all` actors with optional status filtering, and `status`/`schema` for registered `tool:<name>` actors. Run mailbox inspection shows recipe-declared mailbox metadata plus recent durable run inbox entries; branch mailbox inspection shows branch-local queued/claimed/handled records. Room `status` returns compact message/roster counts plus `last_message_at`, `last_message_from`, `last_message_type`, and `last_message_summary` when available, without parsing the full timeline into actor envelopes. Use `messages` for actor-envelope inspection. `inspect target=coordinator` requires a current coordinator session; use `session:<id>` or `session:all` when the session is intentionally explicit. Direct `run:<id>` and `room:<run>` inspection respects coordinator-session ownership when the current session is known. Ownership denials use `reason=session_mismatch owner_session=<id> current_session=<id> hint=inspect_session:<id>`; recover by inspecting the hinted `session:<id>` instead of forcing cross-session control. `inspect` is for decision points and diagnosis only; examples must not teach sleep-then-inspect polling.
|
|
203
|
-
|
|
204
|
-
## Runtime Direction
|
|
205
|
-
|
|
206
|
-
Runtime operations use the actor/message vocabulary:
|
|
207
|
-
|
|
208
|
-
```text
|
|
209
|
-
create detached work -> spawn
|
|
210
|
-
run-local control -> message to run:<id>
|
|
211
|
-
run force-kill -> message type control.kill
|
|
212
|
-
platform control -> internal adapter selected from run state
|
|
213
|
-
coordinator signal -> message to coordinator/session
|
|
214
|
-
tool execution -> message to tool:<name>
|
|
215
|
-
intentional observe -> inspect
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
## Non-goals
|
|
219
|
-
|
|
220
|
-
- No generic expression language in templates.
|
|
221
|
-
- No public transport-path vocabulary in recipe args.
|
|
222
|
-
- No polling-first examples.
|
|
223
|
-
- No separate upward and downward message schemas.
|
|
224
|
-
- No heavyweight chat/broker subsystem when an addressable room mailbox is enough.
|
|
225
|
-
- No broad facade that hides artifacts, logs, or ownership checks.
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Actors Deep Reference
|
|
2
|
-
|
|
3
|
-
Use this document after `skills/actors/SKILL.md` when quick-start actor mechanics are not enough.
|
|
4
|
-
|
|
5
|
-
## Recipe Navigator
|
|
6
|
-
|
|
7
|
-
Use packaged recipes by name with `spawn file=<name>` for async actors, or register/call them as tools when repeated use deserves a stable shortcut. Start with the curated list below; use [`recipe-library.md`](recipe-library.md) for the full shipped inventory.
|
|
8
|
-
|
|
9
|
-
### Top Recipes
|
|
10
|
-
|
|
11
|
-
- [`pipeline-room-swarm`](../recipes/pipeline-room-swarm.json): room-visible swarm coordination with roles, rounds, optional locker, artifact synthesis, and `subagent_ttl_ms` for hard participant budgets.
|
|
12
|
-
- [`pipeline-repo-health`](../recipes/pipeline-repo-health.json): git/doc/validation evidence to normalized repository health report.
|
|
13
|
-
- [`pipeline-release-readiness`](../recipes/pipeline-release-readiness.json): changelog/package/skill/validation evidence to release review and artifact report.
|
|
14
|
-
- [`actor-worker`](../recipes/actor-worker.json): canonical mailbox-backed branch worker reference for claim/handle/status/artifact patterns.
|
|
15
|
-
- [`coordinator-locker`](../recipes/coordinator-locker.json): queue, lease locks, and journaled coordinator messages for multi-actor ownership.
|
|
16
|
-
|
|
17
|
-
### Common Cells
|
|
18
|
-
|
|
19
|
-
- Subagents: [`subagent-prompt`](../recipes/subagent-prompt.json), [`subagent-review-coordinator`](../recipes/subagent-review-coordinator.json), [`subagent-quorum`](../recipes/subagent-quorum.json), [`lens-swarm`](../recipes/lens-swarm.json).
|
|
20
|
-
- Artifacts/messages: [`utility-artifact-manifest`](../recipes/utility-artifact-manifest.json), [`utility-artifact-write`](../recipes/utility-artifact-write.json), [`utility-actor-message`](../recipes/utility-actor-message.json).
|
|
21
|
-
- Validation/state: [`utility-validation-wrapper`](../recipes/utility-validation-wrapper.json), [`utility-validate-recipe`](../recipes/utility-validate-recipe.json), [`utility-run-summary`](../recipes/utility-run-summary.json), [`utility-run-state-files`](../recipes/utility-run-state-files.json), [`utility-jsonl-tail`](../recipes/utility-jsonl-tail.json).
|
|
22
|
-
|
|
23
|
-
## Operating Patterns
|
|
24
|
-
|
|
25
|
-
- **Short deterministic command**: call a foreground registered tool or command template.
|
|
26
|
-
- **Long job/service/fanout**: `spawn` an async recipe, then inspect messages and artifacts.
|
|
27
|
-
- **One-off experiment**: use inline `template`; promote only useful repeats.
|
|
28
|
-
- **Reusable workflow**: package a user or bundled recipe with public knobs, mailbox, artifacts, and docs.
|
|
29
|
-
- **Subagent/swarm execution**: compose packaged recipes/pipelines from smaller recipe cells; add missing generic cells to the extension rather than creating one-off external orchestration scripts.
|
|
30
|
-
- **Consensus-first build**: when many lenses should shape one artifact, have proposer subagents post room messages, then one named implementer writes, one QA reviewer checks, and one finalizer emits `run.done`.
|
|
31
|
-
- **Coordinated workers**: spawn `coordinator-locker` when several actors need a shared queue, acquire/renew/release resource leases, or a journaled coordination point.
|
|
32
|
-
- **Release/review pipeline**: pi-actors can prepare evidence, summaries, and artifacts; external actions such as commit, PR, merge, tag, and publish require the appropriate gated release workflow.
|
|
33
|
-
|
|
34
|
-
## Complementary Methodology Engines
|
|
35
|
-
|
|
36
|
-
pi-actors is the local execution engine for methodology skills. A methodology skill can define abstract patterns such as lens swarm, quorum, task cards, lock discipline, consensus-first build, or clean-context merge; pi-actors turns those patterns into concrete local actors, recipes, queues, leases, artifacts, and messages.
|
|
37
|
-
|
|
38
|
-
Keep the split clean: methodology chooses coordination shape; pi-actors supplies addressable local machinery.
|
|
39
|
-
|
|
40
|
-
## Lifecycle Discipline
|
|
41
|
-
|
|
42
|
-
1. Choose an existing recipe/tool when available.
|
|
43
|
-
2. Spawn with a stable actor id for observable work.
|
|
44
|
-
3. Inspect `status` after launch.
|
|
45
|
-
4. Use notifications and `inspect`; do not busy-poll.
|
|
46
|
-
5. Read `messages` and `artifacts`, not only stdout.
|
|
47
|
-
6. Use `message` for explicit control or domain commands; inspect `mailbox` before domain-specific messages.
|
|
48
|
-
7. Promote repeated inline forms to recipes.
|
|
49
|
-
8. Keep recipes small and shallow: files over 1 MiB or import chains deeper than 32 are rejected.
|
|
50
|
-
9. Update docs/context when changing public behavior; if the change affects how agents operate this extension, update the bundled skill and prompt guidance too.
|
|
51
|
-
|
|
52
|
-
## Common Pitfalls
|
|
53
|
-
|
|
54
|
-
- Treating actor mechanics as multi-agent methodology.
|
|
55
|
-
- Repeating inline templates instead of promoting recipes.
|
|
56
|
-
- Creating task-specific external orchestration scripts when the scenario belongs in pi-actors as a reusable recipe/pipeline.
|
|
57
|
-
- Embedding complex shell loops or Bash `${...}` parameter expansion directly in command templates; braces are pi-actors placeholders too.
|
|
58
|
-
- Omitting stable run ids for work that needs follow-up.
|
|
59
|
-
- Sending domain messages without checking `mailbox`.
|
|
60
|
-
- Expecting current room messages to wake prompt-only subagents; use direct branch messages or a runner protocol for initiating work.
|
|
61
|
-
- Reading only stdout and missing actor messages/artifacts.
|
|
62
|
-
- Assuming every packaged message-controlled script is native-Windows-ready; core run control is platform-adapted, but Unix-tool scripts must be migrated recipe by recipe.
|
|
63
|
-
- Baking local absolute paths into published docs or reusable recipes.
|
|
64
|
-
- Creating recipes that perform external side effects without explicit operator gates.
|
|
65
|
-
- Letting project insights live only in chat instead of updating BACKLOG/CHANGELOG/docs and, when agent behavior changes, the packaged skill or prompt guidance.
|
|
66
|
-
- Preserving old runtime/event/FIFO vocabulary instead of `spawn`/`message`/`inspect` and actor messages.
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
# Component Recipes
|
|
2
|
-
|
|
3
|
-
Component recipes are small saved recipe definitions that expose one coordination capability each. They are the construction kit for higher-level subagent coordinators: a coordinator composes components instead of embedding one large orchestration DSL.
|
|
4
|
-
|
|
5
|
-
## Boundary
|
|
6
|
-
|
|
7
|
-
This is a weak abstract contract, not a hard dependency model.
|
|
8
|
-
|
|
9
|
-
- `pi-actors` provides root `recipes/` actor component definitions and runtime bindings.
|
|
10
|
-
- Portable coordination skills should target capabilities, not this extension by name.
|
|
11
|
-
- Local adapters bind abstract components to concrete recipes, command templates, async runs, model aliases, files, and tool registries.
|
|
12
|
-
- A component should be replaceable by another implementation with the same capability contract.
|
|
13
|
-
|
|
14
|
-
## Component Contract
|
|
15
|
-
|
|
16
|
-
Every reusable component recipe should make the following clear:
|
|
17
|
-
|
|
18
|
-
- **Capability**: the one operation it performs.
|
|
19
|
-
- **Args**: caller-controlled prompts, scopes, paths, models, and policy knobs.
|
|
20
|
-
- **Output**: the expected shape of stdout or artifact paths.
|
|
21
|
-
- **Messages**: optional actor-message envelopes for checkpoints, questions, progress, or findings.
|
|
22
|
-
- **Failure policy**: whether failures stop the root, only fail a branch, or are recoverable.
|
|
23
|
-
- **Non-goals**: coordination behavior the component intentionally does not own.
|
|
24
|
-
|
|
25
|
-
Reusable components should expose common policy knobs instead of baking in local choices: `model`, `thinking`, `tools`, `output_format`, `evidence_policy`, `risk_policy`, source policy, continuity/resume policy, handoff format, merge mode, model pools, and stage-specific models. Higher-level recipes may pass these knobs through so the same component can run as a safe no-tools reviewer, a file-reading reviewer, a release gate, a research synthesizer, a task-card author, or a high-thinking merger.
|
|
26
|
-
|
|
27
|
-
Keep components narrow. Higher-level recipes should own composition, not hidden behavior inside a leaf.
|
|
28
|
-
|
|
29
|
-
## Spectrum of Components
|
|
30
|
-
|
|
31
|
-
### Launchers
|
|
32
|
-
|
|
33
|
-
Start one subagent or branch with a caller-provided prompt and model. Launchers do not judge or merge output.
|
|
34
|
-
|
|
35
|
-
Examples: `recipes/subagent-prompt.json`, `recipes/subagent-tools.json`, and `recipes/subagents-prompts.json`.
|
|
36
|
-
|
|
37
|
-
### Reviewers
|
|
38
|
-
|
|
39
|
-
Inspect a scope through a declared lens and return evidence-grounded findings.
|
|
40
|
-
|
|
41
|
-
Seed example: `recipes/subagent-review.json`.
|
|
42
|
-
|
|
43
|
-
### Critics
|
|
44
|
-
|
|
45
|
-
Attack assumptions, edge cases, and failure modes. Critics should not rewrite the plan unless asked.
|
|
46
|
-
|
|
47
|
-
Seed example: `recipes/subagent-critic.json`.
|
|
48
|
-
|
|
49
|
-
### Planners
|
|
50
|
-
|
|
51
|
-
Turn a goal into bounded slices, validation gates, risks, and stop conditions.
|
|
52
|
-
|
|
53
|
-
Seed example: `recipes/subagent-plan.json`.
|
|
54
|
-
|
|
55
|
-
### Verifiers
|
|
56
|
-
|
|
57
|
-
Check a claim, artifact, or proposed result against evidence. Verifiers should separate proven, disproven, and unknown.
|
|
58
|
-
|
|
59
|
-
Seed example: `recipes/subagent-verify.json`.
|
|
60
|
-
|
|
61
|
-
### Evidence and Contradiction Mappers
|
|
62
|
-
|
|
63
|
-
Map source support, weak evidence, contradictions, unresolved assumptions, and missing source classes before synthesis.
|
|
64
|
-
|
|
65
|
-
Seed examples: `recipes/subagent-evidence-map.json` and `recipes/subagent-contradiction-map.json`.
|
|
66
|
-
|
|
67
|
-
### Mergers
|
|
68
|
-
|
|
69
|
-
Combine multiple branch outputs into a single synthesis. Mergers preserve minority findings and mark unsupported additions.
|
|
70
|
-
|
|
71
|
-
Seed example: `recipes/subagent-merge.json`.
|
|
72
|
-
|
|
73
|
-
### Normalizers, Artifacts, and Events
|
|
74
|
-
|
|
75
|
-
Convert variable branch output into stable JSON, Markdown sections, file artifacts, or actor-message records for downstream recipes.
|
|
76
|
-
|
|
77
|
-
Seed examples: `recipes/subagent-normalize.json`, `recipes/subagent-artifact.json`, and `recipes/subagent-message.json`.
|
|
78
|
-
|
|
79
|
-
### Quorum Operators
|
|
80
|
-
|
|
81
|
-
Run the same task across several independent models or instances and preserve vote shape for a later merger.
|
|
82
|
-
|
|
83
|
-
Seed example: `recipes/subagent-quorum.json`.
|
|
84
|
-
|
|
85
|
-
### Tasking and Conflict Handoffs
|
|
86
|
-
|
|
87
|
-
Produce bounded task cards or conflict reports for development swarms and integrator workflows.
|
|
88
|
-
|
|
89
|
-
Seed examples: `recipes/subagent-task-card.json` and `recipes/subagent-conflict-report.json`.
|
|
90
|
-
|
|
91
|
-
### Checkpoint Emitters
|
|
92
|
-
|
|
93
|
-
Emit bounded coordinator questions, partial state, or branch decisions as coordinator-bound actor messages. Checkpoint components should not pretend same-context resume exists unless the adapter can prove it.
|
|
94
|
-
|
|
95
|
-
Seed example: `recipes/subagent-checkpoint.json`.
|
|
96
|
-
|
|
97
|
-
### Follow-up Continuations
|
|
98
|
-
|
|
99
|
-
Resume or continue a branch with a bounded reply. If same-context continuation is unavailable, the component must declare a degraded mode such as creating a new branch with the checkpoint artifact included.
|
|
100
|
-
|
|
101
|
-
Seed example: `recipes/subagent-followup.json`.
|
|
102
|
-
|
|
103
|
-
### Judges
|
|
104
|
-
|
|
105
|
-
Evaluate report quality, evidence preservation, severity calibration, consensus purity, and internal consistency. Judges should not silently become another domain reviewer.
|
|
106
|
-
|
|
107
|
-
Seed example: `recipes/subagent-judge.json`.
|
|
108
|
-
|
|
109
|
-
## Composition Shape
|
|
110
|
-
|
|
111
|
-
A coordinator recipe can stay small by composing components:
|
|
112
|
-
|
|
113
|
-
```text
|
|
114
|
-
launch/review fanout → verify claims → merge → judge → final synthesis
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
Seed example: `recipes/subagent-review-coordinator.json` composes reviewer fanout, verification, merge, judge, and normalization.
|
|
118
|
-
|
|
119
|
-
Higher-level examples:
|
|
120
|
-
|
|
121
|
-
- `recipes/pipeline-review-readiness.json`: Release/readiness gate over selected lenses.
|
|
122
|
-
- `recipes/pipeline-quorum-review.json`: Same prompt across a model pool, then merge, judge, and normalize vote shape.
|
|
123
|
-
- `recipes/pipeline-architect-coordinator.json`: Architecture direction synthesis with lens fanout, critique, verification, merge, and next-slice output.
|
|
124
|
-
- `recipes/pipeline-research-synthesis.json`: Plan, evidence map, contradiction map, verification, merge, and normalized research synthesis.
|
|
125
|
-
- `recipes/pipeline-checkpoint-continuation.json`: Checkpoint artifact, follow-up continuation, and normalized handoff with explicit degraded-mode handling.
|
|
126
|
-
- `recipes/pipeline-development-tasking.json`: Plan, task card, critique, and normalized integrator handoff for bounded implementation work.
|
|
127
|
-
- `recipes/pipeline-artifact-report.json`: Normalized report → durable artifact-shaped output → actor-message-shaped record.
|
|
128
|
-
|
|
129
|
-
For high-risk work, split breadth and confidence:
|
|
130
|
-
|
|
131
|
-
```text
|
|
132
|
-
lens swarm → quorum per lens → merger → post-merge judge
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
For implementation work, combine coordination with local ownership policy:
|
|
136
|
-
|
|
137
|
-
```text
|
|
138
|
-
task cards → scoped branch agents → conflict reports → integrator merge → review
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## Design Rules
|
|
142
|
-
|
|
143
|
-
- Prefer public args/defaults over baked-in local policy.
|
|
144
|
-
- Use `failure: "branch"` for independent fanout branches unless one failure invalidates the whole run.
|
|
145
|
-
- Keep model pools and provider aliases configurable.
|
|
146
|
-
- Use artifacts or actor messages for intermediate outputs that must survive compaction.
|
|
147
|
-
- Do not hide broad coordinator behavior inside a component named like a leaf.
|
|
148
|
-
- Do not introduce scheduler, goto, or workflow-only syntax; compose saved recipes and command templates.
|