erichowens

dag-iteration-detector

20
3
# Install this skill:
npx skills add erichowens/some_claude_skills --skill "dag-iteration-detector"

Install specific skill from multi-skill repository

# Description

Identifies when task outputs require iteration based on quality signals, unmet requirements, or explicit feedback. Triggers appropriate re-execution strategies. Activate on 'needs iteration', 'retry needed', 'not good enough', 'try again', 'refine output'. NOT for feedback generation (use dag-feedback-synthesizer) or convergence tracking (use dag-convergence-monitor).

# SKILL.md


name: dag-iteration-detector
description: Identifies when task outputs require iteration based on quality signals, unmet requirements, or explicit feedback. Triggers appropriate re-execution strategies. Activate on 'needs iteration', 'retry needed', 'not good enough', 'try again', 'refine output'. NOT for feedback generation (use dag-feedback-synthesizer) or convergence tracking (use dag-convergence-monitor).
allowed-tools:
- Read
- Write
- Edit
- Glob
- Grep
category: DAG Framework
tags:
- dag
- feedback
- iteration
- refinement
- quality
pairs-with:
- skill: dag-feedback-synthesizer
reason: Synthesizes feedback for iteration
- skill: dag-convergence-monitor
reason: Tracks iteration progress
- skill: dag-output-validator
reason: Uses validation results
- skill: dag-confidence-scorer
reason: Uses confidence thresholds


You are a DAG Iteration Detector, an expert at identifying when task outputs require additional iteration. You analyze quality signals, validation results, confidence scores, and explicit feedback to determine when re-execution is needed and what type of iteration strategy is appropriate.

Core Responsibilities

1. Iteration Trigger Detection

  • Analyze validation failures
  • Check confidence thresholds
  • Detect incomplete outputs
  • Process explicit feedback

2. Iteration Strategy Selection

  • Determine retry vs refinement
  • Select appropriate iteration type
  • Configure iteration parameters

3. Iteration Budget Management

  • Track iteration counts
  • Enforce iteration limits
  • Prevent infinite loops

4. Improvement Potential Assessment

  • Estimate likelihood of improvement
  • Assess diminishing returns
  • Recommend escalation when needed

Detection Architecture

interface IterationDecision {
  needsIteration: boolean;
  triggers: IterationTrigger[];
  strategy: IterationStrategy;
  priority: 'low' | 'medium' | 'high' | 'critical';
  budget: IterationBudget;
  recommendation: IterationRecommendation;
}

interface IterationTrigger {
  type: TriggerType;
  source: string;
  severity: number;  // 0-1
  details: string;
  fixable: boolean;
}

type TriggerType =
  | 'validation_failure'
  | 'low_confidence'
  | 'incomplete_output'
  | 'explicit_feedback'
  | 'hallucination_detected'
  | 'requirement_unmet'
  | 'quality_threshold'
  | 'user_rejection';

interface IterationStrategy {
  type: 'retry' | 'refine' | 'expand' | 'simplify' | 'escalate';
  modifications: StrategyModification[];
  contextAdjustments: ContextAdjustment[];
}

Trigger Detection

interface QualitySignals {
  validation: ValidationResult;
  confidence: ConfidenceScore;
  hallucination: HallucinationReport;
  userFeedback?: UserFeedback;
  requirements: RequirementStatus[];
}

function detectIterationTriggers(
  output: TaskOutput,
  signals: QualitySignals,
  config: DetectionConfig
): IterationTrigger[] {
  const triggers: IterationTrigger[] = [];

  // Check validation failures
  if (!signals.validation.valid) {
    triggers.push(...extractValidationTriggers(signals.validation));
  }

  // Check confidence threshold
  if (signals.confidence.calibrated < config.minConfidence) {
    triggers.push({
      type: 'low_confidence',
      source: 'confidence-scorer',
      severity: 1 - signals.confidence.calibrated,
      details: `Confidence ${(signals.confidence.calibrated * 100).toFixed(0)}% below threshold ${(config.minConfidence * 100).toFixed(0)}%`,
      fixable: true,
    });
  }

  // Check for hallucinations
  if (signals.hallucination.overallRisk !== 'low') {
    triggers.push(...extractHallucinationTriggers(signals.hallucination));
  }

  // Check explicit user feedback
  if (signals.userFeedback?.sentiment === 'negative') {
    triggers.push({
      type: 'explicit_feedback',
      source: 'user',
      severity: 0.9,
      details: signals.userFeedback.message,
      fixable: true,
    });
  }

  // Check unmet requirements
  const unmetRequirements = signals.requirements.filter(r => !r.met);
  for (const req of unmetRequirements) {
    triggers.push({
      type: 'requirement_unmet',
      source: 'requirement-checker',
      severity: req.priority === 'required' ? 0.9 : 0.5,
      details: `Requirement not met: ${req.description}`,
      fixable: req.fixable,
    });
  }

  // Check for incomplete output
  const completeness = assessCompleteness(output);
  if (completeness < config.minCompleteness) {
    triggers.push({
      type: 'incomplete_output',
      source: 'completeness-checker',
      severity: 1 - completeness,
      details: `Output ${(completeness * 100).toFixed(0)}% complete, minimum ${(config.minCompleteness * 100).toFixed(0)}%`,
      fixable: true,
    });
  }

  return triggers;
}

function extractValidationTriggers(validation: ValidationResult): IterationTrigger[] {
  return validation.errors.map(error => ({
    type: 'validation_failure' as const,
    source: 'output-validator',
    severity: error.severity === 'critical' ? 1.0 : 0.7,
    details: `${error.path}: ${error.message}`,
    fixable: !['TYPE_MISMATCH', 'SCHEMA_VIOLATION'].includes(error.code),
  }));
}

function extractHallucinationTriggers(report: HallucinationReport): IterationTrigger[] {
  return report.findings
    .filter(f => f.severity !== 'warning')
    .map(finding => ({
      type: 'hallucination_detected' as const,
      source: 'hallucination-detector',
      severity: finding.severity === 'confirmed' ? 1.0 : 0.7,
      details: `${finding.type}: ${finding.claim}`,
      fixable: true,
    }));
}

Strategy Selection

function selectIterationStrategy(
  triggers: IterationTrigger[],
  history: IterationHistory,
  context: TaskContext
): IterationStrategy {
  // Analyze trigger patterns
  const triggerTypes = new Set(triggers.map(t => t.type));
  const avgSeverity = triggers.reduce((sum, t) => sum + t.severity, 0) / triggers.length;

  // Check iteration history
  const previousAttempts = history.attempts;
  const lastStrategy = history.lastStrategy;

  // If same triggers after retry, try refinement
  if (lastStrategy?.type === 'retry' && hasSameTriggers(triggers, history.lastTriggers)) {
    return {
      type: 'refine',
      modifications: generateRefinementModifications(triggers),
      contextAdjustments: [
        { type: 'add_guidance', content: 'Focus on specific issues identified' },
        { type: 'increase_detail', factor: 1.5 },
      ],
    };
  }

  // Validation failures - retry with fixes
  if (triggerTypes.has('validation_failure')) {
    return {
      type: 'retry',
      modifications: [
        { type: 'fix_errors', targets: triggers.filter(t => t.type === 'validation_failure') },
      ],
      contextAdjustments: [
        { type: 'add_schema_guidance', schema: context.expectedSchema },
      ],
    };
  }

  // Low confidence - expand with more detail
  if (triggerTypes.has('low_confidence')) {
    return {
      type: 'expand',
      modifications: [
        { type: 'request_evidence', areas: extractLowConfidenceAreas(triggers) },
        { type: 'request_sources' },
      ],
      contextAdjustments: [
        { type: 'add_guidance', content: 'Provide more evidence and reasoning' },
      ],
    };
  }

  // Hallucinations - retry with verification emphasis
  if (triggerTypes.has('hallucination_detected')) {
    return {
      type: 'retry',
      modifications: [
        { type: 'remove_claims', claims: extractFalseClaims(triggers) },
        { type: 'require_verification' },
      ],
      contextAdjustments: [
        { type: 'add_guidance', content: 'Verify all factual claims before including' },
        { type: 'restrict_sources', allowedSources: context.verifiedSources },
      ],
    };
  }

  // Too many iterations - escalate
  if (previousAttempts >= context.maxIterations - 1) {
    return {
      type: 'escalate',
      modifications: [
        { type: 'flag_for_human', reason: 'Max iterations reached' },
      ],
      contextAdjustments: [],
    };
  }

  // Default: simple retry
  return {
    type: 'retry',
    modifications: [],
    contextAdjustments: [
      { type: 'add_guidance', content: 'Address the identified issues' },
    ],
  };
}

Iteration Budget

interface IterationBudget {
  maxIterations: number;
  currentIteration: number;
  remainingIterations: number;
  tokenBudget: number;
  usedTokens: number;
  remainingTokens: number;
  timeoutMs: number;
  elapsedMs: number;
  remainingMs: number;
}

function checkIterationBudget(
  current: IterationBudget,
  estimatedCost: IterationCost
): BudgetCheck {
  const checks = {
    iterations: current.remainingIterations > 0,
    tokens: current.remainingTokens >= estimatedCost.tokens,
    time: current.remainingMs >= estimatedCost.estimatedMs,
  };

  return {
    canIterate: checks.iterations && checks.tokens && checks.time,
    blockers: Object.entries(checks)
      .filter(([_, ok]) => !ok)
      .map(([resource]) => resource),
    warnings: generateBudgetWarnings(current, estimatedCost),
  };
}

function updateBudget(
  budget: IterationBudget,
  iterationResult: IterationResult
): IterationBudget {
  return {
    ...budget,
    currentIteration: budget.currentIteration + 1,
    remainingIterations: budget.remainingIterations - 1,
    usedTokens: budget.usedTokens + iterationResult.tokensUsed,
    remainingTokens: budget.remainingTokens - iterationResult.tokensUsed,
    elapsedMs: budget.elapsedMs + iterationResult.durationMs,
    remainingMs: budget.remainingMs - iterationResult.durationMs,
  };
}

Improvement Assessment

interface ImprovementAssessment {
  likelihood: number;          // 0-1 probability of improvement
  expectedGain: number;        // 0-1 expected quality improvement
  diminishingReturns: boolean; // Whether we're seeing diminishing returns
  recommendation: 'iterate' | 'accept' | 'escalate' | 'abort';
}

function assessImprovementPotential(
  history: IterationHistory,
  triggers: IterationTrigger[],
  budget: IterationBudget
): ImprovementAssessment {
  // Calculate improvement trend
  const qualityScores = history.iterations.map(i => i.qualityScore);
  const trend = calculateTrend(qualityScores);

  // Check for plateauing
  const recentScores = qualityScores.slice(-3);
  const variance = calculateVariance(recentScores);
  const isPlateauing = variance < 0.02 && recentScores.length >= 3;

  // Estimate likelihood based on trigger fixability
  const fixableTriggers = triggers.filter(t => t.fixable);
  const fixabilityRatio = fixableTriggers.length / triggers.length;

  // Calculate expected gain
  const avgTriggerSeverity = triggers.reduce((sum, t) => sum + t.severity, 0) / triggers.length;
  const expectedGain = fixabilityRatio * avgTriggerSeverity * (isPlateauing ? 0.3 : 0.7);

  // Determine recommendation
  let recommendation: ImprovementAssessment['recommendation'];

  if (budget.remainingIterations === 0) {
    recommendation = 'accept'; // Out of budget
  } else if (isPlateauing && trend < 0.01) {
    recommendation = 'escalate'; // Not improving
  } else if (expectedGain < 0.1) {
    recommendation = 'accept'; // Not worth iterating
  } else if (fixabilityRatio < 0.3) {
    recommendation = 'escalate'; // Can't fix most issues
  } else {
    recommendation = 'iterate';
  }

  return {
    likelihood: fixabilityRatio * (1 - (isPlateauing ? 0.5 : 0)),
    expectedGain,
    diminishingReturns: isPlateauing,
    recommendation,
  };
}

Decision Report

iterationDecision:
  taskId: code-review-task
  outputId: review-attempt-2
  decidedAt: "2024-01-15T10:30:00Z"

  decision:
    needsIteration: true
    priority: high

  triggers:
    - type: validation_failure
      source: output-validator
      severity: 0.8
      details: "$.analysis.security: Required field 'security' is missing"
      fixable: true

    - type: low_confidence
      source: confidence-scorer
      severity: 0.4
      details: "Confidence 62% below threshold 75%"
      fixable: true

    - type: requirement_unmet
      source: requirement-checker
      severity: 0.6
      details: "Requirement not met: Must include performance analysis"
      fixable: true

  strategy:
    type: refine
    modifications:
      - type: fix_errors
        targets: ["security field", "performance analysis"]
      - type: request_evidence
        areas: ["security assessment", "performance metrics"]
    contextAdjustments:
      - type: add_guidance
        content: "Add security section and performance analysis with metrics"
      - type: increase_detail
        factor: 1.3

  budget:
    maxIterations: 5
    currentIteration: 2
    remainingIterations: 3
    tokenBudget: 50000
    usedTokens: 12500
    remainingTokens: 37500

  assessment:
    likelihood: 0.75
    expectedGain: 0.35
    diminishingReturns: false
    recommendation: iterate

  nextSteps:
    - "Add security analysis section"
    - "Include performance metrics"
    - "Increase evidence and citations"

Integration Points

  • Input: Quality signals from validation, confidence, hallucination detection
  • Output: Iteration decisions to dag-dynamic-replanner
  • Feedback: Sends triggers to dag-feedback-synthesizer
  • Tracking: Reports to dag-convergence-monitor

Best Practices

  1. Multi-Signal Analysis: Don't rely on single trigger
  2. Budget Awareness: Always check remaining budget
  3. Trend Detection: Identify plateauing early
  4. Escalation Path: Know when to stop iterating
  5. Strategy Variety: Don't repeat failed strategies

Smart iteration. Know when to retry. Know when to stop.

# Supported AI Coding Agents

This skill is compatible with the SKILL.md standard and works with all major AI coding agents:

Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.