feed-the-machine 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +170 -170
- package/bin/generate-manifest.mjs +463 -463
- package/bin/install.mjs +491 -491
- package/docs/HOOKS.md +243 -243
- package/docs/INBOX.md +233 -233
- package/ftm/SKILL.md +122 -122
- package/ftm-audit/SKILL.md +623 -541
- 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 +498 -498
- package/ftm-brainstorm/evals/evals.json +100 -100
- package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
- package/ftm-brainstorm/references/agent-prompts.md +224 -224
- package/ftm-brainstorm/references/plan-template.md +121 -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 +345 -345
- package/ftm-config.default.yml +82 -80
- package/ftm-config.yml +2 -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 -767
- 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 -44
- 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/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/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/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 +1943 -1943
- package/ftm-mind/evals/promptfoo.yaml +142 -142
- package/ftm-mind/references/blackboard-schema.md +328 -328
- package/ftm-mind/references/complexity-guide.md +110 -110
- package/ftm-mind/references/event-registry.md +319 -319
- package/ftm-mind/references/mcp-inventory.md +296 -296
- 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-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 +23 -23
- package/ftm-state/blackboard/experiences/index.json +9 -9
- 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-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-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/settings-template.json +81 -81
- package/install.sh +363 -363
- package/package.json +84 -84
- 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.
|