Refactor workflow directory structure to improve clarity and robustness by introducing dedicated sessions/ subdirectory for active sessions. ## Directory Structure Changes ### Before (Old Structure) ``` .workflow/ ├── .active-WFS-session-1 # Marker files (fragile) ├── WFS-session-1/ # Active sessions mixed with config ├── WFS-session-2/ ├── project.json └── .archives/ # Archived sessions ``` ### After (New Structure) ``` .workflow/ ├── project.json # Project metadata ├── sessions/ # [NEW] All active sessions │ └── WFS-session-1/ └── archives/ # Archived sessions (removed dot prefix) ``` ## Key Improvements 1. **Physical Isolation**: Active sessions now in dedicated sessions/ subdirectory 2. **No Marker Files**: Removed fragile .active-* marker file mechanism 3. **Directory-Based State**: Session state determined by directory location - In sessions/ = active - In archives/ = archived 4. **Simpler Discovery**: `ls .workflow/sessions/` instead of `find .workflow/ -name ".active-*"` 5. **Cleaner Root**: .workflow/ root now only contains project.json, sessions/, archives/ ## Path Transformations | Old Pattern | New Pattern | |-------------|-------------| | `find .workflow/ -name ".active-*"` | `find .workflow/sessions/ -name "WFS-*" -type d` | | `.workflow/WFS-[slug]/` | `.workflow/sessions/WFS-[slug]/` | | `.workflow/.archives/` | `.workflow/archives/` | | `touch .workflow/.active-*` | *Removed* | | `rm .workflow/.active-*` | *Removed* | ## Modified Commands ### session/start.md - Update session creation path to .workflow/sessions/WFS-*/ - Remove .active-* marker file creation - Update session discovery to use directory listing - Updated all 3 modes: Discovery, Auto, Force New ### session/complete.md - Update session move from sessions/ to archives/ - Remove .active-* marker file deletion - Update manifest path to archives/manifest.json - Update agent prompts with new paths ### status.md - Update session discovery to find .workflow/sessions/ - Update all session file path references - Update archive query examples ### execute.md - Update session discovery logic - Update all task file paths to include sessions/ prefix - Update context package paths - Update error handling documentation ## Benefits - **Robustness**: Eliminates marker file state inconsistency risk - **Clarity**: Clear separation between active and archived sessions - **Simplicity**: Session discovery is straightforward directory listing - **Alignment**: Closer to OpenSpec's three-layer structure (specs/changes/archive) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
25 KiB
name, description, argument-hint
| name | description | argument-hint |
|---|---|---|
| execute | Coordinate agent execution for workflow tasks with automatic session discovery, parallel task processing, and status tracking | [--resume-session="session-id"] |
Workflow Execute Command
Overview
Orchestrates autonomous workflow execution through systematic task discovery, agent coordination, and progress tracking. Executes entire workflow without user interruption (except initial session selection if multiple active sessions exist), providing complete context to agents and ensuring proper flow control execution with comprehensive TodoWrite tracking.
Resume Mode: When called with --resume-session flag, skips discovery phase and directly enters TodoWrite generation and agent execution for the specified session.
Performance Optimization Strategy
Lazy Loading: Task JSONs read on-demand during execution, not upfront. TODO_LIST.md + IMPL_PLAN.md provide metadata for planning.
| Metric | Before | After | Improvement |
|---|---|---|---|
| Initial Load | All task JSONs (~2,300 lines) | TODO_LIST.md only (~650 lines) | 72% reduction |
| Startup Time | Seconds | Milliseconds | ~90% faster |
| Memory | All tasks | 1-2 tasks | 90% less |
| Scalability | 10-20 tasks | 100+ tasks | 5-10x |
Loading Strategy:
- TODO_LIST.md: Read in Phase 2 (task metadata, status, dependencies)
- IMPL_PLAN.md: Read existence in Phase 2, parse execution strategy when needed
- Task JSONs: Complete lazy loading (read only during execution)
Core Rules
Complete entire workflow autonomously without user interruption, using TodoWrite for comprehensive progress tracking.
Execute all discovered pending tasks until workflow completion or blocking dependency.
Auto-complete session when all tasks finished: Call /workflow:session:complete upon workflow completion.
Core Responsibilities
- Session Discovery: Identify and select active workflow sessions
- Execution Strategy Parsing: Extract execution model from IMPL_PLAN.md
- TodoWrite Progress Tracking: Maintain real-time execution status throughout entire workflow
- Agent Orchestration: Coordinate specialized agents with complete context
- Status Synchronization: Update task JSON files and workflow state
- Autonomous Completion: Continue execution until all tasks complete or reach blocking state
- Session Auto-Complete: Call
/workflow:session:completewhen all workflow tasks finished
Execution Philosophy
- IMPL_PLAN-driven: Follow execution strategy from IMPL_PLAN.md Section 4
- Discovery-first: Auto-discover existing plans and tasks
- Status-aware: Execute only ready tasks with resolved dependencies
- Context-rich: Provide complete task JSON and accumulated context to agents
- Progress tracking: Continuous TodoWrite updates throughout entire workflow execution
- Autonomous completion: Execute all tasks without user interruption until workflow complete
Execution Lifecycle
Phase 1: Discovery
Applies to: Normal mode only (skipped in resume mode)
Process:
- Check Active Sessions: Find sessions in
.workflow/sessions/directory - Select Session: If multiple found, prompt user selection
- Load Session Metadata: Read
workflow-session.jsonONLY (minimal context) - DO NOT read task JSONs yet - defer until execution phase
Resume Mode: This phase is completely skipped when --resume-session="session-id" flag is provided.
Phase 2: Planning Document Analysis
Applies to: Normal mode only (skipped in resume mode)
Optimized to avoid reading all task JSONs upfront
Process:
- Read IMPL_PLAN.md: Check existence, understand overall strategy
- Read TODO_LIST.md: Get current task statuses and execution progress
- Extract Task Metadata: Parse task IDs, titles, and dependency relationships from TODO_LIST.md
- Build Execution Queue: Determine ready tasks based on TODO_LIST.md status and dependencies
Key Optimization: Use IMPL_PLAN.md (existence check only) and TODO_LIST.md as primary sources instead of reading all task JSONs
Resume Mode: This phase is skipped when --resume-session flag is provided (session already known).
Phase 3: TodoWrite Generation
Applies to: Both normal and resume modes (resume mode entry point)
Process:
- Create TodoWrite List: Generate task list from TODO_LIST.md (not from task JSONs)
- Parse TODO_LIST.md to extract all tasks with current statuses
- Identify first pending task with met dependencies
- Generate comprehensive TodoWrite covering entire workflow
- Mark Initial Status: Set first ready task(s) as
in_progressin TodoWrite- Sequential execution: Mark ONE task as
in_progress - Parallel batch: Mark ALL tasks in current batch as
in_progress
- Sequential execution: Mark ONE task as
- Prepare Session Context: Inject workflow paths for agent use (using provided session-id)
- Validate Prerequisites: Ensure IMPL_PLAN.md and TODO_LIST.md exist and are valid
Resume Mode Behavior:
- Load existing TODO_LIST.md directly from
.workflow/{session-id}/ - Extract current progress from TODO_LIST.md
- Generate TodoWrite from TODO_LIST.md state
- Proceed immediately to agent execution (Phase 4)
Phase 4: Execution Strategy Selection & Task Execution
Applies to: Both normal and resume modes
Step 4A: Parse Execution Strategy from IMPL_PLAN.md
Read IMPL_PLAN.md Section 4 to extract:
- Execution Model: Sequential | Parallel | Phased | TDD Cycles
- Parallelization Opportunities: Which tasks can run in parallel
- Serialization Requirements: Which tasks must run sequentially
- Critical Path: Priority execution order
If IMPL_PLAN.md lacks execution strategy, use intelligent fallback (analyze task structure).
Step 4B: Execute Tasks with Lazy Loading
Key Optimization: Read task JSON only when needed for execution
Execution Loop Pattern:
while (TODO_LIST.md has pending tasks) {
next_task_id = getTodoWriteInProgressTask()
task_json = Read(.workflow/{session}/.task/{next_task_id}.json) // Lazy load
executeTaskWithAgent(task_json)
updateTodoListMarkCompleted(next_task_id)
advanceTodoWriteToNextTask()
}
Execution Process per Task:
- Identify Next Task: From TodoWrite, get the next
in_progresstask ID - Load Task JSON on Demand: Read
.task/{task-id}.jsonfor current task ONLY - Validate Task Structure: Ensure all 5 required fields exist (id, title, status, meta, context, flow_control)
- Launch Agent: Invoke specialized agent with complete context including flow control steps
- Monitor Progress: Track agent execution and handle errors without user interruption
- Collect Results: Gather implementation results and outputs
- Update TODO_LIST.md: Mark current task as completed in TODO_LIST.md
- Continue Workflow: Identify next pending task from TODO_LIST.md and repeat
Benefits:
- Reduces initial context loading by ~90%
- Only reads task JSON when actually executing
- Scales better for workflows with many tasks
- Faster startup time for workflow execution
Phase 5: Completion
Applies to: Both normal and resume modes
Process:
- Update Task Status: Mark completed tasks in JSON files
- Generate Summary: Create task summary in
.summaries/ - Update TodoWrite: Mark current task complete, advance to next
- Synchronize State: Update session state and workflow status
- Check Workflow Complete: Verify all tasks are completed
- Auto-Complete Session: Call
/workflow:session:completewhen all tasks finished
Execution Strategy (IMPL_PLAN-Driven)
Strategy Priority
IMPL_PLAN-Driven Execution (Recommended):
- Read IMPL_PLAN.md execution strategy (Section 4: Implementation Strategy)
- Follow explicit guidance:
- Execution Model (Sequential/Parallel/Phased/TDD)
- Parallelization Opportunities (which tasks can run in parallel)
- Serialization Requirements (which tasks must run sequentially)
- Critical Path (priority execution order)
- Use TODO_LIST.md for status tracking only
- IMPL_PLAN decides "HOW", execute.md implements it
Intelligent Fallback (When IMPL_PLAN lacks execution details):
- Analyze task structure:
- Check
meta.execution_groupin task JSONs - Analyze
depends_onrelationships - Understand task complexity and risk
- Check
- Apply smart defaults:
- No dependencies + same execution_group → Parallel
- Has dependencies → Sequential (wait for deps)
- Critical/high-risk tasks → Sequential
- Conservative approach: When uncertain, prefer sequential execution
Execution Models
1. Sequential Execution
When: IMPL_PLAN specifies "Sequential" OR no clear parallelization guidance
Pattern: Execute tasks one by one in TODO_LIST order
TodoWrite: ONE task marked as in_progress at a time
2. Parallel Execution
When: IMPL_PLAN specifies "Parallel" with clear parallelization opportunities
Pattern: Execute independent task groups concurrently
TodoWrite: MULTIPLE tasks (in same batch) marked as in_progress simultaneously
3. Phased Execution
When: IMPL_PLAN specifies "Phased" with phase breakdown Pattern: Execute tasks in phases, respect phase boundaries TodoWrite: Within each phase, follow Sequential or Parallel rules
4. Intelligent Fallback
When: IMPL_PLAN lacks execution strategy details Pattern: Analyze task structure and apply smart defaults TodoWrite: Follow Sequential or Parallel rules based on analysis
Task Status Logic
pending + dependencies_met → executable
completed → skip
blocked → skip until dependencies clear
TodoWrite Coordination
TodoWrite Rules (Unified)
Rule 1: Initial Creation
- Normal Mode: Generate TodoWrite from discovered pending tasks for entire workflow
- Resume Mode: Generate from existing session state and current progress
Rule 2: In-Progress Task Count (Execution-Model-Dependent)
- Sequential execution: Mark ONLY ONE task as
in_progressat a time - Parallel batch execution: Mark ALL tasks in current batch as
in_progresssimultaneously - Execution group indicator: Show
[execution_group: group-id]for parallel tasks
Rule 3: Status Updates
- Immediate Updates: Update status after each task/batch completion without user interruption
- Status Synchronization: Sync with JSON task files after updates
- Continuous Tracking: Maintain TodoWrite throughout entire workflow execution until completion
Rule 4: Workflow Completion Check
- When all tasks marked
completed, auto-call/workflow:session:complete
TodoWrite Tool Usage
Example 1: Sequential Execution
TodoWrite({
todos: [
{
content: "Execute IMPL-1.1: Design auth schema [code-developer] [FLOW_CONTROL]",
status: "in_progress", // ONE task in progress
activeForm: "Executing IMPL-1.1: Design auth schema"
},
{
content: "Execute IMPL-1.2: Implement auth logic [code-developer] [FLOW_CONTROL]",
status: "pending",
activeForm: "Executing IMPL-1.2: Implement auth logic"
}
]
});
Example 2: Parallel Batch Execution
TodoWrite({
todos: [
{
content: "Execute IMPL-1.1: Build Auth API [code-developer] [execution_group: parallel-auth-api]",
status: "in_progress", // Batch task 1
activeForm: "Executing IMPL-1.1: Build Auth API"
},
{
content: "Execute IMPL-1.2: Build User UI [code-developer] [execution_group: parallel-ui-comp]",
status: "in_progress", // Batch task 2 (running concurrently)
activeForm: "Executing IMPL-1.2: Build User UI"
},
{
content: "Execute IMPL-1.3: Setup Database [code-developer] [execution_group: parallel-db-schema]",
status: "in_progress", // Batch task 3 (running concurrently)
activeForm: "Executing IMPL-1.3: Setup Database"
},
{
content: "Execute IMPL-2.1: Integration Tests [test-fix-agent] [depends_on: IMPL-1.1, IMPL-1.2, IMPL-1.3]",
status: "pending", // Next batch (waits for current batch completion)
activeForm: "Executing IMPL-2.1: Integration Tests"
}
]
});
TODO_LIST.md Update Timing
Single source of truth for task status - enables lazy loading by providing task metadata without reading JSONs
- Before Agent Launch: Mark task as
in_progress - After Task Complete: Mark as
completed, advance to next - On Error: Keep as
in_progress, add error note - Workflow Complete: Call
/workflow:session:complete
Agent Context Management
Context Sources (Priority Order)
- Complete Task JSON: Full task definition including all fields and artifacts
- Artifacts Context: Brainstorming outputs and role analyses from task.context.artifacts
- Flow Control Context: Accumulated outputs from pre_analysis steps (including artifact loading)
- Dependency Summaries: Previous task completion summaries
- Session Context: Workflow paths and session metadata
- Inherited Context: Parent task context and shared variables
Context Assembly Process
1. Load Task JSON → Base context (including artifacts array)
2. Load Artifacts → Synthesis specifications and brainstorming outputs
3. Execute Flow Control → Accumulated context (with artifact loading steps)
4. Load Dependencies → Dependency context
5. Prepare Session Paths → Session context
6. Combine All → Complete agent context with artifact integration
Agent Context Package Structure
{
"task": { /* Complete task JSON with artifacts array */ },
"artifacts": {
"synthesis_specification": { "path": "{{from context-package.json → brainstorm_artifacts.synthesis_output.path}}", "priority": "highest" },
"guidance_specification": { "path": "{{from context-package.json → brainstorm_artifacts.guidance_specification.path}}", "priority": "medium" },
"role_analyses": [ /* From context-package.json → brainstorm_artifacts.role_analyses[] */ ],
"conflict_resolution": { "path": "{{from context-package.json → brainstorm_artifacts.conflict_resolution.path}}", "conditional": true }
},
"flow_context": {
"step_outputs": {
"synthesis_specification": "...",
"individual_artifacts": "...",
"pattern_analysis": "...",
"dependency_context": "..."
}
},
"session": {
"workflow_dir": ".workflow/sessions/WFS-session/",
"context_package_path": ".workflow/sessions/WFS-session/.process/context-package.json",
"todo_list_path": ".workflow/sessions/WFS-session/TODO_LIST.md",
"summaries_dir": ".workflow/sessions/WFS-session/.summaries/",
"task_json_path": ".workflow/sessions/WFS-session/.task/IMPL-1.1.json"
},
"dependencies": [ /* Task summaries from depends_on */ ],
"inherited": { /* Parent task context */ }
}
Context Validation Rules
- Task JSON Complete: All 5 fields present and valid, including artifacts array in context
- Artifacts Available: All artifacts loaded from context-package.json
- Flow Control Ready: All pre_analysis steps completed including artifact loading steps
- Dependencies Loaded: All depends_on summaries available
- Session Paths Valid: All workflow paths exist and accessible (verified via context-package.json)
- Agent Assignment: Valid agent type specified in meta.agent
Agent Execution Pattern
Flow Control Execution
[FLOW_CONTROL] marker indicates task JSON contains flow_control.pre_analysis steps for context preparation.
Orchestrator Responsibility:
- Pass complete task JSON to agent (including
flow_controlblock) - Provide session paths for artifact access
- Monitor agent completion
Agent Responsibility:
- Parse
flow_control.pre_analysisarray from JSON - Execute steps sequentially with variable substitution
- Accumulate context from artifacts and dependencies
- Follow error handling per
step.on_error - Complete implementation using accumulated context
Orchestrator does NOT execute flow control steps - Agent interprets and executes them from JSON.
Agent Prompt Template
Task(subagent_type="{meta.agent}",
prompt="**EXECUTE TASK FROM JSON**
## Task JSON Location
{session.task_json_path}
## Instructions
1. **Load Complete Task JSON**: Read and validate all fields (id, title, status, meta, context, flow_control)
2. **Execute Flow Control**: If `flow_control.pre_analysis` exists, execute steps sequentially:
- Load artifacts (role analysis documents, role analyses) using commands in each step
- Accumulate context from step outputs using variable substitution [variable_name]
- Handle errors per step.on_error (skip_optional | fail | retry_once)
3. **Implement Solution**: Follow `flow_control.implementation_approach` using accumulated context
4. **Complete Task**:
- Update task status: `jq '.status = \"completed\"' {session.task_json_path} > temp.json && mv temp.json {session.task_json_path}`
- Update TODO_LIST.md: Mark task as [x] completed in {session.todo_list_path}
- Generate summary: {session.summaries_dir}/{task.id}-summary.md
- Check workflow completion and call `/workflow:session:complete` if all tasks done
## Context Sources (All from JSON)
- Requirements: `context.requirements`
- Focus Paths: `context.focus_paths`
- Acceptance: `context.acceptance`
- Artifacts: `context.artifacts` (synthesis specs, brainstorming outputs)
- Dependencies: `context.depends_on`
- Target Files: `flow_control.target_files`
## Session Paths
- Workflow Dir: {session.workflow_dir}
- TODO List: {session.todo_list_path}
- Summaries: {session.summaries_dir}
- Flow Context: {flow_context.step_outputs}
**Complete JSON structure is authoritative - load and follow it exactly.**"),
description="Execute task: {task.id}")
Agent JSON Loading Specification
MANDATORY AGENT PROTOCOL: All agents must follow this exact loading sequence:
- JSON Loading: First action must be
cat {session.task_json_path} - Field Validation: Verify all 5 required fields exist:
id,title,status,meta,context,flow_control - Structure Parsing: Parse nested fields correctly:
meta.typeandmeta.agent(NOT flattask_type)context.requirements,context.focus_paths,context.acceptancecontext.depends_on,context.inheritedflow_control.pre_analysisarray,flow_control.target_files
- Flow Control Execution: If
flow_control.pre_analysisexists, execute steps sequentially - Status Management: Update JSON status upon completion
JSON Field Reference:
{
"id": "IMPL-1.2",
"title": "Task title",
"status": "pending|active|completed|blocked",
"meta": {
"type": "feature|bugfix|refactor|test-gen|test-fix|docs",
"agent": "@code-developer|@test-fix-agent|@universal-executor"
},
"context": {
"requirements": ["req1", "req2"],
"focus_paths": ["src/path1", "src/path2"],
"acceptance": ["criteria1", "criteria2"],
"depends_on": ["IMPL-1.1"],
"inherited": { "from": "parent", "context": ["info"] },
"artifacts": [
{
"type": "synthesis_specification",
"source": "context-package.json → brainstorm_artifacts.synthesis_output",
"path": "{{loaded dynamically from context-package.json}}",
"priority": "highest",
"contains": "complete_integrated_specification"
},
{
"type": "individual_role_analysis",
"source": "context-package.json → brainstorm_artifacts.role_analyses[]",
"path": "{{loaded dynamically from context-package.json}}",
"note": "Supports analysis*.md pattern (analysis.md, analysis-01.md, analysis-api.md, etc.)",
"priority": "low",
"contains": "role_specific_analysis_fallback"
}
]
},
"flow_control": {
"pre_analysis": [
{
"step": "load_synthesis_specification",
"action": "Load synthesis specification from context-package.json",
"commands": [
"Read(.workflow/sessions/WFS-[session]/.process/context-package.json)",
"Extract(brainstorm_artifacts.synthesis_output.path)",
"Read(extracted path)"
],
"output_to": "synthesis_specification",
"on_error": "skip_optional"
},
{
"step": "step_name",
"command": "bash_command",
"output_to": "variable",
"on_error": "skip_optional|fail|retry_once"
}
],
"implementation_approach": [
{
"step": 1,
"title": "Implement task following role analyses",
"description": "Implement '[title]' following role analyses. PRIORITY: Use role analysis documents as primary requirement source. When implementation needs technical details (e.g., API schemas, caching configs, design tokens), refer to artifacts[] for detailed specifications from original role analyses.",
"modification_points": [
"Apply consolidated requirements from role analysis documents",
"Follow technical guidelines from synthesis",
"Consult artifacts for implementation details when needed",
"Integrate with existing patterns"
],
"logic_flow": [
"Load role analyses",
"Parse architecture and requirements",
"Implement following specification",
"Consult artifacts for technical details when needed",
"Validate against acceptance criteria"
],
"depends_on": [],
"output": "implementation"
}
],
"target_files": ["file:function:lines", "path/to/NewFile.ts"]
}
}
Execution Flow
- Load Task JSON: Agent reads and validates complete JSON structure
- Execute Flow Control: Agent runs pre_analysis steps if present
- Prepare Implementation: Agent uses implementation_approach from JSON
- Launch Implementation: Agent follows focus_paths and target_files
- Update Status: Agent marks JSON status as completed
- Generate Summary: Agent creates completion summary
Agent Assignment Rules
meta.agent specified → Use specified agent
meta.agent missing → Infer from meta.type:
- "feature" → @code-developer
- "test-gen" → @code-developer
- "test-fix" → @test-fix-agent
- "review" → @universal-executor
- "docs" → @doc-generator
Workflow File Structure Reference
.workflow/sessions/WFS-[topic-slug]/
├── workflow-session.json # Session state and metadata
├── IMPL_PLAN.md # Planning document and requirements
├── TODO_LIST.md # Progress tracking (auto-updated)
├── .task/ # Task definitions (JSON only)
│ ├── IMPL-1.json # Main task definitions
│ └── IMPL-1.1.json # Subtask definitions
├── .summaries/ # Task completion summaries
│ ├── IMPL-1-summary.md # Task completion details
│ └── IMPL-1.1-summary.md # Subtask completion details
└── .process/ # Planning artifacts
├── context-package.json # Smart context package
└── ANALYSIS_RESULTS.md # Planning analysis results
Error Handling & Recovery
Common Errors & Recovery
| Error Type | Cause | Recovery Strategy | Max Attempts |
|---|---|---|---|
| Discovery Errors | |||
| No active session | No sessions in .workflow/sessions/ |
Create or resume session: /workflow:plan "project" |
N/A |
| Multiple sessions | Multiple sessions in .workflow/sessions/ |
Prompt user selection | N/A |
| Corrupted session | Invalid JSON files | Recreate session structure or validate files | N/A |
| Execution Errors | |||
| Agent failure | Agent crash/timeout | Retry with simplified context | 2 |
| Flow control error | Command failure | Skip optional, fail critical | 1 per step |
| Context loading error | Missing dependencies | Reload from JSON, use defaults | 3 |
| JSON file corruption | File system issues | Restore from backup/recreate | 1 |
Error Prevention
- Pre-flight Checks: Validate session integrity before execution
- Backup Strategy: Create task snapshots before major operations
- Atomic Updates: Update JSON files atomically to prevent corruption
- Dependency Validation: Check all depends_on references exist
- Context Verification: Ensure all required context is available
Recovery Procedures
Session Recovery:
# Check session integrity
find .workflow/sessions/ -name "WFS-*" -type d | while read session_dir; do
session=$(basename "$session_dir")
[ ! -f "$session_dir/workflow-session.json" ] && \
echo '{"session_id":"'$session'","status":"active"}' > "$session_dir/workflow-session.json"
done
Task Recovery:
# Validate task JSON integrity
for task_file in .workflow/sessions/$session/.task/*.json; do
jq empty "$task_file" 2>/dev/null || echo "Corrupted: $task_file"
done
# Fix missing dependencies
missing_deps=$(jq -r '.context.depends_on[]?' .workflow/sessions/$session/.task/*.json | sort -u)
for dep in $missing_deps; do
[ ! -f ".workflow/sessions/$session/.task/$dep.json" ] && echo "Missing dependency: $dep"
done