oxe-cc 1.5.0 → 1.6.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-dashboard.md +2 -2
- package/.cursor/commands/oxe-execute.md +2 -2
- package/.cursor/commands/oxe-plan.md +2 -2
- package/.github/prompts/oxe-dashboard.prompt.md +2 -2
- package/.github/prompts/oxe-execute.prompt.md +2 -2
- package/.github/prompts/oxe-plan.prompt.md +2 -2
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +52 -0
- package/README.md +17 -15
- package/bin/lib/oxe-context-engine.cjs +9 -4
- package/bin/lib/oxe-dashboard.cjs +140 -58
- package/bin/lib/oxe-project-health.cjs +486 -151
- package/bin/lib/oxe-rationality.cjs +385 -0
- package/bin/lib/oxe-release.cjs +76 -4
- package/bin/oxe-cc.js +113 -58
- package/commands/oxe/dashboard.md +2 -2
- package/commands/oxe/execute.md +2 -2
- package/commands/oxe/plan.md +2 -2
- package/docs/RELEASE-READINESS.md +8 -0
- package/docs/RUNTIME-SMOKE-MATRIX.md +9 -2
- package/lib/sdk/index.cjs +20 -11
- package/lib/sdk/index.d.ts +99 -34
- package/oxe/templates/CONFIG.md +3 -3
- package/oxe/templates/EXECUTION-RUNTIME.template.md +1 -1
- package/oxe/templates/FIXTURE-PACK.template.json +34 -0
- package/oxe/templates/FIXTURE-PACK.template.md +21 -0
- package/oxe/templates/IMPLEMENTATION-PACK.template.json +52 -0
- package/oxe/templates/IMPLEMENTATION-PACK.template.md +36 -0
- package/oxe/templates/INVESTIGATION.template.md +38 -38
- package/oxe/templates/PLAN.template.md +23 -14
- package/oxe/templates/REFERENCE-ANCHORS.template.md +24 -0
- package/oxe/templates/RESEARCH.template.md +11 -11
- package/oxe/templates/SPEC.template.md +6 -6
- package/oxe/templates/SUMMARY.template.md +20 -20
- package/oxe/templates/config.template.json +1 -1
- package/oxe/workflows/execute.md +18 -2
- package/oxe/workflows/milestone.md +12 -12
- package/oxe/workflows/next.md +1 -1
- package/oxe/workflows/plan.md +115 -57
- package/oxe/workflows/references/adaptive-discovery.md +27 -27
- package/oxe/workflows/references/flow-robustness-contract.md +80 -80
- package/oxe/workflows/references/session-path-resolution.md +71 -71
- package/oxe/workflows/references/workflow-runtime-contracts.json +36 -4
- package/oxe/workflows/verify.md +4 -4
- package/oxe/workflows/workstream.md +16 -16
- package/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/vscode-extension/oxe-agents-1.5.1.vsix +0 -0
- package/vscode-extension/oxe-agents-1.6.0.vsix +0 -0
- package/vscode-extension/package.json +1 -1
|
@@ -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:
|
|
12
|
+
oxe_semantics_hash: ebb4473c14e5b080
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
OXE — visualizar runtime, ondas, checkpoints e saúde operacional da trilha
|
|
@@ -25,7 +25,7 @@ OXE — visualizar runtime, ondas, checkpoints e saúde operacional da trilha
|
|
|
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:** `
|
|
28
|
+
- **Checksum semântico:** `ebb4473c14e5b080`
|
|
29
29
|
- **Entrada de contexto prioritária:** `.oxe/context/packs/dashboard.md` e `.oxe/context/packs/dashboard.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 dashboard --json`
|
|
@@ -9,7 +9,7 @@ oxe_tool_profile: write_bounded
|
|
|
9
9
|
oxe_confidence_policy: explicit
|
|
10
10
|
oxe_context_tier: standard
|
|
11
11
|
oxe_contract_version: 2.0.0
|
|
12
|
-
oxe_semantics_hash:
|
|
12
|
+
oxe_semantics_hash: 7b3446b77aef9353
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
OXE — Executar plano (solo ou com agentes): escolha Completo (1 sessão) | Por onda | Por tarefa para controlar requisições
|
|
@@ -25,7 +25,7 @@ OXE — Executar plano (solo ou com agentes): escolha Completo (1 sessão) | Por
|
|
|
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:** `
|
|
28
|
+
- **Checksum semântico:** `7b3446b77aef9353`
|
|
29
29
|
- **Entrada de contexto prioritária:** `.oxe/context/packs/execute.md` e `.oxe/context/packs/execute.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 execute --json`
|
|
@@ -9,7 +9,7 @@ oxe_tool_profile: mixed
|
|
|
9
9
|
oxe_confidence_policy: rubric
|
|
10
10
|
oxe_context_tier: standard
|
|
11
11
|
oxe_contract_version: 2.0.0
|
|
12
|
-
oxe_semantics_hash:
|
|
12
|
+
oxe_semantics_hash: 5c589398cb807029
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
OXE — Gera .oxe/PLAN.md com verificação por tarefa
|
|
@@ -25,7 +25,7 @@ OXE — Gera .oxe/PLAN.md com verificação por tarefa
|
|
|
25
25
|
- **Política de confiança:** rubrica
|
|
26
26
|
- **Tier de contexto padrão:** padrão
|
|
27
27
|
- **Versão do contrato:** 2.0.0
|
|
28
|
-
- **Checksum semântico:** `
|
|
28
|
+
- **Checksum semântico:** `5c589398cb807029`
|
|
29
29
|
- **Entrada de contexto prioritária:** `.oxe/context/packs/plan.md` e `.oxe/context/packs/plan.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 plan --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:
|
|
14
|
+
oxe_semantics_hash: ebb4473c14e5b080
|
|
15
15
|
---
|
|
16
16
|
|
|
17
17
|
<!-- oxe-reasoning-contract:start -->
|
|
@@ -25,7 +25,7 @@ oxe_semantics_hash: 37f74d8be3442fe1
|
|
|
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:** `
|
|
28
|
+
- **Checksum semântico:** `ebb4473c14e5b080`
|
|
29
29
|
- **Entrada de contexto prioritária:** `.oxe/context/packs/dashboard.md` e `.oxe/context/packs/dashboard.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 dashboard --json`
|
|
@@ -11,7 +11,7 @@ oxe_tool_profile: write_bounded
|
|
|
11
11
|
oxe_confidence_policy: explicit
|
|
12
12
|
oxe_context_tier: standard
|
|
13
13
|
oxe_contract_version: 2.0.0
|
|
14
|
-
oxe_semantics_hash:
|
|
14
|
+
oxe_semantics_hash: 7b3446b77aef9353
|
|
15
15
|
---
|
|
16
16
|
|
|
17
17
|
<!-- oxe-reasoning-contract:start -->
|
|
@@ -25,7 +25,7 @@ oxe_semantics_hash: 14ddb483209b28b3
|
|
|
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:** `
|
|
28
|
+
- **Checksum semântico:** `7b3446b77aef9353`
|
|
29
29
|
- **Entrada de contexto prioritária:** `.oxe/context/packs/execute.md` e `.oxe/context/packs/execute.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 execute --json`
|
|
@@ -11,7 +11,7 @@ oxe_tool_profile: mixed
|
|
|
11
11
|
oxe_confidence_policy: rubric
|
|
12
12
|
oxe_context_tier: standard
|
|
13
13
|
oxe_contract_version: 2.0.0
|
|
14
|
-
oxe_semantics_hash:
|
|
14
|
+
oxe_semantics_hash: 5c589398cb807029
|
|
15
15
|
---
|
|
16
16
|
|
|
17
17
|
<!-- oxe-reasoning-contract:start -->
|
|
@@ -25,7 +25,7 @@ oxe_semantics_hash: 7809d830a5f5ff4a
|
|
|
25
25
|
- **Política de confiança:** rubrica
|
|
26
26
|
- **Tier de contexto padrão:** padrão
|
|
27
27
|
- **Versão do contrato:** 2.0.0
|
|
28
|
-
- **Checksum semântico:** `
|
|
28
|
+
- **Checksum semântico:** `5c589398cb807029`
|
|
29
29
|
- **Entrada de contexto prioritária:** `.oxe/context/packs/plan.md` e `.oxe/context/packs/plan.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 plan --json`
|
package/AGENTS.md
CHANGED
|
@@ -99,4 +99,4 @@ Os wrappers por runtime podem carregar metadata cognitiva (`oxe_reasoning_mode`,
|
|
|
99
99
|
|
|
100
100
|
Para `execute` e `verify`, o comportamento atual esperado é **runtime-first**: se `oxe-cc runtime` estiver disponível, preferir `runtime compile/project/verify/gates` e tratar markdown como projeção derivada; se o runtime não puder ser executado, declarar `fallback legado` explicitamente.
|
|
101
101
|
|
|
102
|
-
Para publicação, o gate local esperado passa por `oxe-cc doctor --release --write-manifest`. Essa verificação deve falhar se houver drift de versão, topo inválido no `CHANGELOG`, wrapper dirty após sync, runtime não compilado ou ausência dos relatórios `.oxe/release/*.json` exigidos pela release.
|
|
102
|
+
Para publicação, o gate local esperado passa por `oxe-cc doctor --release --write-manifest`. Essa verificação deve falhar se houver drift de versão, topo inválido no `CHANGELOG`, ausência da árvore canónica `oxe/`, `workflow-runtime-contracts.json` inválido, wrapper dirty após sync, runtime não compilado ou ausência dos relatórios `.oxe/release/*.json` exigidos pela release.
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,58 @@ Todas as versões seguem [Semantic Versioning](https://semver.org/). As mudança
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [1.6.0] — 2026-04-23
|
|
8
|
+
|
|
9
|
+
### Product Reconciliation
|
|
10
|
+
|
|
11
|
+
- a árvore canónica `oxe/` foi restaurada como source of truth da release, incluindo `oxe/workflows/`, `oxe/workflows/references/`, `oxe/templates/` e `commands/oxe/` como superfície derivada sincronizada
|
|
12
|
+
- `workflow-runtime-contracts.json` voltou a ser contrato obrigatório da release; `sync-runtime-metadata` agora falha fechado quando a fonte canónica ou o registry semântico estão ausentes/inválidos
|
|
13
|
+
- `doctor --release` passou a bloquear explicitamente por topologia canónica ausente, contrato semântico inválido e drift entre workflows e wrappers
|
|
14
|
+
|
|
15
|
+
### Package-vs-Workspace Health
|
|
16
|
+
|
|
17
|
+
- `status`, `status --full`, dashboard e SDK agora distinguem `workspaceMode: product_package` de `workspaceMode: oxe_project`
|
|
18
|
+
- no repositório do pacote, o próximo passo deixa de cair em `plan/replan` por ruído de manutenção e passa a apontar para `doctor --release --write-manifest`
|
|
19
|
+
- `status --json` passou a expor `workspaceMode` e `releaseReadiness` como contrato estável da linha `1.6.0`
|
|
20
|
+
|
|
21
|
+
### Multi-runtime Edge Hardening
|
|
22
|
+
|
|
23
|
+
- a smoke matrix de release passou a validar a instalação do Codex de forma completa: prompts em `.codex/prompts/` e skills em `.agents/skills/oxe/`
|
|
24
|
+
- documentação de instalação foi ajustada para separar `--local` (layout do repo) de `--ide-local` (escopo da integração), eliminando a ambiguidade operacional em runtimes como Codex
|
|
25
|
+
|
|
26
|
+
### Validation
|
|
27
|
+
|
|
28
|
+
- `node --test tests/oxe-project-health.test.cjs`
|
|
29
|
+
- `node --test tests/oxe-cli-edge.test.cjs`
|
|
30
|
+
- `npm test`
|
|
31
|
+
- `npm run scan:assets`
|
|
32
|
+
- `npm run release:doctor`
|
|
33
|
+
|
|
34
|
+
## [1.5.1] — 2026-04-22
|
|
35
|
+
|
|
36
|
+
### Rational Execution Readiness
|
|
37
|
+
|
|
38
|
+
- `/oxe-plan` passou a exigir e propagar artefatos racionais de execução: `IMPLEMENTATION-PACK`, `REFERENCE-ANCHORS` e `FIXTURE-PACK`
|
|
39
|
+
- `/oxe-execute` agora é `pack-first` e bloqueia mutação quando confiança `<= 90%`, quando os packs estão incompletos ou quando há `critical_gap` aberto
|
|
40
|
+
- `doctor`, `status --json`, dashboard e SDK passaram a expor `implementationPackReady`, `referenceAnchorsReady`, `fixturePackReady`, `executionRationalityReady` e `criticalExecutionGaps`
|
|
41
|
+
|
|
42
|
+
### Session Compatibility
|
|
43
|
+
|
|
44
|
+
- o health report agora faz fallback explícito entre artefatos session-scoped e artefatos ainda materializados na raiz `.oxe/`, evitando falso negativo de readiness em workspaces legados
|
|
45
|
+
- o gate racional foi limitado ao estágio pré-execução; depois de `executing`/`verify_complete`, os packs continuam diagnósticos, mas não reescrevem o próximo passo do ciclo
|
|
46
|
+
|
|
47
|
+
### Publication Alignment
|
|
48
|
+
|
|
49
|
+
- versão alinhada para `1.5.1` em pacote raiz, runtime package, extensão VS Code, README e lockfile
|
|
50
|
+
- matriz pública de smoke runtime atualizada para refletir a release `1.5.1`
|
|
51
|
+
|
|
52
|
+
### Validation
|
|
53
|
+
|
|
54
|
+
- `npm test`
|
|
55
|
+
- `npm run scan:assets`
|
|
56
|
+
- `npm run release:manifest`
|
|
57
|
+
- `npm run build:vscode-ext`
|
|
58
|
+
|
|
7
59
|
## [1.5.0] — 2026-04-21
|
|
8
60
|
|
|
9
61
|
### Release Readiness 5/5
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://www.npmjs.com/package/oxe-cc)
|
|
8
8
|
[](LICENSE)
|
|
9
9
|
|
|
10
|
-
**Versão:** `1.
|
|
10
|
+
**Versão:** `1.6.0` · [package.json](package.json)
|
|
11
11
|
|
|
12
12
|
**Framework OXE — Orchestrated eXperience Engineering**
|
|
13
13
|
|
|
@@ -52,7 +52,7 @@ O OXE agora distingue cinco famílias de raciocínio:
|
|
|
52
52
|
- `review` — findings primeiro, severidade, evidência e risco residual
|
|
53
53
|
- `status` — leitura curta do estado, recomendação única e motivo
|
|
54
54
|
|
|
55
|
-
Essas regras vivem no núcleo canónico em `oxe/workflows/references/reasoning-*.md`, sobem para os workflows em `oxe/workflows/` e são renderizadas para cada runtime em `.github/prompts/`, `.cursor/commands/`, `commands/oxe/`, `.codex/prompts/` e skills multiagente.
|
|
55
|
+
Essas regras vivem no núcleo canónico em `oxe/workflows/references/reasoning-*.md`, sobem para os workflows em `oxe/workflows/` e são renderizadas para cada runtime em `.github/prompts/`, `.cursor/commands/`, `commands/oxe/`, `.codex/prompts/` e skills multiagente. Nesta linha, `oxe/workflows/**` e `workflow-runtime-contracts.json` voltam a ser o contrato obrigatório da release; superfícies geradas permanecem derivadas e sincronizadas.
|
|
56
56
|
|
|
57
57
|
---
|
|
58
58
|
|
|
@@ -522,14 +522,16 @@ npx oxe-cc@latest
|
|
|
522
522
|
| Flag | Efeito |
|
|
523
523
|
|------|--------|
|
|
524
524
|
| `--cursor` / `--copilot` | Só uma das stacks da IDE |
|
|
525
|
-
| `--copilot-cli` | Skills globais do Copilot CLI em `~/.copilot/skills/` |
|
|
526
|
-
| `--all-agents` | Cursor + Copilot + Claude + OpenCode + Gemini + Codex + Windsurf + Antigravity |
|
|
527
|
-
| `--global` | Layout clássico: `oxe/` na raiz + `.oxe/` |
|
|
528
|
-
| `--local` | Layout
|
|
529
|
-
| `--
|
|
530
|
-
| `--
|
|
531
|
-
| `--
|
|
532
|
-
| `--
|
|
525
|
+
| `--copilot-cli` | Skills globais do Copilot CLI em `~/.copilot/skills/` |
|
|
526
|
+
| `--all-agents` | Cursor + Copilot + Claude + OpenCode + Gemini + Codex + Windsurf + Antigravity |
|
|
527
|
+
| `--global` | Layout clássico: `oxe/` na raiz + `.oxe/` |
|
|
528
|
+
| `--local` | Layout do repositório: mínimo, só `.oxe/` (padrão). Não controla onde a integração da IDE é instalada. |
|
|
529
|
+
| `--ide-local` | Instala a integração no próprio repositório (`.cursor/`, `.github/`, `.claude/`, `.codex/` etc.) |
|
|
530
|
+
| `--ide-global` | Instala a integração no HOME do utilizador quando o runtime suportar esse escopo |
|
|
531
|
+
| `--force` / `-f` | Sobrescreve arquivos existentes (use para atualizar) |
|
|
532
|
+
| `--dry-run` | Lista ações sem escrever |
|
|
533
|
+
| `--oxe-only` | Só workflows em `.oxe/`, sem integrações IDE |
|
|
534
|
+
| `--no-global-cli` / `-l` | Não instala `oxe-cc` globalmente (útil em CI) |
|
|
533
535
|
| `OXE_NO_PROMPT=1` | Modo não-interativo (CI) |
|
|
534
536
|
|
|
535
537
|
</details>
|
|
@@ -568,10 +570,10 @@ node bin/oxe-cc.js --help
|
|
|
568
570
|
|---------|-----------|
|
|
569
571
|
| `oxe-cc` / `oxe-cc install` | Instala workflows e integrações |
|
|
570
572
|
| `oxe-cc doctor` | Diagnóstico completo: Node, workflows, config, bootstrap `.oxe/`, sessão ativa, autoavaliação do plano, saúde lógica (`healthy` \| `warning` \| `broken`), drift semântico multi-runtime e workflows sem contrato no registry |
|
|
571
|
-
| `oxe-cc doctor --release --write-manifest` | Gate de publicação: valida versões, topo do `CHANGELOG`, runtime compilado, wrapper sync e relatórios obrigatórios; persiste `release-manifest.json` |
|
|
572
|
-
| `oxe-cc status` | Próximo passo sugerido + saúde lógica do fluxo |
|
|
573
|
-
| `oxe-cc status --full` | Coverage matrix + readiness gate + active run no terminal (ANSI) |
|
|
574
|
-
| `oxe-cc status --json` | Mesmo, em JSON (schema v5), com `healthStatus`, `activeSession`, `planSelfEvaluation`, `contextPacks`, `contextQuality`, `semanticsDrift`, `verificationSummary`, `residualRiskSummary`, `evidenceCoverage`, `pendingGates`, `policyDecisionSummary`, `quotaSummary`, `auditSummary`, `promotionSummary`, `runtimeMode`, `fallbackMode`, `gateQueue`, `policyCoverage`, `promotionReadiness`, `recoveryState`, `multiAgent` e `providerCatalog` |
|
|
573
|
+
| `oxe-cc doctor --release --write-manifest` | Gate de publicação: valida árvore canónica `oxe/`, `workflow-runtime-contracts.json`, versões, topo do `CHANGELOG`, runtime compilado, wrapper sync e relatórios obrigatórios; persiste `release-manifest.json` |
|
|
574
|
+
| `oxe-cc status` | Próximo passo sugerido + saúde lógica do fluxo |
|
|
575
|
+
| `oxe-cc status --full` | Coverage matrix + readiness gate + active run no terminal (ANSI); em repositório do pacote, troca para release readiness em vez de plan readiness |
|
|
576
|
+
| `oxe-cc status --json` | Mesmo, em JSON (schema v5), com `workspaceMode`, `releaseReadiness`, `healthStatus`, `activeSession`, `planSelfEvaluation`, `contextPacks`, `contextQuality`, `semanticsDrift`, `verificationSummary`, `residualRiskSummary`, `evidenceCoverage`, `pendingGates`, `policyDecisionSummary`, `quotaSummary`, `auditSummary`, `promotionSummary`, `runtimeMode`, `fallbackMode`, `gateQueue`, `policyCoverage`, `promotionReadiness`, `recoveryState`, `multiAgent` e `providerCatalog` |
|
|
575
577
|
| `oxe-cc context build [--workflow <slug>] [--tier <minimal\|standard\|full>]` | Gera context pack(s) em `.oxe/context/packs/` — seleção determinística de artefatos por contrato de workflow |
|
|
576
578
|
| `oxe-cc context inspect [--workflow <slug>]` | Inspeciona um context pack existente ou resolve sob demanda (sem escrita); útil para diagnóstico antes de iniciar um passo |
|
|
577
579
|
| `oxe-cc update` | Atualiza workflows para a versão mais recente |
|
|
@@ -599,7 +601,7 @@ Arquivo `.oxe/config.json`. Principais opções:
|
|
|
599
601
|
|-------|--------|-----------|
|
|
600
602
|
| `profile` | `"balanced"` | `strict` / `balanced` / `fast` / `legacy` |
|
|
601
603
|
| `verification_depth` | `"standard"` | `"thorough"` ativa gaps automático no verify (Camada 5) |
|
|
602
|
-
| `plan_confidence_threshold` | `
|
|
604
|
+
| `plan_confidence_threshold` | `90` | Limiar canónico para `execute` aceitar um `PLAN.md`; a confiança precisa ser **maior que** esse valor |
|
|
603
605
|
| `security_in_verify` | `false` | `true` ativa OWASP automático no verify (Camada 6) |
|
|
604
606
|
| `discuss_before_plan` | `false` | Exige aprovação de decisões antes do plano |
|
|
605
607
|
| `scale_adaptive` | `true` | Scan sugere o profile pelo tamanho do projeto |
|
|
@@ -223,10 +223,15 @@ function resolveArtifactCandidates(projectRoot, activeSession) {
|
|
|
223
223
|
session_manifest: withFallback('session_manifest', 'session', scoped.sessionManifest || null, null, 'session'),
|
|
224
224
|
sessions_index: withFallback('sessions_index', 'session_index', base.sessionsIndex, null, 'project'),
|
|
225
225
|
execution_state: withFallback('execution_state', 'state', scoped.executionState || null, null, 'session'),
|
|
226
|
-
spec: withFallback('spec', 'spec', scoped.spec, base.spec),
|
|
227
|
-
discuss: withFallback('discuss', 'discuss', scoped.discuss, base.discuss),
|
|
228
|
-
plan: withFallback('plan', 'plan', scoped.plan, base.plan),
|
|
229
|
-
|
|
226
|
+
spec: withFallback('spec', 'spec', scoped.spec, base.spec),
|
|
227
|
+
discuss: withFallback('discuss', 'discuss', scoped.discuss, base.discuss),
|
|
228
|
+
plan: withFallback('plan', 'plan', scoped.plan, base.plan),
|
|
229
|
+
implementation_pack_md: withFallback('implementation_pack_md', 'execution_contract', scoped.implementationPackMd, base.implementationPackMd),
|
|
230
|
+
implementation_pack_json: withFallback('implementation_pack_json', 'execution_contract', scoped.implementationPackJson, base.implementationPackJson),
|
|
231
|
+
reference_anchors: withFallback('reference_anchors', 'reference_anchors', scoped.referenceAnchors, base.referenceAnchors),
|
|
232
|
+
fixture_pack_md: withFallback('fixture_pack_md', 'fixtures', scoped.fixturePackMd, base.fixturePackMd),
|
|
233
|
+
fixture_pack_json: withFallback('fixture_pack_json', 'fixtures', scoped.fixturePackJson, base.fixturePackJson),
|
|
234
|
+
plan_agents: withFallback('plan_agents', 'plan_agents', scoped.planAgents, base.planAgents),
|
|
230
235
|
quick: withFallback('quick', 'plan', scoped.quick, base.quick),
|
|
231
236
|
runtime: withFallback('runtime', 'runtime', scoped.runtime, base.runtime),
|
|
232
237
|
checkpoints: withFallback('checkpoints', 'checkpoints', scoped.checkpoints, base.checkpoints),
|
|
@@ -152,35 +152,69 @@ function parseVerify(md) {
|
|
|
152
152
|
return { criteria, mentionedCriteria: Array.from(new Set((md.match(/\bA\d+\b/g) || []).map((x) => x.toUpperCase()))), failed: /\b(verify_failed|falhou|falha|reprovad)\b/i.test(md), passed: /\b(verify_complete|aprovad|passou|sucesso)\b/i.test(md) };
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
function confidenceBand(confidence, threshold) {
|
|
156
|
-
|
|
157
|
-
if (confidence
|
|
158
|
-
if (confidence
|
|
159
|
-
if (confidence >=
|
|
160
|
-
return '
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
155
|
+
function confidenceBand(confidence, threshold) {
|
|
156
|
+
const normalizedThreshold = health.normalizePlanConfidenceThreshold(threshold);
|
|
157
|
+
if (confidence == null) return 'unknown';
|
|
158
|
+
if (health.isExecutablePlanConfidence(confidence, normalizedThreshold)) return 'ready';
|
|
159
|
+
if (confidence >= Math.max(80, normalizedThreshold - 10)) return 'rational_but_not_ready';
|
|
160
|
+
if (confidence >= 50) return 'needs_refinement';
|
|
161
|
+
return 'do_not_execute';
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function computeReadiness(ctx, threshold) {
|
|
165
|
+
if (ctx.workspaceMode === 'product_package' && ctx.releaseReadiness) {
|
|
166
|
+
const blockers = Array.isArray(ctx.releaseReadiness.blockers) ? ctx.releaseReadiness.blockers.slice() : [];
|
|
167
|
+
const warnings = Array.isArray(ctx.releaseReadiness.warnings) ? ctx.releaseReadiness.warnings.slice() : [];
|
|
168
|
+
return {
|
|
169
|
+
go: Boolean(ctx.releaseReadiness.ok),
|
|
170
|
+
decision: ctx.releaseReadiness.ok ? 'go' : 'no-go',
|
|
171
|
+
threshold: health.normalizePlanConfidenceThreshold(threshold),
|
|
172
|
+
confidence: ctx.plan && ctx.plan.selfEvaluation ? ctx.plan.selfEvaluation.confidence : null,
|
|
173
|
+
confidenceBand: confidenceBand(ctx.plan && ctx.plan.selfEvaluation ? ctx.plan.selfEvaluation.confidence : null, threshold),
|
|
174
|
+
checkpointPending: false,
|
|
175
|
+
blockers,
|
|
176
|
+
warnings,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const normalizedThreshold = health.normalizePlanConfidenceThreshold(threshold);
|
|
180
|
+
const blockers = [];
|
|
181
|
+
const warnings = [...ctx.diagnostics.reviewWarnings, ...ctx.diagnostics.runtimeWarnings, ...ctx.diagnostics.planWarnings];
|
|
182
|
+
if (!ctx.plan.selfEvaluation || !ctx.plan.selfEvaluation.hasSection) blockers.push('self_evaluation:missing');
|
|
183
|
+
if (ctx.plan.selfEvaluation && Array.isArray(ctx.plan.selfEvaluation.warnings) && ctx.plan.selfEvaluation.warnings.length) {
|
|
184
|
+
blockers.push(`self_evaluation:warnings:${ctx.plan.selfEvaluation.warnings.length}`);
|
|
185
|
+
}
|
|
186
|
+
if (ctx.planReviewStatus !== 'approved') blockers.push(`review_status:${ctx.planReviewStatus || 'draft'}`);
|
|
187
|
+
if (ctx.plan.selfEvaluation.bestPlan === 'não') blockers.push('best_plan:no');
|
|
188
|
+
if (ctx.plan.selfEvaluation.confidence == null) blockers.push('confidence:missing');
|
|
189
|
+
else if (!health.isExecutablePlanConfidence(ctx.plan.selfEvaluation.confidence, normalizedThreshold)) {
|
|
190
|
+
blockers.push(`confidence:${ctx.plan.selfEvaluation.confidence}%<=${normalizedThreshold}%`);
|
|
191
|
+
}
|
|
192
|
+
if (!ctx.executionRationality || !ctx.executionRationality.implementationPackReady) {
|
|
193
|
+
blockers.push('implementation_pack:not_ready');
|
|
194
|
+
}
|
|
195
|
+
if (!ctx.executionRationality || !ctx.executionRationality.referenceAnchorsReady) {
|
|
196
|
+
blockers.push('reference_anchors:not_ready');
|
|
197
|
+
}
|
|
198
|
+
if (!ctx.executionRationality || !ctx.executionRationality.fixturePackReady) {
|
|
199
|
+
blockers.push('fixture_pack:not_ready');
|
|
200
|
+
}
|
|
201
|
+
if (ctx.checkpoints.parsed.some((x) => /pending_approval/i.test(x.status))) blockers.push('checkpoint:pending_approval');
|
|
202
|
+
if (ctx.runtime.parsed.status === 'blocked') blockers.push('runtime:blocked');
|
|
203
|
+
if (ctx.spec.uncoveredCriteria.length) warnings.push(`${ctx.spec.uncoveredCriteria.length} critérios sem cobertura no plano`);
|
|
204
|
+
if (ctx.executionRationality && Array.isArray(ctx.executionRationality.criticalExecutionGaps)) {
|
|
205
|
+
warnings.push(...ctx.executionRationality.criticalExecutionGaps);
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
go: blockers.length === 0,
|
|
209
|
+
decision: blockers.length === 0 ? 'go' : 'no-go',
|
|
210
|
+
threshold: normalizedThreshold,
|
|
211
|
+
confidence: ctx.plan.selfEvaluation.confidence,
|
|
212
|
+
confidenceBand: confidenceBand(ctx.plan.selfEvaluation.confidence, normalizedThreshold),
|
|
213
|
+
checkpointPending: blockers.includes('checkpoint:pending_approval'),
|
|
214
|
+
blockers,
|
|
215
|
+
warnings,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
184
218
|
|
|
185
219
|
function buildCoverageMatrix(spec, plan, verify) {
|
|
186
220
|
const taskMap = new Map();
|
|
@@ -202,18 +236,27 @@ function buildCoverageMatrix(spec, plan, verify) {
|
|
|
202
236
|
}));
|
|
203
237
|
}
|
|
204
238
|
|
|
205
|
-
function computeCalibration(phase, confidence, verify) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
if (
|
|
212
|
-
if (confidence
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
239
|
+
function computeCalibration(phase, confidence, verify, threshold) {
|
|
240
|
+
const normalizedThreshold = health.normalizePlanConfidenceThreshold(threshold);
|
|
241
|
+
if (confidence == null) return { status: 'pending', summary: 'Calibração indisponível antes do verify.' };
|
|
242
|
+
const low = String(phase || '').toLowerCase();
|
|
243
|
+
const completed = low === 'verify_complete' || verify.passed;
|
|
244
|
+
const failed = low === 'verify_failed' || verify.failed;
|
|
245
|
+
if (!completed && !failed) return { status: 'pending', summary: 'Calibração só fecha após verify.' };
|
|
246
|
+
if (health.isExecutablePlanConfidence(confidence, normalizedThreshold) && failed) {
|
|
247
|
+
return { status: 'overconfident', summary: `Confiança ${confidence}% acima do gate executável, mas o verify falhou.` };
|
|
248
|
+
}
|
|
249
|
+
if (!health.isExecutablePlanConfidence(confidence, normalizedThreshold) && failed) {
|
|
250
|
+
return { status: 'calibrated-risk', summary: `O plano já sinalizava risco (${confidence}%) abaixo do gate executável e o verify confirmou a fragilidade.` };
|
|
251
|
+
}
|
|
252
|
+
if (!health.isExecutablePlanConfidence(confidence, normalizedThreshold) && completed) {
|
|
253
|
+
return { status: 'underconfident', summary: `O resultado final foi melhor que a confiança inicial (${confidence}%), mas o plano ainda não superava o gate executável.` };
|
|
254
|
+
}
|
|
255
|
+
if (health.isExecutablePlanConfidence(confidence, normalizedThreshold) && completed) {
|
|
256
|
+
return { status: 'well-calibrated', summary: `Alta confiança executável (${confidence}%) e verify coerente com a expectativa.` };
|
|
257
|
+
}
|
|
258
|
+
return { status: 'acceptable', summary: `Confiança ${confidence}% e verify dentro da faixa esperada.` };
|
|
259
|
+
}
|
|
217
260
|
|
|
218
261
|
function readRepositoryContext(codebaseDir) {
|
|
219
262
|
const names = ['OVERVIEW.md', 'STACK.md', 'STRUCTURE.md', 'TESTING.md', 'CONCERNS.md', 'INTEGRATIONS.md'];
|
|
@@ -320,7 +363,7 @@ function loadDashboardContext(projectRoot, opts = {}) {
|
|
|
320
363
|
const activeSession = opts.activeSession === undefined ? health.parseActiveSession(stateText) : opts.activeSession;
|
|
321
364
|
const p = reviewPaths(projectRoot, activeSession || null);
|
|
322
365
|
const rootScoped = reviewPaths(projectRoot, null);
|
|
323
|
-
const report = health.buildHealthReport(projectRoot);
|
|
366
|
+
const report = health.buildHealthReport(projectRoot);
|
|
324
367
|
const specText = readScopedText(p.spec, rootScoped.spec);
|
|
325
368
|
const planText = readScopedText(p.plan, rootScoped.plan);
|
|
326
369
|
const verifyText = readScopedText(p.verify, rootScoped.verify);
|
|
@@ -344,21 +387,24 @@ function loadDashboardContext(projectRoot, opts = {}) {
|
|
|
344
387
|
const sessions = parseSessionsIndex(sessionsRaw);
|
|
345
388
|
const sessionPath = activeSession ? path.join(projectRoot, '.oxe', activeSession, 'SESSION.md') : null;
|
|
346
389
|
const sessionRaw = sessionPath ? readTextIfExists(sessionPath) || '' : '';
|
|
347
|
-
const ctx = {
|
|
348
|
-
projectRoot: path.resolve(projectRoot),
|
|
349
|
-
|
|
390
|
+
const ctx = {
|
|
391
|
+
projectRoot: path.resolve(projectRoot),
|
|
392
|
+
workspaceMode: report.workspaceMode || 'oxe_project',
|
|
393
|
+
releaseReadiness: report.releaseReadiness || null,
|
|
394
|
+
activeSession: activeSession || null,
|
|
350
395
|
phase: report.phase || health.parseStatePhase(stateText),
|
|
351
396
|
healthStatus: report.healthStatus,
|
|
352
397
|
nextStep: report.next,
|
|
353
398
|
planReviewStatus: report.planReviewStatus || 'draft',
|
|
354
399
|
state: { path: globalPaths.state, raw: stateText, parsed: { phase: health.parseStatePhase(stateText), activeSession, runtimeStatus: firstMatch(stateText, /\*\*runtime_status:\*\*\s*([^\n]+)/i) } },
|
|
355
400
|
spec: { path: p.spec, raw: specText, objective: spec.objective, criteria: spec.criteria, uncoveredCriteria: spec.criteria.filter((c) => !plan.tasks.some((t) => (t.aceite || []).includes(c.id))) },
|
|
356
|
-
plan: { path: p.plan, raw: planText, tasks: plan.tasks, waves: plan.waves, totalTasks: plan.totalTasks, selfEvaluation: report.planSelfEvaluation },
|
|
357
|
-
|
|
401
|
+
plan: { path: p.plan, raw: planText, tasks: plan.tasks, waves: plan.waves, totalTasks: plan.totalTasks, selfEvaluation: report.planSelfEvaluation },
|
|
402
|
+
executionRationality: report.executionRationality || null,
|
|
403
|
+
runtime: { path: p.runtime, raw: runtimeText, summary: summarizeText(runtimeText, 800), parsed: runtime },
|
|
358
404
|
activeRun: activeRunState,
|
|
359
405
|
runtimeCanonical: activeRunState && activeRunState.canonical_state ? activeRunState.canonical_state : null,
|
|
360
406
|
compiledGraph: activeRunState && activeRunState.compiled_graph ? activeRunState.compiled_graph : null,
|
|
361
|
-
enterprise: {
|
|
407
|
+
enterprise: {
|
|
362
408
|
runtimeMode: report.runtimeMode || null,
|
|
363
409
|
fallbackMode: report.fallbackMode || null,
|
|
364
410
|
verificationSummary: report.verificationSummary || null,
|
|
@@ -374,9 +420,14 @@ function loadDashboardContext(projectRoot, opts = {}) {
|
|
|
374
420
|
promotionReadiness: report.promotionReadiness || null,
|
|
375
421
|
recoveryState: report.recoveryState || null,
|
|
376
422
|
multiAgent: report.multiAgent || null,
|
|
377
|
-
providerCatalog: report.providerCatalog || null,
|
|
378
|
-
|
|
379
|
-
|
|
423
|
+
providerCatalog: report.providerCatalog || null,
|
|
424
|
+
implementationPackReady: report.implementationPackReady,
|
|
425
|
+
referenceAnchorsReady: report.referenceAnchorsReady,
|
|
426
|
+
fixturePackReady: report.fixturePackReady,
|
|
427
|
+
executionRationalityReady: report.executionRationalityReady,
|
|
428
|
+
criticalExecutionGaps: report.criticalExecutionGaps || [],
|
|
429
|
+
warnings: report.enterpriseWarn || [],
|
|
430
|
+
},
|
|
380
431
|
tracing: { path: operational.operationalPaths(projectRoot, activeSession || null).events, events: traceEvents, summary: traceSummary },
|
|
381
432
|
checkpoints: { path: p.checkpoints, raw: checkpointsText, parsed: checkpoints },
|
|
382
433
|
verify: { path: p.verify, raw: verifyText, summary: summarizeText(verifyText, 800), parsed: verify },
|
|
@@ -422,13 +473,44 @@ function loadDashboardContext(projectRoot, opts = {}) {
|
|
|
422
473
|
summary: `login=${ctx.azure.authStatus && ctx.azure.authStatus.login_active ? 'ativo' : 'ausente'} · subscription=${ctx.azure.profile && (ctx.azure.profile.subscription_name || ctx.azure.profile.subscription_id) || '—'} · total=${inventorySummary.total} · sb=${inventorySummary.servicebus || 0} · eg=${inventorySummary.eventgrid || 0} · sql=${inventorySummary.sql || 0}`,
|
|
423
474
|
};
|
|
424
475
|
}
|
|
425
|
-
ctx.readiness = computeReadiness(ctx,
|
|
426
|
-
ctx.coverage = buildCoverageMatrix(ctx.spec, ctx.plan, verify);
|
|
427
|
-
ctx.calibration = computeCalibration(ctx.phase, ctx.plan.selfEvaluation.confidence, verify);
|
|
428
|
-
ctx.visual = {
|
|
429
|
-
flow: { nodes: [{ label: 'STATE', status: 'done' }, { label: 'SPEC', status: ctx.spec.raw ? 'done' : 'pending' }, { label: 'PLAN', status: ctx.plan.raw ? 'done' : 'pending' }, { label: 'REVIEW', status: ctx.planReviewStatus === 'approved' ? 'done' : /(rejected|needs_revision)/i.test(ctx.planReviewStatus) ? 'blocked' : 'active' }, { label: 'EXECUTE', status: ctx.runtime.parsed.status === 'running' ? 'active' : ctx.runtime.raw ? 'done' : 'pending' }, { label: 'CHECKPOINTS', status: ctx.readiness.checkpointPending ? 'active' : ctx.checkpoints.parsed.length ? 'done' : 'pending' }, { label: 'VERIFY', status: ctx.verify.raw ? 'done' : 'pending' }, { label: 'LESSONS', status: 'pending' }] },
|
|
430
|
-
artifactGraph: [
|
|
431
|
-
|
|
476
|
+
ctx.readiness = computeReadiness(ctx, report.planConfidenceThreshold || 90);
|
|
477
|
+
ctx.coverage = buildCoverageMatrix(ctx.spec, ctx.plan, verify);
|
|
478
|
+
ctx.calibration = computeCalibration(ctx.phase, ctx.plan.selfEvaluation.confidence, verify, ctx.readiness.threshold);
|
|
479
|
+
ctx.visual = {
|
|
480
|
+
flow: { nodes: [{ label: 'STATE', status: 'done' }, { label: 'SPEC', status: ctx.spec.raw ? 'done' : 'pending' }, { label: 'PLAN', status: ctx.plan.raw ? 'done' : 'pending' }, { label: 'REVIEW', status: ctx.planReviewStatus === 'approved' ? 'done' : /(rejected|needs_revision)/i.test(ctx.planReviewStatus) ? 'blocked' : 'active' }, { label: 'EXECUTE', status: ctx.runtime.parsed.status === 'running' ? 'active' : ctx.runtime.raw ? 'done' : 'pending' }, { label: 'CHECKPOINTS', status: ctx.readiness.checkpointPending ? 'active' : ctx.checkpoints.parsed.length ? 'done' : 'pending' }, { label: 'VERIFY', status: ctx.verify.raw ? 'done' : 'pending' }, { label: 'LESSONS', status: 'pending' }] },
|
|
481
|
+
artifactGraph: [
|
|
482
|
+
{ id: 'state', label: 'STATE', path: ctx.state.path, detail: ctx.phase || 'índice global', status: 'done' },
|
|
483
|
+
{ id: 'spec', label: 'SPEC', path: ctx.spec.path, detail: ctx.spec.objective || 'contrato', status: ctx.spec.raw ? 'done' : 'pending' },
|
|
484
|
+
{ id: 'plan', label: 'PLAN', path: ctx.plan.path, detail: `${ctx.plan.totalTasks} tarefas`, status: ctx.plan.raw ? 'done' : 'pending' },
|
|
485
|
+
{
|
|
486
|
+
id: 'implementation-pack',
|
|
487
|
+
label: 'IMPLEMENTATION PACK',
|
|
488
|
+
path: ctx.executionRationality && ctx.executionRationality.implementationPack ? ctx.executionRationality.implementationPack.path : '—',
|
|
489
|
+
detail: ctx.executionRationality && ctx.executionRationality.implementationPack ? `${ctx.executionRationality.implementationPack.taskCount || 0} contratos` : 'sem contrato',
|
|
490
|
+
status: ctx.executionRationality && ctx.executionRationality.implementationPackReady ? 'done' : 'blocked',
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
id: 'reference-anchors',
|
|
494
|
+
label: 'REFERENCE ANCHORS',
|
|
495
|
+
path: ctx.executionRationality && ctx.executionRationality.referenceAnchors ? ctx.executionRationality.referenceAnchors.path : '—',
|
|
496
|
+
detail: ctx.executionRationality && ctx.executionRationality.referenceAnchors ? `${ctx.executionRationality.referenceAnchors.anchors ? ctx.executionRationality.referenceAnchors.anchors.length : 0} âncoras` : 'sem âncoras',
|
|
497
|
+
status: ctx.executionRationality && ctx.executionRationality.referenceAnchorsReady ? 'done' : 'blocked',
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
id: 'fixture-pack',
|
|
501
|
+
label: 'FIXTURE PACK',
|
|
502
|
+
path: ctx.executionRationality && ctx.executionRationality.fixturePack ? ctx.executionRationality.fixturePack.path : '—',
|
|
503
|
+
detail: ctx.executionRationality && ctx.executionRationality.fixturePack ? `${ctx.executionRationality.fixturePack.fixtureCount || 0} fixtures` : 'sem fixtures',
|
|
504
|
+
status: ctx.executionRationality && ctx.executionRationality.fixturePackReady ? 'done' : 'blocked',
|
|
505
|
+
},
|
|
506
|
+
{ id: 'review', label: 'PLAN REVIEW', path: ctx.review.markdownPath, detail: ctx.planReviewStatus, status: ctx.planReviewStatus === 'approved' ? 'done' : 'active' },
|
|
507
|
+
{ id: 'runtime', label: 'RUNTIME', path: ctx.runtime.path, detail: ctx.runtime.parsed.status || 'sem status', status: ctx.runtime.raw ? 'active' : 'pending' },
|
|
508
|
+
{ id: 'active-run', label: 'ACTIVE RUN', path: operational.operationalPaths(projectRoot, activeSession || null).activeRun, detail: ctx.activeRun && ctx.activeRun.run_id ? `${ctx.activeRun.run_id} · ${ctx.activeRun.status}` : 'sem run ativo', status: ctx.activeRun ? 'active' : 'pending' },
|
|
509
|
+
{ id: 'events', label: 'TRACE', path: operational.operationalPaths(projectRoot, activeSession || null).events, detail: `${ctx.tracing.summary.total} evento(s)`, status: ctx.tracing.summary.total ? 'done' : 'pending' },
|
|
510
|
+
{ id: 'checkpoints', label: 'CHECKPOINTS', path: ctx.checkpoints.path, detail: `${ctx.checkpoints.parsed.length} gates`, status: ctx.readiness.checkpointPending ? 'active' : 'pending' },
|
|
511
|
+
{ id: 'verify', label: 'VERIFY', path: ctx.verify.path, detail: ctx.calibration.status, status: ctx.verify.raw ? 'done' : 'pending' },
|
|
512
|
+
],
|
|
513
|
+
};
|
|
432
514
|
if (ctx.azure) {
|
|
433
515
|
ctx.visual.artifactGraph.push(
|
|
434
516
|
{
|