# 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: ```bash # 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 ```yaml turn_pipeline: steps: - tool: # Required: SmartTool to execute input: # What to pipe to stdin (default: $discussion) output: # Where to store stdout (default: discarded) args: # CLI arguments --arg-name: # Can reference variables: $varname when: # Optional: condition to run this step for_each: # Optional: iterate over array parallel: # 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: ```yaml - tool: discussion-parser input: $discussion output: $parsed # Now $parsed contains the JSON output ``` ### Accessing JSON Fields For JSON outputs, access fields with dot notation: ```yaml - 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: ```yaml - 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 truthy - `not $variable` - Run if variable is falsy Examples: ```yaml - 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 ```yaml 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: ```yaml - tool: discussion-{participant} for_each: $routing.participants_to_call # e.g., ["architect", "security"] input: $discussion output: $responses[] ``` This expands to: ```bash 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: ```yaml - 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: ```yaml 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 ```yaml 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: ```json { "formats": ["plantuml", "svg"], "output_dir": "diagrams/", "file_pattern": "{title}_{participant}_{n}" } ``` They then: 1. Know what formats are acceptable for this phase 2. Save artifacts to the correct directory 3. Reference artifacts in comments with `ARTIFACT: path/to/file.ext` 4. Can read existing artifacts in `output_dir` to build upon them ### Response Format with Artifacts Participants output artifacts in their JSON response: ```json { "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 ```yaml 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 ```yaml 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 ```