#!/usr/bin/env node /** * Recommended-node resolver for direct episodes. * Pure — read-only, no exec, no fs (Security Guidance #40). * * For an episode classified as `taskClassification` with node_chosen='direct', * return the first live (non-dormant) recommended node ID from the * classification map. Mirrors missed-activations.mjs dormancy logic: * dormancy[id] === false strictly (missing/true → not live). * * Per spec: docs/superpowers/specs/2026-05-23-observer-parser-skill-hook-expand-design.md */ export function recommendNode(taskClassification, classificationMap, dormancy) { if (!taskClassification || !classificationMap || !dormancy) return null; const recommended = classificationMap[taskClassification]; if (!Array.isArray(recommended) || recommended.length === 0) return null; for (const id of recommended) { if (dormancy[id] === false) return id; } return null; }