@luanpdd/kit-mcp 1.30.2 → 1.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +168 -168
- package/gates/agent-no-recursive-dispatch.md +84 -82
- package/kit/COMANDOS.md +138 -138
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +107 -106
- package/kit/agents/ai-mutation-tester.md +1 -0
- package/kit/agents/assumptions-analyzer.md +108 -107
- package/kit/agents/audit-log-implementer.md +314 -313
- package/kit/agents/auditor-consistencia-isolamento.md +414 -413
- package/kit/agents/b2b-saas-architect.md +157 -156
- package/kit/agents/burn-rate-forecaster.md +1 -0
- package/kit/agents/cascading-failures-auditor.md +299 -298
- package/kit/agents/codebase-mapper.md +769 -768
- package/kit/agents/crm-pipeline-implementer.md +257 -256
- package/kit/agents/debugger.md +814 -813
- package/kit/agents/detector-tenant-quente.md +338 -337
- package/kit/agents/evolution-go-integrator.md +201 -200
- package/kit/agents/example-reviewer.md +22 -21
- package/kit/agents/executor.md +565 -564
- package/kit/agents/golden-signals-instrumenter.md +1 -0
- package/kit/agents/incident-investigator.md +1 -0
- package/kit/agents/integration-checker.md +201 -200
- package/kit/agents/invite-flow-implementer.md +190 -189
- package/kit/agents/legacy-characterizer.md +369 -368
- package/kit/agents/lgpd-compliance-auditor.md +296 -295
- package/kit/agents/load-shedding-instrumenter.md +1 -0
- package/kit/agents/multi-tenant-isolation-auditor.md +254 -253
- package/kit/agents/multi-tenant-rls-writer.md +341 -340
- package/kit/agents/nyquist-auditor.md +179 -178
- package/kit/agents/observability-coverage-auditor.md +316 -315
- package/kit/agents/observability-instrumenter.md +1 -0
- package/kit/agents/omm-auditor.md +1 -0
- package/kit/agents/org-onboarding-implementer.md +224 -223
- package/kit/agents/payload-capture-instrumenter.md +274 -273
- package/kit/agents/phase-researcher.md +697 -696
- package/kit/agents/plan-checker.md +273 -272
- package/kit/agents/planner.md +923 -922
- package/kit/agents/postmortem-writer.md +1 -0
- package/kit/agents/project-researcher.md +653 -652
- package/kit/agents/prr-conductor.md +1 -0
- package/kit/agents/refactor-safety-auditor.md +405 -404
- package/kit/agents/release-pipeline-auditor.md +1 -0
- package/kit/agents/research-synthesizer.md +246 -245
- package/kit/agents/roadmapper.md +678 -677
- package/kit/agents/schema-checker.md +1 -0
- package/kit/agents/seam-finder.md +360 -359
- package/kit/agents/shotgun-surgery-detector.md +350 -349
- package/kit/agents/slo-engineer.md +1 -0
- package/kit/agents/storytelling-analyst.md +1 -0
- package/kit/agents/supabase-architect.md +1 -0
- package/kit/agents/supabase-auth-bootstrapper.md +1 -0
- package/kit/agents/supabase-branching-architect.md +563 -562
- package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -777
- package/kit/agents/supabase-column-privileges-writer.md +400 -399
- package/kit/agents/supabase-edge-fn-tester.md +2 -1
- package/kit/agents/supabase-edge-fn-writer.md +2 -1
- package/kit/agents/supabase-migration-writer.md +386 -385
- package/kit/agents/supabase-rbac-implementer.md +393 -392
- package/kit/agents/supabase-realtime-implementer.md +364 -363
- package/kit/agents/supabase-rls-hardener.md +522 -521
- package/kit/agents/supabase-rls-writer.md +324 -323
- package/kit/agents/supabase-roles-implementer.md +356 -355
- package/kit/agents/supabase-storage-implementer.md +1 -0
- package/kit/agents/super-admin-implementer.md +282 -281
- package/kit/agents/toil-auditor.md +1 -0
- package/kit/agents/ui-auditor.md +438 -437
- package/kit/agents/ui-checker.md +303 -302
- package/kit/agents/ui-researcher.md +356 -355
- package/kit/agents/user-profiler.md +176 -175
- package/kit/agents/validador-evolucao-schema.md +336 -335
- package/kit/agents/verifier.md +729 -728
- 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.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/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 +82 -81
- 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 +29 -50
- package/kit/hooks/kit-router.cjs +137 -0
- 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-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 +1 -1
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +1 -1
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +1 -1
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- 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/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/package.json +1 -1
- package/src/core/kit.js +216 -216
- package/src/core/reflect.js +247 -247
- package/src/core/reverse-sync.js +372 -372
- package/src/core/sync.js +437 -418
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +794 -746
|
@@ -1,421 +1,421 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pre-refactor-characterization
|
|
3
|
-
description: Use ANTES de refatorar arquivo > 500 linhas OU com contrato externo (webhook, API pública, integração). Bloqueia o refactor até characterization tests existirem com cobertura ≥ 70%.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Legacy — Pre-Refactor Characterization Gate
|
|
7
|
-
|
|
8
|
-
## Quando usar
|
|
9
|
-
|
|
10
|
-
Esta skill é o **gate de safety** que dispara antes de qualquer refactor de risco. Carrega automaticamente quando:
|
|
11
|
-
|
|
12
|
-
- User pede para "refatorar" / "extrair" / "limpar" / "reorganizar" arquivo
|
|
13
|
-
- Arquivo alvo tem > 500 linhas
|
|
14
|
-
- Arquivo alvo tem contrato externo (webhook handler, API pública, edge function consumida por terceiros, integração)
|
|
15
|
-
- Arquivo alvo tem cobertura de teste atual < 60%
|
|
16
|
-
- Plano de fase contém `task.kind = refactor` em arquivo legado
|
|
17
|
-
- User menciona "esse código não tem testes mas preciso mudar"
|
|
18
|
-
|
|
19
|
-
Trigger phrases canônicas:
|
|
20
|
-
- "refatorar [arquivo]", "extract method de", "quebrar essa classe"
|
|
21
|
-
- "reorganizar esse módulo", "limpar essa função grande"
|
|
22
|
-
- "preciso modificar [arquivo grande]", "split de [monolítico]"
|
|
23
|
-
- "esse webhook não tem testes mas vou refatorar"
|
|
24
|
-
- "pre-refactor", "characterization gate"
|
|
25
|
-
|
|
26
|
-
## Regras absolutas
|
|
27
|
-
|
|
28
|
-
- **Refactor de risco SEM characterization = veto.** Skill bloqueia até cobertura comportamental ≥ 70% ou justificativa explícita de exceção.
|
|
29
|
-
- **3 critérios de risco — qualquer 1 dispara gate:**
|
|
30
|
-
1. Arquivo > 500 linhas
|
|
31
|
-
2. Contrato externo (webhook, API pública, integração externa, edge function consumida por terceiros)
|
|
32
|
-
3. Cobertura atual < 60% E mudança não é pure mechanical (rename/safe extraction sem mover lógica)
|
|
33
|
-
- **Safe extraction (rename, IDE-extracted contiguous block) é PERMITIDA sem characterization** — é mecânica, comportamento idêntico (cap 22). Só refactor com mudança comportamental requer characterization.
|
|
34
|
-
- **3 modos de exceção, todos rastreáveis:**
|
|
35
|
-
- `--mode=sprout` — não refatora, adiciona via sprout/wrap (skill `legacy-sprout-wrap-techniques`); novo código tem 100% de cobertura, legado fica intocado
|
|
36
|
-
- `--mode=safe-extract` — apenas refactor mecânico (rename, extract contiguous block via IDE); requer assinatura `safe-extraction-checklist` validada
|
|
37
|
-
- `--mode=override --reason "..."` — bypass com justificativa textual + ticket linkado para débito; aprovação humana obrigatória, audit trail
|
|
38
|
-
- **Bypass via memory/preferences é proibido.** Gate é audit-trail; cada exceção fica no PR/commit, não em config silenciosa.
|
|
39
|
-
- **Gate é CONSULTIVO em projetos < 50% maturity OMM.** Mostra warning + recomendação, não bloqueia se workflow.legacy_refactor_gate_blocking = false. Default = blocking quando integração com `omm-auditor` mostra Capacidade 1 (Resilience) ≥ 3.
|
|
40
|
-
|
|
41
|
-
## Patterns canônicos
|
|
42
|
-
|
|
43
|
-
### Pattern 1: Decisão do gate
|
|
44
|
-
|
|
45
|
-
```text
|
|
46
|
-
ENTRADA: file_path + change_kind (refactor | sprout | bug-fix | feature)
|
|
47
|
-
|
|
48
|
-
SE change_kind != refactor → PASS (gate só roda em refactor)
|
|
49
|
-
SE change_kind == refactor →
|
|
50
|
-
Coletar evidências:
|
|
51
|
-
- line_count = wc -l <file>
|
|
52
|
-
- has_external_contract = file matches /webhook|edge-function|public-api/ OR caller é fora do repo
|
|
53
|
-
- current_coverage = parse coverage report
|
|
54
|
-
- has_existing_characterization = check tests/characterization/<file>/
|
|
55
|
-
|
|
56
|
-
Aplicar critérios:
|
|
57
|
-
risco_alto = line_count > 500 OR has_external_contract
|
|
58
|
-
risco_medio = line_count > 200 OR current_coverage < 60%
|
|
59
|
-
|
|
60
|
-
SE risco_alto AND NOT has_existing_characterization →
|
|
61
|
-
BLOCK: "characterization tests requeridos antes de refactor.
|
|
62
|
-
Inicie via /caracterizar <file> ou aplique --mode=sprout."
|
|
63
|
-
|
|
64
|
-
SE risco_medio AND current_coverage < 70% →
|
|
65
|
-
WARN: "behavioral coverage baixa. Recomendado /caracterizar antes.
|
|
66
|
-
Use --mode=safe-extract se mudança é mecânica."
|
|
67
|
-
|
|
68
|
-
SE characterization existe E coverage ≥ 70% →
|
|
69
|
-
PASS: "safety net adequado. Refactor pode prosseguir."
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
### Pattern 2: Coleta de evidências canônicas
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
# PT-BR: critérios determinísticos
|
|
76
|
-
FILE="$1"
|
|
77
|
-
LINES=$(wc -l < "$FILE" 2>/dev/null || echo 0)
|
|
78
|
-
EXTERNAL_CONTRACT=false
|
|
79
|
-
|
|
80
|
-
# heurística de contrato externo
|
|
81
|
-
if echo "$FILE" | grep -qE "(webhook|edge.?function|api/v[0-9]|public/|integration/)" ; then
|
|
82
|
-
EXTERNAL_CONTRACT=true
|
|
83
|
-
fi
|
|
84
|
-
|
|
85
|
-
# verificar referências externas (consumido por outro repo via package import)
|
|
86
|
-
if grep -rn "from ['\"]\\.\\./.*$(basename $FILE .ts)" --include="*.ts" --include="*.js" "$(git rev-parse --show-toplevel)" >/dev/null 2>&1; then
|
|
87
|
-
CROSS_PACKAGE_REF=true
|
|
88
|
-
fi
|
|
89
|
-
|
|
90
|
-
# tentar parser cobertura comum
|
|
91
|
-
COV_FILE_PCT=""
|
|
92
|
-
if [ -f "coverage/coverage-summary.json" ]; then
|
|
93
|
-
COV_FILE_PCT=$(jq -r ".\"$(realpath $FILE)\".lines.pct // empty" coverage/coverage-summary.json)
|
|
94
|
-
fi
|
|
95
|
-
|
|
96
|
-
# verificar characterization tests existentes
|
|
97
|
-
HAS_CHAR=false
|
|
98
|
-
if [ -d "tests/characterization/$(dirname $FILE | sed 's|^src/||')" ] || \
|
|
99
|
-
[ -d "test/characterization/$(dirname $FILE | sed 's|^src/||')" ]; then
|
|
100
|
-
HAS_CHAR=true
|
|
101
|
-
fi
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### Pattern 3: Workflow recomendado pós-bloqueio
|
|
105
|
-
|
|
106
|
-
Quando gate bloqueia, oferecer caminho concreto:
|
|
107
|
-
|
|
108
|
-
```text
|
|
109
|
-
═══════════════════════════════════════════════════════════
|
|
110
|
-
PRE-REFACTOR-CHARACTERIZATION · BLOCK
|
|
111
|
-
file: src/orders/handler.ts (724 lines, has external contract)
|
|
112
|
-
current coverage: 12% (line)
|
|
113
|
-
characterization status: ABSENT
|
|
114
|
-
═══════════════════════════════════════════════════════════
|
|
115
|
-
|
|
116
|
-
Refactor de arquivo grande com contrato externo SEM characterization
|
|
117
|
-
tests é "edit and pray" (cap 1 Feathers). Para prosseguir:
|
|
118
|
-
|
|
119
|
-
Caminho 1 — Caracterizar primeiro (recomendado para refactor real)
|
|
120
|
-
/caracterizar src/orders/handler.ts
|
|
121
|
-
└─ gera characterization tests cobrindo 5+ inputs por equiv group
|
|
122
|
-
└─ leva 4-12h dependendo do tamanho
|
|
123
|
-
└─ resultado: cobertura comportamental ≥ 70% → gate passa
|
|
124
|
-
|
|
125
|
-
Caminho 2 — Mudança via sprout (não toca legado)
|
|
126
|
-
/refactor-seguro --mode=sprout src/orders/handler.ts
|
|
127
|
-
└─ adiciona comportamento novo em sprout method/class testado
|
|
128
|
-
└─ legado intocado → não há regressão possível
|
|
129
|
-
└─ leva 30 min - 4h dependendo da feature
|
|
130
|
-
|
|
131
|
-
Caminho 3 — Apenas safe extraction (rename, extract contiguous block)
|
|
132
|
-
/refactor-seguro --mode=safe-extract src/orders/handler.ts
|
|
133
|
-
└─ apenas refactor mecânico (IDE-assisted)
|
|
134
|
-
└─ proibido mover lógica entre escopos OR mudar control flow
|
|
135
|
-
└─ requer checklist assinado
|
|
136
|
-
|
|
137
|
-
Caminho 4 — Override com justificativa (audit trail)
|
|
138
|
-
/refactor-seguro --mode=override --reason "<texto>" --ticket REQ-N
|
|
139
|
-
└─ requer aprovação humana + ticket linkado
|
|
140
|
-
└─ débito técnico documentado
|
|
141
|
-
└─ usado apenas em casos genuinamente excepcionais
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### Pattern 4: Integração com fluxos do framework
|
|
145
|
-
|
|
146
|
-
| Workflow | Ponto de integração | Ação |
|
|
147
|
-
|---|---|---|
|
|
148
|
-
| `/discutir-fase` | discovery — questionário detecta refactor intent | Pergunta sobre arquivo alvo + sugere /caracterizar antes |
|
|
149
|
-
| `/planejar-fase` | gate de plano — `plan-checker` lê tasks | Bloqueia plano se task.kind=refactor + arquivo > 500 linhas + sem characterization linkada |
|
|
150
|
-
| `/executar-fase` | pre-task — antes de cada modificação no executor | Dispatch para `refactor-safety-auditor` antes de modificar arquivo flagged |
|
|
151
|
-
| `verifier` | pós-execution — análise reversa | Verifica characterization rodaram VERDE pós-refactor (snapshot diff = 0) |
|
|
152
|
-
| `nyquist-auditor` | retroativo — fase concluída | Lista refactors sem characterization → priority gap |
|
|
153
|
-
| `/auditar-marco` | gate milestone — opt-in `workflow.audit_milestone_legacy_refactor` | Lista refactors sem char no milestone → block close |
|
|
154
|
-
| `/forense` | pós-incidente | Postmortem de regression em refactor consume essa skill |
|
|
155
|
-
|
|
156
|
-
### Pattern 5: Heurística de "contrato externo"
|
|
157
|
-
|
|
158
|
-
Sinais que indicam arquivo é contrato (mais rigoroso que código interno):
|
|
159
|
-
|
|
160
|
-
```text
|
|
161
|
-
PATH PATTERNS
|
|
162
|
-
=============
|
|
163
|
-
- supabase/functions/<name>/index.ts (edge function)
|
|
164
|
-
- src/api/v[0-9]/ (versioned public API)
|
|
165
|
-
- src/handlers/webhooks/ (webhook handlers)
|
|
166
|
-
- src/integrations/<vendor>/ (third-party integrations)
|
|
167
|
-
- *Controller.ts, *Handler.ts (HTTP entry points)
|
|
168
|
-
- pages/api/ (Next.js API routes)
|
|
169
|
-
|
|
170
|
-
CONTENT MARKERS
|
|
171
|
-
===============
|
|
172
|
-
- exports a HTTP handler (Deno.serve, app.post, app.get)
|
|
173
|
-
- contains schema validation for external input (zod, joi, ajv)
|
|
174
|
-
- imports a webhook signature validator (Stripe, GitHub, etc.)
|
|
175
|
-
- has a OpenAPI/JSDoc @api comment
|
|
176
|
-
- referenced by a public consumer (other team, other repo, other client)
|
|
177
|
-
|
|
178
|
-
DOCUMENT MARKERS
|
|
179
|
-
================
|
|
180
|
-
- README/CONTRIBUTING references this file as "API contract"
|
|
181
|
-
- File name in CHANGELOG with breaking-change history
|
|
182
|
-
- Existence of CONTRACT.md OR API.md adjacent
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
Match em **qualquer** marker = contrato externo. Critério mais rigoroso porque consumer breakage é pior que internal regression.
|
|
186
|
-
|
|
187
|
-
### Pattern 6: Behavioral coverage vs line coverage
|
|
188
|
-
|
|
189
|
-
Gate consume **behavioral coverage**, não line coverage. Diferença:
|
|
190
|
-
|
|
191
|
-
```text
|
|
192
|
-
LINE COVERAGE 90%
|
|
193
|
-
==================
|
|
194
|
-
ALL_LINES = 100
|
|
195
|
-
LINES_HIT = 90
|
|
196
|
-
→ "90% covered" — mas pode ser inútil:
|
|
197
|
-
|
|
198
|
-
function foo(x) {
|
|
199
|
-
if (x > 0) { // ← linha hit
|
|
200
|
-
return doSomething(x) // ← linha hit
|
|
201
|
-
} // ← linha hit
|
|
202
|
-
return null // ← linha hit
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
test('foo — happy path', () => {
|
|
206
|
-
foo(5) // hit todas as linhas! 100% line coverage!
|
|
207
|
-
// ↑ MAS NENHUM ASSERTION sobre output. Bug em doSomething passa.
|
|
208
|
-
})
|
|
209
|
-
|
|
210
|
-
BEHAVIORAL COVERAGE 70%
|
|
211
|
-
========================
|
|
212
|
-
Critério: % de mutants killed em mutation testing
|
|
213
|
-
function foo(x) {
|
|
214
|
-
if (x > 0) { // mutant: x >= 0 → killed se test cobre x=0
|
|
215
|
-
return doSomething(x) // mutant: doSomething(0) → killed se assertion checa output
|
|
216
|
-
}
|
|
217
|
-
return null // mutant: return undefined → killed se test asserta null
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
→ apenas tests com assertions reais sobre output matam mutants
|
|
221
|
-
→ 70% mutant kill = "70% das alterações comportamentais detectadas"
|
|
222
|
-
→ proxy de safety muito mais robusto
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
**Default tooling do gate:**
|
|
226
|
-
- Stryker (JS/TS) — `npx stryker run`
|
|
227
|
-
- Mutmut (Python) — `mutmut run && mutmut results`
|
|
228
|
-
- Pitest (Java) — `mvn pitest:mutationCoverage`
|
|
229
|
-
|
|
230
|
-
Sem mutation testing rodado, gate aceita line coverage ≥ 80% como proxy temporário (com warning para configurar mutation testing).
|
|
231
|
-
|
|
232
|
-
### Pattern 7: Captura de "payload real" para snapshot
|
|
233
|
-
|
|
234
|
-
Para refactor de webhook/edge function, characterization mais valiosa usa payloads REAIS de produção:
|
|
235
|
-
|
|
236
|
-
```text
|
|
237
|
-
WORKFLOW DE CAPTURA
|
|
238
|
-
====================
|
|
239
|
-
1. Adicionar log dedicado em produção que captura payload (sanitized) por N dias.
|
|
240
|
-
2. Sample 50-200 payloads cobrindo distribuição real de inputs.
|
|
241
|
-
3. Sanitize PII (CPF, email, nome, telefone) via post-processing deterministic.
|
|
242
|
-
4. Salvar em tests/characterization/<handler>/fixtures/payload-NN.json
|
|
243
|
-
5. Test gerado por handler + payload → output (sanitized) → snapshot.
|
|
244
|
-
|
|
245
|
-
PRINCÍPIO DE CAPTURA
|
|
246
|
-
=====================
|
|
247
|
-
- Sample é REAL DISTRIBUTION, não sintético.
|
|
248
|
-
- Inclui edge cases observados em prod (encoding raro, payloads malformados, retries).
|
|
249
|
-
- Sanitização é REVERSIBLE em ambiente de debug, NÃO em snapshot commit.
|
|
250
|
-
- 50 payloads reais > 500 sintéticos (cobertura de combinations naturalmente correta).
|
|
251
|
-
|
|
252
|
-
INSTRUMENTAÇÃO MÍNIMA (Edge Function exemplo Deno)
|
|
253
|
-
====================================================
|
|
254
|
-
import { logger } from '../_shared/logger.ts'
|
|
255
|
-
|
|
256
|
-
Deno.serve(async (req) => {
|
|
257
|
-
const payload = await req.json()
|
|
258
|
-
|
|
259
|
-
// PT-BR: log dedicado para characterization — only enable when CAPTURE_PAYLOADS=true
|
|
260
|
-
if (Deno.env.get('CAPTURE_PAYLOADS') === 'true') {
|
|
261
|
-
logger.info('payload-capture', {
|
|
262
|
-
sanitized: sanitizePayload(payload), // remove PII
|
|
263
|
-
timestamp: new Date().toISOString(),
|
|
264
|
-
handler: 'process-orders',
|
|
265
|
-
})
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// ... lógica existente ...
|
|
269
|
-
})
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
**Após N dias** (sugestão: 7-14), extrair logs, transformar em fixtures, escrever characterization tests usando-os. Skill `observability-driven-development` (v1.9) referenciada para boa instrumentação.
|
|
273
|
-
|
|
274
|
-
### Pattern 8: Frontmatter do CONTEXT.md (integração com /discutir-fase)
|
|
275
|
-
|
|
276
|
-
`/discutir-fase` (v1.9) injeta seção `<refactor_safety>` em CONTEXT.md quando detecta refactor intent:
|
|
277
|
-
|
|
278
|
-
```markdown
|
|
279
|
-
<refactor_safety>
|
|
280
|
-
<file_path>src/orders/handler.ts</file_path>
|
|
281
|
-
<line_count>724</line_count>
|
|
282
|
-
<has_external_contract>true</has_external_contract>
|
|
283
|
-
<current_coverage_pct>12</current_coverage_pct>
|
|
284
|
-
<characterization_status>absent</characterization_status>
|
|
285
|
-
<gate_decision>BLOCK</gate_decision>
|
|
286
|
-
<recommended_path>caminho_1_caracterizar</recommended_path>
|
|
287
|
-
<effort_estimate>8-16h</effort_estimate>
|
|
288
|
-
<risk_acknowledgment>
|
|
289
|
-
User reconhece que sem characterization, refactor é "edit and pray".
|
|
290
|
-
</risk_acknowledgment>
|
|
291
|
-
</refactor_safety>
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
`plan-checker` consume essa seção para decidir aprovação do plano.
|
|
295
|
-
|
|
296
|
-
## Anti-patterns
|
|
297
|
-
|
|
298
|
-
### ANTI: bypass silencioso "porque é simples"
|
|
299
|
-
|
|
300
|
-
```text
|
|
301
|
-
ANTI: developer "sabe que pode" mudar arquivo grande sem char tests
|
|
302
|
-
"porque a mudança é só renomear uma variável".
|
|
303
|
-
|
|
304
|
-
PROBLEMA: rename é mecânico → permitido. Mas "é só renomear" muitas
|
|
305
|
-
vezes vira "renomear + ajustar tipo + atualizar caller +
|
|
306
|
-
fix bug encontrado" — agora não é mais safe extraction.
|
|
307
|
-
Sem gate, transição é invisível.
|
|
308
|
-
|
|
309
|
-
CERTO: --mode=safe-extract com checklist assinado. Cada item é veto:
|
|
310
|
-
"movi lógica entre escopos? não". "mudei control flow? não".
|
|
311
|
-
Self-audit explícito força disciplina single-goal.
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
### ANTI: characterization "para ganhar tempo"
|
|
315
|
-
|
|
316
|
-
```text
|
|
317
|
-
ANTI: developer escreve 2 testes happy-path e marca characterization
|
|
318
|
-
como "feita". Coverage 25%. Gate ainda BLOCK mas dev gambiarra
|
|
319
|
-
coverage report.
|
|
320
|
-
|
|
321
|
-
PROBLEMA: gate bypass virtual. Próxima regressão silenciosa em prod.
|
|
322
|
-
|
|
323
|
-
CERTO: gate VERIFICA mutation testing (não só line coverage).
|
|
324
|
-
Survived mutants ≥ 30% = falha. Workaround é caro: precisa
|
|
325
|
-
de tests reais. Aligns incentive com safety.
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
### ANTI: override sem ticket
|
|
329
|
-
|
|
330
|
-
```text
|
|
331
|
-
ANTI: --mode=override --reason "tô com pressa, depois faço".
|
|
332
|
-
|
|
333
|
-
PROBLEMA: débito invisível. "Depois" nunca chega. Hot path do legado
|
|
334
|
-
fica untested forever.
|
|
335
|
-
|
|
336
|
-
CERTO: gate exige --ticket REQ-N (linkado a issue real). Issue
|
|
337
|
-
contém nome do dev, prazo, plano. Audit trail força
|
|
338
|
-
compliance ou documenta porque não.
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
### ANTI: gate aplicado uniformemente sem maturity
|
|
342
|
-
|
|
343
|
-
```text
|
|
344
|
-
ANTI: projeto greenfield 1 mês de idade, gate bloqueia toda
|
|
345
|
-
tentativa de refactor. Equipe vira a 100% characterization.
|
|
346
|
-
Velocidade colapsa.
|
|
347
|
-
|
|
348
|
-
PROBLEMA: gate calibrado para legacy code maduro, aplicado em
|
|
349
|
-
contexto greenfield, vira fricção.
|
|
350
|
-
|
|
351
|
-
CERTO: workflow.legacy_refactor_gate_blocking = false em projetos
|
|
352
|
-
jovens. Gate vira CONSULTIVO (warning + recomendação).
|
|
353
|
-
Bloqueia apenas quando OMM Capacidade 1 ≥ 3 (resiliência
|
|
354
|
-
já estabelecida) — sinal de que projeto cresceu o suficiente
|
|
355
|
-
para precisar de safety net.
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
### ANTI: characterization de TUDO antes de qualquer mudança
|
|
359
|
-
|
|
360
|
-
```text
|
|
361
|
-
ANTI: equipe interpreta gate como "tem que ter 100% cobertura
|
|
362
|
-
de TODA a codebase antes de qualquer refactor".
|
|
363
|
-
|
|
364
|
-
PROBLEMA: total inviável. Gate vira motivo para nunca refatorar.
|
|
365
|
-
Codebase deteriora.
|
|
366
|
-
|
|
367
|
-
CERTO: gate é PER-FILE para arquivos sendo TOCADOS. Aplica APENAS
|
|
368
|
-
no escopo da mudança atual. Resto da codebase pode estar
|
|
369
|
-
0% — não bloqueia. Refactor incremental cresce cobertura
|
|
370
|
-
organicamente, file by file.
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
## Verificação
|
|
374
|
-
|
|
375
|
-
Antes de gate liberar refactor:
|
|
376
|
-
|
|
377
|
-
1. **Critérios coletados** — line count, contrato externo, cobertura atual
|
|
378
|
-
2. **Decisão correta para evidências** — BLOCK / WARN / PASS conforme matriz
|
|
379
|
-
3. **Caminhos oferecidos quando BLOCK** — 4 opções (caracterizar, sprout, safe-extract, override)
|
|
380
|
-
4. **Override tem ticket linkado** — sem ticket = inválido
|
|
381
|
-
5. **Mutation testing rodado** — não basta line coverage
|
|
382
|
-
6. **Snapshots revisados** se characterization presente — não automaticamente confiados
|
|
383
|
-
7. **CONTEXT.md tem seção `<refactor_safety>`** se via `/discutir-fase`
|
|
384
|
-
8. **Audit trail no PR** — decisão do gate registrada no commit/PR
|
|
385
|
-
|
|
386
|
-
## Configuração do gate
|
|
387
|
-
|
|
388
|
-
```toml
|
|
389
|
-
# .planning/config.json (ou planning-config equivalent)
|
|
390
|
-
[workflow]
|
|
391
|
-
legacy_refactor_gate_blocking = true # default em projetos com OMM ≥ 3
|
|
392
|
-
legacy_refactor_min_lines = 500 # threshold de "arquivo grande"
|
|
393
|
-
legacy_refactor_min_coverage_pct = 70 # threshold para gate passar
|
|
394
|
-
legacy_refactor_external_paths = [ # patterns de contrato externo
|
|
395
|
-
"supabase/functions/**",
|
|
396
|
-
"src/api/**",
|
|
397
|
-
"src/handlers/webhooks/**",
|
|
398
|
-
"pages/api/**",
|
|
399
|
-
]
|
|
400
|
-
legacy_refactor_mutation_required = true # mutation testing obrigatório?
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
Defaults respeitam maturity do projeto via `omm-auditor` integration:
|
|
404
|
-
- Capacidade 1 (Resilience) < 3 → blocking = false (consultivo)
|
|
405
|
-
- Capacidade 1 (Resilience) ≥ 3 → blocking = true (default)
|
|
406
|
-
|
|
407
|
-
---
|
|
408
|
-
|
|
409
|
-
## Ver também
|
|
410
|
-
|
|
411
|
-
- [`_shared-legacy/glossary.md`](../_shared-legacy/glossary.md) — vocabulário canônico
|
|
412
|
-
- [`legacy-characterization-tests`](../legacy-characterization-tests/SKILL.md) — caminho 1 (caracterizar primeiro)
|
|
413
|
-
- [`legacy-sprout-wrap-techniques`](../legacy-sprout-wrap-techniques/SKILL.md) — caminho 2 (sprout/wrap, não toca legado)
|
|
414
|
-
- [`legacy-monster-methods`](../legacy-monster-methods/SKILL.md) — caminho 3 (safe extraction em método grande)
|
|
415
|
-
- [`legacy-seams-and-test-harness`](../legacy-seams-and-test-harness/SKILL.md) — pré-requisito quando dependências bloqueiam characterization
|
|
416
|
-
- [`legacy-effect-analysis`](../legacy-effect-analysis/SKILL.md) — quais inputs cobrir? sketch identifica inflection points
|
|
417
|
-
- [`refactor-safety-auditor`](../../agents/refactor-safety-auditor.md) — agent que executa esse gate em runtime
|
|
418
|
-
- [`observability-driven-development`](../observability-driven-development/SKILL.md) (v1.9) — instrumentação para captura de payloads reais
|
|
419
|
-
- [`production-readiness-review`](../production-readiness-review/SKILL.md) (v1.10) — PRR Axe 5 (Change Management) consume status do gate
|
|
420
|
-
|
|
421
|
-
*Material-fonte: Working Effectively with Legacy Code — Feathers, 2004 — Cap 1: "Changing Software" + Cap 13: "Characterization Tests" + Cap 23: "How Do I Know That I'm Not Breaking Anything?".*
|
|
1
|
+
---
|
|
2
|
+
name: pre-refactor-characterization
|
|
3
|
+
description: Use ANTES de refatorar arquivo > 500 linhas OU com contrato externo (webhook, API pública, integração). Bloqueia o refactor até characterization tests existirem com cobertura ≥ 70%.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Legacy — Pre-Refactor Characterization Gate
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
Esta skill é o **gate de safety** que dispara antes de qualquer refactor de risco. Carrega automaticamente quando:
|
|
11
|
+
|
|
12
|
+
- User pede para "refatorar" / "extrair" / "limpar" / "reorganizar" arquivo
|
|
13
|
+
- Arquivo alvo tem > 500 linhas
|
|
14
|
+
- Arquivo alvo tem contrato externo (webhook handler, API pública, edge function consumida por terceiros, integração)
|
|
15
|
+
- Arquivo alvo tem cobertura de teste atual < 60%
|
|
16
|
+
- Plano de fase contém `task.kind = refactor` em arquivo legado
|
|
17
|
+
- User menciona "esse código não tem testes mas preciso mudar"
|
|
18
|
+
|
|
19
|
+
Trigger phrases canônicas:
|
|
20
|
+
- "refatorar [arquivo]", "extract method de", "quebrar essa classe"
|
|
21
|
+
- "reorganizar esse módulo", "limpar essa função grande"
|
|
22
|
+
- "preciso modificar [arquivo grande]", "split de [monolítico]"
|
|
23
|
+
- "esse webhook não tem testes mas vou refatorar"
|
|
24
|
+
- "pre-refactor", "characterization gate"
|
|
25
|
+
|
|
26
|
+
## Regras absolutas
|
|
27
|
+
|
|
28
|
+
- **Refactor de risco SEM characterization = veto.** Skill bloqueia até cobertura comportamental ≥ 70% ou justificativa explícita de exceção.
|
|
29
|
+
- **3 critérios de risco — qualquer 1 dispara gate:**
|
|
30
|
+
1. Arquivo > 500 linhas
|
|
31
|
+
2. Contrato externo (webhook, API pública, integração externa, edge function consumida por terceiros)
|
|
32
|
+
3. Cobertura atual < 60% E mudança não é pure mechanical (rename/safe extraction sem mover lógica)
|
|
33
|
+
- **Safe extraction (rename, IDE-extracted contiguous block) é PERMITIDA sem characterization** — é mecânica, comportamento idêntico (cap 22). Só refactor com mudança comportamental requer characterization.
|
|
34
|
+
- **3 modos de exceção, todos rastreáveis:**
|
|
35
|
+
- `--mode=sprout` — não refatora, adiciona via sprout/wrap (skill `legacy-sprout-wrap-techniques`); novo código tem 100% de cobertura, legado fica intocado
|
|
36
|
+
- `--mode=safe-extract` — apenas refactor mecânico (rename, extract contiguous block via IDE); requer assinatura `safe-extraction-checklist` validada
|
|
37
|
+
- `--mode=override --reason "..."` — bypass com justificativa textual + ticket linkado para débito; aprovação humana obrigatória, audit trail
|
|
38
|
+
- **Bypass via memory/preferences é proibido.** Gate é audit-trail; cada exceção fica no PR/commit, não em config silenciosa.
|
|
39
|
+
- **Gate é CONSULTIVO em projetos < 50% maturity OMM.** Mostra warning + recomendação, não bloqueia se workflow.legacy_refactor_gate_blocking = false. Default = blocking quando integração com `omm-auditor` mostra Capacidade 1 (Resilience) ≥ 3.
|
|
40
|
+
|
|
41
|
+
## Patterns canônicos
|
|
42
|
+
|
|
43
|
+
### Pattern 1: Decisão do gate
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
ENTRADA: file_path + change_kind (refactor | sprout | bug-fix | feature)
|
|
47
|
+
|
|
48
|
+
SE change_kind != refactor → PASS (gate só roda em refactor)
|
|
49
|
+
SE change_kind == refactor →
|
|
50
|
+
Coletar evidências:
|
|
51
|
+
- line_count = wc -l <file>
|
|
52
|
+
- has_external_contract = file matches /webhook|edge-function|public-api/ OR caller é fora do repo
|
|
53
|
+
- current_coverage = parse coverage report
|
|
54
|
+
- has_existing_characterization = check tests/characterization/<file>/
|
|
55
|
+
|
|
56
|
+
Aplicar critérios:
|
|
57
|
+
risco_alto = line_count > 500 OR has_external_contract
|
|
58
|
+
risco_medio = line_count > 200 OR current_coverage < 60%
|
|
59
|
+
|
|
60
|
+
SE risco_alto AND NOT has_existing_characterization →
|
|
61
|
+
BLOCK: "characterization tests requeridos antes de refactor.
|
|
62
|
+
Inicie via /caracterizar <file> ou aplique --mode=sprout."
|
|
63
|
+
|
|
64
|
+
SE risco_medio AND current_coverage < 70% →
|
|
65
|
+
WARN: "behavioral coverage baixa. Recomendado /caracterizar antes.
|
|
66
|
+
Use --mode=safe-extract se mudança é mecânica."
|
|
67
|
+
|
|
68
|
+
SE characterization existe E coverage ≥ 70% →
|
|
69
|
+
PASS: "safety net adequado. Refactor pode prosseguir."
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Pattern 2: Coleta de evidências canônicas
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# PT-BR: critérios determinísticos
|
|
76
|
+
FILE="$1"
|
|
77
|
+
LINES=$(wc -l < "$FILE" 2>/dev/null || echo 0)
|
|
78
|
+
EXTERNAL_CONTRACT=false
|
|
79
|
+
|
|
80
|
+
# heurística de contrato externo
|
|
81
|
+
if echo "$FILE" | grep -qE "(webhook|edge.?function|api/v[0-9]|public/|integration/)" ; then
|
|
82
|
+
EXTERNAL_CONTRACT=true
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# verificar referências externas (consumido por outro repo via package import)
|
|
86
|
+
if grep -rn "from ['\"]\\.\\./.*$(basename $FILE .ts)" --include="*.ts" --include="*.js" "$(git rev-parse --show-toplevel)" >/dev/null 2>&1; then
|
|
87
|
+
CROSS_PACKAGE_REF=true
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# tentar parser cobertura comum
|
|
91
|
+
COV_FILE_PCT=""
|
|
92
|
+
if [ -f "coverage/coverage-summary.json" ]; then
|
|
93
|
+
COV_FILE_PCT=$(jq -r ".\"$(realpath $FILE)\".lines.pct // empty" coverage/coverage-summary.json)
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# verificar characterization tests existentes
|
|
97
|
+
HAS_CHAR=false
|
|
98
|
+
if [ -d "tests/characterization/$(dirname $FILE | sed 's|^src/||')" ] || \
|
|
99
|
+
[ -d "test/characterization/$(dirname $FILE | sed 's|^src/||')" ]; then
|
|
100
|
+
HAS_CHAR=true
|
|
101
|
+
fi
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Pattern 3: Workflow recomendado pós-bloqueio
|
|
105
|
+
|
|
106
|
+
Quando gate bloqueia, oferecer caminho concreto:
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
═══════════════════════════════════════════════════════════
|
|
110
|
+
PRE-REFACTOR-CHARACTERIZATION · BLOCK
|
|
111
|
+
file: src/orders/handler.ts (724 lines, has external contract)
|
|
112
|
+
current coverage: 12% (line)
|
|
113
|
+
characterization status: ABSENT
|
|
114
|
+
═══════════════════════════════════════════════════════════
|
|
115
|
+
|
|
116
|
+
Refactor de arquivo grande com contrato externo SEM characterization
|
|
117
|
+
tests é "edit and pray" (cap 1 Feathers). Para prosseguir:
|
|
118
|
+
|
|
119
|
+
Caminho 1 — Caracterizar primeiro (recomendado para refactor real)
|
|
120
|
+
/caracterizar src/orders/handler.ts
|
|
121
|
+
└─ gera characterization tests cobrindo 5+ inputs por equiv group
|
|
122
|
+
└─ leva 4-12h dependendo do tamanho
|
|
123
|
+
└─ resultado: cobertura comportamental ≥ 70% → gate passa
|
|
124
|
+
|
|
125
|
+
Caminho 2 — Mudança via sprout (não toca legado)
|
|
126
|
+
/refactor-seguro --mode=sprout src/orders/handler.ts
|
|
127
|
+
└─ adiciona comportamento novo em sprout method/class testado
|
|
128
|
+
└─ legado intocado → não há regressão possível
|
|
129
|
+
└─ leva 30 min - 4h dependendo da feature
|
|
130
|
+
|
|
131
|
+
Caminho 3 — Apenas safe extraction (rename, extract contiguous block)
|
|
132
|
+
/refactor-seguro --mode=safe-extract src/orders/handler.ts
|
|
133
|
+
└─ apenas refactor mecânico (IDE-assisted)
|
|
134
|
+
└─ proibido mover lógica entre escopos OR mudar control flow
|
|
135
|
+
└─ requer checklist assinado
|
|
136
|
+
|
|
137
|
+
Caminho 4 — Override com justificativa (audit trail)
|
|
138
|
+
/refactor-seguro --mode=override --reason "<texto>" --ticket REQ-N
|
|
139
|
+
└─ requer aprovação humana + ticket linkado
|
|
140
|
+
└─ débito técnico documentado
|
|
141
|
+
└─ usado apenas em casos genuinamente excepcionais
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Pattern 4: Integração com fluxos do framework
|
|
145
|
+
|
|
146
|
+
| Workflow | Ponto de integração | Ação |
|
|
147
|
+
|---|---|---|
|
|
148
|
+
| `/discutir-fase` | discovery — questionário detecta refactor intent | Pergunta sobre arquivo alvo + sugere /caracterizar antes |
|
|
149
|
+
| `/planejar-fase` | gate de plano — `plan-checker` lê tasks | Bloqueia plano se task.kind=refactor + arquivo > 500 linhas + sem characterization linkada |
|
|
150
|
+
| `/executar-fase` | pre-task — antes de cada modificação no executor | Dispatch para `refactor-safety-auditor` antes de modificar arquivo flagged |
|
|
151
|
+
| `verifier` | pós-execution — análise reversa | Verifica characterization rodaram VERDE pós-refactor (snapshot diff = 0) |
|
|
152
|
+
| `nyquist-auditor` | retroativo — fase concluída | Lista refactors sem characterization → priority gap |
|
|
153
|
+
| `/auditar-marco` | gate milestone — opt-in `workflow.audit_milestone_legacy_refactor` | Lista refactors sem char no milestone → block close |
|
|
154
|
+
| `/forense` | pós-incidente | Postmortem de regression em refactor consume essa skill |
|
|
155
|
+
|
|
156
|
+
### Pattern 5: Heurística de "contrato externo"
|
|
157
|
+
|
|
158
|
+
Sinais que indicam arquivo é contrato (mais rigoroso que código interno):
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
PATH PATTERNS
|
|
162
|
+
=============
|
|
163
|
+
- supabase/functions/<name>/index.ts (edge function)
|
|
164
|
+
- src/api/v[0-9]/ (versioned public API)
|
|
165
|
+
- src/handlers/webhooks/ (webhook handlers)
|
|
166
|
+
- src/integrations/<vendor>/ (third-party integrations)
|
|
167
|
+
- *Controller.ts, *Handler.ts (HTTP entry points)
|
|
168
|
+
- pages/api/ (Next.js API routes)
|
|
169
|
+
|
|
170
|
+
CONTENT MARKERS
|
|
171
|
+
===============
|
|
172
|
+
- exports a HTTP handler (Deno.serve, app.post, app.get)
|
|
173
|
+
- contains schema validation for external input (zod, joi, ajv)
|
|
174
|
+
- imports a webhook signature validator (Stripe, GitHub, etc.)
|
|
175
|
+
- has a OpenAPI/JSDoc @api comment
|
|
176
|
+
- referenced by a public consumer (other team, other repo, other client)
|
|
177
|
+
|
|
178
|
+
DOCUMENT MARKERS
|
|
179
|
+
================
|
|
180
|
+
- README/CONTRIBUTING references this file as "API contract"
|
|
181
|
+
- File name in CHANGELOG with breaking-change history
|
|
182
|
+
- Existence of CONTRACT.md OR API.md adjacent
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Match em **qualquer** marker = contrato externo. Critério mais rigoroso porque consumer breakage é pior que internal regression.
|
|
186
|
+
|
|
187
|
+
### Pattern 6: Behavioral coverage vs line coverage
|
|
188
|
+
|
|
189
|
+
Gate consume **behavioral coverage**, não line coverage. Diferença:
|
|
190
|
+
|
|
191
|
+
```text
|
|
192
|
+
LINE COVERAGE 90%
|
|
193
|
+
==================
|
|
194
|
+
ALL_LINES = 100
|
|
195
|
+
LINES_HIT = 90
|
|
196
|
+
→ "90% covered" — mas pode ser inútil:
|
|
197
|
+
|
|
198
|
+
function foo(x) {
|
|
199
|
+
if (x > 0) { // ← linha hit
|
|
200
|
+
return doSomething(x) // ← linha hit
|
|
201
|
+
} // ← linha hit
|
|
202
|
+
return null // ← linha hit
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
test('foo — happy path', () => {
|
|
206
|
+
foo(5) // hit todas as linhas! 100% line coverage!
|
|
207
|
+
// ↑ MAS NENHUM ASSERTION sobre output. Bug em doSomething passa.
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
BEHAVIORAL COVERAGE 70%
|
|
211
|
+
========================
|
|
212
|
+
Critério: % de mutants killed em mutation testing
|
|
213
|
+
function foo(x) {
|
|
214
|
+
if (x > 0) { // mutant: x >= 0 → killed se test cobre x=0
|
|
215
|
+
return doSomething(x) // mutant: doSomething(0) → killed se assertion checa output
|
|
216
|
+
}
|
|
217
|
+
return null // mutant: return undefined → killed se test asserta null
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
→ apenas tests com assertions reais sobre output matam mutants
|
|
221
|
+
→ 70% mutant kill = "70% das alterações comportamentais detectadas"
|
|
222
|
+
→ proxy de safety muito mais robusto
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Default tooling do gate:**
|
|
226
|
+
- Stryker (JS/TS) — `npx stryker run`
|
|
227
|
+
- Mutmut (Python) — `mutmut run && mutmut results`
|
|
228
|
+
- Pitest (Java) — `mvn pitest:mutationCoverage`
|
|
229
|
+
|
|
230
|
+
Sem mutation testing rodado, gate aceita line coverage ≥ 80% como proxy temporário (com warning para configurar mutation testing).
|
|
231
|
+
|
|
232
|
+
### Pattern 7: Captura de "payload real" para snapshot
|
|
233
|
+
|
|
234
|
+
Para refactor de webhook/edge function, characterization mais valiosa usa payloads REAIS de produção:
|
|
235
|
+
|
|
236
|
+
```text
|
|
237
|
+
WORKFLOW DE CAPTURA
|
|
238
|
+
====================
|
|
239
|
+
1. Adicionar log dedicado em produção que captura payload (sanitized) por N dias.
|
|
240
|
+
2. Sample 50-200 payloads cobrindo distribuição real de inputs.
|
|
241
|
+
3. Sanitize PII (CPF, email, nome, telefone) via post-processing deterministic.
|
|
242
|
+
4. Salvar em tests/characterization/<handler>/fixtures/payload-NN.json
|
|
243
|
+
5. Test gerado por handler + payload → output (sanitized) → snapshot.
|
|
244
|
+
|
|
245
|
+
PRINCÍPIO DE CAPTURA
|
|
246
|
+
=====================
|
|
247
|
+
- Sample é REAL DISTRIBUTION, não sintético.
|
|
248
|
+
- Inclui edge cases observados em prod (encoding raro, payloads malformados, retries).
|
|
249
|
+
- Sanitização é REVERSIBLE em ambiente de debug, NÃO em snapshot commit.
|
|
250
|
+
- 50 payloads reais > 500 sintéticos (cobertura de combinations naturalmente correta).
|
|
251
|
+
|
|
252
|
+
INSTRUMENTAÇÃO MÍNIMA (Edge Function exemplo Deno)
|
|
253
|
+
====================================================
|
|
254
|
+
import { logger } from '../_shared/logger.ts'
|
|
255
|
+
|
|
256
|
+
Deno.serve(async (req) => {
|
|
257
|
+
const payload = await req.json()
|
|
258
|
+
|
|
259
|
+
// PT-BR: log dedicado para characterization — only enable when CAPTURE_PAYLOADS=true
|
|
260
|
+
if (Deno.env.get('CAPTURE_PAYLOADS') === 'true') {
|
|
261
|
+
logger.info('payload-capture', {
|
|
262
|
+
sanitized: sanitizePayload(payload), // remove PII
|
|
263
|
+
timestamp: new Date().toISOString(),
|
|
264
|
+
handler: 'process-orders',
|
|
265
|
+
})
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// ... lógica existente ...
|
|
269
|
+
})
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Após N dias** (sugestão: 7-14), extrair logs, transformar em fixtures, escrever characterization tests usando-os. Skill `observability-driven-development` (v1.9) referenciada para boa instrumentação.
|
|
273
|
+
|
|
274
|
+
### Pattern 8: Frontmatter do CONTEXT.md (integração com /discutir-fase)
|
|
275
|
+
|
|
276
|
+
`/discutir-fase` (v1.9) injeta seção `<refactor_safety>` em CONTEXT.md quando detecta refactor intent:
|
|
277
|
+
|
|
278
|
+
```markdown
|
|
279
|
+
<refactor_safety>
|
|
280
|
+
<file_path>src/orders/handler.ts</file_path>
|
|
281
|
+
<line_count>724</line_count>
|
|
282
|
+
<has_external_contract>true</has_external_contract>
|
|
283
|
+
<current_coverage_pct>12</current_coverage_pct>
|
|
284
|
+
<characterization_status>absent</characterization_status>
|
|
285
|
+
<gate_decision>BLOCK</gate_decision>
|
|
286
|
+
<recommended_path>caminho_1_caracterizar</recommended_path>
|
|
287
|
+
<effort_estimate>8-16h</effort_estimate>
|
|
288
|
+
<risk_acknowledgment>
|
|
289
|
+
User reconhece que sem characterization, refactor é "edit and pray".
|
|
290
|
+
</risk_acknowledgment>
|
|
291
|
+
</refactor_safety>
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
`plan-checker` consume essa seção para decidir aprovação do plano.
|
|
295
|
+
|
|
296
|
+
## Anti-patterns
|
|
297
|
+
|
|
298
|
+
### ANTI: bypass silencioso "porque é simples"
|
|
299
|
+
|
|
300
|
+
```text
|
|
301
|
+
ANTI: developer "sabe que pode" mudar arquivo grande sem char tests
|
|
302
|
+
"porque a mudança é só renomear uma variável".
|
|
303
|
+
|
|
304
|
+
PROBLEMA: rename é mecânico → permitido. Mas "é só renomear" muitas
|
|
305
|
+
vezes vira "renomear + ajustar tipo + atualizar caller +
|
|
306
|
+
fix bug encontrado" — agora não é mais safe extraction.
|
|
307
|
+
Sem gate, transição é invisível.
|
|
308
|
+
|
|
309
|
+
CERTO: --mode=safe-extract com checklist assinado. Cada item é veto:
|
|
310
|
+
"movi lógica entre escopos? não". "mudei control flow? não".
|
|
311
|
+
Self-audit explícito força disciplina single-goal.
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### ANTI: characterization "para ganhar tempo"
|
|
315
|
+
|
|
316
|
+
```text
|
|
317
|
+
ANTI: developer escreve 2 testes happy-path e marca characterization
|
|
318
|
+
como "feita". Coverage 25%. Gate ainda BLOCK mas dev gambiarra
|
|
319
|
+
coverage report.
|
|
320
|
+
|
|
321
|
+
PROBLEMA: gate bypass virtual. Próxima regressão silenciosa em prod.
|
|
322
|
+
|
|
323
|
+
CERTO: gate VERIFICA mutation testing (não só line coverage).
|
|
324
|
+
Survived mutants ≥ 30% = falha. Workaround é caro: precisa
|
|
325
|
+
de tests reais. Aligns incentive com safety.
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### ANTI: override sem ticket
|
|
329
|
+
|
|
330
|
+
```text
|
|
331
|
+
ANTI: --mode=override --reason "tô com pressa, depois faço".
|
|
332
|
+
|
|
333
|
+
PROBLEMA: débito invisível. "Depois" nunca chega. Hot path do legado
|
|
334
|
+
fica untested forever.
|
|
335
|
+
|
|
336
|
+
CERTO: gate exige --ticket REQ-N (linkado a issue real). Issue
|
|
337
|
+
contém nome do dev, prazo, plano. Audit trail força
|
|
338
|
+
compliance ou documenta porque não.
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### ANTI: gate aplicado uniformemente sem maturity
|
|
342
|
+
|
|
343
|
+
```text
|
|
344
|
+
ANTI: projeto greenfield 1 mês de idade, gate bloqueia toda
|
|
345
|
+
tentativa de refactor. Equipe vira a 100% characterization.
|
|
346
|
+
Velocidade colapsa.
|
|
347
|
+
|
|
348
|
+
PROBLEMA: gate calibrado para legacy code maduro, aplicado em
|
|
349
|
+
contexto greenfield, vira fricção.
|
|
350
|
+
|
|
351
|
+
CERTO: workflow.legacy_refactor_gate_blocking = false em projetos
|
|
352
|
+
jovens. Gate vira CONSULTIVO (warning + recomendação).
|
|
353
|
+
Bloqueia apenas quando OMM Capacidade 1 ≥ 3 (resiliência
|
|
354
|
+
já estabelecida) — sinal de que projeto cresceu o suficiente
|
|
355
|
+
para precisar de safety net.
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### ANTI: characterization de TUDO antes de qualquer mudança
|
|
359
|
+
|
|
360
|
+
```text
|
|
361
|
+
ANTI: equipe interpreta gate como "tem que ter 100% cobertura
|
|
362
|
+
de TODA a codebase antes de qualquer refactor".
|
|
363
|
+
|
|
364
|
+
PROBLEMA: total inviável. Gate vira motivo para nunca refatorar.
|
|
365
|
+
Codebase deteriora.
|
|
366
|
+
|
|
367
|
+
CERTO: gate é PER-FILE para arquivos sendo TOCADOS. Aplica APENAS
|
|
368
|
+
no escopo da mudança atual. Resto da codebase pode estar
|
|
369
|
+
0% — não bloqueia. Refactor incremental cresce cobertura
|
|
370
|
+
organicamente, file by file.
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
## Verificação
|
|
374
|
+
|
|
375
|
+
Antes de gate liberar refactor:
|
|
376
|
+
|
|
377
|
+
1. **Critérios coletados** — line count, contrato externo, cobertura atual
|
|
378
|
+
2. **Decisão correta para evidências** — BLOCK / WARN / PASS conforme matriz
|
|
379
|
+
3. **Caminhos oferecidos quando BLOCK** — 4 opções (caracterizar, sprout, safe-extract, override)
|
|
380
|
+
4. **Override tem ticket linkado** — sem ticket = inválido
|
|
381
|
+
5. **Mutation testing rodado** — não basta line coverage
|
|
382
|
+
6. **Snapshots revisados** se characterization presente — não automaticamente confiados
|
|
383
|
+
7. **CONTEXT.md tem seção `<refactor_safety>`** se via `/discutir-fase`
|
|
384
|
+
8. **Audit trail no PR** — decisão do gate registrada no commit/PR
|
|
385
|
+
|
|
386
|
+
## Configuração do gate
|
|
387
|
+
|
|
388
|
+
```toml
|
|
389
|
+
# .planning/config.json (ou planning-config equivalent)
|
|
390
|
+
[workflow]
|
|
391
|
+
legacy_refactor_gate_blocking = true # default em projetos com OMM ≥ 3
|
|
392
|
+
legacy_refactor_min_lines = 500 # threshold de "arquivo grande"
|
|
393
|
+
legacy_refactor_min_coverage_pct = 70 # threshold para gate passar
|
|
394
|
+
legacy_refactor_external_paths = [ # patterns de contrato externo
|
|
395
|
+
"supabase/functions/**",
|
|
396
|
+
"src/api/**",
|
|
397
|
+
"src/handlers/webhooks/**",
|
|
398
|
+
"pages/api/**",
|
|
399
|
+
]
|
|
400
|
+
legacy_refactor_mutation_required = true # mutation testing obrigatório?
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
Defaults respeitam maturity do projeto via `omm-auditor` integration:
|
|
404
|
+
- Capacidade 1 (Resilience) < 3 → blocking = false (consultivo)
|
|
405
|
+
- Capacidade 1 (Resilience) ≥ 3 → blocking = true (default)
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## Ver também
|
|
410
|
+
|
|
411
|
+
- [`_shared-legacy/glossary.md`](../_shared-legacy/glossary.md) — vocabulário canônico
|
|
412
|
+
- [`legacy-characterization-tests`](../legacy-characterization-tests/SKILL.md) — caminho 1 (caracterizar primeiro)
|
|
413
|
+
- [`legacy-sprout-wrap-techniques`](../legacy-sprout-wrap-techniques/SKILL.md) — caminho 2 (sprout/wrap, não toca legado)
|
|
414
|
+
- [`legacy-monster-methods`](../legacy-monster-methods/SKILL.md) — caminho 3 (safe extraction em método grande)
|
|
415
|
+
- [`legacy-seams-and-test-harness`](../legacy-seams-and-test-harness/SKILL.md) — pré-requisito quando dependências bloqueiam characterization
|
|
416
|
+
- [`legacy-effect-analysis`](../legacy-effect-analysis/SKILL.md) — quais inputs cobrir? sketch identifica inflection points
|
|
417
|
+
- [`refactor-safety-auditor`](../../agents/refactor-safety-auditor.md) — agent que executa esse gate em runtime
|
|
418
|
+
- [`observability-driven-development`](../observability-driven-development/SKILL.md) (v1.9) — instrumentação para captura de payloads reais
|
|
419
|
+
- [`production-readiness-review`](../production-readiness-review/SKILL.md) (v1.10) — PRR Axe 5 (Change Management) consume status do gate
|
|
420
|
+
|
|
421
|
+
*Material-fonte: Working Effectively with Legacy Code — Feathers, 2004 — Cap 1: "Changing Software" + Cap 13: "Characterization Tests" + Cap 23: "How Do I Know That I'm Not Breaking Anything?".*
|