9.7 KiB
Turn Pipeline Schema
Overview
Each template can define a turn_pipeline that specifies which SmartTools to run and how to pipe data between them. The runner is thin orchestration - it just executes tools and pipes data, with no business logic.
Design Philosophy
The pipeline should mirror what you could do manually in a shell:
# Parse the discussion
cat discussion.md | discussion-parser > parsed.json
# Route mentions
cat parsed.json | discussion-mention-router > routing.json
# Call each participant (could be parallel)
cat discussion.md | discussion-architect --callout "Review" > resp_architect.json
cat discussion.md | discussion-security --callout "Review" > resp_security.json
# Append responses
cat discussion.md | discussion-turn-appender --responses '[...]' > updated.md
# Count votes (if voting phase)
cat updated.md | discussion-parser | discussion-vote-counter > votes.json
Schema
turn_pipeline:
steps:
- tool: <tool-name> # Required: SmartTool to execute
input: <variable> # What to pipe to stdin (default: $discussion)
output: <variable> # Where to store stdout (default: discarded)
args: # CLI arguments
--arg-name: <value> # Can reference variables: $varname
when: <condition> # Optional: condition to run this step
for_each: <variable> # Optional: iterate over array
parallel: <bool> # Optional: run for_each in parallel
Variables
Variables are referenced with $ prefix:
Built-in Variables
$discussion- Current discussion markdown content (updated as pipeline runs)$discussion_path- Path to the discussion file$callout- Callout/question passed to the turn$participants- List of participant aliases from discussion metadata$templates_dir- Path to templates directory
Step Output Variables
Each step can capture its output:
- tool: discussion-parser
input: $discussion
output: $parsed # Now $parsed contains the JSON output
Accessing JSON Fields
For JSON outputs, access fields with dot notation:
- tool: discussion-mention-router
input: $parsed
output: $routing
- tool: discussion-{participant}
for_each: $routing.participants_to_call # Iterate over array in JSON
Array Collection
When using for_each, outputs are collected into an array:
- tool: discussion-{participant}
for_each: $routing.participants_to_call
output: $responses[] # [] means append to array
Conditions
always- Always run (default)$variable- Run if variable is truthy$variable.field- Run if JSON field is truthynot $variable- Run if variable is falsy
Examples:
- tool: discussion-vote-counter
when: $phase.voting # Only if phase has voting enabled
- tool: discussion-mention-router
when: not $participants_specified # Only if no participants given
Complete Example
turn_pipeline:
steps:
# Step 1: Parse discussion to get metadata
- tool: discussion-parser
input: $discussion
output: $parsed
# Step 2: Route mentions (optional - skip if participants specified)
- tool: discussion-mention-router
input: $parsed
output: $routing
when: not $participants_specified
args:
--default-participants: $participants
# Step 3: Call each participant
- tool: discussion-{participant}
for_each: $routing.participants_to_call
parallel: true
input: $discussion
output: $responses[]
args:
--callout: $callout
--templates-dir: $templates_dir
# Step 4: Append responses to discussion
- tool: discussion-turn-appender
input: $discussion
output: $discussion # Update the discussion variable
args:
--responses-json: $responses
# Step 5: Count votes (only in voting phases)
- tool: discussion-parser
input: $discussion
output: $updated_parsed
when: $phase.voting
- tool: discussion-vote-counter
input: $updated_parsed
output: $votes
when: $phase.voting
args:
--threshold-ready: $phase.threshold_ready
--human-required: $phase.human_required
# Step 6: Check status promotion
- tool: discussion-status-promoter
input: $votes
output: $promotion
when: $phase.voting
args:
--current-status: $parsed.metadata.status
--current-phase: $parsed.metadata.phase
For Each Expansion
When for_each is used, the step runs once per item:
- tool: discussion-{participant}
for_each: $routing.participants_to_call # e.g., ["architect", "security"]
input: $discussion
output: $responses[]
This expands to:
cat discussion.md | discussion-architect > resp_0.json
cat discussion.md | discussion-security > resp_1.json
# $responses = [resp_0.json contents, resp_1.json contents]
With parallel: true, these run concurrently.
Special Tool Patterns
{participant} Substitution
The pattern {participant} in tool names is replaced with the current iteration value:
- tool: discussion-{participant}
for_each: ["architect", "security"]
Becomes calls to discussion-architect and discussion-security.
Minimal Example
A bare-bones pipeline that just calls participants and appends:
turn_pipeline:
steps:
- tool: discussion-{participant}
for_each: $participants
parallel: true
input: $discussion
output: $responses[]
- tool: discussion-turn-appender
input: $discussion
output: $discussion
args:
--responses-json: $responses
Phase Artifacts
Phases can define artifacts to enable collaboration on diagrams, sketches, and models.
Participants read this config to know what formats to output and where to save files.
Artifact Schema
phases:
sketch:
goal: Rough out the selected idea
artifacts:
formats: # List of accepted formats
- plantuml # PlantUML diagrams (.puml)
- svg # SVG vector graphics (.svg)
- mermaid # Mermaid diagrams (.mmd)
- openscad # OpenSCAD 3D models (.scad)
- solidpython # SolidPython 3D models (.py)
output_dir: diagrams/ # Where to save artifacts
file_pattern: "{title}_{participant}_{n}" # Naming pattern
instructions: |
- Create diagrams in any supported format
- Review existing artifacts in the output directory
- Build on or modify others' work as needed
Supported Formats
| Format | Extension | Use Case |
|---|---|---|
plantuml |
.puml |
Sequence, component, class, state diagrams |
mermaid |
.mmd |
Flowcharts, sequence, ER, Gantt charts |
svg |
.svg |
UI mockups, icons, 2D layouts, sketches |
openscad |
.scad |
3D models, mechanical parts, enclosures |
solidpython |
.py |
Programmatic 3D models (Python-based) |
dot |
.dot |
Graph visualizations (Graphviz) |
ascii |
.txt |
Simple inline text diagrams |
How Participants Use Artifacts
Participants receive artifact config via the --artifacts-json argument:
{
"formats": ["plantuml", "svg"],
"output_dir": "diagrams/",
"file_pattern": "{title}_{participant}_{n}"
}
They then:
- Know what formats are acceptable for this phase
- Save artifacts to the correct directory
- Reference artifacts in comments with
ARTIFACT: path/to/file.ext - Can read existing artifacts in
output_dirto build upon them
Response Format with Artifacts
Participants output artifacts in their JSON response:
{
"comment": "Here's my proposed architecture...\n\nARTIFACT: diagrams/auth-flow_architect_1.puml",
"vote": null,
"artifacts": [
{
"format": "plantuml",
"filename": "auth-flow_architect_1.puml",
"content": "@startuml\nUser -> Auth: login\nAuth -> DB: validate\n@enduml"
}
]
}
Example: Hardware Design Template
name: hardware_design
description: Physical product design workflow
phases:
requirements:
goal: Define physical constraints and requirements
artifacts: null # No artifacts in this phase
voting: false
enclosure_design:
goal: Design the physical enclosure
artifacts:
formats: [openscad, solidpython]
output_dir: models/
instructions: |
- Create 3D models considering manufacturing constraints
- Review existing models in models/ folder
- Consider assembly, thermal, and structural requirements
voting: false
pcb_layout:
goal: Plan PCB component placement
artifacts:
formats: [svg, plantuml]
output_dir: pcb/
instructions: |
- Create component layout diagrams
- Consider signal routing and thermal zones
voting: false
final_review:
goal: Approve the complete design
artifacts:
formats: [openscad, svg, plantuml]
output_dir: final/
voting: true
threshold_ready: 0.67
Example: UI Design Template
name: ui_design
description: User interface design workflow
phases:
wireframe:
goal: Sketch rough layouts
artifacts:
formats: [svg, ascii]
output_dir: wireframes/
instructions: |
- Create rough wireframes - boxes and labels only
- Focus on layout and flow, not aesthetics
- One SVG per screen/view
voting: false
mockup:
goal: Detailed visual mockups
artifacts:
formats: [svg]
output_dir: mockups/
instructions: |
- Build on approved wireframes
- Add visual hierarchy and styling
- Consider responsive breakpoints
voting: true
threshold_ready: 0.5