Type-safe output processing for Loop 2 validators and Loop 3 implementers. Use when parsing agent confidence scores, feedback, or calculating consensus from multiple validators.
Version: 1.0.0 Status: Production Purpose: Type-safe, consolidated output processing for Loop 2 (Validators) and Loop 3 (Implementers) agents
Previously, output processing was scattered across multiple bash scripts with duplicate logic:
cfn-loop2-output-processing/parse-feedback.shcfn-loop3-output-processing/parse-confidence.shSingle TypeScript module (cfn-loop-output-processing) providing:
.claude/skills/cfn-loop-orchestration-v2/lib/output/
āāā src/
ā āāā output-processor.ts # Core module (type-safe)
ā āāā cli/
ā āāā process-loop3.ts # Loop 3 CLI tool
ā āāā process-loop2.ts # Loop 2 CLI tool
āāā tests/
ā āāā output-processor.test.ts # Comprehensive test suite (90%+ coverage)
āāā SKILL.md # This file
āāā package.json # Dependencies
// Loop 3 Result (Implementers)
interface Loop3Result {
agentId: string;
confidence: number;
confidenceSource: 'explicit' | 'calculated' | 'fallback';
filesChanged: number;
deliverables: string[];
testsPassedCount?: number;
testsFailed?: number;
passRate?: number;
output: string;
iteration: number;
timestamp: string;
}
// Loop 2 Result (Validators)
interface Loop2Result {
validatorId: string;
score: number;
scoreSource: 'explicit' | 'calculated' | 'qualitative';
issues: FeedbackItem[];
criticalCount: number;
warningCount: number;
suggestionCount: number;
recommendations: string[];
output: string;
iteration: number;
timestamp: string;
}
// Consensus Result
interface ConsensusResult {
averageScore: number;
threshold: number;
passed: boolean;
validatorCount: number;
scoredCount: number;
minScore: number;
maxScore: number;
summary: string;
details: {
criticalIssuesTotal: number;
warningIssuesTotal: number;
suggestionsTotal: number;
};
}
parseConfidence(output, config?)Extracts confidence score using 5-pattern fallback approach.
Patterns (priority order):
## Validation Confidence: 0.85confidence: 0.92 or Confidence: 0.92Score: 0.7892% or 92 percent(0.87)high confidence ā 0.90, medium ā 0.75, low ā 0.50Returns:
{
score: number; // 0.0-1.0
source: 'explicit' | 'qualitative' | 'none';
}
Examples:
parseConfidence('Confidence: 0.85'); // { score: 0.85, source: 'explicit' }
parseConfidence('92%'); // { score: 0.92, source: 'explicit' }
parseConfidence('high confidence'); // { score: 0.90, source: 'qualitative' }
parseConfidence('No score provided'); // { score: 0.0, source: 'none' }
extractFeedback(output)Extracts feedback items from validator output, categorized by severity.
Supported formats:
### CRITICAL Issues\n- Issue textCRITICAL: Issue text-, *, ā¢Returns:
FeedbackItem[] = [
{ severity: 'CRITICAL', text: 'Missing error handling' },
{ severity: 'WARNING', text: 'Performance issue' },
{ severity: 'SUGGESTION', text: 'Add documentation' }
]
Example:
### CRITICAL Issues
- SQL injection vulnerability
- Missing authentication
### WARNING Issues
- Performance concern in loop
### SUGGESTION Items
- Add unit tests
extractRecommendations(output)Extracts recommendations/suggestions from validator output.
Supported headers: Recommendations:, Recommendation:, Suggestions:
Returns: string[] of recommendations
calculateConsensus(results, threshold?)Calculates consensus from multiple validator results.
Parameters:
results: Array of Loop2Resultthreshold: Minimum average score to pass (default: 0.70)Returns:
{
averageScore: number;
threshold: number;
passed: boolean;
validatorCount: number;
scoredCount: number;
minScore: number;
maxScore: number;
summary: string;
details: {
criticalIssuesTotal: number;
warningIssuesTotal: number;
suggestionsTotal: number;
};
}
Example:
const consensus = calculateConsensus([
{ validatorId: 'v1', score: 0.9, ... },
{ validatorId: 'v2', score: 0.85, ... }
], 0.80);
// Result: { averageScore: 0.875, passed: true, ... }
parseLoop3Output(agentOutput, agentId, iteration?, gitStatus?)Complete Loop 3 parser combining all extraction logic.
Features:
Example:
const result = parseLoop3Output(
agentOutput,
'coder-1',
1,
{ before: '...', after: '...' }
);
// Result: Loop3Result with confidence, deliverables, test info
parseLoop2Output(validatorOutput, validatorId, iteration?)Complete Loop 2 parser for validator feedback.
Features:
Example:
const result = parseLoop2Output(
validatorOutput,
'reviewer-1',
1
);
// Result: Loop2Result with score, issues, recommendations
npx ts-node src/cli/process-loop3.ts [OPTIONS]
Options:
--agent-id <id> - Agent identifier (required)--output <text> - Agent output text (required)--output-file <path> - Alternative: read from file--iteration <n> - Iteration number (default: 1)--files-changed <n> - Number of files changed--deliverables <file,file> - Comma-separated filesOutput: JSON with Loop3Result
Example:
npx ts-node src/cli/process-loop3.ts \
--agent-id "coder-1" \
--output "Implementation complete. Confidence: 0.85" \
--files-changed 5
# Output:
# {
# "agentId": "coder-1",
# "confidence": 0.85,
# "confidenceSource": "explicit",
# "filesChanged": 5,
# ...
# }
npx ts-node src/cli/process-loop2.ts [OPTIONS]
Options:
--validator-id <id> - Validator identifier (required)--output <text> - Validator output text (required)--output-file <path> - Alternative: read from file--iteration <n> - Iteration number (default: 1)Output: JSON with Loop2Result
Example:
npx ts-node src/cli/process-loop2.ts \
--validator-id "reviewer-1" \
--output "Validation: confidence 0.92"
# Output:
# {
# "validatorId": "reviewer-1",
# "score": 0.92,
# ...
# }
npx ts-node src/cli/process-loop2.ts --consensus [OPTIONS]
Options:
--consensus - Enable consensus mode--results-file <path> - JSON file with Loop2Result array (required)--threshold <n> - Minimum score to pass (default: 0.70)Output: JSON with ConsensusResult
Example:
npx ts-node src/cli/process-loop2.ts \
--consensus \
--results-file ./validator-results.json \
--threshold 0.75
# Output:
# {
# "averageScore": 0.88,
# "passed": true,
# "summary": "PASS: 88% consensus from 3 validators...",
# ...
# }
# From orchestrator: process implementer output
RESULT=$(npx ts-node $HOME/.claude/skills/cfn-loop-orchestration-v2/lib/output/src/cli/process-loop3.ts \
--agent-id "$AGENT_ID" \
--output "$AGENT_OUTPUT" \
--iteration "$ITERATION")
CONFIDENCE=$(echo "$RESULT" | jq -r '.confidence')
FILES_CHANGED=$(echo "$RESULT" | jq -r '.filesChanged')
# Report to Redis
redis-cli LPUSH "swarm:${TASK_ID}:${AGENT_ID}:confidence" "$CONFIDENCE"
redis-cli LPUSH "swarm:${TASK_ID}:${AGENT_ID}:done" "complete"
# Process validator output
RESULT=$(npx ts-node $HOME/.claude/skills/cfn-loop-orchestration-v2/lib/output/src/cli/process-loop2.ts \
--validator-id "$VALIDATOR_ID" \
--output "$VALIDATOR_OUTPUT" \
--iteration "$ITERATION")
SCORE=$(echo "$RESULT" | jq -r '.score')
# Store for later consensus calculation
echo "$RESULT" >> ./validator-results.json
# Calculate consensus from all validators
CONSENSUS=$(npx ts-node $HOME/.claude/skills/cfn-loop-orchestration-v2/lib/output/src/cli/process-loop2.ts \
--consensus \
--results-file ./validator-results.json \
--threshold "$CONSENSUS_THRESHOLD")
PASSED=$(echo "$CONSENSUS" | jq -r '.passed')
if [ "$PASSED" = "true" ]; then
echo "Validators consensus PASSED"
else
echo "Validators consensus FAILED - average score below threshold"
fi
NOTE: this 5-pattern extraction ladder is RECOVERY-ONLY. It exists to salvage confidence from malformed agent output. Orchestrator prompts must demand the JSON contract as primary (agents report an explicit JSON block with a decimal confidence field, computed by the mechanical rubric in lib/validation/SKILL.md). If you find yourself relying on patterns 3-5, fix the spawn prompt, not the parser.
Explicit Header (Priority 1)
## Validation Confidence: 0.85Generic Field (Priority 2)
confidence: 0.92Confidence: 0.92Score: 0.78Percentage (Priority 3)
92%92 percentParentheses (Priority 4)
(0.87)Qualitative (Priority 5)
high confidence ā 0.90medium confidence ā 0.75low confidence ā 0.50If no explicit confidence found:
File: tests/output-processor.test.ts
Coverage: 90%+ (lines, functions, branches)
# Install dependencies
npm install
# Run all tests with coverage
npm run test
# Run specific test suite
npm test -- --testNamePattern="parseConfidence"
# Watch mode for development
npm test -- --watch
Old (Bash):
CONFIDENCE=$(./parse-confidence.sh "$AGENT_OUTPUT")
DELIVERABLES=$(./verify-deliverables.sh --before "$BEFORE" --after "$AFTER")
New (TypeScript):
import { parseConfidence, parseLoop3Output } from './output-processor';
const { score, source } = parseConfidence(agentOutput);
const result = parseLoop3Output(agentOutput, agentId, iteration, gitStatus);
CLI (Same interface):
npx ts-node src/cli/process-loop3.ts \
--agent-id "coder-1" \
--output "$AGENT_OUTPUT"
Immediate (Now):
cfn-loop2-output-processing/parse-feedback.sh ā Use TypeScript modulecfn-loop3-output-processing/parse-confidence.sh ā Use TypeScript modulecfn-loop3-output-processing/calculate-confidence.sh ā Use TypeScript module30 days: Bash scripts continue to work (deprecated status) 60 days: Orchestrator fully migrated to TypeScript 90 days: Bash scripts removed
| Aspect | Bash Scripts | TypeScript Module |
|---|---|---|
| Type Safety | ā No | ā Yes |
| Code Reuse | ā Duplicate logic | ā Shared functions |
| Test Coverage | ā Limited | ā 90%+ |
| Documentation | ā Inline comments | ā Comprehensive |
| Maintainability | ā Hard to modify | ā Easy to extend |
| Performance | ā Fast | ā Fast (Node.js) |
| Debuggability | ā ļø Bash errors | ā Stack traces |
| IDE Support | ā None | ā Full IntelliSense |
// Empty input
parseConfidence(''); // { score: 0.0, source: 'none' }
// Invalid JSON in results file
const results = parseJson(invalidJson); // null
// Out of range score
isValidConfidence(1.5); // false
# Missing required argument
$ npx ts-node src/cli/process-loop3.ts
Error: --agent-id is required
# File not found
$ npx ts-node src/cli/process-loop3.ts --output-file missing.txt
Error: Output file not found: missing.txt
Memory efficient with minimal allocations.
None. This module consolidates without changing external interfaces.
All CLI tools accept same arguments as predecessor bash scripts.
Orchestrator integration remains identical - only internal implementation changes.
.claude/skills/cfn-agent-lifecycle/lib/output/README.md) - Universal pattern.claude/skills/cfn-loop-orchestration-v2/lib/orchestrator/SKILL.md) - Coordinator integrationdocs/CFN_LOOP_ARCHITECTURE.md) - System designThis skill provides type-safe, consolidated output processing for all CFN Loop agents. By consolidating previously scattered bash scripts into a single TypeScript module, we achieve:
The module is production-ready and replaces cfn-loop2-output-processing and cfn-loop3-output-processing bash skills.