feed-the-machine 1.6.0 → 1.7.0

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 (269) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +170 -170
  3. package/bin/brain.py +1340 -0
  4. package/bin/convert_claude_skills_to_codex.py +490 -0
  5. package/bin/generate-manifest.mjs +463 -463
  6. package/bin/harden_codex_skills.py +141 -0
  7. package/bin/install.mjs +491 -491
  8. package/bin/migrate-eng-buddy-data.py +875 -0
  9. package/bin/playbook_engine/__init__.py +1 -0
  10. package/bin/playbook_engine/conftest.py +8 -0
  11. package/bin/playbook_engine/extractor.py +33 -0
  12. package/bin/playbook_engine/manager.py +102 -0
  13. package/bin/playbook_engine/models.py +84 -0
  14. package/bin/playbook_engine/registry.py +35 -0
  15. package/bin/playbook_engine/test_extractor.py +72 -0
  16. package/bin/playbook_engine/test_integration.py +129 -0
  17. package/bin/playbook_engine/test_manager.py +85 -0
  18. package/bin/playbook_engine/test_models.py +166 -0
  19. package/bin/playbook_engine/test_registry.py +67 -0
  20. package/bin/playbook_engine/test_tracer.py +86 -0
  21. package/bin/playbook_engine/tracer.py +93 -0
  22. package/bin/tasks_db.py +456 -0
  23. package/docs/HOOKS.md +243 -243
  24. package/docs/INBOX.md +233 -233
  25. package/ftm/SKILL.md +125 -122
  26. package/ftm-audit/SKILL.md +623 -623
  27. package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
  28. package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
  29. package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
  30. package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
  31. package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
  32. package/ftm-audit/scripts/run-knip.sh +23 -23
  33. package/ftm-audit.yml +2 -2
  34. package/ftm-brainstorm/SKILL.md +1003 -498
  35. package/ftm-brainstorm/evals/evals.json +180 -100
  36. package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
  37. package/ftm-brainstorm/references/agent-prompts.md +552 -224
  38. package/ftm-brainstorm/references/plan-template.md +209 -121
  39. package/ftm-brainstorm.yml +2 -2
  40. package/ftm-browse/SKILL.md +454 -454
  41. package/ftm-browse/daemon/browser-manager.ts +206 -206
  42. package/ftm-browse/daemon/bun.lock +30 -30
  43. package/ftm-browse/daemon/cli.ts +347 -347
  44. package/ftm-browse/daemon/commands.ts +410 -410
  45. package/ftm-browse/daemon/main.ts +357 -357
  46. package/ftm-browse/daemon/package.json +17 -17
  47. package/ftm-browse/daemon/server.ts +189 -189
  48. package/ftm-browse/daemon/snapshot.ts +519 -519
  49. package/ftm-browse/daemon/tsconfig.json +22 -22
  50. package/ftm-browse.yml +4 -4
  51. package/ftm-capture/SKILL.md +370 -370
  52. package/ftm-capture.yml +4 -4
  53. package/ftm-codex-gate/SKILL.md +361 -361
  54. package/ftm-codex-gate.yml +2 -2
  55. package/ftm-config/SKILL.md +422 -345
  56. package/ftm-config.default.yml +125 -82
  57. package/ftm-config.yml +44 -2
  58. package/ftm-council/SKILL.md +416 -416
  59. package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
  60. package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
  61. package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
  62. package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
  63. package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
  64. package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
  65. package/ftm-council.yml +2 -2
  66. package/ftm-dashboard/SKILL.md +163 -163
  67. package/ftm-dashboard.yml +4 -4
  68. package/ftm-debug/SKILL.md +1037 -1037
  69. package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
  70. package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
  71. package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
  72. package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
  73. package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
  74. package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
  75. package/ftm-debug.yml +2 -2
  76. package/ftm-diagram/SKILL.md +277 -277
  77. package/ftm-diagram.yml +2 -2
  78. package/ftm-executor/SKILL.md +777 -777
  79. package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
  80. package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
  81. package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
  82. package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
  83. package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +72 -72
  84. package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
  85. package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
  86. package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
  87. package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -59
  88. package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
  89. package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
  90. package/ftm-executor/runtime/package.json +8 -8
  91. package/ftm-executor.yml +2 -2
  92. package/ftm-git/SKILL.md +441 -441
  93. package/ftm-git/evals/evals.json +26 -26
  94. package/ftm-git/evals/promptfoo.yaml +75 -75
  95. package/ftm-git/hooks/post-commit-experience.sh +92 -92
  96. package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
  97. package/ftm-git/references/protocols/REMEDIATION.md +139 -139
  98. package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
  99. package/ftm-git.yml +2 -2
  100. package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
  101. package/ftm-inbox/backend/adapters/_retry.py +64 -64
  102. package/ftm-inbox/backend/adapters/base.py +230 -230
  103. package/ftm-inbox/backend/adapters/freshservice.py +104 -104
  104. package/ftm-inbox/backend/adapters/gmail.py +125 -125
  105. package/ftm-inbox/backend/adapters/jira.py +136 -136
  106. package/ftm-inbox/backend/adapters/registry.py +192 -192
  107. package/ftm-inbox/backend/adapters/slack.py +110 -110
  108. package/ftm-inbox/backend/db/connection.py +54 -54
  109. package/ftm-inbox/backend/db/schema.py +78 -78
  110. package/ftm-inbox/backend/executor/__init__.py +7 -7
  111. package/ftm-inbox/backend/executor/engine.py +149 -149
  112. package/ftm-inbox/backend/executor/step_runner.py +98 -98
  113. package/ftm-inbox/backend/main.py +103 -103
  114. package/ftm-inbox/backend/models/__init__.py +1 -1
  115. package/ftm-inbox/backend/models/unified_task.py +36 -36
  116. package/ftm-inbox/backend/planner/__init__.py +6 -6
  117. package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
  118. package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
  119. package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
  120. package/ftm-inbox/backend/planner/generator.py +127 -127
  121. package/ftm-inbox/backend/planner/schema.py +34 -34
  122. package/ftm-inbox/backend/requirements.txt +5 -5
  123. package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
  124. package/ftm-inbox/backend/routes/execute.py +186 -186
  125. package/ftm-inbox/backend/routes/health.py +52 -52
  126. package/ftm-inbox/backend/routes/inbox.py +68 -68
  127. package/ftm-inbox/backend/routes/plan.py +271 -271
  128. package/ftm-inbox/bin/launchagent.mjs +91 -91
  129. package/ftm-inbox/bin/setup.mjs +188 -188
  130. package/ftm-inbox/bin/start.sh +10 -10
  131. package/ftm-inbox/bin/status.sh +17 -17
  132. package/ftm-inbox/bin/stop.sh +8 -8
  133. package/ftm-inbox/config.example.yml +55 -55
  134. package/ftm-inbox/package-lock.json +2898 -2898
  135. package/ftm-inbox/package.json +26 -26
  136. package/ftm-inbox/postcss.config.js +6 -6
  137. package/ftm-inbox/src/app.css +199 -199
  138. package/ftm-inbox/src/app.html +18 -18
  139. package/ftm-inbox/src/lib/api.ts +166 -166
  140. package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
  141. package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
  142. package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
  143. package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
  144. package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
  145. package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
  146. package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
  147. package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
  148. package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
  149. package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
  150. package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
  151. package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
  152. package/ftm-inbox/src/lib/theme.ts +47 -47
  153. package/ftm-inbox/src/routes/+layout.svelte +76 -76
  154. package/ftm-inbox/src/routes/+page.svelte +401 -401
  155. package/ftm-inbox/svelte.config.js +12 -12
  156. package/ftm-inbox/tailwind.config.ts +63 -63
  157. package/ftm-inbox/tsconfig.json +13 -13
  158. package/ftm-inbox/vite.config.ts +6 -6
  159. package/ftm-intent/SKILL.md +241 -241
  160. package/ftm-intent.yml +2 -2
  161. package/ftm-manifest.json +3794 -3794
  162. package/ftm-map/SKILL.md +291 -291
  163. package/ftm-map/scripts/db.py +712 -712
  164. package/ftm-map/scripts/index.py +415 -415
  165. package/ftm-map/scripts/parser.py +224 -224
  166. package/ftm-map/scripts/queries/go-tags.scm +20 -20
  167. package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
  168. package/ftm-map/scripts/queries/python-tags.scm +31 -31
  169. package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
  170. package/ftm-map/scripts/queries/rust-tags.scm +37 -37
  171. package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
  172. package/ftm-map/scripts/query.py +301 -301
  173. package/ftm-map/scripts/ranker.py +377 -377
  174. package/ftm-map/scripts/requirements.txt +5 -5
  175. package/ftm-map/scripts/setup-hooks.sh +27 -27
  176. package/ftm-map/scripts/setup.sh +56 -56
  177. package/ftm-map/scripts/test_db.py +364 -364
  178. package/ftm-map/scripts/test_parser.py +174 -174
  179. package/ftm-map/scripts/test_query.py +183 -183
  180. package/ftm-map/scripts/test_ranker.py +199 -199
  181. package/ftm-map/scripts/views.py +591 -591
  182. package/ftm-map.yml +2 -2
  183. package/ftm-mind/SKILL.md +201 -1943
  184. package/ftm-mind/evals/promptfoo.yaml +142 -142
  185. package/ftm-mind/references/blackboard-protocol.md +110 -0
  186. package/ftm-mind/references/blackboard-schema.md +328 -328
  187. package/ftm-mind/references/complexity-guide.md +110 -110
  188. package/ftm-mind/references/complexity-sizing.md +138 -0
  189. package/ftm-mind/references/decide-act-protocol.md +172 -0
  190. package/ftm-mind/references/direct-execution.md +51 -0
  191. package/ftm-mind/references/environment-discovery.md +77 -0
  192. package/ftm-mind/references/event-registry.md +319 -319
  193. package/ftm-mind/references/mcp-inventory.md +300 -296
  194. package/ftm-mind/references/ops-routing.md +47 -0
  195. package/ftm-mind/references/orient-protocol.md +234 -0
  196. package/ftm-mind/references/personality.md +40 -0
  197. package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
  198. package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
  199. package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
  200. package/ftm-mind/references/reflexion-protocol.md +249 -249
  201. package/ftm-mind/references/routing/SCENARIOS.md +22 -22
  202. package/ftm-mind/references/routing-scenarios.md +35 -35
  203. package/ftm-mind.yml +2 -2
  204. package/ftm-ops.yml +4 -0
  205. package/ftm-pause/SKILL.md +395 -395
  206. package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
  207. package/ftm-pause/references/protocols/VALIDATION.md +80 -80
  208. package/ftm-pause.yml +2 -2
  209. package/ftm-researcher/SKILL.md +275 -275
  210. package/ftm-researcher/evals/agent-diversity.yaml +17 -17
  211. package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
  212. package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
  213. package/ftm-researcher/references/adaptive-search.md +116 -116
  214. package/ftm-researcher/references/agent-prompts.md +193 -193
  215. package/ftm-researcher/references/council-integration.md +193 -193
  216. package/ftm-researcher/references/output-format.md +203 -203
  217. package/ftm-researcher/references/synthesis-pipeline.md +165 -165
  218. package/ftm-researcher/scripts/score_credibility.py +234 -234
  219. package/ftm-researcher/scripts/validate_research.py +92 -92
  220. package/ftm-researcher.yml +2 -2
  221. package/ftm-resume/SKILL.md +518 -518
  222. package/ftm-resume/references/protocols/VALIDATION.md +172 -172
  223. package/ftm-resume.yml +2 -2
  224. package/ftm-retro/SKILL.md +380 -380
  225. package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
  226. package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
  227. package/ftm-retro.yml +2 -2
  228. package/ftm-routine/SKILL.md +170 -170
  229. package/ftm-routine.yml +4 -4
  230. package/ftm-state/blackboard/capabilities.json +5 -5
  231. package/ftm-state/blackboard/capabilities.schema.json +27 -27
  232. package/ftm-state/blackboard/context.json +37 -23
  233. package/ftm-state/blackboard/experiences/doom-statusline-fix.json +26 -0
  234. package/ftm-state/blackboard/experiences/hackathon-pages-site.json +26 -0
  235. package/ftm-state/blackboard/experiences/hindsight-sso-kickoff.json +42 -0
  236. package/ftm-state/blackboard/experiences/index.json +58 -9
  237. package/ftm-state/blackboard/experiences/learning-ragnarok-api-access.json +23 -0
  238. package/ftm-state/blackboard/experiences/nordlayer-members-auto-assign.json +26 -0
  239. package/ftm-state/blackboard/experiences/saml2aws-stale-session-fix.json +41 -0
  240. package/ftm-state/blackboard/patterns.json +6 -6
  241. package/ftm-state/schemas/context.schema.json +130 -130
  242. package/ftm-state/schemas/experience-index.schema.json +77 -77
  243. package/ftm-state/schemas/experience.schema.json +78 -78
  244. package/ftm-state/schemas/patterns.schema.json +44 -44
  245. package/ftm-upgrade/SKILL.md +194 -194
  246. package/ftm-upgrade/scripts/check-version.sh +76 -76
  247. package/ftm-upgrade/scripts/upgrade.sh +143 -143
  248. package/ftm-upgrade.yml +2 -2
  249. package/ftm-verify.yml +2 -2
  250. package/ftm.yml +2 -2
  251. package/hooks/ftm-auto-log.sh +137 -0
  252. package/hooks/ftm-blackboard-enforcer.sh +93 -93
  253. package/hooks/ftm-discovery-reminder.sh +90 -90
  254. package/hooks/ftm-drafts-gate.sh +61 -61
  255. package/hooks/ftm-event-logger.mjs +107 -107
  256. package/hooks/ftm-install-hooks.sh +240 -0
  257. package/hooks/ftm-learning-capture.sh +117 -0
  258. package/hooks/ftm-map-autodetect.sh +79 -79
  259. package/hooks/ftm-pending-sync-check.sh +22 -22
  260. package/hooks/ftm-plan-gate.sh +92 -92
  261. package/hooks/ftm-post-commit-trigger.sh +57 -57
  262. package/hooks/ftm-post-compaction.sh +138 -0
  263. package/hooks/ftm-pre-compaction.sh +147 -0
  264. package/hooks/ftm-session-end.sh +52 -0
  265. package/hooks/ftm-session-snapshot.sh +213 -0
  266. package/hooks/settings-template.json +81 -81
  267. package/install.sh +363 -363
  268. package/package.json +84 -84
  269. package/uninstall.sh +25 -25
@@ -1,361 +1,361 @@
1
- ---
2
- name: ftm-codex-gate
3
- description: Codex CLI integration gate for adversarial code validation. Invokes codex exec --yolo --ephemeral with gpt-5.4 to form test scenarios, review code quality, fix failures, and enforce STYLE.md patterns. Use when ftm-executor needs Codex validation at wave boundaries or task completion, or when user says "codex gate", "run codex", "validate with codex". Not for direct user interaction — primarily auto-invoked by ftm-executor.
4
- ---
5
-
6
- ## Events
7
-
8
- ### Emits
9
- - `review_complete` — when Codex finishes analysis and a PASS, PASS_WITH_FIXES, or FAIL verdict is produced
10
- - `issue_found` — when Codex identifies a quality violation, INTENT.md conflict, or test failure in the reviewed files
11
- - `task_completed` — when the gate run concludes and results are returned to the calling skill
12
-
13
- ### Listens To
14
- - `code_committed` — run adversarial validation at wave boundaries after commits land in the executor's worktree
15
-
16
- ## Blackboard Read
17
-
18
- Before starting, load context from the blackboard:
19
-
20
- 1. Read `~/.claude/ftm-state/blackboard/context.json` — check current_task, recent_decisions, active_constraints
21
- 2. Read `~/.claude/ftm-state/blackboard/experiences/index.json` — filter entries by tags matching "validation", "codex", or "review"
22
- 3. Load top 3-5 matching experience files for patterns in what Codex commonly flags or auto-fixes
23
- 4. Read `~/.claude/ftm-state/blackboard/patterns.json` — check recurring_issues for common validation failures and execution_patterns for typical fix types
24
-
25
- If index.json is empty or no matches found, proceed normally without experience-informed shortcuts.
26
-
27
- # Codex Gate
28
-
29
- This skill is the integration layer between ftm-executor and the Codex CLI. It constructs adversarial validation prompts, runs them through `codex exec`, captures structured output, and returns results to the calling skill. It does not interact with the user directly — it is invoked at wave boundaries or task completion.
30
-
31
- ---
32
-
33
- ## Inputs
34
-
35
- Expect these inputs from the calling skill (ftm-executor). If any are missing, ask for them before proceeding.
36
-
37
- - `file_list` — List of changed files to review (absolute paths)
38
- - `acceptance_criteria` — The acceptance criteria from the plan tasks in this wave
39
- - `wave_context` — A summary of what this wave accomplished
40
- - `project_root` — The working directory path (absolute)
41
- - `mode` — `"wave"` (default) or `"single-task"`
42
-
43
- ---
44
-
45
- ## Step 1: Read Context Files
46
-
47
- Read the following files from `project_root` before constructing the Codex prompt:
48
-
49
- 1. `{project_root}/INTENT.md` (root) — Provides function-level context on what each piece of code should do
50
- 2. `{project_root}/STYLE.md` — Provides code standards and AI-ergonomic patterns Codex must enforce
51
- 3. For each file in `file_list`, check if a module-level `INTENT.md` exists alongside it (e.g. `src/auth/INTENT.md`) and read it if present
52
-
53
- If either root file is missing, note it in the prompt to Codex and continue — do not abort.
54
-
55
- ---
56
-
57
- ## Step 2: Determine Mode
58
-
59
- - If `mode` is `"wave"`, use broad wave-level context in the prompt (all files together, full acceptance criteria, wave summary)
60
- - If `mode` is `"single-task"`, scope the prompt tightly to the single task's files and criteria only
61
-
62
- ---
63
-
64
- ## Step 3: Construct the Codex Prompt
65
-
66
- Build a prompt string using the template below. Substitute all `{variables}` before passing to Codex.
67
-
68
- ```
69
- You are an adversarial code reviewer for a software project. Your job is to break the implementation, find edge cases, enforce code standards, and leave the codebase cleaner than you found it.
70
-
71
- ## Context
72
-
73
- Mode: {mode}
74
- Wave summary: {wave_context}
75
-
76
- ## Acceptance Criteria
77
-
78
- {acceptance_criteria}
79
-
80
- ## Files Changed
81
-
82
- {file_list — one per line}
83
-
84
- ## Reference Documents
85
-
86
- ### INTENT.md (root)
87
- {contents of root INTENT.md, or "Not found — skip INTENT validation"}
88
-
89
- ### STYLE.md
90
- {contents of STYLE.md, or "Not found — skip style enforcement"}
91
-
92
- {if module-level INTENT.md files were found, include each one with a header like:}
93
- ### INTENT.md ({module path})
94
- {contents}
95
-
96
- ## Your Tasks — execute all of these in order
97
-
98
- 1. Read every file in the file list. Understand what each function does and what it is supposed to do per INTENT.md.
99
-
100
- 2. Form adversarial test scenarios. Think about:
101
- - Edge cases the happy-path tests don't cover
102
- - Inputs that should fail gracefully but might not
103
- - Race conditions, off-by-one errors, null/undefined handling
104
- - Boundary conditions in the acceptance criteria
105
- - Any place INTENT.md says a function should do X but the code does Y
106
-
107
- 3. Run the tests. Fix every failure you find. Commit each fix separately with a descriptive message (e.g. "fix: handle null user in auth guard").
108
-
109
- 4. Review code quality against STYLE.md:
110
- - Flag any function over 50 lines
111
- - Flag any file over 1000 lines
112
- - Flag more than 3 levels of nesting
113
- - Flag barrel index.ts re-exports
114
- - Flag unclear naming that requires a comment to explain
115
-
116
- 5. Fix any STYLE.md violations. Commit each fix separately.
117
-
118
- 6. Append a summary of all findings and fixes to DEBUG.md at the project root. Use this format:
119
- ### Codex Gate — {timestamp}
120
- **Wave**: {wave_context summary, one line}
121
- **Fixes**: [list each fix with commit hash and description]
122
- **Quality issues**: [list each issue found, whether fixed or not]
123
- **INTENT.md conflicts**: [list any place code diverged from INTENT.md]
124
-
125
- 7. Write your structured output summary to the output file. Use exactly this format:
126
-
127
- ## Codex Gate Results
128
-
129
- **Status**: PASS | PASS_WITH_FIXES | FAIL
130
- **Tests formed**: [count]
131
- **Tests passed**: [count]
132
- **Fixes applied**: [count]
133
- **Quality issues**: [count]
134
-
135
- ### Fixes Applied
136
- - [commit hash]: [description]
137
-
138
- ### Remaining Issues
139
- - [file:line] — [description]
140
-
141
- ### INTENT.md Conflicts
142
- - [conflict description] — [affected function] — [what you changed vs what INTENT.md says]
143
-
144
- Status rules:
145
- - PASS: no failures, no quality issues
146
- - PASS_WITH_FIXES: failures or quality issues found and resolved
147
- - FAIL: failures remain that you could not fix
148
- ```
149
-
150
- ---
151
-
152
- ## Step 4: Generate Timestamp and Output Path
153
-
154
- Generate a Unix timestamp for the output file path to avoid collisions:
155
-
156
- ```
157
- TIMESTAMP=$(date +%s)
158
- OUTPUT_FILE="/tmp/codex-result-${TIMESTAMP}.md"
159
- ```
160
-
161
- ---
162
-
163
- ## Step 5: Construct and Run the Command
164
-
165
- Assemble the full command using the prompt from Step 3. Pass the prompt as the positional argument to `codex exec`.
166
-
167
- Base command template:
168
- ```
169
- codex exec --yolo --ephemeral -m "gpt-5.4" -c model_reasoning_effort="high" -o {OUTPUT_FILE} "{prompt}"
170
- ```
171
-
172
- Full invocation example (run via Bash):
173
- ```bash
174
- TIMESTAMP=$(date +%s)
175
- OUTPUT_FILE="/tmp/codex-result-${TIMESTAMP}.md"
176
- codex exec --yolo --ephemeral \
177
- -m "gpt-5.4" \
178
- -c model_reasoning_effort="high" \
179
- -o "$OUTPUT_FILE" \
180
- "$CODEX_PROMPT"
181
- ```
182
-
183
- Set a timeout of 600 seconds. If Codex does not complete within 600s, move to Step 6 with whatever partial output exists.
184
-
185
- **Flags reference:**
186
- - `--yolo` — No sandbox, no approval prompts; Claude Code is the outer sandbox
187
- - `--ephemeral` — No session state persisted on the Codex side
188
- - `-m "gpt-5.4"` — Model to use
189
- - `-c model_reasoning_effort="high"` — High reasoning effort for thorough analysis
190
- - `-o {OUTPUT_FILE}` — Write structured output to this file for clean capture
191
-
192
- ---
193
-
194
- ## Step 6: Error Handling
195
-
196
- Handle each failure case before reading the output file.
197
-
198
- **Codex not found:**
199
- ```
200
- If `which codex` returns nothing or the command exits with "command not found":
201
- Return: "Codex CLI not found. Install with: npm install -g @openai/codex — then re-run the gate."
202
- Do not proceed.
203
- ```
204
-
205
- **Timeout (>600s):**
206
- ```
207
- If the command exceeds 600 seconds:
208
- Check if OUTPUT_FILE exists and has content.
209
- If yes: proceed to Step 7 with a note "PARTIAL RESULTS — Codex timed out at 600s"
210
- If no: return FAIL with message "Codex timed out with no output captured."
211
- ```
212
-
213
- **Non-zero exit code:**
214
- ```
215
- Capture stderr. Include it in the results under "Remaining Issues" as:
216
- - [stderr content] — Codex exited with code {exit_code}
217
- Proceed to Step 7 to read any partial output.
218
- ```
219
-
220
- **Output file empty or missing:**
221
- ```
222
- Return structured result with Status: FAIL and message:
223
- "Codex output file not found or empty at {OUTPUT_FILE}. Codex may have crashed or produced no output."
224
- ```
225
-
226
- ---
227
-
228
- ## Step 7: Read and Parse the Output File
229
-
230
- Read `OUTPUT_FILE`. Extract the structured block that begins with `## Codex Gate Results`.
231
-
232
- Return the full structured summary to the calling skill (ftm-executor) in this exact format:
233
-
234
- ```
235
- ## Codex Gate Results
236
-
237
- **Status**: PASS | PASS_WITH_FIXES | FAIL
238
- **Tests formed**: [count]
239
- **Tests passed**: [count]
240
- **Fixes applied**: [count]
241
- **Quality issues**: [count]
242
-
243
- ### Fixes Applied
244
- - [commit hash]: [description]
245
-
246
- ### Remaining Issues
247
- - [file:line] — [description]
248
-
249
- ### INTENT.md Conflicts
250
- - [conflict description] — [affected function] — [what Codex changed vs what INTENT.md says]
251
- ```
252
-
253
- If the output file does not contain the expected format, return the raw file content and flag it as unstructured with Status: FAIL.
254
-
255
- ---
256
-
257
- ## Step 8: Return to Caller
258
-
259
- Pass the structured result back to ftm-executor. Do not post to any external system, do not notify the user directly unless ftm-executor explicitly delegates that to this skill.
260
-
261
- If Status is FAIL or PASS_WITH_FIXES, include the full "Remaining Issues" and "INTENT.md Conflicts" sections so ftm-executor can decide whether to retry, escalate, or continue to the next wave.
262
-
263
- ---
264
-
265
- ## Invocation Modes Summary
266
-
267
- | Mode | Scope | Prompt focus |
268
- |------|-------|-------------|
269
- | `wave` (default) | All files from completed wave | Full wave context, all acceptance criteria, broader adversarial sweep |
270
- | `single-task` | Files from one task | Tight scope, single task criteria, targeted adversarial cases |
271
-
272
- ---
273
-
274
- ## Blackboard Write
275
-
276
- After completing, update the blackboard:
277
-
278
- 1. Update `~/.claude/ftm-state/blackboard/context.json`:
279
- - Set current_task status to "complete"
280
- - Append decision summary to recent_decisions including the gate verdict (cap at 10)
281
- - Update session_metadata.skills_invoked and last_updated
282
- 2. Write an experience file to `~/.claude/ftm-state/blackboard/experiences/YYYY-MM-DD_task-slug.json` capturing gate mode, verdict, tests formed/passed, fixes applied, and any INTENT.md conflicts found
283
- 3. Update `~/.claude/ftm-state/blackboard/experiences/index.json` with the new entry
284
- 4. Emit `task_completed` event
285
-
286
- ## Error Output Template
287
-
288
- When returning an error before Codex runs:
289
-
290
- ```
291
- ## Codex Gate Results
292
-
293
- **Status**: FAIL
294
- **Error**: [description]
295
- **Tests formed**: 0
296
- **Tests passed**: 0
297
- **Fixes applied**: 0
298
- **Quality issues**: 0
299
-
300
- ### Remaining Issues
301
- - [error detail]
302
- ```
303
-
304
- ## Requirements
305
-
306
- - tool: `codex` | required | OpenAI Codex CLI for adversarial validation
307
- - reference: `{project_root}/INTENT.md` | optional | root intent documentation for conflict detection
308
- - reference: `{project_root}/STYLE.md` | optional | code style standards for quality enforcement
309
- - reference: module-level `INTENT.md` files | optional | per-module intent for targeted conflict detection
310
- - reference: `~/.claude/ftm-state/blackboard/context.json` | optional | session state
311
- - reference: `~/.claude/ftm-state/blackboard/experiences/index.json` | optional | prior validation patterns
312
-
313
- ## Risk
314
-
315
- - level: medium_write
316
- - scope: Codex modifies source files and commits fixes directly in the project working directory (--yolo mode); writes entries to DEBUG.md; writes structured output to /tmp/codex-result-*.md
317
- - rollback: git revert codex fix commits; delete /tmp/codex-result-*.md cleanup is automatic
318
-
319
- ## Approval Gates
320
-
321
- - trigger: codex gate returns PASS_WITH_FIXES and INTENT.md conflict detected | action: auto-invoke ftm-council for arbitration before accepting or reverting the fix
322
- - trigger: codex gate returns FAIL after 2 fix attempts | action: report remaining issues to ftm-executor caller, wait for direction
323
- - trigger: codex CLI not found | action: return FAIL immediately with install instructions, do not proceed
324
- - complexity_routing: micro → auto | small → auto | medium → auto | large → auto | xl → auto
325
-
326
- ## Fallbacks
327
-
328
- - condition: codex CLI not installed | action: return FAIL with "Codex CLI not found. Install with: npm install -g @openai/codex"
329
- - condition: codex times out after 600s | action: read partial output if available, return PARTIAL results with note; if no output, return FAIL
330
- - condition: output file empty or missing | action: return FAIL with "Codex output not found — may have crashed"
331
- - condition: INTENT.md missing at project root | action: note in prompt to Codex and continue without INTENT validation
332
- - condition: STYLE.md missing | action: note in prompt to Codex and continue without style enforcement
333
-
334
- ## Capabilities
335
-
336
- - cli: `codex` | required | OpenAI Codex CLI (npm install -g @openai/codex)
337
- - env: `OPENAI_API_KEY` | required | authentication for Codex CLI execution
338
-
339
- ## Event Payloads
340
-
341
- ### review_complete
342
- - skill: string — "ftm-codex-gate"
343
- - mode: string — "wave" | "single-task"
344
- - status: string — "PASS" | "PASS_WITH_FIXES" | "FAIL"
345
- - tests_formed: number — adversarial test scenarios generated
346
- - tests_passed: number — test scenarios that passed
347
- - fixes_applied: number — fixes committed by Codex
348
- - quality_issues: number — style/quality violations found
349
- - intent_conflicts: number — INTENT.md conflicts detected
350
-
351
- ### issue_found
352
- - skill: string — "ftm-codex-gate"
353
- - file_path: string — file where issue was found
354
- - line: number | null — line number if available
355
- - description: string — issue description
356
- - type: string — "test_failure" | "quality_violation" | "intent_conflict"
357
-
358
- ### task_completed
359
- - skill: string — "ftm-codex-gate"
360
- - status: string — "PASS" | "PASS_WITH_FIXES" | "FAIL"
361
- - output_file: string — path to Codex result file
1
+ ---
2
+ name: ftm-codex-gate
3
+ description: Codex CLI integration gate for adversarial code validation. Invokes codex exec --yolo --ephemeral with gpt-5.4 to form test scenarios, review code quality, fix failures, and enforce STYLE.md patterns. Use when ftm-executor needs Codex validation at wave boundaries or task completion, or when user says "codex gate", "run codex", "validate with codex". Not for direct user interaction — primarily auto-invoked by ftm-executor.
4
+ ---
5
+
6
+ ## Events
7
+
8
+ ### Emits
9
+ - `review_complete` — when Codex finishes analysis and a PASS, PASS_WITH_FIXES, or FAIL verdict is produced
10
+ - `issue_found` — when Codex identifies a quality violation, INTENT.md conflict, or test failure in the reviewed files
11
+ - `task_completed` — when the gate run concludes and results are returned to the calling skill
12
+
13
+ ### Listens To
14
+ - `code_committed` — run adversarial validation at wave boundaries after commits land in the executor's worktree
15
+
16
+ ## Blackboard Read
17
+
18
+ Before starting, load context from the blackboard:
19
+
20
+ 1. Read `~/.claude/ftm-state/blackboard/context.json` — check current_task, recent_decisions, active_constraints
21
+ 2. Read `~/.claude/ftm-state/blackboard/experiences/index.json` — filter entries by tags matching "validation", "codex", or "review"
22
+ 3. Load top 3-5 matching experience files for patterns in what Codex commonly flags or auto-fixes
23
+ 4. Read `~/.claude/ftm-state/blackboard/patterns.json` — check recurring_issues for common validation failures and execution_patterns for typical fix types
24
+
25
+ If index.json is empty or no matches found, proceed normally without experience-informed shortcuts.
26
+
27
+ # Codex Gate
28
+
29
+ This skill is the integration layer between ftm-executor and the Codex CLI. It constructs adversarial validation prompts, runs them through `codex exec`, captures structured output, and returns results to the calling skill. It does not interact with the user directly — it is invoked at wave boundaries or task completion.
30
+
31
+ ---
32
+
33
+ ## Inputs
34
+
35
+ Expect these inputs from the calling skill (ftm-executor). If any are missing, ask for them before proceeding.
36
+
37
+ - `file_list` — List of changed files to review (absolute paths)
38
+ - `acceptance_criteria` — The acceptance criteria from the plan tasks in this wave
39
+ - `wave_context` — A summary of what this wave accomplished
40
+ - `project_root` — The working directory path (absolute)
41
+ - `mode` — `"wave"` (default) or `"single-task"`
42
+
43
+ ---
44
+
45
+ ## Step 1: Read Context Files
46
+
47
+ Read the following files from `project_root` before constructing the Codex prompt:
48
+
49
+ 1. `{project_root}/INTENT.md` (root) — Provides function-level context on what each piece of code should do
50
+ 2. `{project_root}/STYLE.md` — Provides code standards and AI-ergonomic patterns Codex must enforce
51
+ 3. For each file in `file_list`, check if a module-level `INTENT.md` exists alongside it (e.g. `src/auth/INTENT.md`) and read it if present
52
+
53
+ If either root file is missing, note it in the prompt to Codex and continue — do not abort.
54
+
55
+ ---
56
+
57
+ ## Step 2: Determine Mode
58
+
59
+ - If `mode` is `"wave"`, use broad wave-level context in the prompt (all files together, full acceptance criteria, wave summary)
60
+ - If `mode` is `"single-task"`, scope the prompt tightly to the single task's files and criteria only
61
+
62
+ ---
63
+
64
+ ## Step 3: Construct the Codex Prompt
65
+
66
+ Build a prompt string using the template below. Substitute all `{variables}` before passing to Codex.
67
+
68
+ ```
69
+ You are an adversarial code reviewer for a software project. Your job is to break the implementation, find edge cases, enforce code standards, and leave the codebase cleaner than you found it.
70
+
71
+ ## Context
72
+
73
+ Mode: {mode}
74
+ Wave summary: {wave_context}
75
+
76
+ ## Acceptance Criteria
77
+
78
+ {acceptance_criteria}
79
+
80
+ ## Files Changed
81
+
82
+ {file_list — one per line}
83
+
84
+ ## Reference Documents
85
+
86
+ ### INTENT.md (root)
87
+ {contents of root INTENT.md, or "Not found — skip INTENT validation"}
88
+
89
+ ### STYLE.md
90
+ {contents of STYLE.md, or "Not found — skip style enforcement"}
91
+
92
+ {if module-level INTENT.md files were found, include each one with a header like:}
93
+ ### INTENT.md ({module path})
94
+ {contents}
95
+
96
+ ## Your Tasks — execute all of these in order
97
+
98
+ 1. Read every file in the file list. Understand what each function does and what it is supposed to do per INTENT.md.
99
+
100
+ 2. Form adversarial test scenarios. Think about:
101
+ - Edge cases the happy-path tests don't cover
102
+ - Inputs that should fail gracefully but might not
103
+ - Race conditions, off-by-one errors, null/undefined handling
104
+ - Boundary conditions in the acceptance criteria
105
+ - Any place INTENT.md says a function should do X but the code does Y
106
+
107
+ 3. Run the tests. Fix every failure you find. Commit each fix separately with a descriptive message (e.g. "fix: handle null user in auth guard").
108
+
109
+ 4. Review code quality against STYLE.md:
110
+ - Flag any function over 50 lines
111
+ - Flag any file over 1000 lines
112
+ - Flag more than 3 levels of nesting
113
+ - Flag barrel index.ts re-exports
114
+ - Flag unclear naming that requires a comment to explain
115
+
116
+ 5. Fix any STYLE.md violations. Commit each fix separately.
117
+
118
+ 6. Append a summary of all findings and fixes to DEBUG.md at the project root. Use this format:
119
+ ### Codex Gate — {timestamp}
120
+ **Wave**: {wave_context summary, one line}
121
+ **Fixes**: [list each fix with commit hash and description]
122
+ **Quality issues**: [list each issue found, whether fixed or not]
123
+ **INTENT.md conflicts**: [list any place code diverged from INTENT.md]
124
+
125
+ 7. Write your structured output summary to the output file. Use exactly this format:
126
+
127
+ ## Codex Gate Results
128
+
129
+ **Status**: PASS | PASS_WITH_FIXES | FAIL
130
+ **Tests formed**: [count]
131
+ **Tests passed**: [count]
132
+ **Fixes applied**: [count]
133
+ **Quality issues**: [count]
134
+
135
+ ### Fixes Applied
136
+ - [commit hash]: [description]
137
+
138
+ ### Remaining Issues
139
+ - [file:line] — [description]
140
+
141
+ ### INTENT.md Conflicts
142
+ - [conflict description] — [affected function] — [what you changed vs what INTENT.md says]
143
+
144
+ Status rules:
145
+ - PASS: no failures, no quality issues
146
+ - PASS_WITH_FIXES: failures or quality issues found and resolved
147
+ - FAIL: failures remain that you could not fix
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Step 4: Generate Timestamp and Output Path
153
+
154
+ Generate a Unix timestamp for the output file path to avoid collisions:
155
+
156
+ ```
157
+ TIMESTAMP=$(date +%s)
158
+ OUTPUT_FILE="/tmp/codex-result-${TIMESTAMP}.md"
159
+ ```
160
+
161
+ ---
162
+
163
+ ## Step 5: Construct and Run the Command
164
+
165
+ Assemble the full command using the prompt from Step 3. Pass the prompt as the positional argument to `codex exec`.
166
+
167
+ Base command template:
168
+ ```
169
+ codex exec --yolo --ephemeral -m "gpt-5.4" -c model_reasoning_effort="high" -o {OUTPUT_FILE} "{prompt}"
170
+ ```
171
+
172
+ Full invocation example (run via Bash):
173
+ ```bash
174
+ TIMESTAMP=$(date +%s)
175
+ OUTPUT_FILE="/tmp/codex-result-${TIMESTAMP}.md"
176
+ codex exec --yolo --ephemeral \
177
+ -m "gpt-5.4" \
178
+ -c model_reasoning_effort="high" \
179
+ -o "$OUTPUT_FILE" \
180
+ "$CODEX_PROMPT"
181
+ ```
182
+
183
+ Set a timeout of 600 seconds. If Codex does not complete within 600s, move to Step 6 with whatever partial output exists.
184
+
185
+ **Flags reference:**
186
+ - `--yolo` — No sandbox, no approval prompts; Claude Code is the outer sandbox
187
+ - `--ephemeral` — No session state persisted on the Codex side
188
+ - `-m "gpt-5.4"` — Model to use
189
+ - `-c model_reasoning_effort="high"` — High reasoning effort for thorough analysis
190
+ - `-o {OUTPUT_FILE}` — Write structured output to this file for clean capture
191
+
192
+ ---
193
+
194
+ ## Step 6: Error Handling
195
+
196
+ Handle each failure case before reading the output file.
197
+
198
+ **Codex not found:**
199
+ ```
200
+ If `which codex` returns nothing or the command exits with "command not found":
201
+ Return: "Codex CLI not found. Install with: npm install -g @openai/codex — then re-run the gate."
202
+ Do not proceed.
203
+ ```
204
+
205
+ **Timeout (>600s):**
206
+ ```
207
+ If the command exceeds 600 seconds:
208
+ Check if OUTPUT_FILE exists and has content.
209
+ If yes: proceed to Step 7 with a note "PARTIAL RESULTS — Codex timed out at 600s"
210
+ If no: return FAIL with message "Codex timed out with no output captured."
211
+ ```
212
+
213
+ **Non-zero exit code:**
214
+ ```
215
+ Capture stderr. Include it in the results under "Remaining Issues" as:
216
+ - [stderr content] — Codex exited with code {exit_code}
217
+ Proceed to Step 7 to read any partial output.
218
+ ```
219
+
220
+ **Output file empty or missing:**
221
+ ```
222
+ Return structured result with Status: FAIL and message:
223
+ "Codex output file not found or empty at {OUTPUT_FILE}. Codex may have crashed or produced no output."
224
+ ```
225
+
226
+ ---
227
+
228
+ ## Step 7: Read and Parse the Output File
229
+
230
+ Read `OUTPUT_FILE`. Extract the structured block that begins with `## Codex Gate Results`.
231
+
232
+ Return the full structured summary to the calling skill (ftm-executor) in this exact format:
233
+
234
+ ```
235
+ ## Codex Gate Results
236
+
237
+ **Status**: PASS | PASS_WITH_FIXES | FAIL
238
+ **Tests formed**: [count]
239
+ **Tests passed**: [count]
240
+ **Fixes applied**: [count]
241
+ **Quality issues**: [count]
242
+
243
+ ### Fixes Applied
244
+ - [commit hash]: [description]
245
+
246
+ ### Remaining Issues
247
+ - [file:line] — [description]
248
+
249
+ ### INTENT.md Conflicts
250
+ - [conflict description] — [affected function] — [what Codex changed vs what INTENT.md says]
251
+ ```
252
+
253
+ If the output file does not contain the expected format, return the raw file content and flag it as unstructured with Status: FAIL.
254
+
255
+ ---
256
+
257
+ ## Step 8: Return to Caller
258
+
259
+ Pass the structured result back to ftm-executor. Do not post to any external system, do not notify the user directly unless ftm-executor explicitly delegates that to this skill.
260
+
261
+ If Status is FAIL or PASS_WITH_FIXES, include the full "Remaining Issues" and "INTENT.md Conflicts" sections so ftm-executor can decide whether to retry, escalate, or continue to the next wave.
262
+
263
+ ---
264
+
265
+ ## Invocation Modes Summary
266
+
267
+ | Mode | Scope | Prompt focus |
268
+ |------|-------|-------------|
269
+ | `wave` (default) | All files from completed wave | Full wave context, all acceptance criteria, broader adversarial sweep |
270
+ | `single-task` | Files from one task | Tight scope, single task criteria, targeted adversarial cases |
271
+
272
+ ---
273
+
274
+ ## Blackboard Write
275
+
276
+ After completing, update the blackboard:
277
+
278
+ 1. Update `~/.claude/ftm-state/blackboard/context.json`:
279
+ - Set current_task status to "complete"
280
+ - Append decision summary to recent_decisions including the gate verdict (cap at 10)
281
+ - Update session_metadata.skills_invoked and last_updated
282
+ 2. Write an experience file to `~/.claude/ftm-state/blackboard/experiences/YYYY-MM-DD_task-slug.json` capturing gate mode, verdict, tests formed/passed, fixes applied, and any INTENT.md conflicts found
283
+ 3. Update `~/.claude/ftm-state/blackboard/experiences/index.json` with the new entry
284
+ 4. Emit `task_completed` event
285
+
286
+ ## Error Output Template
287
+
288
+ When returning an error before Codex runs:
289
+
290
+ ```
291
+ ## Codex Gate Results
292
+
293
+ **Status**: FAIL
294
+ **Error**: [description]
295
+ **Tests formed**: 0
296
+ **Tests passed**: 0
297
+ **Fixes applied**: 0
298
+ **Quality issues**: 0
299
+
300
+ ### Remaining Issues
301
+ - [error detail]
302
+ ```
303
+
304
+ ## Requirements
305
+
306
+ - tool: `codex` | required | OpenAI Codex CLI for adversarial validation
307
+ - reference: `{project_root}/INTENT.md` | optional | root intent documentation for conflict detection
308
+ - reference: `{project_root}/STYLE.md` | optional | code style standards for quality enforcement
309
+ - reference: module-level `INTENT.md` files | optional | per-module intent for targeted conflict detection
310
+ - reference: `~/.claude/ftm-state/blackboard/context.json` | optional | session state
311
+ - reference: `~/.claude/ftm-state/blackboard/experiences/index.json` | optional | prior validation patterns
312
+
313
+ ## Risk
314
+
315
+ - level: medium_write
316
+ - scope: Codex modifies source files and commits fixes directly in the project working directory (--yolo mode); writes entries to DEBUG.md; writes structured output to /tmp/codex-result-*.md
317
+ - rollback: git revert codex fix commits; delete /tmp/codex-result-*.md cleanup is automatic
318
+
319
+ ## Approval Gates
320
+
321
+ - trigger: codex gate returns PASS_WITH_FIXES and INTENT.md conflict detected | action: auto-invoke ftm-council for arbitration before accepting or reverting the fix
322
+ - trigger: codex gate returns FAIL after 2 fix attempts | action: report remaining issues to ftm-executor caller, wait for direction
323
+ - trigger: codex CLI not found | action: return FAIL immediately with install instructions, do not proceed
324
+ - complexity_routing: micro → auto | small → auto | medium → auto | large → auto | xl → auto
325
+
326
+ ## Fallbacks
327
+
328
+ - condition: codex CLI not installed | action: return FAIL with "Codex CLI not found. Install with: npm install -g @openai/codex"
329
+ - condition: codex times out after 600s | action: read partial output if available, return PARTIAL results with note; if no output, return FAIL
330
+ - condition: output file empty or missing | action: return FAIL with "Codex output not found — may have crashed"
331
+ - condition: INTENT.md missing at project root | action: note in prompt to Codex and continue without INTENT validation
332
+ - condition: STYLE.md missing | action: note in prompt to Codex and continue without style enforcement
333
+
334
+ ## Capabilities
335
+
336
+ - cli: `codex` | required | OpenAI Codex CLI (npm install -g @openai/codex)
337
+ - env: `OPENAI_API_KEY` | required | authentication for Codex CLI execution
338
+
339
+ ## Event Payloads
340
+
341
+ ### review_complete
342
+ - skill: string — "ftm-codex-gate"
343
+ - mode: string — "wave" | "single-task"
344
+ - status: string — "PASS" | "PASS_WITH_FIXES" | "FAIL"
345
+ - tests_formed: number — adversarial test scenarios generated
346
+ - tests_passed: number — test scenarios that passed
347
+ - fixes_applied: number — fixes committed by Codex
348
+ - quality_issues: number — style/quality violations found
349
+ - intent_conflicts: number — INTENT.md conflicts detected
350
+
351
+ ### issue_found
352
+ - skill: string — "ftm-codex-gate"
353
+ - file_path: string — file where issue was found
354
+ - line: number | null — line number if available
355
+ - description: string — issue description
356
+ - type: string — "test_failure" | "quality_violation" | "intent_conflict"
357
+
358
+ ### task_completed
359
+ - skill: string — "ftm-codex-gate"
360
+ - status: string — "PASS" | "PASS_WITH_FIXES" | "FAIL"
361
+ - output_file: string — path to Codex result file