e476d2de0e
Extend actor YAML schema to support hierarchical graphs with explicit node types (agent, tool, conditional, subgraph), per-node LSP bindings (lsp_binding with server, languages, auto, capabilities), and tool-source references (skills, mcp_servers, agent_skills). Add schema validation for namespaced actor references, duplicate node IDs, edge target existence, and graph reachability — all nodes must be reachable from entry_node via explicit edges or conditional node routing targets. Update loader to report YAML parse errors with precise line/column positions and schema validation errors with dotted field paths and remediation hints pointing to docs/reference/actor_config.md. Add docs/reference/actor_config.md as the practical configuration reference covering hierarchical graph examples, node type table, topology rules, and common error cases with fix guidance. Refresh examples/actors/graph_workflow.yaml to replace deprecated actor_path with actor_ref. Add benchmarks/actor_yaml_bench.py for schema load overhead. Tests: 95 Behave scenarios, 10 Robot smoke tests (including hierarchical loader smoke test), security scan clean, coverage 99% (threshold 97%). ISSUES CLOSED: #157
215 lines
5.7 KiB
YAML
215 lines
5.7 KiB
YAML
# Graph Actor - Test-Driven Development Workflow
|
|
# Demonstrates a multi-node graph with conditional routing and subgraphs
|
|
|
|
name: workflows/test_driven_dev
|
|
type: graph
|
|
description: Test-driven development workflow with automated testing and feedback loops
|
|
version: "1.0"
|
|
|
|
# LLM model for agent nodes
|
|
model: gpt-4
|
|
|
|
# Graph topology
|
|
route:
|
|
# Define all nodes in the workflow
|
|
nodes:
|
|
# Entry point: planning agent
|
|
- id: planner
|
|
type: agent
|
|
name: Test Planner
|
|
description: Plans test cases based on requirements
|
|
config:
|
|
model: gpt-4
|
|
prompt: |
|
|
You are a test planning expert. Analyze the requirements and create
|
|
a comprehensive test plan covering:
|
|
- Unit tests for individual functions
|
|
- Integration tests for component interactions
|
|
- Edge cases and error conditions
|
|
tools:
|
|
- files/read_file
|
|
- files/list_directory
|
|
|
|
# Write tests first
|
|
- id: test_writer
|
|
type: agent
|
|
name: Test Writer
|
|
description: Writes test cases based on the plan
|
|
config:
|
|
model: gpt-4
|
|
prompt: |
|
|
You are a test writing expert. Write pytest tests based on the plan.
|
|
Follow best practices:
|
|
- Use descriptive test names
|
|
- Include docstrings
|
|
- Use fixtures appropriately
|
|
- Test one thing per test
|
|
tools:
|
|
- files/write_file
|
|
- files/read_file
|
|
|
|
# Run the tests (should fail initially)
|
|
- id: run_tests
|
|
type: tool
|
|
name: Test Runner
|
|
description: Executes pytest test suite
|
|
config:
|
|
tool_name: testing/run_pytest
|
|
parameters:
|
|
verbose: true
|
|
coverage: true
|
|
|
|
# Check test results
|
|
- id: check_results
|
|
type: conditional
|
|
name: Test Result Checker
|
|
description: Routes based on test pass/fail status
|
|
config:
|
|
conditions:
|
|
- check: "state.get('tests_passed') == True"
|
|
route_to: code_review
|
|
- check: "state.get('tests_passed') == False"
|
|
route_to: implementation_writer
|
|
|
|
# Write implementation to make tests pass
|
|
- id: implementation_writer
|
|
type: agent
|
|
name: Implementation Writer
|
|
description: Writes code to make the tests pass
|
|
config:
|
|
model: gpt-4
|
|
prompt: |
|
|
You are an implementation expert. Write clean, well-documented code
|
|
that makes the failing tests pass. Follow SOLID principles and
|
|
write maintainable code.
|
|
tools:
|
|
- files/write_file
|
|
- files/read_file
|
|
|
|
# Run tests again after implementation
|
|
- id: rerun_tests
|
|
type: tool
|
|
name: Test Rerunner
|
|
description: Re-executes tests after implementation
|
|
config:
|
|
tool_name: testing/run_pytest
|
|
parameters:
|
|
verbose: true
|
|
coverage: true
|
|
|
|
# Check if tests pass now
|
|
- id: verify_tests
|
|
type: conditional
|
|
name: Test Verification
|
|
description: Verify tests pass after implementation
|
|
config:
|
|
conditions:
|
|
- check: "state.get('tests_passed') == True"
|
|
route_to: code_review
|
|
- check: "state.get('tests_passed') == False and state.get('retry_count', 0) < 3"
|
|
route_to: debug_failures
|
|
- check: "state.get('tests_passed') == False and state.get('retry_count', 0) >= 3"
|
|
route_to: escalate
|
|
|
|
# Debug test failures
|
|
- id: debug_failures
|
|
type: agent
|
|
name: Debugger
|
|
description: Analyzes and fixes test failures
|
|
config:
|
|
model: gpt-4
|
|
prompt: |
|
|
You are a debugging expert. Analyze the test failures and fix the
|
|
implementation. Look for:
|
|
- Logic errors
|
|
- Edge cases
|
|
- Type mismatches
|
|
- Missing error handling
|
|
tools:
|
|
- files/read_file
|
|
- files/write_file
|
|
|
|
# Code review (subgraph)
|
|
- id: code_review
|
|
type: subgraph
|
|
name: Code Reviewer
|
|
description: Runs code review workflow
|
|
actor_ref: local/code-reviewer
|
|
|
|
# Escalate if tests keep failing
|
|
- id: escalate
|
|
type: tool
|
|
name: Escalation Handler
|
|
description: Escalates persistent failures to human
|
|
config:
|
|
tool_name: notifications/send_alert
|
|
parameters:
|
|
channel: engineering
|
|
priority: high
|
|
|
|
# Define edges (workflow transitions)
|
|
edges:
|
|
# Linear flow from planner to test writer
|
|
- from_node: planner
|
|
to_node: test_writer
|
|
|
|
# Run tests after writing them
|
|
- from_node: test_writer
|
|
to_node: run_tests
|
|
|
|
# Check results after running tests
|
|
- from_node: run_tests
|
|
to_node: check_results
|
|
|
|
# Conditional routing from check_results
|
|
# (handled by the conditional node itself)
|
|
|
|
# Write implementation if tests fail
|
|
- from_node: implementation_writer
|
|
to_node: rerun_tests
|
|
|
|
# Verify tests after rerunning
|
|
- from_node: rerun_tests
|
|
to_node: verify_tests
|
|
|
|
# Debug if tests still fail
|
|
- from_node: debug_failures
|
|
to_node: rerun_tests
|
|
|
|
# All paths eventually lead to code review or escalation
|
|
# (handled by conditional nodes)
|
|
|
|
# Entry and exit points
|
|
entry_node: planner
|
|
exit_nodes:
|
|
- code_review
|
|
- escalate
|
|
|
|
# Context settings
|
|
context_view: strategist
|
|
memory:
|
|
enabled: true
|
|
max_messages: 100
|
|
max_tokens: 16000
|
|
summarize_old: true
|
|
|
|
context:
|
|
include_files:
|
|
- "README.md"
|
|
- "requirements.txt"
|
|
- "pyproject.toml"
|
|
include_dirs:
|
|
- "src/"
|
|
- "tests/"
|
|
exclude_patterns:
|
|
- "**/__pycache__/**"
|
|
- "*.pyc"
|
|
- "**/.pytest_cache/**"
|
|
- "**/htmlcov/**"
|
|
max_context_tokens: 32000
|
|
|
|
# Environment variables
|
|
env_vars:
|
|
PYTEST_ARGS: --verbose --cov --cov-report=html
|
|
MAX_RETRIES: "3"
|