@orkastery/cli 0.5.3 → 0.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/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +195 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
- package/adapters/openclaw/README.md +83 -10
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +193 -15
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +13 -2
- package/dist/agents-md.js +24 -15
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +68 -48
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +98 -43
- package/dist/branch-de-estado.js +39 -9
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +35 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -0
- package/dist/ci.js +255 -46
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +350 -0
- package/dist/claims.js +13 -10
- package/dist/company-brain-client.js +45 -3
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +47 -6
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +405 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +206 -59
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +514 -0
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +103 -82
- package/dist/doctor-forja.js +345 -0
- package/dist/doctor-pulse-cron.js +294 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +278 -116
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +158 -57
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +42 -17
- package/dist/evalrunner.js +35 -32
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +323 -0
- package/dist/fabrica-estado.js +49 -16
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +24 -21
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +124 -81
- package/dist/gates.js +3 -28
- package/dist/handoff.js +33 -19
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +53 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +72 -3
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +63 -64
- package/dist/horario.js +30 -7
- package/dist/hosts.js +155 -134
- package/dist/impedimento.js +108 -14
- package/dist/index.js +1421 -1019
- package/dist/indice-vetorial.js +14 -12
- package/dist/indice.js +7 -1
- package/dist/init.js +54 -49
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +213 -88
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +96 -34
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +46 -2
- package/dist/licoes.js +12 -11
- package/dist/liveness.js +6 -3
- package/dist/locale-accounts.js +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +833 -0
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +290 -0
- package/dist/locale-gerados.js +165 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +182 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +349 -0
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +524 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +597 -0
- package/dist/locale-thread.js +421 -0
- package/dist/locale-verify.js +201 -0
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +1258 -0
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +415 -13
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +31 -7
- package/dist/master-digest.js +6 -1
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +14 -8
- package/dist/master.js +139 -65
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-install.js +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +90 -16
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +71 -25
- package/dist/mcp-transportes.js +17 -0
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +63 -58
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +20 -24
- package/dist/network-roadmap.js +90 -51
- package/dist/noctum-aceite.js +789 -0
- package/dist/noctum-arco.js +1418 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +1046 -0
- package/dist/noctum-execucao.js +376 -0
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +314 -0
- package/dist/noctum-guarda.js +256 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +383 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +362 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +591 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +827 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +639 -0
- package/dist/ocupacao.js +32 -3
- package/dist/onboarding.js +56 -26
- package/dist/orkmind.js +48 -25
- package/dist/orquestracao.js +44 -47
- package/dist/parado-no-condutor.js +174 -127
- package/dist/phase.js +144 -63
- package/dist/policies.js +37 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +235 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +220 -0
- package/dist/projeto-alvo.js +186 -24
- package/dist/prompts.js +140 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +151 -24
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +188 -22
- package/dist/ratelimit.js +16 -6
- package/dist/recall.js +14 -13
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +66 -47
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +451 -212
- package/dist/roadmap-reservas.js +45 -28
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +284 -32
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +355 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +188 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +26 -5
- package/dist/session-watcher-claude.js +81 -20
- package/dist/session-watcher.js +340 -42
- package/dist/sessoes-contas.js +10 -1
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- package/dist/ship-publicar.js +971 -0
- package/dist/ship.js +243 -97
- package/dist/steal.js +77 -0
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +12 -11
- package/dist/thread.js +274 -100
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +13 -3
- package/dist/varredura-acoes.js +507 -0
- package/dist/verify.js +608 -76
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +167 -0
- package/dist/worktree.js +99 -83
- package/dist/yaml.js +27 -8
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +9 -4
- package/references/security-checklist.md +3 -3
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/verify.js
CHANGED
|
@@ -12,33 +12,91 @@
|
|
|
12
12
|
* agora falha) de DIVIDA PRE-EXISTENTE (ja falhava). Sem baseline, a falha e
|
|
13
13
|
* declarada como `verify.failed`, e nao como regressao que nao da para provar.
|
|
14
14
|
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
15
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.PREFIXO_BLOQUEADO_NO_VERIFY = exports.TIMEOUT_VERIFY_MS = void 0;
|
|
49
|
+
exports.ESPERA_PADRAO_DA_FILA_PESADA_MS = exports.ESPERA_DA_FILA_PESADA_MS = exports.MARGEM_MAX_DO_SCAN_MS = exports.PREFIXO_BLOQUEADO_NO_VERIFY = exports.TIMEOUT_VERIFY_MS = void 0;
|
|
17
50
|
exports.ambienteDoVerify = ambienteDoVerify;
|
|
18
51
|
exports.prazoDoComando = prazoDoComando;
|
|
52
|
+
exports.prazoInternoDoScan = prazoInternoDoScan;
|
|
53
|
+
exports.ehComandoDoScan = ehComandoDoScan;
|
|
54
|
+
exports.prazoDaExecucao = prazoDaExecucao;
|
|
55
|
+
exports.executorDoManifesto = executorDoManifesto;
|
|
19
56
|
exports.executar = executar;
|
|
57
|
+
exports.resultadoDoProcesso = resultadoDoProcesso;
|
|
58
|
+
exports.semVereditoPorTempo = semVereditoPorTempo;
|
|
59
|
+
exports.executorComSteal = executorComSteal;
|
|
20
60
|
exports.identidadeDoProduto = identidadeDoProduto;
|
|
21
61
|
exports.causaDoEncerramento = causaDoEncerramento;
|
|
22
62
|
exports.comandoNoLedger = comandoNoLedger;
|
|
23
63
|
exports.comandosDoManifesto = comandosDoManifesto;
|
|
24
64
|
exports.cwdDaThread = cwdDaThread;
|
|
25
65
|
exports.commitReal = commitReal;
|
|
66
|
+
exports.executorDaRodada = executorDaRodada;
|
|
67
|
+
exports.ambienteDoModo = ambienteDoModo;
|
|
68
|
+
exports.vereditoDaBaseline = vereditoDaBaseline;
|
|
26
69
|
exports.gravarBaseline = gravarBaseline;
|
|
27
70
|
exports.verificarClaim = verificarClaim;
|
|
28
71
|
exports.verificar = verificar;
|
|
72
|
+
exports.linhasDaBaseline = linhasDaBaseline;
|
|
29
73
|
exports.textoDoVerify = textoDoVerify;
|
|
30
74
|
const claims_1 = require("./claims");
|
|
31
75
|
const gates_1 = require("./gates");
|
|
32
76
|
const ledger_1 = require("./ledger");
|
|
33
77
|
const thread_1 = require("./thread");
|
|
78
|
+
const estado_thread_1 = require("./estado-thread");
|
|
79
|
+
const dependencias_da_worktree_1 = require("./dependencias-da-worktree");
|
|
80
|
+
const fs = __importStar(require("node:fs"));
|
|
34
81
|
const node_fs_1 = require("node:fs");
|
|
82
|
+
const path = __importStar(require("node:path"));
|
|
35
83
|
const node_path_1 = require("node:path");
|
|
36
84
|
const node_crypto_1 = require("node:crypto");
|
|
37
85
|
const util_1 = require("./util");
|
|
38
86
|
const horario_1 = require("./horario");
|
|
87
|
+
const locale_1 = require("./locale");
|
|
39
88
|
const redacao_saida_1 = require("./redacao-saida");
|
|
89
|
+
const steal_1 = require("./steal");
|
|
90
|
+
const instabilidade_1 = require("./instabilidade");
|
|
91
|
+
const fila_pesada_1 = require("./fila-pesada");
|
|
40
92
|
const redacao_url_1 = require("./redacao-url");
|
|
41
93
|
const conducao_1 = require("./conducao");
|
|
94
|
+
const procedencia_1 = require("./procedencia");
|
|
95
|
+
const dado_privado_1 = require("./dado-privado");
|
|
96
|
+
const policies_1 = require("./policies");
|
|
97
|
+
const check_modo_1 = require("./check-modo");
|
|
98
|
+
const check_agil_1 = require("./check-agil");
|
|
99
|
+
const check_paralelo_1 = require("./check-paralelo");
|
|
42
100
|
/** Teto de tempo de um comando de verificacao (build e suite completa cabem). */
|
|
43
101
|
exports.TIMEOUT_VERIFY_MS = 10 * 60 * 1000;
|
|
44
102
|
/** Ultimas linhas da saida real, o suficiente para servir de evidencia no ledger. */
|
|
@@ -59,14 +117,60 @@ const TIMEOUT_BIN = '/usr/bin/timeout';
|
|
|
59
117
|
* valvula de escape: comando que precise delas vira escalacao para humano.
|
|
60
118
|
*/
|
|
61
119
|
exports.PREFIXO_BLOQUEADO_NO_VERIFY = 'ORK_HITL_';
|
|
120
|
+
/**
|
|
121
|
+
* RM-072 (S-b do CHECK 2): as variaveis de uma rodada do Agile. Cada rodada poe as suas onde precisa; herdadas de outra
|
|
122
|
+
* rodada (o verify que roda dentro de um comando de outro verify), elas levariam pecas ao relatorio errado.
|
|
123
|
+
*/
|
|
124
|
+
const VARIAVEIS_DA_RODADA = new Set([check_modo_1.ENV_RELATORIO_DO_CHECK, check_modo_1.ENV_VARREDURA_PARALELA_DO_CHECK]);
|
|
62
125
|
function ambienteDoVerify(base = process.env) {
|
|
63
|
-
return Object.fromEntries(Object.entries(base).filter(([chave]) => !chave.startsWith(exports.PREFIXO_BLOQUEADO_NO_VERIFY)
|
|
126
|
+
return Object.fromEntries(Object.entries(base).filter(([chave]) => !chave.startsWith(exports.PREFIXO_BLOQUEADO_NO_VERIFY)
|
|
127
|
+
&& !VARIAVEIS_DA_RODADA.has(chave)));
|
|
64
128
|
}
|
|
65
129
|
/** I-37 (D2): o prazo de um comando, resolvido uma vez por rodada (D3). */
|
|
66
130
|
function prazoDoComando(manifesto, nome) {
|
|
67
131
|
const porComando = manifesto.verify.timeout_ms_por_comando;
|
|
68
132
|
return porComando?.[nome] ?? manifesto.verify.timeout_ms ?? exports.TIMEOUT_VERIFY_MS;
|
|
69
133
|
}
|
|
134
|
+
/** Teto da margem que o `security_scan` reserva, dentro do proprio prazo, para os passos que ele nao limita. */
|
|
135
|
+
exports.MARGEM_MAX_DO_SCAN_MS = 300_000;
|
|
136
|
+
/**
|
|
137
|
+
* O prazo interno da rodada do scan (`ORK_SECURITY_SCAN_DEADLINE_MS`): o prazo do comando menos a margem
|
|
138
|
+
* `min(300 s, prazo/4)`, que cobre worktree add, sondas e `docker rm`. Assim a rodada termina, com `failed/timeout`
|
|
139
|
+
* declarado, antes de o `timeout(1)` do verify matar o comando sem relatorio.
|
|
140
|
+
*/
|
|
141
|
+
function prazoInternoDoScan(prazoMs) {
|
|
142
|
+
return prazoMs - Math.min(exports.MARGEM_MAX_DO_SCAN_MS, Math.floor(prazoMs / 4));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* O comando roda o `security_scan`: pelo nome (verify, bundle do CI) ou por ser, na claim, o mesmo comando declarado em
|
|
146
|
+
* `verify.security_scan`. Sem a chave, nada e scan.
|
|
147
|
+
*/
|
|
148
|
+
function ehComandoDoScan(manifesto, nome, comando) {
|
|
149
|
+
if (nome === 'security_scan')
|
|
150
|
+
return true;
|
|
151
|
+
const scan = manifesto.verify.security_scan?.trim();
|
|
152
|
+
return !!scan && comando.trim() === scan;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* O prazo de um comando do manifesto ou de uma claim: a claim que roda o scan ganha o prazo do `security_scan`. RM-072
|
|
156
|
+
* (D4): a lane do Agile (`test:<lane>`) tem o prazo do `test` que ela substitui.
|
|
157
|
+
*/
|
|
158
|
+
function prazoDaExecucao(manifesto, nome, comando) {
|
|
159
|
+
return prazoDoComando(manifesto, ehComandoDoScan(manifesto, nome, comando) ? 'security_scan' : nome.startsWith('test:') ? 'test' : nome);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* O executor resolvido pelo manifesto: prazo de cada comando e, no scan, o prazo interno no ambiente. RM-072 (D2):
|
|
163
|
+
* `ambienteDaRodada` e o que a rodada passa a todo comando dela (o modo do CHECK); o CI hospedado nao passa nada.
|
|
164
|
+
*/
|
|
165
|
+
function executorDoManifesto(manifesto, ambienteDaRodada) {
|
|
166
|
+
return (nome, comando, cwd) => {
|
|
167
|
+
const prazo = prazoDaExecucao(manifesto, nome, comando);
|
|
168
|
+
const extra = ehComandoDoScan(manifesto, nome, comando)
|
|
169
|
+
? { ORK_SECURITY_SCAN_DEADLINE_MS: String(prazoInternoDoScan(prazo)) }
|
|
170
|
+
: undefined;
|
|
171
|
+
return executar(nome, comando, cwd, prazo, ambienteDaRodada || extra ? { ...ambienteDaRodada, ...extra } : undefined);
|
|
172
|
+
};
|
|
173
|
+
}
|
|
70
174
|
/**
|
|
71
175
|
* Executa um comando de verificacao pelo shell, no diretorio de trabalho da thread.
|
|
72
176
|
*
|
|
@@ -76,14 +180,20 @@ function prazoDoComando(manifesto, nome) {
|
|
|
76
180
|
* o proprio `ork` morrer no meio, o `timeout` segue de pe e encerra o grupo no prazo.
|
|
77
181
|
* O estouro continua saindo como `code: -1`, o contrato de antes.
|
|
78
182
|
*/
|
|
79
|
-
function executar(nome, comando, cwd, tetoMs = exports.TIMEOUT_VERIFY_MS) {
|
|
183
|
+
function executar(nome, comando, cwd, tetoMs = exports.TIMEOUT_VERIFY_MS, ambienteExtra) {
|
|
80
184
|
const comGrupo = (0, node_fs_1.existsSync)(TIMEOUT_BIN);
|
|
81
185
|
const inicio = Date.now();
|
|
82
|
-
const ambiente = ambienteDoVerify();
|
|
186
|
+
const ambiente = { ...ambienteDoVerify(), ...ambienteExtra };
|
|
83
187
|
const r = comGrupo
|
|
84
188
|
? (0, util_1.exec)(TIMEOUT_BIN, ['--kill-after=15', `${Math.ceil(tetoMs / 1000)}`, 'bash', '-c', comando], cwd, tetoMs + 30_000, ambiente)
|
|
85
189
|
: (0, util_1.exec)('bash', ['-c', comando], cwd, tetoMs, ambiente);
|
|
86
|
-
|
|
190
|
+
return resultadoDoProcesso(nome, comando, r, comGrupo, Date.now() - inicio, tetoMs);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* RM-072 (D6): o resultado de um comando a partir do que o processo devolveu, o mesmo para o `executar` e para o grupo
|
|
194
|
+
* paralelo do Agile (`check-paralelo.ts`), para os dois julgarem estouro, sinal e saida da mesma forma.
|
|
195
|
+
*/
|
|
196
|
+
function resultadoDoProcesso(nome, comando, r, comGrupo, duracaoMs, tetoMs) {
|
|
87
197
|
const causa = causaDoEncerramento({ code: r.code, signal: r.signal ?? null, error: r.error, comGrupo, duracaoMs, tetoMs });
|
|
88
198
|
const estourou = causa === 'timeout';
|
|
89
199
|
const resultado = {
|
|
@@ -103,10 +213,39 @@ function executar(nome, comando, cwd, tetoMs = exports.TIMEOUT_VERIFY_MS) {
|
|
|
103
213
|
const testes = (0, redacao_saida_1.testesQueCairam)(saida);
|
|
104
214
|
if (testes.length > 0)
|
|
105
215
|
resultado.testeQueCaiu = testes;
|
|
216
|
+
const falhas = (0, redacao_saida_1.falhasDeTeste)(saida);
|
|
217
|
+
if (falhas.length > 0)
|
|
218
|
+
resultado.falhasDeTeste = falhas;
|
|
106
219
|
resultado.trecho = (0, redacao_saida_1.redigirSaida)(saida);
|
|
107
220
|
}
|
|
108
221
|
return resultado;
|
|
109
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* RM-037 (fatia 6): o comando nao tem veredito. Estouro de prazo, ou reprovacao so de teste com relogio
|
|
225
|
+
* sob steal acima de 40%: a maquina, e nao o codigo, decidiu o resultado.
|
|
226
|
+
*/
|
|
227
|
+
function semVereditoPorTempo(c) {
|
|
228
|
+
return c.causa === 'timeout' || (c.relogioSobSteal?.length ?? 0) > 0;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* RM-037 (fatia 6): mede o steal na janela de cada comando e marca a reprovacao que foi so de teste com
|
|
232
|
+
* relogio sob steal alto. Os testes de relogio sao os da assinatura de prazo do runner e os do registro
|
|
233
|
+
* de instabilidade vigente. Comando que passou, estourou ou nem rodou so ganha a medida.
|
|
234
|
+
*/
|
|
235
|
+
function executorComSteal(base, leitor = steal_1.lerProcStat, registro = new Set()) {
|
|
236
|
+
return (nome, comando, cwd) => {
|
|
237
|
+
const janela = (0, steal_1.abrirJanela)(leitor);
|
|
238
|
+
const r = base(nome, comando, cwd);
|
|
239
|
+
const stealPct = janela.fechar();
|
|
240
|
+
const resultado = { ...r, stealPct };
|
|
241
|
+
if (!r.ok && r.causa !== 'timeout' && r.executado !== false && (0, steal_1.stealAlto)(stealPct)) {
|
|
242
|
+
const testes = (0, steal_1.reprovacaoSoDeRelogio)(r.falhasDeTeste, registro);
|
|
243
|
+
if (testes)
|
|
244
|
+
resultado.relogioSobSteal = testes;
|
|
245
|
+
}
|
|
246
|
+
return resultado;
|
|
247
|
+
};
|
|
248
|
+
}
|
|
110
249
|
/** I-54 (D11): erros de spawn em que o processo nem chegou a existir. */
|
|
111
250
|
const NAO_LANCADO = new Set(['ENOENT', 'EACCES', 'EAGAIN', 'ENOMEM', 'EPERM', 'EMFILE']);
|
|
112
251
|
/**
|
|
@@ -155,36 +294,63 @@ function causaDoEncerramento(r) {
|
|
|
155
294
|
}
|
|
156
295
|
/** I-37 (D8): o que o ledger grava de um comando. Sucesso e o codigo 0; falha leva a evidencia. */
|
|
157
296
|
function comandoNoLedger(c) {
|
|
297
|
+
// RM-072 (D2): a duracao vai tambem no comando que passa, para a meta do CHECK ser medida pelo ledger. RM-072 (D4, D5):
|
|
298
|
+
// no Agile, o uso do preparo e as lanes; o Classic nao tem esses campos.
|
|
299
|
+
const doAgile = { ...(c.preparo ? { preparo: c.preparo } : {}),
|
|
300
|
+
...(c.lanes ? { lanes: c.lanes.map((l) => ({ ...l, comando: (0, redacao_url_1.redigirCredenciaisUrl)(l.comando) })) } : {}),
|
|
301
|
+
...(c.comandoExecutado ? { comandoExecutado: (0, redacao_url_1.redigirCredenciaisUrl)(c.comandoExecutado) } : {}) };
|
|
158
302
|
if (c.ok)
|
|
159
|
-
return { nome: c.nome, ok: true, code: c.code };
|
|
303
|
+
return { nome: c.nome, ok: true, code: c.code, ...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}), ...doAgile };
|
|
160
304
|
return {
|
|
161
|
-
nome: c.nome, comando: (0, redacao_url_1.redigirCredenciaisUrl)(c.comando), ok: false, code: c.code,
|
|
305
|
+
nome: c.nome, comando: (0, redacao_url_1.redigirCredenciaisUrl)(c.comando), ok: false, code: c.code, ...doAgile,
|
|
162
306
|
...(c.causa ? { causa: c.causa } : {}),
|
|
163
307
|
...(c.prazoMs !== undefined ? { prazoMs: c.prazoMs } : {}),
|
|
164
308
|
...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}),
|
|
165
309
|
...(c.testeQueCaiu?.length ? { testeQueCaiu: c.testeQueCaiu } : {}),
|
|
166
310
|
...(c.trecho !== undefined ? { trecho: c.trecho } : {}),
|
|
311
|
+
...(c.stealPct !== undefined ? { stealPct: c.stealPct } : {}),
|
|
312
|
+
...(c.relogioSobSteal?.length ? { relogioSobSteal: c.relogioSobSteal } : {}),
|
|
167
313
|
};
|
|
168
314
|
}
|
|
169
315
|
/** Comandos declarados em `verify:` no manifesto, na ordem canonica. */
|
|
170
316
|
function comandosDoManifesto(manifesto) {
|
|
171
317
|
const lista = [];
|
|
172
|
-
for (const nome of ['typecheck', 'build', 'test']) {
|
|
318
|
+
for (const nome of ['typecheck', 'build', 'test', 'security_scan']) {
|
|
173
319
|
const comando = manifesto.verify[nome];
|
|
174
320
|
if (comando && comando.trim() !== '')
|
|
175
321
|
lista.push({ nome, comando });
|
|
176
322
|
}
|
|
177
323
|
return lista;
|
|
178
324
|
}
|
|
179
|
-
/**
|
|
325
|
+
/**
|
|
326
|
+
* Diretorio onde a verificacao roda: a worktree da thread, ou a raiz do projeto. RM-047 (P2): a worktree
|
|
327
|
+
* do `thread.json` so vale registrada no `git worktree list` e com o estado local (`estado.rastreado`,
|
|
328
|
+
* `estado.worktree-nao-registrada`).
|
|
329
|
+
*/
|
|
180
330
|
function cwdDaThread(raiz, thread) {
|
|
181
|
-
return
|
|
331
|
+
return (0, procedencia_1.diretorioDaThread)(raiz, thread);
|
|
182
332
|
}
|
|
183
333
|
/** HEAD real do diretorio de trabalho, carimbado em toda verificacao. */
|
|
184
334
|
function commitReal(cwd) {
|
|
185
335
|
const r = (0, util_1.exec)('git', ['rev-parse', 'HEAD'], cwd);
|
|
186
336
|
return r.ok ? r.stdout.trim() : util_1.COMMIT_DESCONHECIDO;
|
|
187
337
|
}
|
|
338
|
+
/** RM-058 N2 (D10): quanto o `ork verify` do CLI espera a vez na fila pesada sem `--esperar`. */
|
|
339
|
+
exports.ESPERA_DA_FILA_PESADA_MS = 60 * 60 * 1000;
|
|
340
|
+
/** RM-058 N2 (GO-FIX 1, B1 e A9 do CHECK): a espera de quem verifica por dentro de outro comando e nao disse prazo. */
|
|
341
|
+
exports.ESPERA_PADRAO_DA_FILA_PESADA_MS = 30_000;
|
|
342
|
+
/**
|
|
343
|
+
* RM-058 N2 (D9 e D10 da ork-rm058n2): a rodada inteira na fila de recursos pesados, depois da conducao. O
|
|
344
|
+
* artefato e o diretorio de trabalho da thread; as vagas sao `concurrency.max_parallel_heavy` (0 desliga). Sem a
|
|
345
|
+
* vez no prazo, `ErroDaFilaPesada` sai antes de qualquer comando rodar e de qualquer evento ir ao ledger.
|
|
346
|
+
*/
|
|
347
|
+
function naFilaPesada(carregado, threadId, operacao, conducao, executar) {
|
|
348
|
+
const cwd = cwdDaThread(carregado.raiz, (0, thread_1.lerThread)(carregado.raiz, threadId));
|
|
349
|
+
const espera = conducao.filaPesada?.esperarMs ?? conducao.esperarMs ?? exports.ESPERA_PADRAO_DA_FILA_PESADA_MS;
|
|
350
|
+
return (0, fila_pesada_1.comRecursoPesado)(carregado.raiz, { artefato: cwd, operacao, thread: threadId,
|
|
351
|
+
slots: carregado.manifesto.concurrency.max_parallel_heavy, esperarMs: espera, aoEsperar: conducao.filaPesada?.aoEsperar,
|
|
352
|
+
comandoDeEsperar: conducao.filaPesada?.comandoDeEsperar }, executar);
|
|
353
|
+
}
|
|
188
354
|
/** O pedido de conducao de uma verificacao, com o prazo derivado dos comandos que ela vai rodar (D3). */
|
|
189
355
|
function pedidoDoVerify(carregado, threadId, operacao, comandos, conducao) {
|
|
190
356
|
return {
|
|
@@ -199,27 +365,213 @@ function pedidoDoVerify(carregado, threadId, operacao, comandos, conducao) {
|
|
|
199
365
|
/** O executor que renova o prazo da conducao antes de cada comando (D3). */
|
|
200
366
|
function executorSobConducao(base, manifesto, conducao) {
|
|
201
367
|
return (nome, comando, cwd) => {
|
|
202
|
-
conducao.renovar(
|
|
368
|
+
conducao.renovar(prazoDaExecucao(manifesto, nome, comando));
|
|
203
369
|
return base(nome, comando, cwd);
|
|
204
370
|
};
|
|
205
371
|
}
|
|
206
|
-
/**
|
|
207
|
-
|
|
372
|
+
/**
|
|
373
|
+
* RM-037 (defeitos de 19 e 20/10/2026, defeito 1): o executor de uma rodada, o mesmo no verify e na baseline. O prazo
|
|
374
|
+
* de cada comando sai do manifesto (`executorDoManifesto`, que tambem da ao scan o prazo interno), e o steal e medido na
|
|
375
|
+
* janela de cada um, com os testes de relogio do registro de instabilidade da arvore verificada. A baseline rodava pelo
|
|
376
|
+
* `executar` com o teto padrao de 600 s: em 20/10 a suite desta VPS passou disso, e o `test` foi gravado como "ja
|
|
377
|
+
* falhava" com o manifesto dando 2400 s.
|
|
378
|
+
*/
|
|
379
|
+
function executorDaRodada(manifesto, instabilidade, base, leitor = steal_1.lerProcStat, ambienteDaRodada) {
|
|
380
|
+
return executorComSteal(base ?? executorDoManifesto(manifesto, ambienteDaRodada), leitor, (0, instabilidade_1.testesDeRelogioVigentes)(instabilidade));
|
|
381
|
+
}
|
|
382
|
+
/** RM-072 (D2): o que a rodada passa a todo comando dela, nos dois modos: o modo do CHECK. */
|
|
383
|
+
function ambienteDoModo(check) {
|
|
384
|
+
return { [check_modo_1.ENV_MODO_DO_CHECK]: check.modo };
|
|
385
|
+
}
|
|
386
|
+
/** RM-072 (D1, D2): o modo da rodada, como vai ao ledger. */
|
|
387
|
+
function checkNoLedger(check) {
|
|
388
|
+
return { modo: check.modo, origem: check.origem, nome: check.nome };
|
|
389
|
+
}
|
|
390
|
+
/** RM-072 (D5): a guarda do produto no fim do preparo; sem preparo, ou com ele reprovado, nada e reaproveitado. */
|
|
391
|
+
function guardaDoPreparo(manifesto, cwd, preparo) {
|
|
392
|
+
return new check_agil_1.GuardaDoProduto(cwd, manifesto.check?.agile?.produto, identidadeDoProduto, preparo ? (preparo.ok ? null : 'preparo-falhou') : 'sem-preparo');
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* RM-072 (S-b do CHECK 2, N5 do CHECK 3): no Agile, so quem escreve no relatorio da rodada o recebe, a varredura e as
|
|
396
|
+
* lanes; o `build`, o `typecheck` e o `verify.test` (em serie ou no grupo) recebem so o modo, como as claims. O teste que
|
|
397
|
+
* roda a varredura dentro do `verify.test` gravaria pecas de fixture no relatorio da rodada.
|
|
398
|
+
*/
|
|
399
|
+
function recebeORelatorio(nome) {
|
|
400
|
+
return nome === 'security_scan' || nome.startsWith('test:');
|
|
401
|
+
}
|
|
402
|
+
function soAVarreduraEAsLanesComRelatorio(comRelatorio, semRelatorio) {
|
|
403
|
+
return (nome, comando, cwd) => (recebeORelatorio(nome) ? comRelatorio : semRelatorio)(nome, comando, cwd);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* RM-072 (D6): o executor do grupo do Agile. Sem executor injetado, o processo auxiliar roda os comandos ao mesmo tempo,
|
|
407
|
+
* cada um com o prazo e o ambiente que o `executorDoManifesto` daria a ele (o do scan com o prazo interno), o steal medido
|
|
408
|
+
* na janela do grupo e a conducao renovada com o maior prazo. Com executor injetado (MCP, testes), um por vez, por ele.
|
|
409
|
+
*/
|
|
410
|
+
function executorDoGrupo(manifesto, ambienteDaRodada, instabilidade, leitor, conducao, injetado) {
|
|
411
|
+
if (injetado)
|
|
412
|
+
return (itens, cwd) => itens.map((i) => injetado(i.nome, i.comando, cwd));
|
|
413
|
+
const relogio = (0, instabilidade_1.testesDeRelogioVigentes)(instabilidade);
|
|
414
|
+
// N5 do CHECK 3: no grupo, como em serie, so a varredura e as lanes recebem o relatorio da rodada.
|
|
415
|
+
const { [check_modo_1.ENV_RELATORIO_DO_CHECK]: _relatorio, ...semRelatorio } = ambienteDaRodada;
|
|
416
|
+
return (itens, cwd) => {
|
|
417
|
+
const prazos = itens.map((i) => prazoDaExecucao(manifesto, i.nome, i.comando));
|
|
418
|
+
const paraOAuxiliar = itens.map((i, k) => ({ nome: i.nome, comando: i.comando, cwd, prazoMs: prazos[k],
|
|
419
|
+
...(i.nice ? { nice: i.nice } : {}), ...(i.apos?.length ? { apos: i.apos } : {}),
|
|
420
|
+
ambiente: { ...(recebeORelatorio(i.nome) ? ambienteDaRodada : semRelatorio), ...(ehComandoDoScan(manifesto, i.nome, i.comando)
|
|
421
|
+
// RM-072: ao lado das lanes, a varredura roda poucas ferramentas por vez, para o grupo nao passar da CPU.
|
|
422
|
+
? { ORK_SECURITY_SCAN_DEADLINE_MS: String(prazoInternoDoScan(prazos[k])),
|
|
423
|
+
...(itens.length > 1 ? { [check_modo_1.ENV_VARREDURA_PARALELA_DO_CHECK]: String((0, check_agil_1.paralelismoDaVarreduraNoGrupo)()) } : {}) } : {}) } }));
|
|
424
|
+
// A conducao cobre o grupo inteiro: com a lane encadeada, a varredura e a lane somam.
|
|
425
|
+
conducao.renovar((0, check_paralelo_1.esperaDoGrupo)(paraOAuxiliar));
|
|
426
|
+
const janela = (0, steal_1.abrirJanela)(leitor);
|
|
427
|
+
const processos = (0, check_paralelo_1.rodarEmParalelo)(paraOAuxiliar, ambienteDoVerify());
|
|
428
|
+
const stealPct = janela.fechar();
|
|
429
|
+
return processos.map((p, k) => {
|
|
430
|
+
const r = { ...resultadoDoProcesso(itens[k].nome, itens[k].comando, p, p.comGrupo, p.duracaoMs, prazos[k]), stealPct };
|
|
431
|
+
// S1 do CHECK: o auxiliar que morreu sem gravar o resultado deixa o comando sem veredito, nunca uma regressao.
|
|
432
|
+
if (p.semResultado)
|
|
433
|
+
r.executado = false;
|
|
434
|
+
if (!r.ok && r.causa !== 'timeout' && r.executado !== false && (0, steal_1.stealAlto)(stealPct)) {
|
|
435
|
+
const testes = (0, steal_1.reprovacaoSoDeRelogio)(r.falhasDeTeste, relogio);
|
|
436
|
+
if (testes)
|
|
437
|
+
r.relogioSobSteal = testes;
|
|
438
|
+
}
|
|
439
|
+
return r;
|
|
440
|
+
});
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* RM-072 (D8): le o relatorio das pecas da rodada, grava a lista inteira de cada lane em
|
|
445
|
+
* `.orkastery/threads/<id>/check/<commit>-lanes.json` e devolve o resumo do Agile para o `verify_run`.
|
|
446
|
+
*/
|
|
447
|
+
function agileNoLedger(raiz, threadId, commit, pecasDoVerify, doAgile, guarda, relatorio, claims) {
|
|
448
|
+
const linhas = relatorio.ler();
|
|
449
|
+
relatorio.fechar();
|
|
450
|
+
const doRelatorio = (0, check_agil_1.pecasDoRelatorio)(linhas);
|
|
451
|
+
const listas = (0, check_agil_1.listasDasLanes)(linhas);
|
|
452
|
+
const usos = claims.flatMap((c) => c.execucoes.map((e) => e.preparo).filter((u) => !!u));
|
|
453
|
+
const resumo = {
|
|
454
|
+
pecas: [...pecasDoVerify, ...doRelatorio],
|
|
455
|
+
grupo: { paralelo: doAgile?.paralelo ?? false, lanes: doAgile?.lanes ?? [] },
|
|
456
|
+
produto: guarda.hashCurto(),
|
|
457
|
+
claims: { reaproveitadas: usos.filter((u) => u.reaproveitado).length, inteiras: usos.filter((u) => !u.reaproveitado).length },
|
|
458
|
+
lanes: listas.map((l) => ({ lane: l.lane, arquivos: l.arquivos.length, sha256: l.sha256 })),
|
|
459
|
+
orcamento: linhas.filter((l) => l.tipo === 'duracoes').map(({ tipo: _tipo, ...resto }) => resto),
|
|
460
|
+
};
|
|
461
|
+
if (listas.length > 0) {
|
|
462
|
+
// S10 do CHECK: o caminho vai relativo a raiz do estado (`.orkastery/threads/...`), nao a worktree de onde rodou.
|
|
463
|
+
const arquivo = path.join((0, thread_1.dirThread)(raiz, threadId), 'check', `${commit.slice(0, 12)}-lanes.json`);
|
|
464
|
+
try {
|
|
465
|
+
fs.mkdirSync(path.dirname(arquivo), { recursive: true, mode: 0o700 });
|
|
466
|
+
fs.writeFileSync(arquivo, JSON.stringify({ commit, lanes: listas.map((l) => ({ lane: l.lane, arquivos: l.arquivos })) }, null, 1) + '\n', { mode: 0o600 });
|
|
467
|
+
resumo.evidencia = path.relative((0, estado_thread_1.raizDoEstado)(raiz), arquivo);
|
|
468
|
+
}
|
|
469
|
+
catch { /* sem o arquivo, o ledger ainda guarda a contagem e o sha256 de cada lane */ }
|
|
470
|
+
}
|
|
471
|
+
return resumo;
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* RM-037 (defeito 1 de 19 e 20/10/2026): so a falha com veredito vale como "ja falhava". Estouro do prazo, reprovacao
|
|
475
|
+
* so de teste com relogio sob steal, morte por sinal e comando que nem rodou dizem que a maquina decidiu, e nao o
|
|
476
|
+
* codigo; uma falha atual desse comando nao pode passar por divida anterior.
|
|
477
|
+
*/
|
|
478
|
+
function vereditoDaBaseline(c) {
|
|
479
|
+
if (c.ok)
|
|
480
|
+
return 'passava';
|
|
481
|
+
if (semVereditoPorTempo(c) || c.executado === false)
|
|
482
|
+
return 'sem-veredito';
|
|
483
|
+
return terminoNormal(c) ? 'ja-falhava' : 'sem-veredito';
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Achado 1 do CHECK da RM-037 (20/10/2026): o maior codigo de saida que e do proprio comando. De 124 em diante, quem fala
|
|
487
|
+
* e quem nao deixou o comando terminar: 124 e o prazo do `timeout(1)` de dentro do comando (o de fora so o conta como
|
|
488
|
+
* estouro quando o tempo dele chegou), 125 e 126 sao o `timeout(1)` ou o shell que nao rodaram o comando, 127 o comando
|
|
489
|
+
* que nao existe, e de 128 em diante vem a morte por sinal (128 + sinal, do shell e do GNU `timeout`).
|
|
490
|
+
*/
|
|
491
|
+
const MAIOR_CODIGO_DO_COMANDO = 123;
|
|
492
|
+
/**
|
|
493
|
+
* O comando terminou sozinho e disse o codigo: `causa: exit` (ou nenhuma, na baseline de antes da I-37, em que o estouro
|
|
494
|
+
* saia como `code: -1`) com codigo de 1 a 123. Sinal, falta do codigo de saida e os codigos de quem nao deixou o
|
|
495
|
+
* comando terminar nao provam nada do codigo do HEAD. O `timeout(1)` do uutils devolve so o numero do sinal que ele
|
|
496
|
+
* trata (15 no SIGTERM), igual a uma saida do comando: esse fica de fora, como na `causaDoEncerramento`.
|
|
497
|
+
*/
|
|
498
|
+
function terminoNormal(c) {
|
|
499
|
+
return (c.causa === undefined || c.causa === 'exit') && Number.isInteger(c.code) && c.code >= 1
|
|
500
|
+
&& c.code <= MAIOR_CODIGO_DO_COMANDO;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* RM-037 (CHECK 3 da ork-rm037defeit2): a baseline e o verify nunca rodam sobre a worktree cujo preparo a criacao adiou
|
|
504
|
+
* (o passo do arco abre a thread sob a trava de despacho) e que ainda nao deu certo. O preparo pendente roda aqui, com a
|
|
505
|
+
* vez na fila pesada que a operacao ja segura, a conducao renovada pelo prazo dele e o executor da operacao quando ela
|
|
506
|
+
* traz um (o do sandbox do `ork_verify` do MCP, com o prazo dele). A falha recusa a operacao inteira antes do primeiro
|
|
507
|
+
* comando, porque sem as dependencias a baseline chamaria de "ja falhava" a falta de pacote, e o verify, de regressao.
|
|
508
|
+
*/
|
|
509
|
+
function exigirDependenciasDaWorktree(carregado, threadId, cwd, operacao, conducao, executor) {
|
|
510
|
+
const preparo = (0, thread_1.prepararDependenciasPendentes)(carregado, threadId, cwd, { antes: () => conducao.renovar(dependencias_da_worktree_1.PRAZO_DAS_DEPENDENCIAS_MS), executor });
|
|
511
|
+
if (!preparo || preparo.ok)
|
|
512
|
+
return;
|
|
513
|
+
throw new locale_1.ErroDoCatalogo((m) => m.verify.dependenciasPendentesFalharam(operacao, (0, redacao_url_1.redigirCredenciaisUrl)(preparo.comando), preparo.code, preparo.causa === 'timeout', cwd, (0, dependencias_da_worktree_1.ultimaLinhaDoPreparo)(preparo)));
|
|
514
|
+
}
|
|
515
|
+
/** `ork verify --baseline`: grava o estado do mundo ANTES do GO. Sem `executor`, o da rodada (`executorDaRodada`). */
|
|
516
|
+
function gravarBaseline(carregado, threadId, executor, conducao = {}, origem = 'cli', leitor = steal_1.lerProcStat, modo) {
|
|
208
517
|
const pedido = pedidoDoVerify(carregado, threadId, 'baseline', comandosDoManifesto(carregado.manifesto).length, conducao);
|
|
209
|
-
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) =>
|
|
518
|
+
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => naFilaPesada(carregado, threadId, 'baseline', conducao, () => gravarBaselineSobConducao(carregado, threadId, executor, tomada, origem, leitor, modo)));
|
|
210
519
|
}
|
|
211
|
-
function gravarBaselineSobConducao(carregado, threadId,
|
|
520
|
+
function gravarBaselineSobConducao(carregado, threadId, base, tomada, origem, leitor, modo) {
|
|
212
521
|
const { raiz, manifesto } = carregado;
|
|
213
522
|
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
214
523
|
const cwd = cwdDaThread(raiz, thread);
|
|
215
|
-
|
|
216
|
-
|
|
524
|
+
exigirDependenciasDaWorktree(carregado, threadId, cwd, 'baseline', tomada, base);
|
|
525
|
+
// RM-072 (D1, D2): a baseline roda e grava no modo da rodada, como o verify.
|
|
526
|
+
const check = (0, check_modo_1.resolverModo)(manifesto.check?.mode, modo);
|
|
527
|
+
const relatorio = check.modo === 'agile' ? new check_agil_1.RelatorioDoCheck() : null;
|
|
528
|
+
const ambienteDaRodada = { ...ambienteDoModo(check), ...relatorio?.ambiente() };
|
|
529
|
+
const instabilidade = (0, instabilidade_1.lerRegistroDeInstabilidade)(cwd);
|
|
530
|
+
const executor = executorSobConducao(executorDaRodada(manifesto, instabilidade, base, leitor, ambienteDaRodada), manifesto, tomada);
|
|
531
|
+
// RM-072 (S-b do CHECK 2): fora do preparo, so a varredura e as lanes recebem o relatorio.
|
|
532
|
+
const executorDosComandos = relatorio
|
|
533
|
+
? soAVarreduraEAsLanesComRelatorio(executor, executorSobConducao(executorDaRodada(manifesto, instabilidade, base, leitor, ambienteDoModo(check)), manifesto, tomada))
|
|
534
|
+
: executor;
|
|
535
|
+
// RM-072 (D4): no Agile com o produto declarado, o preparo, a guarda e o mesmo grupo do verify; sem o produto, nada
|
|
536
|
+
// seria reaproveitado e os comandos rodam como no Classic.
|
|
537
|
+
// RM-072 (A6 do CHECK): as pecas do preparo, do grupo e do relatorio vao ao `baseline_recorded`, como no `verify_run`.
|
|
538
|
+
const pecasDaBaseline = [];
|
|
539
|
+
const comandos = relatorio && manifesto.check?.agile?.produto?.length
|
|
540
|
+
? (() => {
|
|
541
|
+
const p = (0, check_agil_1.prepararNoAgile)(manifesto, cwd, executor);
|
|
542
|
+
pecasDaBaseline.push(...p.pecas);
|
|
543
|
+
const r = (0, check_agil_1.comandosNoAgile)(manifesto, cwd, comandosDoManifesto(manifesto), executorDosComandos, executorDoGrupo(manifesto, ambienteDaRodada, instabilidade, leitor, tomada, base ? executor : undefined), guardaDoPreparo(manifesto, cwd, p.resultado), p.resultado);
|
|
544
|
+
pecasDaBaseline.push(...r.pecas);
|
|
545
|
+
return r.comandos;
|
|
546
|
+
})()
|
|
547
|
+
: comandosDoManifesto(manifesto).map((c) => executorDosComandos(c.nome, c.comando, cwd));
|
|
548
|
+
if (relatorio) {
|
|
549
|
+
if (base)
|
|
550
|
+
pecasDaBaseline.push(check_agil_1.PECA_SEM_RELATORIO);
|
|
551
|
+
pecasDaBaseline.push(...(0, check_agil_1.pecasDoRelatorio)(relatorio.ler()));
|
|
552
|
+
relatorio.fechar();
|
|
553
|
+
}
|
|
554
|
+
// N1 do CHECK 2: a lane que saiu com 127 tambem e dependencia ausente, como o comando so do Classic.
|
|
555
|
+
const naoEncontrado = comandos.find((c) => c.causa === 'nao-encontrado')
|
|
556
|
+
?? comandos.flatMap((c) => (c.lanes ?? []).filter((l) => l.causa === 'nao-encontrado')
|
|
557
|
+
.map((l) => ({ nome: `${c.nome}:${l.lane}`, code: l.code, comando: l.comando })))[0];
|
|
558
|
+
if (naoEncontrado) {
|
|
559
|
+
// Uma dependencia ausente nao e divida do codigo: o comando nem chegou a existir. Gravar isso
|
|
560
|
+
// como "ja falhava" faria todo verify futuro aceitar a falta da ferramenta como baseline.
|
|
561
|
+
throw new locale_1.ErroDoCatalogo((m) => m.verify.baselineDependenciaAusente(naoEncontrado.nome, naoEncontrado.code, (0, redacao_url_1.redigirCredenciaisUrl)(naoEncontrado.comando), manifesto.worktree.dependencias ?? null));
|
|
562
|
+
}
|
|
563
|
+
const baseline = { commit: commitReal(cwd), gravadaEm: (0, util_1.agora)(), comandos, check: { modo: check.modo, origem: check.origem } };
|
|
217
564
|
thread.baseline = baseline;
|
|
218
565
|
(0, thread_1.gravarThread)(raiz, thread);
|
|
219
566
|
(0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, ledger_1.TIPOS_DE_EVENTO.baselineGravada, {
|
|
220
567
|
commit: baseline.commit,
|
|
221
568
|
cwd,
|
|
222
|
-
comandos: comandos.map((c) => ({ nome: c.nome, comando: c.comando, ok: c.ok, code: c.code
|
|
569
|
+
comandos: comandos.map((c) => ({ nome: c.nome, comando: c.comando, ok: c.ok, code: c.code, prazoMs: c.prazoMs ?? null,
|
|
570
|
+
...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}), ...(c.ok ? {} : { causa: c.causa ?? null }) })),
|
|
571
|
+
check: checkNoLedger(check),
|
|
572
|
+
...(pecasDaBaseline.length ? { agile: { pecas: pecasDaBaseline } } : {}),
|
|
573
|
+
// RM-037 (defeito 1 de 19 e 20/10/2026): o que a baseline nao provou fica dito no proprio evento.
|
|
574
|
+
semVeredito: comandos.filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome),
|
|
223
575
|
fonte: 'execucao real no HEAD, nao relatorio de fase',
|
|
224
576
|
origem,
|
|
225
577
|
});
|
|
@@ -239,9 +591,7 @@ function verificarClaim(claim, cwd, executor = executar) {
|
|
|
239
591
|
verificado: false,
|
|
240
592
|
// Alegacao negativa sem comando e reprovacao (caso EvoJ6); positiva e aviso.
|
|
241
593
|
motivo: negativa ? 'claims.failed' : 'claims.unverifiable',
|
|
242
|
-
detalhe: negativa
|
|
243
|
-
? 'alegacao negativa/absoluta sem comando de verificacao: nao ha como comprova-la'
|
|
244
|
-
: 'sem comando de verificacao declarado',
|
|
594
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => negativa ? m.verify.claimNegativaSemComando : m.verify.claimSemComando),
|
|
245
595
|
execucoes: [],
|
|
246
596
|
};
|
|
247
597
|
}
|
|
@@ -253,22 +603,25 @@ function verificarClaim(claim, cwd, executor = executar) {
|
|
|
253
603
|
claim,
|
|
254
604
|
verificado: false,
|
|
255
605
|
motivo: 'verify.sem-veredito',
|
|
256
|
-
detalhe:
|
|
606
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.verify.claimNaoExecutada((0, redacao_url_1.redigirCredenciaisUrl)(naoRodou.comando), naoRodou.resumo)),
|
|
257
607
|
execucoes,
|
|
258
608
|
};
|
|
259
609
|
}
|
|
260
610
|
const falhou = execucoes.find((e) => !e.ok);
|
|
261
|
-
// I-37 (D1): estouro de prazo nao desmente a alegacao; a prova so nao chegou ao fim.
|
|
262
|
-
|
|
611
|
+
// I-37 (D1): estouro de prazo nao desmente a alegacao; a prova so nao chegou ao fim. RM-037 (fatia 6):
|
|
612
|
+
// nem a reprovacao so de teste com relogio sob steal acima de 40%.
|
|
613
|
+
const estourou = !!falhou && semVereditoPorTempo(falhou);
|
|
263
614
|
return {
|
|
264
615
|
claim,
|
|
265
616
|
verificado: !falhou,
|
|
266
617
|
motivo: falhou ? (estourou ? 'verify.timeout' : 'claims.failed') : null,
|
|
267
|
-
detalhe: falhou
|
|
618
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => falhou
|
|
268
619
|
? estourou
|
|
269
|
-
?
|
|
270
|
-
|
|
271
|
-
|
|
620
|
+
? falhou.causa === 'timeout'
|
|
621
|
+
? m.verify.claimEstourou(falhou.comando, Math.round((falhou.prazoMs ?? 0) / 1000))
|
|
622
|
+
: m.verify.claimRelogio((0, redacao_url_1.redigirCredenciaisUrl)(falhou.comando), falhou.stealPct, steal_1.LIMIAR_STEAL_PCT, falhou.relogioSobSteal.join(', '))
|
|
623
|
+
: m.verify.claimSaiu((0, redacao_url_1.redigirCredenciaisUrl)(falhou.comando), falhou.code)
|
|
624
|
+
: m.verify.claimOk(execucoes.length)),
|
|
272
625
|
execucoes,
|
|
273
626
|
};
|
|
274
627
|
}
|
|
@@ -281,34 +634,82 @@ function verificar(carregado, threadId, opcoes = {}) {
|
|
|
281
634
|
const planejados = (0, claims_1.lerClaims)(carregado.raiz, threadId).filter((c) => c.estado !== 'retirada')
|
|
282
635
|
.reduce((n, c) => n + c.verificar.length, 0) + (opcoes.soClaims ? 0 : comandosDoManifesto(carregado.manifesto).length) + 1;
|
|
283
636
|
const pedido = pedidoDoVerify(carregado, threadId, opcoes.operacao ?? 'verify', planejados, opcoes.conducao ?? {});
|
|
284
|
-
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => verificarSobConducao(carregado, threadId, opcoes, tomada, pedido.canal));
|
|
637
|
+
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => naFilaPesada(carregado, threadId, 'verify', opcoes.conducao ?? {}, (uso) => verificarSobConducao(carregado, threadId, opcoes, tomada, pedido.canal, uso)));
|
|
285
638
|
}
|
|
286
|
-
function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
639
|
+
function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, filaPesada) {
|
|
287
640
|
const { raiz, manifesto } = carregado;
|
|
641
|
+
const inicioDaRodada = Date.now();
|
|
288
642
|
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
289
643
|
const cwd = cwdDaThread(raiz, thread);
|
|
644
|
+
exigirDependenciasDaWorktree(carregado, threadId, cwd, 'verify', conducao, opcoes.executor);
|
|
290
645
|
const commit = commitReal(cwd);
|
|
291
646
|
const dir = (0, thread_1.dirThread)(raiz, threadId);
|
|
647
|
+
// RM-072 (D1): o modo da rodada; a opcao vence o manifesto, que vence o padrao.
|
|
648
|
+
const check = (0, check_modo_1.resolverModo)(manifesto.check?.mode, opcoes.check);
|
|
292
649
|
// I-43 (D4, viga b): os criterios de pronto da thread viram claims do nucleo ANTES
|
|
293
650
|
// da reexecucao, para entrarem no MESMO veredito das demais alegacoes. Idempotente:
|
|
294
651
|
// `ork verify` roda em toda fase, e uma claim por criterio por rodada viraria
|
|
295
652
|
// acumulador em vez de verificacao.
|
|
296
653
|
(0, claims_1.registrarCriteriosDePronto)(raiz, threadId);
|
|
654
|
+
// RM-037 (fatia 6): o registro de instabilidade da arvore verificada e a janela de steal da rodada.
|
|
655
|
+
const instabilidade = (0, instabilidade_1.lerRegistroDeInstabilidade)(cwd, opcoes.agoraMs);
|
|
656
|
+
const leitor = opcoes.lerProcStat ?? steal_1.lerProcStat;
|
|
657
|
+
const janelaDaRodada = (0, steal_1.abrirJanela)(leitor);
|
|
658
|
+
// RM-072 (D8): no Agile, as pecas contam o que rodaram num relatorio da rodada, lido no fim.
|
|
659
|
+
const agil = check.modo === 'agile';
|
|
660
|
+
const relatorio = agil ? new check_agil_1.RelatorioDoCheck() : null;
|
|
661
|
+
const ambienteDaRodada = { ...ambienteDoModo(check), ...relatorio?.ambiente() };
|
|
297
662
|
// I-37 (D2, D3): o prazo de cada comando sai do manifesto carregado no inicio da rodada;
|
|
298
663
|
// editar o manifesto no meio dela nao muda o teto de quem ainda vai rodar.
|
|
299
|
-
const executor = executorSobConducao(opcoes.executor
|
|
300
|
-
|
|
664
|
+
const executor = executorSobConducao(executorDaRodada(manifesto, instabilidade, opcoes.executor, leitor, ambienteDaRodada), manifesto, conducao);
|
|
665
|
+
// RM-072 (A3 do CHECK): as claims recebem o modo, nunca o relatorio da rodada; o teste que roda a varredura dentro de uma
|
|
666
|
+
// claim gravaria pecas de fixture no relatorio do verify. O relatorio fica com o preparo e o grupo.
|
|
667
|
+
const executorDasClaims = relatorio
|
|
668
|
+
? executorSobConducao(executorDaRodada(manifesto, instabilidade, opcoes.executor, leitor, ambienteDoModo(check)), manifesto, conducao)
|
|
669
|
+
: executor;
|
|
670
|
+
// RM-072 (S-b do CHECK 2): fora do preparo, so a varredura e as lanes recebem o relatorio.
|
|
671
|
+
const executorDosComandos = relatorio ? soAVarreduraEAsLanesComRelatorio(executor, executorDasClaims) : executor;
|
|
301
672
|
// I-54 (D10): o preparo roda UMA vez, antes das claims. Ele nunca e condicao para uma claim
|
|
302
673
|
// passar (cada uma roda o proprio comando inteiro); ele so deixa pronta a compilacao. A
|
|
303
674
|
// identidade do produto e tomada logo depois dele e conferida no fim da rodada.
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
675
|
+
// RM-072 (D4): no Agile, o preparo do Agile primeiro, com o `verify.preparo` de fallback.
|
|
676
|
+
const pecas = [];
|
|
677
|
+
const preparo = agil
|
|
678
|
+
? (() => {
|
|
679
|
+
const p = (0, check_agil_1.prepararNoAgile)(manifesto, cwd, executor);
|
|
680
|
+
pecas.push(...p.pecas);
|
|
681
|
+
return p.resultado ? { resultado: p.resultado, identidade: identidadeDoProduto(cwd) } : null;
|
|
682
|
+
})()
|
|
683
|
+
: manifesto.verify.preparo ? (() => {
|
|
684
|
+
const resultado = executor('preparo', manifesto.verify.preparo, cwd);
|
|
685
|
+
return { resultado, identidade: identidadeDoProduto(cwd) };
|
|
686
|
+
})() : null;
|
|
687
|
+
// RM-072 (A6 do CHECK): com executor injetado (MCP, testes), o ambiente da rodada nao chega aos comandos; o ledger diz.
|
|
688
|
+
if (agil && opcoes.executor)
|
|
689
|
+
pecas.push(check_agil_1.PECA_SEM_RELATORIO);
|
|
690
|
+
// RM-072 (D5): a guarda do produto, tomada no fim do preparo.
|
|
691
|
+
const vigente = agil
|
|
692
|
+
? { guarda: guardaDoPreparo(manifesto, cwd, preparo?.resultado ?? null), preparo: preparo?.resultado ?? null }
|
|
693
|
+
: null;
|
|
694
|
+
// RM-072 (A1, S-a, S-d e S-h do CHECK): a claim que compilou de novo (o build no meio da cadeia) muda o produto sem mudar
|
|
695
|
+
// a arvore; o preparo roda de novo antes da claim seguinte que o reaproveitaria, ate MAXIMO_DE_PREPAROS_REFEITOS vezes,
|
|
696
|
+
// e uma vez antes do grupo, e a peca diz o que aconteceu.
|
|
697
|
+
const refazer = (quando) => {
|
|
698
|
+
pecas.push(...(0, check_agil_1.refazerPreparo)(manifesto, cwd, executor, vigente, (p) => guardaDoPreparo(manifesto, cwd, p), quando));
|
|
699
|
+
};
|
|
700
|
+
let preparosRefeitos = 0;
|
|
701
|
+
const refazerAntesDaClaim = (nome) => {
|
|
702
|
+
if (!vigente || preparosRefeitos >= check_agil_1.MAXIMO_DE_PREPAROS_REFEITOS)
|
|
703
|
+
return false;
|
|
704
|
+
preparosRefeitos++;
|
|
705
|
+
refazer(`antes da claim ${nome}`);
|
|
706
|
+
return true;
|
|
707
|
+
};
|
|
308
708
|
// Claim retirada sai do gate: o historico guarda a alegacao e o motivo da retirada.
|
|
709
|
+
const executorDaClaim = vigente ? (0, check_agil_1.executorDaClaimNoAgile)(manifesto, executorDasClaims, vigente, refazerAntesDaClaim) : executorDasClaims;
|
|
309
710
|
const claims = (0, claims_1.lerClaims)(raiz, threadId)
|
|
310
711
|
.filter((c) => c.estado !== 'retirada')
|
|
311
|
-
.map((c) => verificarClaim(c, cwd,
|
|
712
|
+
.map((c) => verificarClaim(c, cwd, executorDaClaim));
|
|
312
713
|
for (const r of claims) {
|
|
313
714
|
// Estouro de prazo e comando que nao rodou nao julgam a alegacao: o estado anterior vale.
|
|
314
715
|
if (r.motivo === 'verify.timeout' || r.motivo === 'verify.sem-veredito')
|
|
@@ -321,23 +722,39 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
321
722
|
if (r.claim.estado !== estado)
|
|
322
723
|
(0, claims_1.carimbarEstado)(raiz, r.claim, estado);
|
|
323
724
|
}
|
|
725
|
+
// RM-072 (A1 do CHECK): o produto que mudou durante as claims tem o preparo refeito antes do grupo, que segue em paralelo.
|
|
726
|
+
// S-h do CHECK 3: o grupo tem a vaga dele, fora do teto das claims.
|
|
727
|
+
if (vigente && !opcoes.soClaims && vigente.guarda.conferir() === 'produto-mudou')
|
|
728
|
+
refazer('antes do grupo');
|
|
729
|
+
// RM-072 (D4, D6): no Agile, build do preparo e o resto no grupo paralelo, com a guarda valendo.
|
|
730
|
+
let doAgile = null;
|
|
324
731
|
const comandos = opcoes.soClaims
|
|
325
732
|
? []
|
|
326
|
-
:
|
|
733
|
+
: vigente
|
|
734
|
+
? (doAgile = (0, check_agil_1.comandosNoAgile)(manifesto, cwd, comandosDoManifesto(manifesto), executorDosComandos, executorDoGrupo(manifesto, ambienteDaRodada, instabilidade, leitor, conducao, opcoes.executor ? executor : undefined), vigente.guarda, vigente.preparo)).comandos
|
|
735
|
+
: comandosDoManifesto(manifesto).map((c) => executor(c.nome, c.comando, cwd));
|
|
736
|
+
if (doAgile)
|
|
737
|
+
pecas.push(...doAgile.pecas);
|
|
738
|
+
const resumoDoAgile = vigente ? agileNoLedger(raiz, threadId, commit, pecas, doAgile, vigente.guarda, relatorio, claims) : null;
|
|
739
|
+
// RM-062 (F2): a barreira de dado privado no diff da thread, so com a policy `dado_privado` no manifesto.
|
|
740
|
+
const dadoPrivado = (0, dado_privado_1.barreiraDaThread)(carregado, thread, cwd, 'verify');
|
|
741
|
+
const dadoPrivadoBloqueia = (0, policies_1.bloqueantes)(dadoPrivado?.violacoes ?? []);
|
|
327
742
|
const baseline = thread.baseline ?? null;
|
|
328
743
|
const regressoes = [];
|
|
329
744
|
const preExistentes = [];
|
|
330
745
|
const falhasSemBaseline = [];
|
|
331
746
|
const estouros = [];
|
|
747
|
+
// RM-037 (defeito 1 de 19 e 20/10/2026): o comando sem veredito na baseline nao separa regressao de divida.
|
|
748
|
+
const baselineSemVeredito = (baseline?.comandos ?? []).filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome);
|
|
332
749
|
for (const atual of comandos) {
|
|
333
750
|
if (atual.ok)
|
|
334
751
|
continue;
|
|
335
|
-
if (atual
|
|
752
|
+
if (semVereditoPorTempo(atual)) {
|
|
336
753
|
estouros.push(atual);
|
|
337
754
|
continue;
|
|
338
755
|
}
|
|
339
756
|
const antes = baseline?.comandos.find((c) => c.nome === atual.nome);
|
|
340
|
-
if (!antes)
|
|
757
|
+
if (!antes || vereditoDaBaseline(antes) === 'sem-veredito')
|
|
341
758
|
falhasSemBaseline.push(atual);
|
|
342
759
|
else if (antes.ok)
|
|
343
760
|
regressoes.push(atual);
|
|
@@ -348,6 +765,16 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
348
765
|
const identidadeFinal = preparo ? identidadeDoProduto(cwd) : null;
|
|
349
766
|
const produtoAlterado = !!preparo && identidadeFinal !== preparo.identidade;
|
|
350
767
|
const naoExecutados = comandos.filter((c) => c.executado === false);
|
|
768
|
+
const rodadaPct = janelaDaRodada.fechar();
|
|
769
|
+
const todos = [...(preparo ? [preparo.resultado] : []), ...claims.flatMap((c) => c.execucoes), ...comandos];
|
|
770
|
+
const steal = {
|
|
771
|
+
fonte: steal_1.FONTE_STEAL,
|
|
772
|
+
medido: rodadaPct !== null,
|
|
773
|
+
rodadaPct,
|
|
774
|
+
limiarPct: steal_1.LIMIAR_STEAL_PCT,
|
|
775
|
+
porComando: Object.fromEntries(todos.map((c) => [c.nome, c.stealPct ?? null])),
|
|
776
|
+
relogioSobSteal: todos.filter((c) => c.relogioSobSteal?.length).map((c) => c.nome),
|
|
777
|
+
};
|
|
351
778
|
const motivos = [];
|
|
352
779
|
if (claims.some((c) => c.motivo === 'claims.failed'))
|
|
353
780
|
motivos.push('claims.failed');
|
|
@@ -362,8 +789,11 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
362
789
|
if (produtoAlterado || naoExecutados.length > 0 || claims.some((c) => c.motivo === 'verify.sem-veredito')) {
|
|
363
790
|
motivos.push('verify.sem-veredito');
|
|
364
791
|
}
|
|
792
|
+
if (dadoPrivadoBloqueia.length > 0)
|
|
793
|
+
motivos.push('policy.violation');
|
|
365
794
|
const bloqueantes = motivos.filter((m) => m !== 'claims.unverifiable');
|
|
366
795
|
const ok = bloqueantes.length === 0;
|
|
796
|
+
const duracaoMs = Date.now() - inicioDaRodada;
|
|
367
797
|
(0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.verificacao, {
|
|
368
798
|
commit,
|
|
369
799
|
cwd,
|
|
@@ -374,6 +804,10 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
374
804
|
verificado: c.verificado,
|
|
375
805
|
motivo: c.motivo,
|
|
376
806
|
detalhe: c.detalhe,
|
|
807
|
+
// RM-072 (D2): a soma da parede dos comandos da claim.
|
|
808
|
+
duracaoMs: c.execucoes.reduce((t, e) => t + (e.duracaoMs ?? 0), 0),
|
|
809
|
+
// RM-072 (D5): no Agile, o que a guarda fez com cada comando da claim.
|
|
810
|
+
...(c.execucoes.some((e) => e.preparo) ? { preparo: c.execucoes.map((e) => e.preparo ?? null) } : {}),
|
|
377
811
|
...(falhou ? { execucao: comandoNoLedger(falhou) } : {}),
|
|
378
812
|
};
|
|
379
813
|
}),
|
|
@@ -382,16 +816,35 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
382
816
|
regressoes: regressoes.map((r) => r.nome),
|
|
383
817
|
preExistentes: preExistentes.map((r) => r.nome),
|
|
384
818
|
falhasSemBaseline: falhasSemBaseline.map((r) => r.nome),
|
|
819
|
+
...(baselineSemVeredito.length > 0 ? { baselineSemVeredito } : {}),
|
|
385
820
|
estouros: estouros.map((r) => r.nome),
|
|
386
821
|
prazoMs: manifesto.verify.timeout_ms ?? exports.TIMEOUT_VERIFY_MS,
|
|
822
|
+
steal,
|
|
823
|
+
...(instabilidade.presente ? { instabilidade: { contrato: 'ork.instabilidade/v1', arquivo: instabilidade.arquivo,
|
|
824
|
+
vigentes: instabilidade.vigentes.map((e) => e.teste), vencidas: instabilidade.vencidas.map((e) => e.teste),
|
|
825
|
+
erros: instabilidade.erros } } : {}),
|
|
387
826
|
...(preparo ? { preparo: { ...comandoNoLedger(preparo.resultado), duracaoMs: preparo.resultado.duracaoMs,
|
|
388
827
|
identidade: preparo.identidade.slice(0, 16), identidadeFinal: identidadeFinal.slice(0, 16), produtoAlterado } } : {}),
|
|
389
828
|
motivos,
|
|
390
829
|
veredito: ok ? 'verdade sustentada' : 'reprovado',
|
|
830
|
+
// RM-072 (D1, D2): o modo do CHECK e de onde ele veio, e a parede da rodada inteira.
|
|
831
|
+
check: checkNoLedger(check),
|
|
832
|
+
duracaoMs,
|
|
833
|
+
// RM-072 (D8): no Agile, as pecas, o grupo, o reaproveitamento e as listas das lanes.
|
|
834
|
+
...(resumoDoAgile ? { agile: resumoDoAgile } : {}),
|
|
391
835
|
// I-36: por qual canal a verificacao chegou; a reentrada da sessao que conduz aparece aqui.
|
|
392
836
|
canal,
|
|
393
837
|
conducao: { identidade: conducao.identidade, reentrada: conducao.reentrada },
|
|
838
|
+
// RM-058 N2: se a rodada esperou a vez na fila pesada, e quanto.
|
|
839
|
+
filaPesada,
|
|
840
|
+
// RM-062 (F2): contagens, padroes e onde; nunca o valor casado nem o termo da lista local.
|
|
841
|
+
...(dadoPrivado ? { dadoPrivado: (0, dado_privado_1.resumoNoLedger)(dadoPrivado) } : {}),
|
|
394
842
|
});
|
|
843
|
+
// RM-062 (F2): em `warn`, a barreira registra e segue, como toda policy de aviso.
|
|
844
|
+
for (const v of (0, policies_1.avisos)(dadoPrivado?.violacoes ?? [])) {
|
|
845
|
+
(0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.politicaAviso, { gate: 'verify', policy: v.policy, motivo: v.motivo,
|
|
846
|
+
detalhe: v.detalhe, correcao: v.correcao, modo: thread.modo });
|
|
847
|
+
}
|
|
395
848
|
for (const motivo of bloqueantes) {
|
|
396
849
|
(0, gates_1.registrarGateBloqueado)(dir, threadId, {
|
|
397
850
|
gate: 'verify',
|
|
@@ -405,14 +858,22 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
405
858
|
: motivo === 'verify.regression'
|
|
406
859
|
? `regressao em: ${regressoes.map((r) => r.nome).join(', ')}`
|
|
407
860
|
: motivo === 'verify.timeout'
|
|
408
|
-
? `
|
|
409
|
-
...
|
|
861
|
+
? `sem veredito por tempo (prazo estourado, ou teste com relogio sob steal acima de ${steal_1.LIMIAR_STEAL_PCT}%): ${[
|
|
862
|
+
...estouros.map((r) => r.nome),
|
|
863
|
+
...claims.filter((c) => c.motivo === 'verify.timeout').map((c) => c.claim.id)
|
|
864
|
+
].join(', ')}`
|
|
410
865
|
: motivo === 'verify.sem-veredito'
|
|
411
866
|
? [produtoAlterado ? 'o produto mudou entre o preparo e o fim da rodada' : '',
|
|
412
867
|
...naoExecutados.map((c) => `${c.nome} nao foi executado`),
|
|
413
868
|
...claims.filter((c) => c.motivo === 'verify.sem-veredito').map((c) => `${c.claim.id}: ${c.detalhe}`)]
|
|
414
869
|
.filter(Boolean).join('; ')
|
|
415
|
-
:
|
|
870
|
+
: motivo === 'policy.violation'
|
|
871
|
+
? dadoPrivadoBloqueia.map((v) => `policy ${v.policy}: ${v.detalhe}`).join('; ')
|
|
872
|
+
: `falha sem baseline em: ${falhasSemBaseline.map((r) => r.nome).join(', ')}` + (falhasSemBaseline
|
|
873
|
+
.some((r) => baselineSemVeredito.includes(r.nome))
|
|
874
|
+
? `; a baseline nao teve veredito de ${falhasSemBaseline.filter((r) => baselineSemVeredito.includes(r.nome))
|
|
875
|
+
.map((r) => r.nome).join(', ')} (estouro do prazo, sinal, relogio sob steal, comando que nao rodou ou sem ` +
|
|
876
|
+
'codigo de saida do proprio comando)' : ''),
|
|
416
877
|
evidencia: `reexecucao no HEAD ${commit} em ${cwd}`,
|
|
417
878
|
correcao: motivo === 'claims.failed'
|
|
418
879
|
? 'corrija o artefato ou a alegacao e rode `ork verify` de novo'
|
|
@@ -420,9 +881,13 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
420
881
|
? 'rode `ork verify` de novo; se estourar sempre, suba verify.timeout_ms no manifesto ou divida o comando'
|
|
421
882
|
: motivo === 'verify.sem-veredito'
|
|
422
883
|
? 'rode `ork verify` de novo, sem editar a worktree durante a rodada'
|
|
423
|
-
:
|
|
884
|
+
: motivo === 'policy.violation'
|
|
885
|
+
? dadoPrivadoBloqueia.map((v) => v.correcao).join('; ')
|
|
886
|
+
: 'corrija a regressao, ou grave a baseline antes do GO com `ork verify <thread> --baseline`',
|
|
424
887
|
});
|
|
425
888
|
}
|
|
889
|
+
// RM-072 (D17): o ultimo modo do CHECK fica na thread, para o status mostrar.
|
|
890
|
+
registrarModoNaThread(raiz, threadId, check, commit);
|
|
426
891
|
return {
|
|
427
892
|
thread: threadId,
|
|
428
893
|
commit,
|
|
@@ -435,74 +900,141 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
435
900
|
falhasSemBaseline,
|
|
436
901
|
estouros,
|
|
437
902
|
preparo: preparo ? { ...preparo, identidadeFinal: identidadeFinal, produtoAlterado } : null,
|
|
903
|
+
steal,
|
|
904
|
+
instabilidade,
|
|
905
|
+
filaPesada,
|
|
906
|
+
dadoPrivado,
|
|
907
|
+
check,
|
|
908
|
+
duracaoMs,
|
|
909
|
+
agile: resumoDoAgile,
|
|
438
910
|
motivos,
|
|
439
911
|
ok,
|
|
440
912
|
};
|
|
441
913
|
}
|
|
914
|
+
/**
|
|
915
|
+
* RM-072 (D17): grava o modo do ultimo `verify_run` no `thread.json`. A thread e relida na hora, para nao devolver ao
|
|
916
|
+
* disco uma copia lida no comeco da rodada; o status mostra a linha so quando o campo existe.
|
|
917
|
+
*/
|
|
918
|
+
function registrarModoNaThread(raiz, threadId, check, commit) {
|
|
919
|
+
const atual = (0, thread_1.lerThread)(raiz, threadId);
|
|
920
|
+
atual.check = { modo: check.modo, origem: check.origem, commit, em: (0, util_1.agora)() };
|
|
921
|
+
(0, thread_1.gravarThread)(raiz, atual);
|
|
922
|
+
}
|
|
442
923
|
/** `FALHOU (codigo 1)`, ou `ESTOUROU O PRAZO (600 s, rodou 612 s)`: a causa e dita pelo nome. */
|
|
443
924
|
function situacaoDoComando(c) {
|
|
925
|
+
const m = (0, locale_1.msg)().verify;
|
|
444
926
|
const s = (ms) => `${Math.round((ms ?? 0) / 1000)} s`;
|
|
445
927
|
if (c.causa === 'timeout')
|
|
446
|
-
return
|
|
928
|
+
return m.estourou(s(c.prazoMs), s(c.duracaoMs));
|
|
929
|
+
if (c.relogioSobSteal?.length)
|
|
930
|
+
return m.relogioSobSteal(c.stealPct, steal_1.LIMIAR_STEAL_PCT);
|
|
447
931
|
if (c.causa === 'nao-encontrado')
|
|
448
|
-
return
|
|
932
|
+
return m.naoExecutou(c.code);
|
|
449
933
|
if (c.causa === 'sinal')
|
|
450
|
-
return
|
|
451
|
-
return
|
|
934
|
+
return m.mortoPorSinal(c.code);
|
|
935
|
+
return m.falhou(c.code);
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* RM-037 (defeito 1 de 19 e 20/10/2026): as linhas de cada comando de `ork verify --baseline`, com o veredito dele, e a
|
|
939
|
+
* linha que diz o que a baseline nao provou e como regravar.
|
|
940
|
+
*/
|
|
941
|
+
function linhasDaBaseline(b, id) {
|
|
942
|
+
const m = (0, locale_1.msg)().verify;
|
|
943
|
+
const linhas = b.comandos.map((c) => m.baselineComando(c.nome, vereditoDaBaseline(c), c.code, c.comando, situacaoDoComando(c)));
|
|
944
|
+
// RM-072 (D1): o modo que gravou a baseline (a baseline anterior a RM-072 nao tem o campo).
|
|
945
|
+
if (b.check)
|
|
946
|
+
linhas.unshift(m.baselineCheck(check_modo_1.NOME_DO_MODO[b.check.modo], b.check.modo, b.check.origem));
|
|
947
|
+
const semVeredito = b.comandos.filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome);
|
|
948
|
+
if (semVeredito.length > 0)
|
|
949
|
+
linhas.push(m.baselineSemVeredito(semVeredito.join(', '), id));
|
|
950
|
+
return linhas;
|
|
452
951
|
}
|
|
453
|
-
/** Texto de `ork verify`. */
|
|
952
|
+
/** Texto de `ork verify`. O detalhe da claim veio do catalogo em pt-BR e sai remontado no locale ativo. */
|
|
454
953
|
function textoDoVerify(r) {
|
|
954
|
+
const m = (0, locale_1.msg)().verify;
|
|
455
955
|
const linhas = [];
|
|
456
|
-
linhas.push(
|
|
457
|
-
linhas.push(
|
|
458
|
-
linhas.push(
|
|
459
|
-
linhas.push(
|
|
956
|
+
linhas.push(m.titulo(r.thread));
|
|
957
|
+
linhas.push(m.head(r.commit));
|
|
958
|
+
linhas.push(m.diretorio(r.cwd));
|
|
959
|
+
linhas.push(m.check(r.check.nome, r.check.modo, r.check.origem));
|
|
960
|
+
// RM-072 (D8): no Agile, o reaproveitamento, o grupo e as pecas em fallback, quando ha o que dizer.
|
|
961
|
+
const a = r.agile;
|
|
962
|
+
if (a && (a.claims.reaproveitadas + a.claims.inteiras > 0 || a.grupo.paralelo)) {
|
|
963
|
+
linhas.push(m.agile(a.claims.reaproveitadas, a.claims.inteiras, a.grupo.paralelo, a.grupo.lanes));
|
|
964
|
+
}
|
|
965
|
+
for (const p of a?.pecas.filter((x) => x.estado === 'fallback') ?? [])
|
|
966
|
+
linhas.push(m.agileFallback(p.peca, p.motivo ?? '', p.fallback ?? ''));
|
|
967
|
+
linhas.push(r.baseline ? m.baseline((0, util_1.shaCurto)(r.baseline.commit), (0, horario_1.formatarDataHoraRotulada)(r.baseline.gravadaEm)) : m.semBaseline);
|
|
460
968
|
if (r.preparo) {
|
|
461
969
|
const p = r.preparo;
|
|
462
|
-
linhas.push(
|
|
463
|
-
|
|
464
|
-
|
|
970
|
+
linhas.push(m.preparo(p.resultado.ok ? m.comandoOk : situacaoDoComando(p.resultado), Math.round((p.resultado.duracaoMs ?? 0) / 1000), p.produtoAlterado));
|
|
971
|
+
}
|
|
972
|
+
linhas.push(r.steal.medido ? m.stealMedido(r.steal.rodadaPct, r.steal.fonte, r.steal.limiarPct) : m.stealNaoMedido(r.steal.fonte));
|
|
973
|
+
if (r.instabilidade.erros.length > 0) {
|
|
974
|
+
linhas.push(m.instabilidadeForaDoContrato(r.instabilidade.arquivo, r.instabilidade.erros.join('; ')));
|
|
975
|
+
}
|
|
976
|
+
else if (r.instabilidade.vencidas.length > 0) {
|
|
977
|
+
linhas.push(m.instabilidadeVencidas(r.instabilidade.vencidas.length, r.instabilidade.vencidas.map((e) => e.teste).join(', ')));
|
|
465
978
|
}
|
|
466
979
|
linhas.push('');
|
|
467
|
-
linhas.push(
|
|
980
|
+
linhas.push(m.claimsReexecutadas);
|
|
468
981
|
if (r.claims.length === 0) {
|
|
469
|
-
linhas.push(
|
|
982
|
+
linhas.push(m.nenhumaClaim);
|
|
470
983
|
}
|
|
471
984
|
for (const c of r.claims) {
|
|
472
|
-
linhas.push(
|
|
473
|
-
linhas.push(
|
|
474
|
-
linhas.push(
|
|
985
|
+
linhas.push(m.claim(c.claim.id, c.verificado, c.claim.alegacao));
|
|
986
|
+
linhas.push(m.arquivo(c.claim.arquivo));
|
|
987
|
+
linhas.push(c.claim.verificar.length > 0 ? m.comandos(c.claim.verificar.join(' && ')) : m.semComando);
|
|
475
988
|
if (!c.verificado)
|
|
476
|
-
linhas.push(
|
|
989
|
+
linhas.push(m.motivoTipado(String(c.motivo), (0, locale_1.remontar)(c.detalhe)));
|
|
477
990
|
}
|
|
478
991
|
if (r.comandos.length > 0) {
|
|
479
992
|
linhas.push('');
|
|
480
|
-
linhas.push(
|
|
993
|
+
linhas.push(m.comandosDoManifesto);
|
|
481
994
|
for (const c of r.comandos) {
|
|
482
|
-
linhas.push(
|
|
995
|
+
linhas.push(m.comando(c.nome, c.ok ? m.comandoOk : situacaoDoComando(c), c.comando));
|
|
483
996
|
if (!c.ok && c.testeQueCaiu?.length)
|
|
484
|
-
linhas.push(
|
|
997
|
+
linhas.push(m.testesQueCairam(c.testeQueCaiu.join('; ')));
|
|
485
998
|
}
|
|
486
999
|
}
|
|
487
1000
|
if (r.estouros.length > 0) {
|
|
488
1001
|
linhas.push('');
|
|
489
|
-
linhas.push(
|
|
1002
|
+
linhas.push(m.semVeredito(r.estouros.map((c) => c.nome).join(', ')));
|
|
490
1003
|
}
|
|
491
1004
|
if (r.regressoes.length > 0 || r.preExistentes.length > 0 || r.falhasSemBaseline.length > 0) {
|
|
492
1005
|
linhas.push('');
|
|
493
|
-
linhas.push(
|
|
494
|
-
`${r.preExistentes.length} pre-existente(s), ` +
|
|
495
|
-
`${r.falhasSemBaseline.length} falha(s) sem baseline`);
|
|
1006
|
+
linhas.push(m.classificacao(r.regressoes.length, r.preExistentes.length, r.falhasSemBaseline.length));
|
|
496
1007
|
for (const c of r.regressoes)
|
|
497
|
-
linhas.push(
|
|
1008
|
+
linhas.push(m.regressao(c.nome, c.comando));
|
|
498
1009
|
for (const c of r.preExistentes)
|
|
499
|
-
linhas.push(
|
|
500
|
-
|
|
501
|
-
|
|
1010
|
+
linhas.push(m.preExistente(c.nome, c.comando));
|
|
1011
|
+
// RM-037 (defeito 1 de 19 e 20/10/2026): a baseline existe, mas nao teve veredito deste comando.
|
|
1012
|
+
const semVeredito = new Set((r.baseline?.comandos ?? []).filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome));
|
|
1013
|
+
for (const c of r.falhasSemBaseline) {
|
|
1014
|
+
linhas.push(semVeredito.has(c.nome) ? m.falhaComBaselineSemVeredito(c.nome, c.comando) : m.falhaSemBaseline(c.nome, c.comando));
|
|
1015
|
+
}
|
|
502
1016
|
}
|
|
1017
|
+
if (r.dadoPrivado)
|
|
1018
|
+
linhas.push('', ...textoDaBarreira(r.dadoPrivado));
|
|
503
1019
|
linhas.push('');
|
|
504
|
-
linhas.push(r.ok
|
|
505
|
-
? 'Veredito: VERDADE SUSTENTADA (nenhum motivo bloqueante).'
|
|
506
|
-
: `Veredito: REPROVADO. Motivos tipados: ${r.motivos.join(', ')}`);
|
|
1020
|
+
linhas.push(r.ok ? m.verdade : m.reprovado(r.motivos.join(', ')));
|
|
507
1021
|
return linhas.join('\n');
|
|
508
1022
|
}
|
|
1023
|
+
/** RM-062 (F2): a secao da barreira de dado privado, sem valor casado nem termo; ate 20 achados. */
|
|
1024
|
+
function textoDaBarreira(b) {
|
|
1025
|
+
const m = (0, locale_1.msg)().verify;
|
|
1026
|
+
const v = b.varredura;
|
|
1027
|
+
const escopo = v.escopo.map((e) => e.tipo === 'diff' ? m.dadoPrivadoEscopoDiff(e.base.slice(0, 12), e.ref)
|
|
1028
|
+
: e.tipo === 'arvore' ? m.dadoPrivadoEscopoArvore : m.dadoPrivadoEscopoTexto(e.nome)).join(' + ');
|
|
1029
|
+
const linhas = [m.dadoPrivadoTitulo(b.severidade), m.dadoPrivadoEscopo(escopo, v.arquivos, v.linhas, v.nomes),
|
|
1030
|
+
v.listaLocal.presente ? m.dadoPrivadoListaPresente(v.listaLocal.termos, v.listaLocal.lidos.join(', '))
|
|
1031
|
+
: m.dadoPrivadoListaAusente(v.listaLocal.procurada.join(', '))];
|
|
1032
|
+
if (v.erro)
|
|
1033
|
+
return [...linhas, m.dadoPrivadoErro(v.erro)];
|
|
1034
|
+
linhas.push(m.dadoPrivadoAchados(v.achados.length));
|
|
1035
|
+
for (const a of v.achados.slice(0, 20))
|
|
1036
|
+
linhas.push(m.dadoPrivadoAchado(a.arquivo, a.linha, a.coluna, a.padrao, a.termo));
|
|
1037
|
+
if (v.achados.length > 20)
|
|
1038
|
+
linhas.push(m.dadoPrivadoMais(v.achados.length - 20));
|
|
1039
|
+
return linhas;
|
|
1040
|
+
}
|