nexus-core-v3 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/agents/README.md +133 -0
- package/agents/_protocol.md +107 -0
- package/agents/analyst.md +138 -0
- package/agents/architect.md +146 -0
- package/agents/data-engineer.md +170 -0
- package/agents/dev.md +134 -0
- package/agents/devops.md +141 -0
- package/agents/nexus-master.md +147 -0
- package/agents/pm.md +133 -0
- package/agents/po.md +138 -0
- package/agents/qa.md +192 -0
- package/agents/sm.md +122 -0
- package/agents/squad-creator.md +121 -0
- package/agents/ux-design-expert.md +165 -0
- package/artifact-manifest.json +903 -0
- package/bin/nexus.mjs +37 -0
- package/checklists/README.md +49 -0
- package/checklists/architect-checklist.md +47 -0
- package/checklists/change-checklist.md +61 -0
- package/checklists/db-predeploy-checklist.md +57 -0
- package/checklists/design-quality-checklist.md +57 -0
- package/checklists/discovery-checklist.md +36 -0
- package/checklists/foundation-checklist.md +39 -0
- package/checklists/launch-checklist.md +39 -0
- package/checklists/pm-checklist.md +48 -0
- package/checklists/po-master-checklist.md +64 -0
- package/checklists/reality-check-checklist.md +49 -0
- package/checklists/story-dod-checklist.md +52 -0
- package/checklists/story-draft-checklist.md +36 -0
- package/dist/bin/dashboard.html +279 -0
- package/dist/bin/nexus.mjs +20008 -0
- package/dist/constitution.yaml +76 -0
- package/knowledge/README.md +57 -0
- package/knowledge/architecture/architectural-styles-map.md +182 -0
- package/knowledge/architecture/design-patterns-gof.md +192 -0
- package/knowledge/architecture/distributed-patterns-cheatsheet.md +201 -0
- package/knowledge/architecture/saas-subscription-blueprint.md +355 -0
- package/knowledge/architecture/system-design-tradeoffs.md +231 -0
- package/knowledge/architecture/t3-fullstack-typesafe-stack.md +273 -0
- package/knowledge/copy/landing-copy-that-converts.md +168 -0
- package/knowledge/data/postgres-indexing-and-tuning.md +263 -0
- package/knowledge/data/schema-modeling-decisions.md +273 -0
- package/knowledge/data/supabase-rls-patterns.md +316 -0
- package/knowledge/data/zero-downtime-migrations.md +308 -0
- package/knowledge/devops/cicd-pipeline-best-practices.md +318 -0
- package/knowledge/devops/production-dockerfile.md +283 -0
- package/knowledge/devops/twelve-factor-app.md +398 -0
- package/knowledge/engineering/clean-code-principles.md +429 -0
- package/knowledge/engineering/effective-code-review.md +204 -0
- package/knowledge/engineering/testing-strategy-beyond-unit.md +307 -0
- package/knowledge/governance/risk-matrix.md +56 -0
- package/knowledge/integration/mcp-server-selection-matrix.md +235 -0
- package/knowledge/marketing/copy-que-converte.md +43 -0
- package/knowledge/marketing/funil-e-jornada.md +36 -0
- package/knowledge/negocios/proposta-vencedora.md +38 -0
- package/knowledge/negocios/roi-e-unit-economics.md +46 -0
- package/knowledge/pipeline/1-descobrir.md +26 -0
- package/knowledge/pipeline/2-estrategizar.md +26 -0
- package/knowledge/pipeline/3-estruturar.md +27 -0
- package/knowledge/pipeline/4-construir.md +27 -0
- package/knowledge/pipeline/5-endurecer.md +28 -0
- package/knowledge/pipeline/6-lancar.md +27 -0
- package/knowledge/pipeline/7-operar.md +27 -0
- package/knowledge/security/lgpd-conformidade-basica.md +35 -0
- package/knowledge/security/owasp-secure-coding-gates.md +220 -0
- package/knowledge/security/owasp-top10-threat-assessment.md +287 -0
- package/knowledge/security/threat-modeling-stride.md +34 -0
- package/knowledge/web-craft/a11y-audit-checklist.md +251 -0
- package/knowledge/web-craft/accessible-component-patterns.md +383 -0
- package/knowledge/web-craft/anti-ai-look.md +114 -0
- package/knowledge/web-craft/design-system-from-code.md +195 -0
- package/knowledge/web-craft/intrinsic-css-layout.md +420 -0
- package/knowledge/web-craft/style-cloning.md +185 -0
- package/knowledge/web-craft/visual-polish-review.md +183 -0
- package/package.json +55 -0
- package/runbooks/campanha-de-conteudo.md +36 -0
- package/runbooks/feature-em-projeto-existente.md +37 -0
- package/runbooks/mvp-startup.md +38 -0
- package/runbooks/resposta-a-incidente.md +37 -0
- package/squads/exemplo-conteudo/agents/editor-chefe.md +48 -0
- package/squads/exemplo-conteudo/agents/pesquisador.md +44 -0
- package/squads/exemplo-conteudo/agents/redator.md +45 -0
- package/squads/exemplo-conteudo/knowledge/estilo-editorial.md +21 -0
- package/squads/exemplo-conteudo/squad.yaml +19 -0
- package/squads/exemplo-conteudo/tasks/pesquisar-fontes.md +26 -0
- package/squads/exemplo-conteudo/tasks/planejar-pauta.md +27 -0
- package/squads/exemplo-conteudo/tasks/redigir-artigo.md +26 -0
- package/squads/exemplo-conteudo/tasks/revisar-artigo.md +27 -0
- package/squads/marketing/agents/analista.md +56 -0
- package/squads/marketing/agents/chefe-marketing.md +65 -0
- package/squads/marketing/agents/conteudo.md +55 -0
- package/squads/marketing/agents/copy.md +55 -0
- package/squads/marketing/agents/growth.md +56 -0
- package/squads/marketing/agents/social.md +55 -0
- package/squads/marketing/squad.yaml +17 -0
- package/squads/marketing/tasks/aprovar-campanha.md +43 -0
- package/squads/negocios/agents/chefe-negocios.md +65 -0
- package/squads/negocios/agents/financas-roi.md +55 -0
- package/squads/negocios/agents/suporte.md +55 -0
- package/squads/negocios/agents/vendas-proposta.md +56 -0
- package/squads/negocios/squad.yaml +17 -0
- package/squads/negocios/tasks/aprovar-proposta.md +40 -0
- package/squads/security/agents/appsec-reviewer.md +59 -0
- package/squads/security/agents/chefe-seguranca.md +65 -0
- package/squads/security/agents/compliance-auditor.md +60 -0
- package/squads/security/agents/threat-modeler.md +60 -0
- package/squads/security/squad.yaml +20 -0
- package/squads/security/tasks/aprovar-gate-seguranca.md +42 -0
- package/squads/security/tasks/emitir-parecer-conformidade.md +42 -0
- package/tasks/README.md +72 -0
- package/tasks/accessibility-wcag-checklist.md +69 -0
- package/tasks/advanced-elicitation.md +42 -0
- package/tasks/analyze-performance.md +54 -0
- package/tasks/analyze-project-structure.md +59 -0
- package/tasks/apply-qa-fixes.md +57 -0
- package/tasks/architect-analyze-impact.md +62 -0
- package/tasks/archive-squad.md +52 -0
- package/tasks/audit-codebase.md +53 -0
- package/tasks/build-component.md +61 -0
- package/tasks/calculate-roi.md +63 -0
- package/tasks/ci-cd-configuration.md +51 -0
- package/tasks/collect-visual-evidence.md +62 -0
- package/tasks/compose-molecule.md +57 -0
- package/tasks/consolidate-patterns.md +54 -0
- package/tasks/create-brownfield-prd.md +54 -0
- package/tasks/create-competitor-analysis.md +42 -0
- package/tasks/create-deep-research-prompt.md +62 -0
- package/tasks/create-doc.md +62 -0
- package/tasks/create-epic.md +49 -0
- package/tasks/create-front-end-spec.md +56 -0
- package/tasks/create-migration-plan.md +57 -0
- package/tasks/create-next-story.md +66 -0
- package/tasks/create-prd.md +53 -0
- package/tasks/create-project-brief.md +47 -0
- package/tasks/create-rls-policies.md +59 -0
- package/tasks/create-schema.md +57 -0
- package/tasks/create-service.md +55 -0
- package/tasks/create-squad.md +100 -0
- package/tasks/create-suite.md +62 -0
- package/tasks/db-apply-migration.md +56 -0
- package/tasks/db-domain-modeling.md +57 -0
- package/tasks/db-dry-run.md +50 -0
- package/tasks/db-env-check.md +57 -0
- package/tasks/db-load-csv.md +54 -0
- package/tasks/db-policy-apply.md +58 -0
- package/tasks/db-rollback.md +51 -0
- package/tasks/db-run-sql.md +61 -0
- package/tasks/db-seed.md +52 -0
- package/tasks/db-smoke-test.md +51 -0
- package/tasks/db-snapshot.md +48 -0
- package/tasks/db-verify-order.md +49 -0
- package/tasks/deliberate.md +46 -0
- package/tasks/design-indexes.md +59 -0
- package/tasks/dev-develop-story.md +61 -0
- package/tasks/document-project.md +59 -0
- package/tasks/execute-checklist.md +57 -0
- package/tasks/execute-epic-plan.md +52 -0
- package/tasks/execute-subtask.md +51 -0
- package/tasks/extend-pattern.md +63 -0
- package/tasks/extend-squad.md +60 -0
- package/tasks/extract-patterns.md +64 -0
- package/tasks/extract-tokens.md +59 -0
- package/tasks/facilitate-brainstorming-session.md +42 -0
- package/tasks/generate-ai-frontend-prompt.md +57 -0
- package/tasks/generate-documentation.md +60 -0
- package/tasks/generate-migration-strategy.md +57 -0
- package/tasks/generate-shock-report.md +56 -0
- package/tasks/mcp-management.md +66 -0
- package/tasks/orchestrate.md +50 -0
- package/tasks/perform-market-research.md +42 -0
- package/tasks/plan-create-context.md +57 -0
- package/tasks/plan-create-implementation.md +58 -0
- package/tasks/po-close-story.md +60 -0
- package/tasks/po-manage-story-backlog.md +59 -0
- package/tasks/po-pull-story.md +60 -0
- package/tasks/po-sync-story.md +59 -0
- package/tasks/pr-automation.md +50 -0
- package/tasks/pre-push-quality-gate.md +54 -0
- package/tasks/push.md +53 -0
- package/tasks/qa-browser-console-check.md +52 -0
- package/tasks/qa-create-fix-request.md +58 -0
- package/tasks/qa-evidence-requirements.md +55 -0
- package/tasks/qa-false-positive-detection.md +55 -0
- package/tasks/qa-fix-issues.md +55 -0
- package/tasks/qa-gate.md +53 -0
- package/tasks/qa-migration-validation.md +58 -0
- package/tasks/qa-nfr-assess.md +45 -0
- package/tasks/qa-review-story.md +56 -0
- package/tasks/qa-risk-profile.md +45 -0
- package/tasks/qa-security-checklist.md +64 -0
- package/tasks/qa-test-design.md +47 -0
- package/tasks/qa-trace-requirements.md +48 -0
- package/tasks/release-management.md +53 -0
- package/tasks/repository-cleanup.md +61 -0
- package/tasks/route.md +44 -0
- package/tasks/run-tests.md +50 -0
- package/tasks/security-audit.md +54 -0
- package/tasks/setup-database.md +60 -0
- package/tasks/setup-design-system.md +60 -0
- package/tasks/shard-doc.md +60 -0
- package/tasks/spec-assess-complexity.md +55 -0
- package/tasks/spec-critique.md +64 -0
- package/tasks/spec-gather-requirements.md +48 -0
- package/tasks/spec-research-dependencies.md +42 -0
- package/tasks/spec-write-spec.md +50 -0
- package/tasks/test-as-user.md +52 -0
- package/tasks/ux-create-wireframe.md +54 -0
- package/tasks/ux-user-research.md +55 -0
- package/tasks/validate-next-story.md +61 -0
- package/tasks/validate-squad.md +55 -0
- package/tasks/verify-subtask.md +52 -0
- package/tasks/version-management.md +45 -0
- package/templates/README.md +47 -0
- package/templates/architecture-tmpl.md +115 -0
- package/templates/competitor-analysis-tmpl.md +87 -0
- package/templates/epic-tmpl.md +83 -0
- package/templates/front-end-spec-tmpl.md +110 -0
- package/templates/market-research-tmpl.md +98 -0
- package/templates/migration-plan-tmpl.md +92 -0
- package/templates/prd-tmpl.md +95 -0
- package/templates/project-brief-tmpl.md +100 -0
- package/templates/qa-verdict-tmpl.md +73 -0
- package/templates/rls-policies-tmpl.md +93 -0
- package/templates/schema-design-tmpl.md +107 -0
- package/templates/spec-tmpl.md +88 -0
- package/templates/squad/agent-dna-tmpl.md +72 -0
- package/templates/squad/chief-dna-tmpl.md +98 -0
- package/templates/squad/squad-task-tmpl.md +50 -0
- package/templates/squad/squad-yaml-tmpl.md +47 -0
- package/templates/story-tmpl.md +63 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Funil e jornada — a mensagem certa na etapa certa
|
|
2
|
+
|
|
3
|
+
A pessoa não acorda querendo comprar. Ela percorre uma jornada — da dor que ainda não nomeou até a
|
|
4
|
+
decisão de pagar — e cada etapa precisa de uma mensagem diferente. A campanha que fala de compra para
|
|
5
|
+
quem ainda descobre a dor desperdiça a melhor peça no público errado.
|
|
6
|
+
|
|
7
|
+
## As etapas da jornada
|
|
8
|
+
|
|
9
|
+
| Etapa | Estado mental | Mensagem que funciona | Métrica |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| **Descoberta (topo)** | "tenho um problema?" | conteúdo que nomeia e educa sobre a dor | alcance qualificado, tempo de leitura |
|
|
12
|
+
| **Consideração (meio)** | "quais são as opções?" | comparação, prova, casos, critérios de escolha | leads, inscrições, retorno ao site |
|
|
13
|
+
| **Decisão (fundo)** | "esta é a escolha certa?" | copy de conversão, remoção de objeção, oferta | conversão, receita |
|
|
14
|
+
| **Retenção (pós)** | "valeu a pena?" | onboarding, primeiro valor, sucesso do cliente | ativação, churn, expansão |
|
|
15
|
+
|
|
16
|
+
Peça no funil errado = orçamento desperdiçado. O conteúdo de fundo (oferta, urgência) empurra quem
|
|
17
|
+
ainda está descobrindo; o de topo (educação) entedia quem já quer comprar.
|
|
18
|
+
|
|
19
|
+
## Coerência de mensagem entre canais
|
|
20
|
+
|
|
21
|
+
A promessa central é a MESMA em todo canal — o que muda é a língua (formato nativo), não o fundo. O
|
|
22
|
+
anúncio, o post e a landing dizem a mesma coisa, adaptada. Contradição entre canais quebra a confiança
|
|
23
|
+
e mata a conversão.
|
|
24
|
+
|
|
25
|
+
## Métrica real vs vaidade
|
|
26
|
+
|
|
27
|
+
- **Vaidade:** curtida, impressão, alcance bruto, seguidores. Sobem sem mover o negócio.
|
|
28
|
+
- **Real:** lead qualificado, ativação, receita, retenção. Ligam-se ao resultado.
|
|
29
|
+
- Regra: se o número não muda a próxima decisão, ele não entra no relatório como sucesso.
|
|
30
|
+
|
|
31
|
+
## Anti-padrões
|
|
32
|
+
|
|
33
|
+
- Uma mensagem única para toda a jornada — a dor de cada etapa é diferente.
|
|
34
|
+
- Comemorar vaidade — curtida não paga conta.
|
|
35
|
+
- Cross-post idêntico — cada canal tem sua língua; copiar e colar o algoritmo pune.
|
|
36
|
+
- Campanha sem métrica-alvo definida antes de ir ao ar — vira opinião com orçamento.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# A proposta que vende a transformação
|
|
2
|
+
|
|
3
|
+
Uma proposta comercial não é um catálogo de features com preço no fim. É um argumento: o cliente tem
|
|
4
|
+
uma dor, ela custa caro, e existe um caminho para resolvê-la que vale mais do que custa. Tudo o mais
|
|
5
|
+
é embalagem.
|
|
6
|
+
|
|
7
|
+
## A estrutura que fecha
|
|
8
|
+
|
|
9
|
+
1. **A dor do cliente (não a nossa empresa).** Abra pelo custo real de não resolver — tempo perdido,
|
|
10
|
+
dinheiro vazando, risco correndo. Se o primeiro parágrafo fala de "nós", o cliente parou de ler.
|
|
11
|
+
2. **A transformação (não a feature).** Cada capacidade relevante vira o que muda na vida do cliente.
|
|
12
|
+
"Dashboard em tempo real" é feature; "você para de descobrir o problema no dia seguinte" é venda.
|
|
13
|
+
3. **A oferta.** O que ele recebe, por quanto, com qual garantia ou risco reduzido.
|
|
14
|
+
4. **A prova.** O retorno quantificado (ROI), casos, ou a redução de risco que torna o "sim" seguro.
|
|
15
|
+
5. **A única ação seguinte.** Um próximo passo claro, sem atrito. Cinco call-to-actions = nenhuma decisão.
|
|
16
|
+
|
|
17
|
+
## Feature → benefício → transformação
|
|
18
|
+
|
|
19
|
+
| Feature (o que faz) | Benefício (o que muda) | Transformação (quem ele vira) |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| Relatório automático | Economiza 4h/semana | Deixa de ser refém da planilha |
|
|
22
|
+
| Alerta em tempo real | Erro pego na hora | Para de apagar incêndio no dia seguinte |
|
|
23
|
+
| Integração com X | Fim do retrabalho manual | Confia no dado sem reconferir |
|
|
24
|
+
|
|
25
|
+
O rascunho para na coluna 1. A proposta chega na coluna 3.
|
|
26
|
+
|
|
27
|
+
## Anti-padrões (o que rasgar)
|
|
28
|
+
|
|
29
|
+
- Abrir com "somos líderes de mercado" — o cliente compra a dor dele, não o nosso currículo.
|
|
30
|
+
- Vender a lista de features — ninguém compra capacidade, compram resultado.
|
|
31
|
+
- Prometer o que o produto não entrega hoje — proposta é contrato moral; overselling é churn assinado.
|
|
32
|
+
- Terminar sem ação seguinte — a proposta perfeita sem próximo passo não converte.
|
|
33
|
+
|
|
34
|
+
## Retenção começa na proposta
|
|
35
|
+
|
|
36
|
+
A venda só fecha de verdade quando o cliente ativa e fica. O caminho até o primeiro valor (o cliente
|
|
37
|
+
sentir que valeu antes de duvidar) faz parte da oferta, não é um "depois". Venda que não ativa é
|
|
38
|
+
receita emprestada.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# ROI e unit economics — a conta honesta
|
|
2
|
+
|
|
3
|
+
ROI não é um argumento de venda — é uma conta que o cliente reconhece como dele. O ROI que fecha a
|
|
4
|
+
venda com premissa inflada é o mesmo que abre o ticket de cancelamento seis meses depois. A régua é
|
|
5
|
+
simples: todo número tem origem, e a origem é o cliente.
|
|
6
|
+
|
|
7
|
+
## A conta do ROI
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
ROI (%) = (ganho − custo) / custo × 100
|
|
11
|
+
ganho = economia gerada + receita nova (no horizonte de análise)
|
|
12
|
+
custo = preço + implantação + custo de operação
|
|
13
|
+
payback = tempo até o ganho acumulado igualar o custo
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- **Horizonte explícito.** ROI de 12 meses e de 36 meses são histórias diferentes — diga qual.
|
|
17
|
+
- **Premissa marcada.** Cada número: dado do cliente, benchmark citável, ou estimativa marcada COMO
|
|
18
|
+
estimativa. Número sem origem é chute com casa decimal.
|
|
19
|
+
|
|
20
|
+
## Análise de sensibilidade (o que mata a conta)
|
|
21
|
+
|
|
22
|
+
Não basta o ROI ser positivo. Pergunte: se a premissa-chave errar 20%, a conta ainda fecha?
|
|
23
|
+
|
|
24
|
+
| Cenário | Premissa-chave | Payback |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| Otimista | volume alto | 14 meses |
|
|
27
|
+
| Base | volume esperado | 18 meses |
|
|
28
|
+
| Conservador | volume −20% | 22 meses |
|
|
29
|
+
|
|
30
|
+
Apresente os três. O cliente confia mais em quem mostra o cenário ruim do que em quem só mostra o bom.
|
|
31
|
+
|
|
32
|
+
## Unit economics — a pergunta antes da escala
|
|
33
|
+
|
|
34
|
+
Se a conta não fecha em UMA unidade (um cliente, um pedido, um mês), escalar só multiplica o prejuízo.
|
|
35
|
+
|
|
36
|
+
- **LTV** (lifetime value) — quanto um cliente gera enquanto fica.
|
|
37
|
+
- **CAC** (custo de aquisição) — quanto custou trazê-lo.
|
|
38
|
+
- **Regra:** `LTV > CAC` (idealmente 3×), e o CAC se paga dentro de um horizonte curto (payback de CAC).
|
|
39
|
+
- Se `LTV < CAC`, cada venda nova aprofunda o rombo — o crescimento é o problema, não a solução.
|
|
40
|
+
|
|
41
|
+
## Anti-padrões
|
|
42
|
+
|
|
43
|
+
- Usar a premissa que fecha a venda em vez da que o cliente confirma.
|
|
44
|
+
- Esconder a sensibilidade — o retorno frágil precisa aparecer frágil.
|
|
45
|
+
- ROI sem horizonte — "3x de retorno" sem prazo não significa nada.
|
|
46
|
+
- Escalar antes de a unidade fechar — multiplicar prejuízo não é growth.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
fase: descobrir
|
|
3
|
+
titulo: Descobrir
|
|
4
|
+
agentesAtivos: [analyst, pm]
|
|
5
|
+
outputs:
|
|
6
|
+
- project-brief.md
|
|
7
|
+
- achados de pesquisa
|
|
8
|
+
gate:
|
|
9
|
+
gateKeeper: analyst
|
|
10
|
+
checklistRef: discovery-checklist
|
|
11
|
+
criterios:
|
|
12
|
+
- criterio: Problema real e usuário/segmento nomeado
|
|
13
|
+
evidenciaExigida: entrevista, dado, ticket ou observação que comprove a dor
|
|
14
|
+
- criterio: Valor da solução articulado
|
|
15
|
+
evidenciaExigida: impacto x frequência x alcance estimados
|
|
16
|
+
- criterio: Riscos e incógnitas listados
|
|
17
|
+
evidenciaExigida: lista explícita do que ainda não se sabe
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Fase 1 — Descobrir
|
|
21
|
+
|
|
22
|
+
Entende-se o problema antes de propor solução. O Alex conduz a pesquisa e o Morgan traduz o achado em
|
|
23
|
+
direção. Nada de código, nada de arquitetura — só a verdade sobre a dor, o usuário e o valor.
|
|
24
|
+
|
|
25
|
+
**Gate:** o `discovery-checklist` guarda a saída. Sem problema real, usuário nomeado e evidência da dor,
|
|
26
|
+
não se avança — descoberta rasa vira produto errado construído com perfeição.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
fase: estrategizar
|
|
3
|
+
titulo: Estrategizar
|
|
4
|
+
agentesAtivos: [pm, po]
|
|
5
|
+
outputs:
|
|
6
|
+
- prd.md
|
|
7
|
+
- épicos priorizados
|
|
8
|
+
gate:
|
|
9
|
+
gateKeeper: pm
|
|
10
|
+
checklistRef: pm-checklist
|
|
11
|
+
criterios:
|
|
12
|
+
- criterio: PRD com FRs/NFRs rastreáveis
|
|
13
|
+
evidenciaExigida: cada requisito numerado e ligado a uma dor da Descoberta
|
|
14
|
+
- criterio: Escopo e não-escopo explícitos
|
|
15
|
+
evidenciaExigida: lista do que fica de fora desta versão
|
|
16
|
+
- criterio: Épicos priorizados por valor x risco
|
|
17
|
+
evidenciaExigida: ordenação justificada, não intuição
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Fase 2 — Estrategizar
|
|
21
|
+
|
|
22
|
+
Transforma-se a dor validada em direção de produto. O Morgan escreve o PRD (FRs/NFRs, escopo, épicos) e
|
|
23
|
+
o Pax garante que cada item rastreia a um problema real e cabe no backlog.
|
|
24
|
+
|
|
25
|
+
**Gate:** o `pm-checklist` guarda a saída. Estratégia sem rastreabilidade ao problema é invenção — cada
|
|
26
|
+
requisito tem de puxar de uma dor da Descoberta (Article IV — No Invention).
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
fase: estruturar
|
|
3
|
+
titulo: Estruturar
|
|
4
|
+
agentesAtivos: [architect, data-engineer]
|
|
5
|
+
outputs:
|
|
6
|
+
- architecture.md
|
|
7
|
+
- schema-design.md
|
|
8
|
+
- ADRs
|
|
9
|
+
gate:
|
|
10
|
+
gateKeeper: architect
|
|
11
|
+
checklistRef: foundation-checklist
|
|
12
|
+
criterios:
|
|
13
|
+
- criterio: NFRs quantificados e fronteiras definidas
|
|
14
|
+
evidenciaExigida: números-alvo de escala/latência/segurança/custo
|
|
15
|
+
- criterio: Dados modelados e propriedade definida
|
|
16
|
+
evidenciaExigida: entidades, relações e estado inicial documentados
|
|
17
|
+
- criterio: Decisões estruturais registradas
|
|
18
|
+
evidenciaExigida: ADRs com alternativas rejeitadas
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Fase 3 — Estruturar
|
|
22
|
+
|
|
23
|
+
Desenha-se a fundação técnica. A Aria decide arquitetura e tecnologia; a Dara modela os dados e as
|
|
24
|
+
migrações. É aqui que a fundação nasce reta — ou o dia 30 cobra o retrabalho.
|
|
25
|
+
|
|
26
|
+
**Gate:** o `foundation-checklist` guarda a saída. NFRs quantificados, segurança na fundação e
|
|
27
|
+
rastreabilidade total (No Invention) são críticos — sem eles, "construir" vira aposta.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
fase: construir
|
|
3
|
+
titulo: Construir
|
|
4
|
+
agentesAtivos: [dev, ux-design-expert]
|
|
5
|
+
outputs:
|
|
6
|
+
- código implementado
|
|
7
|
+
- testes
|
|
8
|
+
- evidência de execução
|
|
9
|
+
gate:
|
|
10
|
+
gateKeeper: dev
|
|
11
|
+
checklistRef: story-dod-checklist
|
|
12
|
+
criterios:
|
|
13
|
+
- criterio: Todos os ACs implementados e testados
|
|
14
|
+
evidenciaExigida: teste verde por AC (Given-When-Then)
|
|
15
|
+
- criterio: Suíte e lint verdes
|
|
16
|
+
evidenciaExigida: saída real de npm run check exit 0
|
|
17
|
+
- criterio: File List completa
|
|
18
|
+
evidenciaExigida: todo arquivo tocado listado na story
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Fase 4 — Construir
|
|
22
|
+
|
|
23
|
+
Implementa-se a story seguindo o spec. O Dex escreve o código com testes; a Uma garante que a interface
|
|
24
|
+
segue o design system (rota design-primeiro para entregável visual). Cada AC vira código + teste.
|
|
25
|
+
|
|
26
|
+
**Gate:** o `story-dod-checklist` (DoD) guarda a saída. O Dex se auto-verifica antes de entregar ao QA —
|
|
27
|
+
suíte verde, ACs cobertos, File List real. "Feito" sem teste não é feito.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
fase: endurecer
|
|
3
|
+
titulo: Endurecer
|
|
4
|
+
agentesAtivos: [qa]
|
|
5
|
+
outputs:
|
|
6
|
+
- QaVerdict
|
|
7
|
+
- evidência visual
|
|
8
|
+
- QA Results na story
|
|
9
|
+
gate:
|
|
10
|
+
gateKeeper: qa
|
|
11
|
+
checklistRef: reality-check-checklist
|
|
12
|
+
checklistRefsExtra: [design-quality-checklist]
|
|
13
|
+
criterios:
|
|
14
|
+
- criterio: Executado, não lido — suíte + fluxo exercitados
|
|
15
|
+
evidenciaExigida: log da execução real, não impressão do diff
|
|
16
|
+
- criterio: Evidência anexada a cada afirmação de pronto
|
|
17
|
+
evidenciaExigida: teste verde, screenshot, console limpo
|
|
18
|
+
- criterio: Regressão para todo bug corrigido
|
|
19
|
+
evidenciaExigida: teste que reproduzia o bug (red antes do green)
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Fase 5 — Endurecer
|
|
23
|
+
|
|
24
|
+
A Quinn ataca o que vai falhar em produção: executa, coleta evidência visual, roda o reality-check e
|
|
25
|
+
emite o `<verdict>`. O default é NEEDS WORK — READY só com evidência esmagadora.
|
|
26
|
+
|
|
27
|
+
**Gate:** o `reality-check-checklist` guarda a saída. Reprovar 2–3 vezes aqui é o processo funcionando.
|
|
28
|
+
Sem execução e sem evidência, não há PASS — o gate não atesta o que não viu.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
fase: lancar
|
|
3
|
+
titulo: Lançar
|
|
4
|
+
agentesAtivos: [devops]
|
|
5
|
+
outputs:
|
|
6
|
+
- release assinado
|
|
7
|
+
- changelog
|
|
8
|
+
- rollback ensaiado
|
|
9
|
+
gate:
|
|
10
|
+
gateKeeper: devops
|
|
11
|
+
checklistRef: launch-checklist
|
|
12
|
+
criterios:
|
|
13
|
+
- criterio: Gate de qualidade verde antes do tráfego
|
|
14
|
+
evidenciaExigida: Endurecer com PASS + npm run check exit 0
|
|
15
|
+
- criterio: Rollback exercitado, não só documentado
|
|
16
|
+
evidenciaExigida: registro do ensaio de volta
|
|
17
|
+
- criterio: Assinatura de release verificada
|
|
18
|
+
evidenciaExigida: verificação fail-closed da assinatura do artefato
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Fase 6 — Lançar
|
|
22
|
+
|
|
23
|
+
O Gage leva à produção com rede de segurança: assinatura verificada, rollback ensaiado, observabilidade
|
|
24
|
+
de pé ANTES do tráfego, rollout gradual atrás de flag. Lançar é irreversível na prática.
|
|
25
|
+
|
|
26
|
+
**Gate:** o `launch-checklist` guarda a saída. Sem gate verde, sem volta garantida e sem alertas ativos,
|
|
27
|
+
o lançamento segura — um dia de preparo custa menos que um incidente com o usuário.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
fase: operar
|
|
3
|
+
titulo: Operar
|
|
4
|
+
agentesAtivos: [devops, architect]
|
|
5
|
+
outputs:
|
|
6
|
+
- métricas e alertas em produção
|
|
7
|
+
- runbooks de incidente
|
|
8
|
+
- relatório de operação
|
|
9
|
+
gate:
|
|
10
|
+
gateKeeper: devops
|
|
11
|
+
criterios:
|
|
12
|
+
- criterio: Observabilidade viva (métricas, logs, alertas)
|
|
13
|
+
evidenciaExigida: dashboards e alertas respondendo a dados reais
|
|
14
|
+
- criterio: Resposta a incidente ensaiada
|
|
15
|
+
evidenciaExigida: runbook executável + dono de plantão definido
|
|
16
|
+
- criterio: Dívida e aprendizados capturados
|
|
17
|
+
evidenciaExigida: itens registrados para a próxima Descoberta
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Fase 7 — Operar
|
|
21
|
+
|
|
22
|
+
O dia 2 em diante: o Gage cuida da saúde em produção e a Aria avalia o que a realidade ensinou. Aqui
|
|
23
|
+
não há checklist único — o gate é a operação REAL respondendo (observabilidade viva, incidente
|
|
24
|
+
ensaiado), e o aprendizado volta a alimentar a Descoberta (o ciclo fecha).
|
|
25
|
+
|
|
26
|
+
**Gate:** critérios de operação, sem checklist fixo. Produção que não se observa não se opera — e
|
|
27
|
+
aprendizado que não se captura é retrabalho futuro.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Conformidade de dados — o essencial (LGPD/GDPR)
|
|
2
|
+
|
|
3
|
+
Conformidade de dados pessoais não é o departamento jurídico dizendo "não" — é o contrato entre o
|
|
4
|
+
produto e o titular do dado. O essencial cabe em cinco perguntas que todo sistema que toca dado
|
|
5
|
+
pessoal precisa responder com FUNÇÃO, não com promessa.
|
|
6
|
+
|
|
7
|
+
## As cinco perguntas
|
|
8
|
+
|
|
9
|
+
1. **Base legal** — por que temos o direito de coletar isto? (consentimento, execução de contrato,
|
|
10
|
+
obrigação legal, legítimo interesse). Sem base declarada, a coleta é indevida.
|
|
11
|
+
2. **Finalidade** — para que este dado específico é usado? A finalidade precede a coleta; dado sem
|
|
12
|
+
finalidade é passivo.
|
|
13
|
+
3. **Minimização** — coletamos só o necessário para a finalidade? Campo "por via das dúvidas" viola.
|
|
14
|
+
4. **Retenção** — por quanto tempo guardamos, e existe descarte automático quando a finalidade acaba?
|
|
15
|
+
Retenção sem prazo é não-conformidade.
|
|
16
|
+
5. **Direitos do titular** — acesso, correção, exclusão e portabilidade EXISTEM como operação real?
|
|
17
|
+
Prometer na política e não implementar é pior que não prometer.
|
|
18
|
+
|
|
19
|
+
## Dados sensíveis (tratamento reforçado)
|
|
20
|
+
|
|
21
|
+
Saúde, biometria, origem racial/étnica, convicção religiosa/política, orientação sexual, dados de
|
|
22
|
+
crianças e adolescentes: base legal mais estrita, minimização agressiva, e exposição = severidade P0.
|
|
23
|
+
|
|
24
|
+
## Sinais de não-conformidade (achados comuns)
|
|
25
|
+
|
|
26
|
+
- PII em logs/telemetria (nome, CPF, e-mail em texto plano no log).
|
|
27
|
+
- Retenção infinita (nunca se apaga nada "por segurança").
|
|
28
|
+
- Consentimento amarrado — "aceite tudo ou não use" para finalidades separáveis.
|
|
29
|
+
- Direito do titular como promessa sem função (não há endpoint que exclui/exporta).
|
|
30
|
+
- Compartilhamento com terceiro sem base nem registro.
|
|
31
|
+
|
|
32
|
+
## Como emitir o parecer
|
|
33
|
+
|
|
34
|
+
Cada não-conformidade cita: o dado concreto, o princípio/artigo violado, o risco (exposição/multa/
|
|
35
|
+
quebra de confiança) e a correção mínima. Severidade amarrada ao risco: exposição de PII sensível = P0.
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: owasp-secure-coding-gates
|
|
3
|
+
domain: security
|
|
4
|
+
agents: [qa]
|
|
5
|
+
when: "ao revisar código quanto a segurança antes de commit/merge"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# OWASP Secure Coding Gates — o que reprova ou aprova um diff
|
|
9
|
+
|
|
10
|
+
> Fonte: OWASP CheatSheetSeries (github.com/OWASP/CheatSheetSeries) — XSS Prevention,
|
|
11
|
+
> SQL Injection Prevention, Password Storage, Authentication, Session Management,
|
|
12
|
+
> Input Validation e CI/CD Security Cheat Sheets. As regras abaixo são citação/derivação direta
|
|
13
|
+
> dessas folhas, não opinião.
|
|
14
|
+
|
|
15
|
+
## O problema
|
|
16
|
+
|
|
17
|
+
Code review de segurança vira teatro quando o revisor escreve "valide o input" e "cuidado com XSS"
|
|
18
|
+
e aprova. Isso não é gate — é prosa. Um gate de verdade tem **critério binário**: olha-se o sink, o
|
|
19
|
+
contexto e o construtor da query, e decide-se REPROVA ou APROVA com base num fato verificável no
|
|
20
|
+
diff. Os tells de revisão fraca:
|
|
21
|
+
|
|
22
|
+
- "Sanitize tudo" — sanitização global no input é a **defesa errada**; o certo é encoding por
|
|
23
|
+
**contexto de saída** e parametrização na query. Quem sanitiza no input deixa passar o que importa.
|
|
24
|
+
- Aceitar `escape()` manual de aspas em SQL como mitigação ("STRONGLY DISCOURAGED" pela OWASP).
|
|
25
|
+
- Aprovar hash de senha com SHA-256/MD5 "com salt" achando que resolve.
|
|
26
|
+
- Pinar GitHub Action por tag (`@v4`) achando que é versão fixa — tag é mutável.
|
|
27
|
+
- Confiar em validação client-side de input.
|
|
28
|
+
|
|
29
|
+
## O conhecimento / os princípios
|
|
30
|
+
|
|
31
|
+
### 1. XSS — encoding é por CONTEXTO de saída, não global
|
|
32
|
+
|
|
33
|
+
A regra-mãe da OWASP: a mesma variável precisa de encoding **diferente** dependendo de **onde** ela é
|
|
34
|
+
escrita no HTML. Não existe "encoding universal". Cada contexto tem seu sink seguro e seu esquema.
|
|
35
|
+
|
|
36
|
+
| Contexto de saída | Encoding exigido | Sink seguro (aprova) | Sink perigoso (reprova) |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| Corpo HTML (`<div>$var</div>`) | HTML entity: `&`→`&` `<`→`<` `>`→`>` `"`→`"` `'`→`'` | `.textContent`, `createTextNode()`, `.insertAdjacentText()` | `innerHTML`, `outerHTML`, `document.write()` |
|
|
39
|
+
| Atributo HTML (`<div id="$var">`) | HTML attribute encoding `&#xHH;` **+ aspas obrigatórias** em volta do valor | `.setAttribute(nomeFixo, var)`, `.className` | atributo sem aspas; nome de atributo dinâmico |
|
|
40
|
+
| JavaScript (dentro de `<script>` ou `on*`) | JS encoding `\xHH`, **só em valor entre aspas** | `JSON.parse`/dados, nunca código | `eval()`, `setTimeout(str)`, `setInterval(str)`, gerar código com a var |
|
|
41
|
+
| URL (`href`/`src`) | URL encoding `%HH`, **depois** HTML attribute encoding | `encodeURIComponent(x)` | concatenar em `href` sem validar esquema (`javascript:` passa) |
|
|
42
|
+
| CSS (valor de propriedade) | só em **valor** de propriedade CSS | `style.property = x` | var em nome de propriedade ou seletor; `url(javascript:...)` |
|
|
43
|
+
|
|
44
|
+
**Contextos perigosos — REPROVA sempre que a var entra direto neles** (encoding não protege):
|
|
45
|
+
`<script>` diretamente, dentro de comentário HTML `<!-- -->`, `<style>` direto, nome de handler de
|
|
46
|
+
evento, callback de função.
|
|
47
|
+
|
|
48
|
+
**HTML autorado pelo usuário** (precisa permitir tags): único caminho aprovado é sanitização com
|
|
49
|
+
**DOMPurify** — `let clean = DOMPurify.sanitize(dirty);` — e **nunca** modificar a string depois de
|
|
50
|
+
sanitizada (re-mutação reabre o buraco).
|
|
51
|
+
|
|
52
|
+
Framework com auto-escape (React/Angular/Lit) **aprova por padrão**, mas REPROVA se o diff usa o
|
|
53
|
+
escape-hatch sem sanitização: `dangerouslySetInnerHTML` (React), `bypassSecurityTrustAs*` (Angular),
|
|
54
|
+
`unsafeHTML` (Lit), `inner-h-t-m-l` (Polymer).
|
|
55
|
+
|
|
56
|
+
### 2. SQL Injection — parametrização, não escaping
|
|
57
|
+
|
|
58
|
+
A defesa primária é **prepared statement com query parametrizada**: o SQL é definido inteiro primeiro,
|
|
59
|
+
e o valor entra como bind variable depois. Concatenar input na string da query é REPROVA imediata.
|
|
60
|
+
|
|
61
|
+
```java
|
|
62
|
+
// REPROVA — concatenação de input na query
|
|
63
|
+
String query = "SELECT account_balance FROM user_data WHERE user_name = "
|
|
64
|
+
+ request.getParameter("customerName");
|
|
65
|
+
Statement statement = connection.createStatement();
|
|
66
|
+
ResultSet rs = statement.executeQuery(query);
|
|
67
|
+
|
|
68
|
+
// APROVA — prepared statement, valor via setString
|
|
69
|
+
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";
|
|
70
|
+
PreparedStatement pstmt = connection.prepareStatement(query);
|
|
71
|
+
pstmt.setString(1, request.getParameter("customerName"));
|
|
72
|
+
ResultSet rs = pstmt.executeQuery();
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```java
|
|
76
|
+
// ORM também: HQL concatenado REPROVA
|
|
77
|
+
Query bad = session.createQuery("from Inventory where productID='" + userParam + "'");
|
|
78
|
+
// APROVA — named parameter
|
|
79
|
+
Query good = session.createQuery("from Inventory where productID=:productid");
|
|
80
|
+
good.setParameter("productid", userParam);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`escape()` manual de aspas é **"STRONGLY DISCOURAGED"** e "fragile compared to other defenses" — não
|
|
84
|
+
aceitar como mitigação suficiente.
|
|
85
|
+
|
|
86
|
+
**O que NÃO pode ser parametrizado** (bind variable não cobre): **nome de tabela, nome de coluna,
|
|
87
|
+
e ordem `ASC`/`DESC`**. Nesses casos a única defesa aprovada é **allow-list mapeando para valores
|
|
88
|
+
fixos**, nunca passar o input adiante:
|
|
89
|
+
|
|
90
|
+
```java
|
|
91
|
+
// APROVA — nome de tabela via allow-list (switch), nunca concatenado
|
|
92
|
+
switch (param) {
|
|
93
|
+
case "Value1": tableName = "fooTable"; break;
|
|
94
|
+
case "Value2": tableName = "barTable"; break;
|
|
95
|
+
default: throw new InputValidationException("unexpected value provided for table name");
|
|
96
|
+
}
|
|
97
|
+
// APROVA — sort order mapeado a literal, não concatenado do input
|
|
98
|
+
String sql = "... order by Salary " + (sortOrder ? "ASC" : "DESC");
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 3. Armazenamento de senha — ordem de algoritmo e parâmetros mínimos
|
|
102
|
+
|
|
103
|
+
Hash genérico (MD5, SHA-1, SHA-256), mesmo com salt, **REPROVA**. A OWASP define ordem de preferência
|
|
104
|
+
e parâmetros numéricos mínimos:
|
|
105
|
+
|
|
106
|
+
| Ordem | Algoritmo | Parâmetros mínimos (OWASP) |
|
|
107
|
+
|---|---|---|
|
|
108
|
+
| 1º | **Argon2id** | `m=19456` (19 MiB), `t=2`, `p=1` (ou m=47104/t=1, ou m=7168/t=5) |
|
|
109
|
+
| 2º | **scrypt** (se Argon2id indisponível) | `N=2^17` (128 MiB), `r=8`, `p=1` |
|
|
110
|
+
| 3º | **bcrypt** (legado) | work factor **≥ 10**; limite de **72 bytes** de senha |
|
|
111
|
+
| 4º | **PBKDF2** (só p/ FIPS-140) | SHA-256: **600.000** iter · SHA-512: **220.000** iter |
|
|
112
|
+
|
|
113
|
+
bcrypt tem dois caveats que REPROVAM se ignorados: o limite de 72 bytes e o **null byte** truncando o
|
|
114
|
+
hash. Pré-hash recomendado: `bcrypt(base64(hmac-sha384(data:$password, key:$pepper)), $salt, $cost)`.
|
|
115
|
+
|
|
116
|
+
**Pepper** (opcional, reforça): é compartilhado entre as senhas, **não** é armazenado junto do hash —
|
|
117
|
+
fica em secrets vault/HSM, separado do banco.
|
|
118
|
+
|
|
119
|
+
### 4. Autenticação — lockout, mensagens genéricas, comprimento, MFA
|
|
120
|
+
|
|
121
|
+
| Regra | Critério (REPROVA se violado) |
|
|
122
|
+
|---|---|
|
|
123
|
+
| Anti-brute-force | Lockout por **conta** (não por IP). Threshold + janela de observação + duração; ideal **exponencial** (1s dobrando a cada falha). CAPTCHA/throttling complementam. |
|
|
124
|
+
| Mensagem de erro | **Genérica e idêntica** p/ usuário inexistente, senha errada ou conta desabilitada: `"Login failed; Invalid user ID or password."` Revelar qual falhou = enumeração = REPROVA. |
|
|
125
|
+
| Recuperação de senha | Mensagem genérica: `"If that email address is in our database, we will send you an email to reset your password"`. |
|
|
126
|
+
| Comprimento mínimo | **8** com MFA ativo · **15** sem MFA. Máximo **≥ 64** (permitir passphrase). Aceitar Unicode/espaço; sem regra de composição obrigatória. |
|
|
127
|
+
| MFA | "by far the best defense" — teria prevenido **99.9%** dos comprometimentos. Exigir em fluxos sensíveis. |
|
|
128
|
+
|
|
129
|
+
### 5. Gestão de sessão — atributos de cookie e ciclo de vida
|
|
130
|
+
|
|
131
|
+
Cookie de sessão tem que carregar **todos** estes atributos — falta de qualquer um REPROVA:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
Set-Cookie: __Host-SessionID=<value>; Secure; HttpOnly; SameSite=Strict; Path=/
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
| Atributo | Exigência |
|
|
138
|
+
|---|---|
|
|
139
|
+
| `Secure` | obrigatório — só trafega via HTTPS |
|
|
140
|
+
| `HttpOnly` | obrigatório — JS não lê via `document.cookie` (corta roubo por XSS) |
|
|
141
|
+
| `SameSite` | `Strict` (preferido) ou `Lax`. **Nunca** `None` sem `Secure`. |
|
|
142
|
+
| Prefixo `__Host-` | recomendado p/ session ID (força Secure + Path=/ + sem Domain) |
|
|
143
|
+
|
|
144
|
+
| Propriedade | Critério |
|
|
145
|
+
|---|---|
|
|
146
|
+
| Entropia do session ID | **≥ 64 bits** (≥ 16 chars hex); gerar via **CSPRNG** com saída ≥ 128 bits. Conteúdo "meaningless" — sem PII. |
|
|
147
|
+
| Idle timeout | 2–5 min (alto valor) · 15–30 min (baixo risco) |
|
|
148
|
+
| Absolute timeout | 4–8 h |
|
|
149
|
+
| Regeneração | **Regenerar o ID após login / qualquer mudança de privilégio** (`session_regenerate_id(true)` em PHP). Não regenerar = fixação de sessão = REPROVA. |
|
|
150
|
+
| Logout | Invalidar server-side (framework) **e** expirar o cookie no cliente (`Expires` no passado / `Max-Age=0`); `Cache-Control: no-store`. |
|
|
151
|
+
|
|
152
|
+
### 6. Validação de input — allow-list, server-side, e não é defesa primária
|
|
153
|
+
|
|
154
|
+
| Princípio | Regra |
|
|
155
|
+
|---|---|
|
|
156
|
+
| Allow-list > deny-list | Defina **o que É permitido**; tudo o mais é negado. Deny-list "é trivial de burlar" e bloqueia input válido (`O'Brian`). Deny-list só como camada extra, nunca primária. |
|
|
157
|
+
| Onde validar | **Server-side, antes de processar.** Validação client-side (JS) "can be circumvented" — não conta como controle. |
|
|
158
|
+
| Syntactic vs semantic | Syntactic: formato (SSN, data, moeda). Semantic: regra de negócio (start < end, preço na faixa). |
|
|
159
|
+
| Escopo | Validação **não** é defesa primária contra XSS/SQLi — "should not be used as the primary method". Reduz impacto, mas **encoding por contexto e parametrização continuam sendo a defesa primária**. Aprovar input validation no lugar de parametrização = REPROVA. |
|
|
160
|
+
|
|
161
|
+
### 7. Segurança de CI/CD — secrets, least-privilege, pin por SHA
|
|
162
|
+
|
|
163
|
+
| Área | Critério (REPROVA se violado) |
|
|
164
|
+
|---|---|
|
|
165
|
+
| Secrets no código | **Nunca** hardcoded em repo ou config de pipeline. Detectar com **git-leaks/git-secrets**. Não imprimir/logar em console, log ou histórico de comando. |
|
|
166
|
+
| Vault + credenciais curtas | Usar HashiCorp Vault / AWS Secrets Manager / CyberArk. Preferir **credenciais temporárias/OTP** (ou OIDC) a token longevo. |
|
|
167
|
+
| Least privilege | "deny by default". Pipeline com mínimo de permissão; conta de OS do runner **sem root**. Não compartilhar credencial entre pipelines de sensibilidades diferentes. |
|
|
168
|
+
| Pin de dependência/action | **Version pinning + verificação de hash/checksum** contra hash bom conhecido. Em lockfile (`package-lock.json`/`Pipfile.lock`) e **enforce o lockfile**. Para GitHub Actions, pinar por **commit SHA** (tag é mutável → REPROVA pinar por `@v4`). |
|
|
169
|
+
| SCM | Branches protegidos; PR **revisado e não-bypassável** antes do merge; **sem auto-merge**; MFA habilitado; commits **assinados** (Sigstore/Signserver). |
|
|
170
|
+
| Execução | Builds em nós isolados; comunicação SCM↔CI via **TLS 1.2+**; restringir acesso por IP; **aprovação manual** antes de deploy em produção; Docker **sem `--privileged`**. |
|
|
171
|
+
| Logs | Formato parseável (JSON/syslog); **nunca** logar senha/token/API key em texto puro; centralizar em SIEM com alertas. |
|
|
172
|
+
|
|
173
|
+
## Checklist (responda — qualquer "não" reprova o diff)
|
|
174
|
+
|
|
175
|
+
XSS
|
|
176
|
+
- [ ] Toda var dinâmica usa encoding do **contexto** correto (HTML body / attr / JS / URL / CSS)?
|
|
177
|
+
- [ ] Nenhum `innerHTML`/`document.write`/`eval`/`setTimeout(string)` com dado de usuário?
|
|
178
|
+
- [ ] HTML autorado pelo usuário passa por **DOMPurify** e não é mutado depois?
|
|
179
|
+
- [ ] Nenhum escape-hatch de framework (`dangerouslySetInnerHTML`, `bypassSecurityTrustAs*`) sem sanitização?
|
|
180
|
+
|
|
181
|
+
SQLi
|
|
182
|
+
- [ ] Toda query usa **prepared statement / bind variable** (zero concatenação de input)?
|
|
183
|
+
- [ ] Nome de tabela/coluna/`ASC|DESC` vem de **allow-list**, não do input?
|
|
184
|
+
- [ ] Nenhuma mitigação baseada só em `escape()` de aspas?
|
|
185
|
+
|
|
186
|
+
Auth & senha
|
|
187
|
+
- [ ] Senha hasheada com **Argon2id/scrypt/bcrypt** nos parâmetros mínimos (não SHA/MD5)?
|
|
188
|
+
- [ ] Lockout por conta + mensagem de erro genérica (sem enumeração)?
|
|
189
|
+
- [ ] Mínimo 8 (c/ MFA) ou 15 (s/ MFA), máximo ≥ 64?
|
|
190
|
+
|
|
191
|
+
Sessão
|
|
192
|
+
- [ ] Cookie com `Secure; HttpOnly; SameSite=Strict/Lax` (e `__Host-` no session ID)?
|
|
193
|
+
- [ ] ID com ≥ 128 bits de CSPRNG; **regenerado no login**; invalidado no logout?
|
|
194
|
+
- [ ] Idle e absolute timeout definidos?
|
|
195
|
+
|
|
196
|
+
Input & CI/CD
|
|
197
|
+
- [ ] Validação **allow-list, server-side** — e não substituindo parametrização/encoding?
|
|
198
|
+
- [ ] Zero secret hardcoded; vault + credencial curta/OIDC?
|
|
199
|
+
- [ ] Actions/deps pinadas por **SHA + hash** em lockfile enforçado; runner sem root, sem `--privileged`?
|
|
200
|
+
- [ ] PR revisado não-bypassável, sem auto-merge, aprovação manual p/ produção?
|
|
201
|
+
|
|
202
|
+
## Tabela de decisão "use X quando Y"
|
|
203
|
+
|
|
204
|
+
| Quando (Y) | Use (X) |
|
|
205
|
+
|---|---|
|
|
206
|
+
| Var vai dentro de `<div>`/corpo HTML | HTML entity encoding ou `.textContent` |
|
|
207
|
+
| Var vai num atributo HTML (`id`, `class`...) | attribute encoding `&#xHH;` + aspas + `setAttribute(nomeFixo, var)` |
|
|
208
|
+
| Var vai dentro de `<script>` / handler `on*` | JS encoding `\xHH` só em valor entre aspas; nunca gerar código |
|
|
209
|
+
| Var vira `href`/`src` | `encodeURIComponent` + attribute encoding; validar esquema (bloquear `javascript:`) |
|
|
210
|
+
| Usuário precisa enviar HTML rico | DOMPurify, sem mutar depois |
|
|
211
|
+
| Valor de usuário num `WHERE`/`VALUES` | prepared statement + bind variable |
|
|
212
|
+
| Parte da query é nome de tabela/coluna/sort | allow-list → literal fixo (switch/map) |
|
|
213
|
+
| Armazenar senha nova | Argon2id (m=19456,t=2,p=1); senha longa → pré-hash bcrypt c/ HMAC |
|
|
214
|
+
| Compliance FIPS-140 impede Argon2 | PBKDF2-HMAC-SHA256 600k iter |
|
|
215
|
+
| Cookie de sessão | `__Host-`/`Secure; HttpOnly; SameSite=Strict; Path=/` |
|
|
216
|
+
| Após autenticar / elevar privilégio | regenerar session ID |
|
|
217
|
+
| Filtrar input de usuário | allow-list, server-side (complemento, não substituto de encoding/parametrização) |
|
|
218
|
+
| Credencial no pipeline | vault + token curto/OIDC, nunca hardcoded |
|
|
219
|
+
| Consumir GitHub Action / dependência externa | pin por commit SHA + hash em lockfile enforçado |
|
|
220
|
+
| Pipeline acessa recurso de plataforma | least privilege, deny-by-default, runner sem root |
|