claude-flow-novice 2.10.5 → 2.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (694) hide show
  1. package/.claude/hooks/cfn-invoke-security-validation.sh +70 -0
  2. package/.claude/skills/cfn-hybrid-routing/spawn-worker.sh +43 -43
  3. package/claude-assets/agents/AGENT_LIFECYCLE.md +530 -0
  4. package/claude-assets/agents/README-VALIDATION.md +243 -0
  5. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +692 -0
  6. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +739 -0
  7. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +905 -0
  8. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +707 -0
  9. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +901 -0
  10. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +757 -0
  11. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +630 -0
  12. package/claude-assets/agents/custom/claude-code-expert.md +144 -0
  13. package/claude-assets/agents/custom/test-mcp-access.md +26 -0
  14. package/claude-assets/agents/docker-team/csuite/c-suite-template.md +529 -0
  15. package/claude-assets/agents/docker-team/infrastructure/team-coordinator-template.md +467 -0
  16. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +347 -0
  17. package/claude-assets/agents/validate-agent.js +841 -0
  18. package/claude-assets/commands/agents/README.md +10 -0
  19. package/claude-assets/commands/agents/agent-capabilities.md +21 -0
  20. package/claude-assets/commands/agents/agent-coordination.md +28 -0
  21. package/claude-assets/commands/agents/agent-spawning.md +28 -0
  22. package/claude-assets/commands/agents/agent-types.md +26 -0
  23. package/claude-assets/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +54 -0
  24. package/claude-assets/commands/analysis/README.md +9 -0
  25. package/claude-assets/commands/analysis/bottleneck-detect.md +162 -0
  26. package/claude-assets/commands/analysis/performance-bottlenecks.md +59 -0
  27. package/claude-assets/commands/analysis/performance-report.md +25 -0
  28. package/claude-assets/commands/analysis/token-efficiency.md +45 -0
  29. package/claude-assets/commands/analysis/token-usage.md +25 -0
  30. package/claude-assets/commands/automation/README.md +9 -0
  31. package/claude-assets/commands/automation/auto-agent.md +122 -0
  32. package/claude-assets/commands/automation/self-healing.md +106 -0
  33. package/claude-assets/commands/automation/session-memory.md +90 -0
  34. package/claude-assets/commands/automation/smart-agents.md +73 -0
  35. package/claude-assets/commands/automation/smart-spawn.md +25 -0
  36. package/claude-assets/commands/automation/workflow-select.md +25 -0
  37. package/claude-assets/commands/cfn/CFN_COORDINATOR_PARAMETERS.md +660 -0
  38. package/claude-assets/commands/cfn/CFN_LOOP_FRONTEND.md +741 -0
  39. package/claude-assets/commands/cfn/CFN_LOOP_TASK_MODE.md +353 -0
  40. package/claude-assets/commands/cfn/README.md +157 -0
  41. package/claude-assets/commands/cfn/auto-compact.md +80 -0
  42. package/claude-assets/commands/cfn/cfn-claude-sync.md +303 -0
  43. package/claude-assets/commands/cfn/cfn-loop-document.md +480 -0
  44. package/claude-assets/commands/cfn/cfn-loop-epic.md +478 -0
  45. package/claude-assets/commands/cfn/cfn-loop-frontend.md +555 -0
  46. package/claude-assets/commands/cfn/cfn-loop-single.md +256 -0
  47. package/claude-assets/commands/cfn/cfn-loop-sprints.md +396 -0
  48. package/claude-assets/commands/cfn/cfn-loop.md +517 -0
  49. package/claude-assets/commands/cfn/cfn-mode.md +20 -0
  50. package/claude-assets/commands/cfn/cfn-optimize-agents.md +103 -0
  51. package/claude-assets/commands/cfn/claude-md.md +64 -0
  52. package/claude-assets/commands/cfn/claude-soul.md +22 -0
  53. package/claude-assets/commands/cfn/context-curate.md +211 -0
  54. package/claude-assets/commands/cfn/context-inject.md +262 -0
  55. package/claude-assets/commands/cfn/context-query.md +215 -0
  56. package/claude-assets/commands/cfn/context-reflect.md +165 -0
  57. package/claude-assets/commands/cfn/context-stats.md +294 -0
  58. package/claude-assets/commands/cfn/cost-savings-off.md +35 -0
  59. package/claude-assets/commands/cfn/cost-savings-on.md +35 -0
  60. package/claude-assets/commands/cfn/cost-savings-status.md +34 -0
  61. package/claude-assets/commands/cfn/custom-routing-activate.md +55 -0
  62. package/claude-assets/commands/cfn/custom-routing-deactivate.md +46 -0
  63. package/claude-assets/commands/cfn/dependency-recommendations.md +171 -0
  64. package/claude-assets/commands/cfn/fullstack.md +179 -0
  65. package/claude-assets/commands/cfn/github-commit.md +289 -0
  66. package/claude-assets/commands/cfn/github.md +221 -0
  67. package/claude-assets/commands/cfn/hello-world-tests.md +381 -0
  68. package/claude-assets/commands/cfn/hooks.md +38 -0
  69. package/claude-assets/commands/cfn/launch-web-dashboard.md +295 -0
  70. package/claude-assets/commands/cfn/list-agents-rebuild.md +205 -0
  71. package/claude-assets/commands/cfn/metrics-summary.md +58 -0
  72. package/claude-assets/commands/cfn/neural.md +39 -0
  73. package/claude-assets/commands/cfn/parse-epic.md +357 -0
  74. package/claude-assets/commands/cfn/performance.md +41 -0
  75. package/claude-assets/commands/cfn/sparc.md +46 -0
  76. package/claude-assets/commands/cfn/suggest-improvements.md +95 -0
  77. package/claude-assets/commands/cfn/suggest-templates.md +147 -0
  78. package/claude-assets/commands/cfn/swarm.md +24 -0
  79. package/claude-assets/commands/cfn/switch-api.md +53 -0
  80. package/claude-assets/commands/cfn/workflow.md +295 -0
  81. package/claude-assets/commands/cfn/write-plan.md +104 -0
  82. package/claude-assets/commands/claude-md.js +237 -0
  83. package/claude-assets/commands/claude-soul.js +28 -0
  84. package/claude-assets/commands/cli-integration.js +216 -0
  85. package/claude-assets/commands/coordination/README.md +9 -0
  86. package/claude-assets/commands/coordination/agent-spawn.md +25 -0
  87. package/claude-assets/commands/coordination/coordination-system.md +88 -0
  88. package/claude-assets/commands/coordination/init.md +44 -0
  89. package/claude-assets/commands/coordination/orchestrate.md +43 -0
  90. package/claude-assets/commands/coordination/spawn.md +45 -0
  91. package/claude-assets/commands/coordination/swarm-init.md +85 -0
  92. package/claude-assets/commands/coordination/task-orchestrate.md +25 -0
  93. package/claude-assets/commands/github/README.md +11 -0
  94. package/claude-assets/commands/github/code-review-swarm.md +514 -0
  95. package/claude-assets/commands/github/code-review.md +25 -0
  96. package/claude-assets/commands/github/github-modes.md +147 -0
  97. package/claude-assets/commands/github/github-swarm.md +121 -0
  98. package/claude-assets/commands/github/issue-tracker.md +292 -0
  99. package/claude-assets/commands/github/issue-triage.md +25 -0
  100. package/claude-assets/commands/github/multi-repo-swarm.md +519 -0
  101. package/claude-assets/commands/github/pr-enhance.md +26 -0
  102. package/claude-assets/commands/github/pr-manager.md +170 -0
  103. package/claude-assets/commands/github/project-board-sync.md +471 -0
  104. package/claude-assets/commands/github/release-manager.md +338 -0
  105. package/claude-assets/commands/github/release-swarm.md +544 -0
  106. package/claude-assets/commands/github/repo-analyze.md +25 -0
  107. package/claude-assets/commands/github/repo-architect.md +367 -0
  108. package/claude-assets/commands/github/swarm-issue.md +482 -0
  109. package/claude-assets/commands/github/swarm-pr.md +285 -0
  110. package/claude-assets/commands/github/sync-coordinator.md +301 -0
  111. package/claude-assets/commands/github/workflow-automation.md +442 -0
  112. package/claude-assets/commands/github.js +638 -0
  113. package/claude-assets/commands/hive-mind/README.md +17 -0
  114. package/claude-assets/commands/hive-mind/hive-mind-consensus.md +8 -0
  115. package/claude-assets/commands/hive-mind/hive-mind-init.md +18 -0
  116. package/claude-assets/commands/hive-mind/hive-mind-memory.md +8 -0
  117. package/claude-assets/commands/hive-mind/hive-mind-metrics.md +8 -0
  118. package/claude-assets/commands/hive-mind/hive-mind-resume.md +8 -0
  119. package/claude-assets/commands/hive-mind/hive-mind-sessions.md +8 -0
  120. package/claude-assets/commands/hive-mind/hive-mind-spawn.md +21 -0
  121. package/claude-assets/commands/hive-mind/hive-mind-status.md +8 -0
  122. package/claude-assets/commands/hive-mind/hive-mind-stop.md +8 -0
  123. package/claude-assets/commands/hive-mind/hive-mind-wizard.md +8 -0
  124. package/claude-assets/commands/hive-mind/hive-mind.md +27 -0
  125. package/claude-assets/commands/hooks/README.md +11 -0
  126. package/claude-assets/commands/hooks/overview.md +58 -0
  127. package/claude-assets/commands/hooks/post-edit.md +117 -0
  128. package/claude-assets/commands/hooks/post-task.md +112 -0
  129. package/claude-assets/commands/hooks/pre-edit.md +113 -0
  130. package/claude-assets/commands/hooks/pre-task.md +111 -0
  131. package/claude-assets/commands/hooks/session-end.md +118 -0
  132. package/claude-assets/commands/hooks/session-start.md +9 -0
  133. package/claude-assets/commands/hooks/setup.md +103 -0
  134. package/claude-assets/commands/hooks.js +651 -0
  135. package/claude-assets/commands/index.js +119 -0
  136. package/claude-assets/commands/memory/README.md +9 -0
  137. package/claude-assets/commands/memory/memory-bank.md +58 -0
  138. package/claude-assets/commands/memory/memory-persist.md +25 -0
  139. package/claude-assets/commands/memory/memory-search.md +25 -0
  140. package/claude-assets/commands/memory/memory-usage.md +25 -0
  141. package/claude-assets/commands/memory/neural.md +47 -0
  142. package/claude-assets/commands/memory/usage.md +46 -0
  143. package/claude-assets/commands/monitoring/README.md +9 -0
  144. package/claude-assets/commands/monitoring/agent-metrics.md +25 -0
  145. package/claude-assets/commands/monitoring/agents.md +44 -0
  146. package/claude-assets/commands/monitoring/real-time-view.md +25 -0
  147. package/claude-assets/commands/monitoring/status.md +46 -0
  148. package/claude-assets/commands/monitoring/swarm-monitor.md +25 -0
  149. package/claude-assets/commands/neural.js +572 -0
  150. package/claude-assets/commands/optimization/README.md +9 -0
  151. package/claude-assets/commands/optimization/auto-topology.md +62 -0
  152. package/claude-assets/commands/optimization/cache-manage.md +25 -0
  153. package/claude-assets/commands/optimization/parallel-execute.md +25 -0
  154. package/claude-assets/commands/optimization/parallel-execution.md +50 -0
  155. package/claude-assets/commands/optimization/topology-optimize.md +25 -0
  156. package/claude-assets/commands/pair/README.md +261 -0
  157. package/claude-assets/commands/pair/commands.md +546 -0
  158. package/claude-assets/commands/pair/config.md +510 -0
  159. package/claude-assets/commands/pair/examples.md +512 -0
  160. package/claude-assets/commands/pair/modes.md +348 -0
  161. package/claude-assets/commands/pair/session.md +407 -0
  162. package/claude-assets/commands/pair/start.md +209 -0
  163. package/claude-assets/commands/parse-epic.js +180 -0
  164. package/claude-assets/commands/performance.js +582 -0
  165. package/claude-assets/commands/register-all-commands.js +320 -0
  166. package/claude-assets/commands/register-claude-md.js +82 -0
  167. package/claude-assets/commands/register-claude-soul.js +80 -0
  168. package/claude-assets/commands/sparc/analyzer.md +52 -0
  169. package/claude-assets/commands/sparc/architect.md +53 -0
  170. package/claude-assets/commands/sparc/batch-executor.md +54 -0
  171. package/claude-assets/commands/sparc/coder.md +54 -0
  172. package/claude-assets/commands/sparc/debugger.md +54 -0
  173. package/claude-assets/commands/sparc/designer.md +53 -0
  174. package/claude-assets/commands/sparc/documenter.md +54 -0
  175. package/claude-assets/commands/sparc/innovator.md +54 -0
  176. package/claude-assets/commands/sparc/memory-manager.md +54 -0
  177. package/claude-assets/commands/sparc/optimizer.md +54 -0
  178. package/claude-assets/commands/sparc/orchestrator.md +132 -0
  179. package/claude-assets/commands/sparc/researcher.md +54 -0
  180. package/claude-assets/commands/sparc/reviewer.md +54 -0
  181. package/claude-assets/commands/sparc/sparc-modes.md +174 -0
  182. package/claude-assets/commands/sparc/swarm-coordinator.md +54 -0
  183. package/claude-assets/commands/sparc/tdd.md +54 -0
  184. package/claude-assets/commands/sparc/tester.md +54 -0
  185. package/claude-assets/commands/sparc/workflow-manager.md +54 -0
  186. package/claude-assets/commands/sparc.js +110 -0
  187. package/claude-assets/commands/stream-chain/pipeline.md +121 -0
  188. package/claude-assets/commands/stream-chain/run.md +70 -0
  189. package/claude-assets/commands/swarm/README.md +15 -0
  190. package/claude-assets/commands/swarm/analysis.md +95 -0
  191. package/claude-assets/commands/swarm/development.md +96 -0
  192. package/claude-assets/commands/swarm/examples.md +168 -0
  193. package/claude-assets/commands/swarm/maintenance.md +102 -0
  194. package/claude-assets/commands/swarm/optimization.md +117 -0
  195. package/claude-assets/commands/swarm/research.md +136 -0
  196. package/claude-assets/commands/swarm/swarm-analysis.md +8 -0
  197. package/claude-assets/commands/swarm/swarm-background.md +8 -0
  198. package/claude-assets/commands/swarm/swarm-init.md +19 -0
  199. package/claude-assets/commands/swarm/swarm-modes.md +8 -0
  200. package/claude-assets/commands/swarm/swarm-monitor.md +8 -0
  201. package/claude-assets/commands/swarm/swarm-spawn.md +19 -0
  202. package/claude-assets/commands/swarm/swarm-status.md +8 -0
  203. package/claude-assets/commands/swarm/swarm-strategies.md +8 -0
  204. package/claude-assets/commands/swarm/swarm.md +27 -0
  205. package/claude-assets/commands/swarm/testing.md +131 -0
  206. package/claude-assets/commands/swarm.js +423 -0
  207. package/claude-assets/commands/testing/playwright-e2e.md +288 -0
  208. package/claude-assets/commands/training/README.md +9 -0
  209. package/claude-assets/commands/training/model-update.md +25 -0
  210. package/claude-assets/commands/training/neural-patterns.md +74 -0
  211. package/claude-assets/commands/training/neural-train.md +25 -0
  212. package/claude-assets/commands/training/pattern-learn.md +25 -0
  213. package/claude-assets/commands/training/specialization.md +63 -0
  214. package/claude-assets/commands/truth/start.md +143 -0
  215. package/claude-assets/commands/validate-commands.js +223 -0
  216. package/claude-assets/commands/verify/check.md +50 -0
  217. package/claude-assets/commands/verify/start.md +128 -0
  218. package/claude-assets/commands/workflow.js +606 -0
  219. package/claude-assets/commands/workflows/README.md +9 -0
  220. package/claude-assets/commands/workflows/development.md +78 -0
  221. package/claude-assets/commands/workflows/research.md +63 -0
  222. package/claude-assets/commands/workflows/workflow-create.md +25 -0
  223. package/claude-assets/commands/workflows/workflow-execute.md +25 -0
  224. package/claude-assets/commands/workflows/workflow-export.md +25 -0
  225. package/claude-assets/hooks/cfn-BACKUP_USAGE.md +243 -0
  226. package/claude-assets/hooks/cfn-invoke-post-edit.sh +87 -0
  227. package/claude-assets/hooks/cfn-invoke-security-validation.sh +70 -0
  228. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +79 -0
  229. package/claude-assets/hooks/cfn-post-edit.config.json +37 -0
  230. package/claude-assets/hooks/cfn-post-edit.sh +21 -0
  231. package/claude-assets/hooks/cfn-pre-edit-backup.sh +71 -0
  232. package/claude-assets/hooks/cfn-restore-from-backup.sh +37 -0
  233. package/claude-assets/hooks/post-edit.config.json +12 -0
  234. package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +796 -0
  235. package/claude-assets/skills/CFN-LOOP-VALIDATION.md +202 -0
  236. package/claude-assets/skills/REDIS-COORDINATION.md +187 -0
  237. package/claude-assets/skills/SKILL.md +229 -0
  238. package/claude-assets/skills/agent-discovery/agents-registry.json +484 -0
  239. package/claude-assets/skills/cfn-ace-system/SKILL.md +364 -0
  240. package/claude-assets/skills/cfn-ace-system/add-bullet.sh +145 -0
  241. package/claude-assets/skills/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +56 -0
  242. package/claude-assets/skills/cfn-ace-system/classify-task.sh +18 -0
  243. package/claude-assets/skills/cfn-ace-system/export-ace-metrics.sh +48 -0
  244. package/claude-assets/skills/cfn-ace-system/extract-tags.sh +385 -0
  245. package/claude-assets/skills/cfn-ace-system/format-negative-context.sh +180 -0
  246. package/claude-assets/skills/cfn-ace-system/init-indexes.sql +160 -0
  247. package/claude-assets/skills/cfn-ace-system/invoke-context-curate.sh +192 -0
  248. package/claude-assets/skills/cfn-ace-system/invoke-context-inject.sh +361 -0
  249. package/claude-assets/skills/cfn-ace-system/invoke-context-query.sh +139 -0
  250. package/claude-assets/skills/cfn-ace-system/invoke-context-reflect.sh +343 -0
  251. package/claude-assets/skills/cfn-ace-system/invoke-context-stats.sh +227 -0
  252. package/claude-assets/skills/cfn-ace-system/log-merge.sh +67 -0
  253. package/claude-assets/skills/cfn-ace-system/monitor-injection-performance.sh +138 -0
  254. package/claude-assets/skills/cfn-ace-system/optimize-injection-pipeline.sh +169 -0
  255. package/claude-assets/skills/cfn-ace-system/query-anti-patterns.sh +276 -0
  256. package/claude-assets/skills/cfn-ace-system/query-contexts.sh +150 -0
  257. package/claude-assets/skills/cfn-ace-system/query-reflections.sh +35 -0
  258. package/claude-assets/skills/cfn-ace-system/schema/001-create-context-reflections.sql +237 -0
  259. package/claude-assets/skills/cfn-ace-system/schema/README.md +723 -0
  260. package/claude-assets/skills/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +564 -0
  261. package/claude-assets/skills/cfn-ace-system/schema/populate-test-data-simple.sh +62 -0
  262. package/claude-assets/skills/cfn-ace-system/schema/populate-test-data.sh +247 -0
  263. package/claude-assets/skills/cfn-ace-system/schema/run-migration.sh +231 -0
  264. package/claude-assets/skills/cfn-ace-system/schema/validate-schema.sql +280 -0
  265. package/claude-assets/skills/cfn-ace-system/score-relevance-adapter.sh +138 -0
  266. package/claude-assets/skills/cfn-ace-system/score-relevance.sh +253 -0
  267. package/claude-assets/skills/cfn-ace-system/sprint-7-lessons.json +46 -0
  268. package/claude-assets/skills/cfn-ace-system/store-reflection.sh +46 -0
  269. package/claude-assets/skills/cfn-ace-system/test-ace-skill.sh +312 -0
  270. package/claude-assets/skills/cfn-ace-system/track-ab-test.sh +42 -0
  271. package/claude-assets/skills/cfn-ace-system/update-reflection.sh +41 -0
  272. package/claude-assets/skills/cfn-agent-discovery/SKILL.md +40 -0
  273. package/claude-assets/skills/cfn-agent-discovery/agents-registry-clean.json +0 -0
  274. package/claude-assets/skills/cfn-agent-discovery/agents-registry-fixed.json +19 -0
  275. package/claude-assets/skills/cfn-agent-discovery/agents-registry.json +718 -0
  276. package/claude-assets/skills/cfn-agent-discovery/discover-agents.py +184 -0
  277. package/claude-assets/skills/cfn-agent-discovery/discover-agents.sh +87 -0
  278. package/claude-assets/skills/cfn-agent-discovery/invoke-registry.sh +11 -0
  279. package/claude-assets/skills/cfn-agent-discovery/temp_script.py +0 -0
  280. package/claude-assets/skills/cfn-agent-execution/execute-agent.sh +126 -0
  281. package/claude-assets/skills/cfn-agent-output-processing/SKILL.md +359 -0
  282. package/claude-assets/skills/cfn-agent-selector/SKILL.md +90 -0
  283. package/claude-assets/skills/cfn-agent-selector/select-agents.sh +112 -0
  284. package/claude-assets/skills/cfn-agent-spawning/README.md +140 -0
  285. package/claude-assets/skills/cfn-agent-spawning/SKILL.md +135 -0
  286. package/claude-assets/skills/cfn-agent-spawning/agent-selection-guide.md +814 -0
  287. package/claude-assets/skills/cfn-agent-spawning/check-dependencies.sh +30 -0
  288. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +263 -0
  289. package/claude-assets/skills/cfn-agent-spawning/spawn-templates.sh +613 -0
  290. package/claude-assets/skills/cfn-agent-swap/SKILL.md +36 -0
  291. package/claude-assets/skills/cfn-agent-swap/recommend-swap.sh +60 -0
  292. package/claude-assets/skills/cfn-analytics/README.md +58 -0
  293. package/claude-assets/skills/cfn-analytics/description-refinement-guide.md +164 -0
  294. package/claude-assets/skills/cfn-analytics/log-skill-invocation.js +122 -0
  295. package/claude-assets/skills/cfn-analytics/run-production-criteria-tests.sh +126 -0
  296. package/claude-assets/skills/cfn-analytics/skill-analytics-dashboard.js +113 -0
  297. package/claude-assets/skills/cfn-analytics/skill-invocation-hook.sh +28 -0
  298. package/claude-assets/skills/cfn-analytics/skill-invocations.sql +58 -0
  299. package/claude-assets/skills/cfn-analytics/test-corpus.json +32 -0
  300. package/claude-assets/skills/cfn-analytics/test-data-generator.js +115 -0
  301. package/claude-assets/skills/cfn-analytics/test-manual-override-rate.js +285 -0
  302. package/claude-assets/skills/cfn-analytics/validate-skill-selection.js +188 -0
  303. package/claude-assets/skills/cfn-api-validation/test-endpoints.sh +54 -0
  304. package/claude-assets/skills/cfn-automatic-memory-persistence/SKILL.md +73 -0
  305. package/claude-assets/skills/cfn-automatic-memory-persistence/persist-agent-output.sh +49 -0
  306. package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +35 -0
  307. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +235 -0
  308. package/claude-assets/skills/cfn-complexity-estimator/SKILL.md +96 -0
  309. package/claude-assets/skills/cfn-complexity-estimator/estimate-complexity.sh +144 -0
  310. package/claude-assets/skills/cfn-config-management/README.md +42 -0
  311. package/claude-assets/skills/cfn-config-management/SKILL.md +34 -0
  312. package/claude-assets/skills/cfn-config-management/check-dependencies.sh +56 -0
  313. package/claude-assets/skills/cfn-config-management/config.json +32 -0
  314. package/claude-assets/skills/cfn-config-management/manage-config.sh +113 -0
  315. package/claude-assets/skills/cfn-context-pruner/SKILL.md +75 -0
  316. package/claude-assets/skills/cfn-context-pruner/prune-context.sh +73 -0
  317. package/claude-assets/skills/cfn-defense-in-depth/SKILL.md +133 -0
  318. package/claude-assets/skills/cfn-dependency-extractor/SKILL.md +35 -0
  319. package/claude-assets/skills/cfn-dependency-extractor/extract-dependencies.sh +66 -0
  320. package/claude-assets/skills/cfn-epic-decomposer/SKILL.md +44 -0
  321. package/claude-assets/skills/cfn-epic-decomposer/decompose-epic.sh +104 -0
  322. package/claude-assets/skills/cfn-event-bus/README.md +299 -0
  323. package/claude-assets/skills/cfn-event-bus/SKILL.md +412 -0
  324. package/claude-assets/skills/cfn-event-bus/config.json +111 -0
  325. package/claude-assets/skills/cfn-event-bus/eventbus-wrapper.cjs +69 -0
  326. package/claude-assets/skills/cfn-event-bus/invoke-event-publish.sh +147 -0
  327. package/claude-assets/skills/cfn-event-bus/invoke-event-subscribe.sh +171 -0
  328. package/claude-assets/skills/cfn-event-bus/invoke-lifecycle-track.sh +201 -0
  329. package/claude-assets/skills/cfn-event-bus/test-event-bus.sh +280 -0
  330. package/claude-assets/skills/cfn-fleet-manager/README.md +74 -0
  331. package/claude-assets/skills/cfn-fleet-manager/SKILL.md +412 -0
  332. package/claude-assets/skills/cfn-fleet-manager/config.json +60 -0
  333. package/claude-assets/skills/cfn-fleet-manager/invoke-fleet-allocate.sh +182 -0
  334. package/claude-assets/skills/cfn-fleet-manager/invoke-fleet-balance.sh +239 -0
  335. package/claude-assets/skills/cfn-fleet-manager/invoke-fleet-metrics.sh +193 -0
  336. package/claude-assets/skills/cfn-fleet-manager/invoke-fleet-register.sh +124 -0
  337. package/claude-assets/skills/cfn-fleet-manager/test-fleet-manager.sh +345 -0
  338. package/claude-assets/skills/cfn-hook-pipeline/README.md +74 -0
  339. package/claude-assets/skills/cfn-hook-pipeline/SKILL.md +148 -0
  340. package/claude-assets/skills/cfn-hook-pipeline/auto-resolve.sh +66 -0
  341. package/claude-assets/skills/cfn-hook-pipeline/check-dependencies.sh +40 -0
  342. package/claude-assets/skills/cfn-hook-pipeline/feedback-resolver.sh +452 -0
  343. package/claude-assets/skills/cfn-hook-pipeline/post-edit-handler.sh +154 -0
  344. package/claude-assets/skills/cfn-hook-pipeline/security-scan.json +60 -0
  345. package/claude-assets/skills/cfn-hook-pipeline/security-scanner.sh +121 -0
  346. package/claude-assets/skills/cfn-hook-pipeline/test-root-warning-resolution.sh +148 -0
  347. package/claude-assets/skills/cfn-hybrid-routing/README.md +50 -0
  348. package/claude-assets/skills/cfn-hybrid-routing/SKILL.md +46 -0
  349. package/claude-assets/skills/cfn-hybrid-routing/check-dependencies.sh +52 -0
  350. package/claude-assets/skills/cfn-hybrid-routing/config.json +26 -0
  351. package/claude-assets/skills/cfn-hybrid-routing/spawn-worker.sh +44 -0
  352. package/claude-assets/skills/cfn-improvement-recommender/SKILL.md +33 -0
  353. package/claude-assets/skills/cfn-improvement-recommender/recommend-improvements.sh +92 -0
  354. package/claude-assets/skills/cfn-intervention-detector/SKILL.md +39 -0
  355. package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +111 -0
  356. package/claude-assets/skills/cfn-intervention-orchestrator/SKILL.md +43 -0
  357. package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +59 -0
  358. package/claude-assets/skills/cfn-loop-orchestration/README.md +41 -0
  359. package/claude-assets/skills/cfn-loop-orchestration/SKILL.md +299 -0
  360. package/claude-assets/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +228 -0
  361. package/claude-assets/skills/cfn-loop-orchestration/helpers/consensus.sh +84 -0
  362. package/claude-assets/skills/cfn-loop-orchestration/helpers/context-injection.sh +142 -0
  363. package/claude-assets/skills/cfn-loop-orchestration/helpers/context-lookup.sh +359 -0
  364. package/claude-assets/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +71 -0
  365. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +90 -0
  366. package/claude-assets/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +87 -0
  367. package/claude-assets/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +271 -0
  368. package/claude-assets/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +51 -0
  369. package/claude-assets/skills/cfn-loop-orchestration/inject-loop-context.sh +41 -0
  370. package/claude-assets/skills/cfn-loop-orchestration/monitor-execution.sh +156 -0
  371. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +884 -0
  372. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +840 -0
  373. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +99 -0
  374. package/claude-assets/skills/cfn-loop-orchestration/test-cfn-orchestration.sh +281 -0
  375. package/claude-assets/skills/cfn-loop-orchestration/test-edge-cases.sh +188 -0
  376. package/claude-assets/skills/cfn-loop-validation/README.md +256 -0
  377. package/claude-assets/skills/cfn-loop-validation/SKILL.md +353 -0
  378. package/claude-assets/skills/cfn-loop-validation/check-dependencies.sh +31 -0
  379. package/claude-assets/skills/cfn-loop-validation/config.json +161 -0
  380. package/claude-assets/skills/cfn-loop-validation/consensus-calculator.js +477 -0
  381. package/claude-assets/skills/cfn-loop-validation/evidence-chain.sql +163 -0
  382. package/claude-assets/skills/cfn-loop-validation/examples/README.md +453 -0
  383. package/claude-assets/skills/cfn-loop-validation/examples/coordinator-full-cfn-loop.sh +234 -0
  384. package/claude-assets/skills/cfn-loop-validation/examples/coordinator-loop2-consensus.sh +132 -0
  385. package/claude-assets/skills/cfn-loop-validation/examples/coordinator-loop3-gate.sh +115 -0
  386. package/claude-assets/skills/cfn-loop-validation/examples/coordinator-redis-integration.sh +186 -0
  387. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -0
  388. package/claude-assets/skills/cfn-loop-validation/validate-iteration.sh +134 -0
  389. package/claude-assets/skills/cfn-loop-validation.sh +70 -0
  390. package/claude-assets/skills/cfn-loop2-output-processing/SKILL.md +163 -0
  391. package/claude-assets/skills/cfn-loop2-output-processing/execute-and-extract.sh +77 -0
  392. package/claude-assets/skills/cfn-loop2-output-processing/execute-and-extract.sh.backup +36 -0
  393. package/claude-assets/skills/cfn-loop2-output-processing/parse-feedback.sh +147 -0
  394. package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -0
  395. package/claude-assets/skills/cfn-loop2-output-processing/test-bug27-fix.sh +200 -0
  396. package/claude-assets/skills/cfn-loop2-output-processing/test-loop2-processing.sh +113 -0
  397. package/claude-assets/skills/cfn-loop3-output-processing/AGENT_COMPLETION_PROTOCOL.md +206 -0
  398. package/claude-assets/skills/cfn-loop3-output-processing/SKILL.md +421 -0
  399. package/claude-assets/skills/cfn-loop3-output-processing/calculate-confidence.sh +28 -0
  400. package/claude-assets/skills/cfn-loop3-output-processing/execute-and-extract.sh +85 -0
  401. package/claude-assets/skills/cfn-loop3-output-processing/parse-confidence.sh +31 -0
  402. package/claude-assets/skills/cfn-loop3-output-processing/test-agent-timeout.sh +327 -0
  403. package/claude-assets/skills/cfn-loop3-output-processing/test-loop3-processing.sh +155 -0
  404. package/claude-assets/skills/cfn-loop3-output-processing/verify-deliverables.sh +42 -0
  405. package/claude-assets/skills/cfn-marketing-ad-campaigns/SKILL.md +392 -0
  406. package/claude-assets/skills/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -0
  407. package/claude-assets/skills/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -0
  408. package/claude-assets/skills/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -0
  409. package/claude-assets/skills/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -0
  410. package/claude-assets/skills/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -0
  411. package/claude-assets/skills/cfn-marketing-analytics-data/SKILL.md +124 -0
  412. package/claude-assets/skills/cfn-marketing-analytics-data/operations/get-ad-performance.sh +105 -0
  413. package/claude-assets/skills/cfn-marketing-analytics-data/operations/get-conversion-funnel.sh +102 -0
  414. package/claude-assets/skills/cfn-marketing-analytics-data/operations/get-email-performance.sh +105 -0
  415. package/claude-assets/skills/cfn-marketing-analytics-data/operations/get-social-engagement.sh +105 -0
  416. package/claude-assets/skills/cfn-marketing-analytics-data/operations/get-website-traffic.sh +107 -0
  417. package/claude-assets/skills/cfn-marketing-chatbot-conversations/SKILL.md +340 -0
  418. package/claude-assets/skills/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -0
  419. package/claude-assets/skills/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -0
  420. package/claude-assets/skills/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -0
  421. package/claude-assets/skills/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -0
  422. package/claude-assets/skills/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -0
  423. package/claude-assets/skills/cfn-marketing-competitive-intel/SKILL.md +350 -0
  424. package/claude-assets/skills/cfn-marketing-competitive-intel/operations/get-backlink-profile.sh +154 -0
  425. package/claude-assets/skills/cfn-marketing-competitive-intel/operations/get-keyword-rankings.sh +173 -0
  426. package/claude-assets/skills/cfn-marketing-competitive-intel/operations/get-trending-topics.sh +147 -0
  427. package/claude-assets/skills/cfn-marketing-competitive-intel/operations/monitor-competitor.sh +146 -0
  428. package/claude-assets/skills/cfn-marketing-competitive-intel/operations/search-brand-mentions.sh +167 -0
  429. package/claude-assets/skills/cfn-marketing-crm-contacts/SKILL.md +116 -0
  430. package/claude-assets/skills/cfn-marketing-crm-contacts/operations/add-to-segment.sh +78 -0
  431. package/claude-assets/skills/cfn-marketing-crm-contacts/operations/create-contact.sh +113 -0
  432. package/claude-assets/skills/cfn-marketing-crm-contacts/operations/get-contact.sh +86 -0
  433. package/claude-assets/skills/cfn-marketing-crm-contacts/operations/remove-from-segment.sh +78 -0
  434. package/claude-assets/skills/cfn-marketing-crm-contacts/operations/update-contact.sh +120 -0
  435. package/claude-assets/skills/cfn-marketing-email-campaigns/SKILL.md +106 -0
  436. package/claude-assets/skills/cfn-marketing-email-campaigns/operations/create-campaign.sh +123 -0
  437. package/claude-assets/skills/cfn-marketing-email-campaigns/operations/get-campaign-stats.sh +66 -0
  438. package/claude-assets/skills/cfn-marketing-email-campaigns/operations/list-templates.sh +68 -0
  439. package/claude-assets/skills/cfn-marketing-email-campaigns/operations/schedule-campaign.sh +85 -0
  440. package/claude-assets/skills/cfn-marketing-email-campaigns/operations/send-test-email.sh +81 -0
  441. package/claude-assets/skills/cfn-marketing-landing-pages/SKILL.md +366 -0
  442. package/claude-assets/skills/cfn-marketing-landing-pages/operations/create-ab-test.sh +231 -0
  443. package/claude-assets/skills/cfn-marketing-landing-pages/operations/create-landing-page.sh +190 -0
  444. package/claude-assets/skills/cfn-marketing-landing-pages/operations/get-page-performance.sh +137 -0
  445. package/claude-assets/skills/cfn-marketing-landing-pages/operations/publish-page.sh +120 -0
  446. package/claude-assets/skills/cfn-marketing-landing-pages/operations/unpublish-page.sh +108 -0
  447. package/claude-assets/skills/cfn-marketing-media-monitoring/SKILL.md +202 -0
  448. package/claude-assets/skills/cfn-marketing-media-monitoring/operations/create-crisis-alert.sh +104 -0
  449. package/claude-assets/skills/cfn-marketing-media-monitoring/operations/export-report.sh +92 -0
  450. package/claude-assets/skills/cfn-marketing-media-monitoring/operations/get-sentiment-analysis.sh +85 -0
  451. package/claude-assets/skills/cfn-marketing-media-monitoring/operations/search-mentions.sh +86 -0
  452. package/claude-assets/skills/cfn-marketing-media-outreach/SKILL.md +168 -0
  453. package/claude-assets/skills/cfn-marketing-media-outreach/operations/search-journalists.sh +74 -0
  454. package/claude-assets/skills/cfn-marketing-media-outreach/operations/send-pitch.sh +80 -0
  455. package/claude-assets/skills/cfn-marketing-media-outreach/operations/submit-haro-response.sh +88 -0
  456. package/claude-assets/skills/cfn-marketing-media-outreach/operations/track-pitch-engagement.sh +66 -0
  457. package/claude-assets/skills/cfn-marketing-press-distribution/SKILL.md +159 -0
  458. package/claude-assets/skills/cfn-marketing-press-distribution/operations/distribute-press-release.sh +94 -0
  459. package/claude-assets/skills/cfn-marketing-press-distribution/operations/get-distribution-status.sh +59 -0
  460. package/claude-assets/skills/cfn-marketing-press-distribution/operations/get-pickup-metrics.sh +72 -0
  461. package/claude-assets/skills/cfn-marketing-press-distribution/operations/list-templates.sh +53 -0
  462. package/claude-assets/skills/cfn-marketing-sms-campaigns/SKILL.md +429 -0
  463. package/claude-assets/skills/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -0
  464. package/claude-assets/skills/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -0
  465. package/claude-assets/skills/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -0
  466. package/claude-assets/skills/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -0
  467. package/claude-assets/skills/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -0
  468. package/claude-assets/skills/cfn-marketing-social-publishing/SKILL.md +108 -0
  469. package/claude-assets/skills/cfn-marketing-social-publishing/operations/create-post.sh +104 -0
  470. package/claude-assets/skills/cfn-marketing-social-publishing/operations/delete-post.sh +76 -0
  471. package/claude-assets/skills/cfn-marketing-social-publishing/operations/get-post-stats.sh +66 -0
  472. package/claude-assets/skills/cfn-marketing-social-publishing/operations/schedule-post.sh +85 -0
  473. package/claude-assets/skills/cfn-marketing-social-publishing/operations/upload-media.sh +88 -0
  474. package/claude-assets/skills/cfn-pattern-extraction/SKILL.md +30 -0
  475. package/claude-assets/skills/cfn-pattern-extraction/extract-patterns.sh +80 -0
  476. package/claude-assets/skills/cfn-playbook/SKILL.md +113 -0
  477. package/claude-assets/skills/cfn-playbook/init-playbook.sh +54 -0
  478. package/claude-assets/skills/cfn-playbook/playbook.db +0 -0
  479. package/claude-assets/skills/cfn-playbook/query-playbook.sh +79 -0
  480. package/claude-assets/skills/cfn-playbook/update-playbook.sh +69 -0
  481. package/claude-assets/skills/cfn-playbook-auto-update/SKILL.md +29 -0
  482. package/claude-assets/skills/cfn-playbook-auto-update/auto-update-playbook.sh +86 -0
  483. package/claude-assets/skills/cfn-process-lifecycle/README.md +43 -0
  484. package/claude-assets/skills/cfn-process-lifecycle/SKILL.md +39 -0
  485. package/claude-assets/skills/cfn-process-lifecycle/check-dependencies.sh +58 -0
  486. package/claude-assets/skills/cfn-process-lifecycle/config.json +39 -0
  487. package/claude-assets/skills/cfn-process-lifecycle/process-manager.sh +144 -0
  488. package/claude-assets/skills/cfn-product-owner-decision/SKILL.md +332 -0
  489. package/claude-assets/skills/cfn-product-owner-decision/execute-decision.sh +176 -0
  490. package/claude-assets/skills/cfn-product-owner-decision/parse-decision.sh +66 -0
  491. package/claude-assets/skills/cfn-product-owner-decision/validate-deliverables.sh +82 -0
  492. package/claude-assets/skills/cfn-redis-coordination/AGENT_LOGGING.md +280 -0
  493. package/claude-assets/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +209 -0
  494. package/claude-assets/skills/cfn-redis-coordination/HEARTBEAT.md +57 -0
  495. package/claude-assets/skills/cfn-redis-coordination/HEARTBEAT_MONITORING.md +267 -0
  496. package/claude-assets/skills/cfn-redis-coordination/LOGGING.md +260 -0
  497. package/claude-assets/skills/cfn-redis-coordination/README.md +65 -0
  498. package/claude-assets/skills/cfn-redis-coordination/SECURITY_REVIEW.md +25 -0
  499. package/claude-assets/skills/cfn-redis-coordination/SHUTDOWN_HANDLING.md +164 -0
  500. package/claude-assets/skills/cfn-redis-coordination/SKILL.md +720 -0
  501. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +124 -0
  502. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +75 -0
  503. package/claude-assets/skills/cfn-redis-coordination/analyze-task-complexity.sh +277 -0
  504. package/claude-assets/skills/cfn-redis-coordination/cancel-swarm.sh +221 -0
  505. package/claude-assets/skills/cfn-redis-coordination/cfn-loop-exec.sh +468 -0
  506. package/claude-assets/skills/cfn-redis-coordination/cfn-loop-relaunch.sh +29 -0
  507. package/claude-assets/skills/cfn-redis-coordination/check-dependencies.sh +32 -0
  508. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +179 -0
  509. package/claude-assets/skills/cfn-redis-coordination/collect-results.sh +75 -0
  510. package/claude-assets/skills/cfn-redis-coordination/complete-swarm.sh +75 -0
  511. package/claude-assets/skills/cfn-redis-coordination/config.json +61 -0
  512. package/claude-assets/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
  513. package/claude-assets/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +82 -0
  514. package/claude-assets/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +274 -0
  515. package/claude-assets/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +276 -0
  516. package/claude-assets/skills/cfn-redis-coordination/demos/test-dlq.sh +129 -0
  517. package/claude-assets/skills/cfn-redis-coordination/demos/test-iteration-feedback.sh +320 -0
  518. package/claude-assets/skills/cfn-redis-coordination/demos/test-orchestrator.sh +249 -0
  519. package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake-phase4-unix.sh +148 -0
  520. package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake-phase4.sh +163 -0
  521. package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake.sh +138 -0
  522. package/claude-assets/skills/cfn-redis-coordination/demos/test-quick-fix.sh +81 -0
  523. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-absolute.sh +45 -0
  524. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-fallback.sh +68 -0
  525. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-percentage.sh +56 -0
  526. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-with-retry.sh +81 -0
  527. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum.sh +57 -0
  528. package/claude-assets/skills/cfn-redis-coordination/demos/test-shutdown-handling.sh +187 -0
  529. package/claude-assets/skills/cfn-redis-coordination/demos/test-shutdown.sh +160 -0
  530. package/claude-assets/skills/cfn-redis-coordination/demos/test-utils-unix.sh +97 -0
  531. package/claude-assets/skills/cfn-redis-coordination/demos/test-utils.sh +97 -0
  532. package/claude-assets/skills/cfn-redis-coordination/demos/test-waiting-mode.sh +59 -0
  533. package/claude-assets/skills/cfn-redis-coordination/examples/README.md +73 -0
  534. package/claude-assets/skills/cfn-redis-coordination/examples/grafana-dashboard.json +352 -0
  535. package/claude-assets/skills/cfn-redis-coordination/examples/hierarchical-pattern.sh +127 -0
  536. package/claude-assets/skills/cfn-redis-coordination/examples/mesh-pattern.sh +171 -0
  537. package/claude-assets/skills/cfn-redis-coordination/examples/timeout-handling.sh +227 -0
  538. package/claude-assets/skills/cfn-redis-coordination/examples/waiting-mode-pattern.sh +239 -0
  539. package/claude-assets/skills/cfn-redis-coordination/execute-product-owner-decision.sh +258 -0
  540. package/claude-assets/skills/cfn-redis-coordination/get-agent-timeout.sh +177 -0
  541. package/claude-assets/skills/cfn-redis-coordination/heartbeat-functions.sh +137 -0
  542. package/claude-assets/skills/cfn-redis-coordination/heartbeat-protocol.md +106 -0
  543. package/claude-assets/skills/cfn-redis-coordination/heartbeat.sh +126 -0
  544. package/claude-assets/skills/cfn-redis-coordination/init-swarm.sh +148 -0
  545. package/claude-assets/skills/cfn-redis-coordination/invoke-redis-pattern.sh +220 -0
  546. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +283 -0
  547. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh.backup-p7 +423 -0
  548. package/claude-assets/skills/cfn-redis-coordination/list-active-swarms.sh +147 -0
  549. package/claude-assets/skills/cfn-redis-coordination/log-event.sh +109 -0
  550. package/claude-assets/skills/cfn-redis-coordination/metrics-export.sh +674 -0
  551. package/claude-assets/skills/cfn-redis-coordination/metrics-schema.json +66 -0
  552. package/claude-assets/skills/cfn-redis-coordination/metrics-storage.md +31 -0
  553. package/claude-assets/skills/cfn-redis-coordination/monitor-cfn-violations.sh +391 -0
  554. package/claude-assets/skills/cfn-redis-coordination/monitor-heartbeats.sh +101 -0
  555. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop-v3.sh +141 -0
  556. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh +31 -0
  557. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup +38 -0
  558. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-1761167675 +1672 -0
  559. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-p5 +1604 -0
  560. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-phase1 +1550 -0
  561. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-phase2 +1621 -0
  562. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-phase3 +1621 -0
  563. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
  564. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.broken +1627 -0
  565. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.corrupted +80 -0
  566. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.deprecated +1864 -0
  567. package/claude-assets/skills/cfn-redis-coordination/priority-wake-mechanism.md +75 -0
  568. package/claude-assets/skills/cfn-redis-coordination/priority_wake.py +134 -0
  569. package/claude-assets/skills/cfn-redis-coordination/query-dlq.sh +162 -0
  570. package/claude-assets/skills/cfn-redis-coordination/query-logs.sh +103 -0
  571. package/claude-assets/skills/cfn-redis-coordination/redis-pattern.sh +619 -0
  572. package/claude-assets/skills/cfn-redis-coordination/retrieve-context.sh +58 -0
  573. package/claude-assets/skills/cfn-redis-coordination/select-specialist-agent.sh +371 -0
  574. package/claude-assets/skills/cfn-redis-coordination/semantic-match-tfidf.py +252 -0
  575. package/claude-assets/skills/cfn-redis-coordination/send-heartbeat.sh +165 -0
  576. package/claude-assets/skills/cfn-redis-coordination/signal.sh +38 -0
  577. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +86 -0
  578. package/claude-assets/skills/cfn-redis-coordination/store-epic-context.sh +123 -0
  579. package/claude-assets/skills/cfn-redis-coordination/test-context-injection.sh +354 -0
  580. package/claude-assets/skills/cfn-redis-coordination/test-timeout-enforcement.sh +513 -0
  581. package/claude-assets/skills/cfn-redis-coordination/tests/convert-line-endings.sh +15 -0
  582. package/claude-assets/skills/cfn-redis-coordination/tests/dlq-functionality-test.sh +102 -0
  583. package/claude-assets/skills/cfn-redis-coordination/tests/edge-cases-test.sh +99 -0
  584. package/claude-assets/skills/cfn-redis-coordination/tests/integration-test.sh +170 -0
  585. package/claude-assets/skills/cfn-redis-coordination/tests/retry-mechanism-test.sh +82 -0
  586. package/claude-assets/skills/cfn-redis-coordination/tests/run-test-suite.sh +92 -0
  587. package/claude-assets/skills/cfn-redis-coordination/tests/run-tests.sh +4 -0
  588. package/claude-assets/skills/cfn-redis-coordination/tests/test-heartbeat-monitoring.sh +418 -0
  589. package/claude-assets/skills/cfn-redis-coordination/tests/test-heartbeat-simple.sh +124 -0
  590. package/claude-assets/skills/cfn-redis-coordination/tests/test-primitives.sh +166 -0
  591. package/claude-assets/skills/cfn-redis-coordination/tests/test-utils.sh +54 -0
  592. package/claude-assets/skills/cfn-redis-coordination/tests/test_coordination_primitives.sh.deprecated +20 -0
  593. package/claude-assets/skills/cfn-redis-coordination/tests/test_utils.sh +49 -0
  594. package/claude-assets/skills/cfn-redis-coordination/v2_modularization/core_orchestration.sh +76 -0
  595. package/claude-assets/skills/cfn-redis-coordination/validate-parameters.sh +492 -0
  596. package/claude-assets/skills/cfn-retrospective-report/SKILL.md +31 -0
  597. package/claude-assets/skills/cfn-retrospective-report/generate-report.sh +101 -0
  598. package/claude-assets/skills/cfn-scope-simplifier/SKILL.md +37 -0
  599. package/claude-assets/skills/cfn-scope-simplifier/simplify-scope.sh +68 -0
  600. package/claude-assets/skills/cfn-simplified-agent-lifecycle/COST_ANALYSIS.md +49 -0
  601. package/claude-assets/skills/cfn-simplified-agent-lifecycle/DESIGN.md +98 -0
  602. package/claude-assets/skills/cfn-simplified-agent-lifecycle/MIGRATION_PLAN.md +74 -0
  603. package/claude-assets/skills/cfn-skill-builder/SKILL.md +910 -0
  604. package/claude-assets/skills/cfn-specialist-injection/SKILL.md +41 -0
  605. package/claude-assets/skills/cfn-specialist-injection/recommend-specialist.sh +57 -0
  606. package/claude-assets/skills/cfn-sprint-execution/SKILL.md +27 -0
  607. package/claude-assets/skills/cfn-sprint-execution/execute-sprint-task.sh +59 -0
  608. package/claude-assets/skills/cfn-sprint-execution/execute-sprint.sh +65 -0
  609. package/claude-assets/skills/cfn-sprint-planner/SKILL.md +37 -0
  610. package/claude-assets/skills/cfn-sprint-planner/plan-sprint.sh +85 -0
  611. package/claude-assets/skills/cfn-sqlite-memory/IMPLEMENTATION_REPORT.md +393 -0
  612. package/claude-assets/skills/cfn-sqlite-memory/QUICK_REFERENCE.md +204 -0
  613. package/claude-assets/skills/cfn-sqlite-memory/README.md +65 -0
  614. package/claude-assets/skills/cfn-sqlite-memory/SKILL.md +415 -0
  615. package/claude-assets/skills/cfn-sqlite-memory/acl-queries.sql +452 -0
  616. package/claude-assets/skills/cfn-sqlite-memory/check-dependencies.sh +36 -0
  617. package/claude-assets/skills/cfn-sqlite-memory/config.json +45 -0
  618. package/claude-assets/skills/cfn-sqlite-memory/memory-cli.sh +88 -0
  619. package/claude-assets/skills/cfn-sqlite-memory/test-state-persistence.js +187 -0
  620. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +274 -0
  621. package/claude-assets/skills/cfn-standardized-error-handling/SKILL.md +56 -0
  622. package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +87 -0
  623. package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +166 -0
  624. package/claude-assets/skills/cfn-task-classifier/SKILL.md +94 -0
  625. package/claude-assets/skills/cfn-task-classifier/USAGE.md +248 -0
  626. package/claude-assets/skills/cfn-task-classifier/classify-task.sh +291 -0
  627. package/claude-assets/skills/cfn-test-execution/README.md +129 -0
  628. package/claude-assets/skills/cfn-test-execution/SKILL.md +128 -0
  629. package/claude-assets/skills/cfn-test-execution/check-dependencies.sh +36 -0
  630. package/claude-assets/skills/cfn-test-execution/test-cache-reader.sh +134 -0
  631. package/claude-assets/skills/cfn-test-execution/test-concurrent-conflicts.sh +115 -0
  632. package/claude-assets/skills/cfn-test-execution/test-coordinator-pattern.sh +109 -0
  633. package/claude-assets/skills/cfn-transparency-middleware/Cargo.toml +18 -0
  634. package/claude-assets/skills/cfn-transparency-middleware/README.md +74 -0
  635. package/claude-assets/skills/cfn-transparency-middleware/SECURITY.md +41 -0
  636. package/claude-assets/skills/cfn-transparency-middleware/SKILL.md +91 -0
  637. package/claude-assets/skills/cfn-transparency-middleware/TEST_RESULTS.md +174 -0
  638. package/claude-assets/skills/cfn-transparency-middleware/config.json +31 -0
  639. package/claude-assets/skills/cfn-transparency-middleware/examples/basic-usage.ts +39 -0
  640. package/claude-assets/skills/cfn-transparency-middleware/examples/batch-processing.ts +52 -0
  641. package/claude-assets/skills/cfn-transparency-middleware/examples/custom-filtering.ts +61 -0
  642. package/claude-assets/skills/cfn-transparency-middleware/invoke-transparency-filter.sh +98 -0
  643. package/claude-assets/skills/cfn-transparency-middleware/invoke-transparency-init.sh +224 -0
  644. package/claude-assets/skills/cfn-transparency-middleware/invoke-transparency-level.sh +333 -0
  645. package/claude-assets/skills/cfn-transparency-middleware/invoke-transparency-metrics.sh +345 -0
  646. package/claude-assets/skills/cfn-transparency-middleware/invoke-transparency-observe.sh +140 -0
  647. package/claude-assets/skills/cfn-transparency-middleware/invoke-transparency-stop.sh +235 -0
  648. package/claude-assets/skills/cfn-transparency-middleware/memory_query.rs +85 -0
  649. package/claude-assets/skills/cfn-transparency-middleware/memory_repository.rs +140 -0
  650. package/claude-assets/skills/cfn-transparency-middleware/memory_schema.rs +64 -0
  651. package/claude-assets/skills/cfn-transparency-middleware/middleware-config.sh +29 -0
  652. package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +79 -0
  653. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +406 -0
  654. package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +162 -0
  655. package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +368 -0
  656. package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh.unix +126 -0
  657. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +93 -0
  658. package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +132 -0
  659. package/claude-assets/skills/cfn-validation-templates/SKILL.md +47 -0
  660. package/claude-assets/skills/cfn-validation-templates/content.json +38 -0
  661. package/claude-assets/skills/cfn-validation-templates/data.json +38 -0
  662. package/claude-assets/skills/cfn-validation-templates/design.json +38 -0
  663. package/claude-assets/skills/cfn-validation-templates/infrastructure.json +38 -0
  664. package/claude-assets/skills/cfn-validation-templates/research.json +38 -0
  665. package/claude-assets/skills/cfn-validation-templates/software.json +38 -0
  666. package/claude-assets/skills/cfn-web-portal/DESIGN.md +117 -0
  667. package/claude-assets/skills/cfn-web-portal/SKILL.md +679 -0
  668. package/claude-assets/skills/cfn-web-portal/invoke-portal-agents.sh +129 -0
  669. package/claude-assets/skills/cfn-web-portal/invoke-portal-dashboard.sh +85 -0
  670. package/claude-assets/skills/cfn-web-portal/invoke-portal-events.sh +125 -0
  671. package/claude-assets/skills/cfn-web-portal/invoke-portal-metrics.sh +112 -0
  672. package/claude-assets/skills/cfn-web-portal/invoke-portal-start.sh +135 -0
  673. package/claude-assets/skills/cfn-web-portal/invoke-portal-stop.sh +121 -0
  674. package/claude-assets/skills/cfn-web-portal/test-web-portal-skill.sh +51 -0
  675. package/claude-assets/skills/cfn-web-portal/validate-deployment.sh +85 -0
  676. package/claude-assets/skills/cfn-webapp-testing/README.md +142 -0
  677. package/claude-assets/skills/cfn-webapp-testing/SCREENSHOT_NAMING_CONVENTION.md +547 -0
  678. package/claude-assets/skills/cfn-webapp-testing/SKILL.md +877 -0
  679. package/claude-assets/skills/cfn-webapp-testing/capture-screenshot.sh +238 -0
  680. package/claude-assets/skills/cfn-webapp-testing/cfn-loop-integration.sh +265 -0
  681. package/claude-assets/skills/cfn-webapp-testing/compare-screenshots.sh +199 -0
  682. package/claude-assets/skills/cfn-webapp-testing/init-storage.sh +150 -0
  683. package/claude-assets/skills/cfn-webapp-testing/set-baseline.sh +196 -0
  684. package/claude-assets/skills/cfn-webapp-testing/test-webapp-testing.sh +233 -0
  685. package/claude-assets/skills/consensus-calculator.js +45 -0
  686. package/claude-assets/skills/evidence-chain.sql +66 -0
  687. package/claude-assets/skills/run-all-skill-tests.sh +124 -0
  688. package/claude-assets/skills/team-provider-routing/execute-agent.sh +76 -0
  689. package/claude-assets/skills/team-provider-routing/spawn-worker.sh +91 -0
  690. package/claude-assets/skills/test-execution-coordinator-pattern.md +228 -0
  691. package/dist/agents/agent-loader.js +165 -146
  692. package/dist/agents/agent-loader.js.map +1 -1
  693. package/package.json +3 -3
  694. package/scripts/init-project.js +7 -7
@@ -0,0 +1,1604 @@
1
+ #!/usr/bin/env bash
2
+
3
+ ##############################################################################
4
+ # CFN Loop Orchestration v2.0.0
5
+ # Manages multi-loop CFN execution with dependency tracking and consensus
6
+ #
7
+ # Usage:
8
+ # ./orchestrate-cfn-loop.sh --task-id <id> \
9
+ # --mode <mvp|standard|enterprise> \
10
+ # --loop3-agents <agent1,agent2,...> \
11
+ # --loop2-agents <agent1,agent2,...> \
12
+ # --product-owner <agent-id> \
13
+ # [--max-iterations <n>] \
14
+ # [--min-quorum-loop3 <n|n%|0.n>] \
15
+ # [--min-quorum-loop2 <n|n%|0.n>] \
16
+ # [--epic-context <json>] \
17
+ # [--phase-context <json>] \
18
+ # [--success-criteria <json>]
19
+ #
20
+ # CFN Loop Structure (CORRECTED):
21
+ # Loop 3 (Primary Swarm - Self Validation)
22
+ # ↓
23
+ # IF Loop 3 self-validation gate FAILS → RELAUNCH Loop 3 (skip Loop 2)
24
+ # IF Loop 3 self-validation gate PASSES → Proceed to Loop 2
25
+ # ↓
26
+ # Loop 2 (Consensus Validators)
27
+ # ↓
28
+ # Product Owner Decision
29
+ #
30
+ # Dependency Enforcement:
31
+ # - Loop 3 agents self-validate via confidence scores
32
+ # - Gate check determines if Loop 2 validators should be engaged
33
+ # - Loop 2 agents WAIT for gate pass signal before starting work
34
+ # - Product Owner BLOCKS until all Loop 2 agents signal completion
35
+ # - Uses Redis BLPOP for zero-token waiting
36
+ #
37
+ # Quorum Configuration:
38
+ # - Absolute: --min-quorum-loop3 3 (requires exactly 3 agents)
39
+ # - Percentage: --min-quorum-loop3 85% (requires 85% of agents)
40
+ # - Decimal: --min-quorum-loop3 0.66 (requires 66% of agents)
41
+ # - Default: 0.66 (2/3 majority) if not specified
42
+ #
43
+ # Agent Requirements:
44
+ # Loop 3 (Implementers):
45
+ # 1. Complete work
46
+ # 2. Signal done: redis-cli lpush "swarm:${TASK_ID}:${AGENT_ID}:done" "complete"
47
+ # 3. Report confidence: invoke-waiting-mode.sh report --confidence <0.0-1.0>
48
+ # 4. Enter waiting: invoke-waiting-mode.sh enter (for potential iteration)
49
+ #
50
+ # Loop 2 (Validators):
51
+ # 1. WAIT for gate pass: redis-cli blpop "swarm:${TASK_ID}:gate-passed" 0
52
+ # 2. Retrieve Loop 3 results for review
53
+ # 3. Perform validation
54
+ # 4. Signal done: redis-cli lpush "swarm:${TASK_ID}:${AGENT_ID}:done" "complete"
55
+ # 5. Report consensus: invoke-waiting-mode.sh report --confidence <0.0-1.0>
56
+ # 6. Enter waiting: invoke-waiting-mode.sh enter (for potential iteration)
57
+ ##############################################################################
58
+
59
+ set -euo pipefail
60
+
61
+ # Configuration
62
+ TASK_ID=""
63
+ MODE="standard"
64
+ LOOP3_AGENTS=""
65
+ LOOP2_AGENTS=""
66
+ PRODUCT_OWNER=""
67
+ MAX_ITERATIONS=10
68
+ TIMEOUT=3600 # 60 minute default timeout for agent completion
69
+ RETRY_COUNT=3
70
+ RETRY_DELAY=5000 # Base delay in milliseconds
71
+ MIN_QUORUM_LOOP3="" # Minimum agents required for Loop 3 (absolute or percentage)
72
+ MIN_QUORUM_LOOP2="" # Minimum agents required for Loop 2 (absolute or percentage)
73
+ ORCHESTRATOR_PID=$$
74
+ SHUTDOWN_MONITOR_PID=""
75
+ SHUTDOWN_REQUESTED=0
76
+ LOOP3_HEARTBEAT_MONITOR_PID=""
77
+ LOOP2_HEARTBEAT_MONITOR_PID=""
78
+
79
+ # Epic Context (optional - for agent system prompts)
80
+ EPIC_CONTEXT=""
81
+ PHASE_CONTEXT=""
82
+ SUCCESS_CRITERIA=""
83
+ EXPECTED_FILES="" # BUG #12 FIX: Explicit file verification
84
+ PHASE_ID="" # BUG #16 FIX: Phase identifier for timeout configuration
85
+
86
+ # Thresholds by mode
87
+ declare -A GATE_THRESHOLD=(
88
+ [mvp]=0.70
89
+ [standard]=0.75
90
+ [enterprise]=0.75
91
+ )
92
+
93
+ declare -A CONSENSUS_THRESHOLD=(
94
+ [mvp]=0.80
95
+ [standard]=0.90
96
+ [enterprise]=0.95
97
+ )
98
+
99
+ # Parse arguments
100
+ while [[ $# -gt 0 ]]; do
101
+ case $1 in
102
+ --task-id)
103
+ TASK_ID="$2"
104
+ shift 2
105
+ ;;
106
+ --mode)
107
+ MODE="$2"
108
+ shift 2
109
+ ;;
110
+ --loop3-agents)
111
+ LOOP3_AGENTS="$2"
112
+ shift 2
113
+ ;;
114
+ --loop2-agents)
115
+ LOOP2_AGENTS="$2"
116
+ shift 2
117
+ ;;
118
+ --product-owner)
119
+ PRODUCT_OWNER="$2"
120
+ shift 2
121
+ ;;
122
+ --max-iterations)
123
+ MAX_ITERATIONS="$2"
124
+ shift 2
125
+ ;;
126
+ --retry-count)
127
+ RETRY_COUNT="$2"
128
+ shift 2
129
+ ;;
130
+ --retry-delay)
131
+ RETRY_DELAY="$2"
132
+ shift 2
133
+ ;;
134
+ --timeout)
135
+ TIMEOUT="$2"
136
+ shift 2
137
+ ;;
138
+ --min-quorum-loop3)
139
+ MIN_QUORUM_LOOP3="$2"
140
+ shift 2
141
+ ;;
142
+ --min-quorum-loop2)
143
+ MIN_QUORUM_LOOP2="$2"
144
+ shift 2
145
+ ;;
146
+ --epic-context)
147
+ EPIC_CONTEXT="$2"
148
+ shift 2
149
+ ;;
150
+ --phase-context)
151
+ PHASE_CONTEXT="$2"
152
+ shift 2
153
+ ;;
154
+ --success-criteria)
155
+ SUCCESS_CRITERIA="$2"
156
+ shift 2
157
+ ;;
158
+ --expected-files)
159
+ EXPECTED_FILES="$2"
160
+ shift 2
161
+ ;;
162
+ --phase-id)
163
+ PHASE_ID="$2"
164
+ shift 2
165
+ ;;
166
+ *)
167
+ echo "Unknown option: $1"
168
+ exit 1
169
+ ;;
170
+ esac
171
+ done
172
+
173
+ # Validation
174
+ if [ -z "$TASK_ID" ] || [ -z "$LOOP3_AGENTS" ] || [ -z "$LOOP2_AGENTS" ] || [ -z "$PRODUCT_OWNER" ]; then
175
+ echo "Error: Required parameters missing"
176
+ echo "Usage: $0 --task-id <id> --mode <mode> --loop3-agents <agents> --loop2-agents <agents> --product-owner <agent>"
177
+ exit 1
178
+ fi
179
+
180
+ GATE=${GATE_THRESHOLD[$MODE]}
181
+ CONSENSUS=${CONSENSUS_THRESHOLD[$MODE]}
182
+
183
+ # Set default quorum values if not specified (66% = 2/3 majority)
184
+ MIN_QUORUM_LOOP3=${MIN_QUORUM_LOOP3:-0.66}
185
+ MIN_QUORUM_LOOP2=${MIN_QUORUM_LOOP2:-0.66}
186
+
187
+ ##############################################################################
188
+ # Shutdown Handling Functions
189
+ ##############################################################################
190
+ function cleanup_and_exit() {
191
+ local exit_code="${1:-130}"
192
+ local reason="${2:-user_interrupt}"
193
+
194
+ # Set shutdown flag to stop any ongoing operations
195
+ SHUTDOWN_REQUESTED=1
196
+
197
+ echo ""
198
+ echo "=============================================="
199
+ echo "🛑 Orchestrator shutting down gracefully..."
200
+ echo "=============================================="
201
+ echo "Reason: $reason"
202
+ echo "Exit Code: $exit_code"
203
+
204
+ # Kill shutdown monitor if running
205
+ if [ -n "$SHUTDOWN_MONITOR_PID" ] && kill -0 "$SHUTDOWN_MONITOR_PID" 2>/dev/null; then
206
+ kill "$SHUTDOWN_MONITOR_PID" 2>/dev/null || true
207
+ wait "$SHUTDOWN_MONITOR_PID" 2>/dev/null || true
208
+ fi
209
+
210
+ # Stop heartbeat monitors if running
211
+ if [ -n "${LOOP3_HEARTBEAT_MONITOR_PID:-}" ]; then
212
+ echo "Stopping Loop 3 heartbeat monitor..."
213
+ stop_heartbeat_monitor "$TASK_ID" "loop3" "$LOOP3_HEARTBEAT_MONITOR_PID"
214
+ fi
215
+ if [ -n "${LOOP2_HEARTBEAT_MONITOR_PID:-}" ]; then
216
+ echo "Stopping Loop 2 heartbeat monitor..."
217
+ stop_heartbeat_monitor "$TASK_ID" "loop2" "$LOOP2_HEARTBEAT_MONITOR_PID"
218
+ fi
219
+
220
+ # Mark swarm as cancelled if initialized
221
+ if [ -n "$TASK_ID" ] && [ -n "${SWARM_ID:-}" ]; then
222
+ echo "Marking swarm as cancelled..."
223
+ ./.claude/skills/redis-coordination/complete-swarm.sh \
224
+ --swarm-id "$SWARM_ID" \
225
+ --final-metric "status=cancelled" \
226
+ --final-metric "shutdown_reason=$reason" 2>/dev/null || echo " ⚠️ Failed to mark swarm as cancelled"
227
+ fi
228
+
229
+ # Clean up Redis keys
230
+ if [ -n "$TASK_ID" ]; then
231
+ echo "Cleaning up Redis keys..."
232
+ local keys_deleted=$(redis-cli --scan --pattern "swarm:${TASK_ID}:*" | xargs -r redis-cli DEL 2>/dev/null || echo "0")
233
+ echo " Deleted $keys_deleted Redis keys"
234
+ fi
235
+
236
+ # Clean up heartbeat monitor marker files
237
+ rm -f /tmp/heartbeat-monitor-${TASK_ID}-*.active 2>/dev/null || true
238
+
239
+ echo "=============================================="
240
+ echo "Shutdown complete"
241
+ echo "=============================================="
242
+
243
+ exit "$exit_code"
244
+ }
245
+
246
+ # Trap SIGTERM and SIGINT for graceful shutdown
247
+ trap 'echo "[TRAP] Caught SIGINT" >&2; cleanup_and_exit 130 "SIGINT_received"' SIGINT
248
+ trap 'echo "[TRAP] Caught SIGTERM" >&2; cleanup_and_exit 143 "SIGTERM_received"' SIGTERM
249
+
250
+ ##############################################################################
251
+ # Start Shutdown Monitor (Background Process)
252
+ ##############################################################################
253
+ function start_shutdown_monitor() {
254
+ local task_id="$1"
255
+
256
+ (
257
+ # Block on shutdown channel (zero-token waiting)
258
+ SHUTDOWN_KEY="swarm:${task_id}:shutdown"
259
+ SHUTDOWN_RESULT=$(redis-cli BLPOP "$SHUTDOWN_KEY" 0 2>/dev/null || echo "")
260
+
261
+ if [ -n "$SHUTDOWN_RESULT" ]; then
262
+ # Extract shutdown payload (format: key value)
263
+ SHUTDOWN_PAYLOAD=$(echo "$SHUTDOWN_RESULT" | tail -1)
264
+ REASON=$(echo "$SHUTDOWN_PAYLOAD" | jq -r '.reason // "external_shutdown"' 2>/dev/null || echo "external_shutdown")
265
+
266
+ echo ""
267
+ echo "🛑 Shutdown signal received from Redis channel: $REASON"
268
+ echo " Sending SIGTERM to orchestrator PID: $ORCHESTRATOR_PID"
269
+
270
+ # Send SIGTERM to main orchestrator process
271
+ if kill -TERM "$ORCHESTRATOR_PID" 2>/dev/null; then
272
+ echo " ✅ SIGTERM sent successfully"
273
+ else
274
+ echo " ❌ Failed to send SIGTERM (process may have already exited)"
275
+ exit 0
276
+ fi
277
+ fi
278
+ ) &
279
+
280
+ SHUTDOWN_MONITOR_PID=$!
281
+ echo "Shutdown monitor started (PID: $SHUTDOWN_MONITOR_PID)"
282
+ }
283
+
284
+ ##############################################################################
285
+ # Quorum Calculation Function
286
+ ##############################################################################
287
+ function calculate_quorum() {
288
+ local quorum_spec="$1"
289
+ local total_agents="$2"
290
+
291
+ # If no quorum specified, require all agents
292
+ if [ -z "$quorum_spec" ]; then
293
+ echo "$total_agents"
294
+ return 0
295
+ fi
296
+
297
+ # Check if percentage format (e.g., "85%")
298
+ if [[ "$quorum_spec" =~ %$ ]]; then
299
+ # Extract percentage value (remove % suffix)
300
+ local pct="${quorum_spec%\%}"
301
+ # Calculate: ceil(total_agents * pct / 100)
302
+ echo "scale=0; ($total_agents * $pct + 50) / 100" | bc
303
+ # Check if decimal (0.0-1.0), treat as fraction
304
+ elif [[ "$quorum_spec" =~ ^0?\.[0-9]+$ ]]; then
305
+ # Calculate: ceil(total_agents * fraction)
306
+ echo "scale=0; ($quorum_spec * $total_agents + 0.5) / 1" | bc
307
+ else
308
+ # Absolute number - validate it doesn't exceed total
309
+ if [ "$quorum_spec" -gt "$total_agents" ]; then
310
+ echo "Error: Quorum ($quorum_spec) exceeds total agents ($total_agents)" >&2
311
+ return 1
312
+ fi
313
+ echo "$quorum_spec"
314
+ fi
315
+ }
316
+
317
+ ##############################################################################
318
+ # Dead Letter Queue (DLQ) Functions
319
+ ##############################################################################
320
+ function write_to_dlq() {
321
+ local agent="$1"
322
+ local reason="$2"
323
+ local retry_count="$3"
324
+
325
+ DLQ_KEY="swarm:${TASK_ID}:dlq:${agent}"
326
+ DLQ_ENTRY=$(jq -n \
327
+ --arg reason "$reason" \
328
+ --arg retries "$retry_count" \
329
+ --arg ts "$(date +%s)" \
330
+ '{reason: $reason, retry_count: ($retries | tonumber), timestamp: ($ts | tonumber)}')
331
+
332
+ echo "$DLQ_ENTRY" | redis-cli -x LPUSH "$DLQ_KEY" >/dev/null
333
+ redis-cli EXPIRE "$DLQ_KEY" 604800 >/dev/null # 7 days TTL
334
+
335
+ echo " ❌ $agent → DLQ (reason: $reason, retries: $retry_count)"
336
+ }
337
+
338
+ ##############################################################################
339
+ # Exponential Backoff Retry Function
340
+ ##############################################################################
341
+ function retry_with_backoff() {
342
+ local agent="$1"
343
+ local attempt="$2"
344
+ local max_retries="$3"
345
+ local base_delay="$4"
346
+
347
+ # Check for shutdown before sleeping
348
+ if [ "$SHUTDOWN_REQUESTED" -eq 1 ]; then
349
+ echo " [SHUTDOWN] Skipping backoff delay for $agent" >&2
350
+ return 0
351
+ fi
352
+
353
+ # Exponential backoff: delay = base_delay * (2 ^ attempt)
354
+ local delay=$(echo "$base_delay * (2 ^ $attempt)" | bc)
355
+ local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
356
+
357
+ echo " [$timestamp] [Retry $attempt/$max_retries] Waiting ${delay}ms before retry for $agent..."
358
+
359
+ # Use interruptible sleep - sleep in small increments and check for shutdown
360
+ local delay_sec=$(echo "scale=3; $delay / 1000" | bc)
361
+ local elapsed=0
362
+ while (( $(echo "$elapsed < $delay_sec" | bc -l) )); do
363
+ # Sleep for 0.5s increments (or remaining time if less)
364
+ local remaining=$(echo "$delay_sec - $elapsed" | bc)
365
+ local sleep_time=$(echo "if ($remaining < 0.5) $remaining else 0.5" | bc)
366
+
367
+ sleep "$sleep_time" &
368
+ wait $! 2>/dev/null || return 0 # If wait is interrupted (SIGTERM), return immediately
369
+
370
+ elapsed=$(echo "$elapsed + $sleep_time" | bc)
371
+
372
+ # Check for shutdown after each sleep increment
373
+ if [ "$SHUTDOWN_REQUESTED" -eq 1 ]; then
374
+ echo " [SHUTDOWN] Interrupted backoff delay for $agent" >&2
375
+ return 0
376
+ fi
377
+ done
378
+ }
379
+
380
+ ##############################################################################
381
+ # Heartbeat Monitoring Functions
382
+ ##############################################################################
383
+ declare -A MISSED_HEARTBEATS # Track missed heartbeats per agent
384
+
385
+ function check_agent_heartbeat() {
386
+ local agent="$1"
387
+ local task_id="$2"
388
+ local iteration="$3"
389
+
390
+ # Agents create heartbeat as: swarm:${task_id}:agent:${agent_id} (HASH with heartbeat field)
391
+ # Agent ID includes iteration suffix: react-frontend-engineer-1
392
+ HB_KEY="swarm:${task_id}:agent:${agent}-${iteration}"
393
+ HB_DATA=$(redis-cli HGET "$HB_KEY" heartbeat 2>/dev/null || echo "")
394
+
395
+ if [ -z "$HB_DATA" ] || [ "$HB_DATA" = "(nil)" ]; then
396
+ return 1 # Dead
397
+ else
398
+ return 0 # Alive
399
+ fi
400
+ }
401
+
402
+ function check_heartbeats_loop() {
403
+ local task_id="$1"
404
+ local loop_name="$2"
405
+ local iteration="$3"
406
+ shift 3
407
+ local agents=("$@")
408
+
409
+ for AGENT in "${agents[@]}"; do
410
+ # Skip agents already marked as failed
411
+ if [[ " ${LOOP3_FAILED_AGENTS[@]} ${LOOP2_FAILED_AGENTS[@]} " =~ " ${AGENT} " ]]; then
412
+ continue
413
+ fi
414
+
415
+ if ! check_agent_heartbeat "$AGENT" "$task_id" "$iteration"; then
416
+ MISSED_HEARTBEATS["$AGENT"]=$((${MISSED_HEARTBEATS["$AGENT"]:-0} + 1))
417
+
418
+ if [ ${MISSED_HEARTBEATS["$AGENT"]} -ge 2 ]; then
419
+ local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
420
+ echo " [$timestamp] [$loop_name] ⚠️ $AGENT appears hung (no heartbeat for 60s)" >&2
421
+
422
+ # Determine which loop this agent belongs to and check quorum
423
+ if [[ " ${LOOP3_AGENTS} " =~ " ${AGENT} " ]]; then
424
+ REMAINING=$((${#LOOP3_COMPLETED_AGENTS[@]}))
425
+ REQUIRED=$(calculate_quorum "$MIN_QUORUM_LOOP3" "$LOOP3_TOTAL")
426
+ elif [[ " ${LOOP2_AGENTS} " =~ " ${AGENT} " ]]; then
427
+ # Safety check: Skip if Loop 2 hasn't been initialized yet
428
+ if [ -z "${LOOP2_COMPLETED_AGENTS+x}" ]; then
429
+ continue
430
+ fi
431
+ REMAINING=$((${#LOOP2_COMPLETED_AGENTS[@]}))
432
+ REQUIRED=$(calculate_quorum "$MIN_QUORUM_LOOP2" "$LOOP2_TOTAL")
433
+ else
434
+ continue
435
+ fi
436
+
437
+ if [ $REMAINING -ge $REQUIRED ]; then
438
+ echo " [$timestamp] [$loop_name] ℹ️ Continuing with quorum (${REMAINING}/${REQUIRED} agents)" >&2
439
+ else
440
+ echo " [$timestamp] [$loop_name] ⚠️ Cannot meet quorum without $AGENT (${REMAINING}/${REQUIRED})" >&2
441
+ fi
442
+ fi
443
+ else
444
+ MISSED_HEARTBEATS["$AGENT"]=0 # Reset counter
445
+ fi
446
+ done
447
+ }
448
+
449
+ function start_heartbeat_monitor() {
450
+ local task_id="$1"
451
+ local loop_name="$2"
452
+ local iteration="$3"
453
+ shift 3
454
+ local agents=("$@")
455
+
456
+ # Create marker file for this monitor
457
+ local monitor_marker="/tmp/heartbeat-monitor-${task_id}-${loop_name}.active"
458
+ touch "$monitor_marker"
459
+
460
+ # [BUG #7 FIX] Spawn background process and let caller capture $!
461
+ (
462
+ while [ -f "$monitor_marker" ]; do
463
+ # Check for shutdown
464
+ if [ "$SHUTDOWN_REQUESTED" -eq 1 ]; then
465
+ break
466
+ fi
467
+
468
+ check_heartbeats_loop "$task_id" "$loop_name" "$iteration" "${agents[@]}"
469
+ sleep 30
470
+ done
471
+ ) &
472
+
473
+ # No echo - caller will use $! to get PID
474
+ }
475
+
476
+ function stop_heartbeat_monitor() {
477
+ local task_id="$1"
478
+ local loop_name="$2"
479
+ local monitor_pid="$3"
480
+
481
+ # Remove marker file to stop the monitor loop
482
+ rm -f "/tmp/heartbeat-monitor-${task_id}-${loop_name}.active"
483
+
484
+ # Kill monitor process if still running
485
+ if [ -n "$monitor_pid" ] && kill -0 "$monitor_pid" 2>/dev/null; then
486
+ kill "$monitor_pid" 2>/dev/null || true
487
+ wait "$monitor_pid" 2>/dev/null || true
488
+ fi
489
+ }
490
+
491
+ ##############################################################################
492
+ # Get Agent-Specific Timeout
493
+ ##############################################################################
494
+ function get_agent_timeout() {
495
+ local agent="$1"
496
+ local task_id="$2"
497
+
498
+ # Use get-agent-timeout.sh helper script
499
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
500
+ AGENT_TIMEOUT=$("$SCRIPT_DIR/get-agent-timeout.sh" --task-id "$task_id" --agent-id "$agent" 2>/dev/null || echo "$TIMEOUT")
501
+
502
+ echo "$AGENT_TIMEOUT"
503
+ }
504
+
505
+ ##############################################################################
506
+ # Process-Based Completion Monitoring
507
+ ##############################################################################
508
+ function monitor_agent_process() {
509
+ local agent_id="$1"
510
+ local agent_pid="$2"
511
+ local task_id="$3"
512
+ local done_key="$4"
513
+
514
+ # Monitor agent process in background
515
+ (
516
+ # Wait for process to exit
517
+ wait "$agent_pid" 2>/dev/null
518
+ EXIT_CODE=$?
519
+
520
+ # Check if done signal already sent (agent may have signaled normally)
521
+ DONE_COUNT=$(redis-cli LLEN "$done_key" 2>/dev/null || echo "0")
522
+ if [ "$DONE_COUNT" -gt 0 ]; then
523
+ # Agent signaled normally - nothing to do
524
+ exit 0
525
+ fi
526
+
527
+ # Process exited without signaling - auto-complete
528
+ if [ $EXIT_CODE -eq 0 ]; then
529
+ echo " [Process Monitor] $agent_id exited successfully (code 0) - auto-signaling completion" >&2
530
+ redis-cli LPUSH "$done_key" "auto-completed-success" >/dev/null
531
+ else
532
+ echo " [Process Monitor] $agent_id exited with error (code $EXIT_CODE) - auto-signaling failure" >&2
533
+ redis-cli LPUSH "$done_key" "auto-completed-error:$EXIT_CODE" >/dev/null
534
+
535
+ # METRICS: Increment error counter
536
+ redis-cli INCR "swarm:${task_id}:metrics:agent_errors" >/dev/null
537
+ fi
538
+ ) &
539
+ }
540
+
541
+ ##############################################################################
542
+ # BLPOP with Retry Logic + Process Monitoring
543
+ ##############################################################################
544
+ function blpop_with_retry() {
545
+ local agent="$1"
546
+ local done_key="$2"
547
+ local timeout="$3"
548
+ local retry_count="$4"
549
+ local retry_delay="$5"
550
+ local agent_pid="${6:-}" # Optional: PID for process monitoring
551
+
552
+ for ATTEMPT in $(seq 1 $retry_count); do
553
+ # Check for shutdown before attempting BLPOP
554
+ if [ "$SHUTDOWN_REQUESTED" -eq 1 ]; then
555
+ echo " [SHUTDOWN] Aborting BLPOP for $agent" >&2
556
+ return 1
557
+ fi
558
+
559
+ # Use Redis's native BLPOP timeout instead of shell timeout command
560
+ # This allows SIGTERM to properly interrupt the process
561
+ RESULT=$(redis-cli blpop "$done_key" "$timeout" 2>/dev/null || echo "")
562
+
563
+ if [ -n "$RESULT" ]; then
564
+ echo "$RESULT"
565
+ return 0 # Success
566
+ fi
567
+
568
+ # BLPOP timeout - check if process is still alive
569
+ if [ -n "$agent_pid" ]; then
570
+ if ! kill -0 "$agent_pid" 2>/dev/null; then
571
+ echo " [Process Check] Agent process $agent_pid no longer running" >&2
572
+
573
+ # Process exited - check if done signal was auto-generated
574
+ RESULT=$(redis-cli LPOP "$done_key" 2>/dev/null || echo "")
575
+ if [ -n "$RESULT" ]; then
576
+ echo " [Auto-Complete] Retrieved: $RESULT" >&2
577
+ echo "$RESULT"
578
+ return 0
579
+ fi
580
+ fi
581
+ fi
582
+
583
+ # Check for shutdown after BLPOP timeout
584
+ if [ "$SHUTDOWN_REQUESTED" -eq 1 ]; then
585
+ echo " [SHUTDOWN] Aborting retry for $agent" >&2
586
+ return 1
587
+ fi
588
+
589
+ # Check heartbeat status
590
+ HEARTBEAT_KEY="swarm:${TASK_ID}:${agent}:heartbeat"
591
+ HEARTBEAT_EXISTS=$(redis-cli EXISTS "$HEARTBEAT_KEY" 2>/dev/null || echo "0")
592
+
593
+ if [ "$HEARTBEAT_EXISTS" -eq 0 ]; then
594
+ echo " ⚠️ No heartbeat from $agent - agent may be stuck or crashed" >&2
595
+
596
+ # If we have PID and process is stuck, kill it
597
+ if [ -n "$agent_pid" ] && kill -0 "$agent_pid" 2>/dev/null; then
598
+ echo " [Timeout Kill] Terminating stuck process $agent_pid" >&2
599
+ kill "$agent_pid" 2>/dev/null || true
600
+ sleep 2
601
+
602
+ # Force kill if still alive
603
+ if kill -0 "$agent_pid" 2>/dev/null; then
604
+ kill -9 "$agent_pid" 2>/dev/null || true
605
+ fi
606
+
607
+ # METRICS: Increment timeout counter
608
+ redis-cli INCR "swarm:${TASK_ID}:metrics:agent_killed" >/dev/null
609
+ fi
610
+ fi
611
+
612
+ # Log retry attempt (to stderr so it's visible during command substitution)
613
+ local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
614
+ echo " [$timestamp] ⚠️ BLPOP attempt $ATTEMPT/$retry_count failed for $agent" >&2
615
+
616
+ if [ $ATTEMPT -lt $retry_count ]; then
617
+ # METRICS: Increment retry counter
618
+ redis-cli INCR "swarm:${TASK_ID}:metrics:retry_count" >/dev/null
619
+
620
+ retry_with_backoff "$agent" "$ATTEMPT" "$retry_count" "$retry_delay" >&2
621
+ else
622
+ # Final failure - write to DLQ
623
+ echo " [$timestamp] ❌ FINAL FAILURE: $agent after $retry_count attempts" >&2
624
+ write_to_dlq "$agent" "timeout_after_retries" "$retry_count"
625
+ return 1
626
+ fi
627
+ done
628
+
629
+ return 1
630
+ }
631
+
632
+ echo "=== CFN Loop Orchestration ==="
633
+ echo "Task ID: $TASK_ID"
634
+ echo "Mode: $MODE (Gate: $GATE, Consensus: $CONSENSUS)"
635
+ echo "Max Iterations: $MAX_ITERATIONS"
636
+ echo ""
637
+
638
+ # Initialize swarm using general Redis coordination primitive
639
+ SWARM_ID="swarm-${TASK_ID}"
640
+ ALL_AGENTS="${LOOP3_AGENTS},${LOOP2_AGENTS},${PRODUCT_OWNER}"
641
+
642
+ # LOG: Swarm initialization
643
+ ./.claude/skills/redis-coordination/log-event.sh \
644
+ --task-id "$TASK_ID" \
645
+ --event-type "swarm_init" \
646
+ --details "{\"mode\": \"$MODE\", \"loop3_agents\": \"$LOOP3_AGENTS\", \"loop2_agents\": \"$LOOP2_AGENTS\", \"product_owner\": \"$PRODUCT_OWNER\", \"max_iterations\": $MAX_ITERATIONS, \"gate_threshold\": $GATE, \"consensus_threshold\": $CONSENSUS}" \
647
+ --level "INFO" 2>/dev/null || true
648
+
649
+ # Build CFN-specific metadata
650
+ CFN_METADATA=$(cat <<EOF
651
+ {
652
+ "mode": "$MODE",
653
+ "loop3_agents": "$LOOP3_AGENTS",
654
+ "loop2_agents": "$LOOP2_AGENTS",
655
+ "product_owner": "$PRODUCT_OWNER",
656
+ "workflow_type": "cfn_loop"
657
+ }
658
+ EOF
659
+ )
660
+
661
+ # Use general init-swarm primitive
662
+ ./.claude/skills/redis-coordination/init-swarm.sh \
663
+ --swarm-id "$SWARM_ID" \
664
+ --agents "$ALL_AGENTS" \
665
+ --task-id "$TASK_ID" \
666
+ --topology "hierarchical" \
667
+ --metadata "$CFN_METADATA" > /dev/null
668
+
669
+ # Start shutdown monitor in background
670
+ start_shutdown_monitor "$TASK_ID"
671
+
672
+ # Store epic context in Redis (if provided)
673
+ if [ -n "$EPIC_CONTEXT" ]; then
674
+ echo "📋 Storing epic context in Redis..."
675
+ # Escape single quotes for Redis
676
+ EPIC_ESCAPED="${EPIC_CONTEXT//\'/\'\\\'\'}"
677
+ redis-cli setex "swarm:${TASK_ID}:epic-context" 604800 "$EPIC_ESCAPED" >/dev/null
678
+ echo " ✅ Epic context stored (TTL: 7 days)"
679
+ fi
680
+
681
+ if [ -n "$PHASE_CONTEXT" ]; then
682
+ echo "📋 Storing phase context in Redis..."
683
+ PHASE_ESCAPED="${PHASE_CONTEXT//\'/\'\\\'\'}"
684
+ redis-cli setex "swarm:${TASK_ID}:phase-context" 604800 "$PHASE_ESCAPED" >/dev/null
685
+ echo " ✅ Phase context stored (TTL: 7 days)"
686
+ fi
687
+
688
+ if [ -n "$SUCCESS_CRITERIA" ]; then
689
+ echo "📋 Storing success criteria in Redis..."
690
+ CRITERIA_ESCAPED="${SUCCESS_CRITERIA//\'/\'\\\'\'}"
691
+ redis-cli setex "swarm:${TASK_ID}:success-criteria" 604800 "$CRITERIA_ESCAPED" >/dev/null
692
+ echo " ✅ Success criteria stored (TTL: 7 days)"
693
+ fi
694
+
695
+ echo ""
696
+
697
+ # [BUG #15 FIX] REMOVED: Early Product Owner spawn at iteration 0
698
+ # Product Owner now only spawned after Loop 2 completes (see line 1283)
699
+ # This prevents timeout issues with waiting mode initialization
700
+ echo "[Product Owner] Will spawn after Loop 2 consensus (just-in-time pattern)"
701
+ echo ""
702
+
703
+ # Iteration loop
704
+ for ITERATION in $(seq 1 $MAX_ITERATIONS); do
705
+ echo "=== Iteration $ITERATION/$MAX_ITERATIONS ==="
706
+
707
+ # METRICS: Iteration start timestamp
708
+ ITERATION_START=$(date +%s%N | cut -b1-13) # milliseconds
709
+ redis-cli LPUSH "swarm:${TASK_ID}:metrics:iteration_start" "$ITERATION_START" >/dev/null
710
+
711
+ # Step 1: Build detailed agent context from Redis (BUG #20 FIX - Option 2)
712
+ echo "[Loop 3] Building agent context from Redis..."
713
+
714
+ # Retrieve stored context
715
+ EPIC_CTX=$(redis-cli get "swarm:${TASK_ID}:epic-context" 2>/dev/null || echo "{}")
716
+ PHASE_CTX=$(redis-cli get "swarm:${TASK_ID}:phase-context" 2>/dev/null || echo "{}")
717
+ SUCCESS_CTX=$(redis-cli get "swarm:${TASK_ID}:success-criteria" 2>/dev/null || echo "{}")
718
+
719
+ # Extract key fields with jq (safe parsing)
720
+ EPIC_GOAL=$(echo "$EPIC_CTX" | jq -r '.epicGoal // "No epic goal specified"')
721
+ IN_SCOPE=$(echo "$EPIC_CTX" | jq -r '.inScope[]? // empty' | sed 's/^/- /' || echo "- (not specified)")
722
+ OUT_SCOPE=$(echo "$EPIC_CTX" | jq -r '.outOfScope[]? // empty' | sed 's/^/- /' || echo "- (not specified)")
723
+ DELIVERABLES=$(echo "$PHASE_CTX" | jq -r '.deliverables[]? // empty' | sed 's/^/- /' || echo "- (not specified)")
724
+ DIRECTORY=$(echo "$PHASE_CTX" | jq -r '.directory // ""')
725
+ ACCEPTANCE=$(echo "$SUCCESS_CTX" | jq -r '.acceptanceCriteria[]? // empty' | sed 's/^/- /' || echo "- (not specified)")
726
+
727
+ # Build structured agent context
728
+ LOOP3_AGENT_CONTEXT="Loop 3 implementation for iteration $ITERATION
729
+
730
+ Epic Goal: $EPIC_GOAL
731
+
732
+ In Scope:
733
+ $IN_SCOPE
734
+
735
+ Out of Scope:
736
+ $OUT_SCOPE
737
+
738
+ Deliverables (CRITICAL - you MUST create these files):
739
+ $DELIVERABLES
740
+ $([ -n "$DIRECTORY" ] && echo "
741
+ Target Directory: $DIRECTORY")
742
+
743
+ Acceptance Criteria:
744
+ $ACCEPTANCE
745
+
746
+ IMPORTANT:
747
+ - Use Write tool to create each deliverable file
748
+ - Verify files created with 'ls -la \$DIRECTORY' after each Write
749
+ - All deliverables must exist for validation to pass
750
+ - Report confidence score based on actual file creation
751
+ "
752
+
753
+ echo " ✅ Agent context built ($(echo "$LOOP3_AGENT_CONTEXT" | wc -c) characters)"
754
+ echo ""
755
+
756
+ # Step 2: Spawn Loop 3 agents via CLI
757
+ echo "[Loop 3] Spawning implementers via CLI..."
758
+ IFS=',' read -ra AGENTS <<< "$LOOP3_AGENTS"
759
+
760
+ # Track instance counts to generate unique agent IDs for duplicate agent types
761
+ declare -A AGENT_INSTANCE_COUNTS
762
+ declare -A AGENT_IDS # Map from array index to unique agent ID
763
+
764
+ # Pre-calculate unique agent IDs
765
+ for i in "${!AGENTS[@]}"; do
766
+ AGENT="${AGENTS[$i]}"
767
+
768
+ # Increment instance counter for this agent type
769
+ AGENT_INSTANCE_COUNTS["$AGENT"]=$((${AGENT_INSTANCE_COUNTS["$AGENT"]:-0} + 1))
770
+ INSTANCE_NUM="${AGENT_INSTANCE_COUNTS["$AGENT"]}"
771
+
772
+ # Generate unique agent ID: agent-type-iteration-instance
773
+ UNIQUE_AGENT_ID="${AGENT}-${ITERATION}-${INSTANCE_NUM}"
774
+ AGENT_IDS["$i"]="$UNIQUE_AGENT_ID"
775
+
776
+ echo " [Instance Tracking] ${AGENT} #${INSTANCE_NUM} → ${UNIQUE_AGENT_ID}"
777
+ done
778
+
779
+ echo ""
780
+
781
+ # [PHASE 1 INTEGRATION] Loop 3 Skill-Based Output Processing (Parallel)
782
+ # Uses .claude/skills/loop3-output-processing/ for guaranteed confidence extraction
783
+ echo "[Loop 3] Using skill-based output processing (parallel execution)"
784
+
785
+ LOOP3_TOTAL=${#AGENTS[@]}
786
+ LOOP3_REQUIRED=$(calculate_quorum "$MIN_QUORUM_LOOP3" "$LOOP3_TOTAL")
787
+ LOOP3_COMPLETED_AGENTS=()
788
+ LOOP3_FAILED_AGENTS=()
789
+
790
+ echo "[Loop 3] Quorum: $LOOP3_REQUIRED/$LOOP3_TOTAL agents required"
791
+ echo ""
792
+
793
+ # Step 2a: Spawn all agents in parallel (background processes)
794
+ declare -A AGENT_PIDS
795
+ declare -A AGENT_OUTPUT_FILES
796
+
797
+ for i in "${!AGENTS[@]}"; do
798
+ AGENT="${AGENTS[$i]}"
799
+ UNIQUE_AGENT_ID="${AGENT_IDS[$i]}"
800
+
801
+ # Get agent-specific timeout
802
+ AGENT_TIMEOUT=$(get_agent_timeout "$AGENT" "$TASK_ID")
803
+
804
+ # Create temp file for agent output
805
+ OUTPUT_FILE="/tmp/loop3-${TASK_ID}-${UNIQUE_AGENT_ID}.json"
806
+ AGENT_OUTPUT_FILES["$UNIQUE_AGENT_ID"]="$OUTPUT_FILE"
807
+
808
+ echo " Spawning $AGENT (ID: $UNIQUE_AGENT_ID, timeout: ${AGENT_TIMEOUT}s)"
809
+
810
+ # LOG: Loop 3 agent spawn
811
+ ./.claude/skills/redis-coordination/log-event.sh \
812
+ --task-id "$TASK_ID" \
813
+ --event-type "agent_spawn" \
814
+ --loop "loop3" \
815
+ --agent-id "$UNIQUE_AGENT_ID" \
816
+ --iteration "$ITERATION" \
817
+ --details "{\"agent_type\": \"$AGENT\", \"timeout\": $AGENT_TIMEOUT}" \
818
+ --level "INFO" 2>/dev/null || true
819
+
820
+ # Execute agent via Loop 3 skill in background
821
+ (
822
+ # Record start time
823
+ START_TIME=$(date +%s%N | cut -b1-13)
824
+
825
+ # Execute skill (BUG #20 FIX - inject detailed context)
826
+ if SKILL_RESULT=$(./.claude/skills/loop3-output-processing/execute-and-extract.sh \
827
+ --agent-type "$AGENT" \
828
+ --task-id "$TASK_ID" \
829
+ --agent-id "$UNIQUE_AGENT_ID" \
830
+ --context "$LOOP3_AGENT_CONTEXT" \
831
+ --iteration "$ITERATION" \
832
+ --timeout "$AGENT_TIMEOUT" 2>&1); then
833
+
834
+ # Record end time
835
+ END_TIME=$(date +%s%N | cut -b1-13)
836
+ LATENCY=$((END_TIME - START_TIME))
837
+
838
+ # Add latency to result
839
+ RESULT_WITH_LATENCY=$(echo "$SKILL_RESULT" | jq --arg latency "$LATENCY" '. + {latency_ms: ($latency | tonumber)}')
840
+
841
+ # Save to temp file
842
+ echo "$RESULT_WITH_LATENCY" > "$OUTPUT_FILE"
843
+
844
+ # Store result in Redis
845
+ echo "$RESULT_WITH_LATENCY" | redis-cli -x LPUSH "swarm:${TASK_ID}:${UNIQUE_AGENT_ID}:result" >/dev/null
846
+ redis-cli LPUSH "swarm:${TASK_ID}:${UNIQUE_AGENT_ID}:done" "complete" >/dev/null
847
+
848
+ exit 0
849
+ else
850
+ # Skill failed - save error
851
+ echo "{\"error\": true, \"output\": \"$SKILL_RESULT\"}" > "$OUTPUT_FILE"
852
+ exit 1
853
+ fi
854
+ ) &
855
+
856
+ AGENT_PIDS["$UNIQUE_AGENT_ID"]=$!
857
+ echo " ✅ Spawned $UNIQUE_AGENT_ID (PID: ${AGENT_PIDS[$UNIQUE_AGENT_ID]})"
858
+ done
859
+
860
+ echo ""
861
+ echo "[Loop 3] All agents spawned, waiting for completion..."
862
+ echo ""
863
+
864
+ # Step 2b: Wait for all agents to complete
865
+ for i in "${!AGENTS[@]}"; do
866
+ AGENT="${AGENTS[$i]}"
867
+ UNIQUE_AGENT_ID="${AGENT_IDS[$i]}"
868
+ AGENT_PID="${AGENT_PIDS[$UNIQUE_AGENT_ID]}"
869
+ OUTPUT_FILE="${AGENT_OUTPUT_FILES[$UNIQUE_AGENT_ID]}"
870
+
871
+ echo " Waiting for $UNIQUE_AGENT_ID (PID: $AGENT_PID)..."
872
+
873
+ # Wait for specific agent process
874
+ if wait "$AGENT_PID" 2>/dev/null; then
875
+ # Success - read result from temp file
876
+ if [ -f "$OUTPUT_FILE" ]; then
877
+ SKILL_RESULT=$(cat "$OUTPUT_FILE")
878
+
879
+ # Check if result has error flag
880
+ HAS_ERROR=$(echo "$SKILL_RESULT" | jq -r '.error // false')
881
+
882
+ if [ "$HAS_ERROR" = "false" ]; then
883
+ # Extract metrics
884
+ CONFIDENCE=$(echo "$SKILL_RESULT" | jq -r '.confidence')
885
+ FILES_CHANGED=$(echo "$SKILL_RESULT" | jq -r '.files_changed')
886
+ CONFIDENCE_SOURCE=$(echo "$SKILL_RESULT" | jq -r '.confidence_source')
887
+ LATENCY=$(echo "$SKILL_RESULT" | jq -r '.latency_ms')
888
+
889
+ echo " ✅ $UNIQUE_AGENT_ID complete (${LATENCY}ms, confidence: $CONFIDENCE [$CONFIDENCE_SOURCE], files: $FILES_CHANGED)"
890
+
891
+ # LOG: Loop 3 agent completion
892
+ ./.claude/skills/redis-coordination/log-event.sh \
893
+ --task-id "$TASK_ID" \
894
+ --event-type "agent_complete" \
895
+ --loop "loop3" \
896
+ --agent-id "$UNIQUE_AGENT_ID" \
897
+ --iteration "$ITERATION" \
898
+ --details "{\"confidence\": $CONFIDENCE, \"confidence_source\": \"$CONFIDENCE_SOURCE\", \"files_changed\": $FILES_CHANGED, \"latency_ms\": $LATENCY}" \
899
+ --level "INFO" 2>/dev/null || true
900
+
901
+ # Store latency metric
902
+ METRIC=$(jq -nc \
903
+ --arg agent "$UNIQUE_AGENT_ID" \
904
+ --arg latency "$LATENCY" \
905
+ --arg loop "loop3" \
906
+ --arg iteration "$ITERATION" \
907
+ '{agent: $agent, latency_ms: ($latency | tonumber), loop: $loop, iteration: ($iteration | tonumber)}')
908
+ echo "$METRIC" | redis-cli -x LPUSH "swarm:${TASK_ID}:metrics:agent_latency" >/dev/null
909
+
910
+ LOOP3_COMPLETED_AGENTS+=("$UNIQUE_AGENT_ID")
911
+ else
912
+ ERROR_OUTPUT=$(echo "$SKILL_RESULT" | jq -r '.output')
913
+ echo " ❌ $UNIQUE_AGENT_ID failed (skill execution error)"
914
+ echo " Error: $ERROR_OUTPUT"
915
+
916
+ # LOG: Loop 3 agent failure
917
+ ./.claude/skills/redis-coordination/log-event.sh \
918
+ --task-id "$TASK_ID" \
919
+ --event-type "agent_failure" \
920
+ --loop "loop3" \
921
+ --agent-id "$UNIQUE_AGENT_ID" \
922
+ --iteration "$ITERATION" \
923
+ --details "{\"error\": \"skill_execution_error\", \"output\": \"$ERROR_OUTPUT\"}" \
924
+ --level "ERROR" 2>/dev/null || true
925
+
926
+ LOOP3_FAILED_AGENTS+=("$AGENT")
927
+ redis-cli INCR "swarm:${TASK_ID}:metrics:agent_failure_count" >/dev/null
928
+ fi
929
+
930
+ # Cleanup temp file
931
+ rm -f "$OUTPUT_FILE"
932
+ else
933
+ echo " ❌ $UNIQUE_AGENT_ID failed (no output file)"
934
+ LOOP3_FAILED_AGENTS+=("$AGENT")
935
+ redis-cli INCR "swarm:${TASK_ID}:metrics:agent_failure_count" >/dev/null
936
+ fi
937
+ else
938
+ echo " ❌ $UNIQUE_AGENT_ID failed (process error)"
939
+ LOOP3_FAILED_AGENTS+=("$AGENT")
940
+ redis-cli INCR "swarm:${TASK_ID}:metrics:agent_failure_count" >/dev/null
941
+ rm -f "$OUTPUT_FILE"
942
+ fi
943
+
944
+ echo ""
945
+ done
946
+
947
+ # Validate quorum
948
+ if [ ${#LOOP3_COMPLETED_AGENTS[@]} -ge "$LOOP3_REQUIRED" ]; then
949
+ echo "[Loop 3] ✅ Quorum met: ${#LOOP3_COMPLETED_AGENTS[@]}/$LOOP3_REQUIRED agents completed"
950
+ if [ ${#LOOP3_FAILED_AGENTS[@]} -gt 0 ]; then
951
+ echo "[Loop 3] ⚠️ Failed agents (continuing with quorum): ${LOOP3_FAILED_AGENTS[*]}"
952
+
953
+ # METRICS: Increment quorum fallback counter
954
+ redis-cli INCR "swarm:${TASK_ID}:metrics:quorum_fallback" >/dev/null
955
+ fi
956
+ else
957
+ echo "[Loop 3] ❌ Quorum FAILED: ${#LOOP3_COMPLETED_AGENTS[@]} < $LOOP3_REQUIRED"
958
+ echo "[Loop 3] Failed agents: ${LOOP3_FAILED_AGENTS[*]}"
959
+ exit 1
960
+ fi
961
+ echo ""
962
+
963
+ # Step 2: Collect Loop 3 confidence scores (only from completed agents)
964
+ echo "[Loop 3] Collecting confidence scores from ${#LOOP3_COMPLETED_AGENTS[@]} agents..."
965
+ LOOP3_COMPLETED_IDS=$(IFS=','; echo "${LOOP3_COMPLETED_AGENTS[*]}")
966
+ LOOP3_CONSENSUS=$(./.claude/skills/redis-coordination/invoke-waiting-mode.sh collect \
967
+ --task-id "$TASK_ID" \
968
+ --agent-ids "$LOOP3_COMPLETED_IDS" | tail -1)
969
+
970
+ echo "[Loop 3] Average confidence: $LOOP3_CONSENSUS (from ${#LOOP3_COMPLETED_AGENTS[@]}/${LOOP3_TOTAL} agents)"
971
+
972
+ # METRICS: Store Loop 3 consensus score
973
+ LOOP3_METRIC=$(jq -nc \
974
+ --arg consensus "$LOOP3_CONSENSUS" \
975
+ --arg iteration "$ITERATION" \
976
+ '{consensus: ($consensus | tonumber), iteration: ($iteration | tonumber)}')
977
+ echo "$LOOP3_METRIC" | redis-cli -x LPUSH "swarm:${TASK_ID}:metrics:loop3_consensus" >/dev/null
978
+
979
+ # SPRINT 4: Create conversation forks after iteration 1
980
+ if [ "$ITERATION" -eq 1 ]; then
981
+ echo "[Coordinator] Creating conversation forks for iteration 2..."
982
+ for AGENT in "${LOOP3_COMPLETED_AGENTS[@]}"; do
983
+ FORK_ID=$(npx cfn-fork create --task-id "$TASK_ID" --agent-id "$AGENT" --iteration 1 2>/dev/null || echo "")
984
+
985
+ if [ -n "$FORK_ID" ] && [ "$FORK_ID" != "(nil)" ]; then
986
+ # Store fork ID in Redis for this agent
987
+ redis-cli setex "swarm:${TASK_ID}:${AGENT}:fork-id" 86400 "$FORK_ID" >/dev/null
988
+ echo " ✓ Fork created for $AGENT: $FORK_ID"
989
+ else
990
+ echo " ⚠ Fork creation skipped for $AGENT (will use context rebuild)"
991
+ fi
992
+ done
993
+ echo ""
994
+ fi
995
+
996
+ # BUG #12 FIX: Deliverable Verification with explicit file checking
997
+ echo "[Deliverable Check] Verifying implementation artifacts..."
998
+
999
+ # Use enhanced validate-deliverables.sh skill
1000
+ DELIVERABLE_ARGS="--task-id $TASK_ID"
1001
+ if [ -n "$EXPECTED_FILES" ]; then
1002
+ DELIVERABLE_ARGS="$DELIVERABLE_ARGS --expected-files $EXPECTED_FILES"
1003
+ echo " Expected files: $EXPECTED_FILES"
1004
+ fi
1005
+
1006
+ DELIVERABLE_STATUS=$(./.claude/skills/product-owner-decision/validate-deliverables.sh $DELIVERABLE_ARGS)
1007
+
1008
+ if [ "$DELIVERABLE_STATUS" = "FAILED" ]; then
1009
+ # Retrieve missing files from Redis (if available)
1010
+ MISSING_FILES_JSON=$(redis-cli get "swarm:${TASK_ID}:missing-files" 2>/dev/null || echo "[]")
1011
+ MISSING_FILES_LIST=$(echo "$MISSING_FILES_JSON" | jq -r '.[]' | tr '\n' ', ' | sed 's/,$//')
1012
+
1013
+ if [ -n "$MISSING_FILES_LIST" ]; then
1014
+ echo "❌ DELIVERABLE VERIFICATION FAILED: Missing files"
1015
+ echo " Expected but not found: $MISSING_FILES_LIST"
1016
+ else
1017
+ echo "❌ DELIVERABLE VERIFICATION FAILED: No files created or modified"
1018
+ fi
1019
+
1020
+ echo " This prevents 'consensus on vapor' - validators approving nothing"
1021
+ echo ""
1022
+ echo "Decision: RELAUNCH iteration $((ITERATION + 1)) (skip Loop 2 validation)"
1023
+ echo ""
1024
+
1025
+ # METRICS: Increment deliverable failure counter
1026
+ redis-cli INCR "swarm:${TASK_ID}:metrics:deliverable_failures" >/dev/null
1027
+
1028
+ # Override all Loop 3 confidence scores to 0.0 (prevent gate pass)
1029
+ for AGENT in "${LOOP3_COMPLETED_AGENTS[@]}"; do
1030
+ redis-cli DEL "swarm:${TASK_ID}:${AGENT}:result" >/dev/null
1031
+ redis-cli LPUSH "swarm:${TASK_ID}:${AGENT}:result" "0.0" >/dev/null
1032
+ echo " [Override] ${AGENT} confidence: 1.0 → 0.0 (no deliverables)"
1033
+ done
1034
+
1035
+ # Recalculate consensus (should be 0.0 now)
1036
+ LOOP3_CONSENSUS=$(./.claude/skills/redis-coordination/invoke-waiting-mode.sh collect \
1037
+ --task-id "$TASK_ID" \
1038
+ --agent-ids "$LOOP3_COMPLETED_IDS" | tail -1)
1039
+
1040
+ echo ""
1041
+ echo "[Loop 3] Recalculated confidence after override: $LOOP3_CONSENSUS"
1042
+ echo ""
1043
+
1044
+ # Build specific feedback with missing files
1045
+ if [ -n "$MISSING_FILES_LIST" ]; then
1046
+ FEEDBACK="CRITICAL: Create these missing files: $MISSING_FILES_LIST
1047
+
1048
+ Use the Write tool for each file. Verify with 'ls -la' after each Write operation."
1049
+ else
1050
+ FEEDBACK="CRITICAL: You must create or modify files. No deliverables were produced in iteration $ITERATION."
1051
+ fi
1052
+
1053
+ # Wake Loop 3 agents for next iteration with HIGH priority (priority=40)
1054
+ IFS=',' read -ra AGENTS <<< "$LOOP3_AGENTS"
1055
+ for AGENT in "${AGENTS[@]}"; do
1056
+ # Get fork ID if exists
1057
+ FORK_ID=$(redis-cli get "swarm:${TASK_ID}:${AGENT}:fork-id" 2>/dev/null || echo "")
1058
+ if [ "$FORK_ID" = "(nil)" ]; then FORK_ID=""; fi
1059
+
1060
+ ./.claude/skills/redis-coordination/invoke-waiting-mode.sh wake \
1061
+ --task-id "$TASK_ID" \
1062
+ --agent-id "$AGENT" \
1063
+ --priority 40 \
1064
+ --reason "no_deliverables" \
1065
+ --iteration $((ITERATION + 1)) \
1066
+ --fork-id "$FORK_ID" \
1067
+ --feedback "$FEEDBACK"
1068
+ done
1069
+
1070
+ continue # Next iteration (skip gate check and Loop 2)
1071
+ fi
1072
+
1073
+ echo "[Deliverable Check] ✅ Deliverables verified - proceeding to gate check"
1074
+ echo ""
1075
+
1076
+ # Gate check
1077
+ if (( $(echo "$LOOP3_CONSENSUS < $GATE" | bc -l) )); then
1078
+ echo "❌ Gate FAILED ($LOOP3_CONSENSUS < $GATE)"
1079
+ echo "Decision: RELAUNCH iteration $((ITERATION + 1))"
1080
+
1081
+ # LOG: Gate check failure
1082
+ ./.claude/skills/redis-coordination/log-event.sh \
1083
+ --task-id "$TASK_ID" \
1084
+ --event-type "gate_check" \
1085
+ --iteration "$ITERATION" \
1086
+ --details "{\"consensus\": $LOOP3_CONSENSUS, \"threshold\": $GATE, \"result\": \"FAIL\", \"decision\": \"RELAUNCH\"}" \
1087
+ --level "WARN" 2>/dev/null || true
1088
+
1089
+ # METRICS: Increment gate failure counter
1090
+ redis-cli INCR "swarm:${TASK_ID}:metrics:gate_failures" >/dev/null
1091
+
1092
+ # Wake Loop 3 agents for next iteration with MEDIUM priority (priority=30)
1093
+ IFS=',' read -ra AGENTS <<< "$LOOP3_AGENTS"
1094
+ for AGENT in "${AGENTS[@]}"; do
1095
+ # SPRINT 4: Get fork ID if exists
1096
+ FORK_ID=$(redis-cli get "swarm:${TASK_ID}:${AGENT}:fork-id" 2>/dev/null || echo "")
1097
+ if [ "$FORK_ID" = "(nil)" ]; then FORK_ID=""; fi
1098
+
1099
+ ./.claude/skills/redis-coordination/invoke-waiting-mode.sh wake \
1100
+ --task-id "$TASK_ID" \
1101
+ --agent-id "$AGENT" \
1102
+ --priority 30 \
1103
+ --reason "gate_failed" \
1104
+ --iteration $((ITERATION + 1)) \
1105
+ --fork-id "$FORK_ID" \
1106
+ --feedback "Improve confidence from $LOOP3_CONSENSUS to >$GATE"
1107
+ done
1108
+
1109
+ continue # Next iteration
1110
+ fi
1111
+
1112
+ echo "✅ Gate PASSED ($LOOP3_CONSENSUS >= $GATE)"
1113
+
1114
+ # LOG: Gate check success
1115
+ ./.claude/skills/redis-coordination/log-event.sh \
1116
+ --task-id "$TASK_ID" \
1117
+ --event-type "gate_check" \
1118
+ --iteration "$ITERATION" \
1119
+ --details "{\"consensus\": $LOOP3_CONSENSUS, \"threshold\": $GATE, \"result\": \"PASS\"}" \
1120
+ --level "INFO" 2>/dev/null || true
1121
+
1122
+ echo ""
1123
+
1124
+ # Signal Loop 2 validators that gate has passed (they can start work)
1125
+ GATE_PASS_KEY="swarm:${TASK_ID}:gate-passed"
1126
+ redis-cli lpush "$GATE_PASS_KEY" "{\"iteration\": $ITERATION, \"loop3_confidence\": $LOOP3_CONSENSUS}" > /dev/null
1127
+ echo "[Loop 3] Gate pass signal sent to Loop 2 validators"
1128
+ echo ""
1129
+
1130
+ # Step 3: Build Loop 2 validator context (BUG #20 FIX - inject same deliverables)
1131
+ LOOP2_VALIDATOR_CONTEXT="Loop 2 validation for iteration $ITERATION
1132
+
1133
+ Review Loop 3 implementation against these requirements:
1134
+
1135
+ Epic Goal: $EPIC_GOAL
1136
+
1137
+ Expected Deliverables:
1138
+ $DELIVERABLES
1139
+ $([ -n "$DIRECTORY" ] && echo "
1140
+ Target Directory: $DIRECTORY")
1141
+
1142
+ Acceptance Criteria:
1143
+ $ACCEPTANCE
1144
+
1145
+ Your Validation Tasks:
1146
+ - Verify all deliverable files exist in correct directory
1147
+ - Check files contain actual implementation (not placeholders)
1148
+ - Validate against acceptance criteria
1149
+ - Provide structured feedback (critical/warnings/suggestions)
1150
+ - Report confidence score based on deliverable completeness
1151
+ "
1152
+
1153
+ echo "[Loop 2] Validator context built"
1154
+ echo ""
1155
+
1156
+ # Step 4: Spawn Loop 2 validators using skill-based output processing (parallel execution)
1157
+ echo "[Loop 2] Using skill-based output processing (parallel execution)"
1158
+ IFS=',' read -ra VALIDATORS <<< "$LOOP2_AGENTS"
1159
+
1160
+ # Track instance counts to generate unique validator IDs for duplicate validator types
1161
+ declare -A VALIDATOR_INSTANCE_COUNTS
1162
+ declare -A VALIDATOR_IDS # Map from array index to unique validator ID
1163
+
1164
+ # Pre-calculate unique validator IDs
1165
+ for i in "${!VALIDATORS[@]}"; do
1166
+ VALIDATOR="${VALIDATORS[$i]}"
1167
+
1168
+ # Increment instance counter for this validator type
1169
+ VALIDATOR_INSTANCE_COUNTS["$VALIDATOR"]=$((${VALIDATOR_INSTANCE_COUNTS["$VALIDATOR"]:-0} + 1))
1170
+ INSTANCE_NUM="${VALIDATOR_INSTANCE_COUNTS["$VALIDATOR"]}"
1171
+
1172
+ # Generate unique validator ID: validator-type-iteration-instance
1173
+ UNIQUE_VALIDATOR_ID="${VALIDATOR}-${ITERATION}-${INSTANCE_NUM}"
1174
+ VALIDATOR_IDS["$i"]="$UNIQUE_VALIDATOR_ID"
1175
+
1176
+ echo " [Instance Tracking] ${VALIDATOR} #${INSTANCE_NUM} → ${UNIQUE_VALIDATOR_ID}"
1177
+ done
1178
+
1179
+ echo ""
1180
+
1181
+ # Step 3a: Spawn all validators in parallel using skill
1182
+ echo "[Loop 2] Spawning validators in parallel..."
1183
+ declare -A VALIDATOR_PIDS # Map from validator ID to background PID
1184
+ declare -A VALIDATOR_OUTPUT_FILES # Map from validator ID to temp output file
1185
+
1186
+ LOOP2_TOTAL=${#VALIDATORS[@]}
1187
+ LOOP2_REQUIRED=$(calculate_quorum "$MIN_QUORUM_LOOP2" "$LOOP2_TOTAL")
1188
+
1189
+ echo "[Loop 2] Quorum: $LOOP2_REQUIRED/$LOOP2_TOTAL validators required"
1190
+ echo ""
1191
+
1192
+ for i in "${!VALIDATORS[@]}"; do
1193
+ VALIDATOR="${VALIDATORS[$i]}"
1194
+ UNIQUE_VALIDATOR_ID="${VALIDATOR_IDS[$i]}"
1195
+
1196
+ # Get agent-specific timeout (use base validator type, not unique ID)
1197
+ AGENT_TIMEOUT=$(get_agent_timeout "$VALIDATOR" "$TASK_ID")
1198
+
1199
+ # Create temp output file for this validator
1200
+ OUTPUT_FILE="/tmp/loop2-${TASK_ID}-${UNIQUE_VALIDATOR_ID}.json"
1201
+ VALIDATOR_OUTPUT_FILES["$UNIQUE_VALIDATOR_ID"]="$OUTPUT_FILE"
1202
+
1203
+ echo " Spawning: $VALIDATOR (ID: $UNIQUE_VALIDATOR_ID, timeout: ${AGENT_TIMEOUT}s)"
1204
+
1205
+ # Execute skill in background - captures agent output and extracts structured data
1206
+ (
1207
+ # METRICS: Agent latency start
1208
+ AGENT_START=$(date +%s%N | cut -b1-13)
1209
+
1210
+ # Execute skill to spawn validator and extract feedback (BUG #20 FIX - inject detailed context)
1211
+ SKILL_RESULT=$(./.claude/skills/loop2-output-processing/execute-and-extract.sh \
1212
+ --agent-type "$VALIDATOR" \
1213
+ --task-id "$TASK_ID" \
1214
+ --agent-id "$UNIQUE_VALIDATOR_ID" \
1215
+ --context "$LOOP2_VALIDATOR_CONTEXT" \
1216
+ --iteration "$ITERATION" \
1217
+ --timeout "$AGENT_TIMEOUT" 2>&1)
1218
+
1219
+ # METRICS: Agent latency end
1220
+ AGENT_END=$(date +%s%N | cut -b1-13)
1221
+ LATENCY=$((AGENT_END - AGENT_START))
1222
+
1223
+ # Inject latency into result JSON
1224
+ SKILL_RESULT_WITH_LATENCY=$(echo "$SKILL_RESULT" | jq --arg latency "$LATENCY" '. + {latency_ms: ($latency | tonumber)}')
1225
+
1226
+ # Write result to temp file
1227
+ echo "$SKILL_RESULT_WITH_LATENCY" > "$OUTPUT_FILE"
1228
+
1229
+ # Also push to Redis for compatibility with existing tools
1230
+ echo "$SKILL_RESULT_WITH_LATENCY" | redis-cli -x LPUSH "swarm:${TASK_ID}:${UNIQUE_VALIDATOR_ID}:result" >/dev/null
1231
+
1232
+ # Signal completion
1233
+ redis-cli LPUSH "swarm:${TASK_ID}:${UNIQUE_VALIDATOR_ID}:done" "complete" >/dev/null
1234
+ ) &
1235
+
1236
+ # Track background PID
1237
+ VALIDATOR_PIDS["$UNIQUE_VALIDATOR_ID"]=$!
1238
+ echo " ✅ Spawned $UNIQUE_VALIDATOR_ID (PID: ${VALIDATOR_PIDS[$UNIQUE_VALIDATOR_ID]})"
1239
+ done
1240
+
1241
+ echo ""
1242
+ echo "[Loop 2] All validators spawned, waiting for completion..."
1243
+ echo ""
1244
+
1245
+ # Step 3b: Wait for all validators to complete and collect results
1246
+ LOOP2_COMPLETED_AGENTS=()
1247
+ LOOP2_FAILED_AGENTS=()
1248
+ declare -A LOOP2_CONFIDENCES # Map from validator ID to confidence score
1249
+
1250
+ for i in "${!VALIDATORS[@]}"; do
1251
+ VALIDATOR="${VALIDATORS[$i]}"
1252
+ UNIQUE_VALIDATOR_ID="${VALIDATOR_IDS[$i]}"
1253
+ VALIDATOR_PID="${VALIDATOR_PIDS[$UNIQUE_VALIDATOR_ID]}"
1254
+ OUTPUT_FILE="${VALIDATOR_OUTPUT_FILES[$UNIQUE_VALIDATOR_ID]}"
1255
+
1256
+ echo " Waiting for $UNIQUE_VALIDATOR_ID (PID: $VALIDATOR_PID)..."
1257
+
1258
+ # Wait for background process to complete
1259
+ if wait "$VALIDATOR_PID" 2>/dev/null; then
1260
+ # Process completed successfully, read result from temp file
1261
+ if [ -f "$OUTPUT_FILE" ] && [ -s "$OUTPUT_FILE" ]; then
1262
+ SKILL_RESULT=$(cat "$OUTPUT_FILE")
1263
+
1264
+ # Validate JSON structure
1265
+ if echo "$SKILL_RESULT" | jq empty 2>/dev/null; then
1266
+ # Extract confidence score
1267
+ CONFIDENCE=$(echo "$SKILL_RESULT" | jq -r '.confidence // 0.0')
1268
+ CONFIDENCE_SOURCE=$(echo "$SKILL_RESULT" | jq -r '.confidence_source // "unknown"')
1269
+ FEEDBACK=$(echo "$SKILL_RESULT" | jq -r '.feedback // {}')
1270
+ LATENCY=$(echo "$SKILL_RESULT" | jq -r '.latency_ms // 0')
1271
+
1272
+ # Store confidence for consensus calculation
1273
+ LOOP2_CONFIDENCES["$UNIQUE_VALIDATOR_ID"]="$CONFIDENCE"
1274
+
1275
+ # Store latency metric
1276
+ METRIC=$(jq -nc \
1277
+ --arg agent "$UNIQUE_VALIDATOR_ID" \
1278
+ --arg latency "$LATENCY" \
1279
+ --arg loop "loop2" \
1280
+ --arg iteration "$ITERATION" \
1281
+ '{agent: $agent, latency_ms: ($latency | tonumber), loop: $loop, iteration: ($iteration | tonumber)}')
1282
+ echo "$METRIC" | redis-cli -x LPUSH "swarm:${TASK_ID}:metrics:agent_latency" >/dev/null
1283
+
1284
+ # Count feedback items
1285
+ CRITICAL_COUNT=$(echo "$FEEDBACK" | jq -r '.critical | length')
1286
+ WARNINGS_COUNT=$(echo "$FEEDBACK" | jq -r '.warnings | length')
1287
+ SUGGESTIONS_COUNT=$(echo "$FEEDBACK" | jq -r '.suggestions | length')
1288
+
1289
+ echo " ✅ $UNIQUE_VALIDATOR_ID complete (${LATENCY}ms, confidence: $CONFIDENCE [$CONFIDENCE_SOURCE], feedback: ${CRITICAL_COUNT}C/${WARNINGS_COUNT}W/${SUGGESTIONS_COUNT}S)"
1290
+
1291
+ LOOP2_COMPLETED_AGENTS+=("$UNIQUE_VALIDATOR_ID")
1292
+ else
1293
+ echo " ⚠️ $UNIQUE_VALIDATOR_ID returned invalid JSON, treating as failed"
1294
+ LOOP2_FAILED_AGENTS+=("$VALIDATOR")
1295
+
1296
+ # METRICS: Increment timeout counter
1297
+ redis-cli INCR "swarm:${TASK_ID}:metrics:timeout_count" >/dev/null
1298
+ fi
1299
+ else
1300
+ echo " ⚠️ $UNIQUE_VALIDATOR_ID completed but no output file found"
1301
+ LOOP2_FAILED_AGENTS+=("$VALIDATOR")
1302
+
1303
+ # METRICS: Increment timeout counter
1304
+ redis-cli INCR "swarm:${TASK_ID}:metrics:timeout_count" >/dev/null
1305
+ fi
1306
+ else
1307
+ echo " ❌ $UNIQUE_VALIDATOR_ID failed (process exited with error)"
1308
+ LOOP2_FAILED_AGENTS+=("$VALIDATOR")
1309
+
1310
+ # METRICS: Increment timeout counter
1311
+ redis-cli INCR "swarm:${TASK_ID}:metrics:timeout_count" >/dev/null
1312
+ fi
1313
+
1314
+ # Cleanup temp file
1315
+ rm -f "$OUTPUT_FILE"
1316
+ done
1317
+
1318
+ echo ""
1319
+
1320
+ # Validate quorum
1321
+ if [ ${#LOOP2_COMPLETED_AGENTS[@]} -ge "$LOOP2_REQUIRED" ]; then
1322
+ echo "[Loop 2] ✅ Quorum met: ${#LOOP2_COMPLETED_AGENTS[@]}/$LOOP2_REQUIRED validators completed"
1323
+ if [ ${#LOOP2_FAILED_AGENTS[@]} -gt 0 ]; then
1324
+ echo "[Loop 2] ⚠️ Failed validators (continuing with quorum): ${LOOP2_FAILED_AGENTS[*]}"
1325
+
1326
+ # METRICS: Increment quorum fallback counter
1327
+ redis-cli INCR "swarm:${TASK_ID}:metrics:quorum_fallback" >/dev/null
1328
+ fi
1329
+ else
1330
+ echo "[Loop 2] ❌ Quorum FAILED: ${#LOOP2_COMPLETED_AGENTS[@]} < $LOOP2_REQUIRED"
1331
+ echo "[Loop 2] Failed validators: ${LOOP2_FAILED_AGENTS[*]}"
1332
+ exit 1
1333
+ fi
1334
+ echo ""
1335
+
1336
+ # Step 3c: Calculate Loop 2 consensus from extracted confidence scores
1337
+ echo "[Loop 2] Calculating consensus from ${#LOOP2_COMPLETED_AGENTS[@]} validators..."
1338
+
1339
+ # Calculate average confidence from completed validators
1340
+ LOOP2_TOTAL_CONFIDENCE=0
1341
+ LOOP2_CONFIDENCE_COUNT=0
1342
+
1343
+ for VALIDATOR_ID in "${LOOP2_COMPLETED_AGENTS[@]}"; do
1344
+ CONFIDENCE="${LOOP2_CONFIDENCES[$VALIDATOR_ID]}"
1345
+ if [ -n "$CONFIDENCE" ] && [ "$CONFIDENCE" != "null" ]; then
1346
+ LOOP2_TOTAL_CONFIDENCE=$(echo "$LOOP2_TOTAL_CONFIDENCE + $CONFIDENCE" | bc -l)
1347
+ LOOP2_CONFIDENCE_COUNT=$((LOOP2_CONFIDENCE_COUNT + 1))
1348
+ fi
1349
+ done
1350
+
1351
+ if [ "$LOOP2_CONFIDENCE_COUNT" -gt 0 ]; then
1352
+ LOOP2_CONSENSUS=$(echo "scale=2; $LOOP2_TOTAL_CONFIDENCE / $LOOP2_CONFIDENCE_COUNT" | bc -l)
1353
+ else
1354
+ echo "⚠️ No valid confidence scores found, defaulting to 0.0"
1355
+ LOOP2_CONSENSUS=0.0
1356
+ fi
1357
+
1358
+ echo "[Loop 2] Average consensus: $LOOP2_CONSENSUS (from ${LOOP2_CONFIDENCE_COUNT} validators)"
1359
+
1360
+ # METRICS: Store Loop 2 consensus score
1361
+ LOOP2_METRIC=$(jq -nc \
1362
+ --arg consensus "$LOOP2_CONSENSUS" \
1363
+ --arg iteration "$ITERATION" \
1364
+ '{consensus: ($consensus | tonumber), iteration: ($iteration | tonumber)}')
1365
+ echo "$LOOP2_METRIC" | redis-cli -x LPUSH "swarm:${TASK_ID}:metrics:loop2_consensus" >/dev/null
1366
+
1367
+ # Display consensus status
1368
+ echo ""
1369
+ if (( $(echo "$LOOP2_CONSENSUS >= $CONSENSUS" | bc -l) )); then
1370
+ echo "✅ CONSENSUS REACHED ($LOOP2_CONSENSUS >= $CONSENSUS)"
1371
+ else
1372
+ echo "⚠️ CONSENSUS NOT REACHED ($LOOP2_CONSENSUS < $CONSENSUS)"
1373
+ fi
1374
+ echo ""
1375
+
1376
+ # [BUG #11 FIX] Product Owner decision via output parsing (not Redis wait)
1377
+ echo "[Product Owner] Spawning Product Owner for strategic decision..."
1378
+
1379
+ # BUG #19 FIX: Define PO_UNIQUE_ID BEFORE building context string
1380
+ PO_UNIQUE_ID="${PRODUCT_OWNER}-${ITERATION}-decision"
1381
+
1382
+ # Build Product Owner context
1383
+ PO_CONTEXT="CFN Loop iteration $ITERATION complete.
1384
+
1385
+ Loop 2 Consensus: $LOOP2_CONSENSUS (threshold: $CONSENSUS)
1386
+ Task ID: $TASK_ID
1387
+ Agent ID: $PO_UNIQUE_ID
1388
+
1389
+ Make your strategic decision: PROCEED, ITERATE, or ABORT
1390
+
1391
+ Decision Framework:
1392
+ - PROCEED: Consensus >= $CONSENSUS AND deliverables verified
1393
+ - ITERATE: Consensus < $CONSENSUS AND iteration < $MAX_ITERATIONS
1394
+ - ABORT: Max iterations reached without consensus
1395
+
1396
+ Output your decision clearly with reasoning."
1397
+
1398
+ # Spawn Product Owner and capture output
1399
+ PO_TIMEOUT=$(get_agent_timeout "$PRODUCT_OWNER" "$TASK_ID")
1400
+ echo "[Product Owner] Spawning with timeout: ${PO_TIMEOUT}s"
1401
+
1402
+ PO_OUTPUT=$(timeout "$PO_TIMEOUT" npx claude-flow-novice agent "$PRODUCT_OWNER" \
1403
+ --task-id "$TASK_ID" \
1404
+ --agent-id "$PO_UNIQUE_ID" \
1405
+ --context "$PO_CONTEXT" 2>&1 || true)
1406
+
1407
+ # Parse structured decision JSON from Redis (created by execute-product-owner-decision.sh)
1408
+ echo "[Product Owner] Retrieving structured decision from Redis..."
1409
+ DECISION=$(redis-cli lindex "swarm:${TASK_ID}:${PO_UNIQUE_ID}:decision" 0)
1410
+
1411
+ if [ -z "$DECISION" ] || [ "$DECISION" = "(nil)" ]; then
1412
+ echo "❌ ERROR: Could not retrieve Product Owner decision from Redis"
1413
+ echo "Expected key: swarm:${TASK_ID}:${PO_UNIQUE_ID}:decision"
1414
+ echo "Product Owner output:"
1415
+ echo "$PO_OUTPUT"
1416
+ exit 1
1417
+ fi
1418
+
1419
+ # Extract fields from structured JSON
1420
+ DECISION_TYPE=$(echo "$DECISION" | jq -r '.decision')
1421
+ DECISION_REASONING=$(echo "$DECISION" | jq -r '.reasoning')
1422
+ DECISION_CONFIDENCE=$(echo "$DECISION" | jq -r '.confidence')
1423
+ IN_SCOPE_CONSENSUS=$(echo "$DECISION" | jq -r '.scope_analysis.in_scope_consensus // 0')
1424
+ BACKLOG_COUNT=$(echo "$DECISION" | jq -r '.backlog_items | length')
1425
+
1426
+ if [ -z "$DECISION_TYPE" ] || [ "$DECISION_TYPE" = "null" ]; then
1427
+ echo "❌ ERROR: Invalid Product Owner decision JSON"
1428
+ echo "Received: $DECISION"
1429
+ exit 1
1430
+ fi
1431
+
1432
+ echo " Decision Type: $DECISION_TYPE"
1433
+ echo " Confidence: $DECISION_CONFIDENCE"
1434
+ echo " In-Scope Consensus: $IN_SCOPE_CONSENSUS"
1435
+ echo " Backlog Items: $BACKLOG_COUNT"
1436
+ echo ""
1437
+
1438
+ # LOG: Product Owner decision
1439
+ ./.claude/skills/redis-coordination/log-event.sh \
1440
+ --task-id "$TASK_ID" \
1441
+ --event-type "po_decision" \
1442
+ --agent-id "$PO_UNIQUE_ID" \
1443
+ --iteration "$ITERATION" \
1444
+ --details "$DECISION" \
1445
+ --level "INFO" 2>/dev/null || true
1446
+
1447
+ echo "[Product Owner] Decision: $DECISION_TYPE"
1448
+ echo ""
1449
+
1450
+ # Handle Product Owner decision
1451
+ if [ "$DECISION_TYPE" = "PROCEED" ] || [ "$DECISION_TYPE" = "DEFER_AND_PROCEED" ]; then
1452
+ # Handle backlog items if DEFER_AND_PROCEED
1453
+ if [ "$DECISION_TYPE" = "DEFER_AND_PROCEED" ]; then
1454
+ echo "📋 Product Owner Decision: DEFER_AND_PROCEED"
1455
+ echo " In-scope work complete (consensus: $IN_SCOPE_CONSENSUS)"
1456
+ echo " Deferred $BACKLOG_COUNT out-of-scope items to backlog"
1457
+ echo ""
1458
+ fi
1459
+
1460
+ # DELIVERABLE VERIFICATION (Sprint 8 - prevent "consensus on vapor")
1461
+ echo "[Deliverable Verification] Checking success criteria..."
1462
+
1463
+ SUCCESS_CRITERIA_RAW=$(redis-cli GET "swarm:${TASK_ID}:success-criteria" 2>/dev/null)
1464
+ if [ -n "$SUCCESS_CRITERIA_RAW" ]; then
1465
+ # Check if task description includes file/deliverable keywords
1466
+ TASK_DESC=$(redis-cli GET "swarm:${TASK_ID}:task" 2>/dev/null)
1467
+
1468
+ if echo "$TASK_DESC" | grep -qiE "create|build|implement|generate|file|component|module|test"; then
1469
+ echo "[Deliverable Verification] Task involves implementation - checking for file changes..."
1470
+
1471
+ # Count modified/created files since orchestrator started
1472
+ FILES_CREATED=$(git status --short 2>/dev/null | grep -E "^(A|M|\\?\\?)" | wc -l)
1473
+
1474
+ if [ "$FILES_CREATED" -eq 0 ]; then
1475
+ echo "⚠️ DELIVERABLE VERIFICATION FAILED"
1476
+ echo " Task requires implementation but no files were created/modified"
1477
+ echo " Consensus reached on plans without actual deliverables"
1478
+ echo ""
1479
+ echo " Options:"
1480
+ echo " 1. Force ITERATE to create actual implementation"
1481
+ echo " 2. Override verification (--skip-deliverable-check flag)"
1482
+ echo " 3. Manual intervention to verify work was done"
1483
+ echo ""
1484
+ echo " Recommendation: Force ITERATE with explicit deliverable requirement"
1485
+
1486
+ # Store verification failure
1487
+ redis-cli SET "swarm:${TASK_ID}:deliverable_verification" "failed" EX 86400 >/dev/null
1488
+
1489
+ # Optional: Force ITERATE (commented for now - requires flag)
1490
+ # echo "[Forced Override] Changing PROCEED → ITERATE due to missing deliverables"
1491
+ # DECISION_TYPE="ITERATE"
1492
+ # DECISION_REASONING="No deliverables created despite implementation task"
1493
+ else
1494
+ echo "✅ Deliverable verification passed ($FILES_CREATED files created/modified)"
1495
+ redis-cli SET "swarm:${TASK_ID}:deliverable_verification" "passed:$FILES_CREATED" EX 86400 >/dev/null
1496
+ fi
1497
+ else
1498
+ echo "[Deliverable Verification] Task is analysis/planning - skipping file check"
1499
+ fi
1500
+ fi
1501
+
1502
+ echo "🎉 CFN Loop Complete (Product Owner: PROCEED)"
1503
+ echo "Final Consensus: $LOOP2_CONSENSUS (Iteration $ITERATION)"
1504
+
1505
+ # METRICS: Iteration end timestamp and duration
1506
+ ITERATION_END=$(date +%s%N | cut -b1-13)
1507
+ ITERATION_DURATION=$((ITERATION_END - ITERATION_START))
1508
+
1509
+ # Store final iteration duration metric
1510
+ DURATION_METRIC=$(jq -nc \
1511
+ --arg duration "$ITERATION_DURATION" \
1512
+ --arg iteration "$ITERATION" \
1513
+ '{duration_ms: ($duration | tonumber), iteration: ($iteration | tonumber)}')
1514
+ echo "$DURATION_METRIC" | redis-cli -x LPUSH "swarm:${TASK_ID}:metrics:iteration_duration" >/dev/null
1515
+
1516
+ # Wake all agents with completion signal - CRITICAL priority (priority=5)
1517
+ echo "[Coordinator] Waking all agents with CRITICAL priority for completion..."
1518
+ IFS=',' read -ra ALL_AGENTS <<< "$LOOP3_AGENTS,$LOOP2_AGENTS"
1519
+ for AGENT in "${ALL_AGENTS[@]}"; do
1520
+ ./.claude/skills/redis-coordination/invoke-waiting-mode.sh wake \
1521
+ --task-id "$TASK_ID" \
1522
+ --agent-id "$AGENT" \
1523
+ --priority 5 \
1524
+ --reason "cfn_complete" \
1525
+ --iteration "$ITERATION"
1526
+ done
1527
+
1528
+ # Use general complete-swarm primitive
1529
+ ./.claude/skills/redis-coordination/complete-swarm.sh \
1530
+ --swarm-id "$SWARM_ID" \
1531
+ --final-metric "final_consensus=$LOOP2_CONSENSUS" \
1532
+ --final-metric "total_iterations=$ITERATION" > /dev/null
1533
+
1534
+ exit 0
1535
+
1536
+ elif [ "$DECISION_TYPE" = "ITERATE" ]; then
1537
+ echo "⚠️ Product Owner Decision: ITERATE (improve quality)"
1538
+
1539
+ # METRICS: Iteration end timestamp and duration
1540
+ ITERATION_END=$(date +%s%N | cut -b1-13)
1541
+ ITERATION_DURATION=$((ITERATION_END - ITERATION_START))
1542
+
1543
+ # Store iteration duration metric
1544
+ DURATION_METRIC=$(jq -nc \
1545
+ --arg duration "$ITERATION_DURATION" \
1546
+ --arg iteration "$ITERATION" \
1547
+ '{duration_ms: ($duration | tonumber), iteration: ($iteration | tonumber)}')
1548
+ echo "$DURATION_METRIC" | redis-cli -x LPUSH "swarm:${TASK_ID}:metrics:iteration_duration" >/dev/null
1549
+
1550
+ # Check max iterations
1551
+ if [ $ITERATION -eq $MAX_ITERATIONS ]; then
1552
+ echo "❌ Maximum iterations ($MAX_ITERATIONS) reached - cannot iterate further"
1553
+ echo " Product Owner wanted ITERATE but max iterations exhausted"
1554
+ exit 1
1555
+ fi
1556
+
1557
+ # Wake agents for next iteration with role-based priorities
1558
+ echo "[Coordinator] Waking agents for iteration $((ITERATION + 1)) with priorities..."
1559
+
1560
+ # Wake Loop 3 implementers with MEDIUM priority (priority=30)
1561
+ IFS=',' read -ra LOOP3_ARRAY <<< "$LOOP3_AGENTS"
1562
+ for AGENT in "${LOOP3_ARRAY[@]}"; do
1563
+ # SPRINT 4: Get fork ID if exists
1564
+ FORK_ID=$(redis-cli get "swarm:${TASK_ID}:${AGENT}:fork-id" 2>/dev/null || echo "")
1565
+ if [ "$FORK_ID" = "(nil)" ]; then FORK_ID=""; fi
1566
+
1567
+ ./.claude/skills/redis-coordination/invoke-waiting-mode.sh wake \
1568
+ --task-id "$TASK_ID" \
1569
+ --agent-id "$AGENT" \
1570
+ --priority 30 \
1571
+ --reason "cfn_loop_iteration" \
1572
+ --iteration $((ITERATION + 1)) \
1573
+ --fork-id "$FORK_ID" \
1574
+ --feedback "Product Owner decision: ITERATE - Improve consensus from $LOOP2_CONSENSUS to >=$CONSENSUS"
1575
+ done
1576
+
1577
+ # Wake Loop 2 validators with HIGH priority (priority=10)
1578
+ IFS=',' read -ra LOOP2_ARRAY <<< "$LOOP2_AGENTS"
1579
+ for AGENT in "${LOOP2_ARRAY[@]}"; do
1580
+ ./.claude/skills/redis-coordination/invoke-waiting-mode.sh wake \
1581
+ --task-id "$TASK_ID" \
1582
+ --agent-id "$AGENT" \
1583
+ --priority 10 \
1584
+ --reason "cfn_loop_iteration" \
1585
+ --iteration $((ITERATION + 1)) \
1586
+ --feedback "Product Owner decision: ITERATE - Improve consensus from $LOOP2_CONSENSUS to >=$CONSENSUS"
1587
+ done
1588
+
1589
+ echo ""
1590
+
1591
+ elif [ "$DECISION_TYPE" = "ABORT" ]; then
1592
+ echo "❌ Product Owner Decision: ABORT (scope too large or out of scope)"
1593
+ echo " Consensus: $LOOP2_CONSENSUS, Iteration: $ITERATION"
1594
+ exit 1
1595
+
1596
+ else
1597
+ echo "❌ ERROR: Unknown Product Owner decision: $DECISION_TYPE"
1598
+ echo " Expected: PROCEED, DEFER_AND_PROCEED, ITERATE, or ABORT"
1599
+ exit 1
1600
+ fi
1601
+ done
1602
+
1603
+ echo "❌ CFN Loop failed after $MAX_ITERATIONS iterations"
1604
+ exit 1