feed-the-machine 1.6.1 → 1.7.1

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 (272) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +262 -170
  3. package/bin/__pycache__/tasks_db.cpython-314.pyc +0 -0
  4. package/bin/brain.py +1340 -0
  5. package/bin/convert_claude_skills_to_codex.py +490 -0
  6. package/bin/generate-manifest.mjs +463 -463
  7. package/bin/harden_codex_skills.py +141 -0
  8. package/bin/install.mjs +491 -491
  9. package/bin/migrate-eng-buddy-data.py +875 -0
  10. package/bin/playbook_engine/__init__.py +1 -0
  11. package/bin/playbook_engine/conftest.py +8 -0
  12. package/bin/playbook_engine/extractor.py +33 -0
  13. package/bin/playbook_engine/manager.py +102 -0
  14. package/bin/playbook_engine/models.py +84 -0
  15. package/bin/playbook_engine/registry.py +35 -0
  16. package/bin/playbook_engine/test_extractor.py +72 -0
  17. package/bin/playbook_engine/test_integration.py +129 -0
  18. package/bin/playbook_engine/test_manager.py +85 -0
  19. package/bin/playbook_engine/test_models.py +166 -0
  20. package/bin/playbook_engine/test_registry.py +67 -0
  21. package/bin/playbook_engine/test_tracer.py +86 -0
  22. package/bin/playbook_engine/tracer.py +93 -0
  23. package/bin/tasks_db.py +456 -0
  24. package/docs/HOOKS.md +243 -243
  25. package/docs/INBOX.md +233 -233
  26. package/ftm/SKILL.md +125 -122
  27. package/ftm-audit/SKILL.md +673 -623
  28. package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
  29. package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
  30. package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
  31. package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
  32. package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
  33. package/ftm-audit/scripts/run-knip.sh +23 -23
  34. package/ftm-audit.yml +2 -2
  35. package/ftm-brainstorm/SKILL.md +1003 -498
  36. package/ftm-brainstorm/evals/evals.json +180 -100
  37. package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
  38. package/ftm-brainstorm/references/agent-prompts.md +552 -224
  39. package/ftm-brainstorm/references/plan-template.md +209 -121
  40. package/ftm-brainstorm.yml +2 -2
  41. package/ftm-browse/SKILL.md +454 -454
  42. package/ftm-browse/daemon/browser-manager.ts +206 -206
  43. package/ftm-browse/daemon/bun.lock +30 -30
  44. package/ftm-browse/daemon/cli.ts +347 -347
  45. package/ftm-browse/daemon/commands.ts +410 -410
  46. package/ftm-browse/daemon/main.ts +357 -357
  47. package/ftm-browse/daemon/package.json +17 -17
  48. package/ftm-browse/daemon/server.ts +189 -189
  49. package/ftm-browse/daemon/snapshot.ts +519 -519
  50. package/ftm-browse/daemon/tsconfig.json +22 -22
  51. package/ftm-browse.yml +4 -4
  52. package/ftm-capture/SKILL.md +370 -370
  53. package/ftm-capture.yml +4 -4
  54. package/ftm-codex-gate/SKILL.md +361 -361
  55. package/ftm-codex-gate.yml +2 -2
  56. package/ftm-config/SKILL.md +422 -345
  57. package/ftm-config.default.yml +125 -82
  58. package/ftm-config.yml +44 -2
  59. package/ftm-council/SKILL.md +416 -416
  60. package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
  61. package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
  62. package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
  63. package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
  64. package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
  65. package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
  66. package/ftm-council-chat.yml +2 -0
  67. package/ftm-council.yml +2 -2
  68. package/ftm-dashboard/SKILL.md +163 -163
  69. package/ftm-dashboard.yml +4 -4
  70. package/ftm-debug/SKILL.md +1037 -1037
  71. package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
  72. package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
  73. package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
  74. package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
  75. package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
  76. package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
  77. package/ftm-debug.yml +2 -2
  78. package/ftm-diagram/SKILL.md +277 -277
  79. package/ftm-diagram.yml +2 -2
  80. package/ftm-executor/SKILL.md +777 -777
  81. package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
  82. package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
  83. package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
  84. package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
  85. package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +81 -72
  86. package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
  87. package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
  88. package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
  89. package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -59
  90. package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
  91. package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
  92. package/ftm-executor/runtime/package.json +8 -8
  93. package/ftm-executor.yml +2 -2
  94. package/ftm-git/SKILL.md +441 -441
  95. package/ftm-git/evals/evals.json +26 -26
  96. package/ftm-git/evals/promptfoo.yaml +75 -75
  97. package/ftm-git/hooks/post-commit-experience.sh +92 -92
  98. package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
  99. package/ftm-git/references/protocols/REMEDIATION.md +139 -139
  100. package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
  101. package/ftm-git.yml +2 -2
  102. package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
  103. package/ftm-inbox/backend/adapters/_retry.py +64 -64
  104. package/ftm-inbox/backend/adapters/base.py +230 -230
  105. package/ftm-inbox/backend/adapters/freshservice.py +104 -104
  106. package/ftm-inbox/backend/adapters/gmail.py +125 -125
  107. package/ftm-inbox/backend/adapters/jira.py +136 -136
  108. package/ftm-inbox/backend/adapters/registry.py +192 -192
  109. package/ftm-inbox/backend/adapters/slack.py +110 -110
  110. package/ftm-inbox/backend/db/connection.py +54 -54
  111. package/ftm-inbox/backend/db/schema.py +78 -78
  112. package/ftm-inbox/backend/executor/__init__.py +7 -7
  113. package/ftm-inbox/backend/executor/engine.py +149 -149
  114. package/ftm-inbox/backend/executor/step_runner.py +98 -98
  115. package/ftm-inbox/backend/main.py +103 -103
  116. package/ftm-inbox/backend/models/__init__.py +1 -1
  117. package/ftm-inbox/backend/models/unified_task.py +36 -36
  118. package/ftm-inbox/backend/planner/__init__.py +6 -6
  119. package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
  120. package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
  121. package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
  122. package/ftm-inbox/backend/planner/generator.py +127 -127
  123. package/ftm-inbox/backend/planner/schema.py +34 -34
  124. package/ftm-inbox/backend/requirements.txt +5 -5
  125. package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
  126. package/ftm-inbox/backend/routes/execute.py +186 -186
  127. package/ftm-inbox/backend/routes/health.py +52 -52
  128. package/ftm-inbox/backend/routes/inbox.py +68 -68
  129. package/ftm-inbox/backend/routes/plan.py +271 -271
  130. package/ftm-inbox/bin/launchagent.mjs +91 -91
  131. package/ftm-inbox/bin/setup.mjs +188 -188
  132. package/ftm-inbox/bin/start.sh +10 -10
  133. package/ftm-inbox/bin/status.sh +17 -17
  134. package/ftm-inbox/bin/stop.sh +8 -8
  135. package/ftm-inbox/config.example.yml +55 -55
  136. package/ftm-inbox/package-lock.json +2898 -2898
  137. package/ftm-inbox/package.json +26 -26
  138. package/ftm-inbox/postcss.config.js +6 -6
  139. package/ftm-inbox/src/app.css +199 -199
  140. package/ftm-inbox/src/app.html +18 -18
  141. package/ftm-inbox/src/lib/api.ts +166 -166
  142. package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
  143. package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
  144. package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
  145. package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
  146. package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
  147. package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
  148. package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
  149. package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
  150. package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
  151. package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
  152. package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
  153. package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
  154. package/ftm-inbox/src/lib/theme.ts +47 -47
  155. package/ftm-inbox/src/routes/+layout.svelte +76 -76
  156. package/ftm-inbox/src/routes/+page.svelte +401 -401
  157. package/ftm-inbox/svelte.config.js +12 -12
  158. package/ftm-inbox/tailwind.config.ts +63 -63
  159. package/ftm-inbox/tsconfig.json +13 -13
  160. package/ftm-inbox/vite.config.ts +6 -6
  161. package/ftm-intent/SKILL.md +241 -241
  162. package/ftm-intent.yml +2 -2
  163. package/ftm-manifest.json +3794 -3794
  164. package/ftm-map/SKILL.md +291 -291
  165. package/ftm-map/scripts/db.py +712 -712
  166. package/ftm-map/scripts/index.py +415 -415
  167. package/ftm-map/scripts/parser.py +224 -224
  168. package/ftm-map/scripts/queries/go-tags.scm +20 -20
  169. package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
  170. package/ftm-map/scripts/queries/python-tags.scm +31 -31
  171. package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
  172. package/ftm-map/scripts/queries/rust-tags.scm +37 -37
  173. package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
  174. package/ftm-map/scripts/query.py +301 -301
  175. package/ftm-map/scripts/ranker.py +377 -377
  176. package/ftm-map/scripts/requirements.txt +5 -5
  177. package/ftm-map/scripts/setup-hooks.sh +27 -27
  178. package/ftm-map/scripts/setup.sh +56 -56
  179. package/ftm-map/scripts/test_db.py +364 -364
  180. package/ftm-map/scripts/test_parser.py +174 -174
  181. package/ftm-map/scripts/test_query.py +183 -183
  182. package/ftm-map/scripts/test_ranker.py +199 -199
  183. package/ftm-map/scripts/views.py +591 -591
  184. package/ftm-map.yml +2 -2
  185. package/ftm-mind/SKILL.md +201 -1943
  186. package/ftm-mind/evals/promptfoo.yaml +142 -142
  187. package/ftm-mind/references/blackboard-protocol.md +110 -0
  188. package/ftm-mind/references/blackboard-schema.md +328 -328
  189. package/ftm-mind/references/complexity-guide.md +110 -110
  190. package/ftm-mind/references/complexity-sizing.md +138 -0
  191. package/ftm-mind/references/decide-act-protocol.md +172 -0
  192. package/ftm-mind/references/direct-execution.md +51 -0
  193. package/ftm-mind/references/environment-discovery.md +77 -0
  194. package/ftm-mind/references/event-registry.md +319 -319
  195. package/ftm-mind/references/mcp-inventory.md +300 -296
  196. package/ftm-mind/references/ops-routing.md +47 -0
  197. package/ftm-mind/references/orient-protocol.md +234 -0
  198. package/ftm-mind/references/personality.md +40 -0
  199. package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
  200. package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
  201. package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
  202. package/ftm-mind/references/reflexion-protocol.md +249 -249
  203. package/ftm-mind/references/routing/SCENARIOS.md +22 -22
  204. package/ftm-mind/references/routing-scenarios.md +35 -35
  205. package/ftm-mind.yml +2 -2
  206. package/ftm-ops.yml +4 -0
  207. package/ftm-pause/SKILL.md +395 -395
  208. package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
  209. package/ftm-pause/references/protocols/VALIDATION.md +80 -80
  210. package/ftm-pause.yml +2 -2
  211. package/ftm-researcher/SKILL.md +275 -275
  212. package/ftm-researcher/evals/agent-diversity.yaml +17 -17
  213. package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
  214. package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
  215. package/ftm-researcher/references/adaptive-search.md +116 -116
  216. package/ftm-researcher/references/agent-prompts.md +193 -193
  217. package/ftm-researcher/references/council-integration.md +193 -193
  218. package/ftm-researcher/references/output-format.md +203 -203
  219. package/ftm-researcher/references/synthesis-pipeline.md +165 -165
  220. package/ftm-researcher/scripts/score_credibility.py +234 -234
  221. package/ftm-researcher/scripts/validate_research.py +92 -92
  222. package/ftm-researcher.yml +2 -2
  223. package/ftm-resume/SKILL.md +518 -518
  224. package/ftm-resume/references/protocols/VALIDATION.md +172 -172
  225. package/ftm-resume.yml +2 -2
  226. package/ftm-retro/SKILL.md +380 -380
  227. package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
  228. package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
  229. package/ftm-retro.yml +2 -2
  230. package/ftm-routine/SKILL.md +170 -170
  231. package/ftm-routine.yml +4 -4
  232. package/ftm-state/blackboard/capabilities.json +5 -5
  233. package/ftm-state/blackboard/capabilities.schema.json +27 -27
  234. package/ftm-state/blackboard/context.json +37 -23
  235. package/ftm-state/blackboard/experiences/doom-statusline-fix.json +26 -0
  236. package/ftm-state/blackboard/experiences/hackathon-pages-site.json +26 -0
  237. package/ftm-state/blackboard/experiences/hindsight-sso-kickoff.json +42 -0
  238. package/ftm-state/blackboard/experiences/index.json +58 -9
  239. package/ftm-state/blackboard/experiences/learning-ragnarok-api-access.json +23 -0
  240. package/ftm-state/blackboard/experiences/nordlayer-members-auto-assign.json +26 -0
  241. package/ftm-state/blackboard/experiences/saml2aws-stale-session-fix.json +41 -0
  242. package/ftm-state/blackboard/patterns.json +6 -6
  243. package/ftm-state/schemas/context.schema.json +130 -130
  244. package/ftm-state/schemas/experience-index.schema.json +77 -77
  245. package/ftm-state/schemas/experience.schema.json +78 -78
  246. package/ftm-state/schemas/patterns.schema.json +44 -44
  247. package/ftm-upgrade/SKILL.md +194 -194
  248. package/ftm-upgrade/scripts/check-version.sh +76 -76
  249. package/ftm-upgrade/scripts/upgrade.sh +143 -143
  250. package/ftm-upgrade.yml +2 -2
  251. package/ftm-verify.yml +2 -2
  252. package/ftm.yml +2 -2
  253. package/hooks/ftm-auto-log.sh +137 -0
  254. package/hooks/ftm-blackboard-enforcer.sh +93 -93
  255. package/hooks/ftm-discovery-reminder.sh +90 -90
  256. package/hooks/ftm-drafts-gate.sh +61 -61
  257. package/hooks/ftm-event-logger.mjs +107 -107
  258. package/hooks/ftm-install-hooks.sh +240 -0
  259. package/hooks/ftm-learning-capture.sh +117 -0
  260. package/hooks/ftm-map-autodetect.sh +79 -79
  261. package/hooks/ftm-pending-sync-check.sh +22 -22
  262. package/hooks/ftm-plan-gate.sh +92 -92
  263. package/hooks/ftm-post-commit-trigger.sh +57 -57
  264. package/hooks/ftm-post-compaction.sh +138 -0
  265. package/hooks/ftm-pre-compaction.sh +147 -0
  266. package/hooks/ftm-session-end.sh +52 -0
  267. package/hooks/ftm-session-snapshot.sh +213 -0
  268. package/hooks/ftm-task-loader.sh +100 -0
  269. package/hooks/settings-template.json +91 -81
  270. package/install.sh +363 -363
  271. package/package.json +84 -84
  272. 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