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