@orkastery/cli 0.5.6 → 0.6.1
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 +37 -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/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-pista/hooks/ci.ts +9 -5
- 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/hooks/vigia.ts +1 -1
- 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 +2 -2
- package/adapters/openclaw/README.md +81 -9
- 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/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 +123 -9
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +3 -1
- package/dist/adapters/grok-events.js +227 -0
- package/dist/adapters/grok-mcp-servidor.js +612 -0
- package/dist/adapters/grok-mcp.js +178 -0
- package/dist/adapters/grok.js +686 -0
- package/dist/agendador-cpu.js +92 -0
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +51 -46
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +94 -40
- package/dist/branch-de-estado.js +23 -10
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +2 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +528 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +238 -0
- package/dist/ci.js +248 -45
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +47 -39
- package/dist/claims.js +10 -9
- package/dist/company-brain-client.js +10 -3
- package/dist/company-brain-migration.js +11 -5
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +25 -8
- package/dist/conducao.js +89 -29
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +111 -87
- 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 +89 -89
- package/dist/doctor-forja.js +343 -0
- package/dist/doctor-pulse-cron.js +113 -1
- package/dist/doctor.js +164 -6
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +154 -54
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +21 -18
- package/dist/evalrunner.js +35 -32
- package/dist/fabrica-batida.js +34 -21
- package/dist/fabrica-estado.js +33 -21
- package/dist/fix.js +21 -19
- 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 +123 -80
- package/dist/handoff.js +23 -13
- 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 +51 -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 +44 -1
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +34 -31
- package/dist/horario.js +20 -1
- package/dist/hosts.js +104 -134
- package/dist/index.js +864 -554
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +123 -69
- package/dist/intelligence-graph-query.js +37 -22
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +31 -1
- package/dist/licoes.js +12 -11
- package/dist/locale-accounts.js +228 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +86 -10
- 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 +288 -0
- package/dist/locale-gerados.js +5 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +83 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +140 -2
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +183 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +177 -66
- package/dist/locale-thread.js +149 -5
- package/dist/locale-verify.js +80 -4
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +553 -9
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +293 -12
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +10 -5
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +10 -2
- package/dist/master.js +118 -41
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-install.js +90 -15
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +116 -22
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +68 -24
- package/dist/mcp-transportes.js +17 -0
- package/dist/memoria.js +63 -58
- package/dist/merge-da-entrega.js +85 -0
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +94 -54
- package/dist/noctum-aceite.js +929 -0
- package/dist/noctum-arco.js +540 -33
- package/dist/noctum-capacidade.js +3 -3
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +539 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1217 -0
- package/dist/noctum-envelope.js +253 -17
- package/dist/noctum-execucao.js +100 -24
- package/dist/noctum-fechamento.js +416 -0
- package/dist/noctum-fila.js +49 -10
- package/dist/noctum-guarda.js +333 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +387 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +390 -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 +594 -0
- package/dist/noctum-rede.js +102 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +861 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-retomada-rede.js +71 -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 +679 -0
- package/dist/ocupacao.js +3 -1
- package/dist/onboarding.js +16 -5
- package/dist/orkmind.js +39 -23
- package/dist/orquestracao.js +31 -35
- package/dist/parado-no-condutor.js +160 -139
- package/dist/phase.js +96 -42
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +11 -6
- package/dist/preflight.js +2 -1
- package/dist/procedencia.js +9 -14
- package/dist/projeto-alvo.js +59 -20
- package/dist/prompts.js +136 -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 +143 -27
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +136 -3
- package/dist/ratelimit.js +13 -4
- package/dist/recall.js +14 -13
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +63 -45
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +326 -78
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +279 -85
- package/dist/runtime-escada.js +429 -0
- package/dist/runtime-profiles.js +130 -63
- package/dist/runtimes.js +42 -5
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +366 -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 +196 -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 +19 -2
- package/dist/session-watcher-claude.js +74 -19
- package/dist/session-watcher-grok.js +425 -0
- package/dist/session-watcher.js +174 -13
- package/dist/sessoes-contas.js +42 -5
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +67 -66
- package/dist/ship-publicar.js +263 -92
- package/dist/ship.js +160 -17
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +9 -9
- package/dist/thread.js +121 -18
- 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 +5 -2
- package/dist/varredura-acoes.js +500 -0
- package/dist/verify.js +491 -32
- package/dist/worktree-local.js +12 -10
- package/dist/worktree.js +81 -85
- 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 +10 -5
- package/references/security-checklist.md +3 -3
- 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,11 +12,49 @@
|
|
|
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.ESPERA_PADRAO_DA_FILA_PESADA_MS = exports.ESPERA_DA_FILA_PESADA_MS = 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;
|
|
20
58
|
exports.semVereditoPorTempo = semVereditoPorTempo;
|
|
21
59
|
exports.executorComSteal = executorComSteal;
|
|
22
60
|
exports.identidadeDoProduto = identidadeDoProduto;
|
|
@@ -25,15 +63,23 @@ exports.comandoNoLedger = comandoNoLedger;
|
|
|
25
63
|
exports.comandosDoManifesto = comandosDoManifesto;
|
|
26
64
|
exports.cwdDaThread = cwdDaThread;
|
|
27
65
|
exports.commitReal = commitReal;
|
|
66
|
+
exports.executorDaRodada = executorDaRodada;
|
|
67
|
+
exports.ambienteDoModo = ambienteDoModo;
|
|
68
|
+
exports.vereditoDaBaseline = vereditoDaBaseline;
|
|
28
69
|
exports.gravarBaseline = gravarBaseline;
|
|
29
70
|
exports.verificarClaim = verificarClaim;
|
|
30
71
|
exports.verificar = verificar;
|
|
72
|
+
exports.linhasDaBaseline = linhasDaBaseline;
|
|
31
73
|
exports.textoDoVerify = textoDoVerify;
|
|
32
74
|
const claims_1 = require("./claims");
|
|
33
75
|
const gates_1 = require("./gates");
|
|
34
76
|
const ledger_1 = require("./ledger");
|
|
35
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"));
|
|
36
81
|
const node_fs_1 = require("node:fs");
|
|
82
|
+
const path = __importStar(require("node:path"));
|
|
37
83
|
const node_path_1 = require("node:path");
|
|
38
84
|
const node_crypto_1 = require("node:crypto");
|
|
39
85
|
const util_1 = require("./util");
|
|
@@ -46,6 +92,12 @@ const fila_pesada_1 = require("./fila-pesada");
|
|
|
46
92
|
const redacao_url_1 = require("./redacao-url");
|
|
47
93
|
const conducao_1 = require("./conducao");
|
|
48
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");
|
|
100
|
+
const agendador_cpu_1 = require("./agendador-cpu");
|
|
49
101
|
/** Teto de tempo de um comando de verificacao (build e suite completa cabem). */
|
|
50
102
|
exports.TIMEOUT_VERIFY_MS = 10 * 60 * 1000;
|
|
51
103
|
/** Ultimas linhas da saida real, o suficiente para servir de evidencia no ledger. */
|
|
@@ -66,14 +118,62 @@ const TIMEOUT_BIN = '/usr/bin/timeout';
|
|
|
66
118
|
* valvula de escape: comando que precise delas vira escalacao para humano.
|
|
67
119
|
*/
|
|
68
120
|
exports.PREFIXO_BLOQUEADO_NO_VERIFY = 'ORK_HITL_';
|
|
121
|
+
/**
|
|
122
|
+
* RM-072 (S-b do CHECK 2): as variaveis de uma rodada do Agile. Cada rodada poe as suas onde precisa; herdadas de outra
|
|
123
|
+
* rodada (o verify que roda dentro de um comando de outro verify), elas levariam pecas ao relatorio errado.
|
|
124
|
+
*/
|
|
125
|
+
const VARIAVEIS_DA_RODADA = new Set([
|
|
126
|
+
check_modo_1.ENV_RELATORIO_DO_CHECK, check_modo_1.ENV_VARREDURA_PARALELA_DO_CHECK, agendador_cpu_1.ENV_CPUS_DA_LANE, agendador_cpu_1.ENV_CPUS_DOCKER,
|
|
127
|
+
]);
|
|
69
128
|
function ambienteDoVerify(base = process.env) {
|
|
70
|
-
return Object.fromEntries(Object.entries(base).filter(([chave]) => !chave.startsWith(exports.PREFIXO_BLOQUEADO_NO_VERIFY)
|
|
129
|
+
return Object.fromEntries(Object.entries(base).filter(([chave]) => !chave.startsWith(exports.PREFIXO_BLOQUEADO_NO_VERIFY)
|
|
130
|
+
&& !VARIAVEIS_DA_RODADA.has(chave)));
|
|
71
131
|
}
|
|
72
132
|
/** I-37 (D2): o prazo de um comando, resolvido uma vez por rodada (D3). */
|
|
73
133
|
function prazoDoComando(manifesto, nome) {
|
|
74
134
|
const porComando = manifesto.verify.timeout_ms_por_comando;
|
|
75
135
|
return porComando?.[nome] ?? manifesto.verify.timeout_ms ?? exports.TIMEOUT_VERIFY_MS;
|
|
76
136
|
}
|
|
137
|
+
/** Teto da margem que o `security_scan` reserva, dentro do proprio prazo, para os passos que ele nao limita. */
|
|
138
|
+
exports.MARGEM_MAX_DO_SCAN_MS = 300_000;
|
|
139
|
+
/**
|
|
140
|
+
* O prazo interno da rodada do scan (`ORK_SECURITY_SCAN_DEADLINE_MS`): o prazo do comando menos a margem
|
|
141
|
+
* `min(300 s, prazo/4)`, que cobre worktree add, sondas e `docker rm`. Assim a rodada termina, com `failed/timeout`
|
|
142
|
+
* declarado, antes de o `timeout(1)` do verify matar o comando sem relatorio.
|
|
143
|
+
*/
|
|
144
|
+
function prazoInternoDoScan(prazoMs) {
|
|
145
|
+
return prazoMs - Math.min(exports.MARGEM_MAX_DO_SCAN_MS, Math.floor(prazoMs / 4));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* O comando roda o `security_scan`: pelo nome (verify, bundle do CI) ou por ser, na claim, o mesmo comando declarado em
|
|
149
|
+
* `verify.security_scan`. Sem a chave, nada e scan.
|
|
150
|
+
*/
|
|
151
|
+
function ehComandoDoScan(manifesto, nome, comando) {
|
|
152
|
+
if (nome === 'security_scan')
|
|
153
|
+
return true;
|
|
154
|
+
const scan = manifesto.verify.security_scan?.trim();
|
|
155
|
+
return !!scan && comando.trim() === scan;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 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
|
|
159
|
+
* (D4): a lane do Agile (`test:<lane>`) tem o prazo do `test` que ela substitui.
|
|
160
|
+
*/
|
|
161
|
+
function prazoDaExecucao(manifesto, nome, comando) {
|
|
162
|
+
return prazoDoComando(manifesto, ehComandoDoScan(manifesto, nome, comando) ? 'security_scan' : nome.startsWith('test:') ? 'test' : nome);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* O executor resolvido pelo manifesto: prazo de cada comando e, no scan, o prazo interno no ambiente. RM-072 (D2):
|
|
166
|
+
* `ambienteDaRodada` e o que a rodada passa a todo comando dela (o modo do CHECK); o CI hospedado nao passa nada.
|
|
167
|
+
*/
|
|
168
|
+
function executorDoManifesto(manifesto, ambienteDaRodada) {
|
|
169
|
+
return (nome, comando, cwd) => {
|
|
170
|
+
const prazo = prazoDaExecucao(manifesto, nome, comando);
|
|
171
|
+
const extra = ehComandoDoScan(manifesto, nome, comando)
|
|
172
|
+
? { ORK_SECURITY_SCAN_DEADLINE_MS: String(prazoInternoDoScan(prazo)) }
|
|
173
|
+
: undefined;
|
|
174
|
+
return executar(nome, comando, cwd, prazo, ambienteDaRodada || extra ? { ...ambienteDaRodada, ...extra } : undefined);
|
|
175
|
+
};
|
|
176
|
+
}
|
|
77
177
|
/**
|
|
78
178
|
* Executa um comando de verificacao pelo shell, no diretorio de trabalho da thread.
|
|
79
179
|
*
|
|
@@ -83,14 +183,20 @@ function prazoDoComando(manifesto, nome) {
|
|
|
83
183
|
* o proprio `ork` morrer no meio, o `timeout` segue de pe e encerra o grupo no prazo.
|
|
84
184
|
* O estouro continua saindo como `code: -1`, o contrato de antes.
|
|
85
185
|
*/
|
|
86
|
-
function executar(nome, comando, cwd, tetoMs = exports.TIMEOUT_VERIFY_MS) {
|
|
186
|
+
function executar(nome, comando, cwd, tetoMs = exports.TIMEOUT_VERIFY_MS, ambienteExtra) {
|
|
87
187
|
const comGrupo = (0, node_fs_1.existsSync)(TIMEOUT_BIN);
|
|
88
188
|
const inicio = Date.now();
|
|
89
|
-
const ambiente = ambienteDoVerify();
|
|
189
|
+
const ambiente = { ...ambienteDoVerify(), ...ambienteExtra };
|
|
90
190
|
const r = comGrupo
|
|
91
191
|
? (0, util_1.exec)(TIMEOUT_BIN, ['--kill-after=15', `${Math.ceil(tetoMs / 1000)}`, 'bash', '-c', comando], cwd, tetoMs + 30_000, ambiente)
|
|
92
192
|
: (0, util_1.exec)('bash', ['-c', comando], cwd, tetoMs, ambiente);
|
|
93
|
-
|
|
193
|
+
return resultadoDoProcesso(nome, comando, r, comGrupo, Date.now() - inicio, tetoMs);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* RM-072 (D6): o resultado de um comando a partir do que o processo devolveu, o mesmo para o `executar` e para o grupo
|
|
197
|
+
* paralelo do Agile (`check-paralelo.ts`), para os dois julgarem estouro, sinal e saida da mesma forma.
|
|
198
|
+
*/
|
|
199
|
+
function resultadoDoProcesso(nome, comando, r, comGrupo, duracaoMs, tetoMs) {
|
|
94
200
|
const causa = causaDoEncerramento({ code: r.code, signal: r.signal ?? null, error: r.error, comGrupo, duracaoMs, tetoMs });
|
|
95
201
|
const estourou = causa === 'timeout';
|
|
96
202
|
const resultado = {
|
|
@@ -103,7 +209,9 @@ function executar(nome, comando, cwd, tetoMs = exports.TIMEOUT_VERIFY_MS) {
|
|
|
103
209
|
prazoMs: tetoMs,
|
|
104
210
|
duracaoMs,
|
|
105
211
|
// I-54 (D11): so nao rodou o que o sistema recusou lancar; estouro e sinal rodaram e acabaram.
|
|
106
|
-
|
|
212
|
+
// `spawnSync` pode devolver um erro tardio do sandbox junto de um status real (por exemplo EPERM com status 0):
|
|
213
|
+
// nesse caso o processo existiu e o codigo observado e o veredito. So status ausente (`code: -1`) prova que nao lancou.
|
|
214
|
+
executado: !(r.code === -1 && r.error && NAO_LANCADO.has(r.error)),
|
|
107
215
|
};
|
|
108
216
|
if (!r.ok) {
|
|
109
217
|
const saida = r.stdout + (r.stderr ? '\n' + r.stderr : '');
|
|
@@ -191,10 +299,15 @@ function causaDoEncerramento(r) {
|
|
|
191
299
|
}
|
|
192
300
|
/** I-37 (D8): o que o ledger grava de um comando. Sucesso e o codigo 0; falha leva a evidencia. */
|
|
193
301
|
function comandoNoLedger(c) {
|
|
302
|
+
// RM-072 (D2): a duracao vai tambem no comando que passa, para a meta do CHECK ser medida pelo ledger. RM-072 (D4, D5):
|
|
303
|
+
// no Agile, o uso do preparo e as lanes; o Classic nao tem esses campos.
|
|
304
|
+
const doAgile = { ...(c.preparo ? { preparo: c.preparo } : {}),
|
|
305
|
+
...(c.lanes ? { lanes: c.lanes.map((l) => ({ ...l, comando: (0, redacao_url_1.redigirCredenciaisUrl)(l.comando) })) } : {}),
|
|
306
|
+
...(c.comandoExecutado ? { comandoExecutado: (0, redacao_url_1.redigirCredenciaisUrl)(c.comandoExecutado) } : {}) };
|
|
194
307
|
if (c.ok)
|
|
195
|
-
return { nome: c.nome, ok: true, code: c.code };
|
|
308
|
+
return { nome: c.nome, ok: true, code: c.code, ...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}), ...doAgile };
|
|
196
309
|
return {
|
|
197
|
-
nome: c.nome, comando: (0, redacao_url_1.redigirCredenciaisUrl)(c.comando), ok: false, code: c.code,
|
|
310
|
+
nome: c.nome, comando: (0, redacao_url_1.redigirCredenciaisUrl)(c.comando), ok: false, code: c.code, ...doAgile,
|
|
198
311
|
...(c.causa ? { causa: c.causa } : {}),
|
|
199
312
|
...(c.prazoMs !== undefined ? { prazoMs: c.prazoMs } : {}),
|
|
200
313
|
...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}),
|
|
@@ -207,7 +320,7 @@ function comandoNoLedger(c) {
|
|
|
207
320
|
/** Comandos declarados em `verify:` no manifesto, na ordem canonica. */
|
|
208
321
|
function comandosDoManifesto(manifesto) {
|
|
209
322
|
const lista = [];
|
|
210
|
-
for (const nome of ['typecheck', 'build', 'test']) {
|
|
323
|
+
for (const nome of ['typecheck', 'build', 'test', 'security_scan']) {
|
|
211
324
|
const comando = manifesto.verify[nome];
|
|
212
325
|
if (comando && comando.trim() !== '')
|
|
213
326
|
lista.push({ nome, comando });
|
|
@@ -257,27 +370,223 @@ function pedidoDoVerify(carregado, threadId, operacao, comandos, conducao) {
|
|
|
257
370
|
/** O executor que renova o prazo da conducao antes de cada comando (D3). */
|
|
258
371
|
function executorSobConducao(base, manifesto, conducao) {
|
|
259
372
|
return (nome, comando, cwd) => {
|
|
260
|
-
conducao.renovar(
|
|
373
|
+
conducao.renovar(prazoDaExecucao(manifesto, nome, comando));
|
|
261
374
|
return base(nome, comando, cwd);
|
|
262
375
|
};
|
|
263
376
|
}
|
|
264
|
-
/**
|
|
265
|
-
|
|
377
|
+
/**
|
|
378
|
+
* 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
|
|
379
|
+
* de cada comando sai do manifesto (`executorDoManifesto`, que tambem da ao scan o prazo interno), e o steal e medido na
|
|
380
|
+
* janela de cada um, com os testes de relogio do registro de instabilidade da arvore verificada. A baseline rodava pelo
|
|
381
|
+
* `executar` com o teto padrao de 600 s: em 20/10 a suite desta VPS passou disso, e o `test` foi gravado como "ja
|
|
382
|
+
* falhava" com o manifesto dando 2400 s.
|
|
383
|
+
*/
|
|
384
|
+
function executorDaRodada(manifesto, instabilidade, base, leitor = steal_1.lerProcStat, ambienteDaRodada) {
|
|
385
|
+
return executorComSteal(base ?? executorDoManifesto(manifesto, ambienteDaRodada), leitor, (0, instabilidade_1.testesDeRelogioVigentes)(instabilidade));
|
|
386
|
+
}
|
|
387
|
+
/** RM-072 (D2): o que a rodada passa a todo comando dela, nos dois modos: o modo do CHECK. */
|
|
388
|
+
function ambienteDoModo(check) {
|
|
389
|
+
return { [check_modo_1.ENV_MODO_DO_CHECK]: check.modo };
|
|
390
|
+
}
|
|
391
|
+
/** RM-072 (D1, D2): o modo da rodada, como vai ao ledger. */
|
|
392
|
+
function checkNoLedger(check) {
|
|
393
|
+
return { modo: check.modo, origem: check.origem, nome: check.nome };
|
|
394
|
+
}
|
|
395
|
+
/** RM-072 (D5): a guarda do produto no fim do preparo; sem preparo, ou com ele reprovado, nada e reaproveitado. */
|
|
396
|
+
function guardaDoPreparo(manifesto, cwd, preparo) {
|
|
397
|
+
return new check_agil_1.GuardaDoProduto(cwd, manifesto.check?.agile?.produto, identidadeDoProduto, preparo ? (preparo.ok ? null : 'preparo-falhou') : 'sem-preparo');
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* 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
|
|
401
|
+
* lanes; o `build`, o `typecheck` e o `verify.test` (em serie ou no grupo) recebem so o modo, como as claims. O teste que
|
|
402
|
+
* roda a varredura dentro do `verify.test` gravaria pecas de fixture no relatorio da rodada.
|
|
403
|
+
*/
|
|
404
|
+
function recebeORelatorio(nome) {
|
|
405
|
+
return nome === 'security_scan' || nome.startsWith('test:');
|
|
406
|
+
}
|
|
407
|
+
function soAVarreduraEAsLanesComRelatorio(comRelatorio, semRelatorio) {
|
|
408
|
+
return (nome, comando, cwd) => (recebeORelatorio(nome) ? comRelatorio : semRelatorio)(nome, comando, cwd);
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* RM-072 (D6): o executor do grupo do Agile. Sem executor injetado, o processo auxiliar roda os comandos ao mesmo tempo,
|
|
412
|
+
* cada um com o prazo e o ambiente que o `executorDoManifesto` daria a ele (o do scan com o prazo interno), o steal medido
|
|
413
|
+
* na janela do grupo e a conducao renovada com o maior prazo. Com executor injetado (MCP, testes), um por vez, por ele.
|
|
414
|
+
*/
|
|
415
|
+
function executorDoGrupo(manifesto, ambienteDaRodada, instabilidade, leitor, conducao, injetado, medicaoCpu) {
|
|
416
|
+
if (injetado)
|
|
417
|
+
return (itens, cwd) => itens.map((i) => injetado(i.nome, i.comando, cwd));
|
|
418
|
+
const relogio = (0, instabilidade_1.testesDeRelogioVigentes)(instabilidade);
|
|
419
|
+
// N5 do CHECK 3: no grupo, como em serie, so a varredura e as lanes recebem o relatorio da rodada.
|
|
420
|
+
const { [check_modo_1.ENV_RELATORIO_DO_CHECK]: _relatorio, ...semRelatorio } = ambienteDaRodada;
|
|
421
|
+
const executar = ((itens, cwd) => {
|
|
422
|
+
const prazos = itens.map((i) => prazoDaExecucao(manifesto, i.nome, i.comando));
|
|
423
|
+
const paraOAuxiliar = itens.map((i, k) => ({ nome: i.nome, comando: i.comando, cwd, prazoMs: prazos[k],
|
|
424
|
+
...(i.nice ? { nice: i.nice } : {}), ...(i.apos?.length ? { apos: i.apos } : {}), ...(i.papelCpu ? { papelCpu: i.papelCpu } : {}),
|
|
425
|
+
ambiente: { ...(recebeORelatorio(i.nome) ? ambienteDaRodada : semRelatorio), ...(ehComandoDoScan(manifesto, i.nome, i.comando)
|
|
426
|
+
// RM-072: ao lado das lanes, a varredura roda poucas ferramentas por vez, para o grupo nao passar da CPU.
|
|
427
|
+
? { ORK_SECURITY_SCAN_DEADLINE_MS: String(prazoInternoDoScan(prazos[k])),
|
|
428
|
+
...(itens.length > 1 ? { [check_modo_1.ENV_VARREDURA_PARALELA_DO_CHECK]: String((0, check_agil_1.paralelismoDaVarreduraNoGrupo)()) } : {}) } : {}) } }));
|
|
429
|
+
// A conducao cobre o grupo inteiro: com a lane encadeada, a varredura e a lane somam.
|
|
430
|
+
conducao.renovar((0, check_paralelo_1.esperaDoGrupo)(paraOAuxiliar));
|
|
431
|
+
const janela = (0, steal_1.abrirJanela)(leitor);
|
|
432
|
+
const processos = (0, check_paralelo_1.rodarEmParalelo)(paraOAuxiliar, ambienteDoVerify(), medicaoCpu ? { medicaoCpu } : {});
|
|
433
|
+
if (processos.agendamentoCpu) {
|
|
434
|
+
const p = processos.agendamentoCpu;
|
|
435
|
+
executar.pecas = [{ peca: 'agendador-cpu', estado: p.saturado ? 'fallback' : 'agile',
|
|
436
|
+
motivo: p.saturado
|
|
437
|
+
? `${p.motivo}; hermetica com ${p.cpusHermetica}/${p.cpus} CPUs, varredura e integracao depois dela`
|
|
438
|
+
: `${p.cpusHermetica}/${p.cpus} CPUs na hermetica e ${p.cpusDaFatia} reservadas; conteineres com ${p.cpusPorContainer} CPU`,
|
|
439
|
+
...(p.saturado ? { fallback: 'ordem do Classic para hermetica, varredura e integracao' } : {}) }];
|
|
440
|
+
}
|
|
441
|
+
const stealPct = janela.fechar();
|
|
442
|
+
return processos.map((p, k) => {
|
|
443
|
+
const r = { ...resultadoDoProcesso(itens[k].nome, itens[k].comando, p, p.comGrupo, p.duracaoMs, prazos[k]), stealPct };
|
|
444
|
+
// S1 do CHECK: o auxiliar que morreu sem gravar o resultado deixa o comando sem veredito, nunca uma regressao.
|
|
445
|
+
if (p.semResultado)
|
|
446
|
+
r.executado = false;
|
|
447
|
+
if (!r.ok && r.causa !== 'timeout' && r.executado !== false && (0, steal_1.stealAlto)(stealPct)) {
|
|
448
|
+
const testes = (0, steal_1.reprovacaoSoDeRelogio)(r.falhasDeTeste, relogio);
|
|
449
|
+
if (testes)
|
|
450
|
+
r.relogioSobSteal = testes;
|
|
451
|
+
}
|
|
452
|
+
return r;
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
executar.pecas = [];
|
|
456
|
+
return executar;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* RM-072 (D8): le o relatorio das pecas da rodada, grava a lista inteira de cada lane em
|
|
460
|
+
* `.orkastery/threads/<id>/check/<commit>-lanes.json` e devolve o resumo do Agile para o `verify_run`.
|
|
461
|
+
*/
|
|
462
|
+
function agileNoLedger(raiz, threadId, commit, pecasDoVerify, doAgile, guarda, relatorio, claims) {
|
|
463
|
+
const linhas = relatorio.ler();
|
|
464
|
+
relatorio.fechar();
|
|
465
|
+
const doRelatorio = (0, check_agil_1.pecasDoRelatorio)(linhas);
|
|
466
|
+
const listas = (0, check_agil_1.listasDasLanes)(linhas);
|
|
467
|
+
const usos = claims.flatMap((c) => c.execucoes.map((e) => e.preparo).filter((u) => !!u));
|
|
468
|
+
const resumo = {
|
|
469
|
+
pecas: [...pecasDoVerify, ...doRelatorio],
|
|
470
|
+
grupo: { paralelo: doAgile?.paralelo ?? false, lanes: doAgile?.lanes ?? [] },
|
|
471
|
+
produto: guarda.hashCurto(),
|
|
472
|
+
claims: { reaproveitadas: usos.filter((u) => u.reaproveitado).length, inteiras: usos.filter((u) => !u.reaproveitado).length },
|
|
473
|
+
lanes: listas.map((l) => ({ lane: l.lane, arquivos: l.arquivos.length, sha256: l.sha256 })),
|
|
474
|
+
orcamento: linhas.filter((l) => l.tipo === 'duracoes').map(({ tipo: _tipo, ...resto }) => resto),
|
|
475
|
+
};
|
|
476
|
+
if (listas.length > 0) {
|
|
477
|
+
// S10 do CHECK: o caminho vai relativo a raiz do estado (`.orkastery/threads/...`), nao a worktree de onde rodou.
|
|
478
|
+
const arquivo = path.join((0, thread_1.dirThread)(raiz, threadId), 'check', `${commit.slice(0, 12)}-lanes.json`);
|
|
479
|
+
try {
|
|
480
|
+
fs.mkdirSync(path.dirname(arquivo), { recursive: true, mode: 0o700 });
|
|
481
|
+
fs.writeFileSync(arquivo, JSON.stringify({ commit, lanes: listas.map((l) => ({ lane: l.lane, arquivos: l.arquivos })) }, null, 1) + '\n', { mode: 0o600 });
|
|
482
|
+
resumo.evidencia = path.relative((0, estado_thread_1.raizDoEstado)(raiz), arquivo);
|
|
483
|
+
}
|
|
484
|
+
catch { /* sem o arquivo, o ledger ainda guarda a contagem e o sha256 de cada lane */ }
|
|
485
|
+
}
|
|
486
|
+
return resumo;
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* RM-037 (defeito 1 de 19 e 20/10/2026): so a falha com veredito vale como "ja falhava". Estouro do prazo, reprovacao
|
|
490
|
+
* so de teste com relogio sob steal, morte por sinal e comando que nem rodou dizem que a maquina decidiu, e nao o
|
|
491
|
+
* codigo; uma falha atual desse comando nao pode passar por divida anterior.
|
|
492
|
+
*/
|
|
493
|
+
function vereditoDaBaseline(c) {
|
|
494
|
+
if (c.ok)
|
|
495
|
+
return 'passava';
|
|
496
|
+
if (semVereditoPorTempo(c) || c.executado === false)
|
|
497
|
+
return 'sem-veredito';
|
|
498
|
+
return terminoNormal(c) ? 'ja-falhava' : 'sem-veredito';
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* 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
|
|
502
|
+
* 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
|
|
503
|
+
* estouro quando o tempo dele chegou), 125 e 126 sao o `timeout(1)` ou o shell que nao rodaram o comando, 127 o comando
|
|
504
|
+
* que nao existe, e de 128 em diante vem a morte por sinal (128 + sinal, do shell e do GNU `timeout`).
|
|
505
|
+
*/
|
|
506
|
+
const MAIOR_CODIGO_DO_COMANDO = 123;
|
|
507
|
+
/**
|
|
508
|
+
* O comando terminou sozinho e disse o codigo: `causa: exit` (ou nenhuma, na baseline de antes da I-37, em que o estouro
|
|
509
|
+
* saia como `code: -1`) com codigo de 1 a 123. Sinal, falta do codigo de saida e os codigos de quem nao deixou o
|
|
510
|
+
* comando terminar nao provam nada do codigo do HEAD. O `timeout(1)` do uutils devolve so o numero do sinal que ele
|
|
511
|
+
* trata (15 no SIGTERM), igual a uma saida do comando: esse fica de fora, como na `causaDoEncerramento`.
|
|
512
|
+
*/
|
|
513
|
+
function terminoNormal(c) {
|
|
514
|
+
return (c.causa === undefined || c.causa === 'exit') && Number.isInteger(c.code) && c.code >= 1
|
|
515
|
+
&& c.code <= MAIOR_CODIGO_DO_COMANDO;
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* RM-037 (CHECK 3 da ork-rm037defeit2): a baseline e o verify nunca rodam sobre a worktree cujo preparo a criacao adiou
|
|
519
|
+
* (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
|
|
520
|
+
* vez na fila pesada que a operacao ja segura, a conducao renovada pelo prazo dele e o executor da operacao quando ela
|
|
521
|
+
* traz um (o do sandbox do `ork_verify` do MCP, com o prazo dele). A falha recusa a operacao inteira antes do primeiro
|
|
522
|
+
* comando, porque sem as dependencias a baseline chamaria de "ja falhava" a falta de pacote, e o verify, de regressao.
|
|
523
|
+
*/
|
|
524
|
+
function exigirDependenciasDaWorktree(carregado, threadId, cwd, operacao, conducao, executor) {
|
|
525
|
+
const preparo = (0, thread_1.prepararDependenciasPendentes)(carregado, threadId, cwd, { antes: () => conducao.renovar(dependencias_da_worktree_1.PRAZO_DAS_DEPENDENCIAS_MS), executor });
|
|
526
|
+
if (!preparo || preparo.ok)
|
|
527
|
+
return;
|
|
528
|
+
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)));
|
|
529
|
+
}
|
|
530
|
+
/** `ork verify --baseline`: grava o estado do mundo ANTES do GO. Sem `executor`, o da rodada (`executorDaRodada`). */
|
|
531
|
+
function gravarBaseline(carregado, threadId, executor, conducao = {}, origem = 'cli', leitor = steal_1.lerProcStat, modo) {
|
|
266
532
|
const pedido = pedidoDoVerify(carregado, threadId, 'baseline', comandosDoManifesto(carregado.manifesto).length, conducao);
|
|
267
|
-
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => naFilaPesada(carregado, threadId, 'baseline', conducao, () => gravarBaselineSobConducao(carregado, threadId,
|
|
533
|
+
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => naFilaPesada(carregado, threadId, 'baseline', conducao, () => gravarBaselineSobConducao(carregado, threadId, executor, tomada, origem, leitor, modo)));
|
|
268
534
|
}
|
|
269
|
-
function gravarBaselineSobConducao(carregado, threadId,
|
|
535
|
+
function gravarBaselineSobConducao(carregado, threadId, base, tomada, origem, leitor, modo) {
|
|
270
536
|
const { raiz, manifesto } = carregado;
|
|
271
537
|
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
272
538
|
const cwd = cwdDaThread(raiz, thread);
|
|
273
|
-
|
|
274
|
-
|
|
539
|
+
exigirDependenciasDaWorktree(carregado, threadId, cwd, 'baseline', tomada, base);
|
|
540
|
+
// RM-072 (D1, D2): a baseline roda e grava no modo da rodada, como o verify.
|
|
541
|
+
const check = (0, check_modo_1.resolverModo)(manifesto.check?.mode, modo);
|
|
542
|
+
const relatorio = check.modo === 'agile' ? new check_agil_1.RelatorioDoCheck() : null;
|
|
543
|
+
const ambienteDaRodada = { ...ambienteDoModo(check), ...relatorio?.ambiente() };
|
|
544
|
+
const instabilidade = (0, instabilidade_1.lerRegistroDeInstabilidade)(cwd);
|
|
545
|
+
const executor = executorSobConducao(executorDaRodada(manifesto, instabilidade, base, leitor, ambienteDaRodada), manifesto, tomada);
|
|
546
|
+
// RM-072 (S-b do CHECK 2): fora do preparo, so a varredura e as lanes recebem o relatorio.
|
|
547
|
+
const executorDosComandos = relatorio
|
|
548
|
+
? soAVarreduraEAsLanesComRelatorio(executor, executorSobConducao(executorDaRodada(manifesto, instabilidade, base, leitor, ambienteDoModo(check)), manifesto, tomada))
|
|
549
|
+
: executor;
|
|
550
|
+
// RM-072 (D4): no Agile com o produto declarado, o preparo, a guarda e o mesmo grupo do verify; sem o produto, nada
|
|
551
|
+
// seria reaproveitado e os comandos rodam como no Classic.
|
|
552
|
+
// RM-072 (A6 do CHECK): as pecas do preparo, do grupo e do relatorio vao ao `baseline_recorded`, como no `verify_run`.
|
|
553
|
+
const pecasDaBaseline = [];
|
|
554
|
+
const comandos = relatorio && manifesto.check?.agile?.produto?.length
|
|
555
|
+
? (() => {
|
|
556
|
+
const p = (0, check_agil_1.prepararNoAgile)(manifesto, cwd, executor);
|
|
557
|
+
pecasDaBaseline.push(...p.pecas);
|
|
558
|
+
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);
|
|
559
|
+
pecasDaBaseline.push(...r.pecas);
|
|
560
|
+
return r.comandos;
|
|
561
|
+
})()
|
|
562
|
+
: comandosDoManifesto(manifesto).map((c) => executorDosComandos(c.nome, c.comando, cwd));
|
|
563
|
+
if (relatorio) {
|
|
564
|
+
if (base)
|
|
565
|
+
pecasDaBaseline.push(check_agil_1.PECA_SEM_RELATORIO);
|
|
566
|
+
pecasDaBaseline.push(...(0, check_agil_1.pecasDoRelatorio)(relatorio.ler()));
|
|
567
|
+
relatorio.fechar();
|
|
568
|
+
}
|
|
569
|
+
// N1 do CHECK 2: a lane que saiu com 127 tambem e dependencia ausente, como o comando so do Classic.
|
|
570
|
+
const naoEncontrado = comandos.find((c) => c.causa === 'nao-encontrado')
|
|
571
|
+
?? comandos.flatMap((c) => (c.lanes ?? []).filter((l) => l.causa === 'nao-encontrado')
|
|
572
|
+
.map((l) => ({ nome: `${c.nome}:${l.lane}`, code: l.code, comando: l.comando })))[0];
|
|
573
|
+
if (naoEncontrado) {
|
|
574
|
+
// Uma dependencia ausente nao e divida do codigo: o comando nem chegou a existir. Gravar isso
|
|
575
|
+
// como "ja falhava" faria todo verify futuro aceitar a falta da ferramenta como baseline.
|
|
576
|
+
throw new locale_1.ErroDoCatalogo((m) => m.verify.baselineDependenciaAusente(naoEncontrado.nome, naoEncontrado.code, (0, redacao_url_1.redigirCredenciaisUrl)(naoEncontrado.comando), manifesto.worktree.dependencias ?? null));
|
|
577
|
+
}
|
|
578
|
+
const baseline = { commit: commitReal(cwd), gravadaEm: (0, util_1.agora)(), comandos, check: { modo: check.modo, origem: check.origem } };
|
|
275
579
|
thread.baseline = baseline;
|
|
276
580
|
(0, thread_1.gravarThread)(raiz, thread);
|
|
277
581
|
(0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, ledger_1.TIPOS_DE_EVENTO.baselineGravada, {
|
|
278
582
|
commit: baseline.commit,
|
|
279
583
|
cwd,
|
|
280
|
-
comandos: comandos.map((c) => ({ nome: c.nome, comando: c.comando, ok: c.ok, code: c.code
|
|
584
|
+
comandos: comandos.map((c) => ({ nome: c.nome, comando: c.comando, ok: c.ok, code: c.code, prazoMs: c.prazoMs ?? null,
|
|
585
|
+
...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}), ...(c.ok ? {} : { causa: c.causa ?? null }) })),
|
|
586
|
+
check: checkNoLedger(check),
|
|
587
|
+
...(pecasDaBaseline.length ? { agile: { pecas: pecasDaBaseline } } : {}),
|
|
588
|
+
// RM-037 (defeito 1 de 19 e 20/10/2026): o que a baseline nao provou fica dito no proprio evento.
|
|
589
|
+
semVeredito: comandos.filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome),
|
|
281
590
|
fonte: 'execucao real no HEAD, nao relatorio de fase',
|
|
282
591
|
origem,
|
|
283
592
|
});
|
|
@@ -344,10 +653,14 @@ function verificar(carregado, threadId, opcoes = {}) {
|
|
|
344
653
|
}
|
|
345
654
|
function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, filaPesada) {
|
|
346
655
|
const { raiz, manifesto } = carregado;
|
|
656
|
+
const inicioDaRodada = Date.now();
|
|
347
657
|
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
348
658
|
const cwd = cwdDaThread(raiz, thread);
|
|
659
|
+
exigirDependenciasDaWorktree(carregado, threadId, cwd, 'verify', conducao, opcoes.executor);
|
|
349
660
|
const commit = commitReal(cwd);
|
|
350
661
|
const dir = (0, thread_1.dirThread)(raiz, threadId);
|
|
662
|
+
// RM-072 (D1): o modo da rodada; a opcao vence o manifesto, que vence o padrao.
|
|
663
|
+
const check = (0, check_modo_1.resolverModo)(manifesto.check?.mode, opcoes.check);
|
|
351
664
|
// I-43 (D4, viga b): os criterios de pronto da thread viram claims do nucleo ANTES
|
|
352
665
|
// da reexecucao, para entrarem no MESMO veredito das demais alegacoes. Idempotente:
|
|
353
666
|
// `ork verify` roda em toda fase, e uma claim por criterio por rodada viraria
|
|
@@ -357,21 +670,61 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
357
670
|
const instabilidade = (0, instabilidade_1.lerRegistroDeInstabilidade)(cwd, opcoes.agoraMs);
|
|
358
671
|
const leitor = opcoes.lerProcStat ?? steal_1.lerProcStat;
|
|
359
672
|
const janelaDaRodada = (0, steal_1.abrirJanela)(leitor);
|
|
673
|
+
// RM-072 (D8): no Agile, as pecas contam o que rodaram num relatorio da rodada, lido no fim.
|
|
674
|
+
const agil = check.modo === 'agile';
|
|
675
|
+
const relatorio = agil ? new check_agil_1.RelatorioDoCheck() : null;
|
|
676
|
+
const ambienteDaRodada = { ...ambienteDoModo(check), ...relatorio?.ambiente() };
|
|
360
677
|
// I-37 (D2, D3): o prazo de cada comando sai do manifesto carregado no inicio da rodada;
|
|
361
678
|
// editar o manifesto no meio dela nao muda o teto de quem ainda vai rodar.
|
|
362
|
-
const executor = executorSobConducao(
|
|
363
|
-
|
|
679
|
+
const executor = executorSobConducao(executorDaRodada(manifesto, instabilidade, opcoes.executor, leitor, ambienteDaRodada), manifesto, conducao);
|
|
680
|
+
// RM-072 (A3 do CHECK): as claims recebem o modo, nunca o relatorio da rodada; o teste que roda a varredura dentro de uma
|
|
681
|
+
// claim gravaria pecas de fixture no relatorio do verify. O relatorio fica com o preparo e o grupo.
|
|
682
|
+
const executorDasClaims = relatorio
|
|
683
|
+
? executorSobConducao(executorDaRodada(manifesto, instabilidade, opcoes.executor, leitor, ambienteDoModo(check)), manifesto, conducao)
|
|
684
|
+
: executor;
|
|
685
|
+
// RM-072 (S-b do CHECK 2): fora do preparo, so a varredura e as lanes recebem o relatorio.
|
|
686
|
+
const executorDosComandos = relatorio ? soAVarreduraEAsLanesComRelatorio(executor, executorDasClaims) : executor;
|
|
364
687
|
// I-54 (D10): o preparo roda UMA vez, antes das claims. Ele nunca e condicao para uma claim
|
|
365
688
|
// passar (cada uma roda o proprio comando inteiro); ele so deixa pronta a compilacao. A
|
|
366
689
|
// identidade do produto e tomada logo depois dele e conferida no fim da rodada.
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
690
|
+
// RM-072 (D4): no Agile, o preparo do Agile primeiro, com o `verify.preparo` de fallback.
|
|
691
|
+
const pecas = [];
|
|
692
|
+
const preparo = agil
|
|
693
|
+
? (() => {
|
|
694
|
+
const p = (0, check_agil_1.prepararNoAgile)(manifesto, cwd, executor);
|
|
695
|
+
pecas.push(...p.pecas);
|
|
696
|
+
return p.resultado ? { resultado: p.resultado, identidade: identidadeDoProduto(cwd) } : null;
|
|
697
|
+
})()
|
|
698
|
+
: manifesto.verify.preparo ? (() => {
|
|
699
|
+
const resultado = executor('preparo', manifesto.verify.preparo, cwd);
|
|
700
|
+
return { resultado, identidade: identidadeDoProduto(cwd) };
|
|
701
|
+
})() : null;
|
|
702
|
+
// RM-072 (A6 do CHECK): com executor injetado (MCP, testes), o ambiente da rodada nao chega aos comandos; o ledger diz.
|
|
703
|
+
if (agil && opcoes.executor)
|
|
704
|
+
pecas.push(check_agil_1.PECA_SEM_RELATORIO);
|
|
705
|
+
// RM-072 (D5): a guarda do produto, tomada no fim do preparo.
|
|
706
|
+
const vigente = agil
|
|
707
|
+
? { guarda: guardaDoPreparo(manifesto, cwd, preparo?.resultado ?? null), preparo: preparo?.resultado ?? null }
|
|
708
|
+
: null;
|
|
709
|
+
// 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
|
|
710
|
+
// a arvore; o preparo roda de novo antes da claim seguinte que o reaproveitaria, ate MAXIMO_DE_PREPAROS_REFEITOS vezes,
|
|
711
|
+
// e uma vez antes do grupo, e a peca diz o que aconteceu.
|
|
712
|
+
const refazer = (quando) => {
|
|
713
|
+
pecas.push(...(0, check_agil_1.refazerPreparo)(manifesto, cwd, executor, vigente, (p) => guardaDoPreparo(manifesto, cwd, p), quando));
|
|
714
|
+
};
|
|
715
|
+
let preparosRefeitos = 0;
|
|
716
|
+
const refazerAntesDaClaim = (nome) => {
|
|
717
|
+
if (!vigente || preparosRefeitos >= check_agil_1.MAXIMO_DE_PREPAROS_REFEITOS)
|
|
718
|
+
return false;
|
|
719
|
+
preparosRefeitos++;
|
|
720
|
+
refazer(`antes da claim ${nome}`);
|
|
721
|
+
return true;
|
|
722
|
+
};
|
|
371
723
|
// Claim retirada sai do gate: o historico guarda a alegacao e o motivo da retirada.
|
|
724
|
+
const executorDaClaim = vigente ? (0, check_agil_1.executorDaClaimNoAgile)(manifesto, executorDasClaims, vigente, refazerAntesDaClaim) : executorDasClaims;
|
|
372
725
|
const claims = (0, claims_1.lerClaims)(raiz, threadId)
|
|
373
726
|
.filter((c) => c.estado !== 'retirada')
|
|
374
|
-
.map((c) => verificarClaim(c, cwd,
|
|
727
|
+
.map((c) => verificarClaim(c, cwd, executorDaClaim));
|
|
375
728
|
for (const r of claims) {
|
|
376
729
|
// Estouro de prazo e comando que nao rodou nao julgam a alegacao: o estado anterior vale.
|
|
377
730
|
if (r.motivo === 'verify.timeout' || r.motivo === 'verify.sem-veredito')
|
|
@@ -384,14 +737,30 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
384
737
|
if (r.claim.estado !== estado)
|
|
385
738
|
(0, claims_1.carimbarEstado)(raiz, r.claim, estado);
|
|
386
739
|
}
|
|
740
|
+
// RM-072 (A1 do CHECK): o produto que mudou durante as claims tem o preparo refeito antes do grupo, que segue em paralelo.
|
|
741
|
+
// S-h do CHECK 3: o grupo tem a vaga dele, fora do teto das claims.
|
|
742
|
+
if (vigente && !opcoes.soClaims && vigente.guarda.conferir() === 'produto-mudou')
|
|
743
|
+
refazer('antes do grupo');
|
|
744
|
+
// RM-072 (D4, D6): no Agile, build do preparo e o resto no grupo paralelo, com a guarda valendo.
|
|
745
|
+
let doAgile = null;
|
|
387
746
|
const comandos = opcoes.soClaims
|
|
388
747
|
? []
|
|
389
|
-
:
|
|
748
|
+
: vigente
|
|
749
|
+
? (doAgile = (0, check_agil_1.comandosNoAgile)(manifesto, cwd, comandosDoManifesto(manifesto), executorDosComandos, executorDoGrupo(manifesto, ambienteDaRodada, instabilidade, leitor, conducao, opcoes.executor ? executor : undefined, opcoes.medicaoCpuAgendador), vigente.guarda, vigente.preparo)).comandos
|
|
750
|
+
: comandosDoManifesto(manifesto).map((c) => executor(c.nome, c.comando, cwd));
|
|
751
|
+
if (doAgile)
|
|
752
|
+
pecas.push(...doAgile.pecas);
|
|
753
|
+
const resumoDoAgile = vigente ? agileNoLedger(raiz, threadId, commit, pecas, doAgile, vigente.guarda, relatorio, claims) : null;
|
|
754
|
+
// RM-062 (F2): a barreira de dado privado no diff da thread, so com a policy `dado_privado` no manifesto.
|
|
755
|
+
const dadoPrivado = (0, dado_privado_1.barreiraDaThread)(carregado, thread, cwd, 'verify');
|
|
756
|
+
const dadoPrivadoBloqueia = (0, policies_1.bloqueantes)(dadoPrivado?.violacoes ?? []);
|
|
390
757
|
const baseline = thread.baseline ?? null;
|
|
391
758
|
const regressoes = [];
|
|
392
759
|
const preExistentes = [];
|
|
393
760
|
const falhasSemBaseline = [];
|
|
394
761
|
const estouros = [];
|
|
762
|
+
// RM-037 (defeito 1 de 19 e 20/10/2026): o comando sem veredito na baseline nao separa regressao de divida.
|
|
763
|
+
const baselineSemVeredito = (baseline?.comandos ?? []).filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome);
|
|
395
764
|
for (const atual of comandos) {
|
|
396
765
|
if (atual.ok)
|
|
397
766
|
continue;
|
|
@@ -400,7 +769,7 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
400
769
|
continue;
|
|
401
770
|
}
|
|
402
771
|
const antes = baseline?.comandos.find((c) => c.nome === atual.nome);
|
|
403
|
-
if (!antes)
|
|
772
|
+
if (!antes || vereditoDaBaseline(antes) === 'sem-veredito')
|
|
404
773
|
falhasSemBaseline.push(atual);
|
|
405
774
|
else if (antes.ok)
|
|
406
775
|
regressoes.push(atual);
|
|
@@ -435,8 +804,11 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
435
804
|
if (produtoAlterado || naoExecutados.length > 0 || claims.some((c) => c.motivo === 'verify.sem-veredito')) {
|
|
436
805
|
motivos.push('verify.sem-veredito');
|
|
437
806
|
}
|
|
807
|
+
if (dadoPrivadoBloqueia.length > 0)
|
|
808
|
+
motivos.push('policy.violation');
|
|
438
809
|
const bloqueantes = motivos.filter((m) => m !== 'claims.unverifiable');
|
|
439
810
|
const ok = bloqueantes.length === 0;
|
|
811
|
+
const duracaoMs = Date.now() - inicioDaRodada;
|
|
440
812
|
(0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.verificacao, {
|
|
441
813
|
commit,
|
|
442
814
|
cwd,
|
|
@@ -447,6 +819,10 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
447
819
|
verificado: c.verificado,
|
|
448
820
|
motivo: c.motivo,
|
|
449
821
|
detalhe: c.detalhe,
|
|
822
|
+
// RM-072 (D2): a soma da parede dos comandos da claim.
|
|
823
|
+
duracaoMs: c.execucoes.reduce((t, e) => t + (e.duracaoMs ?? 0), 0),
|
|
824
|
+
// RM-072 (D5): no Agile, o que a guarda fez com cada comando da claim.
|
|
825
|
+
...(c.execucoes.some((e) => e.preparo) ? { preparo: c.execucoes.map((e) => e.preparo ?? null) } : {}),
|
|
450
826
|
...(falhou ? { execucao: comandoNoLedger(falhou) } : {}),
|
|
451
827
|
};
|
|
452
828
|
}),
|
|
@@ -455,6 +831,7 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
455
831
|
regressoes: regressoes.map((r) => r.nome),
|
|
456
832
|
preExistentes: preExistentes.map((r) => r.nome),
|
|
457
833
|
falhasSemBaseline: falhasSemBaseline.map((r) => r.nome),
|
|
834
|
+
...(baselineSemVeredito.length > 0 ? { baselineSemVeredito } : {}),
|
|
458
835
|
estouros: estouros.map((r) => r.nome),
|
|
459
836
|
prazoMs: manifesto.verify.timeout_ms ?? exports.TIMEOUT_VERIFY_MS,
|
|
460
837
|
steal,
|
|
@@ -465,12 +842,24 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
465
842
|
identidade: preparo.identidade.slice(0, 16), identidadeFinal: identidadeFinal.slice(0, 16), produtoAlterado } } : {}),
|
|
466
843
|
motivos,
|
|
467
844
|
veredito: ok ? 'verdade sustentada' : 'reprovado',
|
|
845
|
+
// RM-072 (D1, D2): o modo do CHECK e de onde ele veio, e a parede da rodada inteira.
|
|
846
|
+
check: checkNoLedger(check),
|
|
847
|
+
duracaoMs,
|
|
848
|
+
// RM-072 (D8): no Agile, as pecas, o grupo, o reaproveitamento e as listas das lanes.
|
|
849
|
+
...(resumoDoAgile ? { agile: resumoDoAgile } : {}),
|
|
468
850
|
// I-36: por qual canal a verificacao chegou; a reentrada da sessao que conduz aparece aqui.
|
|
469
851
|
canal,
|
|
470
852
|
conducao: { identidade: conducao.identidade, reentrada: conducao.reentrada },
|
|
471
853
|
// RM-058 N2: se a rodada esperou a vez na fila pesada, e quanto.
|
|
472
854
|
filaPesada,
|
|
855
|
+
// RM-062 (F2): contagens, padroes e onde; nunca o valor casado nem o termo da lista local.
|
|
856
|
+
...(dadoPrivado ? { dadoPrivado: (0, dado_privado_1.resumoNoLedger)(dadoPrivado) } : {}),
|
|
473
857
|
});
|
|
858
|
+
// RM-062 (F2): em `warn`, a barreira registra e segue, como toda policy de aviso.
|
|
859
|
+
for (const v of (0, policies_1.avisos)(dadoPrivado?.violacoes ?? [])) {
|
|
860
|
+
(0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.politicaAviso, { gate: 'verify', policy: v.policy, motivo: v.motivo,
|
|
861
|
+
detalhe: v.detalhe, correcao: v.correcao, modo: thread.modo });
|
|
862
|
+
}
|
|
474
863
|
for (const motivo of bloqueantes) {
|
|
475
864
|
(0, gates_1.registrarGateBloqueado)(dir, threadId, {
|
|
476
865
|
gate: 'verify',
|
|
@@ -485,15 +874,22 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
485
874
|
? `regressao em: ${regressoes.map((r) => r.nome).join(', ')}`
|
|
486
875
|
: motivo === 'verify.timeout'
|
|
487
876
|
? `sem veredito por tempo (prazo estourado, ou teste com relogio sob steal acima de ${steal_1.LIMIAR_STEAL_PCT}%): ${[
|
|
488
|
-
...estouros.map((r) => r.nome),
|
|
877
|
+
...estouros.map((r) => (0, check_agil_1.porQueDasLanes)(r) ? `${r.nome} (${(0, check_agil_1.porQueDasLanes)(r)})` : r.nome),
|
|
489
878
|
...claims.filter((c) => c.motivo === 'verify.timeout').map((c) => c.claim.id)
|
|
490
879
|
].join(', ')}`
|
|
491
880
|
: motivo === 'verify.sem-veredito'
|
|
492
881
|
? [produtoAlterado ? 'o produto mudou entre o preparo e o fim da rodada' : '',
|
|
493
|
-
|
|
882
|
+
// RM-074 (F4): no Agile, o `test` diz qual lane ficou sem veredito e por que.
|
|
883
|
+
...naoExecutados.map((c) => (0, check_agil_1.porQueDasLanes)(c) ? `${c.nome} sem veredito (${(0, check_agil_1.porQueDasLanes)(c)})` : `${c.nome} nao foi executado`),
|
|
494
884
|
...claims.filter((c) => c.motivo === 'verify.sem-veredito').map((c) => `${c.claim.id}: ${c.detalhe}`)]
|
|
495
885
|
.filter(Boolean).join('; ')
|
|
496
|
-
:
|
|
886
|
+
: motivo === 'policy.violation'
|
|
887
|
+
? dadoPrivadoBloqueia.map((v) => `policy ${v.policy}: ${v.detalhe}`).join('; ')
|
|
888
|
+
: `falha sem baseline em: ${falhasSemBaseline.map((r) => r.nome).join(', ')}` + (falhasSemBaseline
|
|
889
|
+
.some((r) => baselineSemVeredito.includes(r.nome))
|
|
890
|
+
? `; a baseline nao teve veredito de ${falhasSemBaseline.filter((r) => baselineSemVeredito.includes(r.nome))
|
|
891
|
+
.map((r) => r.nome).join(', ')} (estouro do prazo, sinal, relogio sob steal, comando que nao rodou ou sem ` +
|
|
892
|
+
'codigo de saida do proprio comando)' : ''),
|
|
497
893
|
evidencia: `reexecucao no HEAD ${commit} em ${cwd}`,
|
|
498
894
|
correcao: motivo === 'claims.failed'
|
|
499
895
|
? 'corrija o artefato ou a alegacao e rode `ork verify` de novo'
|
|
@@ -501,9 +897,13 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
501
897
|
? 'rode `ork verify` de novo; se estourar sempre, suba verify.timeout_ms no manifesto ou divida o comando'
|
|
502
898
|
: motivo === 'verify.sem-veredito'
|
|
503
899
|
? 'rode `ork verify` de novo, sem editar a worktree durante a rodada'
|
|
504
|
-
:
|
|
900
|
+
: motivo === 'policy.violation'
|
|
901
|
+
? dadoPrivadoBloqueia.map((v) => v.correcao).join('; ')
|
|
902
|
+
: 'corrija a regressao, ou grave a baseline antes do GO com `ork verify <thread> --baseline`',
|
|
505
903
|
});
|
|
506
904
|
}
|
|
905
|
+
// RM-072 (D17): o ultimo modo do CHECK fica na thread, para o status mostrar.
|
|
906
|
+
registrarModoNaThread(raiz, threadId, check, commit);
|
|
507
907
|
return {
|
|
508
908
|
thread: threadId,
|
|
509
909
|
commit,
|
|
@@ -519,10 +919,23 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
519
919
|
steal,
|
|
520
920
|
instabilidade,
|
|
521
921
|
filaPesada,
|
|
922
|
+
dadoPrivado,
|
|
923
|
+
check,
|
|
924
|
+
duracaoMs,
|
|
925
|
+
agile: resumoDoAgile,
|
|
522
926
|
motivos,
|
|
523
927
|
ok,
|
|
524
928
|
};
|
|
525
929
|
}
|
|
930
|
+
/**
|
|
931
|
+
* RM-072 (D17): grava o modo do ultimo `verify_run` no `thread.json`. A thread e relida na hora, para nao devolver ao
|
|
932
|
+
* disco uma copia lida no comeco da rodada; o status mostra a linha so quando o campo existe.
|
|
933
|
+
*/
|
|
934
|
+
function registrarModoNaThread(raiz, threadId, check, commit) {
|
|
935
|
+
const atual = (0, thread_1.lerThread)(raiz, threadId);
|
|
936
|
+
atual.check = { modo: check.modo, origem: check.origem, commit, em: (0, util_1.agora)() };
|
|
937
|
+
(0, thread_1.gravarThread)(raiz, atual);
|
|
938
|
+
}
|
|
526
939
|
/** `FALHOU (codigo 1)`, ou `ESTOUROU O PRAZO (600 s, rodou 612 s)`: a causa e dita pelo nome. */
|
|
527
940
|
function situacaoDoComando(c) {
|
|
528
941
|
const m = (0, locale_1.msg)().verify;
|
|
@@ -537,6 +950,21 @@ function situacaoDoComando(c) {
|
|
|
537
950
|
return m.mortoPorSinal(c.code);
|
|
538
951
|
return m.falhou(c.code);
|
|
539
952
|
}
|
|
953
|
+
/**
|
|
954
|
+
* 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
|
|
955
|
+
* linha que diz o que a baseline nao provou e como regravar.
|
|
956
|
+
*/
|
|
957
|
+
function linhasDaBaseline(b, id) {
|
|
958
|
+
const m = (0, locale_1.msg)().verify;
|
|
959
|
+
const linhas = b.comandos.map((c) => m.baselineComando(c.nome, vereditoDaBaseline(c), c.code, c.comando, situacaoDoComando(c)));
|
|
960
|
+
// RM-072 (D1): o modo que gravou a baseline (a baseline anterior a RM-072 nao tem o campo).
|
|
961
|
+
if (b.check)
|
|
962
|
+
linhas.unshift(m.baselineCheck(check_modo_1.NOME_DO_MODO[b.check.modo], b.check.modo, b.check.origem));
|
|
963
|
+
const semVeredito = b.comandos.filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome);
|
|
964
|
+
if (semVeredito.length > 0)
|
|
965
|
+
linhas.push(m.baselineSemVeredito(semVeredito.join(', '), id));
|
|
966
|
+
return linhas;
|
|
967
|
+
}
|
|
540
968
|
/** Texto de `ork verify`. O detalhe da claim veio do catalogo em pt-BR e sai remontado no locale ativo. */
|
|
541
969
|
function textoDoVerify(r) {
|
|
542
970
|
const m = (0, locale_1.msg)().verify;
|
|
@@ -544,6 +972,14 @@ function textoDoVerify(r) {
|
|
|
544
972
|
linhas.push(m.titulo(r.thread));
|
|
545
973
|
linhas.push(m.head(r.commit));
|
|
546
974
|
linhas.push(m.diretorio(r.cwd));
|
|
975
|
+
linhas.push(m.check(r.check.nome, r.check.modo, r.check.origem));
|
|
976
|
+
// RM-072 (D8): no Agile, o reaproveitamento, o grupo e as pecas em fallback, quando ha o que dizer.
|
|
977
|
+
const a = r.agile;
|
|
978
|
+
if (a && (a.claims.reaproveitadas + a.claims.inteiras > 0 || a.grupo.paralelo)) {
|
|
979
|
+
linhas.push(m.agile(a.claims.reaproveitadas, a.claims.inteiras, a.grupo.paralelo, a.grupo.lanes));
|
|
980
|
+
}
|
|
981
|
+
for (const p of a?.pecas.filter((x) => x.estado === 'fallback') ?? [])
|
|
982
|
+
linhas.push(m.agileFallback(p.peca, p.motivo ?? '', p.fallback ?? ''));
|
|
547
983
|
linhas.push(r.baseline ? m.baseline((0, util_1.shaCurto)(r.baseline.commit), (0, horario_1.formatarDataHoraRotulada)(r.baseline.gravadaEm)) : m.semBaseline);
|
|
548
984
|
if (r.preparo) {
|
|
549
985
|
const p = r.preparo;
|
|
@@ -588,10 +1024,33 @@ function textoDoVerify(r) {
|
|
|
588
1024
|
linhas.push(m.regressao(c.nome, c.comando));
|
|
589
1025
|
for (const c of r.preExistentes)
|
|
590
1026
|
linhas.push(m.preExistente(c.nome, c.comando));
|
|
591
|
-
|
|
592
|
-
|
|
1027
|
+
// RM-037 (defeito 1 de 19 e 20/10/2026): a baseline existe, mas nao teve veredito deste comando.
|
|
1028
|
+
const semVeredito = new Set((r.baseline?.comandos ?? []).filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome));
|
|
1029
|
+
for (const c of r.falhasSemBaseline) {
|
|
1030
|
+
linhas.push(semVeredito.has(c.nome) ? m.falhaComBaselineSemVeredito(c.nome, c.comando) : m.falhaSemBaseline(c.nome, c.comando));
|
|
1031
|
+
}
|
|
593
1032
|
}
|
|
1033
|
+
if (r.dadoPrivado)
|
|
1034
|
+
linhas.push('', ...textoDaBarreira(r.dadoPrivado));
|
|
594
1035
|
linhas.push('');
|
|
595
1036
|
linhas.push(r.ok ? m.verdade : m.reprovado(r.motivos.join(', ')));
|
|
596
1037
|
return linhas.join('\n');
|
|
597
1038
|
}
|
|
1039
|
+
/** RM-062 (F2): a secao da barreira de dado privado, sem valor casado nem termo; ate 20 achados. */
|
|
1040
|
+
function textoDaBarreira(b) {
|
|
1041
|
+
const m = (0, locale_1.msg)().verify;
|
|
1042
|
+
const v = b.varredura;
|
|
1043
|
+
const escopo = v.escopo.map((e) => e.tipo === 'diff' ? m.dadoPrivadoEscopoDiff(e.base.slice(0, 12), e.ref)
|
|
1044
|
+
: e.tipo === 'arvore' ? m.dadoPrivadoEscopoArvore : m.dadoPrivadoEscopoTexto(e.nome)).join(' + ');
|
|
1045
|
+
const linhas = [m.dadoPrivadoTitulo(b.severidade), m.dadoPrivadoEscopo(escopo, v.arquivos, v.linhas, v.nomes),
|
|
1046
|
+
v.listaLocal.presente ? m.dadoPrivadoListaPresente(v.listaLocal.termos, v.listaLocal.lidos.join(', '))
|
|
1047
|
+
: m.dadoPrivadoListaAusente(v.listaLocal.procurada.join(', '))];
|
|
1048
|
+
if (v.erro)
|
|
1049
|
+
return [...linhas, m.dadoPrivadoErro(v.erro)];
|
|
1050
|
+
linhas.push(m.dadoPrivadoAchados(v.achados.length));
|
|
1051
|
+
for (const a of v.achados.slice(0, 20))
|
|
1052
|
+
linhas.push(m.dadoPrivadoAchado(a.arquivo, a.linha, a.coluna, a.padrao, a.termo));
|
|
1053
|
+
if (v.achados.length > 20)
|
|
1054
|
+
linhas.push(m.dadoPrivadoMais(v.achados.length - 20));
|
|
1055
|
+
return linhas;
|
|
1056
|
+
}
|