Orchestration Schema
This document defines an implementation-ready schema extension for orchestration workflows in Brainfile:
- Direct 1:1 dispatch
- Pipeline/DAG execution
- Fan-out/fan-in barriers
- Safe parallel file-write coordination
- PM-authoritative scheduler boundaries
The design is intentionally backward-compatible with current task files and event envelopes.
Compatibility Contract
- All new fields are optional.
- Existing tasks without orchestration fields keep current behavior.
- Existing
assigneesemantics remain valid. - Existing envelope/event structure remains valid.
- No migration is required for boards that do not use orchestration features.
Proposed Task Frontmatter Extension
Add an optional top-level orchestration object to task files:
yaml
orchestration:
dispatch:
mode: direct # direct | pool
target: worker-2 # required when mode=direct
dependsOn:
- task-210
- task-211
readiness:
successState: done # done | delivered
onDependencyFailure: blocked # blocked | failed
join:
mode: barrier # none | barrier
requires:
- task-220
- task-221
policy: all_success # all_success | all_delivered | quorum
quorum: 2 # required only for policy=quorum
resources:
reads:
- protocol/docs/**
writes:
- path: protocol/docs/specs/orchestration-events.md
mode: exclusive # exclusive | shared
conflictPolicy: block # block | reject
scheduler:
authority: pm # reserved: pmField Semantics
dispatch
mode: pool- any eligible worker can claim.
mode: direct- only
targetmay claim. - non-target claims must be rejected with explicit reason code.
- only
Compatibility mapping (when dispatch omitted):
assigneeempty /pool/ legacy model-family assignee (codex,claude,gemini,cursor) =>mode=poolassignee=worker-N=>mode=direct,target=worker-N
dependsOn
- Defines DAG prerequisites by task id.
- A task is not schedulable until dependency conditions are met.
- Cycles are invalid and must be rejected at validation/scheduler ingest time.
Compatibility mapping:
- If
dependsOnis absent and legacyblockedByexists, scheduler may treatblockedByas a fallback dependency list.
readiness
successState:done(default): dependencies must be PM-validated terminal success.delivered: dependencies may unlock downstream work after worker delivery.
onDependencyFailure:blocked(default): hold task as blocked.failed: PM may transition task contract tofailed.
join
mode=barrierenables fan-in gating.requiresdefaults todependsOnwhen omitted.policy:all_success: all required tasks must satisfy success criteria.all_delivered: all required tasks must be delivered or done.quorum: at leastquorumrequired tasks satisfy criteria.
resources
reads: advisory read set.writes: write-intent set for conflict safety.writes[].mode:exclusive: no concurrent overlapping writer allowed.shared: concurrent shared writers allowed.
conflictPolicy:block: hold task until conflicting writer exits.reject: deny claim immediately with reason code.
scheduler.authority
- Reserved to
pmfor now. - Documents that terminal orchestration decisions are PM-owned.
Readiness Resolution Algorithm
A task is scheduler-eligible when all of the following are true:
contract.status == ready- Dispatch can resolve to a valid claimant (
directtarget orpool) - Dependencies satisfy
readiness.successState - Join condition (if any) is satisfied
- Resource conflict check passes for active in-progress set
Pseudo-logic:
text
eligible(task) =
contractReady(task)
AND dispatchSatisfied(task)
AND dependenciesSatisfied(task)
AND joinSatisfied(task)
AND resourcesSatisfied(task)If any check fails, scheduler emits explicit reason codes and keeps task non-runnable.
Scheduler Authority Boundaries
PM-only transitions
contract.delegatedemission for orchestration scheduling decisionsdelivered -> done(contract.validatedresult=done)delivered -> failed(contract.validatedresult=failed)run.started,run.blocked,run.closed- Orchestration-level claim approval/rejection decisions
Worker-owned transitions
ready -> in_progressvia successful claim/pickupin_progress -> deliveredvia delivery path- conversational updates (
message.status,message.blocker, etc.)
Shared/manual safety transitions
blockedmay be set by either party via explicit operator action/manual edit, but PM remains final authority for reopening strategy.
JSON Schema Addendum (Task-Level)
Suggested task.json extension shape (additive):
json
{
"properties": {
"orchestration": {
"type": "object",
"properties": {
"dispatch": {
"type": "object",
"properties": {
"mode": { "enum": ["direct", "pool"] },
"target": { "type": "string" }
},
"additionalProperties": false
},
"dependsOn": {
"type": "array",
"items": { "type": "string", "pattern": "^[a-z][a-z0-9]*-[0-9]+$" }
},
"readiness": {
"type": "object",
"properties": {
"successState": { "enum": ["done", "delivered"] },
"onDependencyFailure": { "enum": ["blocked", "failed"] }
},
"additionalProperties": false
},
"join": {
"type": "object",
"properties": {
"mode": { "enum": ["none", "barrier"] },
"requires": {
"type": "array",
"items": { "type": "string", "pattern": "^[a-z][a-z0-9]*-[0-9]+$" }
},
"policy": { "enum": ["all_success", "all_delivered", "quorum"] },
"quorum": { "type": "integer", "minimum": 1 }
},
"additionalProperties": false
},
"resources": {
"type": "object",
"properties": {
"reads": { "type": "array", "items": { "type": "string" } },
"writes": {
"type": "array",
"items": {
"type": "object",
"required": ["path"],
"properties": {
"path": { "type": "string" },
"mode": { "enum": ["exclusive", "shared"] }
},
"additionalProperties": false
}
},
"conflictPolicy": { "enum": ["block", "reject"] }
},
"additionalProperties": false
},
"scheduler": {
"type": "object",
"properties": {
"authority": { "enum": ["pm"] }
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}Minimal Workflow Examples
Direct 1:1
yaml
assignee: worker-2
orchestration:
dispatch:
mode: direct
target: worker-2Pipeline (A -> B -> C)
yaml
# task-B
orchestration:
dependsOn: [task-A]
# task-C
orchestration:
dependsOn: [task-B]Fan-out / Fan-in
yaml
# task-merge
orchestration:
join:
mode: barrier
requires: [task-branch-1, task-branch-2, task-branch-3]
policy: all_successMigration Notes
- No mandatory migration step.
- Teams can adopt orchestration fields incrementally per task.
- Existing non-orchestrated boards continue unchanged.
- If desired,
blockedBycan be read as compatibility fallback fordependsOnduring transition.