feed-the-machine 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +262 -170
  3. package/bin/__pycache__/tasks_db.cpython-314.pyc +0 -0
  4. package/bin/brain.py +1340 -0
  5. package/bin/convert_claude_skills_to_codex.py +490 -0
  6. package/bin/generate-manifest.mjs +463 -463
  7. package/bin/harden_codex_skills.py +141 -0
  8. package/bin/install.mjs +491 -491
  9. package/bin/migrate-eng-buddy-data.py +875 -0
  10. package/bin/playbook_engine/__init__.py +1 -0
  11. package/bin/playbook_engine/conftest.py +8 -0
  12. package/bin/playbook_engine/extractor.py +33 -0
  13. package/bin/playbook_engine/manager.py +102 -0
  14. package/bin/playbook_engine/models.py +84 -0
  15. package/bin/playbook_engine/registry.py +35 -0
  16. package/bin/playbook_engine/test_extractor.py +72 -0
  17. package/bin/playbook_engine/test_integration.py +129 -0
  18. package/bin/playbook_engine/test_manager.py +85 -0
  19. package/bin/playbook_engine/test_models.py +166 -0
  20. package/bin/playbook_engine/test_registry.py +67 -0
  21. package/bin/playbook_engine/test_tracer.py +86 -0
  22. package/bin/playbook_engine/tracer.py +93 -0
  23. package/bin/tasks_db.py +456 -0
  24. package/docs/HOOKS.md +243 -243
  25. package/docs/INBOX.md +233 -233
  26. package/ftm/SKILL.md +125 -122
  27. package/ftm-audit/SKILL.md +673 -623
  28. package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
  29. package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
  30. package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
  31. package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
  32. package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
  33. package/ftm-audit/scripts/run-knip.sh +23 -23
  34. package/ftm-audit.yml +2 -2
  35. package/ftm-brainstorm/SKILL.md +1003 -498
  36. package/ftm-brainstorm/evals/evals.json +180 -100
  37. package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
  38. package/ftm-brainstorm/references/agent-prompts.md +552 -224
  39. package/ftm-brainstorm/references/plan-template.md +209 -121
  40. package/ftm-brainstorm.yml +2 -2
  41. package/ftm-browse/SKILL.md +454 -454
  42. package/ftm-browse/daemon/browser-manager.ts +206 -206
  43. package/ftm-browse/daemon/bun.lock +30 -30
  44. package/ftm-browse/daemon/cli.ts +347 -347
  45. package/ftm-browse/daemon/commands.ts +410 -410
  46. package/ftm-browse/daemon/main.ts +357 -357
  47. package/ftm-browse/daemon/package.json +17 -17
  48. package/ftm-browse/daemon/server.ts +189 -189
  49. package/ftm-browse/daemon/snapshot.ts +519 -519
  50. package/ftm-browse/daemon/tsconfig.json +22 -22
  51. package/ftm-browse.yml +4 -4
  52. package/ftm-capture/SKILL.md +370 -370
  53. package/ftm-capture.yml +4 -4
  54. package/ftm-codex-gate/SKILL.md +361 -361
  55. package/ftm-codex-gate.yml +2 -2
  56. package/ftm-config/SKILL.md +422 -345
  57. package/ftm-config.default.yml +125 -82
  58. package/ftm-config.yml +44 -2
  59. package/ftm-council/SKILL.md +416 -416
  60. package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
  61. package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
  62. package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
  63. package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
  64. package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
  65. package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
  66. package/ftm-council-chat.yml +2 -0
  67. package/ftm-council.yml +2 -2
  68. package/ftm-dashboard/SKILL.md +163 -163
  69. package/ftm-dashboard.yml +4 -4
  70. package/ftm-debug/SKILL.md +1037 -1037
  71. package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
  72. package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
  73. package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
  74. package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
  75. package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
  76. package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
  77. package/ftm-debug.yml +2 -2
  78. package/ftm-diagram/SKILL.md +277 -277
  79. package/ftm-diagram.yml +2 -2
  80. package/ftm-executor/SKILL.md +777 -777
  81. package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
  82. package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
  83. package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
  84. package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
  85. package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +81 -72
  86. package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
  87. package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
  88. package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
  89. package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -59
  90. package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
  91. package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
  92. package/ftm-executor/runtime/package.json +8 -8
  93. package/ftm-executor.yml +2 -2
  94. package/ftm-git/SKILL.md +441 -441
  95. package/ftm-git/evals/evals.json +26 -26
  96. package/ftm-git/evals/promptfoo.yaml +75 -75
  97. package/ftm-git/hooks/post-commit-experience.sh +92 -92
  98. package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
  99. package/ftm-git/references/protocols/REMEDIATION.md +139 -139
  100. package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
  101. package/ftm-git.yml +2 -2
  102. package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
  103. package/ftm-inbox/backend/adapters/_retry.py +64 -64
  104. package/ftm-inbox/backend/adapters/base.py +230 -230
  105. package/ftm-inbox/backend/adapters/freshservice.py +104 -104
  106. package/ftm-inbox/backend/adapters/gmail.py +125 -125
  107. package/ftm-inbox/backend/adapters/jira.py +136 -136
  108. package/ftm-inbox/backend/adapters/registry.py +192 -192
  109. package/ftm-inbox/backend/adapters/slack.py +110 -110
  110. package/ftm-inbox/backend/db/connection.py +54 -54
  111. package/ftm-inbox/backend/db/schema.py +78 -78
  112. package/ftm-inbox/backend/executor/__init__.py +7 -7
  113. package/ftm-inbox/backend/executor/engine.py +149 -149
  114. package/ftm-inbox/backend/executor/step_runner.py +98 -98
  115. package/ftm-inbox/backend/main.py +103 -103
  116. package/ftm-inbox/backend/models/__init__.py +1 -1
  117. package/ftm-inbox/backend/models/unified_task.py +36 -36
  118. package/ftm-inbox/backend/planner/__init__.py +6 -6
  119. package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
  120. package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
  121. package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
  122. package/ftm-inbox/backend/planner/generator.py +127 -127
  123. package/ftm-inbox/backend/planner/schema.py +34 -34
  124. package/ftm-inbox/backend/requirements.txt +5 -5
  125. package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
  126. package/ftm-inbox/backend/routes/execute.py +186 -186
  127. package/ftm-inbox/backend/routes/health.py +52 -52
  128. package/ftm-inbox/backend/routes/inbox.py +68 -68
  129. package/ftm-inbox/backend/routes/plan.py +271 -271
  130. package/ftm-inbox/bin/launchagent.mjs +91 -91
  131. package/ftm-inbox/bin/setup.mjs +188 -188
  132. package/ftm-inbox/bin/start.sh +10 -10
  133. package/ftm-inbox/bin/status.sh +17 -17
  134. package/ftm-inbox/bin/stop.sh +8 -8
  135. package/ftm-inbox/config.example.yml +55 -55
  136. package/ftm-inbox/package-lock.json +2898 -2898
  137. package/ftm-inbox/package.json +26 -26
  138. package/ftm-inbox/postcss.config.js +6 -6
  139. package/ftm-inbox/src/app.css +199 -199
  140. package/ftm-inbox/src/app.html +18 -18
  141. package/ftm-inbox/src/lib/api.ts +166 -166
  142. package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
  143. package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
  144. package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
  145. package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
  146. package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
  147. package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
  148. package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
  149. package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
  150. package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
  151. package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
  152. package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
  153. package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
  154. package/ftm-inbox/src/lib/theme.ts +47 -47
  155. package/ftm-inbox/src/routes/+layout.svelte +76 -76
  156. package/ftm-inbox/src/routes/+page.svelte +401 -401
  157. package/ftm-inbox/svelte.config.js +12 -12
  158. package/ftm-inbox/tailwind.config.ts +63 -63
  159. package/ftm-inbox/tsconfig.json +13 -13
  160. package/ftm-inbox/vite.config.ts +6 -6
  161. package/ftm-intent/SKILL.md +241 -241
  162. package/ftm-intent.yml +2 -2
  163. package/ftm-manifest.json +3794 -3794
  164. package/ftm-map/SKILL.md +291 -291
  165. package/ftm-map/scripts/db.py +712 -712
  166. package/ftm-map/scripts/index.py +415 -415
  167. package/ftm-map/scripts/parser.py +224 -224
  168. package/ftm-map/scripts/queries/go-tags.scm +20 -20
  169. package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
  170. package/ftm-map/scripts/queries/python-tags.scm +31 -31
  171. package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
  172. package/ftm-map/scripts/queries/rust-tags.scm +37 -37
  173. package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
  174. package/ftm-map/scripts/query.py +301 -301
  175. package/ftm-map/scripts/ranker.py +377 -377
  176. package/ftm-map/scripts/requirements.txt +5 -5
  177. package/ftm-map/scripts/setup-hooks.sh +27 -27
  178. package/ftm-map/scripts/setup.sh +56 -56
  179. package/ftm-map/scripts/test_db.py +364 -364
  180. package/ftm-map/scripts/test_parser.py +174 -174
  181. package/ftm-map/scripts/test_query.py +183 -183
  182. package/ftm-map/scripts/test_ranker.py +199 -199
  183. package/ftm-map/scripts/views.py +591 -591
  184. package/ftm-map.yml +2 -2
  185. package/ftm-mind/SKILL.md +201 -1943
  186. package/ftm-mind/evals/promptfoo.yaml +142 -142
  187. package/ftm-mind/references/blackboard-protocol.md +110 -0
  188. package/ftm-mind/references/blackboard-schema.md +328 -328
  189. package/ftm-mind/references/complexity-guide.md +110 -110
  190. package/ftm-mind/references/complexity-sizing.md +138 -0
  191. package/ftm-mind/references/decide-act-protocol.md +172 -0
  192. package/ftm-mind/references/direct-execution.md +51 -0
  193. package/ftm-mind/references/environment-discovery.md +77 -0
  194. package/ftm-mind/references/event-registry.md +319 -319
  195. package/ftm-mind/references/mcp-inventory.md +300 -296
  196. package/ftm-mind/references/ops-routing.md +47 -0
  197. package/ftm-mind/references/orient-protocol.md +234 -0
  198. package/ftm-mind/references/personality.md +40 -0
  199. package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
  200. package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
  201. package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
  202. package/ftm-mind/references/reflexion-protocol.md +249 -249
  203. package/ftm-mind/references/routing/SCENARIOS.md +22 -22
  204. package/ftm-mind/references/routing-scenarios.md +35 -35
  205. package/ftm-mind.yml +2 -2
  206. package/ftm-ops.yml +4 -0
  207. package/ftm-pause/SKILL.md +395 -395
  208. package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
  209. package/ftm-pause/references/protocols/VALIDATION.md +80 -80
  210. package/ftm-pause.yml +2 -2
  211. package/ftm-researcher/SKILL.md +275 -275
  212. package/ftm-researcher/evals/agent-diversity.yaml +17 -17
  213. package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
  214. package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
  215. package/ftm-researcher/references/adaptive-search.md +116 -116
  216. package/ftm-researcher/references/agent-prompts.md +193 -193
  217. package/ftm-researcher/references/council-integration.md +193 -193
  218. package/ftm-researcher/references/output-format.md +203 -203
  219. package/ftm-researcher/references/synthesis-pipeline.md +165 -165
  220. package/ftm-researcher/scripts/score_credibility.py +234 -234
  221. package/ftm-researcher/scripts/validate_research.py +92 -92
  222. package/ftm-researcher.yml +2 -2
  223. package/ftm-resume/SKILL.md +518 -518
  224. package/ftm-resume/references/protocols/VALIDATION.md +172 -172
  225. package/ftm-resume.yml +2 -2
  226. package/ftm-retro/SKILL.md +380 -380
  227. package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
  228. package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
  229. package/ftm-retro.yml +2 -2
  230. package/ftm-routine/SKILL.md +170 -170
  231. package/ftm-routine.yml +4 -4
  232. package/ftm-state/blackboard/capabilities.json +5 -5
  233. package/ftm-state/blackboard/capabilities.schema.json +27 -27
  234. package/ftm-state/blackboard/context.json +37 -23
  235. package/ftm-state/blackboard/experiences/doom-statusline-fix.json +26 -0
  236. package/ftm-state/blackboard/experiences/hackathon-pages-site.json +26 -0
  237. package/ftm-state/blackboard/experiences/hindsight-sso-kickoff.json +42 -0
  238. package/ftm-state/blackboard/experiences/index.json +58 -9
  239. package/ftm-state/blackboard/experiences/learning-ragnarok-api-access.json +23 -0
  240. package/ftm-state/blackboard/experiences/nordlayer-members-auto-assign.json +26 -0
  241. package/ftm-state/blackboard/experiences/saml2aws-stale-session-fix.json +41 -0
  242. package/ftm-state/blackboard/patterns.json +6 -6
  243. package/ftm-state/schemas/context.schema.json +130 -130
  244. package/ftm-state/schemas/experience-index.schema.json +77 -77
  245. package/ftm-state/schemas/experience.schema.json +78 -78
  246. package/ftm-state/schemas/patterns.schema.json +44 -44
  247. package/ftm-upgrade/SKILL.md +194 -194
  248. package/ftm-upgrade/scripts/check-version.sh +76 -76
  249. package/ftm-upgrade/scripts/upgrade.sh +143 -143
  250. package/ftm-upgrade.yml +2 -2
  251. package/ftm-verify.yml +2 -2
  252. package/ftm.yml +2 -2
  253. package/hooks/ftm-auto-log.sh +137 -0
  254. package/hooks/ftm-blackboard-enforcer.sh +93 -93
  255. package/hooks/ftm-discovery-reminder.sh +90 -90
  256. package/hooks/ftm-drafts-gate.sh +61 -61
  257. package/hooks/ftm-event-logger.mjs +107 -107
  258. package/hooks/ftm-install-hooks.sh +240 -0
  259. package/hooks/ftm-learning-capture.sh +117 -0
  260. package/hooks/ftm-map-autodetect.sh +79 -79
  261. package/hooks/ftm-pending-sync-check.sh +22 -22
  262. package/hooks/ftm-plan-gate.sh +92 -92
  263. package/hooks/ftm-post-commit-trigger.sh +57 -57
  264. package/hooks/ftm-post-compaction.sh +138 -0
  265. package/hooks/ftm-pre-compaction.sh +147 -0
  266. package/hooks/ftm-session-end.sh +52 -0
  267. package/hooks/ftm-session-snapshot.sh +213 -0
  268. package/hooks/ftm-task-loader.sh +100 -0
  269. package/hooks/settings-template.json +91 -81
  270. package/install.sh +363 -363
  271. package/package.json +84 -84
  272. package/uninstall.sh +25 -25
@@ -1,69 +1,69 @@
1
- # Auto-Fix Strategies
2
-
3
- Layer 3 applies fixes for each finding type, re-verifies, and produces a changelog. This document defines the fix strategy for each finding type and when to skip auto-fix.
4
-
5
- ---
6
-
7
- ## Fix Strategies by Finding Type
8
-
9
- | Finding Type | Fix Strategy | Fallback |
10
- |---|---|---|
11
- | `UNUSED_FILE` | If created by the current task, add import from the appropriate parent module. If pre-existing dead code, flag for removal. | Flag for manual review — might be intentionally standalone (config, script) |
12
- | `UNUSED_EXPORT` | If another module should consume it (check wiring contract), add the import. If truly unnecessary, remove the export keyword. | Flag for manual review |
13
- | `UNWIRED_COMPONENT` | Add `<ComponentName />` to the parent component's JSX return. Determine placement from component name and parent structure. | Flag — can't determine correct placement |
14
- | `ORPHAN_ROUTE` | Add route entry to the router config. Infer path from component name (e.g., `SettingsView` → `/settings`). Add nav link to sidebar/navbar if one exists. | Flag — route path ambiguous |
15
- | `DEAD_STORE_FIELD` | If a component should read this field (check wiring contract), add the selector/hook usage. If truly unused, remove the field. | Flag — store design decision needed |
16
- | `UNCALLED_API` | If a hook or component should call this (check wiring contract), add the invocation. If truly unused, remove the function. | Flag — API integration decision needed |
17
- | `UNUSED_DEP` | Remove from `package.json` `dependencies` or `devDependencies`. | Flag if it might be used in scripts, config files, or CLI |
18
- | `UNLISTED_DEP` | Run `npm install <package>` (or appropriate package manager command). | Flag if the import might be wrong |
19
-
20
- ---
21
-
22
- ## Fix Protocol
23
-
24
- For each finding, follow this sequence:
25
-
26
- 1. **Report** — Log the finding with type, file:line, and evidence
27
- 2. **Determine fix** — Match finding type to fix strategy above. Check wiring contract for WHERE to wire, if available.
28
- 3. **Show proposed fix** — Display the exact code change before applying:
29
- ```
30
- FIX: [UNWIRED_COMPONENT] NewWidget in Dashboard.tsx
31
- Proposed: Add <NewWidget /> to Dashboard.tsx return JSX after line 45
32
- ```
33
- 4. **Apply fix** — Use Edit tool to make the change
34
- 5. **Re-verify** — Run the specific check that found the issue:
35
- - For knip findings: re-run `npx knip --reporter json`
36
- - For adversarial findings: re-trace the specific wiring dimension
37
- 6. **Log to changelog** — Record: timestamp, finding, fix applied, verification result
38
-
39
- ---
40
-
41
- ## When Auto-Fix Is Not Safe
42
-
43
- Some findings cannot be auto-fixed without risking incorrect behavior:
44
-
45
- - **Ambiguous placement** — cannot determine where exactly in a component the new element should render
46
- - **Design decision needed** — whether a store field should exist at all requires product judgment
47
- - **Cross-cutting changes** — fix requires modifying 5+ files simultaneously
48
- - **Test-only code** — might be intentionally not wired into the app
49
-
50
- For these, flag clearly:
51
-
52
- ```
53
- MANUAL_INTERVENTION_NEEDED:
54
- - [ORPHAN_ROUTE] src/views/AdminPanel.tsx — cannot determine route path or nav placement
55
- Suggested action: Add route to router config and nav link to sidebar
56
- Reason auto-fix skipped: Multiple possible route paths (/admin, /settings/admin, /dashboard/admin)
57
- ```
58
-
59
- ---
60
-
61
- ## Re-Verification Loop
62
-
63
- After all auto-fixes are applied:
64
-
65
- 1. Re-run Layer 1 (knip) — confirm no new unused code introduced by fixes
66
- 2. Re-run Layer 2 (adversarial audit on the fix diff) — confirm fixes actually wire correctly
67
- 3. If re-verification finds new issues, fix those too
68
-
69
- **Loop limit:** Maximum 3 iterations to prevent infinite fix cycles. If issues persist after 3 iterations, stop and flag all remaining issues for manual intervention with a note explaining the loop was capped.
1
+ # Auto-Fix Strategies
2
+
3
+ Layer 3 applies fixes for each finding type, re-verifies, and produces a changelog. This document defines the fix strategy for each finding type and when to skip auto-fix.
4
+
5
+ ---
6
+
7
+ ## Fix Strategies by Finding Type
8
+
9
+ | Finding Type | Fix Strategy | Fallback |
10
+ |---|---|---|
11
+ | `UNUSED_FILE` | If created by the current task, add import from the appropriate parent module. If pre-existing dead code, flag for removal. | Flag for manual review — might be intentionally standalone (config, script) |
12
+ | `UNUSED_EXPORT` | If another module should consume it (check wiring contract), add the import. If truly unnecessary, remove the export keyword. | Flag for manual review |
13
+ | `UNWIRED_COMPONENT` | Add `<ComponentName />` to the parent component's JSX return. Determine placement from component name and parent structure. | Flag — can't determine correct placement |
14
+ | `ORPHAN_ROUTE` | Add route entry to the router config. Infer path from component name (e.g., `SettingsView` → `/settings`). Add nav link to sidebar/navbar if one exists. | Flag — route path ambiguous |
15
+ | `DEAD_STORE_FIELD` | If a component should read this field (check wiring contract), add the selector/hook usage. If truly unused, remove the field. | Flag — store design decision needed |
16
+ | `UNCALLED_API` | If a hook or component should call this (check wiring contract), add the invocation. If truly unused, remove the function. | Flag — API integration decision needed |
17
+ | `UNUSED_DEP` | Remove from `package.json` `dependencies` or `devDependencies`. | Flag if it might be used in scripts, config files, or CLI |
18
+ | `UNLISTED_DEP` | Run `npm install <package>` (or appropriate package manager command). | Flag if the import might be wrong |
19
+
20
+ ---
21
+
22
+ ## Fix Protocol
23
+
24
+ For each finding, follow this sequence:
25
+
26
+ 1. **Report** — Log the finding with type, file:line, and evidence
27
+ 2. **Determine fix** — Match finding type to fix strategy above. Check wiring contract for WHERE to wire, if available.
28
+ 3. **Show proposed fix** — Display the exact code change before applying:
29
+ ```
30
+ FIX: [UNWIRED_COMPONENT] NewWidget in Dashboard.tsx
31
+ Proposed: Add <NewWidget /> to Dashboard.tsx return JSX after line 45
32
+ ```
33
+ 4. **Apply fix** — Use Edit tool to make the change
34
+ 5. **Re-verify** — Run the specific check that found the issue:
35
+ - For knip findings: re-run `npx knip --reporter json`
36
+ - For adversarial findings: re-trace the specific wiring dimension
37
+ 6. **Log to changelog** — Record: timestamp, finding, fix applied, verification result
38
+
39
+ ---
40
+
41
+ ## When Auto-Fix Is Not Safe
42
+
43
+ Some findings cannot be auto-fixed without risking incorrect behavior:
44
+
45
+ - **Ambiguous placement** — cannot determine where exactly in a component the new element should render
46
+ - **Design decision needed** — whether a store field should exist at all requires product judgment
47
+ - **Cross-cutting changes** — fix requires modifying 5+ files simultaneously
48
+ - **Test-only code** — might be intentionally not wired into the app
49
+
50
+ For these, flag clearly:
51
+
52
+ ```
53
+ MANUAL_INTERVENTION_NEEDED:
54
+ - [ORPHAN_ROUTE] src/views/AdminPanel.tsx — cannot determine route path or nav placement
55
+ Suggested action: Add route to router config and nav link to sidebar
56
+ Reason auto-fix skipped: Multiple possible route paths (/admin, /settings/admin, /dashboard/admin)
57
+ ```
58
+
59
+ ---
60
+
61
+ ## Re-Verification Loop
62
+
63
+ After all auto-fixes are applied:
64
+
65
+ 1. Re-run Layer 1 (knip) — confirm no new unused code introduced by fixes
66
+ 2. Re-run Layer 2 (adversarial audit on the fix diff) — confirm fixes actually wire correctly
67
+ 3. If re-verification finds new issues, fix those too
68
+
69
+ **Loop limit:** Maximum 3 iterations to prevent infinite fix cycles. If issues persist after 3 iterations, stop and flag all remaining issues for manual intervention with a note explaining the loop was capped.
@@ -1,96 +1,96 @@
1
- # Audit Report Format
2
-
3
- The final output structure for a completed ftm-audit run.
4
-
5
- ---
6
-
7
- ## Summary Report
8
-
9
- ```
10
- ## FTM Audit Report — [YYYY-MM-DD HH:MM]
11
-
12
- ### Layer 1: Static Analysis (knip)
13
- - Findings: [N]
14
- - [FINDING_TYPE] file:line — description
15
- - [FINDING_TYPE] file:line — description
16
-
17
- ### Layer 2: Adversarial Audit
18
- - Findings: [N]
19
- - [FINDING_TYPE] file:line — description (Dimension N FAIL)
20
- - [FINDING_TYPE] file:line — description (Dimension N FAIL)
21
-
22
- ### Layer 3: Auto-Fix Results
23
- - Fixed: [N]
24
- - Manual intervention needed: [N]
25
- - [list each fix applied with result]
26
-
27
- ### Final Status: PASS / FAIL
28
- - Remaining issues: [list if any]
29
- ```
30
-
31
- ---
32
-
33
- ## Detailed Changelog
34
-
35
- Produced alongside the summary report when Layer 3 runs.
36
-
37
- ```
38
- ### FTM Audit Changelog — [YYYY-MM-DD HH:MM]
39
-
40
- #### Findings
41
- | # | Type | Location | Description |
42
- |---|------|----------|-------------|
43
- | 1 | UNWIRED_COMPONENT | src/components/Widget.tsx | Imported but not rendered in Dashboard |
44
- | 2 | ORPHAN_ROUTE | src/views/Settings.tsx | No route config entry |
45
-
46
- #### Fixes Applied
47
- | # | Finding | Fix | Verified |
48
- |---|---------|-----|----------|
49
- | 1 | UNWIRED_COMPONENT Widget | Added <Widget /> to Dashboard.tsx:47 | ✅ PASS |
50
- | 2 | ORPHAN_ROUTE Settings | Added /settings route to router.tsx:23 | ✅ PASS |
51
-
52
- #### Manual Intervention Required
53
- | # | Finding | Reason | Suggested Action |
54
- |---|---------|--------|-----------------|
55
- | (none) | | | |
56
-
57
- #### Final Status: PASS (0 remaining issues)
58
- ```
59
-
60
- ---
61
-
62
- ## Layer-by-Layer Finding Format
63
-
64
- ### Layer 1 (knip) Finding Format
65
-
66
- ```
67
- Layer 1 findings:
68
- - [UNUSED_FILE] src/components/OldWidget.tsx — not imported anywhere
69
- - [UNUSED_EXPORT] src/utils/helpers.ts:42 — export `formatDate` not used
70
- - [UNUSED_DEP] package.json — `lodash` listed but never imported
71
- - [UNLISTED_DEP] src/api/client.ts — imports `axios` but it's not in package.json
72
- ```
73
-
74
- ### Layer 2 (Adversarial) Finding Format
75
-
76
- ```
77
- Layer 2 findings:
78
- - [UNWIRED_COMPONENT] src/components/NewWidget.tsx — imported in Dashboard.tsx:5 but never rendered in JSX (Dimension 2 FAIL)
79
- - [ORPHAN_ROUTE] src/views/SettingsView.tsx — no route in router config points to this view (Dimension 3 FAIL)
80
- - [DEAD_STORE_FIELD] src/store/userSlice.ts:23 — `userPreferences` written in reducer but never read by any selector (Dimension 4 FAIL)
81
- - [UNCALLED_API] src/api/billing.ts:15 — `fetchInvoices()` exported but never called (Dimension 5 FAIL)
82
- ```
83
-
84
- **Requirement:** Every finding must include file:line evidence. "I think this might be unused" is not acceptable — show the grep results or the missing link in the chain.
85
-
86
- ### Phase 3 (Runtime) Finding Format
87
-
88
- When runtime-only findings are present (passed Layers 1-2 but failed Phase 3):
89
-
90
- ```
91
- Phase 3 (Runtime) findings:
92
- - [RUNTIME_FAIL] /analytics — page returns 404 despite route registered in router.tsx:18
93
- - [RUNTIME_WARN] /settings — route renders but <UserPreferences /> missing from ARIA tree
94
- ```
95
-
96
- Label these as `runtime-only` so developers know they won't be caught by future static checks alone.
1
+ # Audit Report Format
2
+
3
+ The final output structure for a completed ftm-audit run.
4
+
5
+ ---
6
+
7
+ ## Summary Report
8
+
9
+ ```
10
+ ## FTM Audit Report — [YYYY-MM-DD HH:MM]
11
+
12
+ ### Layer 1: Static Analysis (knip)
13
+ - Findings: [N]
14
+ - [FINDING_TYPE] file:line — description
15
+ - [FINDING_TYPE] file:line — description
16
+
17
+ ### Layer 2: Adversarial Audit
18
+ - Findings: [N]
19
+ - [FINDING_TYPE] file:line — description (Dimension N FAIL)
20
+ - [FINDING_TYPE] file:line — description (Dimension N FAIL)
21
+
22
+ ### Layer 3: Auto-Fix Results
23
+ - Fixed: [N]
24
+ - Manual intervention needed: [N]
25
+ - [list each fix applied with result]
26
+
27
+ ### Final Status: PASS / FAIL
28
+ - Remaining issues: [list if any]
29
+ ```
30
+
31
+ ---
32
+
33
+ ## Detailed Changelog
34
+
35
+ Produced alongside the summary report when Layer 3 runs.
36
+
37
+ ```
38
+ ### FTM Audit Changelog — [YYYY-MM-DD HH:MM]
39
+
40
+ #### Findings
41
+ | # | Type | Location | Description |
42
+ |---|------|----------|-------------|
43
+ | 1 | UNWIRED_COMPONENT | src/components/Widget.tsx | Imported but not rendered in Dashboard |
44
+ | 2 | ORPHAN_ROUTE | src/views/Settings.tsx | No route config entry |
45
+
46
+ #### Fixes Applied
47
+ | # | Finding | Fix | Verified |
48
+ |---|---------|-----|----------|
49
+ | 1 | UNWIRED_COMPONENT Widget | Added <Widget /> to Dashboard.tsx:47 | ✅ PASS |
50
+ | 2 | ORPHAN_ROUTE Settings | Added /settings route to router.tsx:23 | ✅ PASS |
51
+
52
+ #### Manual Intervention Required
53
+ | # | Finding | Reason | Suggested Action |
54
+ |---|---------|--------|-----------------|
55
+ | (none) | | | |
56
+
57
+ #### Final Status: PASS (0 remaining issues)
58
+ ```
59
+
60
+ ---
61
+
62
+ ## Layer-by-Layer Finding Format
63
+
64
+ ### Layer 1 (knip) Finding Format
65
+
66
+ ```
67
+ Layer 1 findings:
68
+ - [UNUSED_FILE] src/components/OldWidget.tsx — not imported anywhere
69
+ - [UNUSED_EXPORT] src/utils/helpers.ts:42 — export `formatDate` not used
70
+ - [UNUSED_DEP] package.json — `lodash` listed but never imported
71
+ - [UNLISTED_DEP] src/api/client.ts — imports `axios` but it's not in package.json
72
+ ```
73
+
74
+ ### Layer 2 (Adversarial) Finding Format
75
+
76
+ ```
77
+ Layer 2 findings:
78
+ - [UNWIRED_COMPONENT] src/components/NewWidget.tsx — imported in Dashboard.tsx:5 but never rendered in JSX (Dimension 2 FAIL)
79
+ - [ORPHAN_ROUTE] src/views/SettingsView.tsx — no route in router config points to this view (Dimension 3 FAIL)
80
+ - [DEAD_STORE_FIELD] src/store/userSlice.ts:23 — `userPreferences` written in reducer but never read by any selector (Dimension 4 FAIL)
81
+ - [UNCALLED_API] src/api/billing.ts:15 — `fetchInvoices()` exported but never called (Dimension 5 FAIL)
82
+ ```
83
+
84
+ **Requirement:** Every finding must include file:line evidence. "I think this might be unused" is not acceptable — show the grep results or the missing link in the chain.
85
+
86
+ ### Phase 3 (Runtime) Finding Format
87
+
88
+ When runtime-only findings are present (passed Layers 1-2 but failed Phase 3):
89
+
90
+ ```
91
+ Phase 3 (Runtime) findings:
92
+ - [RUNTIME_FAIL] /analytics — page returns 404 despite route registered in router.tsx:18
93
+ - [RUNTIME_WARN] /settings — route renders but <UserPreferences /> missing from ARIA tree
94
+ ```
95
+
96
+ Label these as `runtime-only` so developers know they won't be caught by future static checks alone.
@@ -1,23 +1,23 @@
1
- #!/usr/bin/env bash
2
- # run-knip.sh — Run knip and return structured findings
3
- # Exit 0 if clean, 1 if findings exist
4
-
5
- set -euo pipefail
6
-
7
- # Check for package.json
8
- if [ ! -f "package.json" ]; then
9
- echo '{"skipped": true, "reason": "No package.json found"}'
10
- exit 0
11
- fi
12
-
13
- # Run knip with JSON reporter
14
- OUTPUT=$(npx knip --reporter json 2>/dev/null || true)
15
-
16
- # Check if output is empty or just '{}'
17
- if [ -z "$OUTPUT" ] || [ "$OUTPUT" = "{}" ] || [ "$OUTPUT" = '{"files":[],"issues":[]}' ]; then
18
- echo '{"clean": true, "files": [], "issues": []}'
19
- exit 0
20
- fi
21
-
22
- echo "$OUTPUT"
23
- exit 1
1
+ #!/usr/bin/env bash
2
+ # run-knip.sh — Run knip and return structured findings
3
+ # Exit 0 if clean, 1 if findings exist
4
+
5
+ set -euo pipefail
6
+
7
+ # Check for package.json
8
+ if [ ! -f "package.json" ]; then
9
+ echo '{"skipped": true, "reason": "No package.json found"}'
10
+ exit 0
11
+ fi
12
+
13
+ # Run knip with JSON reporter
14
+ OUTPUT=$(npx knip --reporter json 2>/dev/null || true)
15
+
16
+ # Check if output is empty or just '{}'
17
+ if [ -z "$OUTPUT" ] || [ "$OUTPUT" = "{}" ] || [ "$OUTPUT" = '{"files":[],"issues":[]}' ]; then
18
+ echo '{"clean": true, "files": [], "issues": []}'
19
+ exit 0
20
+ fi
21
+
22
+ echo "$OUTPUT"
23
+ exit 1
package/ftm-audit.yml CHANGED
@@ -1,2 +1,2 @@
1
- name: ftm-audit
2
- description: Dual-purpose wiring audit that verifies all code is actually connected to the running application. Combines static analysis (knip) with adversarial LLM audit and auto-fixes anything it finds. Use when user says "audit", "wiring check", "verify wiring", "dead code", "check imports", "unused code", "find dead code", or "audit wiring". Also auto-invoked by ftm-executor after each task.
1
+ name: ftm-audit
2
+ description: Dual-purpose wiring audit that verifies all code is actually connected to the running application. Combines static analysis (knip) with adversarial LLM audit and auto-fixes anything it finds. Use when user says "audit", "wiring check", "verify wiring", "dead code", "check imports", "unused code", "find dead code", or "audit wiring". Also auto-invoked by ftm-executor after each task.