@jaguilar87/gaia 5.0.0-rc.2

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 (621) hide show
  1. package/.claude-plugin/marketplace.json +33 -0
  2. package/.claude-plugin/plugin.json +26 -0
  3. package/ARCHITECTURE.md +335 -0
  4. package/CHANGELOG.md +1298 -0
  5. package/CODE_OF_CONDUCT.md +11 -0
  6. package/CONTRIBUTING.md +146 -0
  7. package/INSTALL.md +436 -0
  8. package/LICENSE +21 -0
  9. package/README.md +222 -0
  10. package/SECURITY.md +47 -0
  11. package/agents/README.md +78 -0
  12. package/agents/cloud-troubleshooter.md +73 -0
  13. package/agents/developer.md +65 -0
  14. package/agents/gaia-operator.md +64 -0
  15. package/agents/gaia-orchestrator.md +111 -0
  16. package/agents/gaia-planner.md +53 -0
  17. package/agents/gaia-system.md +71 -0
  18. package/agents/gitops-operator.md +61 -0
  19. package/agents/terraform-architect.md +63 -0
  20. package/bin/README.md +106 -0
  21. package/bin/cli/__init__.py +1 -0
  22. package/bin/cli/approvals.py +740 -0
  23. package/bin/cli/cleanup.py +562 -0
  24. package/bin/cli/context.py +283 -0
  25. package/bin/cli/doctor.py +651 -0
  26. package/bin/cli/history.py +305 -0
  27. package/bin/cli/memory.py +483 -0
  28. package/bin/cli/metrics.py +1068 -0
  29. package/bin/cli/plans.py +515 -0
  30. package/bin/cli/status.py +302 -0
  31. package/bin/cli/update.py +382 -0
  32. package/bin/gaia +112 -0
  33. package/bin/gaia-cleanup.js +531 -0
  34. package/bin/gaia-doctor.js +635 -0
  35. package/bin/gaia-evidence +126 -0
  36. package/bin/gaia-history.js +251 -0
  37. package/bin/gaia-metrics.js +1278 -0
  38. package/bin/gaia-review.js +269 -0
  39. package/bin/gaia-scan +44 -0
  40. package/bin/gaia-scan.py +589 -0
  41. package/bin/gaia-skills-diagnose.js +929 -0
  42. package/bin/gaia-status.js +278 -0
  43. package/bin/gaia-uninstall.js +111 -0
  44. package/bin/gaia-update.js +919 -0
  45. package/bin/pre-publish-validate.js +610 -0
  46. package/bin/python-detect.js +60 -0
  47. package/bin/validate-sandbox.sh +601 -0
  48. package/commands/README.md +64 -0
  49. package/commands/gaia.md +37 -0
  50. package/commands/scan-project.md +67 -0
  51. package/config/README.md +71 -0
  52. package/config/cloud/aws.json +134 -0
  53. package/config/cloud/gcp.json +139 -0
  54. package/config/context-contracts.json +158 -0
  55. package/config/crons-schema.md +81 -0
  56. package/config/git_standards.json +72 -0
  57. package/config/surface-routing.json +417 -0
  58. package/config/universal-rules.json +102 -0
  59. package/dist/gaia-ops/.claude-plugin/plugin.json +24 -0
  60. package/dist/gaia-ops/README.md +80 -0
  61. package/dist/gaia-ops/agents/cloud-troubleshooter.md +73 -0
  62. package/dist/gaia-ops/agents/developer.md +65 -0
  63. package/dist/gaia-ops/agents/gaia-operator.md +64 -0
  64. package/dist/gaia-ops/agents/gaia-orchestrator.md +111 -0
  65. package/dist/gaia-ops/agents/gaia-planner.md +53 -0
  66. package/dist/gaia-ops/agents/gaia-system.md +71 -0
  67. package/dist/gaia-ops/agents/gitops-operator.md +61 -0
  68. package/dist/gaia-ops/agents/terraform-architect.md +63 -0
  69. package/dist/gaia-ops/commands/gaia.md +37 -0
  70. package/dist/gaia-ops/config/README.md +71 -0
  71. package/dist/gaia-ops/config/cloud/aws.json +134 -0
  72. package/dist/gaia-ops/config/cloud/gcp.json +139 -0
  73. package/dist/gaia-ops/config/context-contracts.json +158 -0
  74. package/dist/gaia-ops/config/crons-schema.md +81 -0
  75. package/dist/gaia-ops/config/git_standards.json +72 -0
  76. package/dist/gaia-ops/config/surface-routing.json +417 -0
  77. package/dist/gaia-ops/config/universal-rules.json +102 -0
  78. package/dist/gaia-ops/hooks/adapters/__init__.py +52 -0
  79. package/dist/gaia-ops/hooks/adapters/base.py +219 -0
  80. package/dist/gaia-ops/hooks/adapters/channel.py +17 -0
  81. package/dist/gaia-ops/hooks/adapters/claude_code.py +1890 -0
  82. package/dist/gaia-ops/hooks/adapters/types.py +194 -0
  83. package/dist/gaia-ops/hooks/adapters/utils.py +25 -0
  84. package/dist/gaia-ops/hooks/hooks.json +192 -0
  85. package/dist/gaia-ops/hooks/modules/__init__.py +15 -0
  86. package/dist/gaia-ops/hooks/modules/agents/__init__.py +29 -0
  87. package/dist/gaia-ops/hooks/modules/agents/contract_validator.py +647 -0
  88. package/dist/gaia-ops/hooks/modules/agents/response_contract.py +496 -0
  89. package/dist/gaia-ops/hooks/modules/agents/skill_injection_verifier.py +120 -0
  90. package/dist/gaia-ops/hooks/modules/agents/state_tracker.py +267 -0
  91. package/dist/gaia-ops/hooks/modules/agents/task_info_builder.py +74 -0
  92. package/dist/gaia-ops/hooks/modules/agents/transcript_analyzer.py +458 -0
  93. package/dist/gaia-ops/hooks/modules/agents/transcript_reader.py +152 -0
  94. package/dist/gaia-ops/hooks/modules/audit/__init__.py +28 -0
  95. package/dist/gaia-ops/hooks/modules/audit/event_detector.py +168 -0
  96. package/dist/gaia-ops/hooks/modules/audit/logger.py +131 -0
  97. package/dist/gaia-ops/hooks/modules/audit/metrics.py +134 -0
  98. package/dist/gaia-ops/hooks/modules/audit/workflow_auditor.py +611 -0
  99. package/dist/gaia-ops/hooks/modules/audit/workflow_recorder.py +296 -0
  100. package/dist/gaia-ops/hooks/modules/context/__init__.py +11 -0
  101. package/dist/gaia-ops/hooks/modules/context/agentic_loop_detector.py +165 -0
  102. package/dist/gaia-ops/hooks/modules/context/anchor_tracker.py +317 -0
  103. package/dist/gaia-ops/hooks/modules/context/compact_context_builder.py +218 -0
  104. package/dist/gaia-ops/hooks/modules/context/context_freshness.py +145 -0
  105. package/dist/gaia-ops/hooks/modules/context/context_injector.py +558 -0
  106. package/dist/gaia-ops/hooks/modules/context/context_writer.py +530 -0
  107. package/dist/gaia-ops/hooks/modules/context/contracts_loader.py +161 -0
  108. package/dist/gaia-ops/hooks/modules/core/__init__.py +40 -0
  109. package/dist/gaia-ops/hooks/modules/core/hook_entry.py +78 -0
  110. package/dist/gaia-ops/hooks/modules/core/paths.py +160 -0
  111. package/dist/gaia-ops/hooks/modules/core/plugin_mode.py +149 -0
  112. package/dist/gaia-ops/hooks/modules/core/plugin_setup.py +577 -0
  113. package/dist/gaia-ops/hooks/modules/core/state.py +179 -0
  114. package/dist/gaia-ops/hooks/modules/core/stdin.py +24 -0
  115. package/dist/gaia-ops/hooks/modules/events/__init__.py +1 -0
  116. package/dist/gaia-ops/hooks/modules/events/event_writer.py +210 -0
  117. package/dist/gaia-ops/hooks/modules/memory/__init__.py +8 -0
  118. package/dist/gaia-ops/hooks/modules/memory/episode_writer.py +216 -0
  119. package/dist/gaia-ops/hooks/modules/orchestrator/__init__.py +1 -0
  120. package/dist/gaia-ops/hooks/modules/orchestrator/delegate_mode.py +122 -0
  121. package/dist/gaia-ops/hooks/modules/scanning/__init__.py +8 -0
  122. package/dist/gaia-ops/hooks/modules/scanning/scan_trigger.py +84 -0
  123. package/dist/gaia-ops/hooks/modules/security/__init__.py +120 -0
  124. package/dist/gaia-ops/hooks/modules/security/approval_cleanup.py +87 -0
  125. package/dist/gaia-ops/hooks/modules/security/approval_constants.py +23 -0
  126. package/dist/gaia-ops/hooks/modules/security/approval_grants.py +1638 -0
  127. package/dist/gaia-ops/hooks/modules/security/approval_messages.py +71 -0
  128. package/dist/gaia-ops/hooks/modules/security/approval_scopes.py +222 -0
  129. package/dist/gaia-ops/hooks/modules/security/blocked_commands.py +595 -0
  130. package/dist/gaia-ops/hooks/modules/security/blocked_message_formatter.py +87 -0
  131. package/dist/gaia-ops/hooks/modules/security/command_semantics.py +181 -0
  132. package/dist/gaia-ops/hooks/modules/security/composition_rules.py +547 -0
  133. package/dist/gaia-ops/hooks/modules/security/flag_classifiers.py +873 -0
  134. package/dist/gaia-ops/hooks/modules/security/gitops_validator.py +179 -0
  135. package/dist/gaia-ops/hooks/modules/security/mutative_verbs.py +1131 -0
  136. package/dist/gaia-ops/hooks/modules/security/network_hosts.py +481 -0
  137. package/dist/gaia-ops/hooks/modules/security/prompt_validator.py +40 -0
  138. package/dist/gaia-ops/hooks/modules/security/shell_unwrapper.py +165 -0
  139. package/dist/gaia-ops/hooks/modules/security/tiers.py +196 -0
  140. package/dist/gaia-ops/hooks/modules/session/__init__.py +10 -0
  141. package/dist/gaia-ops/hooks/modules/session/pending_scanner.py +174 -0
  142. package/dist/gaia-ops/hooks/modules/session/session_context_writer.py +100 -0
  143. package/dist/gaia-ops/hooks/modules/session/session_event_injector.py +160 -0
  144. package/dist/gaia-ops/hooks/modules/session/session_manager.py +31 -0
  145. package/dist/gaia-ops/hooks/modules/session/session_registry.py +333 -0
  146. package/dist/gaia-ops/hooks/modules/tools/__init__.py +29 -0
  147. package/dist/gaia-ops/hooks/modules/tools/bash_validator.py +1008 -0
  148. package/dist/gaia-ops/hooks/modules/tools/cloud_pipe_validator.py +231 -0
  149. package/dist/gaia-ops/hooks/modules/tools/hook_response.py +55 -0
  150. package/dist/gaia-ops/hooks/modules/tools/shell_parser.py +227 -0
  151. package/dist/gaia-ops/hooks/modules/tools/stage_decomposer.py +315 -0
  152. package/dist/gaia-ops/hooks/modules/tools/task_validator.py +294 -0
  153. package/dist/gaia-ops/hooks/modules/validation/__init__.py +23 -0
  154. package/dist/gaia-ops/hooks/modules/validation/commit_validator.py +380 -0
  155. package/dist/gaia-ops/hooks/post_compact.py +43 -0
  156. package/dist/gaia-ops/hooks/post_tool_use.py +54 -0
  157. package/dist/gaia-ops/hooks/pre_compact.py +60 -0
  158. package/dist/gaia-ops/hooks/pre_tool_use.py +413 -0
  159. package/dist/gaia-ops/hooks/session_end_hook.py +77 -0
  160. package/dist/gaia-ops/hooks/session_start.py +81 -0
  161. package/dist/gaia-ops/hooks/stop_hook.py +70 -0
  162. package/dist/gaia-ops/hooks/subagent_start.py +71 -0
  163. package/dist/gaia-ops/hooks/subagent_stop.py +295 -0
  164. package/dist/gaia-ops/hooks/task_completed.py +70 -0
  165. package/dist/gaia-ops/hooks/user_prompt_submit.py +246 -0
  166. package/dist/gaia-ops/settings.json +72 -0
  167. package/dist/gaia-ops/skills/README.md +158 -0
  168. package/dist/gaia-ops/skills/agent-creation/SKILL.md +87 -0
  169. package/dist/gaia-ops/skills/agent-creation/examples.md +170 -0
  170. package/dist/gaia-ops/skills/agent-creation/reference.md +191 -0
  171. package/dist/gaia-ops/skills/agent-protocol/SKILL.md +93 -0
  172. package/dist/gaia-ops/skills/agent-protocol/examples.md +223 -0
  173. package/dist/gaia-ops/skills/agent-response/SKILL.md +69 -0
  174. package/dist/gaia-ops/skills/agentic-loop/SKILL.md +80 -0
  175. package/dist/gaia-ops/skills/agentic-loop/reference.md +378 -0
  176. package/dist/gaia-ops/skills/blog-writing/SKILL.md +98 -0
  177. package/dist/gaia-ops/skills/blog-writing/reference.md +130 -0
  178. package/dist/gaia-ops/skills/brief-spec/SKILL.md +185 -0
  179. package/dist/gaia-ops/skills/command-execution/SKILL.md +64 -0
  180. package/dist/gaia-ops/skills/command-execution/reference.md +83 -0
  181. package/dist/gaia-ops/skills/context-updater/SKILL.md +87 -0
  182. package/dist/gaia-ops/skills/context-updater/examples.md +71 -0
  183. package/dist/gaia-ops/skills/developer-patterns/SKILL.md +50 -0
  184. package/dist/gaia-ops/skills/developer-patterns/reference.md +112 -0
  185. package/dist/gaia-ops/skills/execution/SKILL.md +99 -0
  186. package/dist/gaia-ops/skills/fast-queries/SKILL.md +43 -0
  187. package/dist/gaia-ops/skills/gaia-compact/SKILL.md +74 -0
  188. package/dist/gaia-ops/skills/gaia-patterns/SKILL.md +108 -0
  189. package/dist/gaia-ops/skills/gaia-patterns/reference.md +395 -0
  190. package/dist/gaia-ops/skills/gaia-planner/SKILL.md +37 -0
  191. package/dist/gaia-ops/skills/gaia-planner/reference.md +107 -0
  192. package/dist/gaia-ops/skills/gaia-release/SKILL.md +85 -0
  193. package/dist/gaia-ops/skills/gaia-release/reference.md +92 -0
  194. package/dist/gaia-ops/skills/gaia-self-check/SKILL.md +114 -0
  195. package/dist/gaia-ops/skills/gaia-self-check/reference.md +453 -0
  196. package/dist/gaia-ops/skills/gaia-verify/SKILL.md +77 -0
  197. package/dist/gaia-ops/skills/gaia-verify/reference.md +80 -0
  198. package/dist/gaia-ops/skills/git-conventions/SKILL.md +47 -0
  199. package/dist/gaia-ops/skills/gitops-patterns/SKILL.md +60 -0
  200. package/dist/gaia-ops/skills/gitops-patterns/reference.md +183 -0
  201. package/dist/gaia-ops/skills/gmail-policy/SKILL.md +200 -0
  202. package/dist/gaia-ops/skills/gmail-policy/reference.md +150 -0
  203. package/dist/gaia-ops/skills/gmail-triage/SKILL.md +100 -0
  204. package/dist/gaia-ops/skills/gws-setup/SKILL.md +99 -0
  205. package/dist/gaia-ops/skills/gws-setup/reference.md +73 -0
  206. package/dist/gaia-ops/skills/investigation/SKILL.md +100 -0
  207. package/dist/gaia-ops/skills/memory-curation/SKILL.md +83 -0
  208. package/dist/gaia-ops/skills/memory-search/SKILL.md +88 -0
  209. package/dist/gaia-ops/skills/orchestrator-approval/SKILL.md +160 -0
  210. package/dist/gaia-ops/skills/orchestrator-approval/reference.md +174 -0
  211. package/dist/gaia-ops/skills/pending-approvals/SKILL.md +72 -0
  212. package/dist/gaia-ops/skills/pending-approvals/reference.md +214 -0
  213. package/dist/gaia-ops/skills/readme-writing/SKILL.md +71 -0
  214. package/dist/gaia-ops/skills/readme-writing/reference.md +188 -0
  215. package/dist/gaia-ops/skills/reference.md +135 -0
  216. package/dist/gaia-ops/skills/request-approval/SKILL.md +140 -0
  217. package/dist/gaia-ops/skills/request-approval/examples.md +140 -0
  218. package/dist/gaia-ops/skills/request-approval/reference.md +57 -0
  219. package/dist/gaia-ops/skills/schedule-task/SKILL.md +64 -0
  220. package/dist/gaia-ops/skills/schedule-task/reference.md +233 -0
  221. package/dist/gaia-ops/skills/security-tiers/SKILL.md +141 -0
  222. package/dist/gaia-ops/skills/security-tiers/destructive-commands-reference.md +623 -0
  223. package/dist/gaia-ops/skills/security-tiers/reference.md +39 -0
  224. package/dist/gaia-ops/skills/session-reflection/SKILL.md +69 -0
  225. package/dist/gaia-ops/skills/skill-creation/SKILL.md +92 -0
  226. package/dist/gaia-ops/skills/skill-creation/reference.md +29 -0
  227. package/dist/gaia-ops/skills/terraform-patterns/SKILL.md +89 -0
  228. package/dist/gaia-ops/skills/terraform-patterns/reference.md +93 -0
  229. package/dist/gaia-ops/tools/__init__.py +9 -0
  230. package/dist/gaia-ops/tools/agentic-loop/decide-status.py +210 -0
  231. package/dist/gaia-ops/tools/agentic-loop/parse-metric.py +106 -0
  232. package/dist/gaia-ops/tools/agentic-loop/record-iteration.py +221 -0
  233. package/dist/gaia-ops/tools/context/README.md +132 -0
  234. package/dist/gaia-ops/tools/context/__init__.py +42 -0
  235. package/dist/gaia-ops/tools/context/_paths.py +20 -0
  236. package/dist/gaia-ops/tools/context/context_provider.py +721 -0
  237. package/dist/gaia-ops/tools/context/context_section_reader.py +342 -0
  238. package/dist/gaia-ops/tools/context/deep_merge.py +159 -0
  239. package/dist/gaia-ops/tools/context/pending_updates.py +760 -0
  240. package/dist/gaia-ops/tools/context/surface_router.py +278 -0
  241. package/dist/gaia-ops/tools/fast-queries/README.md +65 -0
  242. package/dist/gaia-ops/tools/fast-queries/__init__.py +30 -0
  243. package/dist/gaia-ops/tools/fast-queries/appservices/quicktriage_devops_developer.sh +75 -0
  244. package/dist/gaia-ops/tools/fast-queries/cloud/aws/quicktriage_aws_troubleshooter.sh +32 -0
  245. package/dist/gaia-ops/tools/fast-queries/cloud/gcp/quicktriage_gcp_troubleshooter.sh +88 -0
  246. package/dist/gaia-ops/tools/fast-queries/gitops/quicktriage_gitops_operator.sh +48 -0
  247. package/dist/gaia-ops/tools/fast-queries/run_triage.sh +59 -0
  248. package/dist/gaia-ops/tools/fast-queries/terraform/quicktriage_terraform_architect.sh +80 -0
  249. package/dist/gaia-ops/tools/gaia_simulator/__init__.py +33 -0
  250. package/dist/gaia-ops/tools/gaia_simulator/cli.py +354 -0
  251. package/dist/gaia-ops/tools/gaia_simulator/extractor.py +457 -0
  252. package/dist/gaia-ops/tools/gaia_simulator/reporter.py +258 -0
  253. package/dist/gaia-ops/tools/gaia_simulator/routing_simulator.py +334 -0
  254. package/dist/gaia-ops/tools/gaia_simulator/runner.py +539 -0
  255. package/dist/gaia-ops/tools/gaia_simulator/skills_mapper.py +264 -0
  256. package/dist/gaia-ops/tools/memory/README.md +0 -0
  257. package/dist/gaia-ops/tools/memory/__init__.py +20 -0
  258. package/dist/gaia-ops/tools/memory/backfill_fts5.py +107 -0
  259. package/dist/gaia-ops/tools/memory/conflict_detector.py +295 -0
  260. package/dist/gaia-ops/tools/memory/episodic.py +1210 -0
  261. package/dist/gaia-ops/tools/memory/git_invalidator.py +262 -0
  262. package/dist/gaia-ops/tools/memory/paths.py +102 -0
  263. package/dist/gaia-ops/tools/memory/scoring.py +193 -0
  264. package/dist/gaia-ops/tools/memory/search_store.py +375 -0
  265. package/dist/gaia-ops/tools/persist_transcript_analysis.py +85 -0
  266. package/dist/gaia-ops/tools/review/__init__.py +1 -0
  267. package/dist/gaia-ops/tools/review/review_engine.py +157 -0
  268. package/dist/gaia-ops/tools/scan/__init__.py +35 -0
  269. package/dist/gaia-ops/tools/scan/config.py +247 -0
  270. package/dist/gaia-ops/tools/scan/merge.py +212 -0
  271. package/dist/gaia-ops/tools/scan/orchestrator.py +549 -0
  272. package/dist/gaia-ops/tools/scan/registry.py +127 -0
  273. package/dist/gaia-ops/tools/scan/scanners/__init__.py +18 -0
  274. package/dist/gaia-ops/tools/scan/scanners/base.py +137 -0
  275. package/dist/gaia-ops/tools/scan/scanners/environment.py +349 -0
  276. package/dist/gaia-ops/tools/scan/scanners/git.py +570 -0
  277. package/dist/gaia-ops/tools/scan/scanners/infrastructure.py +875 -0
  278. package/dist/gaia-ops/tools/scan/scanners/orchestration.py +600 -0
  279. package/dist/gaia-ops/tools/scan/scanners/stack.py +1085 -0
  280. package/dist/gaia-ops/tools/scan/scanners/tools.py +260 -0
  281. package/dist/gaia-ops/tools/scan/setup.py +686 -0
  282. package/dist/gaia-ops/tools/scan/tests/__init__.py +1 -0
  283. package/dist/gaia-ops/tools/scan/tests/conftest.py +796 -0
  284. package/dist/gaia-ops/tools/scan/tests/test_environment.py +323 -0
  285. package/dist/gaia-ops/tools/scan/tests/test_git.py +419 -0
  286. package/dist/gaia-ops/tools/scan/tests/test_infrastructure.py +382 -0
  287. package/dist/gaia-ops/tools/scan/tests/test_integration.py +920 -0
  288. package/dist/gaia-ops/tools/scan/tests/test_merge.py +269 -0
  289. package/dist/gaia-ops/tools/scan/tests/test_orchestration.py +304 -0
  290. package/dist/gaia-ops/tools/scan/tests/test_stack.py +604 -0
  291. package/dist/gaia-ops/tools/scan/tests/test_tools.py +349 -0
  292. package/dist/gaia-ops/tools/scan/ui.py +624 -0
  293. package/dist/gaia-ops/tools/scan/verify.py +270 -0
  294. package/dist/gaia-ops/tools/scan/walk.py +118 -0
  295. package/dist/gaia-ops/tools/scan/workspace.py +85 -0
  296. package/dist/gaia-ops/tools/validation/README.md +244 -0
  297. package/dist/gaia-ops/tools/validation/__init__.py +17 -0
  298. package/dist/gaia-ops/tools/validation/approval_gate.py +321 -0
  299. package/dist/gaia-ops/tools/validation/validate_skills.py +189 -0
  300. package/dist/gaia-security/.claude-plugin/plugin.json +24 -0
  301. package/dist/gaia-security/README.md +90 -0
  302. package/dist/gaia-security/config/universal-rules.json +102 -0
  303. package/dist/gaia-security/hooks/adapters/__init__.py +52 -0
  304. package/dist/gaia-security/hooks/adapters/base.py +219 -0
  305. package/dist/gaia-security/hooks/adapters/channel.py +17 -0
  306. package/dist/gaia-security/hooks/adapters/claude_code.py +1890 -0
  307. package/dist/gaia-security/hooks/adapters/types.py +194 -0
  308. package/dist/gaia-security/hooks/adapters/utils.py +25 -0
  309. package/dist/gaia-security/hooks/hooks.json +113 -0
  310. package/dist/gaia-security/hooks/modules/__init__.py +15 -0
  311. package/dist/gaia-security/hooks/modules/agents/__init__.py +29 -0
  312. package/dist/gaia-security/hooks/modules/agents/contract_validator.py +647 -0
  313. package/dist/gaia-security/hooks/modules/agents/response_contract.py +496 -0
  314. package/dist/gaia-security/hooks/modules/agents/skill_injection_verifier.py +120 -0
  315. package/dist/gaia-security/hooks/modules/agents/state_tracker.py +267 -0
  316. package/dist/gaia-security/hooks/modules/agents/task_info_builder.py +74 -0
  317. package/dist/gaia-security/hooks/modules/agents/transcript_analyzer.py +458 -0
  318. package/dist/gaia-security/hooks/modules/agents/transcript_reader.py +152 -0
  319. package/dist/gaia-security/hooks/modules/audit/__init__.py +28 -0
  320. package/dist/gaia-security/hooks/modules/audit/event_detector.py +168 -0
  321. package/dist/gaia-security/hooks/modules/audit/logger.py +131 -0
  322. package/dist/gaia-security/hooks/modules/audit/metrics.py +134 -0
  323. package/dist/gaia-security/hooks/modules/audit/workflow_auditor.py +611 -0
  324. package/dist/gaia-security/hooks/modules/audit/workflow_recorder.py +296 -0
  325. package/dist/gaia-security/hooks/modules/context/__init__.py +11 -0
  326. package/dist/gaia-security/hooks/modules/context/agentic_loop_detector.py +165 -0
  327. package/dist/gaia-security/hooks/modules/context/anchor_tracker.py +317 -0
  328. package/dist/gaia-security/hooks/modules/context/compact_context_builder.py +218 -0
  329. package/dist/gaia-security/hooks/modules/context/context_freshness.py +145 -0
  330. package/dist/gaia-security/hooks/modules/context/context_injector.py +558 -0
  331. package/dist/gaia-security/hooks/modules/context/context_writer.py +530 -0
  332. package/dist/gaia-security/hooks/modules/context/contracts_loader.py +161 -0
  333. package/dist/gaia-security/hooks/modules/core/__init__.py +40 -0
  334. package/dist/gaia-security/hooks/modules/core/hook_entry.py +78 -0
  335. package/dist/gaia-security/hooks/modules/core/paths.py +160 -0
  336. package/dist/gaia-security/hooks/modules/core/plugin_mode.py +149 -0
  337. package/dist/gaia-security/hooks/modules/core/plugin_setup.py +577 -0
  338. package/dist/gaia-security/hooks/modules/core/state.py +179 -0
  339. package/dist/gaia-security/hooks/modules/core/stdin.py +24 -0
  340. package/dist/gaia-security/hooks/modules/events/__init__.py +1 -0
  341. package/dist/gaia-security/hooks/modules/events/event_writer.py +210 -0
  342. package/dist/gaia-security/hooks/modules/memory/__init__.py +8 -0
  343. package/dist/gaia-security/hooks/modules/memory/episode_writer.py +216 -0
  344. package/dist/gaia-security/hooks/modules/orchestrator/__init__.py +1 -0
  345. package/dist/gaia-security/hooks/modules/orchestrator/delegate_mode.py +122 -0
  346. package/dist/gaia-security/hooks/modules/scanning/__init__.py +8 -0
  347. package/dist/gaia-security/hooks/modules/scanning/scan_trigger.py +84 -0
  348. package/dist/gaia-security/hooks/modules/security/__init__.py +120 -0
  349. package/dist/gaia-security/hooks/modules/security/approval_cleanup.py +87 -0
  350. package/dist/gaia-security/hooks/modules/security/approval_constants.py +23 -0
  351. package/dist/gaia-security/hooks/modules/security/approval_grants.py +1638 -0
  352. package/dist/gaia-security/hooks/modules/security/approval_messages.py +71 -0
  353. package/dist/gaia-security/hooks/modules/security/approval_scopes.py +222 -0
  354. package/dist/gaia-security/hooks/modules/security/blocked_commands.py +595 -0
  355. package/dist/gaia-security/hooks/modules/security/blocked_message_formatter.py +87 -0
  356. package/dist/gaia-security/hooks/modules/security/command_semantics.py +181 -0
  357. package/dist/gaia-security/hooks/modules/security/composition_rules.py +547 -0
  358. package/dist/gaia-security/hooks/modules/security/flag_classifiers.py +873 -0
  359. package/dist/gaia-security/hooks/modules/security/gitops_validator.py +179 -0
  360. package/dist/gaia-security/hooks/modules/security/mutative_verbs.py +1131 -0
  361. package/dist/gaia-security/hooks/modules/security/network_hosts.py +481 -0
  362. package/dist/gaia-security/hooks/modules/security/prompt_validator.py +40 -0
  363. package/dist/gaia-security/hooks/modules/security/shell_unwrapper.py +165 -0
  364. package/dist/gaia-security/hooks/modules/security/tiers.py +196 -0
  365. package/dist/gaia-security/hooks/modules/session/__init__.py +10 -0
  366. package/dist/gaia-security/hooks/modules/session/pending_scanner.py +174 -0
  367. package/dist/gaia-security/hooks/modules/session/session_context_writer.py +100 -0
  368. package/dist/gaia-security/hooks/modules/session/session_event_injector.py +160 -0
  369. package/dist/gaia-security/hooks/modules/session/session_manager.py +31 -0
  370. package/dist/gaia-security/hooks/modules/session/session_registry.py +333 -0
  371. package/dist/gaia-security/hooks/modules/tools/__init__.py +29 -0
  372. package/dist/gaia-security/hooks/modules/tools/bash_validator.py +1008 -0
  373. package/dist/gaia-security/hooks/modules/tools/cloud_pipe_validator.py +231 -0
  374. package/dist/gaia-security/hooks/modules/tools/hook_response.py +55 -0
  375. package/dist/gaia-security/hooks/modules/tools/shell_parser.py +227 -0
  376. package/dist/gaia-security/hooks/modules/tools/stage_decomposer.py +315 -0
  377. package/dist/gaia-security/hooks/modules/tools/task_validator.py +294 -0
  378. package/dist/gaia-security/hooks/modules/validation/__init__.py +23 -0
  379. package/dist/gaia-security/hooks/modules/validation/commit_validator.py +380 -0
  380. package/dist/gaia-security/hooks/post_tool_use.py +54 -0
  381. package/dist/gaia-security/hooks/pre_tool_use.py +413 -0
  382. package/dist/gaia-security/hooks/session_end_hook.py +77 -0
  383. package/dist/gaia-security/hooks/session_start.py +81 -0
  384. package/dist/gaia-security/hooks/stop_hook.py +70 -0
  385. package/dist/gaia-security/hooks/user_prompt_submit.py +246 -0
  386. package/dist/gaia-security/settings.json +58 -0
  387. package/git-hooks/commit-msg +41 -0
  388. package/hooks/README.md +100 -0
  389. package/hooks/adapters/__init__.py +52 -0
  390. package/hooks/adapters/base.py +219 -0
  391. package/hooks/adapters/channel.py +17 -0
  392. package/hooks/adapters/claude_code.py +1890 -0
  393. package/hooks/adapters/types.py +194 -0
  394. package/hooks/adapters/utils.py +25 -0
  395. package/hooks/elicitation_result.py +179 -0
  396. package/hooks/hooks.json +84 -0
  397. package/hooks/modules/README.md +189 -0
  398. package/hooks/modules/__init__.py +15 -0
  399. package/hooks/modules/agents/__init__.py +29 -0
  400. package/hooks/modules/agents/contract_validator.py +647 -0
  401. package/hooks/modules/agents/response_contract.py +496 -0
  402. package/hooks/modules/agents/skill_injection_verifier.py +120 -0
  403. package/hooks/modules/agents/state_tracker.py +267 -0
  404. package/hooks/modules/agents/task_info_builder.py +74 -0
  405. package/hooks/modules/agents/transcript_analyzer.py +458 -0
  406. package/hooks/modules/agents/transcript_reader.py +152 -0
  407. package/hooks/modules/audit/__init__.py +28 -0
  408. package/hooks/modules/audit/event_detector.py +168 -0
  409. package/hooks/modules/audit/logger.py +131 -0
  410. package/hooks/modules/audit/metrics.py +134 -0
  411. package/hooks/modules/audit/workflow_auditor.py +611 -0
  412. package/hooks/modules/audit/workflow_recorder.py +296 -0
  413. package/hooks/modules/context/__init__.py +11 -0
  414. package/hooks/modules/context/agentic_loop_detector.py +165 -0
  415. package/hooks/modules/context/anchor_tracker.py +317 -0
  416. package/hooks/modules/context/compact_context_builder.py +218 -0
  417. package/hooks/modules/context/context_freshness.py +145 -0
  418. package/hooks/modules/context/context_injector.py +558 -0
  419. package/hooks/modules/context/context_writer.py +530 -0
  420. package/hooks/modules/context/contracts_loader.py +161 -0
  421. package/hooks/modules/core/__init__.py +40 -0
  422. package/hooks/modules/core/hook_entry.py +78 -0
  423. package/hooks/modules/core/paths.py +160 -0
  424. package/hooks/modules/core/plugin_mode.py +149 -0
  425. package/hooks/modules/core/plugin_setup.py +577 -0
  426. package/hooks/modules/core/state.py +179 -0
  427. package/hooks/modules/core/stdin.py +24 -0
  428. package/hooks/modules/events/__init__.py +1 -0
  429. package/hooks/modules/events/event_writer.py +210 -0
  430. package/hooks/modules/evidence/__init__.py +34 -0
  431. package/hooks/modules/evidence/assertions.py +137 -0
  432. package/hooks/modules/evidence/index_writer.py +57 -0
  433. package/hooks/modules/evidence/loader.py +126 -0
  434. package/hooks/modules/evidence/runner.py +241 -0
  435. package/hooks/modules/memory/__init__.py +8 -0
  436. package/hooks/modules/memory/episode_writer.py +216 -0
  437. package/hooks/modules/orchestrator/__init__.py +1 -0
  438. package/hooks/modules/orchestrator/delegate_mode.py +122 -0
  439. package/hooks/modules/scanning/__init__.py +8 -0
  440. package/hooks/modules/scanning/scan_trigger.py +84 -0
  441. package/hooks/modules/security/__init__.py +120 -0
  442. package/hooks/modules/security/approval_cleanup.py +87 -0
  443. package/hooks/modules/security/approval_constants.py +23 -0
  444. package/hooks/modules/security/approval_grants.py +1638 -0
  445. package/hooks/modules/security/approval_messages.py +71 -0
  446. package/hooks/modules/security/approval_scopes.py +222 -0
  447. package/hooks/modules/security/blocked_commands.py +595 -0
  448. package/hooks/modules/security/blocked_message_formatter.py +87 -0
  449. package/hooks/modules/security/command_semantics.py +181 -0
  450. package/hooks/modules/security/composition_rules.py +547 -0
  451. package/hooks/modules/security/flag_classifiers.py +873 -0
  452. package/hooks/modules/security/gitops_validator.py +179 -0
  453. package/hooks/modules/security/mutative_verbs.py +1131 -0
  454. package/hooks/modules/security/network_hosts.py +481 -0
  455. package/hooks/modules/security/prompt_validator.py +40 -0
  456. package/hooks/modules/security/shell_unwrapper.py +165 -0
  457. package/hooks/modules/security/tiers.py +196 -0
  458. package/hooks/modules/session/__init__.py +10 -0
  459. package/hooks/modules/session/pending_scanner.py +174 -0
  460. package/hooks/modules/session/session_context_writer.py +100 -0
  461. package/hooks/modules/session/session_event_injector.py +160 -0
  462. package/hooks/modules/session/session_manager.py +31 -0
  463. package/hooks/modules/session/session_registry.py +333 -0
  464. package/hooks/modules/tools/__init__.py +29 -0
  465. package/hooks/modules/tools/bash_validator.py +1008 -0
  466. package/hooks/modules/tools/cloud_pipe_validator.py +231 -0
  467. package/hooks/modules/tools/hook_response.py +55 -0
  468. package/hooks/modules/tools/shell_parser.py +227 -0
  469. package/hooks/modules/tools/stage_decomposer.py +315 -0
  470. package/hooks/modules/tools/task_validator.py +294 -0
  471. package/hooks/modules/validation/__init__.py +23 -0
  472. package/hooks/modules/validation/commit_validator.py +380 -0
  473. package/hooks/post_compact.py +43 -0
  474. package/hooks/post_tool_use.py +54 -0
  475. package/hooks/pre_compact.py +60 -0
  476. package/hooks/pre_tool_use.py +413 -0
  477. package/hooks/session_end_hook.py +77 -0
  478. package/hooks/session_start.py +81 -0
  479. package/hooks/stop_hook.py +70 -0
  480. package/hooks/subagent_start.py +71 -0
  481. package/hooks/subagent_stop.py +295 -0
  482. package/hooks/task_completed.py +70 -0
  483. package/hooks/user_prompt_submit.py +246 -0
  484. package/index.js +83 -0
  485. package/package.json +103 -0
  486. package/pyproject.toml +32 -0
  487. package/skills/README.md +158 -0
  488. package/skills/agent-creation/SKILL.md +87 -0
  489. package/skills/agent-creation/examples.md +170 -0
  490. package/skills/agent-creation/reference.md +191 -0
  491. package/skills/agent-protocol/SKILL.md +93 -0
  492. package/skills/agent-protocol/examples.md +223 -0
  493. package/skills/agent-response/SKILL.md +69 -0
  494. package/skills/agentic-loop/SKILL.md +80 -0
  495. package/skills/agentic-loop/reference.md +378 -0
  496. package/skills/blog-writing/SKILL.md +98 -0
  497. package/skills/blog-writing/reference.md +130 -0
  498. package/skills/brief-spec/SKILL.md +185 -0
  499. package/skills/command-execution/SKILL.md +64 -0
  500. package/skills/command-execution/reference.md +83 -0
  501. package/skills/context-updater/SKILL.md +87 -0
  502. package/skills/context-updater/examples.md +71 -0
  503. package/skills/developer-patterns/SKILL.md +50 -0
  504. package/skills/developer-patterns/reference.md +112 -0
  505. package/skills/execution/SKILL.md +99 -0
  506. package/skills/fast-queries/SKILL.md +43 -0
  507. package/skills/gaia-compact/SKILL.md +74 -0
  508. package/skills/gaia-patterns/SKILL.md +108 -0
  509. package/skills/gaia-patterns/reference.md +395 -0
  510. package/skills/gaia-planner/SKILL.md +37 -0
  511. package/skills/gaia-planner/reference.md +107 -0
  512. package/skills/gaia-release/SKILL.md +85 -0
  513. package/skills/gaia-release/reference.md +92 -0
  514. package/skills/gaia-self-check/SKILL.md +114 -0
  515. package/skills/gaia-self-check/reference.md +453 -0
  516. package/skills/gaia-verify/SKILL.md +77 -0
  517. package/skills/gaia-verify/reference.md +80 -0
  518. package/skills/git-conventions/SKILL.md +47 -0
  519. package/skills/gitops-patterns/SKILL.md +60 -0
  520. package/skills/gitops-patterns/reference.md +183 -0
  521. package/skills/gmail-policy/SKILL.md +200 -0
  522. package/skills/gmail-policy/reference.md +150 -0
  523. package/skills/gmail-triage/SKILL.md +100 -0
  524. package/skills/gws-setup/SKILL.md +99 -0
  525. package/skills/gws-setup/reference.md +73 -0
  526. package/skills/investigation/SKILL.md +100 -0
  527. package/skills/memory-curation/SKILL.md +83 -0
  528. package/skills/memory-search/SKILL.md +88 -0
  529. package/skills/orchestrator-approval/SKILL.md +160 -0
  530. package/skills/orchestrator-approval/reference.md +174 -0
  531. package/skills/pending-approvals/SKILL.md +72 -0
  532. package/skills/pending-approvals/reference.md +214 -0
  533. package/skills/readme-writing/SKILL.md +71 -0
  534. package/skills/readme-writing/reference.md +188 -0
  535. package/skills/reference.md +135 -0
  536. package/skills/request-approval/SKILL.md +140 -0
  537. package/skills/request-approval/examples.md +140 -0
  538. package/skills/request-approval/reference.md +57 -0
  539. package/skills/schedule-task/SKILL.md +64 -0
  540. package/skills/schedule-task/reference.md +233 -0
  541. package/skills/security-tiers/SKILL.md +141 -0
  542. package/skills/security-tiers/destructive-commands-reference.md +623 -0
  543. package/skills/security-tiers/reference.md +39 -0
  544. package/skills/session-reflection/SKILL.md +69 -0
  545. package/skills/skill-creation/SKILL.md +92 -0
  546. package/skills/skill-creation/reference.md +29 -0
  547. package/skills/terraform-patterns/SKILL.md +89 -0
  548. package/skills/terraform-patterns/reference.md +93 -0
  549. package/templates/README.md +69 -0
  550. package/templates/managed-settings.template.json +43 -0
  551. package/tools/__init__.py +9 -0
  552. package/tools/agentic-loop/decide-status.py +210 -0
  553. package/tools/agentic-loop/parse-metric.py +106 -0
  554. package/tools/agentic-loop/record-iteration.py +221 -0
  555. package/tools/context/README.md +132 -0
  556. package/tools/context/__init__.py +42 -0
  557. package/tools/context/_paths.py +20 -0
  558. package/tools/context/context_provider.py +721 -0
  559. package/tools/context/context_section_reader.py +342 -0
  560. package/tools/context/deep_merge.py +159 -0
  561. package/tools/context/pending_updates.py +760 -0
  562. package/tools/context/surface_router.py +278 -0
  563. package/tools/fast-queries/README.md +65 -0
  564. package/tools/fast-queries/__init__.py +30 -0
  565. package/tools/fast-queries/appservices/quicktriage_devops_developer.sh +75 -0
  566. package/tools/fast-queries/cloud/aws/quicktriage_aws_troubleshooter.sh +32 -0
  567. package/tools/fast-queries/cloud/gcp/quicktriage_gcp_troubleshooter.sh +88 -0
  568. package/tools/fast-queries/gitops/quicktriage_gitops_operator.sh +48 -0
  569. package/tools/fast-queries/run_triage.sh +59 -0
  570. package/tools/fast-queries/terraform/quicktriage_terraform_architect.sh +80 -0
  571. package/tools/gaia_simulator/__init__.py +33 -0
  572. package/tools/gaia_simulator/cli.py +354 -0
  573. package/tools/gaia_simulator/extractor.py +457 -0
  574. package/tools/gaia_simulator/reporter.py +258 -0
  575. package/tools/gaia_simulator/routing_simulator.py +334 -0
  576. package/tools/gaia_simulator/runner.py +539 -0
  577. package/tools/gaia_simulator/skills_mapper.py +264 -0
  578. package/tools/memory/README.md +0 -0
  579. package/tools/memory/__init__.py +20 -0
  580. package/tools/memory/backfill_fts5.py +107 -0
  581. package/tools/memory/conflict_detector.py +295 -0
  582. package/tools/memory/episodic.py +1210 -0
  583. package/tools/memory/git_invalidator.py +262 -0
  584. package/tools/memory/paths.py +102 -0
  585. package/tools/memory/scoring.py +193 -0
  586. package/tools/memory/search_store.py +375 -0
  587. package/tools/persist_transcript_analysis.py +85 -0
  588. package/tools/review/__init__.py +1 -0
  589. package/tools/review/review_engine.py +157 -0
  590. package/tools/scan/__init__.py +35 -0
  591. package/tools/scan/config.py +247 -0
  592. package/tools/scan/merge.py +212 -0
  593. package/tools/scan/orchestrator.py +549 -0
  594. package/tools/scan/registry.py +127 -0
  595. package/tools/scan/scanners/__init__.py +18 -0
  596. package/tools/scan/scanners/base.py +137 -0
  597. package/tools/scan/scanners/environment.py +349 -0
  598. package/tools/scan/scanners/git.py +570 -0
  599. package/tools/scan/scanners/infrastructure.py +875 -0
  600. package/tools/scan/scanners/orchestration.py +600 -0
  601. package/tools/scan/scanners/stack.py +1085 -0
  602. package/tools/scan/scanners/tools.py +260 -0
  603. package/tools/scan/setup.py +686 -0
  604. package/tools/scan/tests/__init__.py +1 -0
  605. package/tools/scan/tests/conftest.py +796 -0
  606. package/tools/scan/tests/test_environment.py +323 -0
  607. package/tools/scan/tests/test_git.py +419 -0
  608. package/tools/scan/tests/test_infrastructure.py +382 -0
  609. package/tools/scan/tests/test_integration.py +920 -0
  610. package/tools/scan/tests/test_merge.py +269 -0
  611. package/tools/scan/tests/test_orchestration.py +304 -0
  612. package/tools/scan/tests/test_stack.py +604 -0
  613. package/tools/scan/tests/test_tools.py +349 -0
  614. package/tools/scan/ui.py +624 -0
  615. package/tools/scan/verify.py +270 -0
  616. package/tools/scan/walk.py +118 -0
  617. package/tools/scan/workspace.py +85 -0
  618. package/tools/validation/README.md +244 -0
  619. package/tools/validation/__init__.py +17 -0
  620. package/tools/validation/approval_gate.py +321 -0
  621. package/tools/validation/validate_skills.py +189 -0
@@ -0,0 +1,191 @@
1
+ # Agent Creation -- Reference
2
+
3
+ Detailed template, dimension guidance, and weight test per component. Read on-demand when drafting or reviewing an agent definition.
4
+
5
+ ---
6
+
7
+ ## Specialist Agent Template
8
+
9
+ The canonical structure for a Gaia specialist agent. Sections marked [REQUIRED] appear in every specialist. Sections marked [CONDITIONAL] appear when the corresponding dimension applies.
10
+
11
+ ```markdown
12
+ ---
13
+ name: <kebab-case-name>
14
+ description: <triggering conditions -- when the orchestrator should dispatch this agent>
15
+ tools: Read, Edit, Write, Glob, Grep, Bash, Task, Skill # restrict to what the domain actually needs
16
+ model: inherit
17
+ maxTurns: 40 # omit only for short-lived agents
18
+ permissionMode: acceptEdits # required if D1=yes (agent mutates state)
19
+ disallowedTools: [Write, Edit, NotebookEdit] # include if D1=no and enforcement matters
20
+ color: <optional -- hex or color name>
21
+ skills:
22
+ - agent-protocol # always first
23
+ - security-tiers # always second
24
+ - command-execution # if agent runs Bash commands
25
+ - investigation # if agent diagnoses complex state
26
+ - <domain-skill> # agent's domain patterns
27
+ - context-updater # if agent may discover new system state
28
+ - fast-queries # if agent diagnoses cloud/system health
29
+ ---
30
+
31
+ ## Workflow [REQUIRED if domain has a non-obvious sequence]
32
+
33
+ 1. **Step name**: Brief rationale for why this step comes first.
34
+ 2. **Step name**: What to do and what to look at.
35
+ 3. **Step name**: When to surface for approval vs proceed.
36
+
37
+ ## Identity [REQUIRED]
38
+
39
+ You are a <role with stakes>. You <what you uniquely see or are constrained to do>.
40
+
41
+ **Your output is always a <Realization Package | Diagnostic Report | Findings Report>:**
42
+ - What the output contains
43
+ - What it never contains (hybrid outputs drift)
44
+
45
+ ## <Domain-Specific Section> [CONDITIONAL -- only if lookup logic is agent-specific]
46
+
47
+ Tables, decision trees, or classification logic that only applies to this agent.
48
+ If the same logic would help another agent, extract it to a skill instead.
49
+
50
+ ## Scope [REQUIRED]
51
+
52
+ ### CAN DO
53
+ - Concrete capability 1
54
+ - Concrete capability 2
55
+
56
+ ### CANNOT DO -> DELEGATE [REQUIRED]
57
+
58
+ | Need | Agent |
59
+ |------|-------|
60
+ | <boundary description that names the decision point> | `<agent-name>` |
61
+
62
+ ## Domain Errors [REQUIRED]
63
+
64
+ | Error | Action |
65
+ |-------|--------|
66
+ | <specific error or condition> | <concrete action, not "report the error"> |
67
+
68
+ ## Surface Signals (proposed) [CONDITIONAL -- if D3=yes, remove after gaia-system applies]
69
+
70
+ ```json
71
+ {
72
+ "intent": "<what this agent handles>",
73
+ "primary_agent": "<agent-name>",
74
+ "signals": {
75
+ "high_confidence": ["keyword1", "keyword2"],
76
+ "medium_confidence": ["keyword3", "keyword4"]
77
+ }
78
+ }
79
+ ```
80
+ ```
81
+
82
+ ---
83
+
84
+ ## The 3 Bifurcating Dimensions -- Detailed
85
+
86
+ ### D1: Does the agent mutate system state?
87
+
88
+ "Mutate" means writing files, running commands that change resource state, or committing to VCS. The distinction matters because:
89
+
90
+ - Mutation requires T3 approval flow. An agent that can write but has no T3 handling in its failure model will either block silently or execute without user awareness.
91
+ - Read-only agents gain security value from `disallowedTools`, not just from not listing Write/Edit. A later frontmatter edit that adds a tool to a read-only agent should be caught by explicit disallow, not by convention.
92
+
93
+ **D1=yes implications:**
94
+ - `permissionMode: acceptEdits` in frontmatter
95
+ - `Write`, `Edit` listed in tools
96
+ - Failure handling covers T3 block + APPROVAL_REQUEST flow
97
+ - Output type is "Realization Package" (contains code/config changes)
98
+
99
+ **D1=no implications:**
100
+ - `disallowedTools: [Write, Edit, NotebookEdit]`
101
+ - No T3 surface in failure handling
102
+ - Output type is "Diagnostic Report" or "Findings Report"
103
+
104
+ ### D2: Does the agent delegate to other agents?
105
+
106
+ Specialist agents are almost always terminal. "Delegation" here means the agent dispatches other agents (uses the Agent tool mid-task). Most specialists do not -- they surface CANNOT DO items back to the orchestrator, which handles routing.
107
+
108
+ **D2=yes implications (rare):**
109
+ - `Agent` in tools list
110
+ - A delegation table in the body describing which agents it dispatches and under what conditions
111
+
112
+ **D2=no implications (standard):**
113
+ - No `Agent` in tools (or `Agent` explicitly disallowed)
114
+ - CANNOT DO -> DELEGATE table is for the orchestrator's reference, not for the agent to act on directly
115
+
116
+ ### D3: Does the agent enter the orchestrator's automatic routing?
117
+
118
+ Almost all specialists do. The exception would be a utility agent that is only dispatched explicitly, never via intent routing.
119
+
120
+ **D3=yes implications:**
121
+ - Description field written as triggering conditions (see Step 5 in SKILL.md)
122
+ - Surface signals proposed for `surface-routing.json`
123
+ - Description must not overlap with signals of existing agents (check `config/surface-routing.json` before finalizing)
124
+
125
+ ---
126
+
127
+ ## Weight Test per Component
128
+
129
+ Use this checklist when reviewing a drafted agent. For each component, the test question is: if this section were removed, would the agent behave differently in a realistic scenario?
130
+
131
+ ### Identity weight test
132
+
133
+ | What you wrote | Does it pass? | Why |
134
+ |---|---|---|
135
+ | "You are a specialist in Terraform." | No | Baseline -- the LLM already knows what Terraform specialists do. |
136
+ | "You are a senior Terraform architect. You manage the lifecycle by working primarily with the declarative config in the repository. You never query live cloud resources directly." | Yes | The constraint ("never query live cloud") and the orientation ("declarative config, not live state") are not the LLM's default. They redirect behavior. |
137
+
138
+ **Fix:** Add the constraint or orientation that distinguishes this agent from a generic expert. The identity earns its place by narrowing the action space.
139
+
140
+ ### Scope weight test
141
+
142
+ | What you wrote | Does it pass? | Why |
143
+ |---|---|---|
144
+ | "CANNOT DO: cloud infrastructure → terraform-architect" | Weak | Too broad. The agent will still touch cloud config when it seems "close enough." |
145
+ | "If the resource type is managed by IaC, creating it belongs to terraform-architect even if you need it as a prerequisite for your task." | Yes | Names the decision moment. Agent knows to stop at "I need this resource created" rather than proceeding. |
146
+
147
+ **Fix:** Identify the specific moment the agent would rationalize crossing the boundary, and make that moment explicit.
148
+
149
+ ### Domain Errors weight test
150
+
151
+ | What you wrote | Does it pass? | Why |
152
+ |---|---|---|
153
+ | `terraform init fails → Check credentials` | Marginal | "Check credentials" is the default. Passes only if the agent would normally do something worse. |
154
+ | `Plan shows unexpected destroys → HALT -- report, require explicit confirmation` | Yes | "HALT" is not the default. The agent would normally continue to apply. |
155
+
156
+ **Fix:** For each error row, ask what a naive agent would do. If the row's action is identical to the default, it adds no weight.
157
+
158
+ ### Output type weight test
159
+
160
+ An output type declaration passes if it excludes a hybrid the agent would otherwise produce. "Your output is code or a report -- never both" prevents the agent from writing files *and* returning a summary in the same turn -- a pattern that creates ambiguity about what was done. If the output type only names what the agent always produces anyway, it is decorative.
161
+
162
+ ---
163
+
164
+ ## Frontmatter Field Reference
165
+
166
+ | Field | Type | Required | Notes |
167
+ |-------|------|----------|-------|
168
+ | `name` | string | Yes | kebab-case; matches file name |
169
+ | `description` | string | Yes | Triggering conditions only -- what makes the orchestrator dispatch this agent |
170
+ | `tools` | list | Yes | Only what the domain actually uses; omitting is better than bloating |
171
+ | `model` | string | Yes | `inherit` for most; `sonnet` if the agent needs a specific model pinned |
172
+ | `permissionMode` | string | D1=yes | `acceptEdits` -- required for agents that write files |
173
+ | `disallowedTools` | list | D1=no | Include when read-only enforcement matters beyond convention |
174
+ | `maxTurns` | int | Recommended | 40 for most specialists; 50+ for agents with complex investigation phases |
175
+ | `skills` | list | Yes | `agent-protocol` always first, `security-tiers` always second |
176
+ | `color` | string | Optional | Hex or color name for visual routing distinction |
177
+
178
+ ---
179
+
180
+ ## Systemic Files the Agent Creation Touches
181
+
182
+ This skill guides thinking about each file, but gaia-system (the invoking agent) applies the writes.
183
+
184
+ | File | What changes | Who writes it |
185
+ |------|--------------|---------------|
186
+ | `.claude/agents/<name>.md` | New agent definition | gaia-system |
187
+ | `config/surface-routing.json` | New surface entry with signals | gaia-system |
188
+ | `.claude/skills/README.md` | Agent assignment matrix (if agent gets new skills) | gaia-system |
189
+ | `agents/README.md` | New agent in the roster | gaia-system |
190
+
191
+ The skill does not modify any of these files directly.
@@ -0,0 +1,93 @@
1
+ ---
2
+ name: agent-protocol
3
+ description: Use when producing any agent response
4
+ metadata:
5
+ user-invocable: false
6
+ type: protocol
7
+ ---
8
+
9
+ # Agent Protocol
10
+
11
+ This protocol governs REPORTING FORMAT, not tool access. All agents may use their declared tools during any phase.
12
+
13
+ ## Response Contract
14
+
15
+ Every response MUST end with a single fenced `json:contract` block.
16
+
17
+ ```json:contract
18
+ {
19
+ "agent_status": {
20
+ "plan_status": "<STATUS>",
21
+ "agent_id": "<a + 5+ hex chars>",
22
+ "pending_steps": [],
23
+ "next_action": "done"
24
+ },
25
+ "evidence_report": {
26
+ "patterns_checked": [],
27
+ "files_checked": [],
28
+ "commands_run": [],
29
+ "key_outputs": [],
30
+ "verbatim_outputs": [],
31
+ "cross_layer_impacts": [],
32
+ "open_gaps": [],
33
+ "verification": null
34
+ },
35
+ "consolidation_report": null,
36
+ "approval_request": null
37
+ }
38
+ ```
39
+
40
+ **agent_status** -- `plan_status` (one of 5 states below), `agent_id` (generate once, reuse), `pending_steps` (`[]` when done), `next_action` (`"done"` or what's next).
41
+
42
+ **evidence_report** -- Use `[]` when not applicable, 1-3 items each. `key_outputs`: what changed. `verbatim_outputs`: literal output, truncate ~100 lines. `cross_layer_impacts`: adjacent surfaces. `open_gaps`: what remains unverified. `verification`: **required when COMPLETE** (see Verification Gate), `null` otherwise.
43
+
44
+ **consolidation_report** -- Required when `consolidation_required` or `multi_surface` is true. Otherwise `null`. Fields: `ownership_assessment`, `confirmed_findings`, `suspected_findings`, `conflicts`, `next_best_agent`. See `examples.md`.
45
+
46
+ **approval_request** -- Required when APPROVAL_REQUEST. Fields: `operation`, `exact_content`, `scope`, `risk_level`, `rollback`, `verification`. On `[T3_BLOCKED]` with `approval_id`: set APPROVAL_REQUEST, include `approval_id`, wait. See `examples.md`.
47
+
48
+ ## Universal Execution Loop
49
+
50
+ Each increment: **INVESTIGATE** (read, search) -> **PLAN** (propose; APPROVAL_REQUEST if T3) -> **EXECUTE** (write, run) -> **VERIFY** (confirm results) -> **COMPLETE** or loop back on failure. Decompose large tasks into 2-5 increments; each is one action paired with one verification. Every increment ends verified. Fix before moving on -- compounding failures is exponential.
51
+
52
+ ## Verification Gate
53
+
54
+ An agent cannot set `plan_status: "COMPLETE"` without a `verification` object in `evidence_report`. When verification fails, loop back to EXECUTE -- do not complete.
55
+
56
+ ```json
57
+ "verification": {
58
+ "method": "test | dry-run | metric | self-review",
59
+ "checks": ["what was checked"],
60
+ "result": "pass | fail",
61
+ "details": "concrete evidence"
62
+ }
63
+ ```
64
+
65
+ Choose the method that fits your domain. Infrastructure: `dry-run` (terraform plan). Code: `test` (pytest, lint). Gaia skills: `self-review` (line count, frontmatter). Email: `metric` (count match). Git/file ops: `test` or `self-review`. When no automated check exists, `self-review` is the minimum: state what you checked and what you observed. For full examples see `examples.md`.
66
+
67
+ ## State Machine
68
+
69
+ | Status | Meaning |
70
+ |--------|---------|
71
+ | `IN_PROGRESS` | Investigating, planning, or executing work |
72
+ | `APPROVAL_REQUEST` | Emitted when a hook blocks a specific mutative command -- agent requests user approval for the exact command via `approval_request` |
73
+ | `COMPLETE` | Verified -- `verification.result` is `"pass"` |
74
+ | `BLOCKED` | Cannot proceed -- escalated |
75
+ | `NEEDS_INPUT` | Missing information from user |
76
+
77
+ ### Transitions
78
+
79
+ ```
80
+ IN_PROGRESS -> COMPLETE (requires verification evidence)
81
+ IN_PROGRESS -> APPROVAL_REQUEST -> IN_PROGRESS -> COMPLETE
82
+ IN_PROGRESS -> BLOCKED | NEEDS_INPUT (any point)
83
+ IN_PROGRESS -> IN_PROGRESS (retry or verify-fail loop, max 2)
84
+ ```
85
+
86
+ ## Error Handling
87
+
88
+ | Type | Action | Status |
89
+ |------|--------|--------|
90
+ | Recoverable | Fix and retry (max 2) | `IN_PROGRESS` |
91
+ | Blocker | Log details, list solutions | `BLOCKED` |
92
+ | Ambiguous | List options | `NEEDS_INPUT` |
93
+ | Contract repair | Reissue `json:contract`, skip re-investigation (max 2) | `IN_PROGRESS` |
@@ -0,0 +1,223 @@
1
+ # Agent Protocol -- Status-Specific Examples
2
+
3
+ Read on-demand when constructing a `json:contract` block.
4
+ See `SKILL.md` for the schema definition and field rules.
5
+
6
+ ## COMPLETE (verified result)
7
+
8
+ ```json:contract
9
+ {
10
+ "agent_status": {
11
+ "plan_status": "COMPLETE",
12
+ "agent_id": "ab7e4d2",
13
+ "pending_steps": [],
14
+ "next_action": "done"
15
+ },
16
+ "evidence_report": {
17
+ "patterns_checked": ["existing HelmRelease naming convention in flux/apps/"],
18
+ "files_checked": ["flux/apps/qxo-api/helmrelease.yaml"],
19
+ "commands_run": ["kubectl get hr -n qxo -> all reconciled"],
20
+ "key_outputs": ["All 12 HelmReleases healthy, no drift detected"],
21
+ "verbatim_outputs": [],
22
+ "cross_layer_impacts": [],
23
+ "open_gaps": [],
24
+ "verification": {
25
+ "method": "test",
26
+ "checks": ["kubectl get hr -n qxo shows all reconciled", "no suspended or failed HelmReleases"],
27
+ "result": "pass",
28
+ "details": "12/12 HelmReleases Ready=True. Last reconciled within 5m."
29
+ }
30
+ },
31
+ "consolidation_report": null,
32
+ "approval_request": null
33
+ }
34
+ ```
35
+
36
+ ## BLOCKED (cannot proceed)
37
+
38
+ ```json:contract
39
+ {
40
+ "agent_status": {
41
+ "plan_status": "BLOCKED",
42
+ "agent_id": "ac3a1f9",
43
+ "pending_steps": ["validate IAM binding", "apply terraform change"],
44
+ "next_action": "User must grant roles/container.admin to SA"
45
+ },
46
+ "evidence_report": {
47
+ "patterns_checked": ["SA binding pattern in terraform/iam/"],
48
+ "files_checked": ["terraform/iam/main.tf", "terraform/iam/variables.tf"],
49
+ "commands_run": ["gcloud iam service-accounts get-iam-policy sa@proj.iam -> missing binding"],
50
+ "key_outputs": ["SA lacks roles/container.admin required for node pool ops"],
51
+ "verbatim_outputs": ["gcloud iam service-accounts get-iam-policy sa@proj.iam:\n```\nbindings: []\n```"],
52
+ "cross_layer_impacts": ["GKE node pool scaling depends on this SA"],
53
+ "open_gaps": ["Whether SA should get role directly or via workload identity"],
54
+ "verification": null
55
+ },
56
+ "consolidation_report": null,
57
+ "approval_request": null
58
+ }
59
+ ```
60
+
61
+ ## NEEDS_INPUT (missing information)
62
+
63
+ ```json:contract
64
+ {
65
+ "agent_status": {
66
+ "plan_status": "NEEDS_INPUT",
67
+ "agent_id": "ad9f2b1",
68
+ "pending_steps": ["create namespace manifest", "configure HelmRelease"],
69
+ "next_action": "User must choose: Option A (shared namespace) or Option B (dedicated namespace)"
70
+ },
71
+ "evidence_report": {
72
+ "patterns_checked": ["namespace conventions in flux/clusters/"],
73
+ "files_checked": ["flux/clusters/dev/namespaces/"],
74
+ "commands_run": [],
75
+ "key_outputs": ["Both patterns exist in codebase -- no single convention"],
76
+ "verbatim_outputs": [],
77
+ "cross_layer_impacts": ["Network policies differ per pattern"],
78
+ "open_gaps": ["User preference for namespace isolation"],
79
+ "verification": null
80
+ },
81
+ "consolidation_report": null,
82
+ "approval_request": null
83
+ }
84
+ ```
85
+
86
+ ## APPROVAL_REQUEST (hook blocked T3 command or plan ready for user feedback)
87
+
88
+ ```json:contract
89
+ {
90
+ "agent_status": {
91
+ "plan_status": "APPROVAL_REQUEST",
92
+ "agent_id": "ae5c8a3",
93
+ "pending_steps": ["execute terraform apply", "verify state"],
94
+ "next_action": "Awaiting user feedback on terraform apply plan"
95
+ },
96
+ "evidence_report": {
97
+ "patterns_checked": ["existing bucket naming in terraform/gcs/"],
98
+ "files_checked": ["terraform/gcs/main.tf", "terraform/gcs/variables.tf"],
99
+ "commands_run": ["terraform plan -out=tfplan -> 1 to add, 0 to change, 0 to destroy"],
100
+ "key_outputs": ["Plan adds 1 GCS bucket with standard config"],
101
+ "verbatim_outputs": ["terraform plan:\n```\n+ google_storage_bucket.events\n name: qxo-events-dev\n location: us-east4\n```"],
102
+ "cross_layer_impacts": ["Flux ExternalSecret must reference new bucket"],
103
+ "open_gaps": [],
104
+ "verification": null
105
+ },
106
+ "consolidation_report": null,
107
+ "approval_request": {
108
+ "operation": "Create GCS bucket qxo-events-dev",
109
+ "exact_content": "terraform apply -auto-approve",
110
+ "scope": "terraform/gcs/main.tf, GCS bucket in us-east4",
111
+ "risk_level": "MEDIUM",
112
+ "rollback": "terraform destroy -target=google_storage_bucket.events",
113
+ "verification": "gcloud storage buckets describe gs://qxo-events-dev"
114
+ }
115
+ }
116
+ ```
117
+
118
+ ## APPROVAL_REQUEST with approval_id (hook blocked T3 command)
119
+
120
+ ```json:contract
121
+ {
122
+ "agent_status": {
123
+ "plan_status": "APPROVAL_REQUEST",
124
+ "agent_id": "af1d9b7",
125
+ "pending_steps": ["execute git push", "verify Flux reconciliation"],
126
+ "next_action": "Hook blocked git push -- awaiting user approval"
127
+ },
128
+ "evidence_report": {
129
+ "patterns_checked": ["git branch naming in flux/clusters/"],
130
+ "files_checked": ["flux/apps/qxo-api/helmrelease.yaml"],
131
+ "commands_run": ["git diff HEAD -> 1 file changed", "git push origin main -> BLOCKED by hook"],
132
+ "key_outputs": ["Push blocked by security hook, approval_id issued"],
133
+ "verbatim_outputs": ["[T3_BLOCKED] MUTATIVE operation requires user approval. approval_id: a1b2c3..."],
134
+ "cross_layer_impacts": ["Flux will reconcile HelmRelease on push"],
135
+ "open_gaps": [],
136
+ "verification": null
137
+ },
138
+ "consolidation_report": null,
139
+ "approval_request": {
140
+ "operation": "Push HelmRelease changes to main",
141
+ "exact_content": "git push origin main",
142
+ "scope": "flux/apps/qxo-api/helmrelease.yaml",
143
+ "risk_level": "MEDIUM",
144
+ "rollback": "git revert HEAD && git push",
145
+ "verification": "flux get hr -n qxo -> reconciled",
146
+ "approval_id": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
147
+ }
148
+ }
149
+ ```
150
+
151
+ ## With Consolidation (multi-surface task)
152
+
153
+ ```json:contract
154
+ {
155
+ "agent_status": {
156
+ "plan_status": "COMPLETE",
157
+ "agent_id": "af4b2e8",
158
+ "pending_steps": [],
159
+ "next_action": "done"
160
+ },
161
+ "evidence_report": {
162
+ "patterns_checked": ["terraform module structure in terraform/modules/"],
163
+ "files_checked": ["terraform/modules/gke/main.tf", "flux/clusters/dev/kustomization.yaml"],
164
+ "commands_run": ["terragrunt plan -chdir=/abs/path -> no changes"],
165
+ "key_outputs": ["Terraform state matches code; Flux kustomization references correct cluster"],
166
+ "verbatim_outputs": [],
167
+ "cross_layer_impacts": ["Flux depends on GKE node pool count from terraform output"],
168
+ "open_gaps": ["HPA config in flux not verified"],
169
+ "verification": {
170
+ "method": "dry-run",
171
+ "checks": ["terragrunt plan shows no changes", "kustomization references match cluster name"],
172
+ "result": "pass",
173
+ "details": "Plan: 0 to add, 0 to change, 0 to destroy. Kustomization sourceRef matches cluster af4b2e8."
174
+ }
175
+ },
176
+ "consolidation_report": {
177
+ "ownership_assessment": "cross_surface_dependency",
178
+ "confirmed_findings": ["GKE cluster config matches terraform code", "Node pool count is 3 in both plan and live"],
179
+ "suspected_findings": ["HPA max replicas may exceed node capacity"],
180
+ "conflicts": [],
181
+ "open_gaps": ["HPA config in flux not verified -- gitops-operator should check"],
182
+ "next_best_agent": "gitops-operator"
183
+ },
184
+ "approval_request": null
185
+ }
186
+ ```
187
+
188
+ ## COMPLETE with task decomposition (multi-increment)
189
+
190
+ Shows a skill-creation task where each subtask was verified individually.
191
+
192
+ ```json:contract
193
+ {
194
+ "agent_status": {
195
+ "plan_status": "COMPLETE",
196
+ "agent_id": "a9c4f71",
197
+ "pending_steps": [],
198
+ "next_action": "done"
199
+ },
200
+ "evidence_report": {
201
+ "patterns_checked": ["existing skill structure in skills/", "skill-creation standards"],
202
+ "files_checked": ["skills/new-skill/SKILL.md", "skills/new-skill/reference.md"],
203
+ "commands_run": [],
204
+ "key_outputs": ["Created new-skill with SKILL.md (87 lines) and reference.md"],
205
+ "verbatim_outputs": [],
206
+ "cross_layer_impacts": ["Agents using this skill need frontmatter update"],
207
+ "open_gaps": [],
208
+ "verification": {
209
+ "method": "self-review",
210
+ "checks": [
211
+ "SKILL.md line count: 87 (under 100 budget)",
212
+ "Frontmatter has name, description, metadata fields",
213
+ "Description contains triggering conditions only",
214
+ "Type-appropriate structure (domain: conventions, examples, key rules)"
215
+ ],
216
+ "result": "pass",
217
+ "details": "87 lines. Frontmatter valid. Description triggers on domain conditions. Structure matches domain type from skill-creation standards."
218
+ }
219
+ },
220
+ "consolidation_report": null,
221
+ "approval_request": null
222
+ }
223
+ ```
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: agent-response
3
+ description: Use when an agent returns a json:contract response that needs to be interpreted and presented to the user
4
+ metadata:
5
+ user-invocable: false
6
+ type: protocol
7
+ ---
8
+
9
+ # Agent Response Protocol
10
+
11
+ The orchestrator's job is translation -- turning structured agent output into
12
+ clear user communication. Every status requires a different response because
13
+ each represents a different kind of decision point for the user.
14
+
15
+ ## State Machine
16
+
17
+ ```
18
+ Agent returns json:contract
19
+ |- COMPLETE -> Summarize key_outputs (3-5 bullets)
20
+ |- NEEDS_INPUT -> AskUserQuestion, then SendMessage answer back
21
+ |- APPROVAL_REQUEST -> Load Skill("orchestrator-approval") if approval_id present,
22
+ | otherwise AskUserQuestion (execute/modify/cancel),
23
+ | then SendMessage to resume the same agent
24
+ |- BLOCKED -> Present open_gaps via AskUserQuestion
25
+ | If user provides direction: dispatch new agent addressing the blocker.
26
+ | If user accepts the limitation: close the task as incomplete and move on.
27
+ +- IN_PROGRESS -> SendMessage to resume agent
28
+ ```
29
+
30
+ ## Mandatory Actions per Status
31
+
32
+ | Status | Action | Tool |
33
+ |---|---|---|
34
+ | `COMPLETE` | Summarize `key_outputs` in 3-5 bullets. Mention `cross_layer_impacts` and `open_gaps` if non-empty. Say "ask for details" if `verbatim_outputs` exists. | Direct response |
35
+ | `NEEDS_INPUT` | Present the agent's question with options | `AskUserQuestion` -> `SendMessage` |
36
+ | `APPROVAL_REQUEST` | If `approval_request.approval_id` is present: load `Skill("orchestrator-approval")`. Otherwise: present plan with options execute / modify / cancel. On execute or modify: resume the SAME agent via SendMessage -- it already holds full context from its investigation. | `AskUserQuestion` -> `SendMessage` |
37
+ | `BLOCKED` | Present alternatives from `open_gaps`. If user provides direction, dispatch a new agent addressing the blocker. If user accepts the limitation, close as incomplete and move on. | `AskUserQuestion` |
38
+ | `IN_PROGRESS` | Agent was interrupted, let it continue | `SendMessage` |
39
+
40
+ **Why APPROVAL_REQUEST splits on approval_id:** Hook-blocked T3 operations carry a pending
41
+ grant that requires the structured approval flow (exact content, rollback, risk).
42
+ Plan-first APPROVAL_REQUEST has no pending grant -- the user just needs to confirm direction.
43
+ Treating both the same either over-formalizes simple plans or under-secures T3 ops.
44
+
45
+ ## Output Fields
46
+
47
+ | Field | When to surface |
48
+ |---|---|
49
+ | `key_outputs` | Always -- base your summary on these |
50
+ | `verbatim_outputs` | Only when user asks for details -- relay in code blocks |
51
+ | `cross_layer_impacts` | Always mention if non-empty -- these are side effects the user may not anticipate |
52
+ | `open_gaps` | Always mention -- never imply certainty the agent does not have |
53
+ | `consolidation_report` | Check for `conflicts` and `next_best_agent` |
54
+ | `next_best_agent` | Ask user if they want to dispatch |
55
+
56
+ ## Multiple Agents
57
+
58
+ Wait for ALL dispatched agents before responding. Partial results
59
+ mislead -- the user acts on incomplete information, then the second
60
+ agent contradicts the first.
61
+
62
+ Consolidate findings. If agents conflict, present both sides and
63
+ ask the user to decide.
64
+
65
+ ## Error Handling
66
+
67
+ | Situation | Action |
68
+ |---|---|
69
+ | Malformed contract | Resume agent with repair instructions (max 2 retries). |
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: agentic-loop
3
+ description: Use when the orchestrator injects "Carga la skill agentic-loop" with a goal, eval_command, metric, and threshold
4
+ metadata:
5
+ user-invocable: false
6
+ type: technique
7
+ ---
8
+
9
+ # Agentic Loop
10
+
11
+ Iterative improvement through small, reversible changes evaluated against a single metric. Each iteration is one hypothesis, one edit, one eval, one decision. The metric decides -- not you.
12
+
13
+ ## Parameters (from orchestrator prompt)
14
+
15
+ `goal`, `eval_command`, `metric`, `direction` (higher/lower), `threshold`, `max_iterations`, `files_in_scope`, `branch`
16
+
17
+ ## Setup
18
+
19
+ 1. Read every file in `files_in_scope` deeply -- understand before changing
20
+ 2. `git checkout -b {branch}`
21
+ 3. Run `eval_command` -- parse `METRIC {name}={number}` from stdout -- this is your baseline
22
+ 4. Write `state.json` and `worklog.md` (schemas in `reference.md`)
23
+ 5. `git commit -m "baseline: {metric} {value}"`
24
+
25
+ ## Loop (repeat until threshold, max_iterations, or stop)
26
+
27
+ 1. **HYPOTHESIZE** -- based on worklog insights and last failure. When stuck, re-read source files; thinking longer beats trying faster
28
+ 2. **EDIT** -- one focused change. Smaller diffs are easier to evaluate and reverse
29
+ 3. **EVALUATE** -- run `eval_command`, parse `METRIC {name}={number}`
30
+ 4. **DECIDE** (mechanically, not judgment):
31
+ - Improved (or equal with less code) -- KEEP -- `git add -A` then `git commit -m "improve: {metric} {old}->{new}"`
32
+ - Same or worse -- DISCARD -- `git checkout -- .` then `git clean -fd`
33
+ 5. **LOG** -- append to `worklog.md`: run number, what changed, result, insight, next idea
34
+ 6. **UPDATE** -- write `state.json` with current values
35
+ 7. **ESCALATE** if needed:
36
+ - 3 consecutive discards -- REFINE (adjust within current strategy)
37
+ - 5 consecutive discards -- PIVOT (structurally different approach)
38
+ - 3 pivots without a keep -- STOP and report blockers
39
+ 8. Every 10 iterations: re-read `files_in_scope`, review worklog "What's Been Tried", recalibrate
40
+
41
+ ## Termination
42
+
43
+ - **Threshold reached** -- `git commit -m "final: {metric} {baseline}->{final} in N iterations"`, write summary
44
+ - **Max iterations** -- report best achieved vs threshold
45
+ - **Stop from escalation** -- report what was tried and what blocked progress
46
+ - All paths: finalize `state.json` (status: complete/stopped), write summary in `worklog.md`
47
+
48
+ ## Contract Integration
49
+
50
+ Include `loop_status` in your `json:contract` agent_status on every response:
51
+
52
+ ```json
53
+ "loop_status": {
54
+ "iteration": 5,
55
+ "metric": 94.5,
56
+ "best": 94.5,
57
+ "baseline": 89.0,
58
+ "threshold": 98,
59
+ "status": "iterating"
60
+ }
61
+ ```
62
+
63
+ Do NOT return `plan_status: "COMPLETE"` until the loop finishes. The user may be away for hours.
64
+
65
+ ## Rules
66
+
67
+ - **Loop forever.** Never ask "should I continue?" The metric and thresholds decide when to stop. The user may be away for hours.
68
+ - **One change per iteration.** Multiple changes make it impossible to isolate what helped.
69
+ - **Metric is king.** Personal judgment about code quality does not override the number.
70
+ - **Simpler wins ties.** Removing code for equal performance is a keep.
71
+ - **Think longer when stuck.** Re-read source files before trying faster. Fresh context beats more iterations.
72
+ - **Retreat, don't thrash.** Same idea reverting repeatedly means the approach is wrong -- pivot.
73
+
74
+ ## Anti-Patterns
75
+
76
+ - Making multiple changes per iteration -- cannot isolate what helped or hurt
77
+ - Skipping eval after a change -- invisible regressions compound
78
+ - Continuing after 3 pivots without improvement -- diminishing returns; stop and report
79
+ - Using `git clean -fdx` instead of `-fd` -- destroys untracked config files needed by eval
80
+ - Editing state.json by hand instead of writing it atomically after each phase