@brunosps00/dev-workflow 1.0.5 → 1.1.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 (55) hide show
  1. package/README.md +17 -13
  2. package/bin/dev-workflow.js +5 -0
  3. package/lib/constants.js +6 -4
  4. package/lib/install-deps.js +88 -3
  5. package/lib/setup-wsl-browser.js +149 -0
  6. package/package.json +1 -1
  7. package/scaffold/en/agent-instructions.md +7 -5
  8. package/scaffold/en/commands/dw-analyze-project.md +22 -0
  9. package/scaffold/en/commands/dw-autopilot.md +158 -275
  10. package/scaffold/en/commands/dw-bugfix.md +3 -2
  11. package/scaffold/en/commands/dw-functional-doc.md +11 -3
  12. package/scaffold/en/commands/dw-generate-pr.md +2 -2
  13. package/scaffold/en/commands/dw-goal.md +136 -0
  14. package/scaffold/en/commands/dw-help.md +9 -7
  15. package/scaffold/en/commands/dw-plan.md +9 -3
  16. package/scaffold/en/commands/dw-qa.md +1 -1
  17. package/scaffold/en/commands/dw-redesign-ui.md +2 -2
  18. package/scaffold/en/commands/dw-review.md +7 -5
  19. package/scaffold/en/commands/dw-secure-audit.md +72 -15
  20. package/scaffold/en/templates/constitution-template.md +8 -3
  21. package/scaffold/en/templates/functional-doc/playwright.flow.mjs.tpl +17 -0
  22. package/scaffold/pt-br/agent-instructions.md +7 -5
  23. package/scaffold/pt-br/commands/dw-analyze-project.md +22 -0
  24. package/scaffold/pt-br/commands/dw-autopilot.md +161 -278
  25. package/scaffold/pt-br/commands/dw-bugfix.md +3 -2
  26. package/scaffold/pt-br/commands/dw-functional-doc.md +11 -3
  27. package/scaffold/pt-br/commands/dw-generate-pr.md +2 -2
  28. package/scaffold/pt-br/commands/dw-goal.md +136 -0
  29. package/scaffold/pt-br/commands/dw-help.md +9 -7
  30. package/scaffold/pt-br/commands/dw-plan.md +9 -3
  31. package/scaffold/pt-br/commands/dw-qa.md +1 -1
  32. package/scaffold/pt-br/commands/dw-redesign-ui.md +2 -2
  33. package/scaffold/pt-br/commands/dw-review.md +7 -5
  34. package/scaffold/pt-br/commands/dw-secure-audit.md +72 -15
  35. package/scaffold/pt-br/templates/constitution-template.md +8 -3
  36. package/scaffold/pt-br/templates/functional-doc/playwright.flow.mjs.tpl +17 -0
  37. package/scaffold/scripts/cdp-relay/Cargo.toml +16 -0
  38. package/scaffold/scripts/cdp-relay/src/main.rs +49 -0
  39. package/scaffold/scripts/functional-doc/generate-dossier.mjs +7 -9
  40. package/scaffold/scripts/functional-doc/run-playwright-flow.mjs +192 -183
  41. package/scaffold/scripts/lib/capture-screenshots.mjs +133 -0
  42. package/scaffold/scripts/lib/resolve-browser.mjs +405 -0
  43. package/scaffold/scripts/lib/ui-slop-detect.mjs +102 -0
  44. package/scaffold/skills/dw-testing-discipline/references/playwright-recipes.md +50 -0
  45. package/scaffold/skills/dw-ui-discipline/SKILL.md +5 -0
  46. package/scaffold/skills/dw-ui-discipline/references/color-oklch.md +60 -0
  47. package/scaffold/skills/dw-ui-discipline/references/motion.md +52 -0
  48. package/scaffold/skills/dw-ui-discipline/references/responsive.md +52 -0
  49. package/scaffold/skills/dw-ui-discipline/references/type-scale.md +48 -0
  50. package/scaffold/skills/dw-ui-discipline/references/ux-writing.md +52 -0
  51. package/scaffold/skills/security-review/SKILL.md +19 -0
  52. package/scaffold/skills/security-review/references/sast.md +67 -0
  53. package/scaffold/skills/security-review/references/secrets.md +46 -0
  54. package/scaffold/en/templates/functional-doc/playwright.spec.ts.tpl +0 -19
  55. package/scaffold/pt-br/templates/functional-doc/playwright.spec.ts.tpl +0 -19
@@ -15,11 +15,11 @@
15
15
  |-------|---------|
16
16
  | `dw-verify` | **SEMPRE** — invocada antes do `git push`. Sem VERIFICATION REPORT PASS na sessão após a última edição de código, o PR **NÃO** pode ser criado. |
17
17
  | `dw-git-discipline` | **SEMPRE** — valida naming de branch (`<tipo>/<escopo>` kebab-case), histórico atomic-commit (cada commit single-intent, mensagem conventional), tempo de vida da branch (flag se >7 dias) e escopo da PR (sugere split se diff > ~400 linhas). Descrição da PR segue summary + test plan, não dump de `git log`. |
18
- | `/dw-secure-audit` | **SEMPRE para projetos TS/Python/C#/Rust** — `security-check.md` com status ≠ REJECTED é obrigatório para projetos em linguagem suportada. |
18
+ | `/dw-secure-audit` | **SEMPRE para projetos TS/Python/C#/Rust** — um `.dw/secure-audit/audit-summary.md` fresco com status ≠ REJECTED é obrigatório para projetos em linguagem suportada. |
19
19
 
20
20
  <critical>Hard gate 1 (verify): se a sessão atual não tem um VERIFICATION REPORT PASS de `dw-verify` produzido APÓS a última edição/commit, PARAR e invocar `dw-verify` antes de prosseguir. PR é um artefato permanente — exige o maior rigor de verificação.</critical>
21
21
 
22
- <critical>Hard gate 2 (security): para projetos TS/Python/C#/Rust, se `{{PRD_PATH}}/security-check.md` não existir OU tiver status REJECTED, PARAR e invocar `/dw-secure-audit` antes de prosseguir. Vulnerabilidades HIGH/CRITICAL NÃO podem chegar ao PR. Para outras linguagens (Go, Java, etc.), este gate é pulado com nota.</critical>
22
+ <critical>Hard gate 2 (security): para projetos TS/Python/C#/Rust, se `.dw/secure-audit/audit-summary.md` não existir, estiver desatualizado (anterior à última edição) OU tiver status REJECTED, PARAR e invocar `/dw-secure-audit` antes de prosseguir. Findings SECRET e vulnerabilidades HIGH/CRITICAL NÃO podem chegar ao PR. Para outras linguagens (Go, Java, etc.), este gate é pulado com nota.</critical>
23
23
 
24
24
  ## Uso
25
25
 
@@ -0,0 +1,136 @@
1
+ <system_instructions>
2
+ Voce e o orquestrador de objetivos duraveis do dev-workflow. Este comando entrega a todos os agentes suportados um contrato estilo Codex `/goal`: um objetivo, checkpoints explicitos, comandos formais, estado persistido e condicao de parada verificavel.
3
+
4
+ ## Quando Usar
5
+ - Use quando um fluxo e maior que um turno normal, mas tem fim claro.
6
+ - Use depois de `/dw-plan` quando implementacao, review, QA e review pos-QA devem rodar como um loop duravel.
7
+ - Use a partir do `/dw-autopilot` depois que a primeira invocacao completou PRD → TechSpec → Tasks.
8
+ - NAO use para backlog solto, listas de tarefas sem relacao ou brainstorming exploratorio.
9
+
10
+ ## Posicao no Pipeline
11
+ **Antecessor:** `/dw-plan` ou fase de plan do `/dw-autopilot` | **Sucessor:** `/dw-commit` + `/dw-generate-pr`
12
+
13
+ ## Modos
14
+
15
+ | Invocacao | Comportamento |
16
+ |-----------|---------------|
17
+ | `/dw-goal "<objetivo>"` | Cria e executa um objetivo duravel manual. |
18
+ | `/dw-goal --from-autopilot <prd-slug>` | Cria e executa o goal padrao de execucao/qualidade do autopilot para um PRD existente. |
19
+ | `/dw-goal status` | Mostra goal ativo, checkpoint, ultima verificacao e bloqueios. |
20
+ | `/dw-goal pause` | Marca o goal ativo como pausado sem apagar estado. |
21
+ | `/dw-goal resume` | Retoma o goal pausado ou interrompido a partir de `status.json`. |
22
+ | `/dw-goal clear` | Limpa o goal ativo apenas depois de completo, cancelado ou explicitamente substituido. |
23
+
24
+ ## Ponte Nativa com Codex
25
+
26
+ <critical>`/dw-goal` e portavel. O estado canonico vive em `.dw/goals/` mesmo quando o `/goal` nativo do Codex estiver disponivel.</critical>
27
+
28
+ A documentacao oficial do Codex trata `/goal` como recurso experimental para objetivo duravel em trabalho longo com condicao de parada verificavel. No Codex CLI ele requer `features.goals`; pode ser definido com `/goal <objective>`, inspecionado com `/goal`, e controlado com `/goal pause`, `/goal resume` ou `/goal clear`.
29
+
30
+ Quando rodar em Codex:
31
+ - Se existir ferramenta nativa de goal, crie/atualize o goal com um objetivo curto apontando para `.dw/goals/<slug>/goal.md`.
32
+ - Se o slash command interativo `/goal` estiver disponivel e `features.goals` estiver habilitado, use `/goal <objective>` com objetivo abaixo de 4.000 caracteres.
33
+ - Se goals nativos estiverem indisponiveis, continue com o loop portavel em `.dw/goals/`. Nao bloqueie.
34
+
35
+ Formato do objetivo nativo no Codex:
36
+
37
+ ```text
38
+ Execute o objetivo duravel definido em .dw/goals/<goal-slug>/goal.md ate que sua condicao de parada verificavel seja atingida. Atualize .dw/goals/<goal-slug>/progress.md depois de cada checkpoint.
39
+ ```
40
+
41
+ ## Estado Persistente
42
+
43
+ Crie `.dw/goals/<goal-slug>/` com:
44
+
45
+ ```
46
+ .dw/goals/<goal-slug>/
47
+ ├── goal.md
48
+ ├── status.json
49
+ └── progress.md
50
+ ```
51
+
52
+ `goal.md` DEVE incluir:
53
+ - Um objetivo.
54
+ - Dentro de escopo / fora de escopo.
55
+ - Artefatos de entrada a ler primeiro.
56
+ - Checkpoints em ordem.
57
+ - Comandos formais `/dw-*` a invocar.
58
+ - Artefatos obrigatorios por checkpoint.
59
+ - Condicao de parada verificavel.
60
+ - Condicoes de bloqueio.
61
+ - Politica de retomada.
62
+
63
+ `status.json` DEVE usar este formato:
64
+
65
+ ```json
66
+ {
67
+ "schema_version": "1.0",
68
+ "slug": "goal-prd-example",
69
+ "source": "manual",
70
+ "prd_path": null,
71
+ "status": "active",
72
+ "current_checkpoint": "start",
73
+ "completed_checkpoints": [],
74
+ "required_artifacts": [],
75
+ "last_verification": null,
76
+ "created_at": "2026-05-20T00:00:00Z",
77
+ "updated_at": "2026-05-20T00:00:00Z"
78
+ }
79
+ ```
80
+
81
+ `progress.md` e append-only. Cada entrada registra checkpoint, comando invocado, resultado, artefatos verificados, bloqueios e proximo checkpoint.
82
+
83
+ ## Goal do Autopilot
84
+
85
+ Quando invocado como `/dw-goal --from-autopilot <prd-slug>`:
86
+
87
+ 1. Resolva `<prd-slug>` para `.dw/spec/<prd-slug>/`.
88
+ 2. Verifique que `prd.md`, `techspec.md`, `tasks.md`, arquivos per-task e `tasks-validation.md` existem.
89
+ 3. Crie o slug `autopilot-<prd-slug>`.
90
+ 4. Escreva `goal.md` com este objetivo:
91
+
92
+ ```text
93
+ Completar implementacao e validacao de qualidade para .dw/spec/<prd-slug> sem parar ate run, review completo, QA/fix e review completo pos-QA estarem formalmente completos e verificados.
94
+ ```
95
+
96
+ Checkpoints:
97
+
98
+ | Checkpoint | Comando formal | Evidencia de conclusao |
99
+ |------------|----------------|------------------------|
100
+ | `run` | `/dw-run <prd-path>` | Tasks done, commits de task presentes, run log ou status de tasks atualizado. |
101
+ | `review-before-qa` | `/dw-review <prd-path>` | `<prd-path>/QA/review-consolidated.md` existe e veredicto geral esta aprovado ou aprovado com ressalvas explicitamente nao-bloqueantes. |
102
+ | `qa` | `/dw-qa <prd-path>` | Artefatos obrigatorios de QA existem. |
103
+ | `qa-fix` | `/dw-qa --fix <prd-path>` quando `bugs.md` tem bugs Open | Bugs estao Fixed/Closed ou explicitamente deferidos pelo usuario. |
104
+ | `review-after-qa` | `/dw-review <prd-path>` | Review consolidado existe apos fixes de QA e esta aprovado ou aprovado com ressalvas explicitamente nao-bloqueantes. |
105
+
106
+ O goal so esta completo quando:
107
+ - Todos os checkpoints acima estao completos ou explicitamente pulados com motivo documentado.
108
+ - Nenhum bug Open de QA permanece, exceto se o usuario aceitou deferir explicitamente.
109
+ - O `/dw-review` final rodou depois do ultimo fix de QA.
110
+ - `status.json` tem `"status": "complete"`.
111
+
112
+ ## Regras de Execucao
113
+
114
+ <critical>Cada checkpoint que invoca um comando `/dw-*` DEVE invocar o comando formal e seguir as instrucoes completas de `.dw/commands/`. Equivalentes manuais nao contam.</critical>
115
+
116
+ - Antes de cada checkpoint, anexe uma entrada em `progress.md` e atualize `status.json.current_checkpoint`.
117
+ - Depois de cada checkpoint, verifique artefatos obrigatorios com `ls` ou inspecao equivalente antes de marcar como completo.
118
+ - Se um comando falhar, corrija conforme o loop proprio daquele comando e re-execute.
119
+ - Se o mesmo bloqueio repetir por 3 turnos consecutivos de goal e nenhum progresso significativo for possivel, marque `status: "blocked"` e apresente o bloqueio.
120
+ - Mantenha updates compactos: checkpoint atual, resultado de verificacao, checkpoints restantes, bloqueio se houver.
121
+
122
+ ## Comandos de Status
123
+
124
+ - `status`: leia `status.json` e as ultimas 10 entradas de `progress.md`; reporte checkpoint atual, completos, ultima verificacao e bloqueios.
125
+ - `pause`: defina `status: "paused"` e anexe o motivo.
126
+ - `resume`: defina `status: "active"` e continue de `current_checkpoint`; nao repita checkpoints completos salvo se artefatos estiverem faltando.
127
+ - `clear`: se completo/cancelado/substituido, marque `status: "cancelled"` ou arquive conforme convencao do projeto. Nao delete evidencias por padrao.
128
+
129
+ ## Anti-patterns
130
+
131
+ - Nao crie goal com varios objetivos sem relacao.
132
+ - Nao use `/dw-goal` para burlar `/dw-plan`; goals executam um plano definido, nao inventam escopo.
133
+ - Nao marque checkpoint completo sem verificar artefatos.
134
+ - Nao use `/goal` nativo do Codex como unico estado; `.dw/goals/` permanece o contrato cross-agent.
135
+
136
+ </system_instructions>
@@ -17,7 +17,7 @@ Use `/dw-autopilot "desejo"` como gateway pra maior parte do trabalho. Comandos
17
17
 
18
18
  | Comando | Quando |
19
19
  |---------|--------|
20
- | `/dw-autopilot "desejo"` | Entry point padrão. PRD → TechSpec → Tasks → Run → QA → Review → Commit → PR. Três gates de aprovação. |
20
+ | `/dw-autopilot "desejo"` | Entry point padrão em duas invocações. Primeira roda plan e para; segunda retoma via `/dw-goal`, commit e PR. |
21
21
  | `/dw-bugfix "descrição"` | Bug ou error report. Fix cirúrgico ou rota pra PRD. |
22
22
  | `/dw-help [palavra-chave]` | Esta tela. Passe palavra-chave pra atalhos. `--advanced` revela comandos internos. |
23
23
 
@@ -48,15 +48,15 @@ Use `/dw-autopilot "desejo"` como gateway pra maior parte do trabalho. Comandos
48
48
 
49
49
  ## Workflow em resumo
50
50
 
51
- `/dw-autopilot "desejo"` roda o pipeline completo (PRD → ... → PR) com 3 gates. Passo a passo:
51
+ `/dw-autopilot "desejo"` roda planejamento primeiro e para. Reinvoque para retomar via `/dw-goal`, commit e PR. Passo a passo:
52
52
 
53
53
  ```
54
- /dw-brainstorm → /dw-plan → /dw-run → /dw-qa → /dw-review → /dw-commit → /dw-generate-pr
54
+ /dw-brainstorm → /dw-plan → /dw-goal → /dw-commit → /dw-generate-pr
55
55
  ```
56
56
 
57
57
  ## Comandos avançados / internos
58
58
 
59
- Passe `--advanced` pra ver internos (`dw-adr`, `dw-intel`, `dw-secure-audit`, `dw-find-skills`, `dw-update`, `dw-subtask-start`, `dw-subtask-complete`, `dw-subtask-resume`) — usualmente invocados por outros comandos.
59
+ Passe `--advanced` pra ver internos (`dw-adr`, `dw-intel`, `dw-secure-audit`, `dw-goal`, `dw-find-skills`, `dw-update`, `dw-subtask-start`, `dw-subtask-complete`, `dw-subtask-resume`) — usualmente invocados por outros comandos.
60
60
  ```
61
61
 
62
62
  ## Modo advanced — flag `--advanced`
@@ -68,13 +68,14 @@ ALSO show:
68
68
 
69
69
  Auto-invocados por comandos primários mas disponíveis standalone.
70
70
 
71
- ## Tier 4 — Hidden (8)
71
+ ## Tier 4 — Hidden (9)
72
72
 
73
73
  | Comando | O que | Invocado por |
74
74
  |---------|-------|--------------|
75
75
  | `/dw-adr "decisão"` | Registra um ADR em `.dw/spec/<prd>/adrs/`. | `/dw-plan techspec --council`, desvios de constitution |
76
76
  | `/dw-intel "pergunta"` | Query de codebase intel; `--build` (re)indexa `.dw/intel/`. | `/dw-plan`, `/dw-review`, `/dw-bugfix` |
77
77
  | `/dw-secure-audit` | OWASP + Trivy + lockfile + supply-chain scan. Hard gate. Flags: `--scan-only`, `--plan`, `--execute`. | `/dw-review`, `/dw-generate-pr` |
78
+ | `/dw-goal "<objetivo>"` | Contrato de objetivo duravel com `.dw/goals/`; faz ponte com `/goal` nativo do Codex quando disponivel. | `/dw-autopilot` apos planejamento |
78
79
  | `/dw-find-skills "query"` | Busca npx skills ecosystem, valida, instala. | manual ao estender bundle |
79
80
  | `/dw-update` | Atualiza dev-workflow pro último release npm com snapshot rollback. | manutenção manual |
80
81
  | `/dw-subtask-start "goal"` | Cria um input packet minimo para subagente. | parent antes de delegar |
@@ -89,6 +90,7 @@ Auto-invocados por comandos primários mas disponíveis standalone.
89
90
  | `prd`, `spec`, `plan`, `arquitetura`, `techspec`, `tasks` | `/dw-plan` (stage apropriado) |
90
91
  | `bug`, `erro`, `quebrado`, `fix` | `/dw-bugfix` |
91
92
  | `run`, `executa`, `implementa` | `/dw-run` |
93
+ | `goal`, `objetivo`, `long-running`, `retomar autopilot` | `/dw-goal` ou `/dw-autopilot` se `autopilot-state.json` existir |
92
94
  | `review`, `qualidade`, `audit code` | `/dw-review` |
93
95
  | `qa`, `test plan`, `e2e` | `/dw-qa` |
94
96
  | `commit`, `git` | `/dw-commit` |
@@ -117,10 +119,10 @@ Sem match: surface padrão + nota.
117
119
  ## FAQ
118
120
 
119
121
  **P: Onde começo com uma nova feature?**
120
- - `/dw-autopilot "o que voce quer"`. Roda PRD → ... → PR com três gates.
122
+ - `/dw-autopilot "o que voce quer"`. Primeira invocacao roda PRD → TechSpec → Tasks e para; segunda invocacao retoma via `/dw-goal`, commit e PR.
121
123
 
122
124
  **P: Tenho que usar `/dw-autopilot`?**
123
- - Não. Pipeline granular dá controle a cada step.
125
+ - Não. Pipeline granular dá controle a cada step, com `/dw-goal` quando quiser executar run/review/QA/review como objetivo duravel.
124
126
 
125
127
  **P: Só quero corrigir um bug.**
126
128
  - `/dw-bugfix "<descrição>"`. Tria, 3 perguntas, fixa ou roteia.
@@ -50,6 +50,12 @@ Quando agentes do projeto estiverem instalados, use:
50
50
 
51
51
  Claude Code e OpenCode podem usar agentes nativos. Codex e Copilot usam `.agents/agents/` mais estas instrucoes como fallback.
52
52
 
53
+ ## Ferramenta de Entrevista Estruturada
54
+
55
+ <critical>Quando uma ferramenta estruturada de entrevista/input do usuario estiver disponivel, `/dw-plan` DEVE usa-la para as perguntas de clarificacao de PRD e TechSpec. Nao rebaixe para chat comum por conveniencia. Se nenhuma ferramenta desse tipo existir no runtime, faca as mesmas perguntas no chat e registre explicitamente: `Ferramenta de entrevista estruturada indisponivel; usando fallback em chat.`</critical>
56
+
57
+ A ferramenta e obrigatoria no planejamento porque preserva escolhas explicitas do usuario e impede o agent de responder as proprias perguntas. Cada estagio mantem sua propria cota: PRD exige 7+ perguntas de produto; TechSpec exige 7+ perguntas tecnicas.
58
+
53
59
  ## Constitution Gate
54
60
 
55
61
  <critical>ANTES de qualquer estágio, cheque `.dw/constitution.md`. Se AUSENTE, copie `templates/constitution-template.md` para `.dw/constitution.md` (defaults severity=info), avise usuário no chat, e SIGA. Se PRESENTE, todo FR (PRD), toda decisão arquitetural (TechSpec) e toda task (Tasks) carrega metadata Constitution Alignment mapeando para princípios relevantes ou declarando desvio.</critical>
@@ -73,7 +79,7 @@ Roda em modo padrão OU `plan prd`.
73
79
 
74
80
  ### Comportamento obrigatório
75
81
 
76
- 1. **Perguntas de clarificação (MÍNIMO 7).** Antes de escrever qualquer coisa, faça 7+ perguntas cobrindo: objetivos, usuários-alvo, limites de escopo, métricas de sucesso, estratégia de rollout, pontos de integração, edge cases.
82
+ 1. **Perguntas de clarificação (MÍNIMO 7).** Antes de escrever qualquer coisa, use a ferramenta de entrevista estruturada quando disponivel para fazer 7+ perguntas cobrindo: objetivos, usuários-alvo, limites de escopo, métricas de sucesso, estratégia de rollout, pontos de integração, edge cases. Se a ferramenta estiver indisponivel, use fallback em chat e registre o fallback.
77
83
  2. **Web search MÍNIMO 3 queries** para padrões de mercado, contexto regulatório, abordagens de competidores quando relevante.
78
84
  3. **Constitution alignment.** Cada requisito funcional (FR-N.M) inclui linha `Constitution Alignment: respects P-NNN, P-MMM` OU `no applicable principle: <motivo>`.
79
85
  4. **Awareness multi-projeto.** Se feature cruza projetos do workspace, consulte `.dw/rules/integrations.md` e documente escopo na seção "Projetos Impactados".
@@ -97,7 +103,7 @@ Roda em modo padrão (após aprovação do PRD) OU `plan techspec` OU `plan --fr
97
103
  ### Comportamento obrigatório
98
104
 
99
105
  1. **Hard gate: open questions do PRD.** Se `.dw/spec/prd-<feature>/prd.md` tem seção "Open Questions" com itens não resolvidos, PARE e peça pra usuário resolver primeiro.
100
- 2. **Perguntas de clarificação (MÍNIMO 7).** Perguntas técnicas cobrindo: domain placement, data flow, dependências, core interfaces, estratégia de testes, reuse-vs-build, integração multi-projeto se aplicável.
106
+ 2. **Perguntas de clarificação (MÍNIMO 7).** Use a ferramenta de entrevista estruturada quando disponivel para fazer perguntas tecnicas cobrindo: domain placement, data flow, dependências, core interfaces, estratégia de testes, reuse-vs-build, integração multi-projeto se aplicável. Se a ferramenta estiver indisponivel, use fallback em chat e registre o fallback.
101
107
  3. **Web search MÍNIMO 3 queries** + Context7 MCP para framework/library specifics.
102
108
  4. **Source grounding (`dw-source-grounding`).** Toda decisão de framework/library carrega `[source: <url>, version: X.Y, retrieved: YYYY-MM-DD]`.
103
109
  5. **Constitution gate.** Cada decisão arquitetural lista `Respects: P-NNN` ou `Deviates: P-NNN — justification: <slug ADR ou racional>`. Desvios de princípios `severity: high/critical` sem ADR → PARE.
@@ -178,7 +184,7 @@ Após plan completo, o diretório do PRD contém:
178
184
 
179
185
  ## Diretrizes finais
180
186
 
181
- - Cada estágio tem sua própria cota de perguntas de clarificação — não recicle. Estágios diferentes precisam de framing diferente.
187
+ - Cada estágio tem sua própria cota de perguntas de clarificação — não recicle. Estágios diferentes precisam de framing diferente. Use a ferramenta de entrevista estruturada sempre que disponivel.
182
188
  - Web search é obrigatório; Context7 MCP para libraries. Sem pular pra "acho que sei a versão mais recente."
183
189
  - Constitution gate roda na entrada de cada estágio; defaults são auto-instalados quando ausente (nunca bloqueia).
184
190
  - Os três estágios produzem Markdown commitado — esses são os artefatos canônicos de planejamento. Eles evoluem com a feature.
@@ -83,7 +83,7 @@ Quando disponíveis em `./.agents/skills/`, invocadas operacionalmente:
83
83
 
84
84
  1. **Pre-flight**: confirmar que dev server do projeto pode rodar. Confirmar `.dw/spec/<prd>/` tem PRD + TechSpec + tasks.
85
85
  2. **Mapear FRs para test plan**: pra cada FR, identificar fluxo user-facing que exercita.
86
- 3. **Dirigir Playwright MCP** (ou fallback pra Playwright local per `dw-testing-discipline/references/playwright-recipes.md`):
86
+ 3. **Dirigir Playwright MCP** (se indisponível ou bloqueado — comum no WSL — use o fallback local resiliente `node .dw/scripts/lib/capture-screenshots.mjs`, que escolhe o browser via `.dw/scripts/lib/resolve-browser.mjs`; veja a seção "Browser on WSL" de `dw-testing-discipline/references/playwright-recipes.md`):
87
87
  - Happy paths pra cada FR.
88
88
  - Edge cases (boundary inputs, falha de rede, erros de validação).
89
89
  - Fluxos negativos (ações não autorizadas, input malformado).
@@ -56,12 +56,12 @@ Utilize ferramentas de diagnóstico conforme o framework do projeto:
56
56
  ## Comportamento Obrigatório
57
57
 
58
58
  1. Identifique o alvo: página, componente ou rota que será redesenhada.
59
- 2. **AUDITAR**: leia a implementação atual, identifique stack CSS (Tailwind, CSS Modules, styled-components, etc.), capture screenshot usando `dw-testing-discipline`/playwright-recipes se disponível, rode react-doctor se projeto React.
59
+ 2. **AUDITAR**: leia a implementação atual, identifique stack CSS (Tailwind, CSS Modules, styled-components, etc.), capture o screenshot do estado-antes (Playwright MCP, ou `node .dw/scripts/lib/capture-screenshots.mjs` como fallback resiliente no WSL), rode react-doctor se projeto React.
60
60
  3. Faça 3 a 5 perguntas sobre objetivos do redesign: direção de estilo, constraints de marca, inspirações, público-alvo, dispositivos prioritários.
61
61
  4. **PROPOR**: apresente 2 a 3 direções de design depois de passar pelo hard-gate de `dw-ui-discipline` (brand authorities ou curated defaults; surface job sentence; state matrix enumerada; scene sentence). Cada direção lista paleta de cores, par tipográfico, estilo de layout e racional. Self-check de cada direção contra os 14 anti-slop patterns. Para CADA direção, descreva explicitamente o layout mobile (<=768px) e o layout desktop (>=1024px), incluindo como os elementos se reorganizam, empilham ou escondem entre breakpoints.
62
62
  5. Espere aprovação explícita do usuário antes de implementar.
63
63
  6. **IMPLEMENTAR**: aplique o design escolhido com abordagem mobile-first — implemente primeiro o layout mobile e depois adicione media queries/breakpoints para tablet e desktop. Respeite a stack existente. Use `vercel-react-best-practices` para React/Next.js. Mantenha a metodologia CSS do projeto.
64
- 7. **VALIDAR**: capture estado depois em AMBAS as resoluções (mobile e desktop), compare antes/depois, verifique acessibilidade contra `dw-ui-discipline/references/accessibility-floor.md` (WCAG 2.2 AA — não-negociável: contraste, focus-visible, keyboard nav, ARIA, sem traps), rode react-doctor `--diff` se React. Use `dw-testing-discipline/references/playwright-recipes.md` para capturar screenshots em viewport 375px (mobile) e 1440px (desktop).
64
+ 7. **VALIDAR**: capture estado depois em AMBAS as resoluções (mobile e desktop), compare antes/depois, verifique acessibilidade contra `dw-ui-discipline/references/accessibility-floor.md` (WCAG 2.2 AA — não-negociável: contraste, focus-visible, keyboard nav, ARIA, sem traps), rode react-doctor `--diff` se React. Capture screenshots em 375px (mobile) e 1440px (desktop) — `node .dw/scripts/lib/capture-screenshots.mjs --url <url> --widths 375,1440` é o caminho resiliente no WSL; veja a seção "Browser on WSL" de `dw-testing-discipline/references/playwright-recipes.md`.
65
65
  8. **PERSISTIR CONTRATO**: se o usuário aprovou uma direção, gere `design-contract.md` no diretório do PRD (`.dw/spec/prd-[nome]/design-contract.md`) com: direção aprovada, paleta de cores, par tipográfico, regras de layout, regras de acessibilidade e regras de componentes. Este contrato será lido por `dw-run-task` e `dw-run-plan` para garantir consistência visual.
66
66
 
67
67
  ## Inteligência do Codebase
@@ -44,9 +44,10 @@ Quando disponíveis em `./.agents/skills/`, são invocadas como apoio analítico
44
44
 
45
45
  - `dw-review-rigor`: **SEMPRE** — aplica de-duplication (mesmo pattern em N arquivos = 1 finding), severity ordering (critical → high → medium → low), verify-before-flag, skip-what-linter-catches, signal-over-volume. A tabela "Problemas Encontrados" segue essa disciplina.
46
46
  - `dw-verify`: **SEMPRE** — invocada antes de emitir `APROVADO` ou `APROVADO COM RESSALVAS`. Sem VERIFICATION REPORT PASS (test + lint + build), verdict não pode ser APROVADO.
47
- - `dw-secure-audit`: **SEMPRE para projetos TS/Python/C#/Rust** — security gate. Se projeto usa linguagem suportada e `secure-audit.md` recente está ausente OU REJECTED, verdict é **REPROVADO** — sem exceção.
47
+ - `dw-secure-audit` (**Security Gate**): **SEMPRE para projetos TS/Python/C#/Rust** — acionado aqui e o verdict é enforced. Se a linguagem é suportada e `.dw/secure-audit/audit-summary.md` fresco está ausente OU REPROVADO, o verdict do review é **REPROVADO** — sem exceção. O mesmo gate também é comando standalone (`/dw-secure-audit`) e fase explícita no `/dw-autopilot`. Agora soma Semgrep SAST (diff) + gitleaks secrets sobre OWASP/Trivy/SCA.
48
+ - `security-review`: a skill OWASP nível-diff que o gate usa (injection, authz, secrets, SSRF, crypto — só HIGH CONFIDENCE).
48
49
  - `dw-simplification`: use quando diff toca código denso — aplica Chesterton's Fence, protocolo de refactor preservando comportamento, métricas de complexidade.
49
- - `dw-ui-discipline`: use quando diff toca UI — roda os 14 visual-slop patterns + accessibility floor.
50
+ - `dw-ui-discipline`: use quando diff toca UI — roda os 14 visual-slop patterns + accessibility floor. Para um gate determinístico, rode também `node .dw/scripts/lib/ui-slop-detect.mjs <paths-ui-alterados> --fail-on error` (wrapper sobre o detector do impeccable); trate findings bloqueantes como **REJECTED** e reporte os warnings.
50
51
  - `dw-testing-discipline`: use quando diff toca testes — aplica catálogo de 25 anti-patterns + 6 agent guardrails (quando testes foram agent-authored).
51
52
  - `dw-llm-eval`: **OBRIGATÓRIO quando diff toca código de feature AI/LLM**. Reference dataset + ≥2 oracle rungs + judge calibration (se rung 4 usado) + eval run results DEVEM estar no PR. Faltando → REPROVADO.
52
53
  - `security-review`: use quando diff toca auth, autorização, input externo, upload, SQL, secrets, SSRF, XSS ou superfícies sensíveis.
@@ -161,9 +162,10 @@ Se FALTANDO > 0, o veredicto sugere revisitar `/dw-plan tasks` pra escopar ou `/
161
162
  - Rodar dw-verify pra produzir VERIFICATION REPORT (test + lint + build GREEN).
162
163
  - Sem PASS, verdict não pode ser APROVADO.
163
164
 
164
- 8. **Security Layer (`dw-secure-audit` para TS/Python/C#/Rust):**
165
- - Rodar `/dw-secure-audit` contra o PR. Scan mais recente deve estar presente e não REPROVADO.
166
- - Se linguagem suportada e audit faltando OU REPROVADO → verdict **REPROVADO**.
165
+ 8. **Security Gate (`dw-secure-audit` para TS/Python/C#/Rust):**
166
+ - Acione `/dw-secure-audit` contra o diff (OWASP + Semgrep SAST + gitleaks + Trivy/SCA + supply-chain). Ele produz/atualiza `.dw/secure-audit/audit-summary.md`.
167
+ - Scan mais recente deve estar presente, fresco (pós-última-edição) e não REPROVADO. Se linguagem suportada e audit ausente OU REPROVADO → verdict do review **REPROVADO**. Findings SECRET sempre bloqueiam (sem escape de ADR).
168
+ - O mesmo gate também roda standalone (`/dw-secure-audit`) e é fase explícita no `/dw-autopilot`; `/dw-generate-pr` re-enforça o verdict antes do PR.
167
169
 
168
170
  ### Output
169
171
 
@@ -1,7 +1,13 @@
1
1
  <system_instructions>
2
- Você é o orquestrador de security audit. Roda OWASP static review + supply-chain CVE/secret/IaC scanning + outdated check + supply-chain compromise detection em uma passada. Hard-gates comandos downstream quando há findings CRITICAL ou HIGH.
2
+ Você é o orquestrador de security audit — o **Security Gate**. Roda OWASP static review + SAST (Semgrep,
3
+ focado no diff do código gerado) + secret scan dedicado (gitleaks) + supply-chain CVE/secret/IaC (Trivy +
4
+ native lockfile audit) + supply-chain compromise detection + outdated check, em uma passada. Hard-gates
5
+ comandos downstream quando há qualquer finding bloqueante.
3
6
 
4
- Auto-invocado por `/dw-review` e `/dw-generate-pr` em projetos TS/Python/C#/Rust. Invocação standalone disponível pra audit manual.
7
+ É **auto-invocado por `/dw-review` e `/dw-generate-pr`** (em TS/Python/C#/Rust), roda como **fase explícita e
8
+ nomeada no `/dw-autopilot`** (após review + QA, antes de commit/PR), e é **executável standalone** a qualquer
9
+ momento. O `/dw-generate-pr` re-enforça o verdict como hard gate final. Os três continuam gating em segurança
10
+ — o comando standalone e a fase nomeada são aditivos, não substituem.
5
11
 
6
12
  ## Quando Usar
7
13
  - Auto-invocado: `/dw-review` e `/dw-generate-pr` em linguagens suportadas.
@@ -10,7 +16,7 @@ Auto-invocado por `/dw-review` e `/dw-generate-pr` em projetos TS/Python/C#/Rust
10
16
  - NÃO use como substituto pra review humano em código auth/payment de alto risco (use skill `security-review` JUNTO com este).
11
17
 
12
18
  ## Posição no Pipeline
13
- **Antecessor:** qualquer momento; auto-invocado por `/dw-review`, `/dw-generate-pr` | **Sucessor:** `/dw-bugfix` pra atacar findings, ou `/dw-commit` se APROVADO
19
+ **Antecessor:** `/dw-review` + `/dw-qa` (o Security Gate roda depois deles passarem) | **Sucessor:** `/dw-commit` / `/dw-generate-pr` se APROVADO, ou `/dw-bugfix` pra atacar findings. Também roda standalone a qualquer momento.
14
20
 
15
21
  ## Modos
16
22
 
@@ -33,10 +39,20 @@ Auto-invocado por `/dw-review` e `/dw-generate-pr` em projetos TS/Python/C#/Rust
33
39
 
34
40
  ## Dependências Necessárias
35
41
 
36
- - **Trivy** — deve estar instalado (via `npx @brunosps00/dev-workflow install-deps`).
42
+ - **Trivy** — SCA / secrets / IaC (via `npx @brunosps00/dev-workflow install-deps`).
43
+ - **Semgrep** — camada SAST (opcional mas recomendado). Se ausente, a camada SAST é pulada e anotada.
44
+ - **gitleaks** — secret scan dedicado (opcional mas recomendado). Se ausente, cai pro Trivy secrets.
37
45
  - **Context7 MCP** — pra best practices específicas de versão.
38
46
 
39
- ## Três Camadas de Detecção
47
+ Todos os scanners são opcionais individualmente: uma tool ausente degrada aquela camada e é **reportada**
48
+ no summary (o gate nunca quebra por falta de scanner), mas a cobertura faltante fica visível. Instale via
49
+ `npx @brunosps00/dev-workflow install-deps`.
50
+
51
+ ## Camadas de Detecção
52
+
53
+ **Foco no diff (código gerado):** camadas que suportam isso focam no diff contra a base do PR
54
+ (`git merge-base HEAD origin/main`), concentrando o gate no código recém-escrito, sem ruído do código
55
+ pré-existente. Um pass periódico `--full` varre a árvore inteira.
40
56
 
41
57
  ### Camada 1: OWASP Static Review (via skill `security-review`)
42
58
 
@@ -72,6 +88,23 @@ Cruza dependency tree contra:
72
88
 
73
89
  Output: `.dw/secure-audit/compromise-findings.md` por pacote afetado: COMPROMISED / suspicious / clean.
74
90
 
91
+ ### Camada 4: SAST — Semgrep (análise semântica do código gerado)
92
+
93
+ Análise estática semântica e determinística do **diff** (`--baseline-commit`), complementando a Camada 1.
94
+ Rulesets fixados: `p/security-audit`, `p/owasp-top-ten`, `p/secrets` (+ packs de linguagem detectados).
95
+ Mapeie Semgrep `ERROR`→HIGH (ou CRITICAL pra CWEs RCE/authn-bypass/SQLi), `WARNING`→MEDIUM, `INFO`→LOW.
96
+ Aplique a disciplina **fp-check** (reachability) antes de um finding bloquear (ver `security-review/references/sast.md`).
97
+
98
+ Output: `.dw/secure-audit/sast-findings.md`. Se `semgrep` ausente: pulado + anotado no summary.
99
+
100
+ ### Camada 5: Secret scan dedicado — gitleaks
101
+
102
+ `gitleaks protect --staged` (não-commitado) ou `gitleaks detect --log-opts <base>..HEAD` (branch), `--redact`.
103
+ Autoritativo no diff; complementa Trivy secrets (dedupe por `file:line`). **Qualquer hit = REPROVADO, sem
104
+ exceção de ADR** — secrets são removidos e rotacionados, não justificados. Ver `security-review/references/secrets.md`.
105
+
106
+ Output: `.dw/secure-audit/secret-findings.md`. Se `gitleaks` ausente: cai pro Trivy secrets + anotado.
107
+
75
108
  ### Plus: outdated check
76
109
 
77
110
  `npm outdated` / `pip list --outdated` / `dotnet list outdated` / `cargo outdated` pra identificar pacotes atrás em minor ou major.
@@ -84,9 +117,11 @@ Todos os findings são classificados num desses tiers em `.dw/secure-audit/audit
84
117
 
85
118
  | Tier | Critério | Bloqueia | Ação Sugerida |
86
119
  |------|----------|----------|---------------|
120
+ | **SECRET** | Credencial/chave/token hardcoded (gitleaks ou Trivy), sobrevive ao allowlist | SIM — **sem exceção de ADR** | Remover do código + histórico, rotacionar, mover pra secret store |
87
121
  | **COMPROMISED** | Pacote conhecido como malicioso nessa faixa de versão | SIM | Remover imediato / pin pra versão segura |
88
- | **CRITICAL** | CVE CVSS ≥9.0 OU exploit ativo OU auth bypass | SIM | Update ou substituir em 24h |
89
- | **HIGH** | CVE CVSS 7.0–8.9 OU exploitável no contexto atual | SIM | Update ou substituir em 1 semana |
122
+ | **CRITICAL** | CVE CVSS ≥9.0 OU exploit ativo OU auth bypass; OU SAST de CWE alto-impacto (SQLi/RCE/authn-bypass/SSRF/deserialization) alcançável | SIM | Update/substituir ou corrigir em 24h |
123
+ | **HIGH** | CVE CVSS 7.0–8.9 OU exploitável no contexto; OU Semgrep `ERROR` alcançável (fp-check passou) | SIM | Update/substituir ou corrigir em 1 semana |
124
+ | **MEDIUM / LOW** | CVE CVSS <7.0; OU Semgrep `WARNING`/`INFO`; OU finding inalcançável rebaixado pelo fp-check | NÃO (advisory) | Rastrear e corrigir rotineiramente |
90
125
  | **OUTDATED-MAJOR** | ≥1 major version atrás (ex: React 17 → 19) | NÃO | Planejar migração próximo trimestre |
91
126
  | **OUTDATED-MINOR** | Minor/patch atrás | NÃO | Update rotineiro |
92
127
  | **CLEAN** | Sem findings | NÃO | — |
@@ -94,19 +129,26 @@ Todos os findings são classificados num desses tiers em `.dw/secure-audit/audit
94
129
  ## Hard Gates
95
130
 
96
131
  Verdict é um de:
97
- - **APROVADO** — sem CRITICAL, HIGH ou COMPROMISED. Arquivo verdict `.dw/secure-audit/audit-summary.md` status: APROVADO.
98
- - **REPROVADO** — ≥1 CRITICAL, HIGH ou COMPROMISED sem ADR explícito ou remediação em andamento. Status: REPROVADO.
132
+ - **APROVADO** — sem SECRET, COMPROMISED, CRITICAL ou HIGH. Arquivo verdict `.dw/secure-audit/audit-summary.md` status: APROVADO. (MEDIUM/LOW/outdated podem aparecer como advisory.)
133
+ - **REPROVADO** — ≥1 SECRET (sempre), ou ≥1 COMPROMISED/CRITICAL/HIGH sem ADR explícito ou remediação em andamento. Status: REPROVADO.
134
+
135
+ **Limiar Rigoroso:** SECRET e COMPROMISED sempre bloqueiam. CRITICAL/HIGH (CVE ou SAST alcançável) bloqueiam salvo ADR justificando aceitação. MEDIUM/LOW e outdated são advisory. SECRET é o único tier **sem escape via ADR** — rotacione, não justifique.
99
136
 
100
137
  **`/dw-review` e `/dw-generate-pr` enforçam:** se linguagem do projeto é suportada E `.dw/secure-audit/audit-summary.md` mais recente está faltando OU REPROVADO, esses comandos retornam REPROVADO. Sem exceção. Sem flag bypass.
101
138
 
102
139
  ## Modo 1: Default (`/dw-secure-audit`)
103
140
 
104
141
  1. **Detectar stack**: checar package.json / requirements.txt / *.csproj / Cargo.toml.
105
- 2. **Rodar todas as três camadas em paralelo** (onde possível):
106
- - OWASP static (via skill `security-review`).
142
+ 2. **Rodar todas as camadas de detecção em paralelo** (onde possível):
143
+ - OWASP static (via skill `security-review`) — focado no diff.
144
+ - SAST — Semgrep no diff (`--baseline-commit`).
145
+ - Secret scan dedicado — gitleaks no diff.
107
146
  - Trivy + lockfile audit.
108
147
  - Supply-chain compromise check.
109
148
  3. **Rodar outdated check.**
149
+ **fp-check:** antes de finalizar, rode validação de reachability em cada finding SAST/OWASP bloqueante
150
+ (ver `security-review` SKILL.md); rebaixe os comprovadamente inalcançáveis pra advisory com razão logada.
151
+ Secrets são isentos de rebaixamento.
110
152
  4. **Agregar findings** por tier.
111
153
  5. **Escrever summary** em `.dw/secure-audit/audit-summary.md`:
112
154
 
@@ -118,14 +160,26 @@ Verdict é um de:
118
160
  ## Resumo por Tier
119
161
  | Tier | Contagem | Detalhe |
120
162
  |------|----------|---------|
163
+ | SECRET | N | <lista> |
121
164
  | COMPROMISED | N | <lista> |
122
165
  | CRITICAL | N | <lista> |
123
166
  | HIGH | N | <lista> |
167
+ | MEDIUM/LOW (advisory) | N | <lista> |
124
168
  | OUTDATED-MAJOR | N | <lista> |
125
169
  | OUTDATED-MINOR | N | <lista> |
126
170
 
171
+ ## Scanners
172
+ | Camada | Tool | Status |
173
+ |--------|------|--------|
174
+ | OWASP | security-review | rodou |
175
+ | SAST | semgrep | rodou / pulado (não instalado) |
176
+ | Secrets | gitleaks | rodou / fallback trivy (não instalado) |
177
+ | SCA/IaC | trivy | rodou |
178
+
127
179
  ## Relatórios das camadas
128
180
  - OWASP: `owasp-findings.md`
181
+ - SAST: `sast-findings.md`
182
+ - Secrets: `secret-findings.md`
129
183
  - Trivy: `trivy-findings.md`
130
184
  - Lockfile: `lockfile-findings.md`
131
185
  - Compromise: `compromise-findings.md`
@@ -164,7 +218,7 @@ Pra cada remediação aprovada:
164
218
  ## Modo 4: CI (`/dw-secure-audit --scan-only`)
165
219
 
166
220
  Output mínimo:
167
- - Roda todas as três camadas.
221
+ - Roda todas as camadas de detecção.
168
222
  - Escreve findings em disco.
169
223
  - Exit code 0 se APROVADO, 1 se REPROVADO.
170
224
  - Sem planejamento.
@@ -182,8 +236,9 @@ Pra gates pre-merge em CI.
182
236
  ## Constitution Gate
183
237
 
184
238
  <critical>
185
- - CRITICAL ou COMPROMISED finding sem ADR justificando aceitação explícita → verdict não pode ser APROVADO.
186
- - Violações de princípios de constitution security-related (P-009 server-side auth, P-010 secrets-in-repo) escalonam findings — violação de princípio `severity: info` surface aqui vira HIGH.
239
+ - Finding SECRET → verdict NUNCA pode ser APROVADO (sem escape via ADR). Rotacione e remova.
240
+ - Finding CRITICAL/HIGH/COMPROMISED (CVE ou SAST alcançável) sem ADR justificando aceitação explícita → verdict não pode ser APROVADO.
241
+ - Violações de princípios de constitution security-related (P-009 server-side auth, P-010 secrets-in-repo, P-011 sem SAST high-severity) escalonam findings — violação de princípio `severity: info` surface aqui vira HIGH.
187
242
  </critical>
188
243
 
189
244
  ## Anti-patterns
@@ -198,8 +253,10 @@ Pra gates pre-merge em CI.
198
253
 
199
254
  ```
200
255
  .dw/secure-audit/
201
- ├── audit-summary.md # verdict + resumo de tiers
256
+ ├── audit-summary.md # verdict + resumo de tiers + status dos scanners
202
257
  ├── owasp-findings.md # Camada 1
258
+ ├── sast-findings.md # Camada 4 (Semgrep)
259
+ ├── secret-findings.md # Camada 5 (gitleaks, redacted)
203
260
  ├── trivy-findings.md # Camada 2 (SCA + secrets + IaC)
204
261
  ├── lockfile-findings.md # Camada 2 (native auditor)
205
262
  ├── compromise-findings.md # Camada 3
@@ -80,12 +80,17 @@ mode: defaults | custom
80
80
  **P-009 — Authorization server-side em todo endpoint que altera estado** (severity: info)
81
81
  **Regra:** Endpoint que cria, atualiza ou deleta dado deve verificar autorização do caller no servidor. Gating em UI (botões escondidos, formulários disabled) não é segurança.
82
82
  **Why:** Browsers são untrusted (ver `dw-testing-discipline/references/security-boundary.md`). Gating em UI é conveniência; só checks server-side protegem dado.
83
- **Enforcement:** `dw-code-review` e `dw-security-check` exigem check de auth explícito (decorator, middleware ou assertion in-handler) em rotas POST/PUT/PATCH/DELETE.
83
+ **Enforcement:** `dw-review` e o Security Gate `dw-secure-audit` exigem check de auth explícito (decorator, middleware ou assertion in-handler) em rotas POST/PUT/PATCH/DELETE.
84
84
 
85
- **P-010 — Secrets nunca entram no repositório** (severity: info)
85
+ **P-010 — Secrets nunca entram no repositório** (severity: high)
86
86
  **Regra:** Nenhuma API key, password, signing key, token ou endpoint de produção commitado em source. `.env.example` documenta forma apenas.
87
87
  **Why:** Histórico de repositório é permanente. Um secret commitado uma vez está vazado mesmo que revertido no commit seguinte.
88
- **Enforcement:** `dw-security-check` roda Trivy + secret scanners no diff.
88
+ **Enforcement:** o Security Gate `dw-secure-audit` roda gitleaks + Trivy no diff. Qualquer hit bloqueia — **sem exceção de ADR** (rotacione, não justifique).
89
+
90
+ **P-011 — Nenhum finding SAST high-severity passa sem revisão** (severity: high)
91
+ **Regra:** Código gerado/alterado deve passar na camada SAST (Semgrep) do Security Gate. Um finding high-severity alcançável (SQLi, command/code injection, SSRF, deserialization insegura, authn bypass) bloqueia salvo ADR justificando aceitação.
92
+ **Why:** Código gerado por IA reproduz padrões inseguros em escala; SAST determinístico no diff pega o que o review por leitura perde.
93
+ **Enforcement:** `dw-secure-audit` roda Semgrep no diff (`--baseline-commit`); findings sobrevivem a uma validação fp-check de reachability antes de bloquear.
89
94
 
90
95
  ---
91
96
 
@@ -0,0 +1,17 @@
1
+ // Módulo de fluxo do functional-doc. Executado por .dw/scripts/functional-doc/run-playwright-flow.mjs
2
+ // através da API Node do Playwright, para que o vídeo seja gravado com page.screencast (funciona tanto
3
+ // com browser lançado quanto via connectOverCDP). Não precisa de imports aqui — o runner injeta
4
+ // page, context, expect, baseURL e os helpers step()/shot().
5
+
6
+ export default async function flow({ page, expect, baseURL, step, shot }) {
7
+ await step("Abrir rota alvo", async () => {
8
+ await page.goto(`${baseURL}{{routePath}}`);
9
+ await expect(page).toHaveURL(new RegExp("{{routeRegex}}"));
10
+ });
11
+
12
+ {{testSteps}}
13
+
14
+ await step("Registrar contexto final", async () => {
15
+ await expect(page.locator("body")).toBeVisible();
16
+ });
17
+ }
@@ -0,0 +1,16 @@
1
+ [package]
2
+ name = "cdp-relay"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+ description = "Tiny TCP forwarder so WSL can reach a Windows browser's CDP debug port in NAT mode. Built on Windows by dev-workflow; no runtime dependency."
6
+
7
+ [[bin]]
8
+ name = "cdp-relay"
9
+ path = "src/main.rs"
10
+
11
+ [profile.release]
12
+ opt-level = "z"
13
+ lto = true
14
+ strip = true
15
+ panic = "abort"
16
+ codegen-units = 1
@@ -0,0 +1,49 @@
1
+ //! cdp-relay — a tiny TCP forwarder.
2
+ //!
3
+ //! Listens on 0.0.0.0:<listen> and forwards every connection to 127.0.0.1:<target>.
4
+ //! dev-workflow runs this on the Windows side so WSL (NAT networking) can reach a Windows
5
+ //! browser's CDP remote-debugging port, which Chromium binds to loopback only. std-only:
6
+ //! no crates, no runtime — a single static .exe built with the user's Windows `cargo`.
7
+
8
+ use std::env;
9
+ use std::io;
10
+ use std::net::{Shutdown, TcpListener, TcpStream};
11
+ use std::thread;
12
+
13
+ fn pump(mut from: TcpStream, mut to: TcpStream) {
14
+ let _ = io::copy(&mut from, &mut to);
15
+ // Signal EOF to the peer so the other direction can finish cleanly.
16
+ let _ = to.shutdown(Shutdown::Write);
17
+ }
18
+
19
+ fn handle(client: TcpStream, target_port: u16) -> io::Result<()> {
20
+ client.set_nodelay(true).ok();
21
+ let upstream = TcpStream::connect(("127.0.0.1", target_port))?;
22
+ upstream.set_nodelay(true).ok();
23
+
24
+ let client_rx = client.try_clone()?;
25
+ let upstream_rx = upstream.try_clone()?;
26
+ // client -> upstream
27
+ thread::spawn(move || pump(client, upstream));
28
+ // upstream -> client
29
+ thread::spawn(move || pump(upstream_rx, client_rx));
30
+ Ok(())
31
+ }
32
+
33
+ fn main() {
34
+ let args: Vec<String> = env::args().collect();
35
+ if args.len() < 3 {
36
+ eprintln!("usage: cdp-relay <listen_port> <target_port>");
37
+ std::process::exit(2);
38
+ }
39
+ let listen_port: u16 = args[1].parse().expect("invalid listen port");
40
+ let target_port: u16 = args[2].parse().expect("invalid target port");
41
+
42
+ let listener = TcpListener::bind(("0.0.0.0", listen_port)).expect("bind failed");
43
+ for stream in listener.incoming() {
44
+ if let Ok(client) = stream {
45
+ // One connection failing must not take down the relay.
46
+ let _ = handle(client, target_port);
47
+ }
48
+ }
49
+ }