oxe-cc 0.9.2 → 1.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/.cursor/commands/oxe-retro.md +2 -2
- package/.cursor/commands/oxe-spec.md +2 -2
- package/.github/prompts/oxe-retro.prompt.md +2 -2
- package/.github/prompts/oxe-spec.prompt.md +2 -2
- package/README.md +1 -1
- package/bin/banner.txt +1 -1
- package/bin/lib/oxe-context-engine.cjs +1 -0
- package/bin/lib/oxe-dashboard.cjs +9 -7
- package/bin/lib/oxe-operational.cjs +569 -4
- package/bin/oxe-cc.js +141 -57
- package/commands/oxe/retro.md +2 -2
- package/commands/oxe/spec.md +2 -2
- package/lib/runtime/compiler/graph-compiler.d.ts +83 -0
- package/lib/runtime/compiler/graph-compiler.js +135 -0
- package/lib/runtime/compiler/index.d.ts +1 -0
- package/lib/runtime/compiler/index.js +17 -0
- package/lib/runtime/context/context-pack-builder.d.ts +36 -0
- package/lib/runtime/context/context-pack-builder.js +136 -0
- package/lib/runtime/context/index.d.ts +1 -0
- package/lib/runtime/context/index.js +17 -0
- package/lib/runtime/delivery/branch-manager.d.ts +19 -0
- package/lib/runtime/delivery/branch-manager.js +78 -0
- package/lib/runtime/delivery/ci-checks.d.ts +34 -0
- package/lib/runtime/delivery/ci-checks.js +209 -0
- package/lib/runtime/delivery/index.d.ts +3 -0
- package/lib/runtime/delivery/index.js +19 -0
- package/lib/runtime/delivery/pr-manager.d.ts +30 -0
- package/lib/runtime/delivery/pr-manager.js +82 -0
- package/lib/runtime/events/bus.d.ts +9 -0
- package/lib/runtime/events/bus.js +63 -0
- package/lib/runtime/events/catalog.d.ts +3 -0
- package/lib/runtime/events/catalog.js +30 -0
- package/lib/runtime/events/envelope.d.ts +13 -0
- package/lib/runtime/events/envelope.js +2 -0
- package/lib/runtime/events/index.d.ts +3 -0
- package/lib/runtime/events/index.js +19 -0
- package/lib/runtime/evidence/evidence-store.d.ts +22 -0
- package/lib/runtime/evidence/evidence-store.js +106 -0
- package/lib/runtime/evidence/index.d.ts +1 -0
- package/lib/runtime/evidence/index.js +17 -0
- package/lib/runtime/gate/gate-manager.d.ts +39 -0
- package/lib/runtime/gate/gate-manager.js +104 -0
- package/lib/runtime/gate/index.d.ts +1 -0
- package/lib/runtime/gate/index.js +17 -0
- package/lib/runtime/index.d.ts +16 -0
- package/lib/runtime/index.js +40 -0
- package/lib/runtime/models/attempt.d.ts +12 -0
- package/lib/runtime/models/attempt.js +2 -0
- package/lib/runtime/models/evidence.d.ts +9 -0
- package/lib/runtime/models/evidence.js +2 -0
- package/lib/runtime/models/gate-decision.d.ts +10 -0
- package/lib/runtime/models/gate-decision.js +2 -0
- package/lib/runtime/models/index.d.ts +8 -0
- package/lib/runtime/models/index.js +24 -0
- package/lib/runtime/models/run.d.ts +13 -0
- package/lib/runtime/models/run.js +2 -0
- package/lib/runtime/models/session.d.ts +10 -0
- package/lib/runtime/models/session.js +2 -0
- package/lib/runtime/models/verification-result.d.ts +9 -0
- package/lib/runtime/models/verification-result.js +2 -0
- package/lib/runtime/models/work-item.d.ts +15 -0
- package/lib/runtime/models/work-item.js +2 -0
- package/lib/runtime/models/workspace.d.ts +25 -0
- package/lib/runtime/models/workspace.js +2 -0
- package/lib/runtime/plugins/index.d.ts +2 -0
- package/lib/runtime/plugins/index.js +18 -0
- package/lib/runtime/plugins/plugin-abi.d.ts +76 -0
- package/lib/runtime/plugins/plugin-abi.js +2 -0
- package/lib/runtime/plugins/plugin-registry.d.ts +21 -0
- package/lib/runtime/plugins/plugin-registry.js +114 -0
- package/lib/runtime/policy/index.d.ts +1 -0
- package/lib/runtime/policy/index.js +17 -0
- package/lib/runtime/policy/policy-engine.d.ts +40 -0
- package/lib/runtime/policy/policy-engine.js +80 -0
- package/lib/runtime/projection/index.d.ts +1 -0
- package/lib/runtime/projection/index.js +17 -0
- package/lib/runtime/projection/projection-engine.d.ts +11 -0
- package/lib/runtime/projection/projection-engine.js +218 -0
- package/lib/runtime/reducers/debug-reducer.d.ts +10 -0
- package/lib/runtime/reducers/debug-reducer.js +30 -0
- package/lib/runtime/reducers/index.d.ts +2 -0
- package/lib/runtime/reducers/index.js +18 -0
- package/lib/runtime/reducers/run-state-reducer.d.ts +20 -0
- package/lib/runtime/reducers/run-state-reducer.js +110 -0
- package/lib/runtime/scheduler/index.d.ts +1 -0
- package/lib/runtime/scheduler/index.js +17 -0
- package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +34 -0
- package/lib/runtime/scheduler/multi-agent-coordinator.js +166 -0
- package/lib/runtime/scheduler/scheduler.d.ts +39 -0
- package/lib/runtime/scheduler/scheduler.js +196 -0
- package/lib/runtime/verification/index.d.ts +1 -0
- package/lib/runtime/verification/index.js +17 -0
- package/lib/runtime/verification/verification-compiler.d.ts +56 -0
- package/lib/runtime/verification/verification-compiler.js +147 -0
- package/lib/runtime/workspace/index.d.ts +5 -0
- package/lib/runtime/workspace/index.js +24 -0
- package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +22 -0
- package/lib/runtime/workspace/strategies/ephemeral-container.js +109 -0
- package/lib/runtime/workspace/strategies/git-worktree.d.ts +12 -0
- package/lib/runtime/workspace/strategies/git-worktree.js +79 -0
- package/lib/runtime/workspace/strategies/inplace.d.ts +10 -0
- package/lib/runtime/workspace/strategies/inplace.js +37 -0
- package/lib/runtime/workspace/workspace-manager.d.ts +13 -0
- package/lib/runtime/workspace/workspace-manager.js +2 -0
- package/lib/sdk/index.cjs +24 -7
- package/lib/sdk/index.d.ts +17 -7
- package/oxe/templates/LESSONS-METRICS.template.json +13 -0
- package/oxe/workflows/references/robustness-elevation.md +295 -0
- package/oxe/workflows/references/workflow-runtime-contracts.json +32 -4
- package/oxe/workflows/retro.md +21 -0
- package/oxe/workflows/spec.md +50 -26
- package/oxe/workflows/verify.md +36 -0
- package/package.json +9 -3
- package/packages/runtime/package.json +17 -0
- package/packages/runtime/src/compiler/graph-compiler.ts +245 -0
- package/packages/runtime/src/compiler/index.ts +1 -0
- package/packages/runtime/src/context/context-pack-builder.ts +193 -0
- package/packages/runtime/src/context/index.ts +1 -0
- package/packages/runtime/src/delivery/branch-manager.ts +84 -0
- package/packages/runtime/src/delivery/ci-checks.ts +252 -0
- package/packages/runtime/src/delivery/index.ts +3 -0
- package/packages/runtime/src/delivery/pr-manager.ts +112 -0
- package/packages/runtime/src/events/bus.ts +92 -0
- package/packages/runtime/src/events/catalog.ts +29 -0
- package/packages/runtime/src/events/envelope.ts +14 -0
- package/packages/runtime/src/events/index.ts +3 -0
- package/packages/runtime/src/evidence/evidence-store.ts +130 -0
- package/packages/runtime/src/evidence/index.ts +1 -0
- package/packages/runtime/src/gate/gate-manager.ts +137 -0
- package/packages/runtime/src/gate/index.ts +1 -0
- package/packages/runtime/src/index.ts +32 -0
- package/packages/runtime/src/models/attempt.ts +19 -0
- package/packages/runtime/src/models/evidence.ts +21 -0
- package/packages/runtime/src/models/gate-decision.ts +21 -0
- package/packages/runtime/src/models/index.ts +8 -0
- package/packages/runtime/src/models/run.ts +24 -0
- package/packages/runtime/src/models/session.ts +11 -0
- package/packages/runtime/src/models/verification-result.ts +10 -0
- package/packages/runtime/src/models/work-item.ts +25 -0
- package/packages/runtime/src/models/workspace.ts +28 -0
- package/packages/runtime/src/plugins/index.ts +2 -0
- package/packages/runtime/src/plugins/plugin-abi.ts +95 -0
- package/packages/runtime/src/plugins/plugin-registry.ts +119 -0
- package/packages/runtime/src/policy/index.ts +1 -0
- package/packages/runtime/src/policy/policy-engine.ts +113 -0
- package/packages/runtime/src/projection/index.ts +1 -0
- package/packages/runtime/src/projection/projection-engine.ts +249 -0
- package/packages/runtime/src/reducers/debug-reducer.ts +36 -0
- package/packages/runtime/src/reducers/index.ts +2 -0
- package/packages/runtime/src/reducers/run-state-reducer.ts +127 -0
- package/packages/runtime/src/scheduler/index.ts +1 -0
- package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +231 -0
- package/packages/runtime/src/scheduler/scheduler.ts +281 -0
- package/packages/runtime/src/verification/index.ts +1 -0
- package/packages/runtime/src/verification/verification-compiler.ts +225 -0
- package/packages/runtime/src/workspace/index.ts +5 -0
- package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +121 -0
- package/packages/runtime/src/workspace/strategies/git-worktree.ts +77 -0
- package/packages/runtime/src/workspace/strategies/inplace.ts +35 -0
- package/packages/runtime/src/workspace/workspace-manager.ts +15 -0
- package/packages/runtime/tsconfig.json +17 -0
- package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
- package/vscode-extension/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WorkspaceManager, WorkspaceRequest } from '../workspace-manager';
|
|
2
|
+
import type { WorkspaceLease, SnapshotRef } from '../../models/workspace';
|
|
3
|
+
export declare class InplaceWorkspaceManager implements WorkspaceManager {
|
|
4
|
+
private readonly projectRoot;
|
|
5
|
+
constructor(projectRoot: string);
|
|
6
|
+
allocate(req: WorkspaceRequest): Promise<WorkspaceLease>;
|
|
7
|
+
snapshot(id: string): Promise<SnapshotRef>;
|
|
8
|
+
reset(_id: string, _snapRef: SnapshotRef): Promise<void>;
|
|
9
|
+
dispose(_id: string): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.InplaceWorkspaceManager = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
class InplaceWorkspaceManager {
|
|
9
|
+
constructor(projectRoot) {
|
|
10
|
+
this.projectRoot = projectRoot;
|
|
11
|
+
}
|
|
12
|
+
async allocate(req) {
|
|
13
|
+
return {
|
|
14
|
+
workspace_id: `ws-inplace-${req.work_item_id}-a${req.attempt_number}`,
|
|
15
|
+
strategy: 'inplace',
|
|
16
|
+
branch: null,
|
|
17
|
+
base_commit: null,
|
|
18
|
+
root_path: this.projectRoot,
|
|
19
|
+
ttl_minutes: 60,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async snapshot(id) {
|
|
23
|
+
return {
|
|
24
|
+
snapshot_id: `snap-${crypto_1.default.randomBytes(4).toString('hex')}`,
|
|
25
|
+
workspace_id: id,
|
|
26
|
+
commit: 'HEAD',
|
|
27
|
+
created_at: new Date().toISOString(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async reset(_id, _snapRef) {
|
|
31
|
+
// inplace: no filesystem isolation — reset is a no-op
|
|
32
|
+
}
|
|
33
|
+
async dispose(_id) {
|
|
34
|
+
// inplace: nothing to tear down
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.InplaceWorkspaceManager = InplaceWorkspaceManager;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { WorkspaceLease, SnapshotRef, WorkspaceStrategy } from '../models/workspace';
|
|
2
|
+
export interface WorkspaceRequest {
|
|
3
|
+
work_item_id: string;
|
|
4
|
+
attempt_number: number;
|
|
5
|
+
strategy: WorkspaceStrategy;
|
|
6
|
+
mutation_scope: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface WorkspaceManager {
|
|
9
|
+
allocate(req: WorkspaceRequest): Promise<WorkspaceLease>;
|
|
10
|
+
snapshot(id: string): Promise<SnapshotRef>;
|
|
11
|
+
reset(id: string, snapRef: SnapshotRef): Promise<void>;
|
|
12
|
+
dispose(id: string): Promise<void>;
|
|
13
|
+
}
|
package/lib/sdk/index.cjs
CHANGED
|
@@ -648,13 +648,20 @@ module.exports = {
|
|
|
648
648
|
operationalPaths: operational.operationalPaths,
|
|
649
649
|
appendEvent: operational.appendEvent,
|
|
650
650
|
readEvents: operational.readEvents,
|
|
651
|
-
summarizeEvents: operational.summarizeEvents,
|
|
652
|
-
writeRunState: operational.writeRunState,
|
|
653
|
-
readRunState: operational.readRunState,
|
|
654
|
-
buildOperationalGraph: operational.buildOperationalGraph,
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
651
|
+
summarizeEvents: operational.summarizeEvents,
|
|
652
|
+
writeRunState: operational.writeRunState,
|
|
653
|
+
readRunState: operational.readRunState,
|
|
654
|
+
buildOperationalGraph: operational.buildOperationalGraph,
|
|
655
|
+
serializeCanonicalState: operational.serializeCanonicalState,
|
|
656
|
+
hydrateCanonicalState: operational.hydrateCanonicalState,
|
|
657
|
+
reduceCanonicalRunState: operational.reduceCanonicalRunState,
|
|
658
|
+
compileExecutionGraphFromArtifacts: operational.compileExecutionGraphFromArtifacts,
|
|
659
|
+
compileVerificationSuiteFromArtifacts: operational.compileVerificationSuiteFromArtifacts,
|
|
660
|
+
projectRuntimeArtifacts: operational.projectRuntimeArtifacts,
|
|
661
|
+
runRuntimeCiChecks: operational.runRuntimeCiChecks,
|
|
662
|
+
applyRuntimeAction: operational.applyRuntimeAction,
|
|
663
|
+
parseCapabilityManifest: operational.parseCapabilityManifest,
|
|
664
|
+
readCapabilityCatalog: operational.readCapabilityCatalog,
|
|
658
665
|
buildMemoryLayers: operational.buildMemoryLayers,
|
|
659
666
|
replayEvents: operational.replayEvents,
|
|
660
667
|
},
|
|
@@ -735,3 +742,13 @@ module.exports = {
|
|
|
735
742
|
/** Um único objeto com verificações tipo `doctor` + relatório de saúde. */
|
|
736
743
|
runDoctorChecks,
|
|
737
744
|
};
|
|
745
|
+
|
|
746
|
+
|
|
747
|
+
// Re-exports from @oxe/runtime (R1 — Runtime Foundation)
|
|
748
|
+
// The compiled runtime lives at lib/runtime/ alongside this file.
|
|
749
|
+
try {
|
|
750
|
+
const runtime = require('../runtime/index.js');
|
|
751
|
+
Object.assign(module.exports, runtime);
|
|
752
|
+
} catch {
|
|
753
|
+
// Runtime not built yet — safe to skip during development
|
|
754
|
+
}
|
package/lib/sdk/index.d.ts
CHANGED
|
@@ -573,13 +573,20 @@ export interface OxeSdk {
|
|
|
573
573
|
operationalPaths: (projectRoot: string, activeSession: string | null) => Record<string, string | null>;
|
|
574
574
|
appendEvent: (projectRoot: string, activeSession: string | null, event?: Record<string, unknown>) => Record<string, unknown>;
|
|
575
575
|
readEvents: (projectRoot: string, activeSession: string | null) => Array<Record<string, unknown>>;
|
|
576
|
-
summarizeEvents: (events: Array<Record<string, unknown>>) => Record<string, unknown>;
|
|
577
|
-
writeRunState: (projectRoot: string, activeSession: string | null, runState?: Record<string, unknown>) => Record<string, unknown>;
|
|
578
|
-
readRunState: (projectRoot: string, activeSession: string | null) => Record<string, unknown> | null;
|
|
579
|
-
buildOperationalGraph: (runState?: Record<string, unknown>) => { nodes: Array<Record<string, unknown>>; edges: Array<Record<string, unknown>> };
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
576
|
+
summarizeEvents: (events: Array<Record<string, unknown>>) => Record<string, unknown>;
|
|
577
|
+
writeRunState: (projectRoot: string, activeSession: string | null, runState?: Record<string, unknown>) => Record<string, unknown>;
|
|
578
|
+
readRunState: (projectRoot: string, activeSession: string | null) => Record<string, unknown> | null;
|
|
579
|
+
buildOperationalGraph: (runState?: Record<string, unknown>) => { nodes: Array<Record<string, unknown>>; edges: Array<Record<string, unknown>> };
|
|
580
|
+
serializeCanonicalState: (state: unknown) => Record<string, unknown> | null;
|
|
581
|
+
hydrateCanonicalState: (serialized: unknown) => Record<string, unknown>;
|
|
582
|
+
reduceCanonicalRunState: (projectRoot: string, activeSession: string | null, options?: Record<string, unknown>) => Record<string, unknown> | null;
|
|
583
|
+
compileExecutionGraphFromArtifacts: (projectRoot: string, activeSession: string | null, options?: Record<string, unknown>) => Record<string, unknown>;
|
|
584
|
+
compileVerificationSuiteFromArtifacts: (projectRoot: string, activeSession: string | null, options?: Record<string, unknown>) => Record<string, unknown>;
|
|
585
|
+
projectRuntimeArtifacts: (projectRoot: string, activeSession: string | null, options?: Record<string, unknown>) => Record<string, unknown>;
|
|
586
|
+
runRuntimeCiChecks: (projectRoot: string, activeSession: string | null, options?: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
587
|
+
applyRuntimeAction: (projectRoot: string, activeSession: string | null, input?: Record<string, unknown>) => Record<string, unknown>;
|
|
588
|
+
parseCapabilityManifest: (text: string) => Record<string, unknown>;
|
|
589
|
+
readCapabilityCatalog: (projectRoot: string) => Array<Record<string, unknown>>;
|
|
583
590
|
buildMemoryLayers: (projectRoot: string, activeSession: string | null) => Record<string, unknown>;
|
|
584
591
|
replayEvents: (projectRoot: string, activeSession: string | null, options?: {
|
|
585
592
|
fromEventId?: string;
|
|
@@ -631,3 +638,6 @@ export interface OxeSdk {
|
|
|
631
638
|
|
|
632
639
|
declare const sdk: OxeSdk;
|
|
633
640
|
export = sdk;
|
|
641
|
+
|
|
642
|
+
// Re-exports from @oxe/runtime (R1 — Runtime Foundation)
|
|
643
|
+
export * from '../runtime/index';
|
|
@@ -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": [
|
package/oxe/workflows/retro.md
CHANGED
|
@@ -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>
|