Files
Claude-Code-Workflow/.claude/skills/skill-tuning/phases/orchestrator.md
catlog22 24dad8cefd Refactor orchestrator logic and enhance problem taxonomy
- Updated orchestrator decision logic to improve state management and action selection.
- Introduced structured termination checks and action selection criteria.
- Enhanced state update mechanism with sliding window for action history and error tracking.
- Revised problem taxonomy for skill execution issues, consolidating categories and refining detection patterns.
- Improved severity calculation method for issue prioritization.
- Streamlined fix mapping strategies for better clarity and usability.
2026-01-28 21:08:49 +08:00

5.6 KiB

Orchestrator

State-driven orchestrator for autonomous skill-tuning workflow.

Role

Read state → Select action → Execute → Update → Repeat until termination.

Decision Logic

Termination Checks (priority order)

Condition Action
status === 'user_exit' null (exit)
status === 'completed' null (exit)
error_count >= max_errors action-abort
iteration_count >= max_iterations action-complete
quality_gate === 'pass' action-complete

Action Selection

Priority Condition Action
1 status === 'pending' action-init
2 Init done, req analysis missing action-analyze-requirements
3 Req needs clarification null (wait)
4 Req coverage unsatisfied action-gemini-analysis
5 Gemini requested/critical issues action-gemini-analysis
6 Gemini running null (wait)
7 Diagnosis pending (in order) action-diagnose-{type}
8 All diagnosis done, no report action-generate-report
9 Report done, issues exist action-propose-fixes
10 Pending fixes exist action-apply-fix
11 Fixes need verification action-verify
12 New iteration needed action-diagnose-context (restart)
13 Default action-complete

Diagnosis Order: context → memory → dataflow → agent → docs → token_consumption

Gemini Triggers:

  • gemini_analysis_requested === true
  • Critical issues detected
  • Focus areas include: architecture, prompt, performance, custom
  • Second iteration with unresolved issues

State Management

// Read
const state = JSON.parse(Read(`${workDir}/state.json`));

// Update (with sliding window for history)
function updateState(workDir, updates) {
  const state = JSON.parse(Read(`${workDir}/state.json`));
  const newState = {
    ...state,
    ...updates,
    updated_at: new Date().toISOString()
  };
  Write(`${workDir}/state.json`, JSON.stringify(newState, null, 2));
  return newState;
}

Execution Loop

async function runOrchestrator(workDir) {
  let iteration = 0;
  const MAX_LOOP = 50;

  while (iteration++ < MAX_LOOP) {
    // 1. Read state
    const state = JSON.parse(Read(`${workDir}/state.json`));

    // 2. Select action
    const actionId = selectNextAction(state);
    if (!actionId) break;

    // 3. Update: mark current action (sliding window)
    updateState(workDir, {
      current_action: actionId,
      action_history: [...state.action_history, {
        action: actionId,
        started_at: new Date().toISOString()
      }].slice(-10)  // Keep last 10
    });

    // 4. Execute action
    try {
      const actionPrompt = Read(`phases/actions/${actionId}.md`);

      // Pass state path + key fields (not full state)
      const stateKeyInfo = {
        status: state.status,
        iteration_count: state.iteration_count,
        quality_gate: state.quality_gate,
        target_skill: { name: state.target_skill.name, path: state.target_skill.path }
      };

      const result = await Task({
        subagent_type: 'universal-executor',
        run_in_background: false,
        prompt: `
[CONTEXT]
Action: ${actionId}
Work directory: ${workDir}

[STATE KEY INFO]
${JSON.stringify(stateKeyInfo, null, 2)}

[FULL STATE PATH]
${workDir}/state.json
(Read full state from this file if needed)

[ACTION INSTRUCTIONS]
${actionPrompt}

[OUTPUT]
Return JSON: { stateUpdates: {}, outputFiles: [], summary: "..." }
`
      });

      // 5. Parse result
      let actionResult = result;
      try { actionResult = JSON.parse(result); } catch {}

      // 6. Update: mark complete
      updateState(workDir, {
        current_action: null,
        completed_actions: [...state.completed_actions, actionId],
        ...actionResult.stateUpdates
      });

    } catch (error) {
      // Error handling (sliding window for errors)
      updateState(workDir, {
        current_action: null,
        errors: [...state.errors, {
          action: actionId,
          message: error.message,
          timestamp: new Date().toISOString()
        }].slice(-5),  // Keep last 5
        error_count: state.error_count + 1
      });
    }
  }
}

Action Preconditions

Action Precondition
action-init status='pending'
action-analyze-requirements Init complete, not done
action-diagnose-* status='running', focus area includes type
action-gemini-analysis Requested OR critical issues OR high complexity
action-generate-report All diagnosis complete
action-propose-fixes Report generated, issues > 0
action-apply-fix pending_fixes > 0
action-verify applied_fixes with pending verification
action-complete Quality gates pass OR max iterations
action-abort error_count >= max_errors

User Interaction Points

  1. action-init: Confirm target skill, describe issue
  2. action-propose-fixes: Select which fixes to apply
  3. action-verify: Review verification, decide to continue or stop
  4. action-complete: Review final summary

Error Recovery

Error Type Strategy
Action execution failed Retry up to 3 times, then skip
State parse error Restore from backup
File write error Retry with alternative path
User abort Save state and exit gracefully

Termination Conditions

  • Normal: status === 'completed', quality_gate === 'pass'
  • User: status === 'user_exit'
  • Error: status === 'failed', error_count >= max_errors
  • Iteration limit: iteration_count >= max_iterations
  • Clarification wait: requirement_analysis.status === 'needs_clarification' (pause, not terminate)