@luanpdd/kit-mcp 1.33.0 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +168 -168
- package/gates/agent-no-recursive-dispatch.md +84 -84
- package/kit/COMANDOS.md +138 -138
- package/kit/COMPATIBILITY.md +70 -70
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +109 -109
- package/kit/agents/ai-mutation-tester.md +289 -289
- package/kit/agents/assumptions-analyzer.md +110 -110
- package/kit/agents/audit-log-implementer.md +314 -314
- package/kit/agents/auditor-consistencia-isolamento.md +414 -414
- package/kit/agents/b2b-saas-architect.md +157 -157
- package/kit/agents/burn-rate-forecaster.md +153 -153
- package/kit/agents/cascading-failures-auditor.md +299 -299
- package/kit/agents/codebase-mapper.md +769 -769
- package/kit/agents/crm-pipeline-implementer.md +257 -257
- package/kit/agents/debugger.md +814 -814
- package/kit/agents/designer-ui.md +216 -216
- package/kit/agents/detector-tenant-quente.md +338 -338
- package/kit/agents/evolution-go-integrator.md +201 -201
- package/kit/agents/example-reviewer.md +22 -22
- package/kit/agents/executor.md +565 -565
- package/kit/agents/golden-signals-instrumenter.md +232 -232
- package/kit/agents/incident-investigator.md +238 -238
- package/kit/agents/integration-checker.md +203 -203
- package/kit/agents/invite-flow-implementer.md +190 -190
- package/kit/agents/legacy-characterizer.md +369 -369
- package/kit/agents/lgpd-compliance-auditor.md +296 -296
- package/kit/agents/load-shedding-instrumenter.md +290 -290
- package/kit/agents/multi-tenant-isolation-auditor.md +254 -254
- package/kit/agents/multi-tenant-rls-writer.md +341 -341
- package/kit/agents/nyquist-auditor.md +181 -181
- package/kit/agents/observability-coverage-auditor.md +316 -316
- package/kit/agents/observability-instrumenter.md +191 -191
- package/kit/agents/omm-auditor.md +291 -291
- package/kit/agents/org-onboarding-implementer.md +224 -224
- package/kit/agents/payload-capture-instrumenter.md +274 -274
- package/kit/agents/phase-researcher.md +697 -697
- package/kit/agents/plan-checker.md +275 -275
- package/kit/agents/planner.md +923 -923
- package/kit/agents/postmortem-writer.md +273 -273
- package/kit/agents/project-researcher.md +653 -653
- package/kit/agents/prr-conductor.md +287 -287
- package/kit/agents/refactor-safety-auditor.md +405 -405
- package/kit/agents/release-pipeline-auditor.md +364 -364
- package/kit/agents/research-synthesizer.md +246 -246
- package/kit/agents/roadmapper.md +678 -678
- package/kit/agents/schema-checker.md +160 -160
- package/kit/agents/seam-finder.md +360 -360
- package/kit/agents/shotgun-surgery-detector.md +350 -350
- package/kit/agents/slo-engineer.md +217 -217
- package/kit/agents/storytelling-analyst.md +300 -300
- package/kit/agents/supabase-architect.md +249 -249
- package/kit/agents/supabase-auth-bootstrapper.md +400 -400
- package/kit/agents/supabase-auth-hook-writer.md +418 -418
- package/kit/agents/supabase-branching-architect.md +563 -563
- package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -778
- package/kit/agents/supabase-column-privileges-writer.md +400 -400
- package/kit/agents/supabase-edge-fn-tester.md +288 -288
- package/kit/agents/supabase-edge-fn-writer.md +341 -341
- package/kit/agents/supabase-mfa-implementer.md +439 -439
- package/kit/agents/supabase-migration-writer.md +386 -386
- package/kit/agents/supabase-oauth-server-implementer.md +507 -507
- package/kit/agents/supabase-rbac-implementer.md +393 -393
- package/kit/agents/supabase-realtime-implementer.md +364 -364
- package/kit/agents/supabase-rls-hardener.md +522 -522
- package/kit/agents/supabase-rls-writer.md +324 -324
- package/kit/agents/supabase-roles-implementer.md +356 -356
- package/kit/agents/supabase-social-auth-implementer.md +451 -451
- package/kit/agents/supabase-sso-saml-architect.md +549 -549
- package/kit/agents/supabase-storage-implementer.md +407 -407
- package/kit/agents/super-admin-implementer.md +282 -282
- package/kit/agents/toil-auditor.md +268 -268
- package/kit/agents/ui-auditor.md +438 -438
- package/kit/agents/ui-checker.md +305 -305
- package/kit/agents/ui-researcher.md +356 -356
- package/kit/agents/user-profiler.md +176 -176
- package/kit/agents/validador-evolucao-schema.md +336 -336
- package/kit/agents/verifier.md +729 -729
- package/kit/commands/adicionar-backlog.md +75 -75
- package/kit/commands/adicionar-fase.md +42 -42
- package/kit/commands/adicionar-tarefa.md +45 -45
- package/kit/commands/adicionar-testes.md +41 -41
- package/kit/commands/ajuda.md +21 -21
- package/kit/commands/atualizar.md +37 -37
- package/kit/commands/auditar-cascading.md +111 -111
- package/kit/commands/auditar-marco.md +179 -179
- package/kit/commands/auditar-observabilidade-cobertura-workflow.md +121 -0
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
- package/kit/commands/auditar-refactor.md +219 -219
- package/kit/commands/auditar-release.md +109 -109
- package/kit/commands/auditar-uat.md +23 -23
- package/kit/commands/autonomo.md +40 -40
- package/kit/commands/branch-pr.md +24 -24
- package/kit/commands/burn-rate-status.md +408 -408
- package/kit/commands/capturar-payloads.md +193 -193
- package/kit/commands/caracterizar.md +212 -212
- package/kit/commands/concluir-marco.md +247 -247
- package/kit/commands/configuracoes.md +36 -36
- package/kit/commands/dados-distribuidos.md +188 -188
- package/kit/commands/definir-perfil.md +10 -10
- package/kit/commands/depurar.md +190 -190
- package/kit/commands/detectar-duplicacao.md +197 -197
- package/kit/commands/discutir-fase.md +131 -131
- package/kit/commands/encontrar-seams.md +136 -136
- package/kit/commands/entrar-discord.md +17 -17
- package/kit/commands/estatisticas.md +18 -18
- package/kit/commands/example-greeting.md +33 -33
- package/kit/commands/executar-fase.md +58 -58
- package/kit/commands/expresso.md +56 -56
- package/kit/commands/fase-ui.md +34 -34
- package/kit/commands/fazer.md +57 -57
- package/kit/commands/fio.md +125 -125
- package/kit/commands/fluxos-trabalho.md +64 -64
- package/kit/commands/forense.md +176 -176
- package/kit/commands/gerenciador.md +38 -38
- package/kit/commands/inserir-fase.md +31 -31
- package/kit/commands/legacy.md +263 -263
- package/kit/commands/limpeza.md +17 -17
- package/kit/commands/listar-hipoteses-fase.md +45 -45
- package/kit/commands/listar-workspaces.md +18 -18
- package/kit/commands/load-shedding.md +117 -117
- package/kit/commands/mapear-codebase.md +70 -70
- package/kit/commands/multi-tenant.md +163 -163
- package/kit/commands/nota.md +33 -33
- package/kit/commands/novo-marco.md +43 -43
- package/kit/commands/novo-projeto.md +41 -41
- package/kit/commands/novo-workspace.md +43 -43
- package/kit/commands/pausar-trabalho.md +37 -37
- package/kit/commands/perfil-usuario.md +45 -45
- package/kit/commands/pesquisar-fase.md +195 -195
- package/kit/commands/planejar-fase.md +67 -67
- package/kit/commands/planejar-lacunas.md +33 -33
- package/kit/commands/plantar-ideia.md +25 -25
- package/kit/commands/progresso.md +24 -24
- package/kit/commands/proximo.md +30 -30
- package/kit/commands/publicar.md +490 -490
- package/kit/commands/rapido.md +35 -35
- package/kit/commands/reaplicar-patches.md +124 -124
- package/kit/commands/refactor-seguro.md +321 -321
- package/kit/commands/relatorio-sessao.md +19 -19
- package/kit/commands/remover-fase.md +31 -31
- package/kit/commands/remover-workspace.md +26 -26
- package/kit/commands/resumo-marco.md +50 -50
- package/kit/commands/retomar-trabalho.md +40 -40
- package/kit/commands/revisar-backlog.md +60 -60
- package/kit/commands/revisar-ui.md +32 -32
- package/kit/commands/revisar.md +37 -37
- package/kit/commands/saude.md +21 -21
- package/kit/commands/setup-notion.md +93 -93
- package/kit/commands/storytelling.md +179 -179
- package/kit/commands/supabase.md +238 -238
- package/kit/commands/sync-main.md +68 -68
- package/kit/commands/validar-fase.md +35 -35
- package/kit/commands/verificar-tarefas.md +44 -44
- package/kit/commands/verificar-trabalho.md +64 -64
- package/kit/file-manifest.json +13 -11
- package/kit/framework/bin/lib/commands.cjs +959 -959
- package/kit/framework/bin/lib/config.cjs +442 -442
- package/kit/framework/bin/lib/core.cjs +1230 -1230
- package/kit/framework/bin/lib/frontmatter.cjs +336 -336
- package/kit/framework/bin/lib/init.cjs +1442 -1442
- package/kit/framework/bin/lib/milestone.cjs +252 -252
- package/kit/framework/bin/lib/model-profiles.cjs +68 -68
- package/kit/framework/bin/lib/phase.cjs +888 -888
- package/kit/framework/bin/lib/profile-output.cjs +952 -952
- package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
- package/kit/framework/bin/lib/roadmap.cjs +329 -329
- package/kit/framework/bin/lib/security.cjs +382 -382
- package/kit/framework/bin/lib/state.cjs +1031 -1031
- package/kit/framework/bin/lib/template.cjs +222 -222
- package/kit/framework/bin/lib/uat.cjs +282 -282
- package/kit/framework/bin/lib/verify.cjs +888 -888
- package/kit/framework/bin/lib/workstream.cjs +491 -491
- package/kit/framework/bin/tools.cjs +918 -918
- package/kit/framework/commands/workstreams.md +63 -63
- package/kit/framework/references/checkpoints.md +778 -778
- package/kit/framework/references/continuation-format.md +249 -249
- package/kit/framework/references/decimal-phase-calculation.md +64 -64
- package/kit/framework/references/git-integration.md +295 -295
- package/kit/framework/references/git-planning-commit.md +38 -38
- package/kit/framework/references/model-profile-resolution.md +36 -36
- package/kit/framework/references/model-profiles.md +139 -139
- package/kit/framework/references/phase-argument-parsing.md +61 -61
- package/kit/framework/references/planning-config.md +202 -202
- package/kit/framework/references/questioning.md +162 -162
- package/kit/framework/references/tdd.md +263 -263
- package/kit/framework/references/ui-brand.md +160 -160
- package/kit/framework/references/user-profiling.md +657 -657
- package/kit/framework/references/verification-patterns.md +612 -612
- package/kit/framework/references/workstream-flag.md +58 -58
- package/kit/framework/templates/DEBUG.md +164 -164
- package/kit/framework/templates/UAT.md +265 -265
- package/kit/framework/templates/UI-SPEC.md +100 -100
- package/kit/framework/templates/VALIDATION.md +76 -76
- package/kit/framework/templates/claude-md.md +122 -122
- package/kit/framework/templates/codebase/architecture.md +185 -185
- package/kit/framework/templates/codebase/concerns.md +205 -205
- package/kit/framework/templates/codebase/conventions.md +204 -204
- package/kit/framework/templates/codebase/integrations.md +192 -192
- package/kit/framework/templates/codebase/stack.md +158 -158
- package/kit/framework/templates/codebase/structure.md +199 -199
- package/kit/framework/templates/codebase/testing.md +301 -301
- package/kit/framework/templates/config.json +44 -44
- package/kit/framework/templates/context.md +352 -352
- package/kit/framework/templates/continue-here.md +78 -78
- package/kit/framework/templates/copilot-instructions.md +7 -7
- package/kit/framework/templates/debug-subagent-prompt.md +91 -91
- package/kit/framework/templates/dev-preferences.md +20 -20
- package/kit/framework/templates/discovery.md +146 -146
- package/kit/framework/templates/discussion-log.md +63 -63
- package/kit/framework/templates/milestone-archive.md +123 -123
- package/kit/framework/templates/milestone.md +115 -115
- package/kit/framework/templates/phase-prompt.md +610 -610
- package/kit/framework/templates/planner-subagent-prompt.md +117 -117
- package/kit/framework/templates/project.md +186 -186
- package/kit/framework/templates/requirements.md +231 -231
- package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
- package/kit/framework/templates/research-project/FEATURES.md +147 -147
- package/kit/framework/templates/research-project/PITFALLS.md +200 -200
- package/kit/framework/templates/research-project/STACK.md +120 -120
- package/kit/framework/templates/research-project/SUMMARY.md +170 -170
- package/kit/framework/templates/research.md +419 -419
- package/kit/framework/templates/retrospective.md +54 -54
- package/kit/framework/templates/roadmap.md +202 -202
- package/kit/framework/templates/state.md +176 -176
- package/kit/framework/templates/summary-complex.md +59 -59
- package/kit/framework/templates/summary-minimal.md +41 -41
- package/kit/framework/templates/summary-standard.md +48 -48
- package/kit/framework/templates/summary.md +209 -209
- package/kit/framework/templates/user-profile.md +146 -146
- package/kit/framework/templates/user-setup.md +256 -256
- package/kit/framework/templates/verification-report.md +258 -258
- package/kit/framework/workflows/add-phase.md +112 -112
- package/kit/framework/workflows/add-tests.md +351 -351
- package/kit/framework/workflows/add-todo.md +158 -158
- package/kit/framework/workflows/audit-milestone.md +340 -340
- package/kit/framework/workflows/audit-uat.md +109 -109
- package/kit/framework/workflows/autonomous.md +891 -891
- package/kit/framework/workflows/check-todos.md +177 -177
- package/kit/framework/workflows/cleanup.md +152 -152
- package/kit/framework/workflows/complete-milestone.md +696 -696
- package/kit/framework/workflows/diagnose-issues.md +231 -231
- package/kit/framework/workflows/discovery-phase.md +289 -289
- package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
- package/kit/framework/workflows/discuss-phase.md +784 -784
- package/kit/framework/workflows/do.md +104 -104
- package/kit/framework/workflows/execute-phase.md +838 -838
- package/kit/framework/workflows/execute-plan.md +510 -510
- package/kit/framework/workflows/fast.md +102 -102
- package/kit/framework/workflows/forensics.md +265 -265
- package/kit/framework/workflows/health.md +181 -181
- package/kit/framework/workflows/help.md +619 -619
- package/kit/framework/workflows/insert-phase.md +130 -130
- package/kit/framework/workflows/list-phase-assumptions.md +178 -178
- package/kit/framework/workflows/list-workspaces.md +56 -56
- package/kit/framework/workflows/manager.md +362 -362
- package/kit/framework/workflows/map-codebase.md +377 -377
- package/kit/framework/workflows/milestone-summary.md +223 -223
- package/kit/framework/workflows/new-milestone.md +486 -486
- package/kit/framework/workflows/new-project.md +1159 -1159
- package/kit/framework/workflows/new-workspace.md +237 -237
- package/kit/framework/workflows/next.md +97 -97
- package/kit/framework/workflows/node-repair.md +92 -92
- package/kit/framework/workflows/note.md +156 -156
- package/kit/framework/workflows/pause-work.md +176 -176
- package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
- package/kit/framework/workflows/plan-phase.md +765 -765
- package/kit/framework/workflows/plant-seed.md +169 -169
- package/kit/framework/workflows/pr-branch.md +129 -129
- package/kit/framework/workflows/profile-user.md +450 -450
- package/kit/framework/workflows/progress.md +507 -507
- package/kit/framework/workflows/quick.md +757 -757
- package/kit/framework/workflows/remove-phase.md +155 -155
- package/kit/framework/workflows/remove-workspace.md +90 -90
- package/kit/framework/workflows/research-phase.md +82 -82
- package/kit/framework/workflows/resume-project.md +326 -326
- package/kit/framework/workflows/review.md +228 -228
- package/kit/framework/workflows/session-report.md +146 -146
- package/kit/framework/workflows/settings.md +283 -283
- package/kit/framework/workflows/ship.md +228 -228
- package/kit/framework/workflows/stats.md +60 -60
- package/kit/framework/workflows/transition.md +671 -671
- package/kit/framework/workflows/ui-phase.md +302 -302
- package/kit/framework/workflows/ui-review.md +165 -165
- package/kit/framework/workflows/update.md +323 -323
- package/kit/framework/workflows/validate-phase.md +174 -174
- package/kit/framework/workflows/verify-phase.md +252 -252
- package/kit/framework/workflows/verify-work.md +637 -637
- package/kit/hooks/check-update.js +118 -118
- package/kit/hooks/context-monitor.js +163 -163
- package/kit/hooks/kit-attribution-reminder.cjs +92 -92
- package/kit/hooks/kit-router.cjs +137 -137
- package/kit/hooks/prompt-guard.js +103 -103
- package/kit/hooks/statusline.js +125 -125
- package/kit/hooks/workflow-guard.js +101 -101
- package/kit/settings.json +45 -45
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
- package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
- package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
- package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
- package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
- package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
- package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
- package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
- package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
- package/kit/skills/example-skill/SKILL.md +42 -42
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
- package/kit/skills/legacy-extract-class/SKILL.md +203 -203
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
- package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
- package/kit/skills/member-invite-flow/SKILL.md +305 -305
- package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
- package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
- package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
- package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
- package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
- package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
- package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
- package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
- package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
- package/kit/skills/supabase-auth-hardening/SKILL.md +674 -674
- package/kit/skills/supabase-auth-hooks/SKILL.md +875 -875
- package/kit/skills/supabase-auth-methods/SKILL.md +486 -486
- package/kit/skills/supabase-auth-sessions/SKILL.md +579 -579
- package/kit/skills/supabase-auth-ssr/SKILL.md +306 -306
- package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
- package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
- package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
- package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
- package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
- package/kit/skills/supabase-edge-functions/SKILL.md +330 -330
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +309 -309
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +302 -302
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +279 -279
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +277 -277
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +357 -357
- package/kit/skills/supabase-enterprise-sso-saml/SKILL.md +545 -545
- package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -399
- package/kit/skills/supabase-mfa/SKILL.md +488 -488
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-oauth-server/SKILL.md +537 -537
- package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
- package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
- package/kit/skills/supabase-realtime/SKILL.md +460 -460
- package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
- package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
- package/kit/skills/supabase-social-oauth/SKILL.md +480 -480
- package/kit/skills/supabase-third-party-auth/SKILL.md +450 -450
- package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
- package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
- package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
- package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
- package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
- package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
- package/kit/skills/ui-tipografia/SKILL.md +211 -211
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/kit/workflows/auditar-observabilidade-cobertura.workflow.js +250 -0
- package/package.json +65 -63
- package/src/core/kit.js +333 -216
- package/src/core/reflect.js +247 -247
- package/src/core/registry.js +123 -112
- package/src/core/reverse-sync.js +448 -372
- package/src/core/sync.js +477 -437
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +794 -794
|
@@ -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".*
|