@luanpdd/kit-mcp 1.35.0 → 1.36.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/bin/cli.js +2 -2
- package/bin/mcp.js +6 -6
- package/bin/ui.js +74 -74
- package/gates/ai-prompt-stability.md +120 -120
- package/gates/budget-description.md +68 -68
- package/gates/confidence.md +29 -29
- package/gates/dependency-check.md +33 -33
- package/gates/dept-cycle-prevention.md +179 -179
- package/gates/golden-signals-coverage.md +133 -133
- package/gates/legacy-refactor-safety.md +178 -178
- package/gates/multi-tenant-rls-coverage.md +102 -102
- package/gates/no-personal-uuid.md +72 -72
- package/gates/obs-agents-mcp-supabase.md +86 -86
- package/gates/obs-skills-frontmatter.md +76 -76
- package/gates/observability-coverage.md +151 -151
- package/gates/omm-no-regression.md +83 -83
- package/gates/postmortem-template-required.md +127 -127
- package/gates/prr-checklist-coverage.md +128 -128
- package/gates/regression.md +32 -32
- package/gates/release-pipeline-policy.md +132 -132
- package/gates/secrets-scan.md +33 -33
- package/gates/service-role-not-in-user-facing.md +113 -113
- package/gates/skill-must-include.md +71 -71
- package/gates/sync-idempotent.md +62 -62
- package/gates/verify-phase-goal.md +34 -34
- package/kit/agents/designer-ui.md +216 -216
- package/kit/agents/workflow-generator.md +537 -167
- package/kit/commands/adicionar-backlog.md +1 -1
- package/kit/commands/adicionar-fase.md +1 -1
- package/kit/commands/adicionar-tarefa.md +1 -1
- package/kit/commands/auditar-observabilidade.md +103 -103
- package/kit/commands/auditar-toil.md +129 -129
- package/kit/commands/caracterizar-prompt.md +195 -195
- package/kit/commands/criar-workflow.md +158 -158
- package/kit/commands/definir-perfil.md +1 -1
- package/kit/commands/definir-slo.md +108 -108
- package/kit/commands/fio.md +1 -1
- package/kit/commands/golden-signals.md +142 -142
- package/kit/commands/instrumentar-fase.md +200 -200
- package/kit/commands/investigar-producao.md +162 -162
- package/kit/commands/observabilidade.md +118 -118
- package/kit/commands/postmortem.md +179 -179
- package/kit/commands/prr.md +205 -205
- package/kit/commands/publicar-rapido.md +207 -207
- package/kit/commands/risk-budget.md +220 -220
- package/kit/commands/sre.md +230 -230
- package/kit/file-manifest.json +424 -424
- package/kit/framework/references/output-style.md +22 -22
- package/kit/hooks/post-apply-migration.js +199 -199
- package/kit/hooks/sidecar-tool-publisher.js +210 -210
- package/kit/skills/_shared-dados-distribuidos/glossary.md +224 -224
- package/kit/skills/_shared-legacy/glossary.md +389 -389
- package/kit/skills/_shared-multi-tenant/glossary.md +186 -186
- package/kit/skills/_shared-observability/glossary.md +396 -396
- package/kit/skills/_shared-sre/glossary.md +712 -712
- package/kit/skills/_shared-supabase/glossary.md +234 -234
- package/kit/skills/blameless-postmortems/SKILL.md +340 -340
- package/kit/skills/burn-rate-alerting/SKILL.md +258 -258
- package/kit/skills/cascading-failures/SKILL.md +311 -311
- package/kit/skills/core-analysis-loop/SKILL.md +352 -352
- package/kit/skills/distributed-tracing/SKILL.md +362 -362
- package/kit/skills/dynamic-workflow-authoring/SKILL.md +327 -223
- package/kit/skills/eliminating-toil/SKILL.md +243 -243
- package/kit/skills/event-based-slos/SKILL.md +296 -296
- package/kit/skills/four-golden-signals/SKILL.md +314 -314
- package/kit/skills/hermetic-builds/SKILL.md +323 -323
- package/kit/skills/legacy-monster-methods/SKILL.md +444 -444
- package/kit/skills/llm-as-dependency/SKILL.md +436 -436
- package/kit/skills/load-shedding-graceful-degradation/SKILL.md +396 -396
- package/kit/skills/observability-driven-development/SKILL.md +315 -315
- package/kit/skills/observability-maturity-model/SKILL.md +222 -222
- package/kit/skills/opentelemetry-standard/SKILL.md +351 -351
- package/kit/skills/production-readiness-review/SKILL.md +305 -305
- package/kit/skills/release-engineering/SKILL.md +367 -367
- package/kit/skills/retry-strategies/SKILL.md +372 -372
- package/kit/skills/sre-risk-management/SKILL.md +221 -221
- package/kit/skills/structured-events/SKILL.md +265 -265
- package/kit/skills/supabase-cron-queues/SKILL.md +275 -275
- package/kit/skills/supabase-database-functions/SKILL.md +332 -332
- package/kit/skills/supabase-declarative-schema/SKILL.md +183 -183
- package/kit/skills/supabase-pgvector-rag/SKILL.md +253 -253
- package/kit/skills/supabase-postgres-style/SKILL.md +138 -138
- package/kit/skills/supabase-storage/SKILL.md +234 -234
- package/kit/skills/telemetry-pipelines/SKILL.md +259 -259
- package/kit/skills/telemetry-sampling/SKILL.md +256 -256
- 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/package.json +1 -1
- package/src/cli/index.js +1114 -1114
- package/src/cli/render.js +194 -194
- package/src/cli/upgrade-check.js +135 -135
- package/src/core/error-redaction.js +76 -76
- package/src/core/failures.js +153 -153
- package/src/core/gate-runner.js +205 -205
- package/src/core/gates.js +82 -82
- package/src/core/logger.js +170 -170
- package/src/core/manifest-verify.js +174 -174
- package/src/core/metrics.js +268 -268
- package/src/core/notify.js +60 -60
- package/src/core/path-safety.js +141 -141
- package/src/core/replays.js +120 -120
- package/src/core/ui.js +185 -185
- package/src/mcp-server/install.js +149 -149
- package/src/mcp-server/roots.js +124 -124
- package/src/ui/auto-spawn.js +113 -113
- package/src/ui/browser.js +78 -78
- package/src/ui/client.js +130 -130
- package/src/ui/events.js +65 -65
- package/src/ui/lockfile.js +191 -191
- package/src/ui/port.js +67 -67
- package/src/ui/server.js +547 -547
- package/src/ui/wrapper.js +129 -129
|
@@ -1,133 +1,133 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: golden-signals-coverage
|
|
3
|
-
stage: pre-verify
|
|
4
|
-
blocking: true
|
|
5
|
-
description: Valida que código de serviço/Edge Function tocado em fase contém os 4 golden signals (Latency=histogram, Traffic=counter, Errors=counter, Saturation=gauge). Skip se fase só toca markdown.
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Golden signals coverage gate
|
|
9
|
-
|
|
10
|
-
**When to run:** pre-verify (blocking — fase não verifica até cobertura completa).
|
|
11
|
-
|
|
12
|
-
## Check
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
#!/usr/bin/env bash
|
|
16
|
-
# PT-BR: validar que código de serviço/Edge Function tocado em fase tem 4 golden signals.
|
|
17
|
-
# Estratégia: descobrir arquivos tocados (supabase/functions/** ou STATE.md current_phase code paths),
|
|
18
|
-
# rodar grep por histogram/counter/gauge/saturation, contar matches por sinal.
|
|
19
|
-
# Bash 3.2-portable (macOS default).
|
|
20
|
-
set -e
|
|
21
|
-
|
|
22
|
-
# PT-BR: identificar fase atual via STATE.md
|
|
23
|
-
STATE_FILE=".planning/STATE.md"
|
|
24
|
-
CURRENT_PHASE=""
|
|
25
|
-
if [ -f "$STATE_FILE" ]; then
|
|
26
|
-
CURRENT_PHASE=$(grep -E "^Fase:" "$STATE_FILE" 2>/dev/null | head -1 | sed -E 's/^Fase: *([0-9]+).*/\1/')
|
|
27
|
-
fi
|
|
28
|
-
|
|
29
|
-
# PT-BR: candidatos a arquivos de código tocados — escopo principal Supabase Edge + qualquer .ts/.js/.py
|
|
30
|
-
# em paths declarados pela fase (heurística: supabase/functions/** SEMPRE inspecionado).
|
|
31
|
-
CODE_FILES=""
|
|
32
|
-
if [ -d "supabase/functions" ]; then
|
|
33
|
-
CODE_FILES=$(find supabase/functions -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" \) 2>/dev/null)
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
# PT-BR: também inspecionar lib/ e src/ se existirem (apps Node/Deno fora de Supabase)
|
|
37
|
-
if [ -d "src" ]; then
|
|
38
|
-
ADDITIONAL=$(find src -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" -o -name "*.py" \) 2>/dev/null)
|
|
39
|
-
CODE_FILES="$CODE_FILES
|
|
40
|
-
$ADDITIONAL"
|
|
41
|
-
fi
|
|
42
|
-
if [ -d "lib" ]; then
|
|
43
|
-
ADDITIONAL=$(find lib -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" -o -name "*.py" \) 2>/dev/null)
|
|
44
|
-
CODE_FILES="$CODE_FILES
|
|
45
|
-
$ADDITIONAL"
|
|
46
|
-
fi
|
|
47
|
-
|
|
48
|
-
# PT-BR: filtrar linhas vazias
|
|
49
|
-
CODE_FILES=$(echo "$CODE_FILES" | grep -v "^$" || true)
|
|
50
|
-
|
|
51
|
-
# PT-BR: se fase não toca código (só markdown/docs), pular gate
|
|
52
|
-
if [ -z "$CODE_FILES" ]; then
|
|
53
|
-
echo "INFO: nenhum arquivo de código (.ts/.js/.py) encontrado em supabase/functions/** | src/** | lib/** — fase parece content-only. Gate skipped."
|
|
54
|
-
exit 0
|
|
55
|
-
fi
|
|
56
|
-
|
|
57
|
-
# PT-BR: contar matches por signal
|
|
58
|
-
LATENCY_HITS=0
|
|
59
|
-
TRAFFIC_HITS=0
|
|
60
|
-
ERRORS_HITS=0
|
|
61
|
-
SATURATION_HITS=0
|
|
62
|
-
|
|
63
|
-
# PT-BR: process file list line-by-line para portabilidade bash 3.2
|
|
64
|
-
OLDIFS="$IFS"
|
|
65
|
-
IFS='
|
|
66
|
-
'
|
|
67
|
-
for f in $CODE_FILES; do
|
|
68
|
-
[ -z "$f" ] && continue
|
|
69
|
-
[ ! -f "$f" ] && continue
|
|
70
|
-
|
|
71
|
-
# PT-BR: Latency = histogram (createHistogram, recordHistogram, histogram.record)
|
|
72
|
-
if grep -qE "histogram|Histogram" "$f" 2>/dev/null; then
|
|
73
|
-
LATENCY_HITS=$((LATENCY_HITS + 1))
|
|
74
|
-
fi
|
|
75
|
-
|
|
76
|
-
# PT-BR: Traffic + Errors = counter (Errors counter dimensionado por error.type)
|
|
77
|
-
if grep -qE "counter|Counter|createCounter" "$f" 2>/dev/null; then
|
|
78
|
-
TRAFFIC_HITS=$((TRAFFIC_HITS + 1))
|
|
79
|
-
ERRORS_HITS=$((ERRORS_HITS + 1))
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
# PT-BR: Saturation = gauge (createObservableGauge, gauge.record) ou string saturation
|
|
83
|
-
if grep -qE "gauge|Gauge|saturation|Saturation" "$f" 2>/dev/null; then
|
|
84
|
-
SATURATION_HITS=$((SATURATION_HITS + 1))
|
|
85
|
-
fi
|
|
86
|
-
done
|
|
87
|
-
IFS="$OLDIFS"
|
|
88
|
-
|
|
89
|
-
# PT-BR: gate passa se TODOS os 4 signals têm pelo menos 1 hit em algum arquivo de código
|
|
90
|
-
MISSING=""
|
|
91
|
-
[ "$LATENCY_HITS" -eq 0 ] && MISSING="$MISSING Latency(histogram)"
|
|
92
|
-
[ "$TRAFFIC_HITS" -eq 0 ] && MISSING="$MISSING Traffic(counter)"
|
|
93
|
-
[ "$ERRORS_HITS" -eq 0 ] && MISSING="$MISSING Errors(counter)"
|
|
94
|
-
[ "$SATURATION_HITS" -eq 0 ] && MISSING="$MISSING Saturation(gauge)"
|
|
95
|
-
|
|
96
|
-
if [ -z "$MISSING" ]; then
|
|
97
|
-
echo "PASS: 4 golden signals cobertos em código (Latency=$LATENCY_HITS files / Traffic=$TRAFFIC_HITS / Errors=$ERRORS_HITS / Saturation=$SATURATION_HITS)"
|
|
98
|
-
exit 0
|
|
99
|
-
else
|
|
100
|
-
echo "FAIL: golden signals ausentes em código tocado:$MISSING"
|
|
101
|
-
echo "Sugestão: rodar /sre golden-signals <service> ou /golden-signals para gerar instrumentação OTel canônica."
|
|
102
|
-
echo "Cross-ref: kit/skills/four-golden-signals/SKILL.md + kit/agents/golden-signals-instrumenter.md"
|
|
103
|
-
exit 1
|
|
104
|
-
fi
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Verdict
|
|
108
|
-
|
|
109
|
-
- **passed** — todos 4 signals (Latency / Traffic / Errors / Saturation) presentes em pelo menos 1 arquivo de código no projeto
|
|
110
|
-
- **passed (skip)** — projeto não tem código (apenas markdown / docs); gate não aplicável
|
|
111
|
-
- **block** — pelo menos 1 signal ausente em código tocado pela fase
|
|
112
|
-
|
|
113
|
-
## Why
|
|
114
|
-
|
|
115
|
-
O livro Google SRE (cap 6 — *Monitoring Distributed Systems*) define os **4 golden signals** como cobertura mínima universal de saúde operacional para serviços user-facing — Latency (histogram com percentis, success vs error separados), Traffic (counter por endpoint × method), Errors (counter por `error.type` enum 5-15 valores, NUNCA `error.message`), Saturation (gauge do recurso mais escasso identificado explicitamente).
|
|
116
|
-
|
|
117
|
-
Sem esse gate, fases entregam Edge Functions / serviços sem instrumentação básica e dashboards crescem ad-hoc (CPU, memory, threads — *causes* não *symptoms*). Gate força padrão canônico: cada PR de código deve cobrir os 4 signals, ou explicar a ausência via skip (fase só altera markdown).
|
|
118
|
-
|
|
119
|
-
Cross-ref agent canônico: [`golden-signals-instrumenter`](../kit/agents/golden-signals-instrumenter.md) (Phase 37 / AGCORE-SRE-01). Skill: [`four-golden-signals`](../kit/skills/four-golden-signals/SKILL.md) (Phase 36 / SKFD-SRE-02).
|
|
120
|
-
|
|
121
|
-
## REQ
|
|
122
|
-
|
|
123
|
-
QA-SRE-01.
|
|
124
|
-
|
|
125
|
-
## Configuração
|
|
126
|
-
|
|
127
|
-
Gate é **blocking** por default. Para tornar warn-only (durante adoption inicial em legado):
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
node ./.claude/framework/bin/tools.cjs config-set workflow.golden_signals_coverage_warn true
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
(Nota: implementação do toggle warn-only é deferida — gate atual lê apenas presença/ausência de regex, não consulta config.)
|
|
1
|
+
---
|
|
2
|
+
id: golden-signals-coverage
|
|
3
|
+
stage: pre-verify
|
|
4
|
+
blocking: true
|
|
5
|
+
description: Valida que código de serviço/Edge Function tocado em fase contém os 4 golden signals (Latency=histogram, Traffic=counter, Errors=counter, Saturation=gauge). Skip se fase só toca markdown.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Golden signals coverage gate
|
|
9
|
+
|
|
10
|
+
**When to run:** pre-verify (blocking — fase não verifica até cobertura completa).
|
|
11
|
+
|
|
12
|
+
## Check
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
#!/usr/bin/env bash
|
|
16
|
+
# PT-BR: validar que código de serviço/Edge Function tocado em fase tem 4 golden signals.
|
|
17
|
+
# Estratégia: descobrir arquivos tocados (supabase/functions/** ou STATE.md current_phase code paths),
|
|
18
|
+
# rodar grep por histogram/counter/gauge/saturation, contar matches por sinal.
|
|
19
|
+
# Bash 3.2-portable (macOS default).
|
|
20
|
+
set -e
|
|
21
|
+
|
|
22
|
+
# PT-BR: identificar fase atual via STATE.md
|
|
23
|
+
STATE_FILE=".planning/STATE.md"
|
|
24
|
+
CURRENT_PHASE=""
|
|
25
|
+
if [ -f "$STATE_FILE" ]; then
|
|
26
|
+
CURRENT_PHASE=$(grep -E "^Fase:" "$STATE_FILE" 2>/dev/null | head -1 | sed -E 's/^Fase: *([0-9]+).*/\1/')
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# PT-BR: candidatos a arquivos de código tocados — escopo principal Supabase Edge + qualquer .ts/.js/.py
|
|
30
|
+
# em paths declarados pela fase (heurística: supabase/functions/** SEMPRE inspecionado).
|
|
31
|
+
CODE_FILES=""
|
|
32
|
+
if [ -d "supabase/functions" ]; then
|
|
33
|
+
CODE_FILES=$(find supabase/functions -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" \) 2>/dev/null)
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# PT-BR: também inspecionar lib/ e src/ se existirem (apps Node/Deno fora de Supabase)
|
|
37
|
+
if [ -d "src" ]; then
|
|
38
|
+
ADDITIONAL=$(find src -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" -o -name "*.py" \) 2>/dev/null)
|
|
39
|
+
CODE_FILES="$CODE_FILES
|
|
40
|
+
$ADDITIONAL"
|
|
41
|
+
fi
|
|
42
|
+
if [ -d "lib" ]; then
|
|
43
|
+
ADDITIONAL=$(find lib -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" -o -name "*.py" \) 2>/dev/null)
|
|
44
|
+
CODE_FILES="$CODE_FILES
|
|
45
|
+
$ADDITIONAL"
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# PT-BR: filtrar linhas vazias
|
|
49
|
+
CODE_FILES=$(echo "$CODE_FILES" | grep -v "^$" || true)
|
|
50
|
+
|
|
51
|
+
# PT-BR: se fase não toca código (só markdown/docs), pular gate
|
|
52
|
+
if [ -z "$CODE_FILES" ]; then
|
|
53
|
+
echo "INFO: nenhum arquivo de código (.ts/.js/.py) encontrado em supabase/functions/** | src/** | lib/** — fase parece content-only. Gate skipped."
|
|
54
|
+
exit 0
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# PT-BR: contar matches por signal
|
|
58
|
+
LATENCY_HITS=0
|
|
59
|
+
TRAFFIC_HITS=0
|
|
60
|
+
ERRORS_HITS=0
|
|
61
|
+
SATURATION_HITS=0
|
|
62
|
+
|
|
63
|
+
# PT-BR: process file list line-by-line para portabilidade bash 3.2
|
|
64
|
+
OLDIFS="$IFS"
|
|
65
|
+
IFS='
|
|
66
|
+
'
|
|
67
|
+
for f in $CODE_FILES; do
|
|
68
|
+
[ -z "$f" ] && continue
|
|
69
|
+
[ ! -f "$f" ] && continue
|
|
70
|
+
|
|
71
|
+
# PT-BR: Latency = histogram (createHistogram, recordHistogram, histogram.record)
|
|
72
|
+
if grep -qE "histogram|Histogram" "$f" 2>/dev/null; then
|
|
73
|
+
LATENCY_HITS=$((LATENCY_HITS + 1))
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# PT-BR: Traffic + Errors = counter (Errors counter dimensionado por error.type)
|
|
77
|
+
if grep -qE "counter|Counter|createCounter" "$f" 2>/dev/null; then
|
|
78
|
+
TRAFFIC_HITS=$((TRAFFIC_HITS + 1))
|
|
79
|
+
ERRORS_HITS=$((ERRORS_HITS + 1))
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# PT-BR: Saturation = gauge (createObservableGauge, gauge.record) ou string saturation
|
|
83
|
+
if grep -qE "gauge|Gauge|saturation|Saturation" "$f" 2>/dev/null; then
|
|
84
|
+
SATURATION_HITS=$((SATURATION_HITS + 1))
|
|
85
|
+
fi
|
|
86
|
+
done
|
|
87
|
+
IFS="$OLDIFS"
|
|
88
|
+
|
|
89
|
+
# PT-BR: gate passa se TODOS os 4 signals têm pelo menos 1 hit em algum arquivo de código
|
|
90
|
+
MISSING=""
|
|
91
|
+
[ "$LATENCY_HITS" -eq 0 ] && MISSING="$MISSING Latency(histogram)"
|
|
92
|
+
[ "$TRAFFIC_HITS" -eq 0 ] && MISSING="$MISSING Traffic(counter)"
|
|
93
|
+
[ "$ERRORS_HITS" -eq 0 ] && MISSING="$MISSING Errors(counter)"
|
|
94
|
+
[ "$SATURATION_HITS" -eq 0 ] && MISSING="$MISSING Saturation(gauge)"
|
|
95
|
+
|
|
96
|
+
if [ -z "$MISSING" ]; then
|
|
97
|
+
echo "PASS: 4 golden signals cobertos em código (Latency=$LATENCY_HITS files / Traffic=$TRAFFIC_HITS / Errors=$ERRORS_HITS / Saturation=$SATURATION_HITS)"
|
|
98
|
+
exit 0
|
|
99
|
+
else
|
|
100
|
+
echo "FAIL: golden signals ausentes em código tocado:$MISSING"
|
|
101
|
+
echo "Sugestão: rodar /sre golden-signals <service> ou /golden-signals para gerar instrumentação OTel canônica."
|
|
102
|
+
echo "Cross-ref: kit/skills/four-golden-signals/SKILL.md + kit/agents/golden-signals-instrumenter.md"
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Verdict
|
|
108
|
+
|
|
109
|
+
- **passed** — todos 4 signals (Latency / Traffic / Errors / Saturation) presentes em pelo menos 1 arquivo de código no projeto
|
|
110
|
+
- **passed (skip)** — projeto não tem código (apenas markdown / docs); gate não aplicável
|
|
111
|
+
- **block** — pelo menos 1 signal ausente em código tocado pela fase
|
|
112
|
+
|
|
113
|
+
## Why
|
|
114
|
+
|
|
115
|
+
O livro Google SRE (cap 6 — *Monitoring Distributed Systems*) define os **4 golden signals** como cobertura mínima universal de saúde operacional para serviços user-facing — Latency (histogram com percentis, success vs error separados), Traffic (counter por endpoint × method), Errors (counter por `error.type` enum 5-15 valores, NUNCA `error.message`), Saturation (gauge do recurso mais escasso identificado explicitamente).
|
|
116
|
+
|
|
117
|
+
Sem esse gate, fases entregam Edge Functions / serviços sem instrumentação básica e dashboards crescem ad-hoc (CPU, memory, threads — *causes* não *symptoms*). Gate força padrão canônico: cada PR de código deve cobrir os 4 signals, ou explicar a ausência via skip (fase só altera markdown).
|
|
118
|
+
|
|
119
|
+
Cross-ref agent canônico: [`golden-signals-instrumenter`](../kit/agents/golden-signals-instrumenter.md) (Phase 37 / AGCORE-SRE-01). Skill: [`four-golden-signals`](../kit/skills/four-golden-signals/SKILL.md) (Phase 36 / SKFD-SRE-02).
|
|
120
|
+
|
|
121
|
+
## REQ
|
|
122
|
+
|
|
123
|
+
QA-SRE-01.
|
|
124
|
+
|
|
125
|
+
## Configuração
|
|
126
|
+
|
|
127
|
+
Gate é **blocking** por default. Para tornar warn-only (durante adoption inicial em legado):
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
node ./.claude/framework/bin/tools.cjs config-set workflow.golden_signals_coverage_warn true
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
(Nota: implementação do toggle warn-only é deferida — gate atual lê apenas presença/ausência de regex, não consulta config.)
|
|
@@ -1,178 +1,178 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: legacy-refactor-safety
|
|
3
|
-
stage: pre-execute
|
|
4
|
-
blocking: false
|
|
5
|
-
description: Valida que tasks com kind=refactor em arquivos > 500 linhas OU com contrato externo têm characterization tests linkados. Skip se fase só toca markdown OR fase é greenfield. Opt-in via workflow.legacy_refactor_gate_blocking=true.
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Legacy refactor safety gate
|
|
9
|
-
|
|
10
|
-
**When to run:** pre-execute (consultive por default; blocking se `workflow.legacy_refactor_gate_blocking=true` E `omm.capacidade_1_resilience >= 3`).
|
|
11
|
-
|
|
12
|
-
**Skill canônica:** [`pre-refactor-characterization`](../kit/skills/pre-refactor-characterization/SKILL.md)
|
|
13
|
-
|
|
14
|
-
**Agent invocado:** [`refactor-safety-auditor`](../kit/agents/refactor-safety-auditor.md)
|
|
15
|
-
|
|
16
|
-
## Check
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
#!/usr/bin/env bash
|
|
20
|
-
# PT-BR: validar que tasks com kind=refactor em arquivos arriscados têm safety net.
|
|
21
|
-
# Estratégia: descobrir tasks da fase atual, identificar refactor + arquivos flagged,
|
|
22
|
-
# verificar characterization tests linkados, gerar warning ou block conforme mode.
|
|
23
|
-
# Bash 3.2-portable (macOS default).
|
|
24
|
-
set -e
|
|
25
|
-
|
|
26
|
-
# PT-BR: identificar fase atual via STATE.md
|
|
27
|
-
STATE_FILE=".planning/STATE.md"
|
|
28
|
-
CURRENT_PHASE=""
|
|
29
|
-
if [ -f "$STATE_FILE" ]; then
|
|
30
|
-
CURRENT_PHASE=$(grep -E "^Fase:" "$STATE_FILE" 2>/dev/null | head -1 | sed -E 's/^Fase: *([0-9]+).*/\1/')
|
|
31
|
-
fi
|
|
32
|
-
|
|
33
|
-
if [ -z "$CURRENT_PHASE" ]; then
|
|
34
|
-
echo "INFO: nenhuma fase ativa — gate skip."
|
|
35
|
-
exit 0
|
|
36
|
-
fi
|
|
37
|
-
|
|
38
|
-
PHASE_DIR=".planning/phases/phase-${CURRENT_PHASE}"
|
|
39
|
-
[ ! -d "$PHASE_DIR" ] && exit 0
|
|
40
|
-
|
|
41
|
-
# PT-BR: ler config para mode
|
|
42
|
-
GATE_BLOCKING=false
|
|
43
|
-
if [ -f ".planning/config.json" ] && command -v jq >/dev/null; then
|
|
44
|
-
CFG=$(jq -r '.workflow.legacy_refactor_gate_blocking // empty' .planning/config.json 2>/dev/null)
|
|
45
|
-
[ "$CFG" = "true" ] && GATE_BLOCKING=true
|
|
46
|
-
fi
|
|
47
|
-
|
|
48
|
-
# PT-BR: ler omm — Capacidade 1 (Resilience) calibra mode default
|
|
49
|
-
if [ "$GATE_BLOCKING" = "false" ] && [ -f ".planning/OMM-REPORT.md" ]; then
|
|
50
|
-
OMM_RES=$(grep -oE 'Capacidade 1.*Resilience.*[0-9]/5' .planning/OMM-REPORT.md 2>/dev/null \
|
|
51
|
-
| grep -oE '[0-9]/5' | head -1 | sed 's|/5||')
|
|
52
|
-
if [ -n "$OMM_RES" ] && [ "$OMM_RES" -ge 3 ]; then
|
|
53
|
-
GATE_BLOCKING=true
|
|
54
|
-
fi
|
|
55
|
-
fi
|
|
56
|
-
|
|
57
|
-
# PT-BR: identificar PLAN.md da fase atual
|
|
58
|
-
PLAN_FILES=$(find "$PHASE_DIR" -name "PLAN.md" 2>/dev/null)
|
|
59
|
-
|
|
60
|
-
REFACTOR_TASKS_RISKY=()
|
|
61
|
-
REFACTOR_TASKS_OK=()
|
|
62
|
-
TOTAL_REFACTOR=0
|
|
63
|
-
|
|
64
|
-
for plan_file in $PLAN_FILES; do
|
|
65
|
-
# PT-BR: detectar tasks com kind=refactor (heurística — frase canônica)
|
|
66
|
-
if grep -qiE "(refactor|refator|extract method|extract class|move method|reorganizar|limpar)" "$plan_file"; then
|
|
67
|
-
# extrair arquivos mencionados em tasks de refactor
|
|
68
|
-
AFFECTED_FILES=$(grep -oE "(src|lib|app|supabase|tests)/[a-zA-Z0-9_./-]+\.(ts|tsx|js|jsx|mjs|py|java|go|rb|cs|rs|cpp|c|h)" "$plan_file" 2>/dev/null | sort -u)
|
|
69
|
-
|
|
70
|
-
for f in $AFFECTED_FILES; do
|
|
71
|
-
[ ! -f "$f" ] && continue
|
|
72
|
-
|
|
73
|
-
# PT-BR: critérios de risco
|
|
74
|
-
LINES=$(wc -l < "$f" 2>/dev/null | tr -d ' ')
|
|
75
|
-
EXTERNAL=false
|
|
76
|
-
if echo "$f" | grep -qE "(supabase/functions|src/api|/handlers/webhooks|pages/api|integrations)"; then
|
|
77
|
-
EXTERNAL=true
|
|
78
|
-
fi
|
|
79
|
-
|
|
80
|
-
RISK_HIGH=false
|
|
81
|
-
[ "${LINES:-0}" -gt 500 ] && RISK_HIGH=true
|
|
82
|
-
[ "$EXTERNAL" = "true" ] && RISK_HIGH=true
|
|
83
|
-
|
|
84
|
-
if [ "$RISK_HIGH" = "true" ]; then
|
|
85
|
-
TOTAL_REFACTOR=$((TOTAL_REFACTOR + 1))
|
|
86
|
-
|
|
87
|
-
# PT-BR: verificar characterization tests linkados
|
|
88
|
-
STEM=$(basename "$f" | sed 's/\.[^.]*$//')
|
|
89
|
-
HAS_CHAR=false
|
|
90
|
-
for chardir in tests test __tests__; do
|
|
91
|
-
if find "$chardir" -path "*characterization*$STEM*" 2>/dev/null | head -1 | grep -q . ; then
|
|
92
|
-
HAS_CHAR=true
|
|
93
|
-
break
|
|
94
|
-
fi
|
|
95
|
-
done
|
|
96
|
-
|
|
97
|
-
if [ "$HAS_CHAR" = "true" ]; then
|
|
98
|
-
REFACTOR_TASKS_OK+=("$f")
|
|
99
|
-
else
|
|
100
|
-
REFACTOR_TASKS_RISKY+=("$f (lines=$LINES, external=$EXTERNAL)")
|
|
101
|
-
fi
|
|
102
|
-
fi
|
|
103
|
-
done
|
|
104
|
-
fi
|
|
105
|
-
done
|
|
106
|
-
|
|
107
|
-
# PT-BR: relatório
|
|
108
|
-
if [ ${#REFACTOR_TASKS_RISKY[@]} -eq 0 ]; then
|
|
109
|
-
echo "✓ legacy-refactor-safety — sem refactors arriscados sem characterization."
|
|
110
|
-
if [ ${#REFACTOR_TASKS_OK[@]} -gt 0 ]; then
|
|
111
|
-
echo " ${#REFACTOR_TASKS_OK[@]} refactor(s) com characterization linkados."
|
|
112
|
-
fi
|
|
113
|
-
exit 0
|
|
114
|
-
fi
|
|
115
|
-
|
|
116
|
-
# PT-BR: há refactors arriscados sem char
|
|
117
|
-
echo ""
|
|
118
|
-
echo "⚠ legacy-refactor-safety — refactor(s) sem characterization detectado(s):"
|
|
119
|
-
echo ""
|
|
120
|
-
for item in "${REFACTOR_TASKS_RISKY[@]}"; do
|
|
121
|
-
echo " - $item"
|
|
122
|
-
done
|
|
123
|
-
echo ""
|
|
124
|
-
echo "Skill canônica: kit/skills/pre-refactor-characterization/SKILL.md"
|
|
125
|
-
echo ""
|
|
126
|
-
echo "Caminhos para resolver:"
|
|
127
|
-
echo " 1. /caracterizar <file> (full chain — preferido)"
|
|
128
|
-
echo " 2. /refactor-seguro --mode=sprout <file> (não toca legado, ADICIONA via sprout)"
|
|
129
|
-
echo " 3. /refactor-seguro --mode=safe-extract <file> (apenas refactor mecânico)"
|
|
130
|
-
echo " 4. /refactor-seguro --mode=override --ticket REQ-N --reason \"...\" (último recurso)"
|
|
131
|
-
echo ""
|
|
132
|
-
|
|
133
|
-
if [ "$GATE_BLOCKING" = "true" ]; then
|
|
134
|
-
echo "MODE: blocking (workflow.legacy_refactor_gate_blocking=true OR OMM Capacidade 1 ≥ 3)"
|
|
135
|
-
echo "Resolve antes de prosseguir com /executar-fase."
|
|
136
|
-
exit 1
|
|
137
|
-
else
|
|
138
|
-
echo "MODE: consultive (warning apenas)"
|
|
139
|
-
echo "Para tornar blocking: setar workflow.legacy_refactor_gate_blocking=true em .planning/config.json"
|
|
140
|
-
exit 0
|
|
141
|
-
fi
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## Configuração
|
|
145
|
-
|
|
146
|
-
```json
|
|
147
|
-
// .planning/config.json
|
|
148
|
-
{
|
|
149
|
-
"workflow": {
|
|
150
|
-
"legacy_refactor_gate_blocking": true,
|
|
151
|
-
"legacy_refactor_min_lines": 500,
|
|
152
|
-
"legacy_refactor_external_paths": [
|
|
153
|
-
"supabase/functions/**",
|
|
154
|
-
"src/api/**",
|
|
155
|
-
"src/handlers/webhooks/**",
|
|
156
|
-
"pages/api/**"
|
|
157
|
-
]
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
**Default:** `legacy_refactor_gate_blocking` = false (consultive). Auto-promove para `true` se `omm-auditor` (v1.9) reportar Capacidade 1 (Resilience) ≥ 3 — sinal de que projeto tem maturity de safety.
|
|
163
|
-
|
|
164
|
-
## Quando NÃO rodar
|
|
165
|
-
|
|
166
|
-
- Fase só toca markdown/docs — sem código a refactor
|
|
167
|
-
- Projeto < 1 mês de idade — código novo não é "legacy" no sentido Feathers
|
|
168
|
-
- Projeto sem `omm-auditor` rodado E sem flag explícita — skip silencioso (consultive)
|
|
169
|
-
- Tasks são `bug-fix` ou `feature` (não refactor) — gate só roda em refactor
|
|
170
|
-
|
|
171
|
-
## Ver também
|
|
172
|
-
|
|
173
|
-
- [`pre-refactor-characterization`](../kit/skills/pre-refactor-characterization/SKILL.md) — knowledge base do gate
|
|
174
|
-
- [`refactor-safety-auditor`](../kit/agents/refactor-safety-auditor.md) — agent invocado em runtime
|
|
175
|
-
- [`legacy-characterizer`](../kit/agents/legacy-characterizer.md) — agent que gera safety net
|
|
176
|
-
- [`golden-signals-coverage`](./golden-signals-coverage.md) — gate análogo da Suíte SRE
|
|
177
|
-
- [`prr-checklist-coverage`](./prr-checklist-coverage.md) — gate análogo da Suíte SRE para PRR
|
|
178
|
-
- [`omm-no-regression`](./omm-no-regression.md) — gate análogo da Suíte Observabilidade para OMM
|
|
1
|
+
---
|
|
2
|
+
id: legacy-refactor-safety
|
|
3
|
+
stage: pre-execute
|
|
4
|
+
blocking: false
|
|
5
|
+
description: Valida que tasks com kind=refactor em arquivos > 500 linhas OU com contrato externo têm characterization tests linkados. Skip se fase só toca markdown OR fase é greenfield. Opt-in via workflow.legacy_refactor_gate_blocking=true.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Legacy refactor safety gate
|
|
9
|
+
|
|
10
|
+
**When to run:** pre-execute (consultive por default; blocking se `workflow.legacy_refactor_gate_blocking=true` E `omm.capacidade_1_resilience >= 3`).
|
|
11
|
+
|
|
12
|
+
**Skill canônica:** [`pre-refactor-characterization`](../kit/skills/pre-refactor-characterization/SKILL.md)
|
|
13
|
+
|
|
14
|
+
**Agent invocado:** [`refactor-safety-auditor`](../kit/agents/refactor-safety-auditor.md)
|
|
15
|
+
|
|
16
|
+
## Check
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
#!/usr/bin/env bash
|
|
20
|
+
# PT-BR: validar que tasks com kind=refactor em arquivos arriscados têm safety net.
|
|
21
|
+
# Estratégia: descobrir tasks da fase atual, identificar refactor + arquivos flagged,
|
|
22
|
+
# verificar characterization tests linkados, gerar warning ou block conforme mode.
|
|
23
|
+
# Bash 3.2-portable (macOS default).
|
|
24
|
+
set -e
|
|
25
|
+
|
|
26
|
+
# PT-BR: identificar fase atual via STATE.md
|
|
27
|
+
STATE_FILE=".planning/STATE.md"
|
|
28
|
+
CURRENT_PHASE=""
|
|
29
|
+
if [ -f "$STATE_FILE" ]; then
|
|
30
|
+
CURRENT_PHASE=$(grep -E "^Fase:" "$STATE_FILE" 2>/dev/null | head -1 | sed -E 's/^Fase: *([0-9]+).*/\1/')
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
if [ -z "$CURRENT_PHASE" ]; then
|
|
34
|
+
echo "INFO: nenhuma fase ativa — gate skip."
|
|
35
|
+
exit 0
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
PHASE_DIR=".planning/phases/phase-${CURRENT_PHASE}"
|
|
39
|
+
[ ! -d "$PHASE_DIR" ] && exit 0
|
|
40
|
+
|
|
41
|
+
# PT-BR: ler config para mode
|
|
42
|
+
GATE_BLOCKING=false
|
|
43
|
+
if [ -f ".planning/config.json" ] && command -v jq >/dev/null; then
|
|
44
|
+
CFG=$(jq -r '.workflow.legacy_refactor_gate_blocking // empty' .planning/config.json 2>/dev/null)
|
|
45
|
+
[ "$CFG" = "true" ] && GATE_BLOCKING=true
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# PT-BR: ler omm — Capacidade 1 (Resilience) calibra mode default
|
|
49
|
+
if [ "$GATE_BLOCKING" = "false" ] && [ -f ".planning/OMM-REPORT.md" ]; then
|
|
50
|
+
OMM_RES=$(grep -oE 'Capacidade 1.*Resilience.*[0-9]/5' .planning/OMM-REPORT.md 2>/dev/null \
|
|
51
|
+
| grep -oE '[0-9]/5' | head -1 | sed 's|/5||')
|
|
52
|
+
if [ -n "$OMM_RES" ] && [ "$OMM_RES" -ge 3 ]; then
|
|
53
|
+
GATE_BLOCKING=true
|
|
54
|
+
fi
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# PT-BR: identificar PLAN.md da fase atual
|
|
58
|
+
PLAN_FILES=$(find "$PHASE_DIR" -name "PLAN.md" 2>/dev/null)
|
|
59
|
+
|
|
60
|
+
REFACTOR_TASKS_RISKY=()
|
|
61
|
+
REFACTOR_TASKS_OK=()
|
|
62
|
+
TOTAL_REFACTOR=0
|
|
63
|
+
|
|
64
|
+
for plan_file in $PLAN_FILES; do
|
|
65
|
+
# PT-BR: detectar tasks com kind=refactor (heurística — frase canônica)
|
|
66
|
+
if grep -qiE "(refactor|refator|extract method|extract class|move method|reorganizar|limpar)" "$plan_file"; then
|
|
67
|
+
# extrair arquivos mencionados em tasks de refactor
|
|
68
|
+
AFFECTED_FILES=$(grep -oE "(src|lib|app|supabase|tests)/[a-zA-Z0-9_./-]+\.(ts|tsx|js|jsx|mjs|py|java|go|rb|cs|rs|cpp|c|h)" "$plan_file" 2>/dev/null | sort -u)
|
|
69
|
+
|
|
70
|
+
for f in $AFFECTED_FILES; do
|
|
71
|
+
[ ! -f "$f" ] && continue
|
|
72
|
+
|
|
73
|
+
# PT-BR: critérios de risco
|
|
74
|
+
LINES=$(wc -l < "$f" 2>/dev/null | tr -d ' ')
|
|
75
|
+
EXTERNAL=false
|
|
76
|
+
if echo "$f" | grep -qE "(supabase/functions|src/api|/handlers/webhooks|pages/api|integrations)"; then
|
|
77
|
+
EXTERNAL=true
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
RISK_HIGH=false
|
|
81
|
+
[ "${LINES:-0}" -gt 500 ] && RISK_HIGH=true
|
|
82
|
+
[ "$EXTERNAL" = "true" ] && RISK_HIGH=true
|
|
83
|
+
|
|
84
|
+
if [ "$RISK_HIGH" = "true" ]; then
|
|
85
|
+
TOTAL_REFACTOR=$((TOTAL_REFACTOR + 1))
|
|
86
|
+
|
|
87
|
+
# PT-BR: verificar characterization tests linkados
|
|
88
|
+
STEM=$(basename "$f" | sed 's/\.[^.]*$//')
|
|
89
|
+
HAS_CHAR=false
|
|
90
|
+
for chardir in tests test __tests__; do
|
|
91
|
+
if find "$chardir" -path "*characterization*$STEM*" 2>/dev/null | head -1 | grep -q . ; then
|
|
92
|
+
HAS_CHAR=true
|
|
93
|
+
break
|
|
94
|
+
fi
|
|
95
|
+
done
|
|
96
|
+
|
|
97
|
+
if [ "$HAS_CHAR" = "true" ]; then
|
|
98
|
+
REFACTOR_TASKS_OK+=("$f")
|
|
99
|
+
else
|
|
100
|
+
REFACTOR_TASKS_RISKY+=("$f (lines=$LINES, external=$EXTERNAL)")
|
|
101
|
+
fi
|
|
102
|
+
fi
|
|
103
|
+
done
|
|
104
|
+
fi
|
|
105
|
+
done
|
|
106
|
+
|
|
107
|
+
# PT-BR: relatório
|
|
108
|
+
if [ ${#REFACTOR_TASKS_RISKY[@]} -eq 0 ]; then
|
|
109
|
+
echo "✓ legacy-refactor-safety — sem refactors arriscados sem characterization."
|
|
110
|
+
if [ ${#REFACTOR_TASKS_OK[@]} -gt 0 ]; then
|
|
111
|
+
echo " ${#REFACTOR_TASKS_OK[@]} refactor(s) com characterization linkados."
|
|
112
|
+
fi
|
|
113
|
+
exit 0
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
# PT-BR: há refactors arriscados sem char
|
|
117
|
+
echo ""
|
|
118
|
+
echo "⚠ legacy-refactor-safety — refactor(s) sem characterization detectado(s):"
|
|
119
|
+
echo ""
|
|
120
|
+
for item in "${REFACTOR_TASKS_RISKY[@]}"; do
|
|
121
|
+
echo " - $item"
|
|
122
|
+
done
|
|
123
|
+
echo ""
|
|
124
|
+
echo "Skill canônica: kit/skills/pre-refactor-characterization/SKILL.md"
|
|
125
|
+
echo ""
|
|
126
|
+
echo "Caminhos para resolver:"
|
|
127
|
+
echo " 1. /caracterizar <file> (full chain — preferido)"
|
|
128
|
+
echo " 2. /refactor-seguro --mode=sprout <file> (não toca legado, ADICIONA via sprout)"
|
|
129
|
+
echo " 3. /refactor-seguro --mode=safe-extract <file> (apenas refactor mecânico)"
|
|
130
|
+
echo " 4. /refactor-seguro --mode=override --ticket REQ-N --reason \"...\" (último recurso)"
|
|
131
|
+
echo ""
|
|
132
|
+
|
|
133
|
+
if [ "$GATE_BLOCKING" = "true" ]; then
|
|
134
|
+
echo "MODE: blocking (workflow.legacy_refactor_gate_blocking=true OR OMM Capacidade 1 ≥ 3)"
|
|
135
|
+
echo "Resolve antes de prosseguir com /executar-fase."
|
|
136
|
+
exit 1
|
|
137
|
+
else
|
|
138
|
+
echo "MODE: consultive (warning apenas)"
|
|
139
|
+
echo "Para tornar blocking: setar workflow.legacy_refactor_gate_blocking=true em .planning/config.json"
|
|
140
|
+
exit 0
|
|
141
|
+
fi
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Configuração
|
|
145
|
+
|
|
146
|
+
```json
|
|
147
|
+
// .planning/config.json
|
|
148
|
+
{
|
|
149
|
+
"workflow": {
|
|
150
|
+
"legacy_refactor_gate_blocking": true,
|
|
151
|
+
"legacy_refactor_min_lines": 500,
|
|
152
|
+
"legacy_refactor_external_paths": [
|
|
153
|
+
"supabase/functions/**",
|
|
154
|
+
"src/api/**",
|
|
155
|
+
"src/handlers/webhooks/**",
|
|
156
|
+
"pages/api/**"
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Default:** `legacy_refactor_gate_blocking` = false (consultive). Auto-promove para `true` se `omm-auditor` (v1.9) reportar Capacidade 1 (Resilience) ≥ 3 — sinal de que projeto tem maturity de safety.
|
|
163
|
+
|
|
164
|
+
## Quando NÃO rodar
|
|
165
|
+
|
|
166
|
+
- Fase só toca markdown/docs — sem código a refactor
|
|
167
|
+
- Projeto < 1 mês de idade — código novo não é "legacy" no sentido Feathers
|
|
168
|
+
- Projeto sem `omm-auditor` rodado E sem flag explícita — skip silencioso (consultive)
|
|
169
|
+
- Tasks são `bug-fix` ou `feature` (não refactor) — gate só roda em refactor
|
|
170
|
+
|
|
171
|
+
## Ver também
|
|
172
|
+
|
|
173
|
+
- [`pre-refactor-characterization`](../kit/skills/pre-refactor-characterization/SKILL.md) — knowledge base do gate
|
|
174
|
+
- [`refactor-safety-auditor`](../kit/agents/refactor-safety-auditor.md) — agent invocado em runtime
|
|
175
|
+
- [`legacy-characterizer`](../kit/agents/legacy-characterizer.md) — agent que gera safety net
|
|
176
|
+
- [`golden-signals-coverage`](./golden-signals-coverage.md) — gate análogo da Suíte SRE
|
|
177
|
+
- [`prr-checklist-coverage`](./prr-checklist-coverage.md) — gate análogo da Suíte SRE para PRR
|
|
178
|
+
- [`omm-no-regression`](./omm-no-regression.md) — gate análogo da Suíte Observabilidade para OMM
|