@luanpdd/kit-mcp 1.30.2 → 1.31.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 (347) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +168 -168
  3. package/gates/agent-no-recursive-dispatch.md +84 -82
  4. package/kit/COMANDOS.md +138 -138
  5. package/kit/README.md +76 -76
  6. package/kit/agents/advisor-researcher.md +107 -106
  7. package/kit/agents/ai-mutation-tester.md +1 -0
  8. package/kit/agents/assumptions-analyzer.md +108 -107
  9. package/kit/agents/audit-log-implementer.md +314 -313
  10. package/kit/agents/auditor-consistencia-isolamento.md +414 -413
  11. package/kit/agents/b2b-saas-architect.md +157 -156
  12. package/kit/agents/burn-rate-forecaster.md +1 -0
  13. package/kit/agents/cascading-failures-auditor.md +299 -298
  14. package/kit/agents/codebase-mapper.md +769 -768
  15. package/kit/agents/crm-pipeline-implementer.md +257 -256
  16. package/kit/agents/debugger.md +814 -813
  17. package/kit/agents/detector-tenant-quente.md +338 -337
  18. package/kit/agents/evolution-go-integrator.md +201 -200
  19. package/kit/agents/example-reviewer.md +22 -21
  20. package/kit/agents/executor.md +565 -564
  21. package/kit/agents/golden-signals-instrumenter.md +1 -0
  22. package/kit/agents/incident-investigator.md +1 -0
  23. package/kit/agents/integration-checker.md +201 -200
  24. package/kit/agents/invite-flow-implementer.md +190 -189
  25. package/kit/agents/legacy-characterizer.md +369 -368
  26. package/kit/agents/lgpd-compliance-auditor.md +296 -295
  27. package/kit/agents/load-shedding-instrumenter.md +1 -0
  28. package/kit/agents/multi-tenant-isolation-auditor.md +254 -253
  29. package/kit/agents/multi-tenant-rls-writer.md +341 -340
  30. package/kit/agents/nyquist-auditor.md +179 -178
  31. package/kit/agents/observability-coverage-auditor.md +316 -315
  32. package/kit/agents/observability-instrumenter.md +1 -0
  33. package/kit/agents/omm-auditor.md +1 -0
  34. package/kit/agents/org-onboarding-implementer.md +224 -223
  35. package/kit/agents/payload-capture-instrumenter.md +274 -273
  36. package/kit/agents/phase-researcher.md +697 -696
  37. package/kit/agents/plan-checker.md +273 -272
  38. package/kit/agents/planner.md +923 -922
  39. package/kit/agents/postmortem-writer.md +1 -0
  40. package/kit/agents/project-researcher.md +653 -652
  41. package/kit/agents/prr-conductor.md +1 -0
  42. package/kit/agents/refactor-safety-auditor.md +405 -404
  43. package/kit/agents/release-pipeline-auditor.md +1 -0
  44. package/kit/agents/research-synthesizer.md +246 -245
  45. package/kit/agents/roadmapper.md +678 -677
  46. package/kit/agents/schema-checker.md +1 -0
  47. package/kit/agents/seam-finder.md +360 -359
  48. package/kit/agents/shotgun-surgery-detector.md +350 -349
  49. package/kit/agents/slo-engineer.md +1 -0
  50. package/kit/agents/storytelling-analyst.md +1 -0
  51. package/kit/agents/supabase-architect.md +1 -0
  52. package/kit/agents/supabase-auth-bootstrapper.md +1 -0
  53. package/kit/agents/supabase-branching-architect.md +563 -562
  54. package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -777
  55. package/kit/agents/supabase-column-privileges-writer.md +400 -399
  56. package/kit/agents/supabase-edge-fn-tester.md +2 -1
  57. package/kit/agents/supabase-edge-fn-writer.md +2 -1
  58. package/kit/agents/supabase-migration-writer.md +386 -385
  59. package/kit/agents/supabase-rbac-implementer.md +393 -392
  60. package/kit/agents/supabase-realtime-implementer.md +364 -363
  61. package/kit/agents/supabase-rls-hardener.md +522 -521
  62. package/kit/agents/supabase-rls-writer.md +324 -323
  63. package/kit/agents/supabase-roles-implementer.md +356 -355
  64. package/kit/agents/supabase-storage-implementer.md +1 -0
  65. package/kit/agents/super-admin-implementer.md +282 -281
  66. package/kit/agents/toil-auditor.md +1 -0
  67. package/kit/agents/ui-auditor.md +438 -437
  68. package/kit/agents/ui-checker.md +303 -302
  69. package/kit/agents/ui-researcher.md +356 -355
  70. package/kit/agents/user-profiler.md +176 -175
  71. package/kit/agents/validador-evolucao-schema.md +336 -335
  72. package/kit/agents/verifier.md +729 -728
  73. package/kit/commands/adicionar-backlog.md +75 -75
  74. package/kit/commands/adicionar-fase.md +42 -42
  75. package/kit/commands/adicionar-tarefa.md +45 -45
  76. package/kit/commands/adicionar-testes.md +41 -41
  77. package/kit/commands/ajuda.md +21 -21
  78. package/kit/commands/atualizar.md +37 -37
  79. package/kit/commands/auditar-cascading.md +111 -111
  80. package/kit/commands/auditar-marco.md +179 -179
  81. package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
  82. package/kit/commands/auditar-refactor.md +219 -219
  83. package/kit/commands/auditar-release.md +109 -109
  84. package/kit/commands/auditar-uat.md +23 -23
  85. package/kit/commands/autonomo.md +40 -40
  86. package/kit/commands/branch-pr.md +24 -24
  87. package/kit/commands/burn-rate-status.md +408 -408
  88. package/kit/commands/capturar-payloads.md +193 -193
  89. package/kit/commands/caracterizar.md +212 -212
  90. package/kit/commands/concluir-marco.md +247 -247
  91. package/kit/commands/configuracoes.md +36 -36
  92. package/kit/commands/dados-distribuidos.md +188 -188
  93. package/kit/commands/definir-perfil.md +10 -10
  94. package/kit/commands/depurar.md +190 -190
  95. package/kit/commands/detectar-duplicacao.md +197 -197
  96. package/kit/commands/discutir-fase.md +131 -131
  97. package/kit/commands/encontrar-seams.md +136 -136
  98. package/kit/commands/entrar-discord.md +17 -17
  99. package/kit/commands/estatisticas.md +18 -18
  100. package/kit/commands/example-greeting.md +33 -33
  101. package/kit/commands/executar-fase.md +58 -58
  102. package/kit/commands/expresso.md +56 -56
  103. package/kit/commands/fase-ui.md +34 -34
  104. package/kit/commands/fazer.md +57 -57
  105. package/kit/commands/fio.md +125 -125
  106. package/kit/commands/fluxos-trabalho.md +64 -64
  107. package/kit/commands/forense.md +176 -176
  108. package/kit/commands/gerenciador.md +38 -38
  109. package/kit/commands/inserir-fase.md +31 -31
  110. package/kit/commands/legacy.md +263 -263
  111. package/kit/commands/limpeza.md +17 -17
  112. package/kit/commands/listar-hipoteses-fase.md +45 -45
  113. package/kit/commands/listar-workspaces.md +18 -18
  114. package/kit/commands/load-shedding.md +117 -117
  115. package/kit/commands/mapear-codebase.md +70 -70
  116. package/kit/commands/multi-tenant.md +163 -163
  117. package/kit/commands/nota.md +33 -33
  118. package/kit/commands/novo-marco.md +43 -43
  119. package/kit/commands/novo-projeto.md +41 -41
  120. package/kit/commands/novo-workspace.md +43 -43
  121. package/kit/commands/pausar-trabalho.md +37 -37
  122. package/kit/commands/perfil-usuario.md +45 -45
  123. package/kit/commands/pesquisar-fase.md +195 -195
  124. package/kit/commands/planejar-fase.md +67 -67
  125. package/kit/commands/planejar-lacunas.md +33 -33
  126. package/kit/commands/plantar-ideia.md +25 -25
  127. package/kit/commands/progresso.md +24 -24
  128. package/kit/commands/proximo.md +30 -30
  129. package/kit/commands/publicar.md +490 -490
  130. package/kit/commands/rapido.md +35 -35
  131. package/kit/commands/reaplicar-patches.md +124 -124
  132. package/kit/commands/refactor-seguro.md +321 -321
  133. package/kit/commands/relatorio-sessao.md +19 -19
  134. package/kit/commands/remover-fase.md +31 -31
  135. package/kit/commands/remover-workspace.md +26 -26
  136. package/kit/commands/resumo-marco.md +50 -50
  137. package/kit/commands/retomar-trabalho.md +40 -40
  138. package/kit/commands/revisar-backlog.md +60 -60
  139. package/kit/commands/revisar-ui.md +32 -32
  140. package/kit/commands/revisar.md +37 -37
  141. package/kit/commands/saude.md +21 -21
  142. package/kit/commands/setup-notion.md +93 -93
  143. package/kit/commands/storytelling.md +179 -179
  144. package/kit/commands/sync-main.md +68 -68
  145. package/kit/commands/validar-fase.md +35 -35
  146. package/kit/commands/verificar-tarefas.md +44 -44
  147. package/kit/commands/verificar-trabalho.md +64 -64
  148. package/kit/file-manifest.json +82 -81
  149. package/kit/framework/bin/lib/commands.cjs +959 -959
  150. package/kit/framework/bin/lib/config.cjs +442 -442
  151. package/kit/framework/bin/lib/core.cjs +1230 -1230
  152. package/kit/framework/bin/lib/frontmatter.cjs +336 -336
  153. package/kit/framework/bin/lib/init.cjs +1442 -1442
  154. package/kit/framework/bin/lib/milestone.cjs +252 -252
  155. package/kit/framework/bin/lib/model-profiles.cjs +68 -68
  156. package/kit/framework/bin/lib/phase.cjs +888 -888
  157. package/kit/framework/bin/lib/profile-output.cjs +952 -952
  158. package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
  159. package/kit/framework/bin/lib/roadmap.cjs +329 -329
  160. package/kit/framework/bin/lib/security.cjs +382 -382
  161. package/kit/framework/bin/lib/state.cjs +1031 -1031
  162. package/kit/framework/bin/lib/template.cjs +222 -222
  163. package/kit/framework/bin/lib/uat.cjs +282 -282
  164. package/kit/framework/bin/lib/verify.cjs +888 -888
  165. package/kit/framework/bin/lib/workstream.cjs +491 -491
  166. package/kit/framework/bin/tools.cjs +918 -918
  167. package/kit/framework/commands/workstreams.md +63 -63
  168. package/kit/framework/references/checkpoints.md +778 -778
  169. package/kit/framework/references/continuation-format.md +249 -249
  170. package/kit/framework/references/decimal-phase-calculation.md +64 -64
  171. package/kit/framework/references/git-integration.md +295 -295
  172. package/kit/framework/references/git-planning-commit.md +38 -38
  173. package/kit/framework/references/model-profile-resolution.md +36 -36
  174. package/kit/framework/references/model-profiles.md +139 -139
  175. package/kit/framework/references/phase-argument-parsing.md +61 -61
  176. package/kit/framework/references/planning-config.md +202 -202
  177. package/kit/framework/references/questioning.md +162 -162
  178. package/kit/framework/references/tdd.md +263 -263
  179. package/kit/framework/references/ui-brand.md +160 -160
  180. package/kit/framework/references/user-profiling.md +657 -657
  181. package/kit/framework/references/verification-patterns.md +612 -612
  182. package/kit/framework/references/workstream-flag.md +58 -58
  183. package/kit/framework/templates/DEBUG.md +164 -164
  184. package/kit/framework/templates/UAT.md +265 -265
  185. package/kit/framework/templates/UI-SPEC.md +100 -100
  186. package/kit/framework/templates/VALIDATION.md +76 -76
  187. package/kit/framework/templates/claude-md.md +122 -122
  188. package/kit/framework/templates/codebase/architecture.md +185 -185
  189. package/kit/framework/templates/codebase/concerns.md +205 -205
  190. package/kit/framework/templates/codebase/conventions.md +204 -204
  191. package/kit/framework/templates/codebase/integrations.md +192 -192
  192. package/kit/framework/templates/codebase/stack.md +158 -158
  193. package/kit/framework/templates/codebase/structure.md +199 -199
  194. package/kit/framework/templates/codebase/testing.md +301 -301
  195. package/kit/framework/templates/config.json +44 -44
  196. package/kit/framework/templates/context.md +352 -352
  197. package/kit/framework/templates/continue-here.md +78 -78
  198. package/kit/framework/templates/copilot-instructions.md +7 -7
  199. package/kit/framework/templates/debug-subagent-prompt.md +91 -91
  200. package/kit/framework/templates/dev-preferences.md +20 -20
  201. package/kit/framework/templates/discovery.md +146 -146
  202. package/kit/framework/templates/discussion-log.md +63 -63
  203. package/kit/framework/templates/milestone-archive.md +123 -123
  204. package/kit/framework/templates/milestone.md +115 -115
  205. package/kit/framework/templates/phase-prompt.md +610 -610
  206. package/kit/framework/templates/planner-subagent-prompt.md +117 -117
  207. package/kit/framework/templates/project.md +186 -186
  208. package/kit/framework/templates/requirements.md +231 -231
  209. package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
  210. package/kit/framework/templates/research-project/FEATURES.md +147 -147
  211. package/kit/framework/templates/research-project/PITFALLS.md +200 -200
  212. package/kit/framework/templates/research-project/STACK.md +120 -120
  213. package/kit/framework/templates/research-project/SUMMARY.md +170 -170
  214. package/kit/framework/templates/research.md +419 -419
  215. package/kit/framework/templates/retrospective.md +54 -54
  216. package/kit/framework/templates/roadmap.md +202 -202
  217. package/kit/framework/templates/state.md +176 -176
  218. package/kit/framework/templates/summary-complex.md +59 -59
  219. package/kit/framework/templates/summary-minimal.md +41 -41
  220. package/kit/framework/templates/summary-standard.md +48 -48
  221. package/kit/framework/templates/summary.md +209 -209
  222. package/kit/framework/templates/user-profile.md +146 -146
  223. package/kit/framework/templates/user-setup.md +256 -256
  224. package/kit/framework/templates/verification-report.md +258 -258
  225. package/kit/framework/workflows/add-phase.md +112 -112
  226. package/kit/framework/workflows/add-tests.md +351 -351
  227. package/kit/framework/workflows/add-todo.md +158 -158
  228. package/kit/framework/workflows/audit-milestone.md +340 -340
  229. package/kit/framework/workflows/audit-uat.md +109 -109
  230. package/kit/framework/workflows/autonomous.md +891 -891
  231. package/kit/framework/workflows/check-todos.md +177 -177
  232. package/kit/framework/workflows/cleanup.md +152 -152
  233. package/kit/framework/workflows/complete-milestone.md +696 -696
  234. package/kit/framework/workflows/diagnose-issues.md +231 -231
  235. package/kit/framework/workflows/discovery-phase.md +289 -289
  236. package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
  237. package/kit/framework/workflows/discuss-phase.md +784 -784
  238. package/kit/framework/workflows/do.md +104 -104
  239. package/kit/framework/workflows/execute-phase.md +838 -838
  240. package/kit/framework/workflows/execute-plan.md +510 -510
  241. package/kit/framework/workflows/fast.md +102 -102
  242. package/kit/framework/workflows/forensics.md +265 -265
  243. package/kit/framework/workflows/health.md +181 -181
  244. package/kit/framework/workflows/help.md +619 -619
  245. package/kit/framework/workflows/insert-phase.md +130 -130
  246. package/kit/framework/workflows/list-phase-assumptions.md +178 -178
  247. package/kit/framework/workflows/list-workspaces.md +56 -56
  248. package/kit/framework/workflows/manager.md +362 -362
  249. package/kit/framework/workflows/map-codebase.md +377 -377
  250. package/kit/framework/workflows/milestone-summary.md +223 -223
  251. package/kit/framework/workflows/new-milestone.md +486 -486
  252. package/kit/framework/workflows/new-project.md +1159 -1159
  253. package/kit/framework/workflows/new-workspace.md +237 -237
  254. package/kit/framework/workflows/next.md +97 -97
  255. package/kit/framework/workflows/node-repair.md +92 -92
  256. package/kit/framework/workflows/note.md +156 -156
  257. package/kit/framework/workflows/pause-work.md +176 -176
  258. package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
  259. package/kit/framework/workflows/plan-phase.md +765 -765
  260. package/kit/framework/workflows/plant-seed.md +169 -169
  261. package/kit/framework/workflows/pr-branch.md +129 -129
  262. package/kit/framework/workflows/profile-user.md +450 -450
  263. package/kit/framework/workflows/progress.md +507 -507
  264. package/kit/framework/workflows/quick.md +757 -757
  265. package/kit/framework/workflows/remove-phase.md +155 -155
  266. package/kit/framework/workflows/remove-workspace.md +90 -90
  267. package/kit/framework/workflows/research-phase.md +82 -82
  268. package/kit/framework/workflows/resume-project.md +326 -326
  269. package/kit/framework/workflows/review.md +228 -228
  270. package/kit/framework/workflows/session-report.md +146 -146
  271. package/kit/framework/workflows/settings.md +283 -283
  272. package/kit/framework/workflows/ship.md +228 -228
  273. package/kit/framework/workflows/stats.md +60 -60
  274. package/kit/framework/workflows/transition.md +671 -671
  275. package/kit/framework/workflows/ui-phase.md +302 -302
  276. package/kit/framework/workflows/ui-review.md +165 -165
  277. package/kit/framework/workflows/update.md +323 -323
  278. package/kit/framework/workflows/validate-phase.md +174 -174
  279. package/kit/framework/workflows/verify-phase.md +252 -252
  280. package/kit/framework/workflows/verify-work.md +637 -637
  281. package/kit/hooks/check-update.js +118 -118
  282. package/kit/hooks/context-monitor.js +163 -163
  283. package/kit/hooks/kit-attribution-reminder.cjs +29 -50
  284. package/kit/hooks/kit-router.cjs +137 -0
  285. package/kit/hooks/prompt-guard.js +103 -103
  286. package/kit/hooks/statusline.js +125 -125
  287. package/kit/hooks/workflow-guard.js +101 -101
  288. package/kit/settings.json +45 -45
  289. package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
  290. package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
  291. package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
  292. package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
  293. package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
  294. package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
  295. package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
  296. package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
  297. package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
  298. package/kit/skills/example-skill/SKILL.md +42 -42
  299. package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
  300. package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
  301. package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
  302. package/kit/skills/legacy-extract-class/SKILL.md +203 -203
  303. package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
  304. package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
  305. package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
  306. package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
  307. package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
  308. package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
  309. package/kit/skills/member-invite-flow/SKILL.md +305 -305
  310. package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
  311. package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
  312. package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
  313. package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
  314. package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
  315. package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
  316. package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
  317. package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
  318. package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
  319. package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
  320. package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
  321. package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
  322. package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
  323. package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
  324. package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
  325. package/kit/skills/supabase-edge-functions/SKILL.md +1 -1
  326. package/kit/skills/supabase-edge-functions-auth/SKILL.md +1 -1
  327. package/kit/skills/supabase-edge-functions-limits/SKILL.md +1 -1
  328. package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +1 -1
  329. package/kit/skills/supabase-edge-functions-testing/SKILL.md +1 -1
  330. package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +1 -1
  331. package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
  332. package/kit/skills/supabase-migrations/SKILL.md +297 -297
  333. package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
  334. package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
  335. package/kit/skills/supabase-realtime/SKILL.md +460 -460
  336. package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
  337. package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
  338. package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
  339. package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
  340. package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
  341. package/package.json +1 -1
  342. package/src/core/kit.js +216 -216
  343. package/src/core/reflect.js +247 -247
  344. package/src/core/reverse-sync.js +372 -372
  345. package/src/core/sync.js +437 -418
  346. package/src/core/watch.js +121 -121
  347. package/src/mcp-server/index.js +794 -746
@@ -1,286 +1,286 @@
1
- ---
2
- name: legacy-shotgun-surgery
3
- description: Use ao detectar mesma mudança espalhada em N lugares (cap 21 Feathers) — extract before modify para reduzir change point. Modernização 2026…
4
- ---
5
-
6
- # Legacy — Shotgun Surgery
7
-
8
- ## Quando usar
9
-
10
- LLM carrega esta skill quando user descobre que uma mudança requer edição em múltiplos pontos do codebase. Trigger phrases:
11
-
12
- - "tenho que mudar isso em 5 lugares"
13
- - "shotgun surgery", "cirurgia espalhada"
14
- - "duplicação de código", "code duplication"
15
- - "extrair função", "extract method para reduzir duplicação"
16
- - "esses 3 lugares fazem a mesma coisa"
17
- - "cap 21 Feathers"
18
- - "semantic duplication", "duplicação semântica"
19
-
20
- ## Regras absolutas
21
-
22
- - **Extract first, modify second.** Antes de mudar, EXTRAIR para 1 lugar. Depois mudar 1 lugar. Reduz N change points para 1.
23
- - **Detectar duplicação tem 2 níveis:**
24
- - **Sintática (regex):** mesmo identifier, mesma estrutura. Detect via grep/AST.
25
- - **Semântica (embeddings — modernização 2026):** intenção igual, implementação diferente. Detect via embedding similarity.
26
- - **Threshold canônico:** 3+ ocorrências da MESMA lógica = candidato. 2 ocorrências = "regra do dois" (DRY); 3 = sinal forte; 4+ = veto-extract-imediato.
27
- - **Effect-narrowing precede modify.** Mudar em 5 lugares ÉE shotgun surgery. Mudar em 1 lugar não é. Pré-trabalho: extract.
28
- - **Modernização semantic search:** modelos de embedding pequenos (`text-embedding-3-small` da OpenAI, `bge-small-en` open) custam < $0.01 para projeto inteiro. Threshold típico 0.85 cosine similarity = duplicação semântica forte.
29
- - **Não extract se única ocorrência é "candidata".** Extract sob demanda. Sem 3 ocorrências reais, abstração é especulativa (YAGNI).
30
- - **Extract preserves comportamento.** Cada chamada deve ter resultado IDÊNTICO ao código inline original. Bug preservation aplicável (veja skill characterization).
31
-
32
- ## Patterns canônicos
33
-
34
- ### Pattern 1: Detecção sintática (Feathers original cap 21)
35
-
36
- ```bash
37
- # PT-BR: padrões sintáticos canônicos
38
-
39
- # Functions/methods com nome similar
40
- grep -rE "function (compute|calc)Total" --include="*.ts" .
41
- grep -rE "(compute|calc)Total" --include="*.ts" -A 5 .
42
-
43
- # Bloco de código repetido (heurística)
44
- # Usar `jscpd` (Copy/Paste Detector) ou `simian` para JS/TS/Python
45
- npx jscpd --min-lines 5 --threshold 0 --reporters json src/
46
-
47
- # AST-level (mais preciso) — usar `tree-sitter` queries
48
- # Rust/JS — encontrar all calls com mesmo padrão
49
- ast-grep --pattern 'orderTotal($O) + shippingCost($O) + tax($O)' src/
50
-
51
- # git log — quando mesma mudança aparece em múltiplos commits
52
- git log --since=6.months --pretty=format: --name-only | sort | uniq -c | sort -rn | head -20
53
- # arquivos co-modificados juntos = candidatos a shotgun
54
- ```
55
-
56
- ### Pattern 2: Detecção semântica (modernização 2026 via embeddings)
57
-
58
- ```ts
59
- // PT-BR: workflow de detecção semântica de duplicação
60
- // (sem precedente em 2004 — embedding APIs maduras só em 2023+)
61
-
62
- import { OpenAI } from 'openai'
63
-
64
- const client = new OpenAI({ apiKey: Deno.env.get('OPENAI_API_KEY') })
65
-
66
- async function detectSemanticDuplicates(codeBlocks: CodeBlock[]) {
67
- // Step 1: gerar embedding por bloco
68
- const embeddings = await Promise.all(
69
- codeBlocks.map(async (block) => ({
70
- block,
71
- embedding: (await client.embeddings.create({
72
- model: 'text-embedding-3-small',
73
- input: extractIntent(block), // function signature + comments + body summary
74
- })).data[0].embedding,
75
- }))
76
- )
77
-
78
- // Step 2: clusterizar por similaridade
79
- const clusters: CodeBlock[][] = []
80
- for (const item of embeddings) {
81
- let assigned = false
82
- for (const cluster of clusters) {
83
- const sim = cosineSim(item.embedding, cluster[0].embedding)
84
- if (sim >= 0.85) { // threshold canônico
85
- cluster.push(item.block)
86
- assigned = true
87
- break
88
- }
89
- }
90
- if (!assigned) clusters.push([item.block])
91
- }
92
-
93
- // Step 3: filtrar clusters com 3+ membros (regra do três)
94
- return clusters.filter(c => c.length >= 3)
95
- }
96
-
97
- function extractIntent(block: CodeBlock): string {
98
- // intent = function signature + leading comment + first 3 lines of body
99
- return [
100
- block.signature,
101
- block.leadingComment ?? '',
102
- block.body.slice(0, 3).join('\n'),
103
- ].join('\n')
104
- }
105
-
106
- function cosineSim(a: number[], b: number[]): number {
107
- let dot = 0, na = 0, nb = 0
108
- for (let i = 0; i < a.length; i++) {
109
- dot += a[i] * b[i]
110
- na += a[i] ** 2
111
- nb += b[i] ** 2
112
- }
113
- return dot / (Math.sqrt(na) * Math.sqrt(nb))
114
- }
115
- ```
116
-
117
- **Insight:** semantic search detecta:
118
- - `computeTotalCents` em arquivo A
119
- - `calc_total_in_cents` em arquivo B
120
- - `getOrderTotalInPennies` em arquivo C
121
- - 3 implementações diferentes mas mesma intenção. Regex puro não pega.
122
-
123
- **Custo:** 1000 blocos × text-embedding-3-small ≈ $0.02. Praticamente grátis.
124
-
125
- **Cross-suite:** `pgvector` self-hosted (skill `supabase-pgvector-rag` v1.8) pode hospedar embeddings sem dep externa.
126
-
127
- ### Pattern 3: Workflow extract-before-modify
128
-
129
- ```text
130
- 1. Detectar shotgun surgery (sintática OR semântica)
131
- 2. CONFIRMAR comportamento idêntico via characterization tests
132
- - Capturar output de CADA ocorrência com mesmo input
133
- - Outputs devem ser idênticos (ou docs explicar diferenças intencionais)
134
- 3. EXTRACT — criar função/classe única
135
- - Nome canônico (busca consenso: pelo menos 1 dos N nomes existentes está OK)
136
- - Localização canônica (módulo de utils, ou domain layer adequada)
137
- 4. SUBSTITUIR cada ocorrência por chamada
138
- - 1 commit por substituição
139
- - Tests verdes a cada commit
140
- 5. AGORA mudança é em 1 lugar
141
- 6. Modify
142
- ```
143
-
144
- ### Pattern 4: Heurística de "vale extract?"
145
-
146
- Trade-off entre custo de extract e benefício futuro:
147
-
148
- | Ocorrências | Tamanho cada | Vale extract? |
149
- |---|---|---|
150
- | 2 | 5 linhas | NÃO — Rule of 2 (DRY pode ser violado uma vez) |
151
- | 2 | 30+ linhas | TALVEZ — depende de churn esperado |
152
- | 3 | 5+ linhas | SIM — Rule of 3 |
153
- | 3+ | 10+ linhas | SIM forte |
154
- | N | 1-2 linhas | TALVEZ — ganho marginal vs noise de função tiny |
155
- | N | 50+ linhas | SIM máximo (extract para classe própria) |
156
-
157
- ### Pattern 5: Naming canônico
158
-
159
- Função extraída precisa de nome que "ressoa" com TODAS as ocorrências originais. Estratégia:
160
-
161
- ```text
162
- 1. Listar os N nomes (ou comments) das ocorrências:
163
- - "computeTotalCents"
164
- - "calcOrderTotal"
165
- - "getCartTotalInCents"
166
-
167
- 2. Encontrar o COMUM SEMÂNTICO:
168
- - "Total" presente em todos
169
- - "Cents" / "Cents" / "InCents" — variantes
170
- - Order/Cart — contexto chamador, não nome interno
171
-
172
- 3. Nome canônico: `computeOrderTotalCents` (verb + entity + unit explicit)
173
-
174
- 4. Documentar deprecation comments nas N localizações que usavam nomes diferentes.
175
- ```
176
-
177
- ### Pattern 6: Cross-module shotgun (mais difícil)
178
-
179
- Quando duplicação está em camadas diferentes (e.g., 1 backend + 2 frontends):
180
-
181
- ```text
182
- - Não extract para "shared module" sem pensar em deploy/release coupling
183
- - Considerar: API contract centralizada (OpenAPI) + geração de types
184
- - Considerar: SDK comum (TypeScript types compartilhados via package)
185
- - Última resort: aceitar duplicação cross-stack (custo de unificação > benefício)
186
- ```
187
-
188
- ## Anti-patterns
189
-
190
- ### ANTI: extract sem characterization
191
-
192
- ```text
193
- ANTI: detectou duplicação, extract direto, push.
194
-
195
- PROBLEMA: as 3 ocorrências podem ter VARIAÇÕES sutis (1 retorna em
196
- rounding diferente, outra trata null diferentemente). Sem
197
- characterization, extract uniformiza E quebra a variante.
198
-
199
- CERTO: characterize cada ocorrência ANTES de extract. Outputs
200
- idênticos? extract OK. Outputs diferentes? document, decide se
201
- quer uniformizar (com aceite de mudança comportamental) OR
202
- deixe múltiplas (porque diferenças são intencionais).
203
- ```
204
-
205
- ### ANTI: nome que só funciona em 1 das N localizações
206
-
207
- ```text
208
- ANTI: extracted como "calcCartTotal" — mas era usado em 3 contextos:
209
- Cart, Order, Quote.
210
-
211
- PROBLEMA: callers de Order chamando calcCartTotal lê estranho. Reviewer
212
- confundido. Refactor seguinte (rename) gera mais churn.
213
-
214
- CERTO: nome neutro / contextualizado por parâmetro. `calcTotal(items)`
215
- em vez de `calcCartTotal()`. Caller informa contexto via input,
216
- extracted function é generic.
217
- ```
218
-
219
- ### ANTI: detectar via line-level diff sem AST
220
-
221
- ```text
222
- ANTI: jscpd com min-tokens 5. Reporta 200 "duplicações" — maioria
223
- false positives (assertions de testes, imports, boilerplate).
224
-
225
- PROBLEMA: signal/noise ruim. Equipe ignora reports.
226
-
227
- CERTO: min-lines ≥ 10 + min-tokens ≥ 50 + ignore tests/. AST-based
228
- (ast-grep, semgrep) é melhor — pega "função com mesma estrutura"
229
- não "linhas idênticas".
230
- ```
231
-
232
- ### ANTI: semantic search sem revisão humana
233
-
234
- ```text
235
- ANTI: embedding similarity > 0.85 → automatically suggest extract.
236
-
237
- PROBLEMA: false positives. 2 funções com nomes/comentários similares
238
- mas implementações diferentes (`fetchUser` em backend vs
239
- `fetchUser` em frontend service worker — completamente
240
- diferentes mas embeddings 0.88).
241
-
242
- CERTO: semantic search é PRIMEIRA passada. Cluster proposto vai para
243
- review humano. Aceita/rejeita por cluster. Extract somente
244
- após aprovação.
245
- ```
246
-
247
- ### ANTI: extract para "future-proofing" speculative
248
-
249
- ```text
250
- ANTI: "essa função vai ser usada em mais lugares no futuro, vou
251
- extract agora".
252
-
253
- PROBLEMA: YAGNI. Abstração premature gera função vazia /
254
- parametrizada demais. Quando o "futuro" chega, abstração
255
- não cabe.
256
-
257
- CERTO: 3 usos REAIS = extract. Antes disso, código inline com TODO
258
- é melhor (aceita duplicação temporária; extract quando 3º uso
259
- aparece).
260
- ```
261
-
262
- ## Verificação
263
-
264
- 1. Detecção rodada (sintática + semântica se IA disponível)
265
- 2. Clusters com 3+ ocorrências reportados
266
- 3. Cada cluster validado por humano (não auto-extract)
267
- 4. Characterization de cada ocorrência ANTES de extract
268
- 5. Outputs idênticos confirmados (OR diferenças documentadas)
269
- 6. Nome canônico escolhido (resonates com todas N localizações)
270
- 7. 1 commit por substituição (revertível individual)
271
- 8. Tests verdes a cada commit
272
-
273
- ---
274
-
275
- ## Ver também
276
-
277
- - [`_shared-legacy/glossary.md`](../_shared-legacy/glossary.md) — vocabulário (shotgun surgery, effect-narrowing)
278
- - [`legacy-effect-analysis`](../legacy-effect-analysis/SKILL.md) — sketch detecta shotgun (mesma mudança em N lugares)
279
- - [`legacy-extract-class`](../legacy-extract-class/SKILL.md) — quando shotgun é cluster grande, extract class em vez de extract method
280
- - [`legacy-monster-methods`](../legacy-monster-methods/SKILL.md) — extract method canônico (precursor de extract class)
281
- - [`legacy-characterization-tests`](../legacy-characterization-tests/SKILL.md) — characterize ANTES de extract para confirmar comportamento idêntico
282
- - [`supabase-pgvector-rag`](../supabase-pgvector-rag/SKILL.md) (v1.8) — pgvector self-hosted para embeddings sem dep externa
283
- - [`shotgun-surgery-detector`](../../agents/shotgun-surgery-detector.md) — agent que automatiza detecção semântica
284
-
285
- *Material-fonte: Working Effectively with Legacy Code — Feathers, 2004 — Cap 21: "I'm Changing the Same Code All Over the Place".*
286
- *Modernização (2026):* Detecção semântica via embeddings (text-embedding-3-small ou pgvector) — sem precedente em 2004; ML maduro só após 2018.
1
+ ---
2
+ name: legacy-shotgun-surgery
3
+ description: Use ao detectar mesma mudança espalhada em N lugares (cap 21 Feathers) — extract before modify para reduzir change point. Modernização 2026…
4
+ ---
5
+
6
+ # Legacy — Shotgun Surgery
7
+
8
+ ## Quando usar
9
+
10
+ LLM carrega esta skill quando user descobre que uma mudança requer edição em múltiplos pontos do codebase. Trigger phrases:
11
+
12
+ - "tenho que mudar isso em 5 lugares"
13
+ - "shotgun surgery", "cirurgia espalhada"
14
+ - "duplicação de código", "code duplication"
15
+ - "extrair função", "extract method para reduzir duplicação"
16
+ - "esses 3 lugares fazem a mesma coisa"
17
+ - "cap 21 Feathers"
18
+ - "semantic duplication", "duplicação semântica"
19
+
20
+ ## Regras absolutas
21
+
22
+ - **Extract first, modify second.** Antes de mudar, EXTRAIR para 1 lugar. Depois mudar 1 lugar. Reduz N change points para 1.
23
+ - **Detectar duplicação tem 2 níveis:**
24
+ - **Sintática (regex):** mesmo identifier, mesma estrutura. Detect via grep/AST.
25
+ - **Semântica (embeddings — modernização 2026):** intenção igual, implementação diferente. Detect via embedding similarity.
26
+ - **Threshold canônico:** 3+ ocorrências da MESMA lógica = candidato. 2 ocorrências = "regra do dois" (DRY); 3 = sinal forte; 4+ = veto-extract-imediato.
27
+ - **Effect-narrowing precede modify.** Mudar em 5 lugares ÉE shotgun surgery. Mudar em 1 lugar não é. Pré-trabalho: extract.
28
+ - **Modernização semantic search:** modelos de embedding pequenos (`text-embedding-3-small` da OpenAI, `bge-small-en` open) custam < $0.01 para projeto inteiro. Threshold típico 0.85 cosine similarity = duplicação semântica forte.
29
+ - **Não extract se única ocorrência é "candidata".** Extract sob demanda. Sem 3 ocorrências reais, abstração é especulativa (YAGNI).
30
+ - **Extract preserves comportamento.** Cada chamada deve ter resultado IDÊNTICO ao código inline original. Bug preservation aplicável (veja skill characterization).
31
+
32
+ ## Patterns canônicos
33
+
34
+ ### Pattern 1: Detecção sintática (Feathers original cap 21)
35
+
36
+ ```bash
37
+ # PT-BR: padrões sintáticos canônicos
38
+
39
+ # Functions/methods com nome similar
40
+ grep -rE "function (compute|calc)Total" --include="*.ts" .
41
+ grep -rE "(compute|calc)Total" --include="*.ts" -A 5 .
42
+
43
+ # Bloco de código repetido (heurística)
44
+ # Usar `jscpd` (Copy/Paste Detector) ou `simian` para JS/TS/Python
45
+ npx jscpd --min-lines 5 --threshold 0 --reporters json src/
46
+
47
+ # AST-level (mais preciso) — usar `tree-sitter` queries
48
+ # Rust/JS — encontrar all calls com mesmo padrão
49
+ ast-grep --pattern 'orderTotal($O) + shippingCost($O) + tax($O)' src/
50
+
51
+ # git log — quando mesma mudança aparece em múltiplos commits
52
+ git log --since=6.months --pretty=format: --name-only | sort | uniq -c | sort -rn | head -20
53
+ # arquivos co-modificados juntos = candidatos a shotgun
54
+ ```
55
+
56
+ ### Pattern 2: Detecção semântica (modernização 2026 via embeddings)
57
+
58
+ ```ts
59
+ // PT-BR: workflow de detecção semântica de duplicação
60
+ // (sem precedente em 2004 — embedding APIs maduras só em 2023+)
61
+
62
+ import { OpenAI } from 'openai'
63
+
64
+ const client = new OpenAI({ apiKey: Deno.env.get('OPENAI_API_KEY') })
65
+
66
+ async function detectSemanticDuplicates(codeBlocks: CodeBlock[]) {
67
+ // Step 1: gerar embedding por bloco
68
+ const embeddings = await Promise.all(
69
+ codeBlocks.map(async (block) => ({
70
+ block,
71
+ embedding: (await client.embeddings.create({
72
+ model: 'text-embedding-3-small',
73
+ input: extractIntent(block), // function signature + comments + body summary
74
+ })).data[0].embedding,
75
+ }))
76
+ )
77
+
78
+ // Step 2: clusterizar por similaridade
79
+ const clusters: CodeBlock[][] = []
80
+ for (const item of embeddings) {
81
+ let assigned = false
82
+ for (const cluster of clusters) {
83
+ const sim = cosineSim(item.embedding, cluster[0].embedding)
84
+ if (sim >= 0.85) { // threshold canônico
85
+ cluster.push(item.block)
86
+ assigned = true
87
+ break
88
+ }
89
+ }
90
+ if (!assigned) clusters.push([item.block])
91
+ }
92
+
93
+ // Step 3: filtrar clusters com 3+ membros (regra do três)
94
+ return clusters.filter(c => c.length >= 3)
95
+ }
96
+
97
+ function extractIntent(block: CodeBlock): string {
98
+ // intent = function signature + leading comment + first 3 lines of body
99
+ return [
100
+ block.signature,
101
+ block.leadingComment ?? '',
102
+ block.body.slice(0, 3).join('\n'),
103
+ ].join('\n')
104
+ }
105
+
106
+ function cosineSim(a: number[], b: number[]): number {
107
+ let dot = 0, na = 0, nb = 0
108
+ for (let i = 0; i < a.length; i++) {
109
+ dot += a[i] * b[i]
110
+ na += a[i] ** 2
111
+ nb += b[i] ** 2
112
+ }
113
+ return dot / (Math.sqrt(na) * Math.sqrt(nb))
114
+ }
115
+ ```
116
+
117
+ **Insight:** semantic search detecta:
118
+ - `computeTotalCents` em arquivo A
119
+ - `calc_total_in_cents` em arquivo B
120
+ - `getOrderTotalInPennies` em arquivo C
121
+ - 3 implementações diferentes mas mesma intenção. Regex puro não pega.
122
+
123
+ **Custo:** 1000 blocos × text-embedding-3-small ≈ $0.02. Praticamente grátis.
124
+
125
+ **Cross-suite:** `pgvector` self-hosted (skill `supabase-pgvector-rag` v1.8) pode hospedar embeddings sem dep externa.
126
+
127
+ ### Pattern 3: Workflow extract-before-modify
128
+
129
+ ```text
130
+ 1. Detectar shotgun surgery (sintática OR semântica)
131
+ 2. CONFIRMAR comportamento idêntico via characterization tests
132
+ - Capturar output de CADA ocorrência com mesmo input
133
+ - Outputs devem ser idênticos (ou docs explicar diferenças intencionais)
134
+ 3. EXTRACT — criar função/classe única
135
+ - Nome canônico (busca consenso: pelo menos 1 dos N nomes existentes está OK)
136
+ - Localização canônica (módulo de utils, ou domain layer adequada)
137
+ 4. SUBSTITUIR cada ocorrência por chamada
138
+ - 1 commit por substituição
139
+ - Tests verdes a cada commit
140
+ 5. AGORA mudança é em 1 lugar
141
+ 6. Modify
142
+ ```
143
+
144
+ ### Pattern 4: Heurística de "vale extract?"
145
+
146
+ Trade-off entre custo de extract e benefício futuro:
147
+
148
+ | Ocorrências | Tamanho cada | Vale extract? |
149
+ |---|---|---|
150
+ | 2 | 5 linhas | NÃO — Rule of 2 (DRY pode ser violado uma vez) |
151
+ | 2 | 30+ linhas | TALVEZ — depende de churn esperado |
152
+ | 3 | 5+ linhas | SIM — Rule of 3 |
153
+ | 3+ | 10+ linhas | SIM forte |
154
+ | N | 1-2 linhas | TALVEZ — ganho marginal vs noise de função tiny |
155
+ | N | 50+ linhas | SIM máximo (extract para classe própria) |
156
+
157
+ ### Pattern 5: Naming canônico
158
+
159
+ Função extraída precisa de nome que "ressoa" com TODAS as ocorrências originais. Estratégia:
160
+
161
+ ```text
162
+ 1. Listar os N nomes (ou comments) das ocorrências:
163
+ - "computeTotalCents"
164
+ - "calcOrderTotal"
165
+ - "getCartTotalInCents"
166
+
167
+ 2. Encontrar o COMUM SEMÂNTICO:
168
+ - "Total" presente em todos
169
+ - "Cents" / "Cents" / "InCents" — variantes
170
+ - Order/Cart — contexto chamador, não nome interno
171
+
172
+ 3. Nome canônico: `computeOrderTotalCents` (verb + entity + unit explicit)
173
+
174
+ 4. Documentar deprecation comments nas N localizações que usavam nomes diferentes.
175
+ ```
176
+
177
+ ### Pattern 6: Cross-module shotgun (mais difícil)
178
+
179
+ Quando duplicação está em camadas diferentes (e.g., 1 backend + 2 frontends):
180
+
181
+ ```text
182
+ - Não extract para "shared module" sem pensar em deploy/release coupling
183
+ - Considerar: API contract centralizada (OpenAPI) + geração de types
184
+ - Considerar: SDK comum (TypeScript types compartilhados via package)
185
+ - Última resort: aceitar duplicação cross-stack (custo de unificação > benefício)
186
+ ```
187
+
188
+ ## Anti-patterns
189
+
190
+ ### ANTI: extract sem characterization
191
+
192
+ ```text
193
+ ANTI: detectou duplicação, extract direto, push.
194
+
195
+ PROBLEMA: as 3 ocorrências podem ter VARIAÇÕES sutis (1 retorna em
196
+ rounding diferente, outra trata null diferentemente). Sem
197
+ characterization, extract uniformiza E quebra a variante.
198
+
199
+ CERTO: characterize cada ocorrência ANTES de extract. Outputs
200
+ idênticos? extract OK. Outputs diferentes? document, decide se
201
+ quer uniformizar (com aceite de mudança comportamental) OR
202
+ deixe múltiplas (porque diferenças são intencionais).
203
+ ```
204
+
205
+ ### ANTI: nome que só funciona em 1 das N localizações
206
+
207
+ ```text
208
+ ANTI: extracted como "calcCartTotal" — mas era usado em 3 contextos:
209
+ Cart, Order, Quote.
210
+
211
+ PROBLEMA: callers de Order chamando calcCartTotal lê estranho. Reviewer
212
+ confundido. Refactor seguinte (rename) gera mais churn.
213
+
214
+ CERTO: nome neutro / contextualizado por parâmetro. `calcTotal(items)`
215
+ em vez de `calcCartTotal()`. Caller informa contexto via input,
216
+ extracted function é generic.
217
+ ```
218
+
219
+ ### ANTI: detectar via line-level diff sem AST
220
+
221
+ ```text
222
+ ANTI: jscpd com min-tokens 5. Reporta 200 "duplicações" — maioria
223
+ false positives (assertions de testes, imports, boilerplate).
224
+
225
+ PROBLEMA: signal/noise ruim. Equipe ignora reports.
226
+
227
+ CERTO: min-lines ≥ 10 + min-tokens ≥ 50 + ignore tests/. AST-based
228
+ (ast-grep, semgrep) é melhor — pega "função com mesma estrutura"
229
+ não "linhas idênticas".
230
+ ```
231
+
232
+ ### ANTI: semantic search sem revisão humana
233
+
234
+ ```text
235
+ ANTI: embedding similarity > 0.85 → automatically suggest extract.
236
+
237
+ PROBLEMA: false positives. 2 funções com nomes/comentários similares
238
+ mas implementações diferentes (`fetchUser` em backend vs
239
+ `fetchUser` em frontend service worker — completamente
240
+ diferentes mas embeddings 0.88).
241
+
242
+ CERTO: semantic search é PRIMEIRA passada. Cluster proposto vai para
243
+ review humano. Aceita/rejeita por cluster. Extract somente
244
+ após aprovação.
245
+ ```
246
+
247
+ ### ANTI: extract para "future-proofing" speculative
248
+
249
+ ```text
250
+ ANTI: "essa função vai ser usada em mais lugares no futuro, vou
251
+ extract agora".
252
+
253
+ PROBLEMA: YAGNI. Abstração premature gera função vazia /
254
+ parametrizada demais. Quando o "futuro" chega, abstração
255
+ não cabe.
256
+
257
+ CERTO: 3 usos REAIS = extract. Antes disso, código inline com TODO
258
+ é melhor (aceita duplicação temporária; extract quando 3º uso
259
+ aparece).
260
+ ```
261
+
262
+ ## Verificação
263
+
264
+ 1. Detecção rodada (sintática + semântica se IA disponível)
265
+ 2. Clusters com 3+ ocorrências reportados
266
+ 3. Cada cluster validado por humano (não auto-extract)
267
+ 4. Characterization de cada ocorrência ANTES de extract
268
+ 5. Outputs idênticos confirmados (OR diferenças documentadas)
269
+ 6. Nome canônico escolhido (resonates com todas N localizações)
270
+ 7. 1 commit por substituição (revertível individual)
271
+ 8. Tests verdes a cada commit
272
+
273
+ ---
274
+
275
+ ## Ver também
276
+
277
+ - [`_shared-legacy/glossary.md`](../_shared-legacy/glossary.md) — vocabulário (shotgun surgery, effect-narrowing)
278
+ - [`legacy-effect-analysis`](../legacy-effect-analysis/SKILL.md) — sketch detecta shotgun (mesma mudança em N lugares)
279
+ - [`legacy-extract-class`](../legacy-extract-class/SKILL.md) — quando shotgun é cluster grande, extract class em vez de extract method
280
+ - [`legacy-monster-methods`](../legacy-monster-methods/SKILL.md) — extract method canônico (precursor de extract class)
281
+ - [`legacy-characterization-tests`](../legacy-characterization-tests/SKILL.md) — characterize ANTES de extract para confirmar comportamento idêntico
282
+ - [`supabase-pgvector-rag`](../supabase-pgvector-rag/SKILL.md) (v1.8) — pgvector self-hosted para embeddings sem dep externa
283
+ - [`shotgun-surgery-detector`](../../agents/shotgun-surgery-detector.md) — agent que automatiza detecção semântica
284
+
285
+ *Material-fonte: Working Effectively with Legacy Code — Feathers, 2004 — Cap 21: "I'm Changing the Same Code All Over the Place".*
286
+ *Modernização (2026):* Detecção semântica via embeddings (text-embedding-3-small ou pgvector) — sem precedente em 2004; ML maduro só após 2018.