aiwg
Version:
Deployment tool and support utility for AI context. Copies agents, skills, commands, rules, and behaviors into the paths each AI platform reads (Claude Code, Codex, Copilot, Cursor, Warp, OpenClaw, and 6 more) so one source of truth works across 10 platfo
492 lines (453 loc) • 12.9 kB
YAML
# Ralph Tree Search Expansion Schema
# Based on REF-020 Tree-of-Thoughts and REF-024 LATS
# Issue: #165
$schema: "https://json-schema.org/draft/2020-12/schema"
$id: "https://aiwg.io/schemas/ralph-tree-search/v1"
title: "Ralph Tree Search Expansion Schema"
description: |
Schema for tree search expansion on failures, implementing Tree-of-Thoughts
and LATS (Language Agent Tree Search) for systematic solution exploration.
type: object
required:
- version
- tree_config
- expansion_rules
properties:
version:
type: string
pattern: "^\\d+\\.\\d+\\.\\d+$"
default: "1.0.0"
tree_config:
$ref: "#/$defs/TreeConfig"
expansion_rules:
$ref: "#/$defs/ExpansionRules"
search_strategies:
$ref: "#/$defs/SearchStrategies"
failure_recovery:
$ref: "#/$defs/FailureRecovery"
$defs:
TreeConfig:
type: object
description: "Configuration for tree search structure"
properties:
enabled:
type: boolean
default: false
description: "Tree search disabled by default (use linear for simple tasks)"
max_depth:
type: integer
default: 5
minimum: 2
maximum: 10
description: "Maximum tree depth"
max_branches:
type: integer
default: 3
minimum: 2
maximum: 5
description: "Maximum branches per node"
max_total_nodes:
type: integer
default: 50
description: "Hard limit on total nodes explored"
node_timeout_ms:
type: integer
default: 60000
description: "Timeout for evaluating single node"
pruning:
type: object
properties:
enabled:
type: boolean
default: true
score_threshold:
type: number
default: 0.3
description: "Prune branches scoring below this"
consecutive_failures:
type: integer
default: 2
description: "Prune after N consecutive failures in branch"
ExpansionRules:
type: object
description: "Rules for when to expand search tree"
properties:
trigger_conditions:
type: array
description: "Conditions that trigger tree expansion"
items:
type: object
properties:
condition:
type: string
enum:
- linear_approach_failed
- quality_below_threshold
- consecutive_failures
- timeout_approaching
- complex_task_detected
threshold:
type: number
action:
type: string
enum:
- expand_alternatives
- increase_branch_factor
- backtrack_to_checkpoint
- switch_strategy
default:
- condition: linear_approach_failed
threshold: 2
action: expand_alternatives
- condition: quality_below_threshold
threshold: 0.5
action: expand_alternatives
- condition: consecutive_failures
threshold: 3
action: backtrack_to_checkpoint
branch_generation:
type: object
properties:
method:
type: string
enum:
- propose_alternatives
- decompose_problem
- vary_parameters
- combine_approaches
default: propose_alternatives
alternative_prompts:
type: array
items:
type: string
default:
- "What are 3 alternative approaches to solve this?"
- "How could this be solved differently?"
- "What if we tried the opposite approach?"
SearchStrategies:
type: object
description: "Available search strategies"
properties:
default_strategy:
type: string
enum:
- breadth_first
- depth_first
- best_first
- monte_carlo
default: best_first
strategies:
type: object
properties:
breadth_first:
type: object
properties:
description:
type: string
default: "Explore all branches at each level before going deeper"
best_for:
type: array
items:
type: string
default:
- "Well-defined problems"
- "When optimal solution needed"
- "Shallow solution space"
depth_first:
type: object
properties:
description:
type: string
default: "Follow one branch deeply before backtracking"
best_for:
type: array
items:
type: string
default:
- "When any solution is acceptable"
- "Deep solution space"
- "Memory-constrained scenarios"
best_first:
type: object
properties:
description:
type: string
default: "Always expand the most promising node"
best_for:
type: array
items:
type: string
default:
- "Most tasks (default)"
- "When good heuristic available"
- "Time-constrained scenarios"
scoring_function:
type: string
default: "quality_score * 0.6 + progress_score * 0.4"
monte_carlo:
type: object
properties:
description:
type: string
default: "Random sampling with UCB selection (LATS approach)"
best_for:
type: array
items:
type: string
default:
- "Very large solution spaces"
- "When evaluation is cheap"
- "Exploration-heavy problems"
exploration_constant:
type: number
default: 1.41
description: "UCB exploration constant (sqrt(2))"
FailureRecovery:
type: object
description: "Recovery strategies for tree search failures"
properties:
on_branch_failure:
type: object
properties:
actions:
type: array
items:
type: string
default:
- log_failure_reason
- update_branch_score
- check_sibling_branches
- backtrack_if_all_failed
learning:
type: object
properties:
enabled:
type: boolean
default: true
store_failure_pattern:
type: boolean
default: true
adjust_heuristics:
type: boolean
default: true
on_tree_exhaustion:
type: object
properties:
description:
type: string
default: "All branches exhausted without success"
actions:
type: array
items:
type: string
default:
- select_best_partial_solution
- request_human_guidance
- expand_search_parameters
- report_failure_analysis
checkpoint_restoration:
type: object
properties:
enabled:
type: boolean
default: true
checkpoint_frequency:
type: integer
default: 3
description: "Save checkpoint every N successful nodes"
restore_on:
type: array
items:
type: string
default:
- branch_exhausted
- quality_regression
- invalid_state_detected
# Tree node schema
tree_node:
type: object
required:
- node_id
- parent_id
- depth
- state
properties:
node_id:
type: string
format: uuid
parent_id:
type: string
description: "null for root node"
depth:
type: integer
state:
type: object
description: "Agent state at this node"
action_taken:
type: string
description: "Action that led to this node"
observation:
type: string
description: "Result of action"
quality_score:
type: number
minimum: 0
maximum: 1
visits:
type: integer
description: "Times this node was visited (for MCTS)"
children:
type: array
items:
type: string
description: "Child node IDs"
status:
type: string
enum:
- active
- expanded
- pruned
- terminal_success
- terminal_failure
created_at:
type: string
format: date-time
metadata:
type: object
properties:
iteration:
type: integer
approach:
type: string
failure_reason:
type: string
# Search tree schema
search_tree:
type: object
required:
- tree_id
- task
- root_node
properties:
tree_id:
type: string
format: uuid
task:
type: string
strategy:
type: string
root_node:
type: string
description: "Root node ID"
nodes:
type: object
additionalProperties:
$ref: "#/$defs/TreeNode"
current_node:
type: string
best_node:
type: string
statistics:
type: object
properties:
total_nodes:
type: integer
max_depth_reached:
type: integer
branches_pruned:
type: integer
successful_paths:
type: integer
failed_paths:
type: integer
created_at:
type: string
format: date-time
completed_at:
type: string
format: date-time
# Agent protocol
agent_protocol:
initialize_tree:
description: "Create search tree for complex task"
triggers:
- complex_task_detected
- linear_approach_failed
steps:
- create_root_node
- generate_initial_branches
- select_first_branch
- begin_exploration
expand_node:
description: "Generate child nodes for current node"
steps:
- evaluate_current_state
- if_terminal_return
- generate_alternatives
- score_alternatives
- create_child_nodes
- prune_low_scoring
- select_next_node
select_next_node:
description: "Choose next node to explore"
by_strategy:
breadth_first: "Select leftmost unvisited at shallowest depth"
depth_first: "Select leftmost unvisited child of current"
best_first: "Select highest scoring unvisited node"
monte_carlo: "Select by UCB formula: score + c*sqrt(ln(parent_visits)/visits)"
backtrack:
description: "Return to previous decision point"
steps:
- mark_current_branch_exhausted
- find_nearest_unexplored_sibling
- if_found_continue
- else_backtrack_to_parent
- if_at_root_tree_exhausted
tree_to_linear:
description: "Extract best path as linear solution"
steps:
- identify_best_terminal_node
- trace_path_to_root
- extract_action_sequence
- return_as_linear_plan
# CLI integration
cli_options:
tree_search_flag:
name: "--tree-search"
short: "-t"
type: boolean
default: false
help: "Enable tree search for complex tasks"
strategy_flag:
name: "--search-strategy"
type: string
choices: ["breadth_first", "depth_first", "best_first", "monte_carlo"]
default: "best_first"
help: "Search strategy to use"
max_branches_flag:
name: "--max-branches"
type: integer
default: 3
help: "Maximum branches per decision point"
# Performance targets (from REF-020, REF-024)
research_targets:
improvement_over_linear: "20-70% on complex tasks"
optimal_branching_factor: "2-5 depending on task"
best_first_efficiency: "70% fewer nodes than BFS"
mcts_exploration_benefit: "Better coverage of solution space"
# Storage
storage:
tree_path: ".aiwg/ralph/{loop_id}/tree/"
checkpoint_path: ".aiwg/ralph/{loop_id}/checkpoints/"
visualization_path: ".aiwg/reports/tree-search/"
# References
references:
research:
- "@.aiwg/research/findings/REF-020-tree-of-thoughts.md"
- "@.aiwg/research/findings/REF-024-lats.md"
implementation:
- "#165"
related:
- "@agentic/code/addons/ralph/schemas/iteration-analytics.yaml"
- "@agentic/code/addons/ralph/schemas/cross-task-memory.yaml"
- "@tools/ralph-external/"