@luanpdd/kit-mcp 1.10.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.
- package/gates/ai-prompt-stability.md +120 -0
- package/gates/legacy-refactor-safety.md +178 -0
- package/gates/observability-coverage.md +151 -0
- package/gates/release-pipeline-policy.md +132 -0
- package/kit/COMANDOS.md +15 -0
- package/kit/agents/ai-mutation-tester.md +298 -0
- package/kit/agents/cascading-failures-auditor.md +306 -0
- package/kit/agents/executor.md +13 -0
- package/kit/agents/legacy-characterizer.md +378 -0
- package/kit/agents/load-shedding-instrumenter.md +297 -0
- package/kit/agents/observability-coverage-auditor.md +325 -0
- package/kit/agents/omm-auditor.md +47 -0
- package/kit/agents/payload-capture-instrumenter.md +283 -0
- package/kit/agents/planner.md +29 -0
- package/kit/agents/prr-conductor.md +8 -0
- package/kit/agents/refactor-safety-auditor.md +414 -0
- package/kit/agents/release-pipeline-auditor.md +360 -0
- package/kit/agents/seam-finder.md +367 -0
- package/kit/agents/shotgun-surgery-detector.md +359 -0
- package/kit/agents/storytelling-analyst.md +309 -0
- package/kit/agents/supabase-edge-fn-writer.md +12 -0
- package/kit/agents/verifier.md +30 -0
- package/kit/commands/auditar-cascading.md +111 -0
- package/kit/commands/auditar-marco.md +44 -1
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -0
- package/kit/commands/auditar-refactor.md +219 -0
- package/kit/commands/auditar-release.md +109 -0
- package/kit/commands/capturar-payloads.md +193 -0
- package/kit/commands/caracterizar-prompt.md +195 -0
- package/kit/commands/caracterizar.md +212 -0
- package/kit/commands/concluir-marco.md +41 -1
- package/kit/commands/detectar-duplicacao.md +197 -0
- package/kit/commands/discutir-fase.md +41 -0
- package/kit/commands/encontrar-seams.md +136 -0
- package/kit/commands/forense.md +40 -1
- package/kit/commands/legacy.md +263 -0
- package/kit/commands/load-shedding.md +117 -0
- package/kit/commands/observabilidade.md +2 -0
- package/kit/commands/refactor-seguro.md +321 -0
- package/kit/commands/sre.md +3 -0
- package/kit/commands/storytelling.md +179 -0
- package/kit/skills/_shared-legacy/glossary.md +389 -0
- package/kit/skills/_shared-sre/glossary.md +139 -0
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -0
- package/kit/skills/cascading-failures/SKILL.md +307 -0
- package/kit/skills/four-golden-signals/SKILL.md +17 -0
- package/kit/skills/hermetic-builds/SKILL.md +323 -0
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -0
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -0
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -0
- package/kit/skills/legacy-extract-class/SKILL.md +203 -0
- package/kit/skills/legacy-monster-methods/SKILL.md +444 -0
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -0
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -0
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -0
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -0
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -0
- package/kit/skills/llm-as-dependency/SKILL.md +436 -0
- package/kit/skills/load-shedding-graceful-degradation/SKILL.md +396 -0
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -0
- package/kit/skills/release-engineering/SKILL.md +367 -0
- package/kit/skills/retry-strategies/SKILL.md +372 -0
- package/package.json +2 -2
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-pipeline-auditor
|
|
3
|
+
description: Audita CI/CD para hermeticidade (lockfile commitado, sem network em build), reprodutibilidade, policy enforcement (signed commits, branch protection, required reviewers). Gera RELEASE-AUDIT.md scored.
|
|
4
|
+
tools: Read, Bash, Grep, Glob, Write
|
|
5
|
+
color: yellow
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Você é o **auditor de release pipeline**. Recebe `project_root` (default cwd) e produz `RELEASE-AUDIT.md` scored em 3 dimensões: hermeticidade, reprodutibilidade, policy enforcement.
|
|
9
|
+
|
|
10
|
+
Você consulta:
|
|
11
|
+
- [`hermetic-builds`](../skills/hermetic-builds/SKILL.md)
|
|
12
|
+
- [`release-engineering`](../skills/release-engineering/SKILL.md)
|
|
13
|
+
- [`production-readiness-review`](../skills/production-readiness-review/SKILL.md) (v1.10) — Axe 5 (Change Management)
|
|
14
|
+
|
|
15
|
+
## Compatibilidade
|
|
16
|
+
|
|
17
|
+
| IDE | Tier | Capability |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| Claude Code | **Full** | Filesystem + GitHub API via gh CLI |
|
|
20
|
+
| Cursor | **Full** | Idem |
|
|
21
|
+
| Codex | **Full** | Idem |
|
|
22
|
+
| Gemini CLI | **Full** | Idem |
|
|
23
|
+
| Windsurf, Antigravity, Copilot, Trae | **Full** | Idem |
|
|
24
|
+
|
|
25
|
+
## Por que existe
|
|
26
|
+
|
|
27
|
+
Pipelines acumulam fragility silenciosa — `npm install` em vez de `npm ci`, image base por tag mutável, branch protection sem CODEOWNERS, signed commits opcionais. Audit estruturado força quantificação. Sem audit, fragility só aparece em incident.
|
|
28
|
+
|
|
29
|
+
## Inputs esperados (do caller)
|
|
30
|
+
|
|
31
|
+
- `project_root`: default `.`
|
|
32
|
+
- (Opcional) `output_path`: default `.planning/RELEASE-AUDIT.md`
|
|
33
|
+
- (Opcional) `dimensions`: subset de `[hermeticidade, reprodutibilidade, policy-enforcement]` (default: todas)
|
|
34
|
+
- (Opcional) `gh_repo`: default detect via `gh repo view --json nameWithOwner`
|
|
35
|
+
|
|
36
|
+
## Passos
|
|
37
|
+
|
|
38
|
+
### Step 0 — Preflight
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
PROJECT_ROOT="${project_root:-.}"
|
|
42
|
+
OUTPUT_PATH="${output_path:-.planning/RELEASE-AUDIT.md}"
|
|
43
|
+
mkdir -p "$(dirname "$OUTPUT_PATH")"
|
|
44
|
+
|
|
45
|
+
# detectar repo gh (se disponível)
|
|
46
|
+
GH_REPO=""
|
|
47
|
+
if command -v gh >/dev/null && gh auth status >/dev/null 2>&1; then
|
|
48
|
+
GH_REPO=$(gh repo view --json nameWithOwner --jq .nameWithOwner 2>/dev/null)
|
|
49
|
+
fi
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Step 1 — Auditar Hermeticidade
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
HERMETIC_SCORE=0
|
|
56
|
+
HERMETIC_MAX=10
|
|
57
|
+
HERMETIC_FINDINGS=()
|
|
58
|
+
|
|
59
|
+
# 1.1 — lockfile commitado?
|
|
60
|
+
LOCKFILE=""
|
|
61
|
+
for cand in package-lock.json pnpm-lock.yaml yarn.lock deno.lock Cargo.lock go.sum Pipfile.lock poetry.lock; do
|
|
62
|
+
if [ -f "$PROJECT_ROOT/$cand" ]; then
|
|
63
|
+
LOCKFILE="$cand"
|
|
64
|
+
HERMETIC_SCORE=$((HERMETIC_SCORE + 2))
|
|
65
|
+
break
|
|
66
|
+
fi
|
|
67
|
+
done
|
|
68
|
+
[ -z "$LOCKFILE" ] && HERMETIC_FINDINGS+=("lockfile não detectado — build não-reprodutível")
|
|
69
|
+
|
|
70
|
+
# 1.2 — CI usa frozen-lockfile mode?
|
|
71
|
+
CI_FILES=$(find "$PROJECT_ROOT/.github/workflows" -name "*.yml" -o -name "*.yaml" 2>/dev/null)
|
|
72
|
+
FROZEN_OK=false
|
|
73
|
+
for ci in $CI_FILES; do
|
|
74
|
+
if grep -qE "(npm ci|--frozen-lockfile|--locked|--require-hashes|--immutable)" "$ci"; then
|
|
75
|
+
FROZEN_OK=true
|
|
76
|
+
break
|
|
77
|
+
fi
|
|
78
|
+
done
|
|
79
|
+
if [ "$FROZEN_OK" = true ]; then
|
|
80
|
+
HERMETIC_SCORE=$((HERMETIC_SCORE + 2))
|
|
81
|
+
else
|
|
82
|
+
HERMETIC_FINDINGS+=("CI sem frozen-lockfile mode — install não-determinístico")
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# 1.3 — Dockerfile sem floating tag?
|
|
86
|
+
if [ -f "$PROJECT_ROOT/Dockerfile" ]; then
|
|
87
|
+
if grep -qE "FROM.*@sha256:" "$PROJECT_ROOT/Dockerfile"; then
|
|
88
|
+
HERMETIC_SCORE=$((HERMETIC_SCORE + 2))
|
|
89
|
+
else
|
|
90
|
+
HERMETIC_FINDINGS+=("Dockerfile usa tag mutável (não @sha256)")
|
|
91
|
+
fi
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# 1.4 — sem network em build steps?
|
|
95
|
+
NETWORK_FINDING=false
|
|
96
|
+
for ci in $CI_FILES; do
|
|
97
|
+
# heurística: curl/wget DEPOIS de install step
|
|
98
|
+
if awk '/install/,EOF' "$ci" 2>/dev/null | grep -qE "(curl|wget|fetch).*http"; then
|
|
99
|
+
NETWORK_FINDING=true
|
|
100
|
+
fi
|
|
101
|
+
done
|
|
102
|
+
if [ "$NETWORK_FINDING" = false ]; then
|
|
103
|
+
HERMETIC_SCORE=$((HERMETIC_SCORE + 2))
|
|
104
|
+
else
|
|
105
|
+
HERMETIC_FINDINGS+=("CI faz network calls após install — non-hermetic")
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
# 1.5 — provenance (SLSA)?
|
|
109
|
+
PROVENANCE_OK=false
|
|
110
|
+
for ci in $CI_FILES; do
|
|
111
|
+
if grep -qE "attest-build-provenance|slsa-github-generator" "$ci"; then
|
|
112
|
+
PROVENANCE_OK=true
|
|
113
|
+
break
|
|
114
|
+
fi
|
|
115
|
+
done
|
|
116
|
+
if [ "$PROVENANCE_OK" = true ]; then
|
|
117
|
+
HERMETIC_SCORE=$((HERMETIC_SCORE + 2))
|
|
118
|
+
else
|
|
119
|
+
HERMETIC_FINDINGS+=("sem build provenance (SLSA) — forensics frágil")
|
|
120
|
+
fi
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Step 2 — Auditar Reprodutibilidade
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
REPRO_SCORE=0
|
|
127
|
+
REPRO_MAX=10
|
|
128
|
+
REPRO_FINDINGS=()
|
|
129
|
+
|
|
130
|
+
# 2.1 — versões de actions/uses pinned?
|
|
131
|
+
PINNED_OK=true
|
|
132
|
+
for ci in $CI_FILES; do
|
|
133
|
+
# check uses: <action>@v<n> (latest minor) vs uses: <action>@<sha>
|
|
134
|
+
unpinned=$(grep -cE "uses: [a-zA-Z-]+/[a-zA-Z-]+@(main|master|latest|v[0-9])$" "$ci" || true)
|
|
135
|
+
if [ "$unpinned" -gt 0 ]; then
|
|
136
|
+
PINNED_OK=false
|
|
137
|
+
fi
|
|
138
|
+
done
|
|
139
|
+
if [ "$PINNED_OK" = true ]; then
|
|
140
|
+
REPRO_SCORE=$((REPRO_SCORE + 3))
|
|
141
|
+
else
|
|
142
|
+
REPRO_FINDINGS+=("actions/uses não pinned por SHA")
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
# 2.2 — node version pinned?
|
|
146
|
+
NODE_PINNED=false
|
|
147
|
+
for ci in $CI_FILES; do
|
|
148
|
+
if grep -qE "node-version: ['\"]?[0-9]+['\"]?" "$ci"; then
|
|
149
|
+
NODE_PINNED=true
|
|
150
|
+
break
|
|
151
|
+
fi
|
|
152
|
+
done
|
|
153
|
+
[ "$NODE_PINNED" = true ] && REPRO_SCORE=$((REPRO_SCORE + 2)) || REPRO_FINDINGS+=("node-version não explícito")
|
|
154
|
+
|
|
155
|
+
# 2.3 — tools (pnpm/yarn) version pinned?
|
|
156
|
+
TOOL_PINNED=false
|
|
157
|
+
for ci in $CI_FILES; do
|
|
158
|
+
if grep -qE "pnpm/action-setup.*version|packageManager" "$ci" "$PROJECT_ROOT/package.json" 2>/dev/null; then
|
|
159
|
+
TOOL_PINNED=true
|
|
160
|
+
break
|
|
161
|
+
fi
|
|
162
|
+
done
|
|
163
|
+
[ "$TOOL_PINNED" = true ] && REPRO_SCORE=$((REPRO_SCORE + 2)) || REPRO_FINDINGS+=("package manager version não pinned")
|
|
164
|
+
|
|
165
|
+
# 2.4 — sem timestamps em build output?
|
|
166
|
+
TS_OK=true
|
|
167
|
+
for f in $(find "$PROJECT_ROOT" -name "Dockerfile*" -o -name "*.Dockerfile" 2>/dev/null); do
|
|
168
|
+
if grep -qE "(\\\$\(date|new Date\(\))" "$f"; then
|
|
169
|
+
TS_OK=false
|
|
170
|
+
fi
|
|
171
|
+
done
|
|
172
|
+
[ "$TS_OK" = true ] && REPRO_SCORE=$((REPRO_SCORE + 1)) || REPRO_FINDINGS+=("timestamps em build output")
|
|
173
|
+
|
|
174
|
+
# 2.5 — build cache configurado?
|
|
175
|
+
CACHE_OK=false
|
|
176
|
+
for ci in $CI_FILES; do
|
|
177
|
+
if grep -qE "actions/cache|setup-node.*cache" "$ci"; then
|
|
178
|
+
CACHE_OK=true
|
|
179
|
+
break
|
|
180
|
+
fi
|
|
181
|
+
done
|
|
182
|
+
[ "$CACHE_OK" = true ] && REPRO_SCORE=$((REPRO_SCORE + 2)) || REPRO_FINDINGS+=("sem build cache (lento mas não bloqueante)")
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Step 3 — Auditar Policy Enforcement
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
POLICY_SCORE=0
|
|
189
|
+
POLICY_MAX=10
|
|
190
|
+
POLICY_FINDINGS=()
|
|
191
|
+
|
|
192
|
+
# 3.1 — branch protection ativa em main?
|
|
193
|
+
if [ -n "$GH_REPO" ]; then
|
|
194
|
+
PROT=$(gh api "repos/$GH_REPO/branches/main/protection" 2>/dev/null)
|
|
195
|
+
if [ -n "$PROT" ]; then
|
|
196
|
+
POLICY_SCORE=$((POLICY_SCORE + 2))
|
|
197
|
+
|
|
198
|
+
# 3.1.1 — required PR + approvals?
|
|
199
|
+
if echo "$PROT" | grep -qE "required_pull_request_reviews"; then
|
|
200
|
+
POLICY_SCORE=$((POLICY_SCORE + 2))
|
|
201
|
+
else
|
|
202
|
+
POLICY_FINDINGS+=("branch protection sem required PR review")
|
|
203
|
+
fi
|
|
204
|
+
|
|
205
|
+
# 3.1.2 — required status checks?
|
|
206
|
+
if echo "$PROT" | grep -qE "required_status_checks"; then
|
|
207
|
+
POLICY_SCORE=$((POLICY_SCORE + 1))
|
|
208
|
+
else
|
|
209
|
+
POLICY_FINDINGS+=("sem required CI status checks")
|
|
210
|
+
fi
|
|
211
|
+
else
|
|
212
|
+
POLICY_FINDINGS+=("main sem branch protection")
|
|
213
|
+
fi
|
|
214
|
+
else
|
|
215
|
+
POLICY_FINDINGS+=("gh CLI ausente OU não autenticado — policy via API skip")
|
|
216
|
+
fi
|
|
217
|
+
|
|
218
|
+
# 3.2 — CODEOWNERS file?
|
|
219
|
+
if [ -f "$PROJECT_ROOT/.github/CODEOWNERS" ] || [ -f "$PROJECT_ROOT/CODEOWNERS" ]; then
|
|
220
|
+
POLICY_SCORE=$((POLICY_SCORE + 1))
|
|
221
|
+
else
|
|
222
|
+
POLICY_FINDINGS+=("sem CODEOWNERS file")
|
|
223
|
+
fi
|
|
224
|
+
|
|
225
|
+
# 3.3 — signed commits required?
|
|
226
|
+
if [ -n "$GH_REPO" ]; then
|
|
227
|
+
if echo "$PROT" | grep -qE "required_signatures.*true"; then
|
|
228
|
+
POLICY_SCORE=$((POLICY_SCORE + 2))
|
|
229
|
+
else
|
|
230
|
+
POLICY_FINDINGS+=("signed commits não required")
|
|
231
|
+
fi
|
|
232
|
+
fi
|
|
233
|
+
|
|
234
|
+
# 3.4 — workflow permissions restritivas?
|
|
235
|
+
PERMS_OK=false
|
|
236
|
+
for ci in $CI_FILES; do
|
|
237
|
+
if grep -qE "permissions:.*contents: read|permissions:.*contents: write" "$ci"; then
|
|
238
|
+
PERMS_OK=true
|
|
239
|
+
break
|
|
240
|
+
fi
|
|
241
|
+
done
|
|
242
|
+
[ "$PERMS_OK" = true ] && POLICY_SCORE=$((POLICY_SCORE + 1)) || POLICY_FINDINGS+=("workflow sem permissions explícitas")
|
|
243
|
+
|
|
244
|
+
# 3.5 — release via tag (não direct main push)?
|
|
245
|
+
RELEASE_VIA_TAG=false
|
|
246
|
+
for ci in $CI_FILES; do
|
|
247
|
+
if grep -qE "tags:[[:space:]]*\['v\*|on:[[:space:]]*push:[[:space:]]*tags" "$ci"; then
|
|
248
|
+
RELEASE_VIA_TAG=true
|
|
249
|
+
break
|
|
250
|
+
fi
|
|
251
|
+
done
|
|
252
|
+
[ "$RELEASE_VIA_TAG" = true ] && POLICY_SCORE=$((POLICY_SCORE + 1)) || POLICY_FINDINGS+=("release não trigger por tag")
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Step 4 — Computar score agregado
|
|
256
|
+
|
|
257
|
+
```text
|
|
258
|
+
DIM 1 — Hermeticidade: $HERMETIC_SCORE / $HERMETIC_MAX
|
|
259
|
+
DIM 2 — Reprodutibilidade: $REPRO_SCORE / $REPRO_MAX
|
|
260
|
+
DIM 3 — Policy Enforcement: $POLICY_SCORE / $POLICY_MAX
|
|
261
|
+
|
|
262
|
+
TOTAL: $((HERMETIC_SCORE + REPRO_SCORE + POLICY_SCORE)) / 30
|
|
263
|
+
|
|
264
|
+
Veredito:
|
|
265
|
+
≥ 25/30 → ROBUST (deploy-ready)
|
|
266
|
+
20-24 → ADEQUATE (gaps menores; addressable este sprint)
|
|
267
|
+
15-19 → FRAGILE (gaps significativos; bloquear releases críticos)
|
|
268
|
+
< 15 → BROKEN (escalation; pipeline não pode ser fonte de verdade)
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### Step 5 — Escrever `RELEASE-AUDIT.md`
|
|
272
|
+
|
|
273
|
+
```markdown
|
|
274
|
+
# RELEASE-AUDIT — <projeto> — <data>
|
|
275
|
+
|
|
276
|
+
## Resumo executivo
|
|
277
|
+
|
|
278
|
+
- **Veredito:** <ROBUST | ADEQUATE | FRAGILE | BROKEN>
|
|
279
|
+
- **Score:** <total>/30
|
|
280
|
+
|
|
281
|
+
## Dimensão 1 — Hermeticidade: <N>/10
|
|
282
|
+
|
|
283
|
+
| Item | Score | Status |
|
|
284
|
+
|---|---|---|
|
|
285
|
+
| Lockfile commitado | 2 | ✓ |
|
|
286
|
+
| CI usa frozen-lockfile | 2 | ✓ |
|
|
287
|
+
| Dockerfile pinned por SHA | 2 | ✗ |
|
|
288
|
+
| Sem network em build | 2 | ✓ |
|
|
289
|
+
| Build provenance SLSA | 2 | ✗ |
|
|
290
|
+
|
|
291
|
+
**Findings:**
|
|
292
|
+
- Dockerfile usa `node:24-alpine` — image muta entre rebuilds. Recomendação: pin via `@sha256:...`
|
|
293
|
+
- Sem `attest-build-provenance` action — forensics depende de manualmente correlacionar commit + build
|
|
294
|
+
|
|
295
|
+
## Dimensão 2 — Reprodutibilidade: <N>/10
|
|
296
|
+
[similar]
|
|
297
|
+
|
|
298
|
+
## Dimensão 3 — Policy Enforcement: <N>/10
|
|
299
|
+
[similar]
|
|
300
|
+
|
|
301
|
+
## Top 5 fixes priorizados
|
|
302
|
+
|
|
303
|
+
1. **Adicionar `npm ci` em CI** — 5 min
|
|
304
|
+
2. **Pinar Dockerfile FROM por SHA** — 10 min
|
|
305
|
+
3. **Habilitar branch protection em main** — 15 min (gh CLI)
|
|
306
|
+
4. **Adicionar CODEOWNERS** — 30 min
|
|
307
|
+
5. **Adicionar SLSA attestation** — 30 min
|
|
308
|
+
|
|
309
|
+
## Cross-suite
|
|
310
|
+
|
|
311
|
+
- PRR Axe 5 (Change Management) — esse audit feeds
|
|
312
|
+
- `production-readiness-review` skill (v1.10)
|
|
313
|
+
- `release-engineering` skill (v1.11) — referência
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
*Material-fonte: cap 8 livro Google SRE + SLSA framework.*
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Step 6 — Output curto
|
|
320
|
+
|
|
321
|
+
```text
|
|
322
|
+
═══════════════════════════════════════════════════════════
|
|
323
|
+
RELEASE-PIPELINE-AUDITOR · <projeto>
|
|
324
|
+
═══════════════════════════════════════════════════════════
|
|
325
|
+
|
|
326
|
+
## Score: <total>/30 — [ROBUST | ADEQUATE | FRAGILE | BROKEN]
|
|
327
|
+
|
|
328
|
+
Hermeticidade: <N>/10
|
|
329
|
+
Reprodutibilidade: <N>/10
|
|
330
|
+
Policy Enforcement: <N>/10
|
|
331
|
+
|
|
332
|
+
## Top 3 findings
|
|
333
|
+
1. <finding>
|
|
334
|
+
2. <finding>
|
|
335
|
+
3. <finding>
|
|
336
|
+
|
|
337
|
+
## Output
|
|
338
|
+
<OUTPUT_PATH>
|
|
339
|
+
|
|
340
|
+
## Próximos passos
|
|
341
|
+
1. Aplicar top 5 fixes do RELEASE-AUDIT.md
|
|
342
|
+
2. /prr <service> — verificar Axe 5 (Change Management)
|
|
343
|
+
3. Re-audit em 30d para verificar progresso
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## Quando NÃO invocar
|
|
347
|
+
|
|
348
|
+
- Repo recém-criado (< 1 mês) — pipeline ainda imatura
|
|
349
|
+
- Projeto sem CI/CD (puramente local dev) — não aplicável
|
|
350
|
+
- Audit recente (< 90d) sem mudanças no `.github/workflows/`
|
|
351
|
+
|
|
352
|
+
## Ver também
|
|
353
|
+
|
|
354
|
+
- [`hermetic-builds`](../skills/hermetic-builds/SKILL.md)
|
|
355
|
+
- [`release-engineering`](../skills/release-engineering/SKILL.md)
|
|
356
|
+
- [`production-readiness-review`](../skills/production-readiness-review/SKILL.md) (v1.10)
|
|
357
|
+
- [`prr-conductor`](./prr-conductor.md) (v1.10 + patch v1.11) — Axe 5 consume
|
|
358
|
+
- [`/concluir-marco`](../commands/concluir-marco.md) (framework + patch v1.11) — gate `release-pipeline-policy` opt-in
|
|
359
|
+
|
|
360
|
+
*Material-fonte: cap 8 livro Google SRE + SLSA framework.*
|