@luanpdd/kit-mcp 1.30.2 → 1.32.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 (365) 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/COMPATIBILITY.md +5 -0
  6. package/kit/README.md +76 -76
  7. package/kit/agents/advisor-researcher.md +107 -106
  8. package/kit/agents/ai-mutation-tester.md +1 -0
  9. package/kit/agents/assumptions-analyzer.md +108 -107
  10. package/kit/agents/audit-log-implementer.md +314 -313
  11. package/kit/agents/auditor-consistencia-isolamento.md +414 -413
  12. package/kit/agents/b2b-saas-architect.md +157 -156
  13. package/kit/agents/burn-rate-forecaster.md +1 -0
  14. package/kit/agents/cascading-failures-auditor.md +299 -298
  15. package/kit/agents/codebase-mapper.md +769 -768
  16. package/kit/agents/crm-pipeline-implementer.md +257 -256
  17. package/kit/agents/debugger.md +814 -813
  18. package/kit/agents/detector-tenant-quente.md +338 -337
  19. package/kit/agents/evolution-go-integrator.md +201 -200
  20. package/kit/agents/example-reviewer.md +22 -21
  21. package/kit/agents/executor.md +565 -564
  22. package/kit/agents/golden-signals-instrumenter.md +1 -0
  23. package/kit/agents/incident-investigator.md +1 -0
  24. package/kit/agents/integration-checker.md +201 -200
  25. package/kit/agents/invite-flow-implementer.md +190 -189
  26. package/kit/agents/legacy-characterizer.md +369 -368
  27. package/kit/agents/lgpd-compliance-auditor.md +296 -295
  28. package/kit/agents/load-shedding-instrumenter.md +1 -0
  29. package/kit/agents/multi-tenant-isolation-auditor.md +254 -253
  30. package/kit/agents/multi-tenant-rls-writer.md +341 -340
  31. package/kit/agents/nyquist-auditor.md +179 -178
  32. package/kit/agents/observability-coverage-auditor.md +316 -315
  33. package/kit/agents/observability-instrumenter.md +1 -0
  34. package/kit/agents/omm-auditor.md +1 -0
  35. package/kit/agents/org-onboarding-implementer.md +224 -223
  36. package/kit/agents/payload-capture-instrumenter.md +274 -273
  37. package/kit/agents/phase-researcher.md +697 -696
  38. package/kit/agents/plan-checker.md +273 -272
  39. package/kit/agents/planner.md +923 -922
  40. package/kit/agents/postmortem-writer.md +1 -0
  41. package/kit/agents/project-researcher.md +653 -652
  42. package/kit/agents/prr-conductor.md +1 -0
  43. package/kit/agents/refactor-safety-auditor.md +405 -404
  44. package/kit/agents/release-pipeline-auditor.md +1 -0
  45. package/kit/agents/research-synthesizer.md +246 -245
  46. package/kit/agents/roadmapper.md +678 -677
  47. package/kit/agents/schema-checker.md +1 -0
  48. package/kit/agents/seam-finder.md +360 -359
  49. package/kit/agents/shotgun-surgery-detector.md +350 -349
  50. package/kit/agents/slo-engineer.md +1 -0
  51. package/kit/agents/storytelling-analyst.md +1 -0
  52. package/kit/agents/supabase-architect.md +1 -0
  53. package/kit/agents/supabase-auth-bootstrapper.md +16 -1
  54. package/kit/agents/supabase-auth-hook-writer.md +418 -0
  55. package/kit/agents/supabase-branching-architect.md +563 -562
  56. package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -777
  57. package/kit/agents/supabase-column-privileges-writer.md +400 -399
  58. package/kit/agents/supabase-edge-fn-tester.md +2 -1
  59. package/kit/agents/supabase-edge-fn-writer.md +2 -1
  60. package/kit/agents/supabase-mfa-implementer.md +439 -0
  61. package/kit/agents/supabase-migration-writer.md +386 -385
  62. package/kit/agents/supabase-oauth-server-implementer.md +507 -0
  63. package/kit/agents/supabase-rbac-implementer.md +393 -392
  64. package/kit/agents/supabase-realtime-implementer.md +364 -363
  65. package/kit/agents/supabase-rls-hardener.md +522 -521
  66. package/kit/agents/supabase-rls-writer.md +324 -323
  67. package/kit/agents/supabase-roles-implementer.md +356 -355
  68. package/kit/agents/supabase-social-auth-implementer.md +451 -0
  69. package/kit/agents/supabase-sso-saml-architect.md +549 -0
  70. package/kit/agents/supabase-storage-implementer.md +1 -0
  71. package/kit/agents/super-admin-implementer.md +282 -281
  72. package/kit/agents/toil-auditor.md +1 -0
  73. package/kit/agents/ui-auditor.md +438 -437
  74. package/kit/agents/ui-checker.md +303 -302
  75. package/kit/agents/ui-researcher.md +356 -355
  76. package/kit/agents/user-profiler.md +176 -175
  77. package/kit/agents/validador-evolucao-schema.md +336 -335
  78. package/kit/agents/verifier.md +729 -728
  79. package/kit/commands/adicionar-backlog.md +75 -75
  80. package/kit/commands/adicionar-fase.md +42 -42
  81. package/kit/commands/adicionar-tarefa.md +45 -45
  82. package/kit/commands/adicionar-testes.md +41 -41
  83. package/kit/commands/ajuda.md +21 -21
  84. package/kit/commands/atualizar.md +37 -37
  85. package/kit/commands/auditar-cascading.md +111 -111
  86. package/kit/commands/auditar-marco.md +179 -179
  87. package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
  88. package/kit/commands/auditar-refactor.md +219 -219
  89. package/kit/commands/auditar-release.md +109 -109
  90. package/kit/commands/auditar-uat.md +23 -23
  91. package/kit/commands/autonomo.md +40 -40
  92. package/kit/commands/branch-pr.md +24 -24
  93. package/kit/commands/burn-rate-status.md +408 -408
  94. package/kit/commands/capturar-payloads.md +193 -193
  95. package/kit/commands/caracterizar.md +212 -212
  96. package/kit/commands/concluir-marco.md +247 -247
  97. package/kit/commands/configuracoes.md +36 -36
  98. package/kit/commands/dados-distribuidos.md +188 -188
  99. package/kit/commands/definir-perfil.md +10 -10
  100. package/kit/commands/depurar.md +190 -190
  101. package/kit/commands/detectar-duplicacao.md +197 -197
  102. package/kit/commands/discutir-fase.md +131 -131
  103. package/kit/commands/encontrar-seams.md +136 -136
  104. package/kit/commands/entrar-discord.md +17 -17
  105. package/kit/commands/estatisticas.md +18 -18
  106. package/kit/commands/example-greeting.md +33 -33
  107. package/kit/commands/executar-fase.md +58 -58
  108. package/kit/commands/expresso.md +56 -56
  109. package/kit/commands/fase-ui.md +34 -34
  110. package/kit/commands/fazer.md +57 -57
  111. package/kit/commands/fio.md +125 -125
  112. package/kit/commands/fluxos-trabalho.md +64 -64
  113. package/kit/commands/forense.md +176 -176
  114. package/kit/commands/gerenciador.md +38 -38
  115. package/kit/commands/inserir-fase.md +31 -31
  116. package/kit/commands/legacy.md +263 -263
  117. package/kit/commands/limpeza.md +17 -17
  118. package/kit/commands/listar-hipoteses-fase.md +45 -45
  119. package/kit/commands/listar-workspaces.md +18 -18
  120. package/kit/commands/load-shedding.md +117 -117
  121. package/kit/commands/mapear-codebase.md +70 -70
  122. package/kit/commands/multi-tenant.md +163 -163
  123. package/kit/commands/nota.md +33 -33
  124. package/kit/commands/novo-marco.md +43 -43
  125. package/kit/commands/novo-projeto.md +41 -41
  126. package/kit/commands/novo-workspace.md +43 -43
  127. package/kit/commands/pausar-trabalho.md +37 -37
  128. package/kit/commands/perfil-usuario.md +45 -45
  129. package/kit/commands/pesquisar-fase.md +195 -195
  130. package/kit/commands/planejar-fase.md +67 -67
  131. package/kit/commands/planejar-lacunas.md +33 -33
  132. package/kit/commands/plantar-ideia.md +25 -25
  133. package/kit/commands/progresso.md +24 -24
  134. package/kit/commands/proximo.md +30 -30
  135. package/kit/commands/publicar.md +490 -490
  136. package/kit/commands/rapido.md +35 -35
  137. package/kit/commands/reaplicar-patches.md +124 -124
  138. package/kit/commands/refactor-seguro.md +321 -321
  139. package/kit/commands/relatorio-sessao.md +19 -19
  140. package/kit/commands/remover-fase.md +31 -31
  141. package/kit/commands/remover-workspace.md +26 -26
  142. package/kit/commands/resumo-marco.md +50 -50
  143. package/kit/commands/retomar-trabalho.md +40 -40
  144. package/kit/commands/revisar-backlog.md +60 -60
  145. package/kit/commands/revisar-ui.md +32 -32
  146. package/kit/commands/revisar.md +37 -37
  147. package/kit/commands/saude.md +21 -21
  148. package/kit/commands/setup-notion.md +93 -93
  149. package/kit/commands/storytelling.md +179 -179
  150. package/kit/commands/supabase.md +21 -1
  151. package/kit/commands/sync-main.md +68 -68
  152. package/kit/commands/validar-fase.md +35 -35
  153. package/kit/commands/verificar-tarefas.md +44 -44
  154. package/kit/commands/verificar-trabalho.md +64 -64
  155. package/kit/file-manifest.json +100 -84
  156. package/kit/framework/bin/lib/commands.cjs +959 -959
  157. package/kit/framework/bin/lib/config.cjs +442 -442
  158. package/kit/framework/bin/lib/core.cjs +1230 -1230
  159. package/kit/framework/bin/lib/frontmatter.cjs +336 -336
  160. package/kit/framework/bin/lib/init.cjs +1442 -1442
  161. package/kit/framework/bin/lib/milestone.cjs +252 -252
  162. package/kit/framework/bin/lib/model-profiles.cjs +68 -68
  163. package/kit/framework/bin/lib/phase.cjs +888 -888
  164. package/kit/framework/bin/lib/profile-output.cjs +952 -952
  165. package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
  166. package/kit/framework/bin/lib/roadmap.cjs +329 -329
  167. package/kit/framework/bin/lib/security.cjs +382 -382
  168. package/kit/framework/bin/lib/state.cjs +1031 -1031
  169. package/kit/framework/bin/lib/template.cjs +222 -222
  170. package/kit/framework/bin/lib/uat.cjs +282 -282
  171. package/kit/framework/bin/lib/verify.cjs +888 -888
  172. package/kit/framework/bin/lib/workstream.cjs +491 -491
  173. package/kit/framework/bin/tools.cjs +918 -918
  174. package/kit/framework/commands/workstreams.md +63 -63
  175. package/kit/framework/references/checkpoints.md +778 -778
  176. package/kit/framework/references/continuation-format.md +249 -249
  177. package/kit/framework/references/decimal-phase-calculation.md +64 -64
  178. package/kit/framework/references/git-integration.md +295 -295
  179. package/kit/framework/references/git-planning-commit.md +38 -38
  180. package/kit/framework/references/model-profile-resolution.md +36 -36
  181. package/kit/framework/references/model-profiles.md +139 -139
  182. package/kit/framework/references/phase-argument-parsing.md +61 -61
  183. package/kit/framework/references/planning-config.md +202 -202
  184. package/kit/framework/references/questioning.md +162 -162
  185. package/kit/framework/references/tdd.md +263 -263
  186. package/kit/framework/references/ui-brand.md +160 -160
  187. package/kit/framework/references/user-profiling.md +657 -657
  188. package/kit/framework/references/verification-patterns.md +612 -612
  189. package/kit/framework/references/workstream-flag.md +58 -58
  190. package/kit/framework/templates/DEBUG.md +164 -164
  191. package/kit/framework/templates/UAT.md +265 -265
  192. package/kit/framework/templates/UI-SPEC.md +100 -100
  193. package/kit/framework/templates/VALIDATION.md +76 -76
  194. package/kit/framework/templates/claude-md.md +122 -122
  195. package/kit/framework/templates/codebase/architecture.md +185 -185
  196. package/kit/framework/templates/codebase/concerns.md +205 -205
  197. package/kit/framework/templates/codebase/conventions.md +204 -204
  198. package/kit/framework/templates/codebase/integrations.md +192 -192
  199. package/kit/framework/templates/codebase/stack.md +158 -158
  200. package/kit/framework/templates/codebase/structure.md +199 -199
  201. package/kit/framework/templates/codebase/testing.md +301 -301
  202. package/kit/framework/templates/config.json +44 -44
  203. package/kit/framework/templates/context.md +352 -352
  204. package/kit/framework/templates/continue-here.md +78 -78
  205. package/kit/framework/templates/copilot-instructions.md +7 -7
  206. package/kit/framework/templates/debug-subagent-prompt.md +91 -91
  207. package/kit/framework/templates/dev-preferences.md +20 -20
  208. package/kit/framework/templates/discovery.md +146 -146
  209. package/kit/framework/templates/discussion-log.md +63 -63
  210. package/kit/framework/templates/milestone-archive.md +123 -123
  211. package/kit/framework/templates/milestone.md +115 -115
  212. package/kit/framework/templates/phase-prompt.md +610 -610
  213. package/kit/framework/templates/planner-subagent-prompt.md +117 -117
  214. package/kit/framework/templates/project.md +186 -186
  215. package/kit/framework/templates/requirements.md +231 -231
  216. package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
  217. package/kit/framework/templates/research-project/FEATURES.md +147 -147
  218. package/kit/framework/templates/research-project/PITFALLS.md +200 -200
  219. package/kit/framework/templates/research-project/STACK.md +120 -120
  220. package/kit/framework/templates/research-project/SUMMARY.md +170 -170
  221. package/kit/framework/templates/research.md +419 -419
  222. package/kit/framework/templates/retrospective.md +54 -54
  223. package/kit/framework/templates/roadmap.md +202 -202
  224. package/kit/framework/templates/state.md +176 -176
  225. package/kit/framework/templates/summary-complex.md +59 -59
  226. package/kit/framework/templates/summary-minimal.md +41 -41
  227. package/kit/framework/templates/summary-standard.md +48 -48
  228. package/kit/framework/templates/summary.md +209 -209
  229. package/kit/framework/templates/user-profile.md +146 -146
  230. package/kit/framework/templates/user-setup.md +256 -256
  231. package/kit/framework/templates/verification-report.md +258 -258
  232. package/kit/framework/workflows/add-phase.md +112 -112
  233. package/kit/framework/workflows/add-tests.md +351 -351
  234. package/kit/framework/workflows/add-todo.md +158 -158
  235. package/kit/framework/workflows/audit-milestone.md +340 -340
  236. package/kit/framework/workflows/audit-uat.md +109 -109
  237. package/kit/framework/workflows/autonomous.md +891 -891
  238. package/kit/framework/workflows/check-todos.md +177 -177
  239. package/kit/framework/workflows/cleanup.md +152 -152
  240. package/kit/framework/workflows/complete-milestone.md +696 -696
  241. package/kit/framework/workflows/diagnose-issues.md +231 -231
  242. package/kit/framework/workflows/discovery-phase.md +289 -289
  243. package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
  244. package/kit/framework/workflows/discuss-phase.md +784 -784
  245. package/kit/framework/workflows/do.md +104 -104
  246. package/kit/framework/workflows/execute-phase.md +838 -838
  247. package/kit/framework/workflows/execute-plan.md +510 -510
  248. package/kit/framework/workflows/fast.md +102 -102
  249. package/kit/framework/workflows/forensics.md +265 -265
  250. package/kit/framework/workflows/health.md +181 -181
  251. package/kit/framework/workflows/help.md +619 -619
  252. package/kit/framework/workflows/insert-phase.md +130 -130
  253. package/kit/framework/workflows/list-phase-assumptions.md +178 -178
  254. package/kit/framework/workflows/list-workspaces.md +56 -56
  255. package/kit/framework/workflows/manager.md +362 -362
  256. package/kit/framework/workflows/map-codebase.md +377 -377
  257. package/kit/framework/workflows/milestone-summary.md +223 -223
  258. package/kit/framework/workflows/new-milestone.md +486 -486
  259. package/kit/framework/workflows/new-project.md +1159 -1159
  260. package/kit/framework/workflows/new-workspace.md +237 -237
  261. package/kit/framework/workflows/next.md +97 -97
  262. package/kit/framework/workflows/node-repair.md +92 -92
  263. package/kit/framework/workflows/note.md +156 -156
  264. package/kit/framework/workflows/pause-work.md +176 -176
  265. package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
  266. package/kit/framework/workflows/plan-phase.md +765 -765
  267. package/kit/framework/workflows/plant-seed.md +169 -169
  268. package/kit/framework/workflows/pr-branch.md +129 -129
  269. package/kit/framework/workflows/profile-user.md +450 -450
  270. package/kit/framework/workflows/progress.md +507 -507
  271. package/kit/framework/workflows/quick.md +757 -757
  272. package/kit/framework/workflows/remove-phase.md +155 -155
  273. package/kit/framework/workflows/remove-workspace.md +90 -90
  274. package/kit/framework/workflows/research-phase.md +82 -82
  275. package/kit/framework/workflows/resume-project.md +326 -326
  276. package/kit/framework/workflows/review.md +228 -228
  277. package/kit/framework/workflows/session-report.md +146 -146
  278. package/kit/framework/workflows/settings.md +283 -283
  279. package/kit/framework/workflows/ship.md +228 -228
  280. package/kit/framework/workflows/stats.md +60 -60
  281. package/kit/framework/workflows/transition.md +671 -671
  282. package/kit/framework/workflows/ui-phase.md +302 -302
  283. package/kit/framework/workflows/ui-review.md +165 -165
  284. package/kit/framework/workflows/update.md +323 -323
  285. package/kit/framework/workflows/validate-phase.md +174 -174
  286. package/kit/framework/workflows/verify-phase.md +252 -252
  287. package/kit/framework/workflows/verify-work.md +637 -637
  288. package/kit/hooks/check-update.js +118 -118
  289. package/kit/hooks/context-monitor.js +163 -163
  290. package/kit/hooks/kit-attribution-reminder.cjs +29 -50
  291. package/kit/hooks/kit-router.cjs +137 -0
  292. package/kit/hooks/prompt-guard.js +103 -103
  293. package/kit/hooks/statusline.js +125 -125
  294. package/kit/hooks/workflow-guard.js +101 -101
  295. package/kit/settings.json +45 -45
  296. package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
  297. package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
  298. package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
  299. package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
  300. package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
  301. package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
  302. package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
  303. package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
  304. package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
  305. package/kit/skills/example-skill/SKILL.md +42 -42
  306. package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
  307. package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
  308. package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
  309. package/kit/skills/legacy-extract-class/SKILL.md +203 -203
  310. package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
  311. package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
  312. package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
  313. package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
  314. package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
  315. package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
  316. package/kit/skills/member-invite-flow/SKILL.md +305 -305
  317. package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
  318. package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
  319. package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
  320. package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
  321. package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
  322. package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
  323. package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
  324. package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
  325. package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
  326. package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
  327. package/kit/skills/supabase-auth-hardening/SKILL.md +674 -0
  328. package/kit/skills/supabase-auth-hooks/SKILL.md +875 -0
  329. package/kit/skills/supabase-auth-methods/SKILL.md +486 -0
  330. package/kit/skills/supabase-auth-sessions/SKILL.md +579 -0
  331. package/kit/skills/supabase-auth-ssr/SKILL.md +60 -14
  332. package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
  333. package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
  334. package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
  335. package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
  336. package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
  337. package/kit/skills/supabase-edge-functions/SKILL.md +1 -1
  338. package/kit/skills/supabase-edge-functions-auth/SKILL.md +1 -1
  339. package/kit/skills/supabase-edge-functions-limits/SKILL.md +1 -1
  340. package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +1 -1
  341. package/kit/skills/supabase-edge-functions-testing/SKILL.md +1 -1
  342. package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +1 -1
  343. package/kit/skills/supabase-enterprise-sso-saml/SKILL.md +545 -0
  344. package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -0
  345. package/kit/skills/supabase-mfa/SKILL.md +488 -0
  346. package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
  347. package/kit/skills/supabase-migrations/SKILL.md +297 -297
  348. package/kit/skills/supabase-oauth-server/SKILL.md +537 -0
  349. package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
  350. package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
  351. package/kit/skills/supabase-realtime/SKILL.md +460 -460
  352. package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
  353. package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
  354. package/kit/skills/supabase-social-oauth/SKILL.md +480 -0
  355. package/kit/skills/supabase-third-party-auth/SKILL.md +450 -0
  356. package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
  357. package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
  358. package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
  359. package/package.json +1 -1
  360. package/src/core/kit.js +216 -216
  361. package/src/core/reflect.js +247 -247
  362. package/src/core/reverse-sync.js +372 -372
  363. package/src/core/sync.js +437 -418
  364. package/src/core/watch.js +121 -121
  365. package/src/mcp-server/index.js +794 -746
@@ -1,331 +1,331 @@
1
- ---
2
- name: legacy-effect-analysis
3
- description: Use ao decidir quais testes escrever em código sem testes — effect sketch (cap 11-12 Feathers) rastreia propagação de efeitos do change point para inflection/pinch points onde 1 teste cob…
4
- ---
5
-
6
- # Legacy — Effect Analysis
7
-
8
- ## Quando usar
9
-
10
- LLM carrega esta skill quando user precisa decidir QUAIS testes escrever em código legado. Trigger phrases:
11
-
12
- - "que tests preciso escrever para essa mudança?"
13
- - "como sei que cobri tudo?"
14
- - "effect sketch", "rastrear efeitos"
15
- - "cap 11 Feathers", "cap 12 Feathers"
16
- - "inflection point", "pinch point", "ponto de interceptação"
17
- - "muitas mudanças na mesma área"
18
- - "efeito propaga", "ripple effect"
19
-
20
- Carrega entre `legacy-seams-and-test-harness` (já tenho seam) e `legacy-characterization-tests` (vou escrever quais testes?). Resposta: testes nos pinch points.
21
-
22
- ## Regras absolutas
23
-
24
- - **Effect = qualquer mudança observável após chamar o código.** 4 vetores: return value, parâmetros mutados, globals/state estático, side effects via colaborador (DB, HTTP, FS, log, queue).
25
- - **Effect sketch SEMPRE em papel/whiteboard primeiro.** Diagramar à mão, não em ferramenta. Velocidade > formato. Goal é entender, não documentar.
26
- - **Inflection point = funil estreito.** Lugar onde N caminhos convergem antes de divergir. 1 teste lá cobre N branches a montante. Foque tempo de teste aqui.
27
- - **Pinch point é definido pelo problema, não pela arquitetura.** "É onde os efeitos da minha mudança convergem", pode ou não coincidir com camadas/módulos.
28
- - **Effect-narrowing precede characterization.** Se sketch tem 30 efeitos, primeiro reduza superfície (encapsular variáveis, eliminar globals). Depois characterize a fronteira reduzida.
29
- - **Shotgun surgery = mesmo change espalhado em N lugares.** Effect sketch detecta. Resposta canônica: extrair para 1 lugar antes de mudar (cap 21 — Single Responsibility Principle aplicado retroativamente).
30
- - **Não confunda effect com call graph.** Call graph mostra QUEM chama QUEM. Effect sketch mostra O QUE MUDA. Função pode ser chamada 100 vezes e mudar nada (pure); função chamada 1 vez pode mudar 50 coisas.
31
-
32
- ## Patterns canônicos
33
-
34
- ### Pattern 1: 4 vetores de propagação de efeito
35
-
36
- ```text
37
- 1. RETURN VALUE
38
- foo() retorna X → callers usam X em decisões/cálculos
39
- Trace: grep callers de foo() + grep usos do resultado
40
-
41
- 2. MUTATED PARAMETERS (output params)
42
- foo(list) faz list.push(x) → caller continua a usar list mutada
43
- Trace: parâmetros não-primitivos (objetos, arrays, ponteiros)
44
-
45
- 3. GLOBAL / STATIC STATE
46
- foo() faz globalCounter++ ou Foo.lastResult = X
47
- Trace: writes em variáveis fora do escopo da função
48
-
49
- 4. SIDE EFFECTS VIA COLLABORATOR
50
- foo() chama db.save(), http.post(), log.warn(), fs.writeFile()
51
- Trace: identificar colaboradores injetados/globais e verificar writes
52
- ```
53
-
54
- **Heurística:** se um vetor é vazio, ótimo (efeito mais contido). Se múltiplos, sketch é necessário antes de qualquer change.
55
-
56
- ### Pattern 2: Workflow de effect sketch (cap 11)
57
-
58
- ```text
59
- 1. DESENHAR change point
60
- Caixa central com nome do método/variável que vai mudar.
61
-
62
- 2. ENUMERAR EFEITOS DIRETOS (1 nível)
63
- Setas saindo da caixa central para tudo que MUDA quando aquele
64
- change point muda:
65
- - retorno (caixa "return")
66
- - cada parâmetro mutado
67
- - cada global escrito
68
- - cada side effect
69
-
70
- 3. ENUMERAR EFEITOS DERIVADOS (2 níveis)
71
- Para cada efeito direto, perguntar: "quem usa isso?"
72
- - return é consumido por callers — desenhe callers
73
- - parâmetros mutados — quem inspeciona estado?
74
- - globals — todos os leitores
75
- - side effects — todos os observadores (queue consumers, DB readers)
76
-
77
- 4. CONTINUE até bordas naturais
78
- - Outro processo/serviço (effect cruza process boundary)
79
- - Caller que não inspeciona resultado
80
- - Side effect terminal (log persistido, sem ler de volta)
81
-
82
- 5. IDENTIFICAR INFLECTION POINTS
83
- Pontos onde múltiplas setas convergem ou divergem.
84
- Inflection point é "o gargalo" — testar ali cobre subgrafos inteiros.
85
-
86
- 6. PRIORIZAR TESTES
87
- Test escrito num inflection point cobre N efeitos a montante.
88
- 1 teste em pinch point > 10 testes em folhas.
89
- ```
90
-
91
- ### Pattern 3: Exemplo concreto — sketch de OrderProcessor.processOrder()
92
-
93
- ```text
94
- ┌──────────────────┐
95
- │ Order.discount │ ← change point (mudando lógica)
96
- └────────┬─────────┘
97
-
98
- ┌────────────────────────┼─────────────────────────┐
99
- ▼ ▼ ▼
100
- Order.totalCents OrderEvent.payload AuditLog.entry
101
- │ │ │
102
- ▼ ▼ ▼
103
- PaymentRequest.amount EventBus.publish AuditDB.write
104
- │ │ │
105
- ▼ ▼ ▼
106
- Stripe.charge QueueConsumers (3 svcs) ComplianceReader
107
-
108
-
109
- bank ledger
110
- ```
111
-
112
- **Inflection point óbvio:** `Order.totalCents` — TODOS os efeitos no payment side passam por essa propriedade.
113
-
114
- **Estratégia de testes:**
115
- - 1 test que asserta `Order.totalCents` para 5+ inputs (boundary, typical, etc.) → cobre subárvore Stripe inteira sem precisar mockar Stripe
116
- - 1 test que asserta `OrderEvent.payload` shape → cobre EventBus side
117
- - 1 test que asserta `AuditLog.entry` shape → cobre Audit side
118
-
119
- 3 testes de 5 minutos cada cobrem 15+ pontos de propagação. Sem sketch, escreveria 15 testes em 5 lugares diferentes.
120
-
121
- ### Pattern 4: Heurísticas para encontrar inflection points
122
-
123
- | Sintoma no sketch | Provável inflection |
124
- |---|---|
125
- | Várias setas convergem em 1 nó antes de irradiar | Esse nó (estado intermediário) |
126
- | Bordas de processo (call externo) | Antes da borda (assertar mensagem enviada) |
127
- | Pontos de serialização/desserialização | Bem ali — congele forma serializada |
128
- | Persistência (DB write) | Snapshot do row escrito |
129
- | Eventos publicados em queue/bus | Snapshot do event payload |
130
- | Function purity (sem side effect) | Return value direto |
131
-
132
- ### Pattern 5: Effect-narrowing (cap 12)
133
-
134
- Quando sketch tem 20+ efeitos, primeiro REDUZA antes de testar. Técnicas:
135
-
136
- | Técnica | Reduz | Trade-off |
137
- |---|---|---|
138
- | **Encapsular variável global** | Globals viram fields → menos vetor 3 (state) | Caller pode precisar passar instância |
139
- | **Imutabilidade no parâmetro** | Mutated params viram return values → menos vetor 2 | Allocation a cada call |
140
- | **Extract method para state mutation** | Side effect concentrado em 1 método (pinch criado) | + 1 método na classe |
141
- | **Replace temp with query** | Variável local → método; reduz dispersão | Computação repetida |
142
- | **Move method (fora de classe X para Y)** | Effect sai do escopo de X → menos efeito a rastrear em X | Pode quebrar outros sketches |
143
-
144
- **Princípio:** narrowing é PRECEDENTE a refactor. Faça-o com características de "pure mechanical" — pequena, reversível, comportamento idêntico.
145
-
146
- ### Pattern 6: 4 perguntas canônicas antes de change
147
-
148
- ```text
149
- 1. "Que efeitos esse change tem?"
150
- → desenhe sketch (vetores 1-4)
151
-
152
- 2. "Onde converge antes de divergir?"
153
- → inflection point(s)
154
-
155
- 3. "O que preciso testar para SENSE essas convergências?"
156
- → 1 test por inflection (input variado), assertando estado intermediário
157
-
158
- 4. "Quais são as bordas naturais?"
159
- → onde termina o sketch; depois disso é território de outras teams/serviços
160
- ```
161
-
162
- ### Pattern 7: Detect shotgun surgery via sketch
163
-
164
- Se ao desenhar sketch para mudança X, você encontra que X aparece em N lugares idênticos espalhados:
165
-
166
- ```text
167
- (mudança X)
168
-
169
- ┌───────┬────────┬───┴───┬────────┬───────┐
170
- ▼ ▼ ▼ ▼ ▼ ▼
171
- FileA FileB FileC FileD FileE FileF
172
- linha linha linha linha linha linha
173
- 42 189 67 23 104 56
174
- ```
175
-
176
- **Sintoma:** mesma lógica copiada em N pontos.
177
- **Resposta:** ANTES de mudar, extrair para função/classe única (cap 21). Depois, mudança vira UM ponto. Effect sketch original com 6 setas vira 1 seta para 1 ponto.
178
-
179
- ### Pattern 8: Effect sketch tooling
180
-
181
- Não precisa de ferramenta sofisticada. Em ordem de preferência:
182
-
183
- 1. **Papel + caneta** (sempre primeiro — velocidade)
184
- 2. **Whiteboard físico** (se mais que 1 pessoa)
185
- 3. **Whiteboard digital** (Excalidraw, Miro) — quando precisa salvar/compartilhar
186
- 4. **Texto ASCII em PR description** (quando vira artefato persistente)
187
- 5. **Mermaid graph** (last resort — overhead de syntax > benefit visual)
188
-
189
- **Anti-tooling:** UML "official", Visio, ferramentas que exigem layout perfeito. Sketch é descartável e iterativo.
190
-
191
- ### Pattern 9: Heurística de cobertura via inflection
192
-
193
- Para mudança em legacy code, cobertura mínima = 1 test por inflection point.
194
-
195
- ```text
196
- N inflection points identificados via sketch
197
- × 5+ inputs cobrindo grupos de equivalência (ver legacy-characterization-tests Pattern 2)
198
- = N × 5 testes mínimos para refactor
199
-
200
- Se muito alto (50+), considere effect-narrowing primeiro.
201
- Se muito baixo (1 inflection × 5 inputs = 5), provavelmente sketch
202
- incompleto — verifique se cobriu todos os 4 vetores.
203
- ```
204
-
205
- ## Anti-patterns
206
-
207
- ### ANTI: pular sketch "porque é óbvio"
208
-
209
- ```text
210
- ANTI: "esse método tem 50 linhas, eu vejo o que ele faz, vou testar
211
- direto".
212
-
213
- PROBLEMA: efeitos não-óbvios são exatamente os que escapam:
214
- - mutação de parâmetro objeto que caller depende
215
- - side effect via dependency injetada (parece pure mas não é)
216
- - global lido condicionalmente em caminho raro
217
- Bug em prod 3 semanas depois pelos efeitos não-vistos.
218
-
219
- CERTO: SEMPRE 5 minutos de sketch. Mesmo método "óbvio" → desenhe,
220
- confirme, então teste. 5 min poupam horas.
221
- ```
222
-
223
- ### ANTI: testar todas as folhas do sketch
224
-
225
- ```text
226
- ANTI: 30 setas no sketch → 30 testes (1 por folha).
227
-
228
- PROBLEMA: massive test suite, slow CI, alto custo de manutenção,
229
- tests redundantes (várias folhas testam mesma branch a
230
- montante). Sinal de "test theatre" — looks safe but isn't.
231
-
232
- CERTO: 1 teste por inflection point. Se inflection cobre 10 folhas,
233
- teste lá. Folhas só ganham teste próprio se há comportamento
234
- distinto (folha = inflection menor naquele contexto).
235
- ```
236
-
237
- ### ANTI: testar APENAS na superfície (1 nível de sketch)
238
-
239
- ```text
240
- ANTI: testar só `processOrder` retorno, sem verificar side effects.
241
-
242
- PROBLEMA: side effects são tipicamente onde regressão escapa.
243
- processOrder pode retornar valor correto MAS escrever no
244
- DB errado, publicar event errado, logar PII. Test verde
245
- mascara breakage.
246
-
247
- CERTO: percorrer sketch completo. Side effect significativo
248
- (DB write, event publish, log) recebe assertion no test
249
- relevante. Use fakes que coletam side effects, asserte sobre
250
- state final do fake.
251
- ```
252
-
253
- ### ANTI: confundir call graph com effect sketch
254
-
255
- ```text
256
- ANTI: "fiz um call graph IDE-generated, isso é meu effect sketch".
257
-
258
- PROBLEMA: call graph mostra "fooCallsBar". Não mostra que `bar`
259
- modifica global lido por `baz` que retorna decisão para
260
- `qux`. Effect path passa por chamadas + state, não só
261
- chamadas.
262
-
263
- CERTO: sketch tem que ser feito por pessoa, lendo código, perguntando
264
- "o que muda?". Call graph é input ao sketch, não substituto.
265
- ```
266
-
267
- ### ANTI: change com sketch não-validado
268
-
269
- ```text
270
- ANTI: desenhei sketch, achei 3 inflection points, escrevi tests,
271
- mudei código. Sketch não foi validado contra o código real
272
- por outra pessoa.
273
-
274
- PROBLEMA: effect omitido (vetor 4 — side effect via colaborador raro)
275
- significa teste ausente significa regressão escapa.
276
-
277
- CERTO: sketch validado por 2ª pessoa OU validado contra mutation
278
- testing. Mutants survived = pontos não-cobertos = potencial
279
- gap no sketch original.
280
- ```
281
-
282
- ### ANTI: shotgun surgery sem extract first
283
-
284
- ```text
285
- ANTI: "mesma lógica em 6 lugares, vou alterar todos os 6".
286
-
287
- PROBLEMA: 6 chances de errar. PR de 600 linhas. Test exigiria 6×
288
- characterization. Próxima mudança = mesma cirurgia.
289
-
290
- CERTO: extract first (cap 21). PR1 — extrair para função única,
291
- cada chamada vira call para a função. PR2 — alterar a função.
292
- Sketch original encolhe de 6 setas → 1 seta. Tests também.
293
- ```
294
-
295
- ## Verificação
296
-
297
- Antes de declarar effect analysis completa:
298
-
299
- 1. **Sketch desenhado** — papel/whiteboard com change point central + 4 vetores explorados
300
- 2. **Todos os 4 vetores considerados** — return, mutated params, globals, side effects via collaborator
301
- 3. **Pelo menos 1 inflection point identificado** — se não, sketch incompleto OU change é trivial demais
302
- 4. **Effect-narrowing aplicado** se sketch tem > 15 efeitos
303
- 5. **Plano de testes derivado do sketch** — N testes em inflection points, NÃO em folhas
304
- 6. **Sketch validado** — 2ª pessoa OR mutation testing pós-implementação
305
- 7. **Bordas naturais identificadas** — onde para de rastrear (process boundary, terminal side effect)
306
-
307
- ## Limiar de "pronto para testar/refatorar"
308
-
309
- ```text
310
- Sketch desenhado: sim
311
- Vetores 1-4 enumerados: todos cobertos
312
- Inflection points identificados: ≥ 1 (1-3 típico)
313
- Plano de testes mapeado para sketch: sim (1 teste por inflection)
314
- Cobertura esperada com tests planejados: ≥ 70% behavioral
315
- Effect-narrowing aplicado: se necessário
316
- ```
317
-
318
- Se algum item incompleto → não inicie testes/refactor. Volte ao sketch.
319
-
320
- ---
321
-
322
- ## Ver também
323
-
324
- - [`_shared-legacy/glossary.md`](../_shared-legacy/glossary.md) — vocabulário (effect sketch, inflection point, pinch point, shotgun surgery)
325
- - [`legacy-characterization-tests`](../legacy-characterization-tests/SKILL.md) — characterization rodada NOS inflection points achados aqui
326
- - [`legacy-seams-and-test-harness`](../legacy-seams-and-test-harness/SKILL.md) — break-deps em inflection points = test harness mínimo
327
- - [`legacy-monster-methods`](../legacy-monster-methods/SKILL.md) — monster method tem sketch interno (em uma única função)
328
- - [`legacy-sprout-wrap-techniques`](../legacy-sprout-wrap-techniques/SKILL.md) — sprout point ideal = inflection point pré-existente
329
- - [`pre-refactor-characterization`](../pre-refactor-characterization/SKILL.md) — gate exige effect sketch para refactor de arquivos grandes/críticos
330
-
331
- *Material-fonte: Working Effectively with Legacy Code — Feathers, 2004 — Cap 11: "I Need to Make a Change. What Methods Should I Test?" + Cap 12: "I Need to Make Many Changes in One Area" + Cap 16: "I Don't Understand the Code Well Enough to Change It".*
1
+ ---
2
+ name: legacy-effect-analysis
3
+ description: Use ao decidir quais testes escrever em código sem testes — effect sketch (cap 11-12 Feathers) rastreia propagação de efeitos do change point para inflection/pinch points onde 1 teste cob…
4
+ ---
5
+
6
+ # Legacy — Effect Analysis
7
+
8
+ ## Quando usar
9
+
10
+ LLM carrega esta skill quando user precisa decidir QUAIS testes escrever em código legado. Trigger phrases:
11
+
12
+ - "que tests preciso escrever para essa mudança?"
13
+ - "como sei que cobri tudo?"
14
+ - "effect sketch", "rastrear efeitos"
15
+ - "cap 11 Feathers", "cap 12 Feathers"
16
+ - "inflection point", "pinch point", "ponto de interceptação"
17
+ - "muitas mudanças na mesma área"
18
+ - "efeito propaga", "ripple effect"
19
+
20
+ Carrega entre `legacy-seams-and-test-harness` (já tenho seam) e `legacy-characterization-tests` (vou escrever quais testes?). Resposta: testes nos pinch points.
21
+
22
+ ## Regras absolutas
23
+
24
+ - **Effect = qualquer mudança observável após chamar o código.** 4 vetores: return value, parâmetros mutados, globals/state estático, side effects via colaborador (DB, HTTP, FS, log, queue).
25
+ - **Effect sketch SEMPRE em papel/whiteboard primeiro.** Diagramar à mão, não em ferramenta. Velocidade > formato. Goal é entender, não documentar.
26
+ - **Inflection point = funil estreito.** Lugar onde N caminhos convergem antes de divergir. 1 teste lá cobre N branches a montante. Foque tempo de teste aqui.
27
+ - **Pinch point é definido pelo problema, não pela arquitetura.** "É onde os efeitos da minha mudança convergem", pode ou não coincidir com camadas/módulos.
28
+ - **Effect-narrowing precede characterization.** Se sketch tem 30 efeitos, primeiro reduza superfície (encapsular variáveis, eliminar globals). Depois characterize a fronteira reduzida.
29
+ - **Shotgun surgery = mesmo change espalhado em N lugares.** Effect sketch detecta. Resposta canônica: extrair para 1 lugar antes de mudar (cap 21 — Single Responsibility Principle aplicado retroativamente).
30
+ - **Não confunda effect com call graph.** Call graph mostra QUEM chama QUEM. Effect sketch mostra O QUE MUDA. Função pode ser chamada 100 vezes e mudar nada (pure); função chamada 1 vez pode mudar 50 coisas.
31
+
32
+ ## Patterns canônicos
33
+
34
+ ### Pattern 1: 4 vetores de propagação de efeito
35
+
36
+ ```text
37
+ 1. RETURN VALUE
38
+ foo() retorna X → callers usam X em decisões/cálculos
39
+ Trace: grep callers de foo() + grep usos do resultado
40
+
41
+ 2. MUTATED PARAMETERS (output params)
42
+ foo(list) faz list.push(x) → caller continua a usar list mutada
43
+ Trace: parâmetros não-primitivos (objetos, arrays, ponteiros)
44
+
45
+ 3. GLOBAL / STATIC STATE
46
+ foo() faz globalCounter++ ou Foo.lastResult = X
47
+ Trace: writes em variáveis fora do escopo da função
48
+
49
+ 4. SIDE EFFECTS VIA COLLABORATOR
50
+ foo() chama db.save(), http.post(), log.warn(), fs.writeFile()
51
+ Trace: identificar colaboradores injetados/globais e verificar writes
52
+ ```
53
+
54
+ **Heurística:** se um vetor é vazio, ótimo (efeito mais contido). Se múltiplos, sketch é necessário antes de qualquer change.
55
+
56
+ ### Pattern 2: Workflow de effect sketch (cap 11)
57
+
58
+ ```text
59
+ 1. DESENHAR change point
60
+ Caixa central com nome do método/variável que vai mudar.
61
+
62
+ 2. ENUMERAR EFEITOS DIRETOS (1 nível)
63
+ Setas saindo da caixa central para tudo que MUDA quando aquele
64
+ change point muda:
65
+ - retorno (caixa "return")
66
+ - cada parâmetro mutado
67
+ - cada global escrito
68
+ - cada side effect
69
+
70
+ 3. ENUMERAR EFEITOS DERIVADOS (2 níveis)
71
+ Para cada efeito direto, perguntar: "quem usa isso?"
72
+ - return é consumido por callers — desenhe callers
73
+ - parâmetros mutados — quem inspeciona estado?
74
+ - globals — todos os leitores
75
+ - side effects — todos os observadores (queue consumers, DB readers)
76
+
77
+ 4. CONTINUE até bordas naturais
78
+ - Outro processo/serviço (effect cruza process boundary)
79
+ - Caller que não inspeciona resultado
80
+ - Side effect terminal (log persistido, sem ler de volta)
81
+
82
+ 5. IDENTIFICAR INFLECTION POINTS
83
+ Pontos onde múltiplas setas convergem ou divergem.
84
+ Inflection point é "o gargalo" — testar ali cobre subgrafos inteiros.
85
+
86
+ 6. PRIORIZAR TESTES
87
+ Test escrito num inflection point cobre N efeitos a montante.
88
+ 1 teste em pinch point > 10 testes em folhas.
89
+ ```
90
+
91
+ ### Pattern 3: Exemplo concreto — sketch de OrderProcessor.processOrder()
92
+
93
+ ```text
94
+ ┌──────────────────┐
95
+ │ Order.discount │ ← change point (mudando lógica)
96
+ └────────┬─────────┘
97
+
98
+ ┌────────────────────────┼─────────────────────────┐
99
+ ▼ ▼ ▼
100
+ Order.totalCents OrderEvent.payload AuditLog.entry
101
+ │ │ │
102
+ ▼ ▼ ▼
103
+ PaymentRequest.amount EventBus.publish AuditDB.write
104
+ │ │ │
105
+ ▼ ▼ ▼
106
+ Stripe.charge QueueConsumers (3 svcs) ComplianceReader
107
+
108
+
109
+ bank ledger
110
+ ```
111
+
112
+ **Inflection point óbvio:** `Order.totalCents` — TODOS os efeitos no payment side passam por essa propriedade.
113
+
114
+ **Estratégia de testes:**
115
+ - 1 test que asserta `Order.totalCents` para 5+ inputs (boundary, typical, etc.) → cobre subárvore Stripe inteira sem precisar mockar Stripe
116
+ - 1 test que asserta `OrderEvent.payload` shape → cobre EventBus side
117
+ - 1 test que asserta `AuditLog.entry` shape → cobre Audit side
118
+
119
+ 3 testes de 5 minutos cada cobrem 15+ pontos de propagação. Sem sketch, escreveria 15 testes em 5 lugares diferentes.
120
+
121
+ ### Pattern 4: Heurísticas para encontrar inflection points
122
+
123
+ | Sintoma no sketch | Provável inflection |
124
+ |---|---|
125
+ | Várias setas convergem em 1 nó antes de irradiar | Esse nó (estado intermediário) |
126
+ | Bordas de processo (call externo) | Antes da borda (assertar mensagem enviada) |
127
+ | Pontos de serialização/desserialização | Bem ali — congele forma serializada |
128
+ | Persistência (DB write) | Snapshot do row escrito |
129
+ | Eventos publicados em queue/bus | Snapshot do event payload |
130
+ | Function purity (sem side effect) | Return value direto |
131
+
132
+ ### Pattern 5: Effect-narrowing (cap 12)
133
+
134
+ Quando sketch tem 20+ efeitos, primeiro REDUZA antes de testar. Técnicas:
135
+
136
+ | Técnica | Reduz | Trade-off |
137
+ |---|---|---|
138
+ | **Encapsular variável global** | Globals viram fields → menos vetor 3 (state) | Caller pode precisar passar instância |
139
+ | **Imutabilidade no parâmetro** | Mutated params viram return values → menos vetor 2 | Allocation a cada call |
140
+ | **Extract method para state mutation** | Side effect concentrado em 1 método (pinch criado) | + 1 método na classe |
141
+ | **Replace temp with query** | Variável local → método; reduz dispersão | Computação repetida |
142
+ | **Move method (fora de classe X para Y)** | Effect sai do escopo de X → menos efeito a rastrear em X | Pode quebrar outros sketches |
143
+
144
+ **Princípio:** narrowing é PRECEDENTE a refactor. Faça-o com características de "pure mechanical" — pequena, reversível, comportamento idêntico.
145
+
146
+ ### Pattern 6: 4 perguntas canônicas antes de change
147
+
148
+ ```text
149
+ 1. "Que efeitos esse change tem?"
150
+ → desenhe sketch (vetores 1-4)
151
+
152
+ 2. "Onde converge antes de divergir?"
153
+ → inflection point(s)
154
+
155
+ 3. "O que preciso testar para SENSE essas convergências?"
156
+ → 1 test por inflection (input variado), assertando estado intermediário
157
+
158
+ 4. "Quais são as bordas naturais?"
159
+ → onde termina o sketch; depois disso é território de outras teams/serviços
160
+ ```
161
+
162
+ ### Pattern 7: Detect shotgun surgery via sketch
163
+
164
+ Se ao desenhar sketch para mudança X, você encontra que X aparece em N lugares idênticos espalhados:
165
+
166
+ ```text
167
+ (mudança X)
168
+
169
+ ┌───────┬────────┬───┴───┬────────┬───────┐
170
+ ▼ ▼ ▼ ▼ ▼ ▼
171
+ FileA FileB FileC FileD FileE FileF
172
+ linha linha linha linha linha linha
173
+ 42 189 67 23 104 56
174
+ ```
175
+
176
+ **Sintoma:** mesma lógica copiada em N pontos.
177
+ **Resposta:** ANTES de mudar, extrair para função/classe única (cap 21). Depois, mudança vira UM ponto. Effect sketch original com 6 setas vira 1 seta para 1 ponto.
178
+
179
+ ### Pattern 8: Effect sketch tooling
180
+
181
+ Não precisa de ferramenta sofisticada. Em ordem de preferência:
182
+
183
+ 1. **Papel + caneta** (sempre primeiro — velocidade)
184
+ 2. **Whiteboard físico** (se mais que 1 pessoa)
185
+ 3. **Whiteboard digital** (Excalidraw, Miro) — quando precisa salvar/compartilhar
186
+ 4. **Texto ASCII em PR description** (quando vira artefato persistente)
187
+ 5. **Mermaid graph** (last resort — overhead de syntax > benefit visual)
188
+
189
+ **Anti-tooling:** UML "official", Visio, ferramentas que exigem layout perfeito. Sketch é descartável e iterativo.
190
+
191
+ ### Pattern 9: Heurística de cobertura via inflection
192
+
193
+ Para mudança em legacy code, cobertura mínima = 1 test por inflection point.
194
+
195
+ ```text
196
+ N inflection points identificados via sketch
197
+ × 5+ inputs cobrindo grupos de equivalência (ver legacy-characterization-tests Pattern 2)
198
+ = N × 5 testes mínimos para refactor
199
+
200
+ Se muito alto (50+), considere effect-narrowing primeiro.
201
+ Se muito baixo (1 inflection × 5 inputs = 5), provavelmente sketch
202
+ incompleto — verifique se cobriu todos os 4 vetores.
203
+ ```
204
+
205
+ ## Anti-patterns
206
+
207
+ ### ANTI: pular sketch "porque é óbvio"
208
+
209
+ ```text
210
+ ANTI: "esse método tem 50 linhas, eu vejo o que ele faz, vou testar
211
+ direto".
212
+
213
+ PROBLEMA: efeitos não-óbvios são exatamente os que escapam:
214
+ - mutação de parâmetro objeto que caller depende
215
+ - side effect via dependency injetada (parece pure mas não é)
216
+ - global lido condicionalmente em caminho raro
217
+ Bug em prod 3 semanas depois pelos efeitos não-vistos.
218
+
219
+ CERTO: SEMPRE 5 minutos de sketch. Mesmo método "óbvio" → desenhe,
220
+ confirme, então teste. 5 min poupam horas.
221
+ ```
222
+
223
+ ### ANTI: testar todas as folhas do sketch
224
+
225
+ ```text
226
+ ANTI: 30 setas no sketch → 30 testes (1 por folha).
227
+
228
+ PROBLEMA: massive test suite, slow CI, alto custo de manutenção,
229
+ tests redundantes (várias folhas testam mesma branch a
230
+ montante). Sinal de "test theatre" — looks safe but isn't.
231
+
232
+ CERTO: 1 teste por inflection point. Se inflection cobre 10 folhas,
233
+ teste lá. Folhas só ganham teste próprio se há comportamento
234
+ distinto (folha = inflection menor naquele contexto).
235
+ ```
236
+
237
+ ### ANTI: testar APENAS na superfície (1 nível de sketch)
238
+
239
+ ```text
240
+ ANTI: testar só `processOrder` retorno, sem verificar side effects.
241
+
242
+ PROBLEMA: side effects são tipicamente onde regressão escapa.
243
+ processOrder pode retornar valor correto MAS escrever no
244
+ DB errado, publicar event errado, logar PII. Test verde
245
+ mascara breakage.
246
+
247
+ CERTO: percorrer sketch completo. Side effect significativo
248
+ (DB write, event publish, log) recebe assertion no test
249
+ relevante. Use fakes que coletam side effects, asserte sobre
250
+ state final do fake.
251
+ ```
252
+
253
+ ### ANTI: confundir call graph com effect sketch
254
+
255
+ ```text
256
+ ANTI: "fiz um call graph IDE-generated, isso é meu effect sketch".
257
+
258
+ PROBLEMA: call graph mostra "fooCallsBar". Não mostra que `bar`
259
+ modifica global lido por `baz` que retorna decisão para
260
+ `qux`. Effect path passa por chamadas + state, não só
261
+ chamadas.
262
+
263
+ CERTO: sketch tem que ser feito por pessoa, lendo código, perguntando
264
+ "o que muda?". Call graph é input ao sketch, não substituto.
265
+ ```
266
+
267
+ ### ANTI: change com sketch não-validado
268
+
269
+ ```text
270
+ ANTI: desenhei sketch, achei 3 inflection points, escrevi tests,
271
+ mudei código. Sketch não foi validado contra o código real
272
+ por outra pessoa.
273
+
274
+ PROBLEMA: effect omitido (vetor 4 — side effect via colaborador raro)
275
+ significa teste ausente significa regressão escapa.
276
+
277
+ CERTO: sketch validado por 2ª pessoa OU validado contra mutation
278
+ testing. Mutants survived = pontos não-cobertos = potencial
279
+ gap no sketch original.
280
+ ```
281
+
282
+ ### ANTI: shotgun surgery sem extract first
283
+
284
+ ```text
285
+ ANTI: "mesma lógica em 6 lugares, vou alterar todos os 6".
286
+
287
+ PROBLEMA: 6 chances de errar. PR de 600 linhas. Test exigiria 6×
288
+ characterization. Próxima mudança = mesma cirurgia.
289
+
290
+ CERTO: extract first (cap 21). PR1 — extrair para função única,
291
+ cada chamada vira call para a função. PR2 — alterar a função.
292
+ Sketch original encolhe de 6 setas → 1 seta. Tests também.
293
+ ```
294
+
295
+ ## Verificação
296
+
297
+ Antes de declarar effect analysis completa:
298
+
299
+ 1. **Sketch desenhado** — papel/whiteboard com change point central + 4 vetores explorados
300
+ 2. **Todos os 4 vetores considerados** — return, mutated params, globals, side effects via collaborator
301
+ 3. **Pelo menos 1 inflection point identificado** — se não, sketch incompleto OU change é trivial demais
302
+ 4. **Effect-narrowing aplicado** se sketch tem > 15 efeitos
303
+ 5. **Plano de testes derivado do sketch** — N testes em inflection points, NÃO em folhas
304
+ 6. **Sketch validado** — 2ª pessoa OR mutation testing pós-implementação
305
+ 7. **Bordas naturais identificadas** — onde para de rastrear (process boundary, terminal side effect)
306
+
307
+ ## Limiar de "pronto para testar/refatorar"
308
+
309
+ ```text
310
+ Sketch desenhado: sim
311
+ Vetores 1-4 enumerados: todos cobertos
312
+ Inflection points identificados: ≥ 1 (1-3 típico)
313
+ Plano de testes mapeado para sketch: sim (1 teste por inflection)
314
+ Cobertura esperada com tests planejados: ≥ 70% behavioral
315
+ Effect-narrowing aplicado: se necessário
316
+ ```
317
+
318
+ Se algum item incompleto → não inicie testes/refactor. Volte ao sketch.
319
+
320
+ ---
321
+
322
+ ## Ver também
323
+
324
+ - [`_shared-legacy/glossary.md`](../_shared-legacy/glossary.md) — vocabulário (effect sketch, inflection point, pinch point, shotgun surgery)
325
+ - [`legacy-characterization-tests`](../legacy-characterization-tests/SKILL.md) — characterization rodada NOS inflection points achados aqui
326
+ - [`legacy-seams-and-test-harness`](../legacy-seams-and-test-harness/SKILL.md) — break-deps em inflection points = test harness mínimo
327
+ - [`legacy-monster-methods`](../legacy-monster-methods/SKILL.md) — monster method tem sketch interno (em uma única função)
328
+ - [`legacy-sprout-wrap-techniques`](../legacy-sprout-wrap-techniques/SKILL.md) — sprout point ideal = inflection point pré-existente
329
+ - [`pre-refactor-characterization`](../pre-refactor-characterization/SKILL.md) — gate exige effect sketch para refactor de arquivos grandes/críticos
330
+
331
+ *Material-fonte: Working Effectively with Legacy Code — Feathers, 2004 — Cap 11: "I Need to Make a Change. What Methods Should I Test?" + Cap 12: "I Need to Make Many Changes in One Area" + Cap 16: "I Don't Understand the Code Well Enough to Change It".*