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.
Files changed (50) hide show
  1. package/.cursor/commands/oxe-dashboard.md +2 -2
  2. package/.cursor/commands/oxe-execute.md +2 -2
  3. package/.cursor/commands/oxe-plan.md +2 -2
  4. package/.github/prompts/oxe-dashboard.prompt.md +2 -2
  5. package/.github/prompts/oxe-execute.prompt.md +2 -2
  6. package/.github/prompts/oxe-plan.prompt.md +2 -2
  7. package/AGENTS.md +1 -1
  8. package/CHANGELOG.md +52 -0
  9. package/README.md +17 -15
  10. package/bin/lib/oxe-context-engine.cjs +9 -4
  11. package/bin/lib/oxe-dashboard.cjs +140 -58
  12. package/bin/lib/oxe-project-health.cjs +486 -151
  13. package/bin/lib/oxe-rationality.cjs +385 -0
  14. package/bin/lib/oxe-release.cjs +76 -4
  15. package/bin/oxe-cc.js +113 -58
  16. package/commands/oxe/dashboard.md +2 -2
  17. package/commands/oxe/execute.md +2 -2
  18. package/commands/oxe/plan.md +2 -2
  19. package/docs/RELEASE-READINESS.md +8 -0
  20. package/docs/RUNTIME-SMOKE-MATRIX.md +9 -2
  21. package/lib/sdk/index.cjs +20 -11
  22. package/lib/sdk/index.d.ts +99 -34
  23. package/oxe/templates/CONFIG.md +3 -3
  24. package/oxe/templates/EXECUTION-RUNTIME.template.md +1 -1
  25. package/oxe/templates/FIXTURE-PACK.template.json +34 -0
  26. package/oxe/templates/FIXTURE-PACK.template.md +21 -0
  27. package/oxe/templates/IMPLEMENTATION-PACK.template.json +52 -0
  28. package/oxe/templates/IMPLEMENTATION-PACK.template.md +36 -0
  29. package/oxe/templates/INVESTIGATION.template.md +38 -38
  30. package/oxe/templates/PLAN.template.md +23 -14
  31. package/oxe/templates/REFERENCE-ANCHORS.template.md +24 -0
  32. package/oxe/templates/RESEARCH.template.md +11 -11
  33. package/oxe/templates/SPEC.template.md +6 -6
  34. package/oxe/templates/SUMMARY.template.md +20 -20
  35. package/oxe/templates/config.template.json +1 -1
  36. package/oxe/workflows/execute.md +18 -2
  37. package/oxe/workflows/milestone.md +12 -12
  38. package/oxe/workflows/next.md +1 -1
  39. package/oxe/workflows/plan.md +115 -57
  40. package/oxe/workflows/references/adaptive-discovery.md +27 -27
  41. package/oxe/workflows/references/flow-robustness-contract.md +80 -80
  42. package/oxe/workflows/references/session-path-resolution.md +71 -71
  43. package/oxe/workflows/references/workflow-runtime-contracts.json +36 -4
  44. package/oxe/workflows/verify.md +4 -4
  45. package/oxe/workflows/workstream.md +16 -16
  46. package/package.json +1 -1
  47. package/packages/runtime/package.json +1 -1
  48. package/vscode-extension/oxe-agents-1.5.1.vsix +0 -0
  49. package/vscode-extension/oxe-agents-1.6.0.vsix +0 -0
  50. 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: 37f74d8be3442fe1
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:** `37f74d8be3442fe1`
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: 14ddb483209b28b3
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:** `14ddb483209b28b3`
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: 7809d830a5f5ff4a
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:** `7809d830a5f5ff4a`
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: 37f74d8be3442fe1
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:** `37f74d8be3442fe1`
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: 14ddb483209b28b3
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:** `14ddb483209b28b3`
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: 7809d830a5f5ff4a
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:** `7809d830a5f5ff4a`
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
  [![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:** `1.5.0` · [package.json](package.json)
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 mínimo: só `.oxe/` (padrão) |
529
- | `--force` / `-f` | Sobrescreve arquivos existentes (use para atualizar) |
530
- | `--dry-run` | Lista ações sem escrever |
531
- | `--oxe-only` | workflows em `.oxe/`, sem integrações IDE |
532
- | `--no-global-cli` / `-l` | Não instala `oxe-cc` globalmente (útil em CI) |
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` | `70` | Limiar mínimo para `execute` aceitar um `PLAN.md` |
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
- plan_agents: withFallback('plan_agents', 'plan_agents', base.planAgents, null, 'project'),
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
- if (confidence == null) return 'unknown';
157
- if (confidence >= 85) return 'ready';
158
- if (confidence >= threshold) return 'controlled';
159
- if (confidence >= 50) return 'needs_refinement';
160
- return 'do_not_execute';
161
- }
162
-
163
- function computeReadiness(ctx, threshold) {
164
- const blockers = [];
165
- const warnings = [...ctx.diagnostics.reviewWarnings, ...ctx.diagnostics.runtimeWarnings, ...ctx.diagnostics.planWarnings];
166
- if (ctx.planReviewStatus !== 'approved') blockers.push(`review_status:${ctx.planReviewStatus || 'draft'}`);
167
- if (ctx.plan.selfEvaluation.bestPlan === 'não') blockers.push('best_plan:no');
168
- if (ctx.plan.selfEvaluation.confidence == null) blockers.push('confidence:missing');
169
- else if (ctx.plan.selfEvaluation.confidence < threshold) blockers.push(`confidence:${ctx.plan.selfEvaluation.confidence}%<${threshold}%`);
170
- if (ctx.checkpoints.parsed.some((x) => /pending_approval/i.test(x.status))) blockers.push('checkpoint:pending_approval');
171
- if (ctx.runtime.parsed.status === 'blocked') blockers.push('runtime:blocked');
172
- if (ctx.spec.uncoveredCriteria.length) warnings.push(`${ctx.spec.uncoveredCriteria.length} critérios sem cobertura no plano`);
173
- return {
174
- go: blockers.length === 0,
175
- decision: blockers.length === 0 ? 'go' : 'no-go',
176
- threshold,
177
- confidence: ctx.plan.selfEvaluation.confidence,
178
- confidenceBand: confidenceBand(ctx.plan.selfEvaluation.confidence, threshold),
179
- checkpointPending: blockers.includes('checkpoint:pending_approval'),
180
- blockers,
181
- warnings,
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
- if (confidence == null) return { status: 'pending', summary: 'Calibração indisponível antes do verify.' };
207
- const low = String(phase || '').toLowerCase();
208
- const completed = low === 'verify_complete' || verify.passed;
209
- const failed = low === 'verify_failed' || verify.failed;
210
- if (!completed && !failed) return { status: 'pending', summary: 'Calibração só fecha após verify.' };
211
- if (confidence >= 85 && failed) return { status: 'overconfident', summary: `Confiança ${confidence}% alta, mas o verify falhou.` };
212
- if (confidence < 70 && failed) return { status: 'calibrated-risk', summary: `O plano já sinalizava risco (${confidence}%) e o verify confirmou a fragilidade.` };
213
- if (confidence < 70 && completed) return { status: 'underconfident', summary: `O resultado final foi melhor que a confiança inicial (${confidence}%).` };
214
- if (confidence >= 85 && completed) return { status: 'well-calibrated', summary: `Alta confiança (${confidence}%) e verify coerente com a expectativa.` };
215
- return { status: 'acceptable', summary: `Confiança ${confidence}% e verify dentro da faixa esperada.` };
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 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
- activeSession: activeSession || null,
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
- runtime: { path: p.runtime, raw: runtimeText, summary: summarizeText(runtimeText, 800), parsed: runtime },
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
- warnings: report.enterpriseWarn || [],
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, 70);
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: [{ id: 'state', label: 'STATE', path: ctx.state.path, detail: ctx.phase || 'índice global', status: 'done' }, { id: 'spec', label: 'SPEC', path: ctx.spec.path, detail: ctx.spec.objective || 'contrato', status: ctx.spec.raw ? 'done' : 'pending' }, { id: 'plan', label: 'PLAN', path: ctx.plan.path, detail: `${ctx.plan.totalTasks} tarefas`, status: ctx.plan.raw ? 'done' : 'pending' }, { id: 'review', label: 'PLAN REVIEW', path: ctx.review.markdownPath, detail: ctx.planReviewStatus, status: ctx.planReviewStatus === 'approved' ? 'done' : 'active' }, { id: 'runtime', label: 'RUNTIME', path: ctx.runtime.path, detail: ctx.runtime.parsed.status || 'sem status', status: ctx.runtime.raw ? 'active' : 'pending' }, { 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' }, { 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' }, { id: 'checkpoints', label: 'CHECKPOINTS', path: ctx.checkpoints.path, detail: `${ctx.checkpoints.parsed.length} gates`, status: ctx.readiness.checkpointPending ? 'active' : 'pending' }, { id: 'verify', label: 'VERIFY', path: ctx.verify.path, detail: ctx.calibration.status, status: ctx.verify.raw ? 'done' : 'pending' }],
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
  {