@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,88 @@
1
+ ---
2
+ name: memory-search
3
+ description: Use when searching, inspecting, or diagnosing episodic memory via the `gaia memory` CLI -- queries like "what do I remember about X", "search my memory", "show episode", or memory health checks
4
+ metadata:
5
+ user-invocable: false
6
+ type: reference
7
+ ---
8
+
9
+ # Memory Search
10
+
11
+ Inspect and query Gaia's episodic memory (Memory v2) through the `gaia memory` CLI. Memory v2 indexes past sessions in an FTS5 SQLite database with hybrid scoring (recency + retrieval count). This skill covers search, stats, show, and conflict detection. For curating/reorganizing the separate MEMORY.md index and topic files, load `memory-curation` instead.
12
+
13
+ ## When to use each subcommand
14
+
15
+ | Trigger | Subcommand |
16
+ |---------|-----------|
17
+ | "what do I know about X", "search my memory" | `gaia memory search <query>` |
18
+ | "memory health", "is my memory healthy" | `gaia memory stats` |
19
+ | "show episode abc123", "open that memory" | `gaia memory show <id>` |
20
+ | "any memory conflicts", "contradictions" | `gaia memory conflicts` |
21
+
22
+ Always prefer `--json` when the output will feed a follow-up step. Human text is for final user replies.
23
+
24
+ ## Output shapes
25
+
26
+ All shapes are contract -- downstream code relies on these keys.
27
+
28
+ ```
29
+ gaia memory search "<query>" [--limit N] --json
30
+ -> {"results": [{"id", "title", "score", "date", "snippet"}]}
31
+
32
+ gaia memory stats --json
33
+ -> {"total_episodes", "indexed", "avg_score", "conflicts"}
34
+
35
+ gaia memory show <episode_id> --json
36
+ -> {"id", "title", "content", "score", "tags", "retrieval_count", "age_days"}
37
+ exit 1 if episode not found
38
+
39
+ gaia memory conflicts [--threshold F] --json
40
+ -> {"conflicts": [{"file_a", "file_b", "score", "reason"}]}
41
+ ```
42
+
43
+ `score` in search and show is the hybrid score from `tools.memory.scoring.score_memory(days_old, retrieval_count)` -- higher means more relevant. `score` in conflicts is semantic similarity between two memory files (0.0-1.0, higher means more similar/conflicting).
44
+
45
+ ## Typical flows
46
+
47
+ **Answering "what do I remember about X"**
48
+
49
+ 1. `gaia memory search "X" --limit 5 --json`
50
+ 2. If `results` empty: tell the user nothing indexed yet, suggest checking `stats`
51
+ 3. If hits: pick top 1-2 by `score`, call `gaia memory show <id> --json` for full content
52
+ 4. Summarize `content` back to the user; cite `date` and `id`
53
+
54
+ **Diagnosing memory health**
55
+
56
+ 1. `gaia memory stats --json`
57
+ 2. If `indexed < total_episodes * 0.9`: FTS5 index is stale -- suggest `gaia doctor --fix`
58
+ 3. If `conflicts > 0`: run `gaia memory conflicts --json` to show specifics, then hand off to `memory-curation` for resolution
59
+ 4. `avg_score` near 0 means scoring module is not loading -- check `gaia doctor`
60
+
61
+ **Checking before saving a new memory**
62
+
63
+ 1. `gaia memory search "<topic>" --json` to see if the topic already exists
64
+ 2. If high-score hit exists: load it with `show`, extend instead of duplicating
65
+ 3. If no hit: safe to create a new memory file (handoff to `memory-curation`)
66
+
67
+ ## Interpreting results
68
+
69
+ - Empty `results` list is not an error -- it means nothing indexed matches. Surface this plainly; do not invent context.
70
+ - Low `score` (< 0.3) hits are likely noise -- mention them only if explicitly asked for broad results.
71
+ - `age_days` from `show` helps decide whether to trust the memory or flag it as potentially stale.
72
+ - A `conflicts` entry with `score > 0.85` is almost certainly a genuine duplicate/contradiction worth resolving.
73
+
74
+ ## Handoffs
75
+
76
+ | Situation | Next step |
77
+ |-----------|-----------|
78
+ | Conflicts found, user wants cleanup | Load `memory-curation` skill |
79
+ | FTS5 index stale or missing | Run `gaia doctor --fix` |
80
+ | Want to save a new finding | Load `memory-curation` skill |
81
+ | Results enriched and user wants broader research | Delegate to `investigation` skill or WebSearch |
82
+
83
+ ## Anti-patterns
84
+
85
+ - **Using `search` for verbatim recall** -- FTS5 ranks by relevance, not exact match. If the user needs an exact episode, use `show <id>`.
86
+ - **Ignoring `--json`** -- piping human output into follow-up logic breaks whenever the format tweaks. Ask for JSON at the source.
87
+ - **Calling `conflicts` on every query** -- it scans all memory files and is expensive; run it only on explicit health-check intent or after bulk imports.
88
+ - **Reporting raw `score` to the user** -- users care about what was found, not the number. Translate: high score -> "strong match", low score -> "loose match".
@@ -0,0 +1,160 @@
1
+ ---
2
+ name: orchestrator-approval
3
+ description: Use when processing APPROVAL_REQUEST with approval_id from a subagent -- enforces showing values before asking for user consent
4
+ metadata:
5
+ user-invocable: false
6
+ type: discipline
7
+ ---
8
+
9
+ # Orchestrator Approval
10
+
11
+ ```
12
+ The user approves EXACT VALUES, not summaries.
13
+ Every AskUserQuestion shows the literal command, every option label
14
+ names the specific action. No exceptions. No brevity shortcuts.
15
+ ```
16
+
17
+ ## Mental Model
18
+
19
+ The orchestrator sits between the subagent and the user. The user cannot make an informed decision on information they have not seen. A summary, a reference to "the plan above", or an offer to show details on request -- all push the decision without the data needed to decide. When the orchestrator shortens "git push origin main" to "aplicar cambios", the user is approving blind.
20
+
21
+ **Scope:** This skill applies when a subagent emits `APPROVAL_REQUEST` with an `approval_id` in its `approval_request`.
22
+
23
+ ## Pre-Flight Checklist
24
+
25
+ Before calling AskUserQuestion, verify ALL of the following. If any check fails, go back to the agent's `approval_request` and extract the missing field.
26
+
27
+ 1. Does the question text contain the VERBATIM command or file content from `exact_content`? Not summarized, not paraphrased -- the literal string.
28
+ 2. Does the question text contain all 5 labeled fields (OPERATION, COMMAND, SCOPE, RISK, ROLLBACK)?
29
+ 3. Does the "Approve" option label name the SPECIFIC action (e.g., "Approve -- push 2 commits to origin/main"), not a generic phrase?
30
+ 4. Is the command/content complete? No "..." truncation, no "the above changes".
31
+ 5. Does the "Approve" option label end with `[P-{nonce_prefix8}]`? The nonce comes from `approval_request.approval_id` (first 8 chars).
32
+
33
+ ## Mandatory Presentation Format
34
+
35
+ Every AskUserQuestion `question` parameter must contain these 5 labeled fields, extracted from the agent's `approval_request`:
36
+
37
+ ```
38
+ APPROVAL REQUIRED
39
+
40
+ OPERACION: {approval_request.operation}
41
+ COMANDO: {approval_request.exact_content} <-- verbatim, never paraphrased
42
+ SCOPE: {approval_request.scope}
43
+ RIESGO: {approval_request.risk_level} + why
44
+ ROLLBACK: {approval_request.rollback}
45
+ ```
46
+
47
+ ## Option Label Rules
48
+
49
+ The "Approve" option MUST name the specific action. The PostToolUse hook activates grants by checking for "approve" in the answer value.
50
+
51
+ - Format: `"Approve -- {specific_action_description} [P-{nonce_prefix8}]"`
52
+ - The action description comes from `approval_request.operation`
53
+ - The nonce comes from `approval_request.approval_id` (first 8 chars)
54
+
55
+ ## Rules
56
+
57
+ 1. **Grant activates through the PostToolUse hook for AskUserQuestion -- not SendMessage.** Resume the subagent via SendMessage with natural language only. The grant is active before SendMessage is sent -- no delay or verification step is needed.
58
+
59
+ 2. **Scope guard -- resume only with the approved command.** The grant is scoped to the exact command that was blocked. When the agent's `approval_request.exact_content` differs in ANY argument from what the orchestrator put in `COMANDO:` -- even one path segment, one flag, one filename -- the grant will miss and the agent will be blocked again. Do NOT send the agent a resume message that instructs it to run a different command. If the operation has genuinely changed, present a new approval.
60
+
61
+ 3. **Fresh presentation every time.** Each hook-blocked APPROVAL_REQUEST requires its own presentation with all mandatory fields. Prior approvals do not carry forward.
62
+
63
+ 4. **`mode` does NOT survive a SendMessage resume.** The `mode` parameter is per-dispatch of the Agent tool. If the original dispatch was `mode: bypassPermissions` and the subagent emitted APPROVAL_REQUEST mid-task, resuming via SendMessage drops the mode -- the resume runs in `default`. CC native will intercept the same Edit/Write/Bash that the original mode was meant to satisfy. Concrete failure observed: bypass-dispatched subagent hit Gaia hook, user approved via AskUserQuestion (grant active), resume via SendMessage -- CC native blocked the same `mv .claude/briefs/...` because the mode was gone. See "Re-dispatch instead of resume" below.
64
+
65
+ ### Re-dispatch instead of resume (when mode was load-bearing)
66
+
67
+ When the original dispatch relied on `mode: bypassPermissions` or `mode: acceptEdits` to satisfy CC native on `.claude/` writes, and the subagent blocked mid-task, **do not resume with SendMessage**. Instead:
68
+
69
+ 1. Kill the blocked subagent (it already reported APPROVAL_REQUEST or BLOCKED).
70
+ 2. Present the approval via AskUserQuestion (same mandatory format) so the Gaia grant activates for the exact command signature.
71
+ 3. Dispatch a **fresh** subagent with the same `mode` the original needed.
72
+ 4. The fresh prompt enumerates ALL remaining steps and instructs the subagent to execute them in a single turn. Tell it explicitly: "If a hook blocks any step, emit BLOCKED and stop -- do NOT emit APPROVAL_REQUEST mid-task, do NOT split across turns."
73
+ 5. The Gaia grant (scoped to the specific blocked command) activates on the approved step; the new dispatch's `mode` satisfies CC native for every other step.
74
+
75
+ This applies specifically to multi-step bundles on protected paths (mv/rm/mkdir on `.claude/` + Edit/Write on `.claude/project-context/**`). Splitting such a bundle across dispatch + SendMessage resume is the failure mode.
76
+
77
+ ## Traps
78
+
79
+ | If you're thinking... | The reality is... |
80
+ |---|---|
81
+ | "The subagent already showed the details" | Show them again -- the user needs them at the decision point |
82
+ | "It's a small change, I can summarize" | Size does not change the contract -- show the exact command |
83
+ | "I'll offer to show details if they want" | The user needs the data BEFORE the question, not after |
84
+ | "The option label 'Approve' is enough" | Without the action, the user clicks blind -- label must say WHAT is approved |
85
+ | "'Approve -- aplicar cambios' describes it" | That is a paraphrase in another language -- name the actual operation |
86
+ | "'Approve -- los 3' is clear from context" | Context is not the label -- spell out what "the 3" are |
87
+ | "The command is long, I'll shorten it" | Show it complete -- truncation hides what the user is approving |
88
+ | "Same operation, slightly different path" | Grants match by command signature -- different path = grant miss = immediate re-block |
89
+ | "I'll tell the agent to run a similar rm" | The agent must run the exact command that was approved, or it gets blocked again |
90
+ | "I'll skip the [P-...] suffix, it's cosmetic" | "The hook extracts the nonce from the label — without it, targeted activation fails" |
91
+ | "Original dispatch had bypassPermissions, resume will too" | `mode` is per-dispatch; resume via SendMessage runs in `default` -- CC native re-blocks. Re-dispatch fresh. |
92
+ | "Subagent blocked mid-task, I'll approve then SendMessage" | If the blocker is CC native on `.claude/` writes, approval alone won't help -- resume loses the mode. Re-dispatch fresh with the needed mode. |
93
+ | "Multi-step mv + Edit can be split: dispatch, approve, resume" | Each turn boundary drops the mode. Pack ALL steps in one fresh dispatch after approval. |
94
+
95
+ For GOOD vs BAD examples, batch flow, and grant mechanics, see `reference.md`.
96
+
97
+ ## Dispatch mode checklist
98
+
99
+ Before dispatching a subagent, run through this checklist:
100
+
101
+ **When to pass `mode: acceptEdits`:**
102
+ - Dispatch edits briefs, plans, or evidence files (`.claude/project-context/**`)
103
+ - Dispatch edits skills, agents, or commands (`.claude/skills/**`, `.claude/agents/**`, `.claude/commands/**`)
104
+ - Dispatch writes any file under `.claude/` that is NOT hooks/ or settings files
105
+
106
+ **When NOT to use `acceptEdits`:**
107
+ - Dispatch requires mutative Bash (acceptEdits does not cover Bash -- Gaia T3 flow still fires)
108
+ - Dispatch is exploratory/read-only (use `default` or omit mode)
109
+ - Dispatch touches `.claude/hooks/` or `settings.json` -- Gaia blocks these regardless of mode
110
+
111
+ **foreground vs background:**
112
+ - **foreground**: can call AskUserQuestion; T3 approval flows work end-to-end
113
+ - **background**: AskUserQuestion does not display; T3 operations that require user consent will stall or be auto-denied -- dispatch only read or pre-approved operations to background agents
114
+
115
+ **The mode is not inherited.** If you run with `acceptEdits`, your subagents still receive `default` unless you pass `mode: acceptEdits` explicitly in the dispatch. Set it per dispatch, not once per session.
116
+
117
+ | Dispatch type | mode to pass | session |
118
+ |--------------|-------------|---------|
119
+ | Reads only (investigate, report) | omit (default) | foreground or background |
120
+ | Edits `.claude/skills/`, briefs, evidence | `acceptEdits` | foreground or background |
121
+ | T3 requiring user approval | `default` or `acceptEdits` | **foreground only** |
122
+ | Edits `.claude/hooks/` or settings | never dispatch directly | n/a -- requires Gaia approval flow |
123
+
124
+ ## Dispatch mode decision -- checklist pre-dispatch
125
+
126
+ Antes de cada dispatch del Agent tool, recorre este árbol. Si algún paso produce ambigüedad, detente y pregunta al usuario.
127
+
128
+ **1. ¿El goal es read-only o escribe?**
129
+ - Read-only → `default` (o `acceptEdits` si necesita escribir evidence)
130
+ - Escribe → paso 2
131
+
132
+ **2. ¿Dónde escribe?**
133
+ - Solo archivos declarativos (`.md`, `.yaml`, `.json` bajo `.claude/` o `gaia-ops-dev/`) → `acceptEdits`
134
+ - Código runtime (`.py` bajo `hooks/`, `bin/`, `agents/`) → `acceptEdits` + aceptar grants Bash file-scoped esperados
135
+ - Paths protegidos (`.git`, `.vscode`, `.husky`, `.claude/hooks/`, `settings.json`) → `default` + prompt explícito; nunca bypass
136
+
137
+ **3. ¿Requiere Bash mutativo (mv, rm, mkdir)?**
138
+ - Atómico, scope enumerado, user-approved conceptualmente, hooks hardened → `bypassPermissions`
139
+ - Multi-step / multi-file PURO Edit/Write (sin Bash mutativo) → `acceptEdits` (acepta fricción file-scoped; NO bypass: pierde audit per-file porque background pre-aprueba el bundle entero)
140
+ - Bundle mixto: Bash mutativo (mv/rm) SOBRE `.claude/` + Edits SOBRE `.claude/` → `bypassPermissions` + foreground + **empaquetar todos los steps en un solo turno** (ver Rule 4 y "Re-dispatch instead of resume" arriba). `acceptEdits` no alcanza porque no cubre el mv; split en turnos pierde el mode en el SendMessage resume.
141
+
142
+ **4. ¿Puede emitir `approval_request` mid-task?**
143
+ - Sí (scope puede evolucionar, T3 esperados) → foreground
144
+ - No (scope cerrado, permisos pre-satisfechos) → background + mode que pre-satisfaga permisos
145
+
146
+ **5. ¿El goal enumera el scope concreto?**
147
+ - No → DETÉN y pregunta al usuario antes del dispatch. No elegir mode sobre scope vago.
148
+ - Sí → continúa con la combinación decidida.
149
+
150
+ Cross-reference: para qué hace cada mode, ver `skills/security-tiers/SKILL.md` → "permissionMode comparison" y "Decision tree".
151
+
152
+ ### Ejemplos concretos
153
+
154
+ | Goal | mode | session | Razón |
155
+ |------|------|---------|-------|
156
+ | Editar brief.md o plan.md | `acceptEdits` | background | Declarativo, scope cerrado, no requiere prompts mid-task |
157
+ | Mover directorio de brief al cerrar (`open_X` → `closed_X`) | `bypassPermissions` | foreground | Atómico, scope aprobado, hardened bash_validator; foreground porque puede descubrir conflicto de nombre |
158
+ | Split de enum en 3 archivos Python runtime | `acceptEdits` | background | Grants file-scoped esperados per-file -- fricción intencional para audit |
159
+ | Bulk reject de pendings via CLI | `acceptEdits` | foreground | CLI maneja inline; foreground por si requiere confirmación mid-loop |
160
+ | Investigation read-only con evidence write | `default` al leer, `acceptEdits` al escribir evidence | foreground | Dos dispatches distintos con modes distintos; no heredar entre ellos |
@@ -0,0 +1,174 @@
1
+ # Orchestrator Approval -- Reference
2
+
3
+ Detailed templates, examples, and batch flow. Read on-demand when presenting approvals.
4
+
5
+ ## GOOD vs BAD Examples
6
+
7
+ ### Example 1: Git push
8
+
9
+ **BAD -- vague label, missing fields:**
10
+ ```
11
+ AskUserQuestion(
12
+ question="Shall I push the changes?",
13
+ options=["Approve", "Reject"]
14
+ )
15
+ ```
16
+ Missing: OPERATION, COMMAND, SCOPE, RISK, ROLLBACK. Label "Approve" does not name the action.
17
+
18
+ **BAD -- paraphrased command, generic label:**
19
+ ```
20
+ AskUserQuestion(
21
+ question="APPROVAL REQUIRED\n\nOPERACION: Push changes\nCOMANDO: push the 2 commits\nSCOPE: main branch\nRIESGO: MEDIUM\nROLLBACK: git revert",
22
+ options=["Approve -- aplicar cambios", "Reject"]
23
+ )
24
+ ```
25
+ COMMAND is paraphrased ("push the 2 commits" instead of the literal `git push origin main`). Label is vague Spanish.
26
+
27
+ **GOOD -- verbatim command, specific label:**
28
+ ```
29
+ AskUserQuestion(
30
+ question=(
31
+ "APPROVAL REQUIRED\n\n"
32
+ "OPERACION: Push 2 commits to origin/main\n"
33
+ "COMANDO: git push origin main\n"
34
+ "SCOPE: remote origin, branch main -- 2 commits (a1b2c3, d4e5f6)\n"
35
+ "RIESGO: MEDIUM -- modifies shared branch history\n"
36
+ "ROLLBACK: git revert a1b2c3..d4e5f6"
37
+ ),
38
+ options=["Approve -- push 2 commits to origin/main [P-a1b2c3d4]", "Modify", "Reject"]
39
+ )
40
+ ```
41
+
42
+ ### Example 2: Terraform apply
43
+
44
+ **BAD:**
45
+ ```
46
+ options=["Approve -- los 3 recursos", "Reject"]
47
+ ```
48
+ "los 3 recursos" -- what 3? The user cannot tell from the label alone.
49
+
50
+ **GOOD:**
51
+ ```
52
+ AskUserQuestion(
53
+ question=(
54
+ "APPROVAL REQUIRED\n\n"
55
+ "OPERACION: Apply Terraform changes to dev VPC\n"
56
+ "COMANDO: terraform -chdir=/infra/dev apply -auto-approve\n"
57
+ "SCOPE: 3 resources: google_compute_network.dev, google_compute_subnetwork.dev-a, google_compute_subnetwork.dev-b\n"
58
+ "RIESGO: MEDIUM -- creates new cloud resources in dev\n"
59
+ "ROLLBACK: terraform -chdir=/infra/dev destroy -auto-approve"
60
+ ),
61
+ options=["Approve -- terraform apply (3 resources in dev) [P-9c4e1f2a]", "Modify", "Reject"]
62
+ )
63
+ ```
64
+
65
+ ### Example 3: Multiple file edits
66
+
67
+ **BAD:**
68
+ ```
69
+ options=["Approve -- aplicar cambios", "Reject"]
70
+ question="Can I make the changes we discussed?"
71
+ ```
72
+
73
+ **GOOD:**
74
+ ```
75
+ AskUserQuestion(
76
+ question=(
77
+ "APPROVAL REQUIRED\n\n"
78
+ "OPERACION: Edit 3 config files to update API endpoint\n"
79
+ "COMANDO:\n"
80
+ " 1. Edit /app/config/prod.yaml -- api_url: https://old.api.com -> https://new.api.com\n"
81
+ " 2. Edit /app/config/staging.yaml -- api_url: https://old.api.com -> https://new.api.com\n"
82
+ " 3. Edit /app/.env.production -- API_BASE=https://old.api.com -> API_BASE=https://new.api.com\n"
83
+ "SCOPE: 3 config files in /app/config/ and /app/.env.production\n"
84
+ "RIESGO: HIGH -- production config, affects live API routing\n"
85
+ "ROLLBACK: git checkout HEAD -- /app/config/prod.yaml /app/config/staging.yaml /app/.env.production"
86
+ ),
87
+ options=["Approve -- update API endpoint in 3 config files [P-d7f3a09b]", "Modify", "Reject"]
88
+ )
89
+ ```
90
+
91
+ ## Option Label Patterns
92
+
93
+ | Pattern | Verdict | Why |
94
+ |---------|---------|-----|
95
+ | `"Approve -- push 2 commits to origin/main [P-a1b2c3d4]"` | GOOD | Names exact action, includes nonce suffix |
96
+ | `"Approve -- terraform apply (3 resources in dev) [P-9c4e1f2a]"` | GOOD | Names tool, count, environment, includes nonce suffix |
97
+ | `"Approve -- delete branch feature/old-login [P-f5b0e871]"` | GOOD | Names the destructive action and target, includes nonce suffix |
98
+ | `"Approve -- push 2 commits to origin/main"` | BAD | Missing `[P-{8hex}]` suffix -- hook cannot do targeted activation |
99
+ | `"Approve"` | BAD | No action description |
100
+ | `"Approve -- aplicar cambios"` | BAD | Vague paraphrase |
101
+ | `"Approve -- los 3"` | BAD | What 3? |
102
+ | `"Approve -- proceed"` | BAD | "proceed" adds no information |
103
+ | `"Approve -- the plan above"` | BAD | References context, not action |
104
+ | `"Si, ejecutar"` | BROKEN | Missing "Approve" -- hook will not activate grant |
105
+
106
+ ## Batch Approval Flow
107
+
108
+ When `approval_request` contains `batch_scope: "verb_family"`, the agent requests a
109
+ multi-use grant covering many commands with the same base CLI and verb but different arguments.
110
+
111
+ **Presentation:** Use the same mandatory format, but frame the scope as a batch:
112
+ - OPERACION describes the batch (e.g., "Modify 500 Gmail messages")
113
+ - COMANDO shows the command pattern (e.g., "`gws gmail users messages modify`")
114
+ - SCOPE states the TTL (e.g., "All modify operations for the next 10 minutes")
115
+
116
+ **Options:** `["Approve batch -- modify 500 Gmail messages [P-{nonce_prefix8}]", "Approve single -- {first_command} [P-{nonce_prefix8}]", "Modify", "Reject"]`
117
+ - "Approve batch" creates a verb-family grant (multi-use, 10-minute TTL)
118
+ - "Approve single" creates a normal single-use grant for only the first blocked command
119
+
120
+ **CRITICAL -- "batch" in the label:** The word "batch" MUST appear in the Approve option label for verb-family grants to activate. The PostToolUse hook checks the label text to decide whether to create a verb-family (multi-use) grant or a single-use grant. Without "batch" in the label, the hook creates a single-use grant and every command after the first one gets blocked again.
121
+
122
+ **BAD -- missing "batch" keyword:**
123
+ ```
124
+ options=["Approve -- modify 500 Gmail messages [P-a1b2c3d4]", "Reject"]
125
+ ```
126
+ Result: single-use grant created. First `gws gmail users messages modify` succeeds. Second one is blocked. Agent enters re-block loop for remaining 499 messages.
127
+
128
+ **GOOD -- "batch" keyword present:**
129
+ ```
130
+ options=["Approve batch -- modify 500 Gmail messages [P-a1b2c3d4]", "Reject"]
131
+ ```
132
+ Result: verb-family grant created (multi-use, 10-minute TTL). All 500 `gws gmail users messages modify` commands pass through.
133
+
134
+ **Resume:** After batch approval, resume via SendMessage with: "Batch approved. Proceed with all [verb] operations."
135
+
136
+ ## Grant Activation Mechanics
137
+
138
+ When a hook blocks a T3 command, it writes a pending approval and returns an `approval_id` in the deny response. The subagent includes this `approval_id` in its `approval_request`. The orchestrator presents the plan via AskUserQuestion with structured options. When the user selects an "Approve" option, the PostToolUse hook for AskUserQuestion fires and activates the pending grant. No nonce or approval_id is relayed through SendMessage -- grant activation is handled entirely by the hook.
139
+
140
+ **Timing:** Grant activation is synchronous. The PostToolUse hook runs before AskUserQuestion returns to the orchestrator. By the time the orchestrator is ready to send SendMessage, the grant is already active. There is no race condition and no delay is needed.
141
+
142
+ ## Scope Mismatch -- The Common Re-block Trap
143
+
144
+ Grants are matched by **semantic signature**: `base_cmd + verb + normalized arguments`. Two commands with the same verb but different path arguments are different signatures and do NOT share a grant.
145
+
146
+ **Example of the trap:**
147
+
148
+ 1. Agent is blocked trying to run:
149
+ `rm /path/to/approvals/grant-default-1776179289490.json`
150
+
151
+ 2. Orchestrator approves it. The grant is scoped to that exact command.
152
+
153
+ 3. Orchestrator sends resume: "Delete the stale grant file and then do the git operations"
154
+
155
+ 4. Agent decides to run:
156
+ `rm /path/to/approvals/grant-session-1776179452326.json`
157
+ (different filename, same directory)
158
+
159
+ 5. **Blocked again** -- the grant scope does not cover the new path.
160
+
161
+ **Why it happens:** The orchestrator paraphrased the operation ("delete the stale grant file") instead of quoting the approved command verbatim. The agent had latitude to choose a different target.
162
+
163
+ **Correct resume message:** Quote the exact approved command in the resume.
164
+
165
+ ```
166
+ # BAD resume
167
+ "Proceed. Delete the stale grant file and then do the git operations."
168
+
169
+ # GOOD resume
170
+ "Proceed. Run exactly: rm /path/to/approvals/grant-default-1776179289490.json"
171
+ "Then continue with the git operations."
172
+ ```
173
+
174
+ If the correct target has changed since the approval (e.g., the file that was blocked no longer exists and a different file needs to be deleted), present a new approval for the new command -- do not resume with modified instructions.
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: pending-approvals
3
+ description: Use when there are pending approval requests to present — "aprobar", "ver pendientes", "approve P-", "reject P-"
4
+ metadata:
5
+ user-invocable: true
6
+ type: technique
7
+ ---
8
+
9
+ # Pending Approvals
10
+
11
+ ## When SessionStart injects pending approvals
12
+
13
+ 1. Present the summary to the user (already formatted by the scanner)
14
+ 2. Wait for user to say "ver P-XXXX" or "aprobar P-XXXX"
15
+
16
+ The scanner formats each entry as:
17
+ ```
18
+ P-{nonce_prefix8} {command} [{danger_verb}] {age}
19
+ ```
20
+
21
+ ## When user says "ver P-XXXX"
22
+
23
+ 1. Find the pending file whose nonce starts with the given prefix
24
+ 2. Present full details: operation, exact command (verbatim), context, risk, rollback
25
+ 3. Ask: "aprobar" or "rechazar"
26
+
27
+ ## When user says "aprobar P-XXXX"
28
+
29
+ 1. Find the pending file whose nonce starts with the given prefix
30
+ 2. Call AskUserQuestion with ALL mandatory fields visible:
31
+
32
+ ```
33
+ APPROVAL REQUIRED
34
+
35
+ OPERATION: {danger_verb} on {base_cmd}
36
+ COMMAND: {command} ← verbatim, no paraphrase
37
+ SCOPE: {scope from context field}
38
+ RISK: {danger_category}
39
+ ROLLBACK: {rollback from context field}
40
+ ```
41
+
42
+ 3. AskUserQuestion options: `["Approve -- {specific_action} [P-{nonce_prefix8}]", "Reject"]`
43
+ - Label MUST start with "Approve" (PostToolUse grant activation checks for "approve")
44
+ - Label MUST end with `[P-{nonce_prefix8}]` (PostToolUse hook extracts nonce from label for targeted activation)
45
+ - Label MUST name the specific action (e.g., "Approve -- kubectl apply -f manifest.yaml [P-8072af80]")
46
+ - NEVER use vague labels like "Approve -- aplicar cambios" or "Approve -- proceed"
47
+ 4a. Cross-session check: if `pending.session_id` != current `CLAUDE_SESSION_ID`:
48
+ - The nonce is stale (from a prior session) -- do NOT pass it to the agent
49
+ - The PostToolUse hook will have already activated the grant under the current session
50
+ - Dispatch a one-shot agent using the dispatch template from `reference.md` (command + cwd + preflight + recovery instructions, no nonce)
51
+ - The hook will find the pre-activated grant and allow the T3 operation through
52
+ 4b. Same-session: dispatch a one-shot agent using the dispatch template from `reference.md` (command + cwd + nonce + preflight + recovery instructions)
53
+ 5. On Reject: call `reject_pending(nonce_prefix)` to mark the pending as rejected; confirm to user
54
+
55
+ ## When user says "rechazar P-XXXX"
56
+
57
+ 1. The orchestrator dispatches an agent to edit the pending JSON file at `.claude/cache/approvals/pending-{nonce}.json`, setting `"status": "rejected"` and `"rejected_at"` to the current timestamp
58
+ 2. Do NOT use `rm` to delete the file -- that triggers T3 approval. The `reject_pending()` function in `approval_grants.py` handles this via file I/O (read JSON, modify, write back)
59
+ 3. The pending scanner will clean up rejected files on its next sweep
60
+ 4. Confirm: "P-XXXX rechazado"
61
+
62
+ ## Anti-patterns
63
+
64
+ - Approving without showing the exact command — user needs to see verbatim, not a summary
65
+ - Summarizing command as "the deploy" or "the apply" instead of showing the literal string
66
+ - Asking for approval without AskUserQuestion — the PostToolUse grant hook will not activate
67
+ - Prefixing the approve option with anything other than "Approve" (e.g. "Sí, ejecutar")
68
+ - Dispatching execution before AskUserQuestion confirms approval
69
+ - Omitting the `[P-{nonce_prefix8}]` suffix from the Approve label — the hook cannot do targeted activation without it
70
+ - Fire-and-forget dispatch -- omitting preflight checks and recovery instructions from the dispatch prompt
71
+
72
+ For JSON schema, format templates, flow example, and dispatch template: read `reference.md`.