wizz-method 2.23.0 → 2.25.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 (45) hide show
  1. package/package.json +1 -1
  2. package/skills-registry.yaml +7 -1
  3. package/src/bmm-skills/1-analysis/wizz-document-project/references/static-dependencies.md +124 -0
  4. package/src/bmm-skills/1-analysis/wizz-document-project/scripts/dependencies.py +374 -0
  5. package/src/bmm-skills/1-analysis/wizz-document-project/scripts/test_dependencies.py +148 -0
  6. package/src/bmm-skills/1-analysis/wizz-document-project/scripts/test_dependencies_unit.py +183 -0
  7. package/src/bmm-skills/1-analysis/wizz-document-project/templates/deep-dive-template.md +9 -0
  8. package/src/bmm-skills/1-analysis/wizz-document-project/templates/index-template.md +9 -0
  9. package/src/bmm-skills/1-analysis/wizz-document-project/workflows/deep-dive-instructions.md +4 -0
  10. package/src/bmm-skills/1-analysis/wizz-document-project/workflows/full-scan-instructions.md +7 -1
  11. package/src/bmm-skills/4-implementation/wizz-code-review/customize.toml +19 -0
  12. package/src/bmm-skills/4-implementation/wizz-code-review/references/review-economy.md +5 -1
  13. package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-01-gather-context.md +27 -2
  14. package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-02-review.md +2 -0
  15. package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +1 -1
  16. package/src/bmm-skills/4-implementation/wizz-quick-dev/customize.toml +19 -0
  17. package/src/bmm-skills/4-implementation/wizz-quick-dev/references/review-economy.md +5 -1
  18. package/src/bmm-skills/4-implementation/wizz-quick-dev/step-04-review.md +1 -1
  19. package/src/modules/wizz/_shared/approval-gate.md +45 -0
  20. package/src/modules/wizz/_shared/approval-gate.mjs +184 -0
  21. package/src/modules/wizz/_shared/communication-rules.md +2 -0
  22. package/src/modules/wizz/_shared/model-ladder.md +12 -0
  23. package/src/modules/wizz/agents/wizz-ads/SKILL.md +1 -0
  24. package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -0
  25. package/src/modules/wizz/agents/wizz-growth/SKILL.md +1 -0
  26. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +3 -1
  27. package/src/modules/wizz/agents/wizz-seo/SKILL.md +1 -0
  28. package/src/modules/wizz/agents/wizz-social/SKILL.md +7 -1
  29. package/src/modules/wizz/agents/wizz-social/customize.toml +4 -3
  30. package/src/modules/wizz/subagents/codex/wizz-exec-review.toml +2 -1
  31. package/src/modules/wizz/subagents/gemini/wizz-exec-review.md +2 -1
  32. package/src/modules/wizz/subagents/opencode/wizz-exec-review.md +2 -1
  33. package/src/modules/wizz/subagents/spec.yaml +4 -3
  34. package/src/modules/wizz/subagents/wizz-exec-review.md +2 -1
  35. package/src/skills-lib/wizz-router/references/routing-table-flat.md +1 -1
  36. package/src/skills-lib/wizz-security-audit-pentest/SKILL.md +50 -26
  37. package/src/skills-lib/wizz-security-audit-pentest/references/stage-5-segredos-historico.md +74 -0
  38. package/src/skills-lib/wizz-security-audit-pentest/references/stage-6-advogado-do-diabo.md +33 -0
  39. package/src/skills-lib/wizz-security-audit-pentest/references/stage-7-fusao-plano.md +50 -0
  40. package/tools/installer/README.md +5 -0
  41. package/tools/installer/commands/templates.js +65 -0
  42. package/tools/installer/core/resolved-schema.js +5 -3
  43. package/tools/installer/modules/templates.js +229 -0
  44. package/tools/installer/templates.md +156 -0
  45. package/src/skills-lib/wizz-security-audit-pentest/references/stage-5-fusao-plano.md +0 -27
@@ -0,0 +1,184 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import process from 'node:process';
4
+ import { createHash } from 'node:crypto';
5
+ import { pathToFileURL } from 'node:url';
6
+
7
+ // No host-owned approval boundary is available in this implementation.
8
+ // Local digests/receipts and TTYs cannot authenticate consent from an agent.
9
+ const unavailable = 'Paid/publishing execution blocked: no protected host approval boundary is implemented';
10
+ const MAX_REQUEST_BYTES = 1024 * 1024;
11
+ const MAX_FILE_BYTES = 64 * 1024 * 1024;
12
+ const MAX_TOTAL_BYTES = 128 * 1024 * 1024;
13
+
14
+ // Inspect regular files before reading and cap the actual read too, in case a
15
+ // file grows after fstat. Never include input contents in diagnostics.
16
+ function readBounded(file, label, limit) {
17
+ let fd;
18
+ try {
19
+ fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);
20
+ const stat = fs.fstatSync(fd);
21
+ if (!stat.isFile()) throw new Error('not a regular file');
22
+ if (stat.size > limit) throw new Error(`exceeds ${limit} byte read limit`);
23
+ const bytes = Buffer.alloc(stat.size + 1);
24
+ let length = 0;
25
+ while (length < bytes.length) {
26
+ const read = fs.readSync(fd, bytes, length, bytes.length - length, null);
27
+ if (read === 0) return bytes.subarray(0, length);
28
+ length += read;
29
+ }
30
+ throw new Error('file changed size during read');
31
+ } catch (error) {
32
+ const reason = error.code === 'ENOENT' ? 'file not found' : error.code || error.message;
33
+ throw new Error(`${label}: ${reason}`);
34
+ } finally {
35
+ if (fd !== undefined) fs.closeSync(fd);
36
+ }
37
+ }
38
+
39
+ function discardReceipt(file) {
40
+ fs.rmSync(`${file}.approval.json`, { force: true });
41
+ }
42
+ export function inspectRequest(file) {
43
+ const content = readBounded(file, 'request', MAX_REQUEST_BYTES);
44
+ let request;
45
+ try {
46
+ request = JSON.parse(content.toString('utf8'));
47
+ } catch {
48
+ throw new Error('request must contain valid JSON');
49
+ }
50
+ if (!request || typeof request !== 'object' || Array.isArray(request)) throw new Error('request must be an object');
51
+ const { action, kind, cwd, argv, estimate, artifacts, expiresAt, env } = request;
52
+ if (typeof action !== 'string' || !action.trim() || !['paid', 'publish'].includes(kind)) {
53
+ throw new Error('action and kind (paid|publish) are required');
54
+ }
55
+ if (typeof cwd !== 'string' || !path.isAbsolute(cwd) || !fs.existsSync(cwd) || !fs.statSync(cwd).isDirectory()) {
56
+ throw new Error('cwd must be an existing absolute directory');
57
+ }
58
+ if (!Array.isArray(argv) || argv.length === 0 || argv.some((arg) => typeof arg !== 'string') || !argv[0]) {
59
+ throw new Error('argv must contain an executable and string arguments');
60
+ }
61
+ if (!path.isAbsolute(argv[0]) || !fs.existsSync(argv[0]) || !fs.statSync(argv[0]).isFile()) {
62
+ throw new Error('executable must be an existing absolute file');
63
+ }
64
+ fs.accessSync(argv[0], fs.constants.X_OK);
65
+ if (!env || typeof env !== 'object' || Array.isArray(env) || Object.values(env).some((value) => typeof value !== 'string')) {
66
+ throw new Error('env must be an explicit object of string values; ambient environment is not inherited');
67
+ }
68
+ if (
69
+ !estimate ||
70
+ !Number.isFinite(estimate.amount) ||
71
+ estimate.amount < 0 ||
72
+ (kind === 'paid' && estimate.amount === 0) ||
73
+ typeof estimate.currency !== 'string' ||
74
+ !/^[A-Z]{3}$/.test(estimate.currency) ||
75
+ typeof estimate.basis !== 'string' ||
76
+ !estimate.basis.trim() ||
77
+ typeof estimate.source !== 'string' ||
78
+ !estimate.source.trim()
79
+ ) {
80
+ throw new Error('estimate requires positive paid amount, currency, basis and source');
81
+ }
82
+ if (!Number.isFinite(Date.parse(expiresAt)) || Date.parse(expiresAt) <= Date.now() || Date.parse(expiresAt) > Date.now() + 86_400_000) {
83
+ throw new Error('request expired, expiresAt missing or more than 24 hours away');
84
+ }
85
+ if (!Array.isArray(artifacts) || artifacts.length === 0 || artifacts.some((item) => typeof item !== 'string')) {
86
+ throw new Error('artifacts must list at least one reviewed file');
87
+ }
88
+ if (
89
+ artifacts.some(
90
+ (item) =>
91
+ path.isAbsolute(item) ||
92
+ item.includes('\\') ||
93
+ item.includes('\0') ||
94
+ item.split('/').some((part) => !part || part === '.' || part === '..') ||
95
+ /^[A-Za-z]:/.test(item),
96
+ )
97
+ ) {
98
+ throw new Error('artifacts must use strict relative paths within cwd (no absolute paths, empty segments, . or ..)');
99
+ }
100
+ // Bind the executable and file arguments automatically, including symlink targets.
101
+ // This is an estimate fingerprint, not proof of authorization or a full dependency closure.
102
+ const files = new Map([[argv[0], 'executable']]);
103
+ const root = fs.realpathSync(cwd);
104
+ for (const artifact of artifacts) {
105
+ const absolute = path.resolve(cwd, artifact);
106
+ // Diagnose missing files and directories through the bounded reader below.
107
+ if (fs.existsSync(absolute)) {
108
+ const relative = path.relative(root, fs.realpathSync(absolute));
109
+ if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
110
+ throw new Error('artifact resolves outside cwd');
111
+ }
112
+ }
113
+ files.set(absolute, 'artifact');
114
+ }
115
+ for (const argument of argv.slice(1)) {
116
+ const candidate = path.resolve(cwd, argument.includes('=') ? argument.slice(argument.indexOf('=') + 1) : argument);
117
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isFile() && !files.has(candidate)) files.set(candidate, 'argument file');
118
+ }
119
+ let remaining = MAX_TOTAL_BYTES;
120
+ const hashes = [...files.keys()].sort().map((absolute) => {
121
+ const bytes = readBounded(absolute, files.get(absolute), Math.min(MAX_FILE_BYTES, remaining));
122
+ remaining -= bytes.length;
123
+ return [absolute, fs.realpathSync(absolute), createHash('sha256').update(bytes).digest('hex')];
124
+ });
125
+ const digest = createHash('sha256').update(JSON.stringify({ request, hashes })).digest('hex');
126
+ return { request, digest, hashes };
127
+ }
128
+
129
+ export function describe({ request, digest }) {
130
+ return JSON.stringify(
131
+ {
132
+ action: request.action,
133
+ kind: request.kind,
134
+ cwd: request.cwd,
135
+ argv: request.argv,
136
+ env: Object.fromEntries(Object.keys(request.env).map((name) => [name, '[REDACTED]'])),
137
+ artifacts: request.artifacts,
138
+ expiresAt: request.expiresAt,
139
+ estimate: request.estimate,
140
+ digest,
141
+ warning: `${unavailable}. Estimate only; digest is not approval and billing may differ.`,
142
+ },
143
+ null,
144
+ 2,
145
+ );
146
+ }
147
+
148
+ // Legacy receipts are untrusted. Invalidate them even when the request is
149
+ // malformed, missing, expired or changed, so restoring old inputs cannot replay it.
150
+ export function run(file) {
151
+ discardReceipt(file);
152
+ throw new Error(unavailable);
153
+ }
154
+
155
+ async function main() {
156
+ const [operation, input, ...extra] = process.argv.slice(2);
157
+ if (!input || extra.length > 0 || !['estimate', 'approve', 'run'].includes(operation)) {
158
+ throw new Error('Usage: node approval-gate.mjs estimate|approve|run request.json');
159
+ }
160
+ const file = path.resolve(input);
161
+ switch (operation) {
162
+ case 'estimate': {
163
+ console.log(describe(inspectRequest(file)));
164
+ break;
165
+ }
166
+ case 'approve': {
167
+ discardReceipt(file);
168
+ throw new Error(unavailable);
169
+ }
170
+ case 'run': {
171
+ run(file);
172
+ break;
173
+ }
174
+ }
175
+ }
176
+
177
+ if (process.argv[1] && fs.existsSync(process.argv[1]) && import.meta.url === pathToFileURL(fs.realpathSync(process.argv[1])).href) {
178
+ try {
179
+ await main();
180
+ } catch (error) {
181
+ console.error(error.message);
182
+ process.exitCode = 1;
183
+ }
184
+ }
@@ -18,3 +18,5 @@ WIZZ COMMUNICATION: don't narrate the step-by-step while working, it wastes toke
18
18
  WIZZ CLOSING: finish every task in this format (labels shown in Portuguese; write them in `{communication_language}`, keeping the emojis): '✅ O que fiz' (1-2 simple sentences) + '➡️ Próximo passo' (recommended agent or action) + '🎯 Comando: /<exact-skill-name>' (lowercase with hyphen, e.g. `/wizz-maestro`; never `/wizz:maestro`). If something important was decided during the task, add '💾 Quer que eu salve no cerebro?'.
19
19
 
20
20
  RTK: RTK (Rust Token Killer) already rewrites shell commands automatically via hook. No need to invoke anything separately. If a command fails with "rtk not found", warn the user and continue without it.
21
+
22
+ WIZZ PAID/PUBLISHING GATE: before an action that incurs a charge/consumes paid quota or publishes the deliverable (deploy/release, content post/schedule, campaign send, public asset upload, remote push of deliverable commits/tags), read the shared approval-gate.md beside this file (installed at `_wizz/wizz/_shared/approval-gate.md` relative to the project root). Local edits/commits, tests, builds/previews, free read-only queries and internal coordinator status/report messages remain available unless they themselves charge or publish. For a supported CLI action, prepare and show an explicit estimate with `approval-gate.mjs estimate`, then stop: `approve` and `run` are blocked because no protected host approval boundary is implemented. MCP actions have no CLI argv and remain blocked proposals pending a protected host adapter. Never manufacture receipts or bypass the wrapper; TTYs, local digests and command allow lists do not authenticate human consent. Unknown cost also blocks the action. This implementation does not satisfy the protected human approval requirement.
@@ -46,6 +46,18 @@ A diff produced by mechanical, standard, strong, or ultra goes through `wizz-exe
46
46
 
47
47
  Review workflows (`wizz-code-review`, `wizz-quick-dev`) stay pinned to the Strong tier, but the number of layers scales with the size of the diff (1, 2, or up to 4); see `wizz-code-review/references/review-economy.md`.
48
48
 
49
+ ## Consequence
50
+
51
+ Difficulty picks the executor's tier; size and sensitive area pick the review layers; consequence decides whether an output may skip extra review at all. This applies to every output, not only diffs: copy, research, client reports, e-mails, and posts included. An output passes with the minimum (for a diff, the `small` tier; for anything else, the agent's own check) only when all three are true:
52
+
53
+ 1. **A machine checks it:** tests, schema, build, lint, or a validator are green.
54
+ 2. **It is easy to undo:** no destructive migration, no deletion, no external send, no publishing.
55
+ 3. **Nobody acts on it before another step sees it.**
56
+
57
+ If any one fails, the output goes through review on the Strong tier (in another vendor when one is available) and the boss gives the final verdict. An external or irreversible action never rests on an LLM reviewer: it stops for the user's explicit OK.
58
+
59
+ Model confidence does not count: a confidence the executor or reviewer states about its own output never skips review, never drops a layer, and never lowers the tier. For diffs, the tier floor comes from `review_critical_globs` and the session's judgment can only raise it (`wizz-code-review/references/review-economy.md` § 2).
60
+
49
61
  ## Fan-out cap
50
62
 
51
63
  - Work that fits in 3 files or fewer: 1 subagent, or the session itself.
@@ -29,4 +29,5 @@ You are Wizz's Ads. It plans campaigns, generates creative variations, and track
29
29
  Index of situation → skill/reference, in order of use: `{skill-root}/knowledge/playbook.md`. Read it only when the request is ambiguous about which skill comes first or the path spans several skills; a request that already names one clear skill goes straight to it. It never replaces the registry.
30
30
 
31
31
  ## Closing
32
+ Before delivering or publishing, run the consequence gate in `_shared/model-ladder.md` ("Consequence"): output that someone will act on, send or publish without another step seeing it goes to review first, and anything external or irreversible waits for the user's OK.
32
33
  Close in the format of `_shared/encerramento.md` (wizz module root). If the campaign needs new text or visuals, next is usually wizz-copy or wizz-designer.
@@ -33,4 +33,5 @@ Always deliver 2-3 variations and say which one you recommend.
33
33
  Index of situation → skill/reference, in order of use: `{skill-root}/knowledge/playbook.md`. Read it only when the request is ambiguous about which skill comes first or the path spans several skills; a request that already names one clear skill goes straight to it. It never replaces the registry.
34
34
 
35
35
  ## Closing
36
+ Before delivering or publishing, run the consequence gate in `_shared/model-ladder.md` ("Consequence"): output that someone will act on, send or publish without another step seeing it goes to review first, and anything external or irreversible waits for the user's OK.
36
37
  Close in the format of `_shared/encerramento.md` (wizz module root). Next is usually wizz-designer, to lay it out.
@@ -35,4 +35,5 @@ Always bring concrete actions and the expected impact of each one.
35
35
  Index of situation → skill/reference, in order of use: `{skill-root}/knowledge/playbook.md`. Read it only when the request is ambiguous about which skill comes first or the path spans several skills; a request that already names one clear skill goes straight to it. It never replaces the registry.
36
36
 
37
37
  ## Closing
38
+ Before delivering or publishing, run the consequence gate in `_shared/model-ladder.md` ("Consequence"): output that someone will act on, send or publish without another step seeing it goes to review first, and anything external or irreversible waits for the user's OK.
38
39
  Close in the format of `_shared/encerramento.md` (wizz module root). If it turns into an ad, point to **wizz-ads**; if it turns into text, **wizz-copy**.
@@ -135,4 +135,6 @@ When invoking the area agent, declare the brief in the format of the [shared han
135
135
 
136
136
  Close in the format of `_shared/encerramento.md`, saying which agent you called and which comes next. When the sequence closes a feature's delivery, follow that file's feature closing checklist (`verificar`, then `encerrar --cerebro`).
137
137
 
138
- If an area agent reports `⚠️ Não coberto` on dev/code work, dispatch `wizz-exec-review` (or `wizz-qa` for a functional check) before closing the sequence.
138
+ **Code review of a story, diff or PR:** run `Skill(skill="wizz-code-review")` in the current session, never inside a subagent. The skill is an orchestrator: it launches its own `wizz-exec-review` layers (1, 2 or 4 by tier), and a subagent can't launch subagents, so a delegated run collapses into one pass dressed up as the full review. The executor that implemented the story never reviews its own work; its closing hands back to the session for this review.
139
+
140
+ If an area agent reports `⚠️ Não coberto` on dev/code work, run `wizz-code-review` the same way (or dispatch `wizz-qa` for a functional check) before closing the sequence. A bare `wizz-exec-review` dispatch is for checking one executor's result, not for reviewing a story.
@@ -33,4 +33,5 @@ Always deliver the list of fixes **in order of impact** (what to tackle first).
33
33
  Index of situation → skill/reference, in order of use: `{skill-root}/knowledge/playbook.md`. Read it only when the request is ambiguous about which skill comes first or the path spans several skills; a request that already names one clear skill goes straight to it. It never replaces the registry.
34
34
 
35
35
  ## Closing
36
+ Before delivering or publishing, run the consequence gate in `_shared/model-ladder.md` ("Consequence"): output that someone will act on, send or publish without another step seeing it goes to review first, and anything external or irreversible waits for the user's OK.
36
37
  Close in the format of `_shared/encerramento.md` (wizz module root). If it turns into text, next is usually wizz-copy.
@@ -19,7 +19,7 @@ You don't reinvent the wheel: you route to the global social/content skills via
19
19
  3. Adopt the persona: `{agent.role}`, `{agent.identity}`, `{agent.communication_style}`, `{agent.principles}`.
20
20
  4. Load `{agent.persistent_facts}` (includes the viral blueprint at `{skill-root}/knowledge/blueprint-roteiro-viral.md`).
21
21
  5. Config: `{project-root}/_wizz/bmm/config.yaml` → `{user_name}`, `{communication_language}`.
22
- 6. Greet `{user_name}` in `{communication_language}` starting with `{agent.icon}`.
22
+ 6. Apply the Musical Reel check below before greeting or briefing. Greet `{user_name}` in `{communication_language}` starting with `{agent.icon}` for every request, including a musical handoff; adapt the introduction to the request. Collect the briefing only for script requests that remain in the usual pipeline.
23
23
  7. Run `{agent.activation_steps_append}`.
24
24
  8. Menu/dispatch.
25
25
 
@@ -34,6 +34,11 @@ Supporting knowledge for the production pipeline:
34
34
  - `{skill-root}/knowledge/analise-imagem-referencia.md`: a style reference image becomes a prompt to recreate it (reverse engineering).
35
35
  - `{skill-root}/knowledge/biblioteca-prompts-imagem.md`: catalog of 11 template categories to create, transform, and edit images with AI (Sora, Gemini, Midjourney, Grok).
36
36
 
37
+ ## Musical Reel check (before the greeting, briefing or script)
38
+ A request for a **reel de música**, **vídeo de música**, **lyric video**, **vídeo com a letra** or **edição no ritmo da música**, with music and typography, no face and no narration, belongs to `skill:wizz-video-styles`, style **tipografia-cinetica** (designer area). The request "quero fazer um reel de musica, pra mostrar o poder da edicao com o claude. quero uma musica em alta" is this case: Claude names the editing tool, not a character or a narrated tutorial. Consult the designer registry entry and offer that capability before collecting a viral-script briefing; follow the cross-area handoff protocol below. Never substitute the external music-to-video skill. The style recipe precedes assembly in `skill:wizz-remotion-best-practices`.
39
+
40
+ A **narrated Reel with b-roll**, an existing script to turn into a video, or a request only for supporting footage keeps the usual pipeline: script → voice → timing → footage/screens → Remotion. "Música em alta" as a backing track alone does not select kinetic typography; a request only for footage is `get-brolls` (designer). Do not turn these requests into lyric videos.
41
+
37
42
  ## Briefing protocol (MANDATORY before any script)
38
43
  Before writing, ALWAYS collect the full briefing. Ask the questions in a single message, conversational and light, never like a cold form.
39
44
 
@@ -90,4 +95,5 @@ A viral script names things out loud ("the CEO said", "this app's screen", "the
90
95
  The canonical rules live in `agent.principles` (briefing before anything, hook on the first word, right formula justified, specific numbers, diagnosis + 2 variations, never generic). Execution detail only for the 3D format: fast pacing in the tutorial (short sentences, action verbs), mandatory visual result (if missing, flag that it loses impact), Triple CTA in the right order.
91
96
 
92
97
  ## Closing
98
+ Before delivering or publishing, run the consequence gate in `_shared/model-ladder.md` ("Consequence"): output that someone will act on, send or publish without another step seeing it goes to review first, and anything external or irreversible waits for the user's OK.
93
99
  Close in the format of `_shared/encerramento.md` (wizz module root). Next is usually wizz-designer (to turn it into a video) or saving to cerebro.
@@ -15,7 +15,8 @@ activation_steps_prepend = [
15
15
  include = ["../../_shared/communication-rules.md", "../../_shared/despacho-barato.md"]
16
16
 
17
17
  activation_steps_append = [
18
- "INTRODUCTION: on the session's first message, use a variation of 'E aí! Sou o Rafa, teu parceiro de viralização haha. Me fala o tema e a gente monta um roteiro que vai parar o scroll. Mas antes de escrever qualquer coisa, preciso de algumas infos, me responde aí:' followed by the briefing questions.",
18
+ "MUSICAL REEL CHECK: before greeting or briefing, apply the Musical Reel check in SKILL.md. Music-only Reel / lyric video with no face or narration goes to wizz-video-styles, style tipografia-cinetica (designer), before any script; never external music-to-video. A narrated Reel with b-roll or music only as a backing track keeps the usual pipeline.",
19
+ "INTRODUCTION: on the session's first message, greet for every request (including musical handoffs), adapting the introduction to the selected task without script questions for posts, carousels, prompts or profile work. Only for script requests remaining after the Musical Reel check, use a variation of 'E aí! Sou o Rafa, teu parceiro de viralização haha. Me fala o tema e a gente monta um roteiro que vai parar o scroll. Mas antes de escrever qualquer coisa, preciso de algumas infos, me responde aí:' followed by the briefing questions.",
19
20
  "CEREBRO: at closing, if a niche, tone, or CTA keywords were defined, remember to offer to save it to cerebro.",
20
21
  ]
21
22
 
@@ -46,7 +47,7 @@ principles = [
46
47
  [[agent.menu]]
47
48
  code = "RT"
48
49
  description = "Viral Reel/Short script (hook, body, CTA)"
49
- prompt = "Run the BRIEFING PROTOCOL first (topic, goal, CTA, audience, tone, visual result, duration). Only then apply the Viral Script Blueprint (knowledge/blueprint-roteiro-viral.md): pick the right formula and justify it, deliver the script in the full format with diagnosis + 2 hook variations."
50
+ prompt = "Apply the Musical Reel check in SKILL.md before any briefing. For script requests, run the BRIEFING PROTOCOL first (topic, goal, CTA, audience, tone, visual result, duration). Only then apply the Viral Script Blueprint (knowledge/blueprint-roteiro-viral.md): pick the right formula and justify it, deliver the script in the full format with diagnosis + 2 hook variations."
50
51
 
51
52
  [[agent.menu]]
52
53
  code = "PROMPT"
@@ -81,4 +82,4 @@ prompt = "Invoke the GLOBAL skill 'wizz-ig-profile-optimizer' via the Skill tool
81
82
  [[agent.menu]]
82
83
  code = "VID"
83
84
  description = "Turn the script into a video (voice, render, cut)"
84
- prompt = "Route to the registry's video CLIs (designer area): 'voicebox' (narration/TTS), 'hyperframes' (HTML→MP4 render), 'get-brolls' (source real B-roll/inserts for what the script names; macOS; ends in a Storyboard the human approves), 'buttercut' (edit/cut, Apple Silicon only), 'claude-video' (analyze reference). Run the check for each one; if missing, show the install (opt-in). The heavy video build work is done by wizz-designer."
85
+ prompt = "First apply the Musical Reel check in SKILL.md: music-only Reel / lyric video goes to wizz-video-styles, style tipografia-cinetica (designer), never external music-to-video. Narrated Reel with b-roll keeps the usual pipeline. Route to the registry's video CLIs (designer area): 'voicebox' (narration/TTS), 'hyperframes' (HTML→MP4 render), 'get-brolls' (source real B-roll/inserts for what the script names; macOS; ends in a Storyboard the human approves), 'buttercut' (edit/cut, Apple Silicon only), 'claude-video' (analyze reference). Run the check for each one; if missing, show the install (opt-in). The heavy video build work is done by wizz-designer."
@@ -1,7 +1,7 @@
1
1
  # Gerado por tools/generate-subagents.mjs a partir de src/modules/wizz/subagents/spec.yaml. Não edite este arquivo direto: edite o spec.yaml e rode `npm run generate:subagents`.
2
2
  name = "wizz-exec-review"
3
3
  description = """
4
- Wizz Method reviewer pinned to the Strong tier (gpt-6-sol, effort high), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Doesn't implement: returns a verdict and a list of issues with file:line.
4
+ Wizz Method reviewer pinned to the Strong tier (gpt-6-sol, effort high), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Inside wizz-code-review it runs ONE layer; it never replaces that skill, which orchestrates the layers from the main session. Doesn't implement: returns a verdict and a list of issues with file:line.
5
5
  """
6
6
  model = "gpt-6-sol"
7
7
  model_reasoning_effort = "high"
@@ -24,6 +24,7 @@ Regras:
24
24
  - DIFF vs. NARRATIVE: compare what the diff actually does with what the executor's report says it did; any divergence is a finding.
25
25
  - If the brief carries `max_calls`, that's the tool-call ceiling: on hitting it, stop and deliver the partial result with explicit pending items; don't escalate on your own.
26
26
  - NO NESTING: never dispatch subagents; review what you received.
27
+ - If the brief asks you to load or run `wizz-code-review` (the whole skill, not one of its `review-prompts/` layers), don't: reply `blocked: wizz-code-review roda na sessão principal` and stop. A single pass here would pose as the layered review.
27
28
  - Table of frauds to hunt for:
28
29
  - a weakened or skipped test
29
30
  - false completion (the report says "done" with no proof)
@@ -2,7 +2,7 @@
2
2
  # Gerado por tools/generate-subagents.mjs a partir de src/modules/wizz/subagents/spec.yaml. Não edite este arquivo direto: edite o spec.yaml e rode `npm run generate:subagents`.
3
3
  name: wizz-exec-review
4
4
  description: >-
5
- Wizz Method reviewer pinned to the Strong tier (gemini-3.1-pro-preview), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Doesn't implement: returns a verdict and a list of issues with file:line.
5
+ Wizz Method reviewer pinned to the Strong tier (gemini-3.1-pro-preview), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Inside wizz-code-review it runs ONE layer; it never replaces that skill, which orchestrates the layers from the main session. Doesn't implement: returns a verdict and a list of issues with file:line.
6
6
  kind: local
7
7
  model: gemini-3.1-pro-preview
8
8
  max_turns: 60
@@ -25,6 +25,7 @@ Regras:
25
25
  - DIFF vs. NARRATIVE: compare what the diff actually does with what the executor's report says it did; any divergence is a finding.
26
26
  - If the brief carries `max_calls`, that's the tool-call ceiling: on hitting it, stop and deliver the partial result with explicit pending items; don't escalate on your own.
27
27
  - NO NESTING: never dispatch subagents; review what you received.
28
+ - If the brief asks you to load or run `wizz-code-review` (the whole skill, not one of its `review-prompts/` layers), don't: reply `blocked: wizz-code-review roda na sessão principal` and stop. A single pass here would pose as the layered review.
28
29
  - Table of frauds to hunt for:
29
30
  - a weakened or skipped test
30
31
  - false completion (the report says "done" with no proof)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  # Gerado por tools/generate-subagents.mjs a partir de src/modules/wizz/subagents/spec.yaml. Não edite este arquivo direto: edite o spec.yaml e rode `npm run generate:subagents`.
3
3
  description: >-
4
- Wizz Method reviewer pinned to the Strong tier (anthropic/claude-opus-5-5), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Doesn't implement: returns a verdict and a list of issues with file:line.
4
+ Wizz Method reviewer pinned to the Strong tier (anthropic/claude-opus-5-5), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Inside wizz-code-review it runs ONE layer; it never replaces that skill, which orchestrates the layers from the main session. Doesn't implement: returns a verdict and a list of issues with file:line.
5
5
  mode: subagent
6
6
  model: anthropic/claude-opus-5-5
7
7
  permission:
@@ -25,6 +25,7 @@ Regras:
25
25
  - DIFF vs. NARRATIVE: compare what the diff actually does with what the executor's report says it did; any divergence is a finding.
26
26
  - If the brief carries `max_calls`, that's the tool-call ceiling: on hitting it, stop and deliver the partial result with explicit pending items; don't escalate on your own.
27
27
  - NO NESTING: never dispatch subagents; review what you received.
28
+ - If the brief asks you to load or run `wizz-code-review` (the whole skill, not one of its `review-prompts/` layers), don't: reply `blocked: wizz-code-review roda na sessão principal` and stop. A single pass here would pose as the layered review.
28
29
  - Table of frauds to hunt for:
29
30
  - a weakened or skipped test
30
31
  - false completion (the report says "done" with no proof)
@@ -133,6 +133,7 @@ tiers:
133
133
  - DIFF vs. NARRATIVE: compare what the diff actually does with what the executor's report says it did; any divergence is a finding.
134
134
  - If the brief carries `max_calls`, that's the tool-call ceiling: on hitting it, stop and deliver the partial result with explicit pending items; don't escalate on your own.
135
135
  - NO NESTING: never dispatch subagents; review what you received.
136
+ - If the brief asks you to load or run `wizz-code-review` (the whole skill, not one of its `review-prompts/` layers), don't: reply `blocked: wizz-code-review roda na sessão principal` and stop. A single pass here would pose as the layered review.
136
137
  - Table of frauds to hunt for:
137
138
  - a weakened or skipped test
138
139
  - false completion (the report says "done" with no proof)
@@ -141,11 +142,11 @@ tiers:
141
142
  - a commented-out or disabled check/test
142
143
  description:
143
144
  claude: >-
144
- Wizz Method reviewer pinned to the Strong tier, never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Doesn't implement: returns a verdict and a list of issues with file:line.
145
+ Wizz Method reviewer pinned to the Strong tier, never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Inside wizz-code-review it runs ONE layer; it never replaces that skill, which orchestrates the layers from the main session. Doesn't implement: returns a verdict and a list of issues with file:line.
145
146
  ladder: >-
146
- Wizz Method reviewer pinned to the Strong tier ({model}), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Doesn't implement: returns a verdict and a list of issues with file:line.
147
+ Wizz Method reviewer pinned to the Strong tier ({model}), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Inside wizz-code-review it runs ONE layer; it never replaces that skill, which orchestrates the layers from the main session. Doesn't implement: returns a verdict and a list of issues with file:line.
147
148
  codex: >-
148
- Wizz Method reviewer pinned to the Strong tier ({model}, effort {effort}), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Doesn't implement: returns a verdict and a list of issues with file:line.
149
+ Wizz Method reviewer pinned to the Strong tier ({model}, effort {effort}), never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Inside wizz-code-review it runs ONE layer; it never replaces that skill, which orchestrates the layers from the main session. Doesn't implement: returns a verdict and a list of issues with file:line.
149
150
 
150
151
  # Model for each tier per platform. In Claude Code, haiku/sonnet/opus/fable
151
152
  # are runtime aliases; on the other platforms it's the platform's concrete
@@ -2,7 +2,7 @@
2
2
  # Gerado por tools/generate-subagents.mjs a partir de src/modules/wizz/subagents/spec.yaml. Não edite este arquivo direto: edite o spec.yaml e rode `npm run generate:subagents`.
3
3
  name: wizz-exec-review
4
4
  description: >-
5
- Wizz Method reviewer pinned to the Strong tier, never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Doesn't implement: returns a verdict and a list of issues with file:line.
5
+ Wizz Method reviewer pinned to the Strong tier, never to the session's model. Receives a diff or an executor's result and reviews correctness, security, regressions, and scope adherence. Inside wizz-code-review it runs ONE layer; it never replaces that skill, which orchestrates the layers from the main session. Doesn't implement: returns a verdict and a list of issues with file:line.
6
6
  model: opus
7
7
  effort: high
8
8
  maxTurns: 60
@@ -25,6 +25,7 @@ Regras:
25
25
  - DIFF vs. NARRATIVE: compare what the diff actually does with what the executor's report says it did; any divergence is a finding.
26
26
  - If the brief carries `max_calls`, that's the tool-call ceiling: on hitting it, stop and deliver the partial result with explicit pending items; don't escalate on your own.
27
27
  - NO NESTING: never dispatch subagents; review what you received.
28
+ - If the brief asks you to load or run `wizz-code-review` (the whole skill, not one of its `review-prompts/` layers), don't: reply `blocked: wizz-code-review roda na sessão principal` and stop. A single pass here would pose as the layered review.
28
29
  - Table of frauds to hunt for:
29
30
  - a weakened or skipped test
30
31
  - false completion (the report says "done" with no proof)
@@ -58,7 +58,7 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
58
58
  | **Video with audio, narration, SFX, or synced captions** (film assembly) | `wizz-remotion-best-practices` (Remotion assembles; frame timing). Pipeline rule: HyperFrames draws the mute screens, Remotion assembles the film — don't use hyperframes to position audio/captions (~2.76s drift and CSS leaking between screens in production) | 1 |
59
59
  | Draw a video SCREEN/scene in HTML/CSS, mute visual (app mockup, animated chart, title, loop; HTML→MP4) | CLI `hyperframes` (designer registry; `npx skills add heygen-com/hyperframes`) — mute screens only; assembly with audio goes to Remotion (line above) | 2 |
60
60
  | Word-by-word timestamps for TTS narration (sync captions/cuts/animation with speech) | `wizz-ctc-align` (designer registry; single source of timing, replaces Whisper) | 2 |
61
- | Which short-video STYLE to copy, from the inventory of the material (real person, voice only, B-roll, screens, product), with the recipe measured on 110 real videos (lyric video, kinetic typography and the UI-only app video "ui-morph" included); "a video of my app moving", "edit it in the style of", "the video looks amateur" | `wizz-video-styles` (designer registry; picks the style before voice, timing, effects and assembly) | 2 |
61
+ | Which short-video STYLE to copy, from the inventory of the material (real person, voice only, B-roll, screens, product), with the recipe measured on 110 real videos (reel de música, vídeo de música, lyric video, vídeo com a letra, edição no ritmo da música: music and typography without face or narration → style **tipografia-cinetica**, before any social script; música em alta as backing for a narrated Reel with B-roll keeps the usual pipeline; and the UI-only app video "ui-morph" included); "a video of my app moving", "edit it in the style of", "the video looks amateur" | `wizz-video-styles` (designer registry; picks the style before voice, timing, effects and assembly) | 2 |
62
62
  | Effects and sound of a short vertical video (ad or Reels): which effect goes where and when not, which SFX for each event and at what level, ducking, master loudness, safe-zone/density/excess/rhythm gates | `wizz-video-effects` (designer registry; decides the effects, Remotion assembles them) | 2 |
63
63
  | **Find B-roll / inserts / cutaways / supporting footage** for a video or Reel (real footage of the fact, person, product, news item or screen the script names; YouTube/Instagram/TikTok/Pexels/Pixabay/Commons/NASA) | CLI `get-brolls` (designer registry; **macOS**, global `skills add` + its own `install.sh`; needs ffmpeg with drawtext, Node 22+, Python 3.11+). Ends in a Storyboard the HUMAN approves — the agent never self-approves. Stock only when the user explicitly asks for stock | 1 |
64
64
  | **Edit/cut video** (cuts, selects, roughcut) | CLI `buttercut` (designer registry; **Apple Silicon only**, clone-and-run in the project, heavy deps) | 1 |
@@ -1,26 +1,30 @@
1
1
  ---
2
2
  name: wizz-security-audit-pentest
3
3
  description: >
4
- Adversarial 5-stage security audit with standardized output (markdown table, cutoff ruler,
5
- concrete payload per finding). Use when the request is to audit/pentest an entire app, review security
4
+ Adversarial security audit with standardized output (markdown table, cutoff ruler,
5
+ concrete payload per finding, Devil's Advocate review, and private report outside the audited project in
6
+ SEGURANCA-<data>/). Use when the request is to audit/pentest an entire app, review security
6
7
  before release, "security audit", "pentest", "find vulnerabilities", or run a
7
- full sweep for mass assignment, IDOR/RLS, injection, rate limit/volume abuse, and response leakage.
8
- Different from wizz-web-security/wizz-auth-and-secrets (which fix): this one HUNTS, with exploit proof, and at the end merges
9
- the findings into a prioritized plan ("today's top three"). To fix an isolated flaw, use the
10
- wizz-web-security and wizz-auth-and-secrets skills.
8
+ full sweep for mass assignment, IDOR/RLS, injection, rate limit/volume abuse, response leakage,
9
+ and secrets in working tree or git history. Different from wizz-web-security/wizz-auth-and-secrets
10
+ (which fix): this one HUNTS, challenges findings, and merges them into a prioritized plan
11
+ ("today's top three"). To fix an isolated flaw, invoke the wizz-web-security or
12
+ wizz-auth-and-secrets skill.
11
13
  ---
12
14
 
13
15
  # Security Audit (Adversarial Pentest)
14
16
 
15
- Five independent vulnerability-hunting stages, each with **concrete exploit proof** and a **cutoff ruler** (no real payload, the row doesn't make the cut). At the end, a sixth step merges the five reports into a single prioritized plan.
17
+ Five independent vulnerability-hunting stages, each with **concrete exploit proof** and a **cutoff ruler** (no real payload, the row doesn't make the cut), followed by a sixth **Devil's Advocate** stage that challenges every finding against the repository code, and a seventh **Merge** stage that consolidates the surviving findings into a single prioritized plan saved outside the audited project in `SEGURANCA-<data>/RELATORIO.md`.
16
18
 
17
- Each stage is an agent with a closed prompt in `references/`. Run them in parallel (subagents), one per stage, then the merge step over the five results.
19
+ Each stage is an agent with a closed prompt in `./references/`. Run Stages 1–5 in parallel (subagents), run Stage 6 (Devil's Advocate) over the five tables, and then run Stage 7 (Merge) to produce the final private report.
18
20
 
19
- ## Premise shared by all stages
21
+ ## Premise shared by all hunting stages (Stages 1–5)
20
22
 
21
- Client-side validation doesn't count. The attacker talks directly to the API. Consider only server-side verification. The "How it's exploited" field of every finding must contain the **concrete payload** the attacker would send, not the vulnerability category. "Could be better" and "consider adding" are not findings. Ten real rows beat fifty rows of best practices. No finding that passes the ruler at a stage: answer only `NO FINDINGS AT THIS STAGE`.
23
+ Client-side validation doesn't count. The attacker talks directly to the API. Consider only server-side verification. The "How it's exploited" field of every finding must contain the **concrete payload** or extraction action the attacker would execute, not the vulnerability category. "Could be better" and "consider adding" are not findings. Ten real rows beat fifty rows of best practices. No finding that passes the ruler at a stage: answer only `NO FINDINGS AT THIS STAGE`.
22
24
 
23
- Output format for each stage, markdown table, no text before or after:
25
+ - **Zero secret exposure (ALL stages, including response/log inspection):** Never print, echo, or store raw secret values in terminal output, stage tables, or the final report. Use the marked executable blocks in `./references/stage-5-segredos-historico.md`: metadata-only history (`--format='%h %ad' --name-only`), file-name-only current scan, and root-aware key-file inventory. Commit messages, authors, notes and patches may themselves contain secrets; never dump them. Report only `<file>` / safe `<file>:<line>` or `commit <sha> (<file>)` and a redacted prefix (for example, `sk_live_[REDACTED]`).
26
+
27
+ Output format for each hunting stage (Stages 1–5), markdown table, no text before or after:
24
28
 
25
29
  ```
26
30
  | # | Risk | Where (file:line) | How it's exploited | What prevents it | Severity |
@@ -28,26 +32,46 @@ Output format for each stage, markdown table, no text before or after:
28
32
 
29
33
  Severity: CRITICAL, HIGH, MEDIUM.
30
34
 
31
- ## The 5 stages (run in parallel)
35
+ ## The 7 stages (5 parallel hunters + Devil's Advocate + Merge)
36
+
37
+ | Stage | Role | Hunts for / Executes | Prompt |
38
+ |---|---|------|--------|
39
+ | 1 | Hunter (parallel) | **Input validation** — mass assignment (top priority), SQL/NoSQL/shell injection, unsafe rendering, missing schema / unbounded text | `./references/stage-1-validacao-entrada.md` |
40
+ | 2 | Hunter (parallel) | **Authorization failure** — 3 layers: app (client identity vs. token; ownership in the query), database (RLS, permissive `USING(true)` policy, new table with no policy), machine (webhook with no signature, trusts status/money from the body) | `./references/stage-2-autorizacao.md` |
41
+ | 3 | Hunter (parallel) | **Volume abuse** — rate limiting on auth (per IP **and** per account), cost per call (AI/SMS/email × 10k), extraction via pagination, IP origin behind proxy/CDN | `./references/stage-3-abuso-volume.md` |
42
+ | 4 | Hunter (parallel) | **Response leakage** — technical detail in prod, divergence in auth (message/status/timing), resource existence (404 vs 403), secret in log | `./references/stage-4-vazamento-resposta.md` |
43
+ | 5 | Hunter (parallel) | **Secret hunter (working tree & git history)** — the marked metadata-only history and file-name-only current scan commands across mandatory prefixes (`sk-`, `sk-ant-`, `sk_live_`, `ghp_`, `github_pat_`, `xox[bp]-`, `AKIA`, `AIza`, `eyJhbGciOi`) and tracked `.env`/key files, without ever exposing secret values | `./references/stage-5-segredos-historico.md` |
44
+ | 6 | Challenger (sequential) | **Devil's Advocate (`Advogado do Diabo`)** — challenges every finding from Stages 1–5; assigns verdict `CONFIRMADO` / `DEPENDE DE CONFIGURAÇÃO` / `DERRUBADO`; can only lower severity with concrete in-repo mitigation | `./references/stage-6-advogado-do-diabo.md` |
45
+ | 7 | Consolidator (sequential) | **Merge & private report** — merges `CONFIRMADO` and `DEPENDE DE CONFIGURAÇÃO` findings, deduplicates across stages, sorts by effort÷severity, identifies chains, closes with "today's top three", and writes `SEGURANCA-<data>/RELATORIO.md` outside the audited project, with `SEGURANCA-<data>/.gitignore` (`*`) as defense in depth | `./references/stage-7-fusao-plano.md` |
46
+
47
+ > Stages 1–5 are independent hunting stages. Stage 6 reviews the five hunting tables. Stage 7 merges the verified findings and writes the git-ignored report.
48
+
49
+ ## Devil's Advocate safety rules (Stage 6)
50
+
51
+ 1. **Verdicts:** Every finding from Stages 1–5 receives one verdict: `CONFIRMADO`, `DEPENDE DE CONFIGURAÇÃO`, or `DERRUBADO`.
52
+ 2. **One-way severity ratchet:** Stage 6 may keep the original severity or **lower** it (`CRITICAL` → `HIGH`/`MEDIUM`, `HIGH` → `MEDIUM`) only when concrete in-repository code reduces impact or exploitability. It may **never** raise severity.
53
+ 3. **Absence of configuration never proves a false positive (safe divergence from naive "when in doubt, dismiss"):**
54
+ - Do **not** mark a finding `DERRUBADO` and do **not** lower its severity simply because an external control (live database RLS, WAF/CDN rate limit, proxy header config, prod environment variable, or provider-side key revocation) is absent from the repository or cannot be verified statically.
55
+ - Whenever safety depends on external or runtime configuration not proven in versioned files, classify the finding as `DEPENDE DE CONFIGURAÇÃO` and **preserve its original severity** until verified in the live environment.
56
+ - A finding with a concrete payload/location can only be marked `DERRUBADO` by citing concrete refuting evidence in the repository (`file:line`), or when the hunter row failed the cutoff ruler (vague best-practice advice with no concrete exploit).
57
+
58
+ ## Report isolation outside the audited project (`SEGURANCA-<data>/`)
32
59
 
33
- | Stage | Hunts for | Prompt |
34
- |---|------|--------|
35
- | 1 | **Input validation** — mass assignment (top priority), SQL/NoSQL/shell injection, unsafe rendering, missing schema / unbounded text | `references/stage-1-validacao-entrada.md` |
36
- | 2 | **Authorization failure** — 3 layers: app (client identity vs. token; ownership in the query), database (RLS, permissive `USING(true)` policy, new table with no policy), machine (webhook with no signature, trusts status/money from the body) | `references/stage-2-autorizacao.md` |
37
- | 3 | **Volume abuse** — rate limiting on auth (per IP **and** per account), cost per call (AI/SMS/email × 10k), extraction via pagination, IP origin behind proxy/CDN | `references/stage-3-abuso-volume.md` |
38
- | 4 | **Response leakage** — technical detail in prod, divergence in auth (message/status/timing), resource existence (404 vs 403), secret in log | `references/stage-4-vazamento-resposta.md` |
39
- | 5 | **Merge** — merges the 4 reports: cross-source dedup, sorts by effort÷severity, identifies chains, closes with "today's top three" | `references/stage-5-fusao-plano.md` |
60
+ Security reports contain concrete exploit payloads, vulnerable `file:line` references, and commit hashes of leaked secrets. Follow the marked initialization block in `./references/stage-7-fusao-plano.md` before writing any artifact:
40
61
 
41
- > Stages 1-4 are hunting stages and independent. Stage 5 receives the output of the other four. (The original prompt had the validation stage duplicated; here it's a single one.)
62
+ 1. Select a private parent directory **outside the audited project** and any deploy/zip input. Set `AUDIT_REPORT_PARENT` to that existing absolute directory, then create a fresh `SEGURANCA-<data>/` with exclusive `mkdir`; if it exists, stop and choose another private parent. Never overwrite a prior run.
63
+ 2. Write `SEGURANCA-<data>/.gitignore` containing `*` before any report; this file alone does not exclude reports from deploys, archives or static hosting.
64
+ 3. Write the final merged plan and stage tables to `SEGURANCA-<data>/RELATORIO.md` within the new external directory (all secret values redacted). Deliver its actual absolute path privately.
42
65
 
43
66
  ## How to run it
44
67
 
45
- 1. Fire off stages 1-4 as four parallel subagents, each loading its prompt from `references/`.
46
- 2. Collect the four tables.
47
- 3. Run stage 5 (merge), pasting the four tables where the prompt indicates.
48
- 4. Deliver the merge plan as the result. The per-stage tables stay as an attachment.
68
+ 1. Fire off Stages 1–5 as five parallel subagents, each loading its prompt from `./references/`.
69
+ 2. Collect the five markdown tables.
70
+ 3. Run Stage 6 (Devil's Advocate) using `./references/stage-6-advogado-do-diabo.md` to challenge every finding and assign `CONFIRMADO`, `DEPENDE DE CONFIGURAÇÃO`, or `DERRUBADO`.
71
+ 4. Initialize the fresh private external report directory as prescribed in Stage 7, then run Stage 7 (Merge) using `./references/stage-7-fusao-plano.md` over the Stage 1–5 tables and Stage 6 verdicts, saving the result to `SEGURANCA-<data>/RELATORIO.md`.
72
+ 5. Deliver the merged remediation plan and its private absolute `SEGURANCA-<data>/RELATORIO.md` path. The per-stage tables and Devil's Advocate review stay attached inside the report.
49
73
 
50
74
  ## Relationship to the other security skills
51
75
 
52
- - **This skill HUNTS** (finds + proves). Output = list of findings + plan.
53
- - **`wizz-web-security` and `wizz-auth-and-secrets` FIX** (correct pattern + code example). When closing a finding from this audit, open the matching fix skill cited in the "What prevents it" column.
76
+ - **This skill HUNTS and VERIFIES** (finds + proves + challenges false positives). Output = private external report (`SEGURANCA-<data>/RELATORIO.md`) with verified findings + prioritized plan.
77
+ - **`wizz-web-security` and `wizz-auth-and-secrets` FIX** (correct pattern + code example). When closing a finding from this audit, invoke the matching fix skill cited in the "What prevents it" column: Invoke the `wizz-web-security` skill or Invoke the `wizz-auth-and-secrets` skill.