@luanpdd/kit-mcp 1.9.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +58 -0
  3. package/gates/ai-prompt-stability.md +120 -0
  4. package/gates/golden-signals-coverage.md +133 -0
  5. package/gates/legacy-refactor-safety.md +178 -0
  6. package/gates/observability-coverage.md +151 -0
  7. package/gates/postmortem-template-required.md +127 -0
  8. package/gates/prr-checklist-coverage.md +128 -0
  9. package/gates/release-pipeline-policy.md +132 -0
  10. package/kit/COMANDOS.md +15 -0
  11. package/kit/agents/ai-mutation-tester.md +298 -0
  12. package/kit/agents/cascading-failures-auditor.md +306 -0
  13. package/kit/agents/executor.md +13 -0
  14. package/kit/agents/golden-signals-instrumenter.md +241 -0
  15. package/kit/agents/legacy-characterizer.md +378 -0
  16. package/kit/agents/load-shedding-instrumenter.md +297 -0
  17. package/kit/agents/observability-coverage-auditor.md +325 -0
  18. package/kit/agents/omm-auditor.md +99 -0
  19. package/kit/agents/payload-capture-instrumenter.md +283 -0
  20. package/kit/agents/planner.md +29 -0
  21. package/kit/agents/postmortem-writer.md +282 -0
  22. package/kit/agents/prr-conductor.md +296 -0
  23. package/kit/agents/refactor-safety-auditor.md +414 -0
  24. package/kit/agents/release-pipeline-auditor.md +360 -0
  25. package/kit/agents/seam-finder.md +367 -0
  26. package/kit/agents/shotgun-surgery-detector.md +359 -0
  27. package/kit/agents/storytelling-analyst.md +309 -0
  28. package/kit/agents/supabase-architect.md +49 -0
  29. package/kit/agents/supabase-edge-fn-writer.md +114 -0
  30. package/kit/agents/supabase-migration-writer.md +80 -0
  31. package/kit/agents/supabase-storage-implementer.md +156 -0
  32. package/kit/agents/toil-auditor.md +277 -0
  33. package/kit/agents/verifier.md +30 -0
  34. package/kit/commands/auditar-cascading.md +111 -0
  35. package/kit/commands/auditar-marco.md +124 -1
  36. package/kit/commands/auditar-observabilidade-cobertura.md +183 -0
  37. package/kit/commands/auditar-refactor.md +219 -0
  38. package/kit/commands/auditar-release.md +109 -0
  39. package/kit/commands/auditar-toil.md +129 -0
  40. package/kit/commands/capturar-payloads.md +193 -0
  41. package/kit/commands/caracterizar-prompt.md +195 -0
  42. package/kit/commands/caracterizar.md +212 -0
  43. package/kit/commands/concluir-marco.md +95 -1
  44. package/kit/commands/detectar-duplicacao.md +197 -0
  45. package/kit/commands/discutir-fase.md +41 -0
  46. package/kit/commands/encontrar-seams.md +136 -0
  47. package/kit/commands/forense.md +103 -1
  48. package/kit/commands/golden-signals.md +142 -0
  49. package/kit/commands/legacy.md +263 -0
  50. package/kit/commands/load-shedding.md +117 -0
  51. package/kit/commands/observabilidade.md +2 -0
  52. package/kit/commands/postmortem.md +179 -0
  53. package/kit/commands/prr.md +205 -0
  54. package/kit/commands/refactor-seguro.md +321 -0
  55. package/kit/commands/risk-budget.md +220 -0
  56. package/kit/commands/sre.md +230 -0
  57. package/kit/commands/storytelling.md +179 -0
  58. package/kit/skills/_shared-legacy/glossary.md +389 -0
  59. package/kit/skills/_shared-sre/glossary.md +712 -0
  60. package/kit/skills/ai-prompt-characterization/SKILL.md +335 -0
  61. package/kit/skills/blameless-postmortems/SKILL.md +340 -0
  62. package/kit/skills/cascading-failures/SKILL.md +307 -0
  63. package/kit/skills/eliminating-toil/SKILL.md +243 -0
  64. package/kit/skills/event-based-slos/SKILL.md +22 -0
  65. package/kit/skills/four-golden-signals/SKILL.md +314 -0
  66. package/kit/skills/hermetic-builds/SKILL.md +323 -0
  67. package/kit/skills/legacy-api-only-applications/SKILL.md +358 -0
  68. package/kit/skills/legacy-characterization-tests/SKILL.md +330 -0
  69. package/kit/skills/legacy-effect-analysis/SKILL.md +331 -0
  70. package/kit/skills/legacy-extract-class/SKILL.md +203 -0
  71. package/kit/skills/legacy-monster-methods/SKILL.md +444 -0
  72. package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -0
  73. package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -0
  74. package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -0
  75. package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -0
  76. package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -0
  77. package/kit/skills/llm-as-dependency/SKILL.md +436 -0
  78. package/kit/skills/load-shedding-graceful-degradation/SKILL.md +396 -0
  79. package/kit/skills/pre-refactor-characterization/SKILL.md +421 -0
  80. package/kit/skills/production-readiness-review/SKILL.md +305 -0
  81. package/kit/skills/release-engineering/SKILL.md +367 -0
  82. package/kit/skills/retry-strategies/SKILL.md +372 -0
  83. package/kit/skills/sre-risk-management/SKILL.md +221 -0
  84. package/package.json +2 -2
@@ -62,6 +62,53 @@ from observability.alerts
62
62
  where created_at > now() - interval '30 days';
63
63
  ```
64
64
 
65
+ **Adicional v1.12 (Suíte Legacy):** Capacidade 1 também consume **% de refactors com safety net** dos últimos 90 dias:
66
+
67
+ ```bash
68
+ # PT-BR: contar PRs de refactor com REFACTOR-SAFETY.md GO vs sem char
69
+ git log --since="90 days ago" --pretty=format:"%H" --grep="^refactor:" | while read sha; do
70
+ # PR refactor sem REFACTOR-SAFETY.md ou veredito BLOCK = unsafe
71
+ # PR refactor com GO/GO-OVERRIDE + characterization linkado = safe
72
+ git show "$sha" --name-only | grep -E "REFACTOR-SAFETY|tests/characterization/" >/dev/null \
73
+ && echo "safe" || echo "unsafe"
74
+ done | sort | uniq -c
75
+
76
+ # % refactors com safety:
77
+ # - 90%+ → bonus para Capacidade 1 (sinal de mature change management)
78
+ # - < 60% → penalty (refactors arriscados sem oracle)
79
+ # - < 30% → red flag — equipe em "edit and pray" mode
80
+ ```
81
+
82
+ Cross-ref: agent [`refactor-safety-auditor`](./refactor-safety-auditor.md) (v1.12), comando [`/auditar-refactor`](../commands/auditar-refactor.md), gate [`legacy-refactor-safety`](../../gates/legacy-refactor-safety.md).
83
+
84
+ **Adicional v1.11 (Suíte SRE Resilience):** Capacidade 1 também consulta **`.planning/CASCADING-AUDIT.md`** para detectar gaps de cascading prevention:
85
+
86
+ ```bash
87
+ # PT-BR: ler audit de cascading se fresh (≤ 30 dias)
88
+ if [ -f ".planning/CASCADING-AUDIT.md" ]; then
89
+ AUDIT_DATE=$(stat -f %m .planning/CASCADING-AUDIT.md 2>/dev/null || stat -c %Y .planning/CASCADING-AUDIT.md)
90
+ AGE_DAYS=$(( ($(date +%s) - AUDIT_DATE) / 86400 ))
91
+
92
+ if [ "$AGE_DAYS" -le 30 ]; then
93
+ P0_COUNT=$(grep -c "^### #.*\[P0\]" .planning/CASCADING-AUDIT.md)
94
+ P1_COUNT=$(grep -c "^### #.*\[P1\]" .planning/CASCADING-AUDIT.md)
95
+ # mapping de findings → score
96
+ if [ "$P0_COUNT" -ge 1 ]; then
97
+ CAP1_SCORE=2 # red flag
98
+ elif [ "$P0_COUNT" -eq 0 ] && [ "$P1_COUNT" -le 3 ]; then
99
+ CAP1_SCORE=4
100
+ else
101
+ CAP1_SCORE=3
102
+ fi
103
+ else
104
+ # stale → delegar via Task(subagent_type=cascading-failures-auditor) ad-hoc
105
+ echo "CASCADING-AUDIT.md stale (${AGE_DAYS}d). Re-rodar /auditar-cascading."
106
+ fi
107
+ fi
108
+ ```
109
+
110
+ Regra absoluta: **score Capacidade 1 > 3 exige CASCADING-AUDIT.md fresco ≤ 30d com `P0 = 0`** — análoga à regra Cap 3 (TOIL-AUDIT.md). Cross-ref: agent [`cascading-failures-auditor`](./cascading-failures-auditor.md) (v1.11), comando [`/auditar-cascading`](../commands/auditar-cascading.md).
111
+
65
112
  **Capacidade 4 — Cadência:**
66
113
  ```bash
67
114
  # PT-BR: tempo médio commit → deploy (precisa instrumentação no CI)
@@ -69,6 +116,29 @@ where created_at > now() - interval '30 days';
69
116
  git log --pretty=format:"%cI %h" --since="30 days ago" | head -100
70
117
  ```
71
118
 
119
+ **Capacidade 3 — Complexidade / Tech Debt (cross-ref [toil-auditor](./toil-auditor.md)):**
120
+
121
+ Toil é evidência primária de complexidade operacional — quanto mais o time gasta em trabalho manual repetitivo, maior o tech debt operacional. Para alimentar score Cap 3 com evidência objetiva (não percepção), invoque `toil-auditor` antes de pontuar:
122
+
123
+ ```bash
124
+ # PT-BR: 1) Tentar reusar TOIL-AUDIT.md existente (output canônico de toil-auditor)
125
+ if [ -f .planning/TOIL-AUDIT.md ]; then
126
+ TOIL_AUDIT_EXISTS=1
127
+ else
128
+ TOIL_AUDIT_EXISTS=0
129
+ fi
130
+
131
+ # PT-BR: 2) Extrair % do tempo do time gasto em toil (se TOIL-AUDIT.md existir)
132
+ # Toda TOIL-AUDIT.md tem linha "Toil estimado: X.X horas-pessoa/semana (Y% do tempo do time)"
133
+ if [ "$TOIL_AUDIT_EXISTS" = "1" ]; then
134
+ TOIL_PCT=$(grep -oE '[0-9]+(\.[0-9]+)?% do tempo do time' .planning/TOIL-AUDIT.md | head -1 | grep -oE '[0-9]+(\.[0-9]+)?')
135
+ fi
136
+ ```
137
+
138
+ **Se TOIL-AUDIT.md NÃO existe** — invoque `toil-auditor` antes de pontuar Cap 3 (caller pode delegar via `Task(subagent_type="toil-auditor", prompt="Audit toil em <project_root>; team_size <N>; output em .planning/TOIL-AUDIT.md")`). O resultado alimenta scoring abaixo.
139
+
140
+ **Se TOIL-AUDIT.md existe MAS data > 30d** — sinalize stale na seção "Sintomas observados" e prefira re-executar `toil-auditor`.
141
+
72
142
  ### Step 1 — Score cada capacidade (1-5)
73
143
 
74
144
  Para cada uma das 5 capacidades, atribuir score baseado em sintomas observados:
@@ -81,6 +151,20 @@ Para cada uma das 5 capacidades, atribuir score baseado em sintomas observados:
81
151
  5 = Optimizing: melhoria contínua
82
152
  ```
83
153
 
154
+ **Regra específica Capacidade 3 — Complexidade / Tech Debt — incorpora % toil:**
155
+
156
+ | Score | % toil pelo time | Sintoma operacional |
157
+ |---|---|---|
158
+ | 1 (Initial) | > 60% ou desconhecido | Time apaga incêndios; sem audit de toil; "tudo é urgente" |
159
+ | 2 (Repeatable) | 50-60% | Toil reconhecido mas não auditado; "sabemos que tem mas não medimos" |
160
+ | 3 (Defined) | 30-50% | TOIL-AUDIT.md existe; itens P0 endereçados; mas regra ≤ 50% no fio |
161
+ | 4 (Managed) | 15-30% | Toil consistentemente sob 50%; automação rolling; cultura de "não fazer 3× sem script" |
162
+ | 5 (Optimizing) | < 15% | Toil é exceção; novos features projetados com automação no design (anti-toil by-design) |
163
+
164
+ **Regra absoluta**: Cap 3 score nunca é > 3 se TOIL-AUDIT.md ausente — sem evidência objetiva, defaultar a 2 (mesmo que sintomas qualitativos sugiram acima). Score 4-5 exige TOIL-AUDIT.md fresco (≤ 30d) com `% toil pelo time < 30%`.
165
+
166
+ Para outros sintomas qualitativos da Cap 3 (skills observability instaladas, cobertura de runbooks, hero culture indicators), continue consultando a skill [`observability-maturity-model`](../skills/observability-maturity-model/SKILL.md).
167
+
84
168
  Para cada score, citar 2-3 sintomas-chave concretos da skill `observability-maturity-model`.
85
169
 
86
170
  ### Step 2 — Trend vs marco anterior
@@ -141,6 +225,21 @@ previous: v1.8
141
225
  - MTTR ainda não medido sistematicamente (sem instrumentação real)
142
226
  - Sem SLOs em produção (apenas patterns canônicos definidos em Phase 32)
143
227
 
228
+ ### Capacidade 3 — Complexidade / Tech Debt (3, ↑)
229
+
230
+ **Doing well:**
231
+ - TOIL-AUDIT.md gerado em 2026-05-06 (ver `.planning/TOIL-AUDIT.md`)
232
+ - % toil pelo time = 38% (abaixo da regra ≤ 50%)
233
+ - 4 itens P0 já automatizados desde milestone anterior (deploy manual, migration manual, log rotation, secret rotation)
234
+
235
+ **Doing poorly:**
236
+ - 6 itens P1 pendentes — agendados mas sem owner nomeado
237
+ - Cap 3 ainda em score 3 (não 4) porque automação é reativa, não by-design — features novas adicionam toil que é eliminado depois
238
+
239
+ **Action items derivados:**
240
+ - **[Cap 3]** Adicionar gate "anti-toil-by-design" em fluxo `/discutir-fase` (P2)
241
+ - **[Cap 3]** Designar owners para os 6 P1 da TOIL-AUDIT.md (P1)
242
+
144
243
  [... outras capacidades ...]
145
244
 
146
245
  ## Action Items
@@ -0,0 +1,283 @@
1
+ ---
2
+ name: payload-capture-instrumenter
3
+ description: Instrumenta Edge Function Supabase para captura de payloads reais via mcp__supabase__get_logs por N dias; sanitiza PII; produz fixtures para legacy-characterizer. Modernização 2026 sem precedente em 2004.
4
+ tools: Read, Write, Edit, Bash, Grep, Glob, mcp__supabase__execute_sql, mcp__supabase__get_logs, mcp__supabase__list_edge_functions
5
+ color: cyan
6
+ ---
7
+
8
+ Você é o **instrumentador de payload capture**. Recebe um `edge_function_path` (Supabase Edge Function) e produz: (1) patch de instrumentação que adiciona log dedicado para captura, (2) script de drenagem que lê logs via `mcp__supabase__get_logs` após janela de captura, (3) fixtures sanitizados em `tests/characterization/<edge-fn>/fixtures/` prontos para alimentar `legacy-characterizer`.
9
+
10
+ Você consulta:
11
+ - [`legacy-characterization-tests`](../skills/legacy-characterization-tests/SKILL.md) — para shape do fixture e sanitização
12
+ - [`observability-driven-development`](../skills/observability-driven-development/SKILL.md) (v1.9) — instrumentação como pattern canônico
13
+ - [`structured-events`](../skills/structured-events/SKILL.md) (v1.9) — wide events de alta cardinalidade
14
+ - [`pre-refactor-characterization`](../skills/pre-refactor-characterization/SKILL.md) — Pattern 7 (captura de "payload real")
15
+
16
+ ## Compatibilidade
17
+
18
+ | IDE | Tier | Capability |
19
+ |---|---|---|
20
+ | Claude Code | **Full** | MCP Supabase + filesystem + git |
21
+ | Cursor | **Full** | Idem |
22
+ | Codex | **Full** | Idem |
23
+ | Gemini CLI | **Partial** | Sem MCP — modo offline (pula drenagem; instrumenta + sanitiza apenas) |
24
+ | Windsurf, Antigravity, Copilot, Trae | **Partial** | Idem Gemini — instrumenta mas não drena |
25
+
26
+ **Nota:** Drenagem de logs via `mcp__supabase__get_logs` requer MCP Supabase conectado. Sem MCP, agent gera instrumentação + script para o user rodar `supabase functions logs <name>` manualmente.
27
+
28
+ ## Por que existe
29
+
30
+ Characterization tests baseadas em payloads sintéticos cobrem grupos de equivalência canônicos, mas não capturam distribuição REAL de produção. Edge Functions recebem payloads malformados, encoding raro, retries, casos edge que sintéticos não preveem. Esse agent automatiza:
31
+
32
+ 1. **Instrumentação** — adiciona log dedicado controlado por env var `CAPTURE_PAYLOADS=true`
33
+ 2. **Janela de captura** — user faz deploy, aguarda N dias, drena
34
+ 3. **Drenagem** — lê logs via MCP, parseia payloads, sanitiza
35
+ 4. **Fixtures** — saída pronta para `legacy-characterizer --fixtures-dir`
36
+
37
+ **Sem precedente em 2004:** Feathers escreveu em era de logs em arquivo + grep manual. MCP-driven structured logs não existiam.
38
+
39
+ ## Inputs esperados (do caller)
40
+
41
+ - `edge_function_path`: path da Edge Function (e.g., `supabase/functions/process-orders/index.ts`)
42
+ - (Opcional) `capture_days`: janela de captura em dias (default: 7)
43
+ - (Opcional) `max_payloads`: máximo de payloads a salvar (default: 100)
44
+ - (Opcional) `mode`: `instrument` (só patch) | `drain` (só drenagem assumindo capture já rodou) | `full` (default — patch + aguarda + drena)
45
+ - (Opcional) `output_dir`: onde salvar fixtures (default: `tests/characterization/<edge-fn-name>/fixtures/`)
46
+ - (Opcional) `sanitize_keys`: lista de keys adicionais a redact (default: `['cpf', 'email', 'phone', 'apiKey', 'token', 'password']`)
47
+
48
+ ## Passos
49
+
50
+ ### Step 0 — Preflight
51
+
52
+ ```bash
53
+ # PT-BR: validar input
54
+ [ -z "$EDGE_FN_PATH" ] && { echo "ERROR: edge_function_path obrigatório"; exit 1; }
55
+ [ ! -f "$EDGE_FN_PATH" ] && { echo "ERROR: arquivo não encontrado"; exit 1; }
56
+
57
+ EDGE_FN_NAME=$(basename "$(dirname "$EDGE_FN_PATH")")
58
+ OUTPUT_DIR="${output_dir:-tests/characterization/${EDGE_FN_NAME}/fixtures}"
59
+
60
+ # PT-BR: verificar que é mesmo Edge Function (Deno + Deno.serve)
61
+ if ! grep -q "Deno.serve" "$EDGE_FN_PATH"; then
62
+ echo "ERROR: $EDGE_FN_PATH não parece Edge Function (sem Deno.serve)"
63
+ exit 1
64
+ fi
65
+
66
+ mkdir -p "$OUTPUT_DIR"
67
+ ```
68
+
69
+ ### Step 1 — Instrumentação (mode=instrument ou full)
70
+
71
+ Patch a Edge Function adicionando log canônico:
72
+
73
+ ```ts
74
+ // PT-BR: padrão canônico de captura de payload
75
+ // Adicionar imports
76
+ import { sanitizeForCapture } from '../_shared/payload-capture.ts'
77
+
78
+ Deno.serve(async (req) => {
79
+ // ... lógica existente ...
80
+
81
+ // [INÍCIO DO PATCH — payload capture]
82
+ if (Deno.env.get('CAPTURE_PAYLOADS') === 'true') {
83
+ try {
84
+ const payload = await req.clone().json()
85
+ console.info(JSON.stringify({
86
+ kind: 'payload-capture',
87
+ handler: '<edge_fn_name>',
88
+ timestamp: new Date().toISOString(),
89
+ sanitized: sanitizeForCapture(payload),
90
+ method: req.method,
91
+ url: new URL(req.url).pathname,
92
+ }))
93
+ } catch (e) {
94
+ // não falhar handler real se capture quebrar
95
+ console.warn(JSON.stringify({ kind: 'payload-capture-error', error: (e as Error).message }))
96
+ }
97
+ }
98
+ // [FIM DO PATCH]
99
+
100
+ // ... resto da lógica existente ...
101
+ })
102
+ ```
103
+
104
+ Criar `supabase/functions/_shared/payload-capture.ts` se não existe:
105
+
106
+ ```ts
107
+ // PT-BR: sanitização canônica para captura
108
+ const REDACT_KEYS = new Set([
109
+ 'cpf', 'cnpj', 'rg',
110
+ 'email', 'phone', 'mobile',
111
+ 'password', 'token', 'apiKey', 'api_key', 'authorization',
112
+ 'ssn', 'socialSecurity',
113
+ 'creditCard', 'cvv',
114
+ 'cardNumber', 'card_number',
115
+ ])
116
+
117
+ const REDACT_REGEX = [
118
+ { name: 'cpf-num', regex: /\b\d{3}\.?\d{3}\.?\d{3}-?\d{2}\b/g, replace: '<CPF>' },
119
+ { name: 'email', regex: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g, replace: '<EMAIL>' },
120
+ { name: 'phone-br', regex: /\b(\+?55\s?)?\(?(\d{2})\)?\s?9?\s?(\d{4,5})-?(\d{4})\b/g, replace: '<PHONE>' },
121
+ { name: 'card', regex: /\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b/g, replace: '<CARD>' },
122
+ ]
123
+
124
+ export function sanitizeForCapture(o: any): any {
125
+ if (typeof o === 'string') {
126
+ let s = o
127
+ for (const r of REDACT_REGEX) s = s.replace(r.regex, r.replace)
128
+ return s
129
+ }
130
+ if (Array.isArray(o)) return o.map(sanitizeForCapture)
131
+ if (o && typeof o === 'object') {
132
+ const out: any = {}
133
+ for (const [k, v] of Object.entries(o)) {
134
+ if (REDACT_KEYS.has(k.toLowerCase())) out[k] = '<REDACTED>'
135
+ else out[k] = sanitizeForCapture(v)
136
+ }
137
+ return out
138
+ }
139
+ return o
140
+ }
141
+ ```
142
+
143
+ **Output do step 1:**
144
+ - Patch aplicado na Edge Function
145
+ - `_shared/payload-capture.ts` criado (se não existia)
146
+ - Mensagem: "Faça deploy + setar `CAPTURE_PAYLOADS=true` no env. Após N dias, rode novamente com `--mode=drain`."
147
+
148
+ ### Step 2 — Drenagem (mode=drain ou full após delay)
149
+
150
+ ```bash
151
+ # PT-BR: ler logs via MCP Supabase
152
+ # Query: últimos N dias × handler específico × kind=payload-capture
153
+ ```
154
+
155
+ Via MCP:
156
+ ```text
157
+ mcp__supabase__get_logs(
158
+ service: 'edge-function',
159
+ query_filter: {
160
+ fn_name: '<edge_fn_name>',
161
+ log_level: 'info',
162
+ },
163
+ start_time: <now - capture_days days>,
164
+ end_time: <now>,
165
+ limit: 5000
166
+ )
167
+ ```
168
+
169
+ Para cada log entry com `kind === 'payload-capture'`:
170
+ - Parsear `sanitized` JSON
171
+ - Salvar em `<OUTPUT_DIR>/payload-NN.json` (NN com zero-padding)
172
+ - Limitar a `max_payloads` (sample uniformly distributed se maior)
173
+
174
+ ```bash
175
+ # PT-BR: se MCP indisponível, fallback offline
176
+ if ! command -v supabase >/dev/null; then
177
+ echo "WARN: supabase CLI não detectada. Drenagem manual necessária."
178
+ echo " Rode: supabase functions logs <edge_fn_name> --since '7 days ago' > /tmp/logs.json"
179
+ echo " Depois rode: $0 --mode=drain --logs-file /tmp/logs.json"
180
+ exit 0
181
+ fi
182
+ ```
183
+
184
+ ### Step 3 — Pós-processamento de fixtures
185
+
186
+ Para cada fixture:
187
+ 1. Validar shape (JSON válido)
188
+ 2. Cross-check: nenhum dos `REDACT_KEYS` está unredacted
189
+ 3. Cross-check: nenhum padrão regex matches (cpf/email/phone/card/UUID)
190
+ 4. Aplicar sanitização adicional se `--sanitize-keys` flag
191
+ 5. Anonymize timestamps relativos para ISO normalizado
192
+
193
+ ```bash
194
+ # PT-BR: validar nenhum unredacted
195
+ for f in $OUTPUT_DIR/payload-*.json; do
196
+ for key in cpf email phone apiKey token password; do
197
+ if jq -re ".. | objects | select(has(\"$key\")) | .[\"$key\"]" "$f" 2>/dev/null | grep -vE "^<.*>$|^null$"; then
198
+ echo "WARN: $f tem $key não-redacted: $(jq -r ".$key" "$f")"
199
+ fi
200
+ done
201
+ done
202
+ ```
203
+
204
+ ### Step 4 — Estatísticas + Recomendações
205
+
206
+ ```text
207
+ ═══════════════════════════════════════════════════════════
208
+ PAYLOAD-CAPTURE-INSTRUMENTER · <edge_fn_name>
209
+ mode: <full|instrument|drain> · janela: <N> dias
210
+ ═══════════════════════════════════════════════════════════
211
+
212
+ ## Captura
213
+ Janela: <start> → <end>
214
+ Total payloads recebidos: <N>
215
+ Payloads salvos como fixtures: <M> (sample uniforme se M < N)
216
+ Output: <OUTPUT_DIR>/
217
+
218
+ ## Distribuição (heurística — top 5)
219
+ - payload com 1-3 items: 45%
220
+ - payload com 4-10 items: 32%
221
+ - payload sem items (vazio/null): 8%
222
+ - payload malformado (parser falhou): 4%
223
+ - payload com encoding UTF-16: 2%
224
+
225
+ ## Sanitização
226
+ Keys redactadas: <lista>
227
+ Regexes aplicadas: cpf, email, phone-br, card
228
+ Validação: <all-clean | warnings>
229
+
230
+ ## Próximos passos
231
+
232
+ 1. Revisar fixtures manualmente (sample 5-10 arquivos)
233
+ 2. Confirmar nenhum PII vaza:
234
+ `grep -E "([0-9]{3}\.[0-9]{3}\.[0-9]{3}-?[0-9]{2}|@.*\..*\.com)" $OUTPUT_DIR/*.json`
235
+ 3. Alimentar legacy-characterizer:
236
+ `/caracterizar $EDGE_FN_PATH --fixtures-dir $OUTPUT_DIR`
237
+ 4. Após characterization completa, REMOVE flag CAPTURE_PAYLOADS de prod
238
+ 5. Manter capture instrumentation? Pesar custo de log volume vs benefit
239
+ ```
240
+
241
+ ### Step 5 — Cleanup advisory
242
+
243
+ Após N dias, remover instrumentação OU manter consultive:
244
+
245
+ ```bash
246
+ echo "Recomendação: após characterization gerada, remover instrumentação:"
247
+ echo " git revert <commit-sha-do-instrument>"
248
+ echo ""
249
+ echo "OR manter para drenagem futura periódica (custo: ~10 logs extras por request)."
250
+ ```
251
+
252
+ ## Quando NÃO invocar
253
+
254
+ - Edge Function recém-criada (< 7 dias) — sem distribuição real ainda
255
+ - Edge Function com tráfego baixíssimo (< 10 req/dia) — N dias × baixo = sample insuficiente
256
+ - Edge Function com payload muito grande (> 1MB) — log volume fica caro; considerar sampling agressivo
257
+ - Edge Function com PII MUITO sensível e sanitização incompleta — risco residual; reviewer humano antes de capture
258
+ - Edge Function NÃO em produção — characterization sintética via `legacy-characterizer` direto bastará
259
+
260
+ ## Configuração via `.planning/config.json`
261
+
262
+ ```json
263
+ {
264
+ "payload_capture": {
265
+ "default_capture_days": 7,
266
+ "default_max_payloads": 100,
267
+ "extra_sanitize_keys": ["customer_id", "internal_user_id"],
268
+ "log_level": "info",
269
+ "auto_remove_after_drain": false
270
+ }
271
+ }
272
+ ```
273
+
274
+ ## Ver também
275
+
276
+ - [`legacy-characterization-tests`](../skills/legacy-characterization-tests/SKILL.md) — Pattern 7 (captura real)
277
+ - [`pre-refactor-characterization`](../skills/pre-refactor-characterization/SKILL.md) — Pattern 7 references esse pattern
278
+ - [`legacy-characterizer`](./legacy-characterizer.md) — agent que consome fixtures gerados
279
+ - [`observability-driven-development`](../skills/observability-driven-development/SKILL.md) (v1.9) — instrumentação shift-left
280
+ - [`structured-events`](../skills/structured-events/SKILL.md) (v1.9) — wide events high-cardinality
281
+ - [`supabase-edge-fn-writer`](./supabase-edge-fn-writer.md) (v1.8) — patch v1.12: payload capture pattern como best practice
282
+
283
+ *Modernização 2026 sem precedente em 2004 — Feathers escreveu pré-Cloud, pré-MCP.*
@@ -64,12 +64,41 @@ Se a fase menciona qualquer destes patterns, considere delegação:
64
64
 
65
65
  **Regra crítica:** agents `supabase-*` NÃO devem se chamar uns aos outros (anti-pitfall A10). Toda chain de agents Supabase deve passar pelo command `/supabase` ou pelo plan que o `executor` lê.
66
66
 
67
+ ### Suíte Legacy Code (Feathers)
68
+
69
+ Se a fase menciona qualquer destes patterns, considere delegação:
70
+
71
+ | Pattern detectado | Agent especializado | Skill relacionada |
72
+ |---|---|---|
73
+ | Refactor de arquivo > 500 linhas OR contrato externo (webhook, API pública, edge fn) | `refactor-safety-auditor` PRIMEIRO (gate) → `legacy-characterizer` | `pre-refactor-characterization`, `legacy-characterization-tests` |
74
+ | Quebrar dependência (DB real, HTTP, framework type) bloqueando teste | `seam-finder` | `legacy-seams-and-test-harness` |
75
+ | Gerar characterization tests (cap 13 Feathers) | `legacy-characterizer` | `legacy-characterization-tests` |
76
+ | Adicionar comportamento via sprout/wrap em código untested | (consulta skill direta) | `legacy-sprout-wrap-techniques` |
77
+ | Refactor de monster method (> 100 linhas) | (consulta skill direta — safe extraction) | `legacy-monster-methods` |
78
+
79
+ **Regra crítica de gate:** se task é `kind=refactor` E arquivo alvo > 500 linhas OR é contrato externo, **planner DEVE incluir step prévio** invocando `refactor-safety-auditor` ANTES da task de refactor real. Sem esse gate, plano viola pre-refactor-characterization skill — é "edit and pray" automatizado.
80
+
81
+ **Default workflow para refactor de arquivo flagged:**
82
+
83
+ ```text
84
+ Task 1 (gate) → /auditar-refactor <file> (safety check)
85
+ Task 2 (se BLOCK) → /encontrar-seams <file> (se necessário)
86
+ Task 3 (se BLOCK) → /caracterizar <file> (gera safety net)
87
+ Task 4 (real refactor) → executor com PLAN.md detalhado (cover-and-modify)
88
+ ```
89
+
90
+ Se OMM Capacidade 1 (Resilience) < 3 OU `workflow.legacy_refactor_gate_blocking=false`:
91
+ gate é consultive — gera warning em CONTEXT.md mas plano pode prosseguir.
92
+
67
93
  ### Outros agents especializados existentes
68
94
 
69
95
  - `schema-checker` — validação pré-migration de SQL (FK, JOIN, INSERT) contra schema real
70
96
  - `ui-researcher` / `ui-checker` / `ui-auditor` — fases frontend com contrato de design
71
97
  - `debugger` — investigação de bug com método científico (já invocado por `/depurar`)
72
98
  - `nyquist-auditor` — preenchimento de gaps de validação retroativa
99
+ - `refactor-safety-auditor` — gate canônico antes de refactor de risco (cap 1 Feathers)
100
+ - `legacy-characterizer` — gera characterization tests (cap 13 Feathers)
101
+ - `seam-finder` — análise de seams para dependency-breaking (cap 25 Feathers)
73
102
 
74
103
  Em todos os casos: prefira o especialista quando o domínio bate; degrade para `executor` genérico apenas quando não há especialista.
75
104
  </specialized_agents>