oxe-cc 0.9.1 → 0.9.3

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.
@@ -9,7 +9,7 @@ oxe_tool_profile: review_heavy
9
9
  oxe_confidence_policy: explicit
10
10
  oxe_context_tier: standard
11
11
  oxe_contract_version: 2.0.0
12
- oxe_semantics_hash: 5afa357495cad615
12
+ oxe_semantics_hash: 8f2925a220ed9bc2
13
13
  ---
14
14
 
15
15
  OXE — Retrospectiva de ciclo: 3–5 lições prescritivas em .oxe/LESSONS.md para ciclos futuros
@@ -25,7 +25,7 @@ OXE — Retrospectiva de ciclo: 3–5 lições prescritivas em .oxe/LESSONS.md p
25
25
  - **Política de confiança:** explícita
26
26
  - **Tier de contexto padrão:** padrão
27
27
  - **Versão do contrato:** 2.0.0
28
- - **Checksum semântico:** `5afa357495cad615`
28
+ - **Checksum semântico:** `8f2925a220ed9bc2`
29
29
  - **Entrada de contexto prioritária:** `.oxe/context/packs/retro.md` e `.oxe/context/packs/retro.json`
30
30
  - **Regra pack-first:** ler o context pack primeiro; se estiver stale, incompleto ou ausente, cair para leitura direta com fallback explícito.
31
31
  - **Inspeção estruturada:** `oxe-cc context inspect --workflow retro --json`
@@ -9,7 +9,7 @@ oxe_tool_profile: read_heavy
9
9
  oxe_confidence_policy: explicit
10
10
  oxe_context_tier: standard
11
11
  oxe_contract_version: 2.0.0
12
- oxe_semantics_hash: 482d3eb12fe261ed
12
+ oxe_semantics_hash: 598fcdce72e894c8
13
13
  ---
14
14
 
15
15
  OXE — Spec em 5 fases: perguntas → pesquisa → requisitos (R-ID v1/v2/fora) → roteiro (.oxe/ROADMAP.md) → aprovação → plan
@@ -25,7 +25,7 @@ OXE — Spec em 5 fases: perguntas → pesquisa → requisitos (R-ID v1/v2/fora)
25
25
  - **Política de confiança:** explícita
26
26
  - **Tier de contexto padrão:** padrão
27
27
  - **Versão do contrato:** 2.0.0
28
- - **Checksum semântico:** `482d3eb12fe261ed`
28
+ - **Checksum semântico:** `598fcdce72e894c8`
29
29
  - **Entrada de contexto prioritária:** `.oxe/context/packs/spec.md` e `.oxe/context/packs/spec.json`
30
30
  - **Regra pack-first:** ler o context pack primeiro; se estiver stale, incompleto ou ausente, cair para leitura direta com fallback explícito.
31
31
  - **Inspeção estruturada:** `oxe-cc context inspect --workflow spec --json`
@@ -11,7 +11,7 @@ oxe_tool_profile: review_heavy
11
11
  oxe_confidence_policy: explicit
12
12
  oxe_context_tier: standard
13
13
  oxe_contract_version: 2.0.0
14
- oxe_semantics_hash: 5afa357495cad615
14
+ oxe_semantics_hash: 8f2925a220ed9bc2
15
15
  ---
16
16
 
17
17
  <!-- oxe-reasoning-contract:start -->
@@ -25,7 +25,7 @@ oxe_semantics_hash: 5afa357495cad615
25
25
  - **Política de confiança:** explícita
26
26
  - **Tier de contexto padrão:** padrão
27
27
  - **Versão do contrato:** 2.0.0
28
- - **Checksum semântico:** `5afa357495cad615`
28
+ - **Checksum semântico:** `8f2925a220ed9bc2`
29
29
  - **Entrada de contexto prioritária:** `.oxe/context/packs/retro.md` e `.oxe/context/packs/retro.json`
30
30
  - **Regra pack-first:** ler o context pack primeiro; se estiver stale, incompleto ou ausente, cair para leitura direta com fallback explícito.
31
31
  - **Inspeção estruturada:** `oxe-cc context inspect --workflow retro --json`
@@ -11,7 +11,7 @@ oxe_tool_profile: read_heavy
11
11
  oxe_confidence_policy: explicit
12
12
  oxe_context_tier: standard
13
13
  oxe_contract_version: 2.0.0
14
- oxe_semantics_hash: 482d3eb12fe261ed
14
+ oxe_semantics_hash: 598fcdce72e894c8
15
15
  ---
16
16
 
17
17
  <!-- oxe-reasoning-contract:start -->
@@ -25,7 +25,7 @@ oxe_semantics_hash: 482d3eb12fe261ed
25
25
  - **Política de confiança:** explícita
26
26
  - **Tier de contexto padrão:** padrão
27
27
  - **Versão do contrato:** 2.0.0
28
- - **Checksum semântico:** `482d3eb12fe261ed`
28
+ - **Checksum semântico:** `598fcdce72e894c8`
29
29
  - **Entrada de contexto prioritária:** `.oxe/context/packs/spec.md` e `.oxe/context/packs/spec.json`
30
30
  - **Regra pack-first:** ler o context pack primeiro; se estiver stale, incompleto ou ausente, cair para leitura direta com fallback explícito.
31
31
  - **Inspeção estruturada:** `oxe-cc context inspect --workflow spec --json`
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  [![npm](https://img.shields.io/npm/v/oxe-cc.svg?style=flat-square)](https://www.npmjs.com/package/oxe-cc)
8
8
  [![license](https://img.shields.io/npm/l/oxe-cc.svg?style=flat-square)](LICENSE)
9
9
 
10
- **Versão:** `0.8.0` · [package.json](package.json)
10
+ **Versão:** `0.9.3` · [package.json](package.json)
11
11
 
12
12
  **Framework OXE — Orchestrated eXperience Engineering**
13
13
 
package/bin/banner.txt CHANGED
@@ -15,4 +15,4 @@
15
15
 
16
16
  ══════════════════════════════════════════════════════
17
17
 
18
- v0.7.1
18
+ v0.9.3
@@ -256,6 +256,7 @@ function resolveArtifactCandidates(projectRoot, activeSession) {
256
256
  phase_summary: withFallback('phase_summary', 'summary', ctx.phaseSummaryJson, null, 'project'),
257
257
  context_pack_dashboard: withFallback('context_pack_dashboard', 'context_pack', ctx.defaultPackJson('dashboard'), null, 'project'),
258
258
  calibration: withFallback('calibration', 'calibration', path.join(base.oxe, 'calibration.json'), null, 'project'),
259
+ lessons_metrics: withFallback('lessons_metrics', 'metrics', path.join(base.oxe, 'lessons-metrics.json'), null, 'project'),
259
260
  };
260
261
  }
261
262
 
package/bin/oxe-cc.js CHANGED
@@ -590,6 +590,64 @@ function runtimeSemanticsManifestPath(opts) {
590
590
  return path.join(path.resolve(opts.dir), '.oxe', 'install', 'runtime-semantics.json');
591
591
  }
592
592
 
593
+ /**
594
+ * Instala a extensão VS Code OXE Agents via `code --install-extension`.
595
+ * Não falha a instalação global se o VS Code CLI não estiver disponível.
596
+ * @param {{ dryRun?: boolean, force?: boolean }} opts
597
+ */
598
+ function installVscodeExtension(opts) {
599
+ const c = useAnsiColors();
600
+ const extDir = path.join(PKG_ROOT, 'vscode-extension');
601
+
602
+ // Encontrar o VSIX mais recente na pasta da extensão
603
+ let vsixPath = null;
604
+ if (fs.existsSync(extDir)) {
605
+ const vsixFiles = fs.readdirSync(extDir)
606
+ .filter((f) => f.startsWith('oxe-agents') && f.endsWith('.vsix'))
607
+ .sort()
608
+ .reverse();
609
+ if (vsixFiles.length > 0) vsixPath = path.join(extDir, vsixFiles[0]);
610
+ }
611
+
612
+ if (!vsixPath) {
613
+ console.log(` ${c ? dim : ''}VS Code extension${c ? reset : ''} VSIX não encontrado — pulando.`);
614
+ return;
615
+ }
616
+
617
+ if (opts.dryRun) {
618
+ console.log(`${dim}vscode${reset} (dry-run) code --install-extension "${vsixPath}"`);
619
+ return;
620
+ }
621
+
622
+ // Candidatos ao CLI do VS Code (Windows precisa do .cmd)
623
+ const codeCandidates = process.platform === 'win32'
624
+ ? ['code.cmd', 'code', 'code-insiders.cmd', 'code-insiders']
625
+ : ['code', 'code-insiders'];
626
+
627
+ const { spawnSync } = require('child_process');
628
+ for (const codeBin of codeCandidates) {
629
+ try {
630
+ const result = spawnSync(
631
+ codeBin,
632
+ ['--install-extension', vsixPath, '--force'],
633
+ { encoding: 'utf8', timeout: 30000, shell: process.platform === 'win32' }
634
+ );
635
+ if (result.status === 0) {
636
+ console.log(` ${c ? green : ''}✓${c ? reset : ''} VS Code extension instalada: ${c ? cyan : ''}OXE Agents${c ? reset : ''} (${path.basename(vsixPath)})`);
637
+ return;
638
+ }
639
+ } catch {
640
+ /* tenta próximo candidato */
641
+ }
642
+ }
643
+
644
+ // code CLI não encontrado no PATH — instrução manual
645
+ console.log(
646
+ ` ${c ? dim : ''}VS Code extension${c ? reset : ''} ${c ? yellow : ''}(instalação manual necessária)${c ? reset : ''}\n` +
647
+ ` ${c ? cyan : ''}code --install-extension "${vsixPath}"${c ? reset : ''}`
648
+ );
649
+ }
650
+
593
651
  /** Integração legado do Copilot VS Code em ~/.copilot/. */
594
652
  function copilotLegacyPromptDir(opts) {
595
653
  return path.join(copilotUserDir(opts), 'prompts');
@@ -2523,6 +2581,9 @@ function runInstall(opts) {
2523
2581
  oxeManifest.writeFileManifest(home, mergedManifest, readPkgVersion());
2524
2582
  }
2525
2583
 
2584
+ // Instalar extensão VS Code OXE Agents (sempre tenta, falha graciosamente)
2585
+ installVscodeExtension(opts);
2586
+
2526
2587
  printSummaryAndNextSteps(c, buildInstallSummary(opts, fullLayout));
2527
2588
  if (opts.copilot) {
2528
2589
  const copilotReport = oxeHealth.copilotIntegrationReport(target);
@@ -17,7 +17,7 @@ oxe_tool_profile: review_heavy
17
17
  oxe_confidence_policy: explicit
18
18
  oxe_context_tier: standard
19
19
  oxe_contract_version: 2.0.0
20
- oxe_semantics_hash: 5afa357495cad615
20
+ oxe_semantics_hash: 8f2925a220ed9bc2
21
21
  ---
22
22
 
23
23
  <!-- oxe-reasoning-contract:start -->
@@ -31,7 +31,7 @@ oxe_semantics_hash: 5afa357495cad615
31
31
  - **Política de confiança:** explícita
32
32
  - **Tier de contexto padrão:** padrão
33
33
  - **Versão do contrato:** 2.0.0
34
- - **Checksum semântico:** `5afa357495cad615`
34
+ - **Checksum semântico:** `8f2925a220ed9bc2`
35
35
  - **Entrada de contexto prioritária:** `.oxe/context/packs/retro.md` e `.oxe/context/packs/retro.json`
36
36
  - **Regra pack-first:** ler o context pack primeiro; se estiver stale, incompleto ou ausente, cair para leitura direta com fallback explícito.
37
37
  - **Inspeção estruturada:** `oxe-cc context inspect --workflow retro --json`
@@ -15,7 +15,7 @@ oxe_tool_profile: read_heavy
15
15
  oxe_confidence_policy: explicit
16
16
  oxe_context_tier: standard
17
17
  oxe_contract_version: 2.0.0
18
- oxe_semantics_hash: 482d3eb12fe261ed
18
+ oxe_semantics_hash: 598fcdce72e894c8
19
19
  ---
20
20
 
21
21
  <!-- oxe-reasoning-contract:start -->
@@ -29,7 +29,7 @@ oxe_semantics_hash: 482d3eb12fe261ed
29
29
  - **Política de confiança:** explícita
30
30
  - **Tier de contexto padrão:** padrão
31
31
  - **Versão do contrato:** 2.0.0
32
- - **Checksum semântico:** `482d3eb12fe261ed`
32
+ - **Checksum semântico:** `598fcdce72e894c8`
33
33
  - **Entrada de contexto prioritária:** `.oxe/context/packs/spec.md` e `.oxe/context/packs/spec.json`
34
34
  - **Regra pack-first:** ler o context pack primeiro; se estiver stale, incompleto ou ausente, cair para leitura direta com fallback explícito.
35
35
  - **Inspeção estruturada:** `oxe-cc context inspect --workflow spec --json`
@@ -0,0 +1,13 @@
1
+ {
2
+ "schema_version": "1.0.0",
3
+ "updated": "{{date}}",
4
+ "lessons": [],
5
+ "quality_contracts": [],
6
+ "summary": {
7
+ "total_lessons": 0,
8
+ "active": 0,
9
+ "deprecated": 0,
10
+ "high_impact": 0,
11
+ "avg_success_rate": null
12
+ }
13
+ }
@@ -0,0 +1,295 @@
1
+ # OXE — Quality Contract Elevation (Spec Fase 3.5)
2
+
3
+ <objective>
4
+ Transformar a Fase 3.5 de uma lista de checklist em um **Contrato de Qualidade** formal: um conjunto de compromissos mensuráveis que o projeto assume antes de qualquer linha de código. Cada item recusado torna-se um risco documentado com severidade e responsável — não silenciosamente ignorado.
5
+
6
+ Cobre 6 dimensões: Segurança, Resiliência, Observabilidade, Confiança de Dados, Acessibilidade e Prontidão Operacional.
7
+ </objective>
8
+
9
+ ---
10
+
11
+ ## Conceito fundamental
12
+
13
+ Um checklist pergunta: *"você fez X?"*
14
+ Um contrato de qualidade pergunta: *"a que piso de qualidade este sistema se compromete antes de ser construído?"*
15
+
16
+ A diferença prática:
17
+ - Itens aprovados → viram **R-RB-NN** na spec → **Tn** no plan → verificados no verify
18
+ - Itens recusados → entram no **Accepted Risk Registry** com severidade, justificativa e responsável
19
+ - Nenhum risco some silenciosamente
20
+
21
+ ---
22
+
23
+ ## Parte I — Detector de Arquitetura (executa sempre, antes de qualquer checklist)
24
+
25
+ Oito cheiros detectáveis a partir da spec e stack descritos. Cada um detectado gera uma observação estruturada — não um bloqueio, mas um sinalizador que alimenta os checklists das Partes seguintes.
26
+
27
+ | Smell | Sinal de detecção na spec | Risco gerado |
28
+ |-------|--------------------------|--------------|
29
+ | **AS-1 God Module** | Um único módulo/serviço cobre domínios não relacionados (ex.: auth + billing + notificações) | Acoplamento oculto; mudança em um domínio quebra outro |
30
+ | **AS-2 Máquina de Estado Implícita** | Requisitos descrevem estados (rascunho, publicado, arquivado) sem tabela de transições explícita | Transições ilegais possíveis; comportamento indefinido em edge cases |
31
+ | **AS-3 Sem Escape Assíncrono** | Todas as operações descritas como síncronas; nenhuma menção a filas, eventos ou jobs para operações longas | Timeouts em cascata; usuário travado aguardando operações de longa duração |
32
+ | **AS-4 Serviço Escuro** | Nenhum requisito menciona logs, métricas ou rastreamento | Impossível diagnosticar falhas em produção; debugging cego |
33
+ | **AS-5 Coleta Ilimitada** | Dados são coletados mas sem política de retenção, arquivamento ou deleção | Crescimento de banco ilimitado; risco LGPD/GDPR por dados retidos além do necessário |
34
+ | **AS-6 Ponto Único de Falha Crítico** | Caminho crítico (auth, pagamento, core business) sem fallback, retry ou degradação definida | Falha de um componente derruba toda a operação |
35
+ | **AS-7 API Sem Versão** | API pública descrita sem estratégia de versionamento ou deprecação | Mudanças futuras quebram clientes sem aviso; impossível evoluir contrato |
36
+ | **AS-8 Deploy Acoplado** | Dois ou mais serviços/módulos distintos sempre fazem deploy juntos | Perda de autonomia; velocidade limitada pelo componente mais lento |
37
+
38
+ **Ação:** para cada smell detectado, mencionar ao usuário antes dos checklists: *"Identifiquei AS-N [nome]: [sinal encontrado]. Vamos abordar isso nos requisitos ou prefere registrar como risco?"*
39
+
40
+ ---
41
+
42
+ ## Parte II — Derivação de Ameaças (STRIDE)
43
+
44
+ Em vez de propor mitigações genéricas, derivar as **ameaças concretas** da arquitetura descrita e mapear mitigações ao vetor específico. O usuário vê *por que* cada controle existe, não apenas *o que* fazer.
45
+
46
+ **Domínios → Vetores STRIDE:**
47
+
48
+ | Domínio | Ameaça | Categoria STRIDE | Mitigações relacionadas |
49
+ |---------|--------|-----------------|------------------------|
50
+ | AUTH | Impostura de credenciais (brute force, credential stuffing) | **S**poofing | RB-SEC-A1, RB-SEC-A2, RB-SEC-A3 |
51
+ | AUTH | Sequestro de sessão (token roubado via XSS ou rede) | **S**poofing + **I**nformation Disclosure | RB-SEC-A4, RB-SEC-A7 |
52
+ | AUTH | Escalada de privilégio (acesso a recursos de outro usuário) | **E**levation of Privilege | RB-SEC-A4, RB-SEC-A7 |
53
+ | AUTH | Ausência de trilha de auditoria (negação de ações realizadas) | **R**epudiation | RB-OBS-L3 |
54
+ | API | Falsificação de requisição (CSRF, replay attacks) | **T**ampering | RB-SEC-H2, RB-SEC-A7 |
55
+ | API | Esgotamento de recursos (flood de requisições) | **D**enial of Service | RB-SEC-H3, RB-SEC-A2 |
56
+ | API | Vazamento de informação (stack traces, mensagens internas) | **I**nformation Disclosure | RB-SEC-H4, RB-OBS-L1 |
57
+ | DB | Injeção de dados (SQL/NoSQL injection) | **T**ampering | RB-SEC-D1 |
58
+ | DB | Exposição de dados sensíveis em repouso | **I**nformation Disclosure | RB-TRUST-T3 |
59
+ | DB | Ausência de auditoria de acesso a dados PII | **R**epudiation | RB-TRUST-T4 |
60
+ | FRONTEND | Injeção de script (XSS) | **T**ampering + **S**poofing | RB-SEC-F2 |
61
+ | FRONTEND | Token exposto em armazenamento acessível por script | **I**nformation Disclosure | RB-SEC-F1 |
62
+ | FILE | Execução de arquivo malicioso (malware upload) | **E**levation of Privilege | RB-SEC-FI1, RB-SEC-FI3 |
63
+ | FILE | Esgotamento de disco (upload bombs) | **D**enial of Service | RB-SEC-FI2 |
64
+
65
+ **Uso:** ao propor RB-SEC-NN ao usuário, referenciar a ameaça: *"RB-SEC-A2 (rate limiting) mitiga S1 — impostura de credencial por brute force identificada na sua arquitetura de login."*
66
+
67
+ ---
68
+
69
+ ## Parte III — 6 Dimensões de Qualidade
70
+
71
+ ### Sistema de Tiers
72
+
73
+ | Tier | Nome | Significado | Risco se recusado |
74
+ |------|------|-------------|-------------------|
75
+ | 🔴 **Piso** | Floor | Ausente = falha ativa conhecida. Recusar = P0 no Accepted Risk Registry | P0 — bloqueia verify se `security_in_verify: true` |
76
+ | 🟡 **Base** | Foundation | Ausente = risco operacional significativo. Recusar = P1 documentado | P1 — consta no SECURITY.md / CONCERNS.md |
77
+ | 🟢 **Excelência** | Excellence | Diferencia sistemas bons de ótimos. Recusar = P2 ou mover para v2 sem fricção | P2 — registrado, não bloqueia |
78
+
79
+ ---
80
+
81
+ ### DIM-SEC — Segurança
82
+
83
+ | ID | Critério | Ameaça mitigada | Tier |
84
+ |----|----------|----------------|------|
85
+ | RB-SEC-A1 | Senhas hashed com bcrypt ou argon2 (salt rounds ≥ 10) | S1 Credential Spoofing | 🔴 Piso |
86
+ | RB-SEC-A2 | Rate limiting no login (≤ 10 tentativas / 15min / IP) | S1 Brute Force, D1 Flood | 🔴 Piso |
87
+ | RB-SEC-A3 | Comparação timing-safe em credenciais e tokens | S1 Timing Attack | 🔴 Piso |
88
+ | RB-SEC-A4 | Tokens de acesso em httpOnly cookie (nunca localStorage) | S2 Session Hijacking | 🔴 Piso |
89
+ | RB-SEC-A7 | CSRF protection (double-submit ou SameSite=Strict) | T1 Request Forgery | 🔴 Piso |
90
+ | RB-SEC-H1 | Security headers via Helmet ou equivalente | I1 Information Disclosure | 🔴 Piso |
91
+ | RB-SEC-H2 | CORS restrito a origens explícitas (sem `*` em produção) | T1 Request Forgery | 🔴 Piso |
92
+ | RB-SEC-H4 | Validação de schema em todas as entradas (Zod, Joi, etc.) | T1 Tampering, I1 Disclosure | 🔴 Piso |
93
+ | RB-SEC-D1 | Queries parametrizadas — sem interpolação de input | T2 Injection | 🔴 Piso |
94
+ | RB-SEC-F2 | Sanitização antes de `innerHTML` / `dangerouslySetInnerHTML` | T1 XSS | 🔴 Piso |
95
+ | RB-SEC-FI1 | Validação de MIME no servidor para uploads | EP1 Malware | 🔴 Piso |
96
+ | RB-SEC-H3 | Body size limit configurado | D1 Resource Exhaustion | 🟡 Base |
97
+ | RB-SEC-A5 | Refresh token com rotação + revogação persistida | S2 Session Hijacking | 🟡 Base |
98
+ | RB-SEC-FI3 | Nomes de arquivo sanitizados (sem path traversal) | EP1 Traversal | 🟡 Base |
99
+ | RB-SEC-D3 | Erros sem expor stack trace ou mensagens internas | I1 Information Disclosure | 🟡 Base |
100
+ | RB-SEC-FI2 | Limite de tamanho de arquivo configurável | D1 Disk Exhaustion | 🟡 Base |
101
+ | RB-SEC-A6 | Expiração de sessão configurável via env | EP1 Stale Session | 🟢 Excelência |
102
+ | RB-SEC-F3 | Links externos com `rel="noopener noreferrer"` | EP1 Tab Hijacking | 🟢 Excelência |
103
+
104
+ *Critérios Piso que não se aplicam em MVPs demo sem usuários reais: RB-SEC-A1, RB-SEC-A5 — marcar `fora` com justificativa explícita.*
105
+
106
+ ---
107
+
108
+ ### DIM-RES — Resiliência
109
+
110
+ Aplicar quando: qualquer dependência externa (API terceira, DB, serviço interno, fila).
111
+
112
+ | ID | Critério | Padrão de resiliência | Tier |
113
+ |----|----------|-----------------------|------|
114
+ | RB-RES-1 | Timeout explícito em todas as chamadas externas (DB, HTTP, filas) | Timeout | 🔴 Piso |
115
+ | RB-RES-2 | Comportamento definido quando dependência externa falha (fallback, erro amigável, degradação parcial) | Graceful Degradation | 🔴 Piso |
116
+ | RB-RES-3 | Retry com backoff exponencial + jitter em operações transitórias | Retry | 🟡 Base |
117
+ | RB-RES-4 | Circuit breaker em chamadas a serviços críticos (abre após N falhas consecutivas) | Circuit Breaker | 🟡 Base |
118
+ | RB-RES-5 | Operações longas (> 2s) executadas de forma assíncrona (fila, job, evento) | Async Escape Valve | 🟡 Base |
119
+ | RB-RES-6 | Idempotência garantida em operações críticas (pagamento, envio de email, criação de recurso) | Idempotency | 🟡 Base |
120
+ | RB-RES-7 | Bulkhead: pool de recursos isolado por tipo de operação (leitura vs escrita, rápido vs lento) | Bulkhead | 🟢 Excelência |
121
+ | RB-RES-8 | SLO definido: disponibilidade alvo (ex.: 99.9%) e latência p99 (ex.: < 500ms) | SLO | 🟢 Excelência |
122
+
123
+ ---
124
+
125
+ ### DIM-OBS — Observabilidade
126
+
127
+ Aplicar quando: qualquer serviço com endpoints HTTP, jobs, ou processamento de dados.
128
+
129
+ | ID | Critério | Pilar | Tier |
130
+ |----|----------|-------|------|
131
+ | RB-OBS-H1 | Endpoint `/health` ou `/api/health` retorna status 200 quando saudável | Health | 🔴 Piso |
132
+ | RB-OBS-L1 | Logs estruturados (JSON) com nível, timestamp, request_id e contexto de negócio | Logs | 🔴 Piso |
133
+ | RB-OBS-L2 | Erros críticos logados com stack trace + contexto suficiente para reproduzir | Logs | 🔴 Piso |
134
+ | RB-OBS-L3 | Ações sensíveis logadas com user_id e timestamp (login, logout, mudança de permissão, deleção) | Logs + Audit | 🟡 Base |
135
+ | RB-OBS-M1 | Métricas básicas expostas: latência de endpoint, taxa de erro, throughput | Metrics | 🟡 Base |
136
+ | RB-OBS-M2 | Alerta definido para degradação acima do threshold (ex.: error rate > 1% por 5min) | Alerting | 🟡 Base |
137
+ | RB-OBS-T1 | Request ID propagado em todos os serviços/chamadas de uma requisição | Traces | 🟢 Excelência |
138
+ | RB-OBS-T2 | Tracing distribuído (OpenTelemetry ou equivalente) para caminhos críticos | Traces | 🟢 Excelência |
139
+ | RB-OBS-D1 | Dashboard de golden signals: latência, tráfego, erros, saturação | Dashboard | 🟢 Excelência |
140
+
141
+ ---
142
+
143
+ ### DIM-TRUST — Confiança de Dados (LGPD / GDPR)
144
+
145
+ Aplicar quando: qualquer dado pessoal coletado (nome, email, CPF, IP, localização, comportamento).
146
+
147
+ | ID | Critério | Princípio legal | Tier |
148
+ |----|----------|----------------|------|
149
+ | RB-TRUST-T1 | Tabela de dados pessoais: campo, finalidade, base legal, quem acessa, tempo de retenção | Minimização + Finalidade | 🔴 Piso |
150
+ | RB-TRUST-T2 | Somente campos estritamente necessários à finalidade declarada são coletados | Minimização | 🔴 Piso |
151
+ | RB-TRUST-T3 | Dados sensíveis criptografados em repouso (campo ou disco) | Segurança | 🔴 Piso |
152
+ | RB-TRUST-T4 | Acesso a dados PII logado com user_id e timestamp (auditoria de acesso) | Responsabilização | 🟡 Base |
153
+ | RB-TRUST-T5 | Política de retenção automatizada: dados deletados ou anonimizados após N dias | Limitação de Retenção | 🟡 Base |
154
+ | RB-TRUST-T6 | Capacidade de exportar todos os dados de um usuário (portabilidade LGPD Art. 18) | Portabilidade | 🟡 Base |
155
+ | RB-TRUST-T7 | Capacidade de deletar completamente um usuário e seus dados (direito ao esquecimento) | Eliminação | 🟡 Base |
156
+ | RB-TRUST-T8 | Pseudonimização de PII em ambientes de desenvolvimento/staging | Segurança | 🟢 Excelência |
157
+ | RB-TRUST-T9 | Consentimento explícito registrado com timestamp e versão da política | Consentimento | 🟢 Excelência |
158
+
159
+ *Se o sistema processa dados pessoais, RB-TRUST-T1 e RB-TRUST-T2 são Piso independente de outros domínios.*
160
+
161
+ ---
162
+
163
+ ### DIM-ACCESS — Acessibilidade e UX de Erro
164
+
165
+ Aplicar quando: qualquer interface visível ao usuário final.
166
+
167
+ | ID | Critério | Padrão | Tier |
168
+ |----|----------|--------|------|
169
+ | RB-ACC-W1 | Contraste mínimo 4.5:1 para texto normal, 3:1 para texto grande (WCAG 2.1 AA) | WCAG 2.1 AA | 🔴 Piso |
170
+ | RB-ACC-W2 | Navegação completa por teclado (Tab, Enter, Esc em todos os fluxos críticos) | WCAG 2.1 AA | 🔴 Piso |
171
+ | RB-ACC-E1 | Mensagens de erro em linguagem natural — sem códigos internos, stack traces ou jargão técnico | Error UX | 🔴 Piso |
172
+ | RB-ACC-E2 | Estado de loading explícito em operações assíncronas (spinner, skeleton, texto) | Error UX | 🟡 Base |
173
+ | RB-ACC-E3 | Estado de erro com ação de recuperação sugerida (retry, contato, próximo passo) | Error UX | 🟡 Base |
174
+ | RB-ACC-W3 | Labels e ARIA em todos os campos e botões interativos | WCAG 2.1 AA | 🟡 Base |
175
+ | RB-ACC-W4 | Imagens não decorativas com texto alternativo descritivo | WCAG 2.1 AA | 🟡 Base |
176
+ | RB-ACC-E4 | Página de erro 404/500 com link de volta ao ponto seguro (home, dashboard) | Error UX | 🟡 Base |
177
+ | RB-ACC-W5 | Foco visível em elementos interativos (outline customizado ou padrão visível) | WCAG 2.1 AA | 🟡 Base |
178
+ | RB-ACC-W6 | Skip link para pular navegação repetitiva (acessibilidade para leitores de tela) | WCAG 2.1 AAA | 🟢 Excelência |
179
+
180
+ ---
181
+
182
+ ### DIM-OPS — Prontidão Operacional
183
+
184
+ Aplicar quando: qualquer serviço que vai a produção ou será operado por outra pessoa.
185
+
186
+ | ID | Critério | Categoria | Tier |
187
+ |----|----------|-----------|------|
188
+ | RB-OPS-S1 | Segredos exclusivamente via variáveis de ambiente — nunca hardcoded ou commitados | Secrets | 🔴 Piso |
189
+ | RB-OPS-S2 | `.env.example` documenta todas as variáveis obrigatórias com descrição | Secrets | 🔴 Piso |
190
+ | RB-OPS-D1 | Estratégia de deploy definida: como fazer deploy, rollback e smoke test | Deploy | 🟡 Base |
191
+ | RB-OPS-D2 | Migrations de banco reversíveis (down migration definida para cada up migration) | Deploy | 🟡 Base |
192
+ | RB-OPS-R1 | README com: pré-requisitos, como rodar localmente, como testar, variáveis necessárias | Docs | 🟡 Base |
193
+ | RB-OPS-R2 | Runbook mínimo: o que fazer quando o serviço cai (quem acionar, como diagnosticar) | Runbook | 🟡 Base |
194
+ | RB-OPS-D3 | Zero-downtime deploy ou janela de manutenção documentada para deploys com downtime | Deploy | 🟢 Excelência |
195
+ | RB-OPS-D4 | Feature flag ou kill switch para desativar funcionalidade nova sem redeploy | Deploy | 🟢 Excelência |
196
+ | RB-OPS-R3 | RTO / RPO definidos: quanto tempo de inatividade é aceitável, quanto dado pode ser perdido | Recovery | 🟢 Excelência |
197
+
198
+ ---
199
+
200
+ ## Parte IV — Accepted Risk Registry
201
+
202
+ Todo item recusado pelo usuário **deve** ser registrado no registro de riscos aceitos — nunca silenciado.
203
+
204
+ ### Formato de entrada
205
+
206
+ ```
207
+ | ID | Critério recusado | Tier | Justificativa | Responsável | Data | Revisão |
208
+ |-------|-------------------|------|---------------|-------------|------|---------|
209
+ | AR-01 | RB-SEC-A2 (rate limiting) | Piso | MVP local sem exposição pública; revisitar em v2 | Eduardo | 2026-04-17 | Antes do deploy público |
210
+ ```
211
+
212
+ ### Onde registrar
213
+ - Na seção **"Suposições e riscos"** do `SPEC.md`, como tabela `## Riscos Aceitos`
214
+ - Itens com tier **Piso** recusados → também listados em `CONCERNS.md` com tag `[P0]`
215
+ - Revisados obrigatoriamente na **Fase 5 de aprovação** — usuário confirma ciência de cada P0/P1 aceito
216
+
217
+ ### Regra de severidade no registry
218
+ | Tier do item recusado | Severidade no registry | Impacto no verify |
219
+ |----------------------|----------------------|-------------------|
220
+ | Piso | P0 — risco crítico documentado | Bloqueia `verify_complete` se `security_in_verify: true` |
221
+ | Base | P1 — risco operacional documentado | Aparece em SECURITY.md / CONCERNS.md |
222
+ | Excelência | P2 — débito técnico consciente | Registrado, não bloqueia |
223
+
224
+ ---
225
+
226
+ ## Parte V — Quality Score
227
+
228
+ Calculado ao final da Fase 3.5, antes de gerar o roteiro.
229
+
230
+ ```
231
+ Quality Score = (Piso_aprovados / Piso_total × 60) + (Base_aprovados / Base_total × 40)
232
+ ```
233
+
234
+ | Faixa | Significado | Ação |
235
+ |-------|-------------|------|
236
+ | 90–100 | Contrato de qualidade forte | Avançar; mencionar ao usuário |
237
+ | 70–89 | Contrato sólido com lacunas documentadas | Avançar; destacar P1s aceitos |
238
+ | 50–69 | Lacunas significativas — riscos operacionais relevantes | Avançar com alerta claro no SPEC |
239
+ | < 50 | Qualidade insuficiente para produção | Apresentar ao usuário antes de avançar; sugerir revisão |
240
+
241
+ **Regra de Piso:** se qualquer item Piso for recusado, o Quality Score é automaticamente exibido com `⚠ Piso incompleto` independente da pontuação total.
242
+
243
+ ---
244
+
245
+ ## Processo de elevação (Fase 3.5) — passo a passo
246
+
247
+ ```
248
+ 1. Executar Parte I (Detector de Arquitetura)
249
+ → Listar smells detectados; apresentar ao usuário antes dos checklists
250
+
251
+ 2. Executar Parte II (Derivação STRIDE)
252
+ → Mapear domínios detectados → ameaças concretas
253
+
254
+ 3. Para cada dimensão aplicável (SEC, RES, OBS, TRUST, ACCESS, OPS):
255
+ a. Filtrar itens já cobertos pelos A* da Fase 3
256
+ b. Propor itens restantes agrupados por Tier (Piso → Base → Excelência)
257
+ c. Para cada item Piso: referenciar a ameaça STRIDE ou smell que o motivou
258
+
259
+ 4. Apresentar ao usuário em bloco único:
260
+ - Smells detectados (se houver)
261
+ - Critérios por dimensão e tier (não todos de uma vez — agrupar por dimensão)
262
+ - Para cada item Piso, mencionar: "Este item mitiga [ameaça/smell] e sua ausência é risco P0"
263
+
264
+ 5. Aguardar decisão por dimensão (não item a item — reduz fricção)
265
+
266
+ 6. Incorporar aprovados na tabela da Fase 3 como R-RB-NN
267
+
268
+ 7. Registrar recusados no Accepted Risk Registry (Suposições e riscos do SPEC)
269
+
270
+ 8. Calcular e exibir Quality Score
271
+
272
+ 9. Se Quality Score < 50 ou Piso incompleto: apresentar resumo de riscos e confirmar com usuário antes de avançar
273
+ ```
274
+
275
+ ---
276
+
277
+ ## Detecção de domínios aplicáveis
278
+
279
+ | Domínio | Ativa dimensões | Detectado quando |
280
+ |---------|----------------|-----------------|
281
+ | AUTH | SEC, OBS (audit), TRUST (se há dados pessoais) | Requisitos mencionam: login, logout, senha, sessão, JWT, token, autenticação |
282
+ | API | SEC, RES, OBS | Stack inclui: Express, Fastify, Hono, NestJS, Flask, Django, Spring — ou há rotas HTTP |
283
+ | DB | SEC, TRUST, OPS | Stack inclui: SQL, SQLite, PostgreSQL, MySQL, MongoDB, Prisma, Drizzle, Sequelize |
284
+ | FRONTEND | SEC, ACCESS, OBS | Stack inclui: React, Vue, Angular, Svelte, Next.js — ou há interface web |
285
+ | FILE | SEC, TRUST | Requisitos mencionam: upload, download, armazenamento de arquivos, S3, blob |
286
+ | DADOS PESSOAIS | TRUST (Piso automático) | Requisitos mencionam: email, CPF, nome, endereço, telefone, localização, IP de usuário |
287
+ | PRODUÇÃO | OPS | Requisitos ou contexto indicam deploy para ambiente acessível externamente |
288
+
289
+ ---
290
+
291
+ ## Regra de escopo mínimo
292
+
293
+ Critérios marcados como Piso são **fortemente recomendados** mas o usuário tem autoridade final.
294
+ Se recusar um Piso, registrar no Accepted Risk Registry com motivo — nunca forçar inclusão.
295
+ O Quality Score e o registro de riscos garantem transparência sem impor; a decisão permanece do usuário.
@@ -606,9 +606,12 @@
606
606
  "global_lessons",
607
607
  "project_summary",
608
608
  "session_summary",
609
- "phase_summary"
609
+ "phase_summary",
610
+ "lessons_metrics",
611
+ "spec"
610
612
  ],
611
- "extraction_intent": "verification"
613
+ "extraction_intent": "verification",
614
+ "quality_contract_aware": true
612
615
  },
613
616
  "review-pr": {
614
617
  "reasoning_mode": "review",
@@ -715,9 +718,11 @@
715
718
  "codebase_overview",
716
719
  "codebase_integrations",
717
720
  "global_lessons",
718
- "azure_inventory"
721
+ "azure_inventory",
722
+ "lessons_metrics"
719
723
  ],
720
- "extraction_intent": "planning_input"
724
+ "extraction_intent": "planning_input",
725
+ "quality_contract_aware": true
721
726
  },
722
727
  "ui-review": {
723
728
  "reasoning_mode": "review",
@@ -777,6 +782,29 @@
777
782
  ],
778
783
  "extraction_intent": "verification"
779
784
  },
785
+ "verify-audit": {
786
+ "reasoning_mode": "review",
787
+ "question_policy": "none",
788
+ "output_contract": "findings",
789
+ "tool_profile": "review_heavy",
790
+ "confidence_policy": "explicit",
791
+ "required_artifacts": [
792
+ "state",
793
+ "spec",
794
+ "verify"
795
+ ],
796
+ "optional_artifacts": [
797
+ "session_summary",
798
+ "phase_summary"
799
+ ],
800
+ "extraction_intent": "verification",
801
+ "auditor_excluded": [
802
+ "plan",
803
+ "runtime",
804
+ "active_run",
805
+ "events"
806
+ ]
807
+ },
780
808
  "verify": {
781
809
  "reasoning_mode": "review",
782
810
  "required_artifacts": [
@@ -77,6 +77,26 @@ Ao ler `LESSONS.md`, priorizar entradas com **`Frequência >= 2`** ou **`Impacto
77
77
  - Se existe: chamar `updateLessonMetric` com `{ cycle: "C-NN", verify_status: "<verify_complete|verify_failed>", saved_hours: <estimativa ou 0> }`.
78
78
  - Se não existe: criar nova entrada com `applied_cycles: ["C-NN"]`, `outcomes: [...]`, `success_rate: 1.0` (ou `0.0` se falhou), `status: "active"`, `deprecation_threshold: 0.5`.
79
79
  - Lições com `success_rate < 0.5` e ≥ 3 observações → marcar `status: "deprecated"` e registrar aviso no chat.
80
+ 8a. **Captura do Contrato de Qualidade** (se VERIFY.md contiver seção **Contrato de Qualidade**):
81
+ - Extrair Quality Score comprometido (da SPEC) e Quality Score realizado (do VERIFY).
82
+ - Extrair itens R-RB declined do Accepted Risk Registry da SPEC.
83
+ - Registrar em `lessons-metrics.json` na seção `quality_contracts` (criar arquivo se não existir, usando `oxe/templates/LESSONS-METRICS.template.json`):
84
+ ```json
85
+ {
86
+ "session": "<active_session ou 'default'>",
87
+ "cycle": "C-NN",
88
+ "date": "<YYYY-MM-DD>",
89
+ "quality_score_committed": <QS comprometido ou null>,
90
+ "quality_score_realized": <QS realizado>,
91
+ "floor_complete": <true|false>,
92
+ "approved_items": ["RB-SEC-A1", "..."],
93
+ "declined_items": [{ "id": "RB-X", "tier": "...", "reason": "..." }],
94
+ "gaps_p0": ["RB-SEC-A2"],
95
+ "verify_status": "<verify_complete|verify_failed>"
96
+ }
97
+ ```
98
+ - Se algum item R-RB Piso foi declined na spec E o verify registrou gap relacionado: criar lição com tipo `quality-contract`, Impacto: alto, instrução prescritiva sobre o critério específico.
99
+ - Se Quality Score realizado < comprometido em ≥ 10 pontos: criar lição com tipo `quality-contract` descrevendo o padrão de implementação não seguido.
80
100
  9. Atualizar **`.oxe/STATE.md`**: campo `last_retro: YYYY-MM-DD`.
81
101
  10. Responder no chat: ID do ciclo (C-NN), número de lições registradas, lição mais crítica em 1 frase, lições depreciadas (se houver), sugestão do próximo ciclo (`/oxe-scan` ou `/oxe-spec`).
82
102
  </process>
@@ -89,4 +109,5 @@ Ao ler `LESSONS.md`, priorizar entradas com **`Frequência >= 2`** ou **`Impacto
89
109
  - [ ] Lições com raiz e tipo iguais a entradas anteriores têm `Frequência` incrementada, não duplicadas.
90
110
  - [ ] `STATE.md` tem `last_retro` atualizado.
91
111
  - [ ] Entradas anteriores preservadas; apenas `Status` pode mudar para `resolvido`.
112
+ - [ ] Se VERIFY.md contiver seção Contrato de Qualidade: `lessons-metrics.json` atualizado com entrada na seção `quality_contracts`.
92
113
  </success_criteria>