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.
- package/LICENSE +21 -21
- package/README.md +170 -170
- package/bin/brain.py +1340 -0
- package/bin/convert_claude_skills_to_codex.py +490 -0
- package/bin/generate-manifest.mjs +463 -463
- package/bin/harden_codex_skills.py +141 -0
- package/bin/install.mjs +491 -491
- package/bin/migrate-eng-buddy-data.py +875 -0
- package/bin/playbook_engine/__init__.py +1 -0
- package/bin/playbook_engine/conftest.py +8 -0
- package/bin/playbook_engine/extractor.py +33 -0
- package/bin/playbook_engine/manager.py +102 -0
- package/bin/playbook_engine/models.py +84 -0
- package/bin/playbook_engine/registry.py +35 -0
- package/bin/playbook_engine/test_extractor.py +72 -0
- package/bin/playbook_engine/test_integration.py +129 -0
- package/bin/playbook_engine/test_manager.py +85 -0
- package/bin/playbook_engine/test_models.py +166 -0
- package/bin/playbook_engine/test_registry.py +67 -0
- package/bin/playbook_engine/test_tracer.py +86 -0
- package/bin/playbook_engine/tracer.py +93 -0
- package/bin/tasks_db.py +456 -0
- package/docs/HOOKS.md +243 -243
- package/docs/INBOX.md +233 -233
- package/ftm/SKILL.md +125 -122
- package/ftm-audit/SKILL.md +623 -623
- package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
- package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
- package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
- package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
- package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
- package/ftm-audit/scripts/run-knip.sh +23 -23
- package/ftm-audit.yml +2 -2
- package/ftm-brainstorm/SKILL.md +1003 -498
- package/ftm-brainstorm/evals/evals.json +180 -100
- package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
- package/ftm-brainstorm/references/agent-prompts.md +552 -224
- package/ftm-brainstorm/references/plan-template.md +209 -121
- package/ftm-brainstorm.yml +2 -2
- package/ftm-browse/SKILL.md +454 -454
- package/ftm-browse/daemon/browser-manager.ts +206 -206
- package/ftm-browse/daemon/bun.lock +30 -30
- package/ftm-browse/daemon/cli.ts +347 -347
- package/ftm-browse/daemon/commands.ts +410 -410
- package/ftm-browse/daemon/main.ts +357 -357
- package/ftm-browse/daemon/package.json +17 -17
- package/ftm-browse/daemon/server.ts +189 -189
- package/ftm-browse/daemon/snapshot.ts +519 -519
- package/ftm-browse/daemon/tsconfig.json +22 -22
- package/ftm-browse.yml +4 -4
- package/ftm-capture/SKILL.md +370 -370
- package/ftm-capture.yml +4 -4
- package/ftm-codex-gate/SKILL.md +361 -361
- package/ftm-codex-gate.yml +2 -2
- package/ftm-config/SKILL.md +422 -345
- package/ftm-config.default.yml +125 -82
- package/ftm-config.yml +44 -2
- package/ftm-council/SKILL.md +416 -416
- package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
- package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
- package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
- package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
- package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
- package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
- package/ftm-council.yml +2 -2
- package/ftm-dashboard/SKILL.md +163 -163
- package/ftm-dashboard.yml +4 -4
- package/ftm-debug/SKILL.md +1037 -1037
- package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
- package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
- package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
- package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
- package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
- package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
- package/ftm-debug.yml +2 -2
- package/ftm-diagram/SKILL.md +277 -277
- package/ftm-diagram.yml +2 -2
- package/ftm-executor/SKILL.md +777 -777
- package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
- package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
- package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
- package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
- package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +72 -72
- package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
- package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
- package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
- package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -59
- package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
- package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
- package/ftm-executor/runtime/package.json +8 -8
- package/ftm-executor.yml +2 -2
- package/ftm-git/SKILL.md +441 -441
- package/ftm-git/evals/evals.json +26 -26
- package/ftm-git/evals/promptfoo.yaml +75 -75
- package/ftm-git/hooks/post-commit-experience.sh +92 -92
- package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
- package/ftm-git/references/protocols/REMEDIATION.md +139 -139
- package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
- package/ftm-git.yml +2 -2
- package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/adapters/_retry.py +64 -64
- package/ftm-inbox/backend/adapters/base.py +230 -230
- package/ftm-inbox/backend/adapters/freshservice.py +104 -104
- package/ftm-inbox/backend/adapters/gmail.py +125 -125
- package/ftm-inbox/backend/adapters/jira.py +136 -136
- package/ftm-inbox/backend/adapters/registry.py +192 -192
- package/ftm-inbox/backend/adapters/slack.py +110 -110
- package/ftm-inbox/backend/db/connection.py +54 -54
- package/ftm-inbox/backend/db/schema.py +78 -78
- package/ftm-inbox/backend/executor/__init__.py +7 -7
- package/ftm-inbox/backend/executor/engine.py +149 -149
- package/ftm-inbox/backend/executor/step_runner.py +98 -98
- package/ftm-inbox/backend/main.py +103 -103
- package/ftm-inbox/backend/models/__init__.py +1 -1
- package/ftm-inbox/backend/models/unified_task.py +36 -36
- package/ftm-inbox/backend/planner/__init__.py +6 -6
- package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/planner/generator.py +127 -127
- package/ftm-inbox/backend/planner/schema.py +34 -34
- package/ftm-inbox/backend/requirements.txt +5 -5
- package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/routes/execute.py +186 -186
- package/ftm-inbox/backend/routes/health.py +52 -52
- package/ftm-inbox/backend/routes/inbox.py +68 -68
- package/ftm-inbox/backend/routes/plan.py +271 -271
- package/ftm-inbox/bin/launchagent.mjs +91 -91
- package/ftm-inbox/bin/setup.mjs +188 -188
- package/ftm-inbox/bin/start.sh +10 -10
- package/ftm-inbox/bin/status.sh +17 -17
- package/ftm-inbox/bin/stop.sh +8 -8
- package/ftm-inbox/config.example.yml +55 -55
- package/ftm-inbox/package-lock.json +2898 -2898
- package/ftm-inbox/package.json +26 -26
- package/ftm-inbox/postcss.config.js +6 -6
- package/ftm-inbox/src/app.css +199 -199
- package/ftm-inbox/src/app.html +18 -18
- package/ftm-inbox/src/lib/api.ts +166 -166
- package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
- package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
- package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
- package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
- package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
- package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
- package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
- package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
- package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
- package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
- package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
- package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
- package/ftm-inbox/src/lib/theme.ts +47 -47
- package/ftm-inbox/src/routes/+layout.svelte +76 -76
- package/ftm-inbox/src/routes/+page.svelte +401 -401
- package/ftm-inbox/svelte.config.js +12 -12
- package/ftm-inbox/tailwind.config.ts +63 -63
- package/ftm-inbox/tsconfig.json +13 -13
- package/ftm-inbox/vite.config.ts +6 -6
- package/ftm-intent/SKILL.md +241 -241
- package/ftm-intent.yml +2 -2
- package/ftm-manifest.json +3794 -3794
- package/ftm-map/SKILL.md +291 -291
- package/ftm-map/scripts/db.py +712 -712
- package/ftm-map/scripts/index.py +415 -415
- package/ftm-map/scripts/parser.py +224 -224
- package/ftm-map/scripts/queries/go-tags.scm +20 -20
- package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
- package/ftm-map/scripts/queries/python-tags.scm +31 -31
- package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
- package/ftm-map/scripts/queries/rust-tags.scm +37 -37
- package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
- package/ftm-map/scripts/query.py +301 -301
- package/ftm-map/scripts/ranker.py +377 -377
- package/ftm-map/scripts/requirements.txt +5 -5
- package/ftm-map/scripts/setup-hooks.sh +27 -27
- package/ftm-map/scripts/setup.sh +56 -56
- package/ftm-map/scripts/test_db.py +364 -364
- package/ftm-map/scripts/test_parser.py +174 -174
- package/ftm-map/scripts/test_query.py +183 -183
- package/ftm-map/scripts/test_ranker.py +199 -199
- package/ftm-map/scripts/views.py +591 -591
- package/ftm-map.yml +2 -2
- package/ftm-mind/SKILL.md +201 -1943
- package/ftm-mind/evals/promptfoo.yaml +142 -142
- package/ftm-mind/references/blackboard-protocol.md +110 -0
- package/ftm-mind/references/blackboard-schema.md +328 -328
- package/ftm-mind/references/complexity-guide.md +110 -110
- package/ftm-mind/references/complexity-sizing.md +138 -0
- package/ftm-mind/references/decide-act-protocol.md +172 -0
- package/ftm-mind/references/direct-execution.md +51 -0
- package/ftm-mind/references/environment-discovery.md +77 -0
- package/ftm-mind/references/event-registry.md +319 -319
- package/ftm-mind/references/mcp-inventory.md +300 -296
- package/ftm-mind/references/ops-routing.md +47 -0
- package/ftm-mind/references/orient-protocol.md +234 -0
- package/ftm-mind/references/personality.md +40 -0
- package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
- package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
- package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
- package/ftm-mind/references/reflexion-protocol.md +249 -249
- package/ftm-mind/references/routing/SCENARIOS.md +22 -22
- package/ftm-mind/references/routing-scenarios.md +35 -35
- package/ftm-mind.yml +2 -2
- package/ftm-ops.yml +4 -0
- package/ftm-pause/SKILL.md +395 -395
- package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
- package/ftm-pause/references/protocols/VALIDATION.md +80 -80
- package/ftm-pause.yml +2 -2
- package/ftm-researcher/SKILL.md +275 -275
- package/ftm-researcher/evals/agent-diversity.yaml +17 -17
- package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
- package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
- package/ftm-researcher/references/adaptive-search.md +116 -116
- package/ftm-researcher/references/agent-prompts.md +193 -193
- package/ftm-researcher/references/council-integration.md +193 -193
- package/ftm-researcher/references/output-format.md +203 -203
- package/ftm-researcher/references/synthesis-pipeline.md +165 -165
- package/ftm-researcher/scripts/score_credibility.py +234 -234
- package/ftm-researcher/scripts/validate_research.py +92 -92
- package/ftm-researcher.yml +2 -2
- package/ftm-resume/SKILL.md +518 -518
- package/ftm-resume/references/protocols/VALIDATION.md +172 -172
- package/ftm-resume.yml +2 -2
- package/ftm-retro/SKILL.md +380 -380
- package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
- package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
- package/ftm-retro.yml +2 -2
- package/ftm-routine/SKILL.md +170 -170
- package/ftm-routine.yml +4 -4
- package/ftm-state/blackboard/capabilities.json +5 -5
- package/ftm-state/blackboard/capabilities.schema.json +27 -27
- package/ftm-state/blackboard/context.json +37 -23
- package/ftm-state/blackboard/experiences/doom-statusline-fix.json +26 -0
- package/ftm-state/blackboard/experiences/hackathon-pages-site.json +26 -0
- package/ftm-state/blackboard/experiences/hindsight-sso-kickoff.json +42 -0
- package/ftm-state/blackboard/experiences/index.json +58 -9
- package/ftm-state/blackboard/experiences/learning-ragnarok-api-access.json +23 -0
- package/ftm-state/blackboard/experiences/nordlayer-members-auto-assign.json +26 -0
- package/ftm-state/blackboard/experiences/saml2aws-stale-session-fix.json +41 -0
- package/ftm-state/blackboard/patterns.json +6 -6
- package/ftm-state/schemas/context.schema.json +130 -130
- package/ftm-state/schemas/experience-index.schema.json +77 -77
- package/ftm-state/schemas/experience.schema.json +78 -78
- package/ftm-state/schemas/patterns.schema.json +44 -44
- package/ftm-upgrade/SKILL.md +194 -194
- package/ftm-upgrade/scripts/check-version.sh +76 -76
- package/ftm-upgrade/scripts/upgrade.sh +143 -143
- package/ftm-upgrade.yml +2 -2
- package/ftm-verify.yml +2 -2
- package/ftm.yml +2 -2
- package/hooks/ftm-auto-log.sh +137 -0
- package/hooks/ftm-blackboard-enforcer.sh +93 -93
- package/hooks/ftm-discovery-reminder.sh +90 -90
- package/hooks/ftm-drafts-gate.sh +61 -61
- package/hooks/ftm-event-logger.mjs +107 -107
- package/hooks/ftm-install-hooks.sh +240 -0
- package/hooks/ftm-learning-capture.sh +117 -0
- package/hooks/ftm-map-autodetect.sh +79 -79
- package/hooks/ftm-pending-sync-check.sh +22 -22
- package/hooks/ftm-plan-gate.sh +92 -92
- package/hooks/ftm-post-commit-trigger.sh +57 -57
- package/hooks/ftm-post-compaction.sh +138 -0
- package/hooks/ftm-pre-compaction.sh +147 -0
- package/hooks/ftm-session-end.sh +52 -0
- package/hooks/ftm-session-snapshot.sh +213 -0
- package/hooks/settings-template.json +81 -81
- package/install.sh +363 -363
- package/package.json +84 -84
- package/uninstall.sh +25 -25
package/ftm-codex-gate/SKILL.md
CHANGED
|
@@ -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
|