feed-the-machine 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +170 -170
  3. package/bin/brain.py +1340 -0
  4. package/bin/convert_claude_skills_to_codex.py +490 -0
  5. package/bin/generate-manifest.mjs +463 -463
  6. package/bin/harden_codex_skills.py +141 -0
  7. package/bin/install.mjs +491 -491
  8. package/bin/migrate-eng-buddy-data.py +875 -0
  9. package/bin/playbook_engine/__init__.py +1 -0
  10. package/bin/playbook_engine/conftest.py +8 -0
  11. package/bin/playbook_engine/extractor.py +33 -0
  12. package/bin/playbook_engine/manager.py +102 -0
  13. package/bin/playbook_engine/models.py +84 -0
  14. package/bin/playbook_engine/registry.py +35 -0
  15. package/bin/playbook_engine/test_extractor.py +72 -0
  16. package/bin/playbook_engine/test_integration.py +129 -0
  17. package/bin/playbook_engine/test_manager.py +85 -0
  18. package/bin/playbook_engine/test_models.py +166 -0
  19. package/bin/playbook_engine/test_registry.py +67 -0
  20. package/bin/playbook_engine/test_tracer.py +86 -0
  21. package/bin/playbook_engine/tracer.py +93 -0
  22. package/bin/tasks_db.py +456 -0
  23. package/docs/HOOKS.md +243 -243
  24. package/docs/INBOX.md +233 -233
  25. package/ftm/SKILL.md +125 -122
  26. package/ftm-audit/SKILL.md +623 -623
  27. package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
  28. package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
  29. package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
  30. package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
  31. package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
  32. package/ftm-audit/scripts/run-knip.sh +23 -23
  33. package/ftm-audit.yml +2 -2
  34. package/ftm-brainstorm/SKILL.md +1003 -498
  35. package/ftm-brainstorm/evals/evals.json +180 -100
  36. package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
  37. package/ftm-brainstorm/references/agent-prompts.md +552 -224
  38. package/ftm-brainstorm/references/plan-template.md +209 -121
  39. package/ftm-brainstorm.yml +2 -2
  40. package/ftm-browse/SKILL.md +454 -454
  41. package/ftm-browse/daemon/browser-manager.ts +206 -206
  42. package/ftm-browse/daemon/bun.lock +30 -30
  43. package/ftm-browse/daemon/cli.ts +347 -347
  44. package/ftm-browse/daemon/commands.ts +410 -410
  45. package/ftm-browse/daemon/main.ts +357 -357
  46. package/ftm-browse/daemon/package.json +17 -17
  47. package/ftm-browse/daemon/server.ts +189 -189
  48. package/ftm-browse/daemon/snapshot.ts +519 -519
  49. package/ftm-browse/daemon/tsconfig.json +22 -22
  50. package/ftm-browse.yml +4 -4
  51. package/ftm-capture/SKILL.md +370 -370
  52. package/ftm-capture.yml +4 -4
  53. package/ftm-codex-gate/SKILL.md +361 -361
  54. package/ftm-codex-gate.yml +2 -2
  55. package/ftm-config/SKILL.md +422 -345
  56. package/ftm-config.default.yml +125 -82
  57. package/ftm-config.yml +44 -2
  58. package/ftm-council/SKILL.md +416 -416
  59. package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
  60. package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
  61. package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
  62. package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
  63. package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
  64. package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
  65. package/ftm-council.yml +2 -2
  66. package/ftm-dashboard/SKILL.md +163 -163
  67. package/ftm-dashboard.yml +4 -4
  68. package/ftm-debug/SKILL.md +1037 -1037
  69. package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
  70. package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
  71. package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
  72. package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
  73. package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
  74. package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
  75. package/ftm-debug.yml +2 -2
  76. package/ftm-diagram/SKILL.md +277 -277
  77. package/ftm-diagram.yml +2 -2
  78. package/ftm-executor/SKILL.md +777 -777
  79. package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
  80. package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
  81. package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
  82. package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
  83. package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +72 -72
  84. package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
  85. package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
  86. package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
  87. package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -59
  88. package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
  89. package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
  90. package/ftm-executor/runtime/package.json +8 -8
  91. package/ftm-executor.yml +2 -2
  92. package/ftm-git/SKILL.md +441 -441
  93. package/ftm-git/evals/evals.json +26 -26
  94. package/ftm-git/evals/promptfoo.yaml +75 -75
  95. package/ftm-git/hooks/post-commit-experience.sh +92 -92
  96. package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
  97. package/ftm-git/references/protocols/REMEDIATION.md +139 -139
  98. package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
  99. package/ftm-git.yml +2 -2
  100. package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
  101. package/ftm-inbox/backend/adapters/_retry.py +64 -64
  102. package/ftm-inbox/backend/adapters/base.py +230 -230
  103. package/ftm-inbox/backend/adapters/freshservice.py +104 -104
  104. package/ftm-inbox/backend/adapters/gmail.py +125 -125
  105. package/ftm-inbox/backend/adapters/jira.py +136 -136
  106. package/ftm-inbox/backend/adapters/registry.py +192 -192
  107. package/ftm-inbox/backend/adapters/slack.py +110 -110
  108. package/ftm-inbox/backend/db/connection.py +54 -54
  109. package/ftm-inbox/backend/db/schema.py +78 -78
  110. package/ftm-inbox/backend/executor/__init__.py +7 -7
  111. package/ftm-inbox/backend/executor/engine.py +149 -149
  112. package/ftm-inbox/backend/executor/step_runner.py +98 -98
  113. package/ftm-inbox/backend/main.py +103 -103
  114. package/ftm-inbox/backend/models/__init__.py +1 -1
  115. package/ftm-inbox/backend/models/unified_task.py +36 -36
  116. package/ftm-inbox/backend/planner/__init__.py +6 -6
  117. package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
  118. package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
  119. package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
  120. package/ftm-inbox/backend/planner/generator.py +127 -127
  121. package/ftm-inbox/backend/planner/schema.py +34 -34
  122. package/ftm-inbox/backend/requirements.txt +5 -5
  123. package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
  124. package/ftm-inbox/backend/routes/execute.py +186 -186
  125. package/ftm-inbox/backend/routes/health.py +52 -52
  126. package/ftm-inbox/backend/routes/inbox.py +68 -68
  127. package/ftm-inbox/backend/routes/plan.py +271 -271
  128. package/ftm-inbox/bin/launchagent.mjs +91 -91
  129. package/ftm-inbox/bin/setup.mjs +188 -188
  130. package/ftm-inbox/bin/start.sh +10 -10
  131. package/ftm-inbox/bin/status.sh +17 -17
  132. package/ftm-inbox/bin/stop.sh +8 -8
  133. package/ftm-inbox/config.example.yml +55 -55
  134. package/ftm-inbox/package-lock.json +2898 -2898
  135. package/ftm-inbox/package.json +26 -26
  136. package/ftm-inbox/postcss.config.js +6 -6
  137. package/ftm-inbox/src/app.css +199 -199
  138. package/ftm-inbox/src/app.html +18 -18
  139. package/ftm-inbox/src/lib/api.ts +166 -166
  140. package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
  141. package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
  142. package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
  143. package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
  144. package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
  145. package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
  146. package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
  147. package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
  148. package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
  149. package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
  150. package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
  151. package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
  152. package/ftm-inbox/src/lib/theme.ts +47 -47
  153. package/ftm-inbox/src/routes/+layout.svelte +76 -76
  154. package/ftm-inbox/src/routes/+page.svelte +401 -401
  155. package/ftm-inbox/svelte.config.js +12 -12
  156. package/ftm-inbox/tailwind.config.ts +63 -63
  157. package/ftm-inbox/tsconfig.json +13 -13
  158. package/ftm-inbox/vite.config.ts +6 -6
  159. package/ftm-intent/SKILL.md +241 -241
  160. package/ftm-intent.yml +2 -2
  161. package/ftm-manifest.json +3794 -3794
  162. package/ftm-map/SKILL.md +291 -291
  163. package/ftm-map/scripts/db.py +712 -712
  164. package/ftm-map/scripts/index.py +415 -415
  165. package/ftm-map/scripts/parser.py +224 -224
  166. package/ftm-map/scripts/queries/go-tags.scm +20 -20
  167. package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
  168. package/ftm-map/scripts/queries/python-tags.scm +31 -31
  169. package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
  170. package/ftm-map/scripts/queries/rust-tags.scm +37 -37
  171. package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
  172. package/ftm-map/scripts/query.py +301 -301
  173. package/ftm-map/scripts/ranker.py +377 -377
  174. package/ftm-map/scripts/requirements.txt +5 -5
  175. package/ftm-map/scripts/setup-hooks.sh +27 -27
  176. package/ftm-map/scripts/setup.sh +56 -56
  177. package/ftm-map/scripts/test_db.py +364 -364
  178. package/ftm-map/scripts/test_parser.py +174 -174
  179. package/ftm-map/scripts/test_query.py +183 -183
  180. package/ftm-map/scripts/test_ranker.py +199 -199
  181. package/ftm-map/scripts/views.py +591 -591
  182. package/ftm-map.yml +2 -2
  183. package/ftm-mind/SKILL.md +201 -1943
  184. package/ftm-mind/evals/promptfoo.yaml +142 -142
  185. package/ftm-mind/references/blackboard-protocol.md +110 -0
  186. package/ftm-mind/references/blackboard-schema.md +328 -328
  187. package/ftm-mind/references/complexity-guide.md +110 -110
  188. package/ftm-mind/references/complexity-sizing.md +138 -0
  189. package/ftm-mind/references/decide-act-protocol.md +172 -0
  190. package/ftm-mind/references/direct-execution.md +51 -0
  191. package/ftm-mind/references/environment-discovery.md +77 -0
  192. package/ftm-mind/references/event-registry.md +319 -319
  193. package/ftm-mind/references/mcp-inventory.md +300 -296
  194. package/ftm-mind/references/ops-routing.md +47 -0
  195. package/ftm-mind/references/orient-protocol.md +234 -0
  196. package/ftm-mind/references/personality.md +40 -0
  197. package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
  198. package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
  199. package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
  200. package/ftm-mind/references/reflexion-protocol.md +249 -249
  201. package/ftm-mind/references/routing/SCENARIOS.md +22 -22
  202. package/ftm-mind/references/routing-scenarios.md +35 -35
  203. package/ftm-mind.yml +2 -2
  204. package/ftm-ops.yml +4 -0
  205. package/ftm-pause/SKILL.md +395 -395
  206. package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
  207. package/ftm-pause/references/protocols/VALIDATION.md +80 -80
  208. package/ftm-pause.yml +2 -2
  209. package/ftm-researcher/SKILL.md +275 -275
  210. package/ftm-researcher/evals/agent-diversity.yaml +17 -17
  211. package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
  212. package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
  213. package/ftm-researcher/references/adaptive-search.md +116 -116
  214. package/ftm-researcher/references/agent-prompts.md +193 -193
  215. package/ftm-researcher/references/council-integration.md +193 -193
  216. package/ftm-researcher/references/output-format.md +203 -203
  217. package/ftm-researcher/references/synthesis-pipeline.md +165 -165
  218. package/ftm-researcher/scripts/score_credibility.py +234 -234
  219. package/ftm-researcher/scripts/validate_research.py +92 -92
  220. package/ftm-researcher.yml +2 -2
  221. package/ftm-resume/SKILL.md +518 -518
  222. package/ftm-resume/references/protocols/VALIDATION.md +172 -172
  223. package/ftm-resume.yml +2 -2
  224. package/ftm-retro/SKILL.md +380 -380
  225. package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
  226. package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
  227. package/ftm-retro.yml +2 -2
  228. package/ftm-routine/SKILL.md +170 -170
  229. package/ftm-routine.yml +4 -4
  230. package/ftm-state/blackboard/capabilities.json +5 -5
  231. package/ftm-state/blackboard/capabilities.schema.json +27 -27
  232. package/ftm-state/blackboard/context.json +37 -23
  233. package/ftm-state/blackboard/experiences/doom-statusline-fix.json +26 -0
  234. package/ftm-state/blackboard/experiences/hackathon-pages-site.json +26 -0
  235. package/ftm-state/blackboard/experiences/hindsight-sso-kickoff.json +42 -0
  236. package/ftm-state/blackboard/experiences/index.json +58 -9
  237. package/ftm-state/blackboard/experiences/learning-ragnarok-api-access.json +23 -0
  238. package/ftm-state/blackboard/experiences/nordlayer-members-auto-assign.json +26 -0
  239. package/ftm-state/blackboard/experiences/saml2aws-stale-session-fix.json +41 -0
  240. package/ftm-state/blackboard/patterns.json +6 -6
  241. package/ftm-state/schemas/context.schema.json +130 -130
  242. package/ftm-state/schemas/experience-index.schema.json +77 -77
  243. package/ftm-state/schemas/experience.schema.json +78 -78
  244. package/ftm-state/schemas/patterns.schema.json +44 -44
  245. package/ftm-upgrade/SKILL.md +194 -194
  246. package/ftm-upgrade/scripts/check-version.sh +76 -76
  247. package/ftm-upgrade/scripts/upgrade.sh +143 -143
  248. package/ftm-upgrade.yml +2 -2
  249. package/ftm-verify.yml +2 -2
  250. package/ftm.yml +2 -2
  251. package/hooks/ftm-auto-log.sh +137 -0
  252. package/hooks/ftm-blackboard-enforcer.sh +93 -93
  253. package/hooks/ftm-discovery-reminder.sh +90 -90
  254. package/hooks/ftm-drafts-gate.sh +61 -61
  255. package/hooks/ftm-event-logger.mjs +107 -107
  256. package/hooks/ftm-install-hooks.sh +240 -0
  257. package/hooks/ftm-learning-capture.sh +117 -0
  258. package/hooks/ftm-map-autodetect.sh +79 -79
  259. package/hooks/ftm-pending-sync-check.sh +22 -22
  260. package/hooks/ftm-plan-gate.sh +92 -92
  261. package/hooks/ftm-post-commit-trigger.sh +57 -57
  262. package/hooks/ftm-post-compaction.sh +138 -0
  263. package/hooks/ftm-pre-compaction.sh +147 -0
  264. package/hooks/ftm-session-end.sh +52 -0
  265. package/hooks/ftm-session-snapshot.sh +213 -0
  266. package/hooks/settings-template.json +81 -81
  267. package/install.sh +363 -363
  268. package/package.json +84 -84
  269. package/uninstall.sh +25 -25
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env python3
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+
7
+
8
+ ROOT = Path(__file__).resolve().parents[1] / "codex-skills"
9
+
10
+ COMMON_BASELINE = """## Codex Native Baseline
11
+
12
+ These copies target Codex, not Claude. If any later section uses legacy wording, follow these Codex-native rules first:
13
+
14
+ - Ask user questions directly in chat while running in Default mode. Only use `request_user_input` if the session is actually in Plan mode.
15
+ - Prefer local tool work and `multi_tool_use.parallel` for parallelism. Use `spawn_agent` only when the user explicitly asks for sub-agents, delegation, or parallel agent work.
16
+ - Open `references/*.md` files when needed; they are not auto-loaded automatically.
17
+ - Do not rely on `TaskCreate`, `TaskList`, Claude command files, or `claude -p`.
18
+ - Treat any remaining external-model or external-CLI workflow as legacy reference unless this skill includes a Codex-native override below.
19
+ """
20
+
21
+ SPECIAL_OVERRIDES = {
22
+ "ftm-brainstorm": """## Codex Native Overrides
23
+
24
+ - Always read `references/agent-prompts.md` before a research sprint. Treat it as the template library for research lanes.
25
+ - Default research execution is three local lanes run in parallel: repo/codebase inspection, web/docs research, and GitHub/example hunting.
26
+ - Only use `spawn_agent` for brainstorming or research when the user explicitly asks for sub-agents or parallel agent work.
27
+ - Replace every legacy `AskUserQuestion` step with one concise blocking question in chat. In Plan mode, `request_user_input` is acceptable, but Default mode should stay in normal chat.
28
+ - After each sprint: synthesize, add 2-3 challenge observations, ask one blocking question, then stop and wait for the user.
29
+ """,
30
+ "ftm-researcher": """## Codex Native Overrides
31
+
32
+ - Treat the seven finder roles as research lenses, not mandatory sub-agents. Cover them with local parallel tool work unless the user explicitly authorizes sub-agents.
33
+ - In quick mode, use three local lanes. In standard mode, widen the evidence sources and reconciliation depth. In deep mode, add a second refinement pass and stronger adversarial review.
34
+ - `ftm-council` is optional second-pass review, not a required external multi-CLI dependency.
35
+ - After each research pass, return a clear synthesis with sources and then wait for the user's next instruction.
36
+ """,
37
+ "ftm-council": """## Codex Native Overrides
38
+
39
+ - This copy does not shell out to Claude or Gemini CLIs. In Codex-native mode, the council is simulated as three independent reasoning lanes: implementation, risk, and operations/product impact.
40
+ - Gather those lanes with local parallel tools by default. Only use `spawn_agent` if the user explicitly asks for sub-agents or parallel agent work.
41
+ - Treat any remaining external CLI protocol below as legacy reference. The Codex-native behavior is to collect independent evidence, compare positions, and synthesize a majority-style recommendation inside Codex.
42
+ """,
43
+ "eng-buddy": """## Codex Native Overrides
44
+
45
+ - Do not rely on transient in-session task UIs like `TaskCreate` or `TaskList`. Persist tasks in `tasks.db`, load them with `brain.py`, and show numbered task summaries directly in the response.
46
+ - If a legacy section mentions recreating tasks in a UI task list, replace that with a concise markdown or prose task snapshot for the user.
47
+ - Codex should still use the workspace files, dashboard, hooks, and pollers described below when they exist.
48
+ """,
49
+ "my-insights": """## Codex Native Overrides
50
+
51
+ - The aggregate/report workflow is the native path. If the bundled facet-generation helpers still depend on a legacy CLI adapter, continue with cached facets or aggregate-only reporting instead of blocking the whole skill.
52
+ - Keep the skill useful even without LLM facet generation: parse the date range, read sessions, aggregate them, render the report, and tell the user what enrichment was skipped.
53
+ """,
54
+ "skill-creator": """## Codex Native Overrides
55
+
56
+ - Prefer manual Codex-native review loops over any legacy `claude -p` helper scripts.
57
+ - When evaluating a skill, inspect the copied skill directly, test it with realistic prompts in normal Codex conversations, and compare outputs or diffs rather than relying on Claude command-file injection.
58
+ - Treat the bundled legacy eval scripts as reference material unless they have been explicitly updated for Codex.
59
+ """,
60
+ }
61
+
62
+ REPLACEMENTS = {
63
+ "codex-skills/ftm-brainstorm/SKILL.md": [
64
+ ("4. ASK VIA UI — use AskUserQuestion tool (1-4 questions, clickable options)", "4. ASK ONE QUESTION — ask one concise blocking question in chat (or `request_user_input` only in Plan mode)"),
65
+ ("**Use `AskUserQuestion` for all questions.** This gives the user a clickable selection UI instead of making them type answers. Format every question with 2-4 labeled options, each with a short description of the trade-off. The user clicks their choice (or picks \"Other\" to type a custom answer). This is faster, less friction, and prevents answers from getting lost.", "**Use the Codex-native question flow for all questions.** In Default mode, ask a concise blocking question directly in chat with 2-4 inline options. In Plan mode, you may use `request_user_input` for the same structure."),
66
+ ("**Batching rules:** `AskUserQuestion` supports 1-4 questions per call. Use this intelligently:", "**Batching rules:** in Codex, only batch questions when you are in Plan mode and `request_user_input` is available. In Default mode, ask one blocking question at a time."),
67
+ ("Spawn an **Explore** agent (subagent_type: Explore):", "Run a repo scan first. Prefer local parallel reads; if and only if the user explicitly asked for sub-agents, you may spawn an `explorer` agent:"),
68
+ ("Every turn, read `references/agent-prompts.md` and spawn **3 parallel agents** (subagent_type: general-purpose, model: from ftm-config `planning` profile). Each agent gets:", "Every turn, read `references/agent-prompts.md` and run **3 parallel research lanes**. Use `multi_tool_use.parallel` plus local tools by default; only use `spawn_agent` if the user explicitly asked for sub-agents. Each lane gets:"),
69
+ ("## Step 4: Ask Questions via AskUserQuestion", "## Step 4: Ask One Blocking Question"),
70
+ ("Use the `AskUserQuestion` tool for every question. Never just type a question in chat — always use the tool so the user gets the clickable selection UI.", "In Codex Default mode, ask the next blocking question directly in chat. If the session is in Plan mode, `request_user_input` is the preferred structured UI."),
71
+ ("**Batch independent questions (up to 4 per call).** Review your queue — if the top 2-3 questions don't depend on each other's answers, send them in a single `AskUserQuestion` call. The user clicks through them quickly in the UI. If answers ARE dependent, send only the blocking question and save the rest.", "**Batch independent questions only in Plan mode.** In Default mode, send only the single blocking question and keep the rest in your internal queue."),
72
+ ("**Example AskUserQuestion call:**", "**Example blocking question format:**"),
73
+ ],
74
+ "codex-skills/ftm-researcher/SKILL.md": [
75
+ ("Silent background Explore agent scans the local codebase (same as ftm-brainstorm).", "Run a silent repo scan with local tools first. If the user explicitly asked for sub-agents, an `explorer` agent may assist."),
76
+ ("Dispatch 7 finders in parallel, each with:", "Cover up to 7 finder lenses in parallel. Prefer local tool parallelism; only dispatch sub-agents when explicitly authorized by the user. Each research lane should have:"),
77
+ ("- \"dig deeper on finding #N\" / \"more on #N\" → spawn 3 targeted agents on that specific finding's topic", "- \"dig deeper on finding #N\" / \"more on #N\" → run a targeted follow-up research pass on that finding; use sub-agents only if explicitly authorized"),
78
+ ("- \"I disagree with X\" / \"I think X is wrong because Y\" → spawn counter-evidence agents, update findings", "- \"I disagree with X\" / \"I think X is wrong because Y\" → run a counter-evidence pass and update findings"),
79
+ ("- \"focus on [angle]\" / \"what about the security angle\" → reshape subtopics with new weighting, re-dispatch", "- \"focus on [angle]\" / \"what about the security angle\" → reshape subtopics with new weighting and rerun the research lanes"),
80
+ ("- \"more on [agent]'s findings\" → re-dispatch that agent with broader query", "- \"more on [lane]'s findings\" → rerun that research lane with a broader query"),
81
+ ("- \"compare A vs B\" → spawn comparison agent with both findings as context", "- \"compare A vs B\" → run a comparison pass with both findings as context"),
82
+ ("Deep mode only. Routes top claims through ftm-council (Claude + Codex + Gemini independent review).", "Deep mode only. Routes top claims through `ftm-council` for Codex-native multi-lens adversarial review."),
83
+ ],
84
+ "codex-skills/ftm-council/SKILL.md": [
85
+ ("Three AI peers — Claude, Codex, and Gemini — independently research the codebase and deliberate on a problem through structured rounds of debate.", "Three independent reasoning lanes — implementation, risk, and operations/product impact — independently inspect the problem and deliberate through structured rounds of comparison."),
86
+ ("The user needs both CLI tools installed and authenticated:", "Codex-native mode does not require external model CLIs."),
87
+ ("- **Codex**: `npm install -g @openai/codex` (authenticated via `codex login`)\n- **Gemini**: `npm install -g @google/gemini-cli` (authenticated via Google)\n\nBefore the first round, verify both are available:\n```bash\nwhich codex && which gemini\n```\nIf either is missing, tell the user what to install and stop — don't try to run a 2-model council.", "Use local tools and Codex reasoning lanes by default. External CLIs, if they appear later in this file, are legacy reference only."),
88
+ ("Show the user the framed prompt before proceeding: \"Here's what I'll send to the council — does this capture the problem?\" Wait for confirmation or edits.", "Show the user the framed prompt before proceeding and wait for confirmation or edits."),
89
+ ("Launch all three in parallel:", "Run the three council lanes in parallel. Prefer local tool work; only use `spawn_agent` if the user explicitly asked for sub-agents or parallel agent work."),
90
+ ],
91
+ "codex-skills/eng-buddy/SKILL.md": [
92
+ ("- For each pending/in_progress task: TaskCreate with task details (use legacy_number from metadata if available for #N prefix)", "- For each pending or in-progress task: load it from `tasks.db` and surface it in a numbered task summary in your response"),
93
+ ("1. **Check and restore task list** (CRITICAL - tasks don't persist across conversations):", "1. **Check and restore task state** (CRITICAL - rely on `tasks.db`, not transient UI task lists):"),
94
+ (" - Run `TaskList` to check current state\n - IF TaskList is empty:\n - Run `python3 ~/.codex/skills/eng-buddy/bin/brain.py --tasks --task-json`\n - Parse JSON output — each task has id, title, status, priority, jira_key, metadata (with legacy_number)\n - Recreate ALL pending/in_progress tasks using TaskCreate with `#N -` prefix (use legacy_number from metadata for N, or DB id if no legacy_number)\n - Inform user: \"Loaded X tasks from tasks.db\"\n - FALLBACK: If brain.py fails, fall back to sync-task-lists.py + active-tasks.md\n - IF TaskList has tasks:\n - Continue normally (tasks already loaded)", " - Run `python3 ~/.codex/skills/eng-buddy/bin/brain.py --tasks --task-json`\n - Parse JSON output — each task has id, title, status, priority, jira_key, metadata (with legacy_number)\n - Present the active tasks back to the user as a numbered summary using the `#N -` prefix\n - Inform user: \"Loaded X tasks from tasks.db\"\n - FALLBACK: If brain.py fails, fall back to sync-task-lists.py + active-tasks.md"),
95
+ ("**Problem**: TaskList does NOT persist across conversations. All tasks are lost when starting a new conversation.", "**Problem**: transient in-session task UIs do not persist across conversations."),
96
+ ("**On EVERY task change** (TaskCreate, TaskUpdate, task completion):\n1. Make the in-session task system change (TaskCreate/TaskUpdate)\n2. IMMEDIATELY update tasks.db via brain.py CLI:", "**On EVERY task change**:\n1. Update `tasks.db` immediately via `brain.py` CLI:"),
97
+ ("**Recovery on new conversation**:\n- TaskList will be empty\n- Run `brain.py --tasks --task-json` to get all active tasks from DB\n- Recreate using TaskCreate with `#N -` prefix (use legacy_number from metadata)\n- Inform user: \"Loaded X tasks from tasks.db\"", "**Recovery on new conversation**:\n- Run `brain.py --tasks --task-json` to get all active tasks from DB\n- Present a numbered task snapshot using the `#N -` prefix\n- Inform user: \"Loaded X tasks from tasks.db\""),
98
+ ("**When creating new tasks** (TaskCreate):", "**When creating new tasks**:"),
99
+ ("**Example TaskCreate calls**:", "**Example task snapshot format**:"),
100
+ ],
101
+ "codex-skills/my-insights/SKILL.md": [
102
+ ("This is the longest step. For each session without a cached facet, call the Claude API.", "This is the longest step. For each session without a cached facet, run the bundled facet generator if it works in your local Codex setup; otherwise skip enrichment and continue with the cached or aggregate-only path."),
103
+ ("- The facet generator uses the Claude API (ANTHROPIC_API_KEY must be set)", "- The facet generator may still require a local LLM adapter. If it is not configured, skip facet enrichment and continue with aggregate-only reporting."),
104
+ ],
105
+ "codex-skills/skill-creator/SKILL.md": [
106
+ ("Claude sees when deciding whether to use the skill", "Codex sees when deciding whether to use the skill"),
107
+ ("Claude has a tendency to \"undertrigger\" skills", "Codex may still under-trigger skills"),
108
+ ("This section requires the `claude` CLI tool (specifically `claude -p`) which is only available in Codex. Skip it if you're on Claude.ai.", "This section references a legacy CLI-based description optimizer. In Codex-native mode, prefer manual description iteration unless you have updated the helper scripts for Codex."),
109
+ ("Description optimization (`run_loop.py` / `run_eval.py`) should work in Cowork just fine since it uses `claude -p` via subprocess, not a browser, but please save it until you've fully finished making the skill and the user agrees it's in good shape.", "Description optimization helper scripts are legacy reference unless you have explicitly updated them for Codex. Prefer manual review first, then optional script work if you have a Codex-compatible adapter."),
110
+ ],
111
+ }
112
+
113
+
114
+ def insert_baseline(text: str, skill_name: str) -> str:
115
+ if "## Codex Native Baseline" in text:
116
+ return text
117
+ marker = "\n\n"
118
+ if text.startswith("---\n"):
119
+ end = text.find("\n---\n", 4)
120
+ if end != -1:
121
+ insert_at = end + len("\n---\n")
122
+ extra = "\n" + COMMON_BASELINE + "\n"
123
+ if skill_name in SPECIAL_OVERRIDES:
124
+ extra += SPECIAL_OVERRIDES[skill_name] + "\n"
125
+ return text[:insert_at] + extra + text[insert_at:]
126
+ return COMMON_BASELINE + "\n" + text
127
+
128
+
129
+ def main() -> None:
130
+ for skill_md in sorted(ROOT.glob("*/SKILL.md")):
131
+ skill_name = skill_md.parent.name
132
+ text = skill_md.read_text(encoding="utf-8")
133
+ text = insert_baseline(text, skill_name)
134
+ key = str(skill_md.relative_to(ROOT.parent))
135
+ for old, new in REPLACEMENTS.get(key, []):
136
+ text = text.replace(old, new)
137
+ skill_md.write_text(text, encoding="utf-8")
138
+
139
+
140
+ if __name__ == "__main__":
141
+ main()