@orkastery/cli 0.5.6 → 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 +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 +118 -4
- 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/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 +16 -8
- 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 +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -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 +84 -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 +81 -74
- package/dist/doctor-forja.js +345 -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 +143 -43
- 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 +13 -10
- 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 +16 -0
- package/dist/hosts.js +104 -134
- package/dist/index.js +848 -548
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +2 -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 +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +76 -4
- 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 +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 +145 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +169 -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 +287 -11
- 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 +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +82 -14
- 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/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +85 -49
- package/dist/noctum-aceite.js +789 -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 +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +252 -16
- package/dist/noctum-execucao.js +95 -23
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +43 -9
- 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 +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 +146 -124
- package/dist/phase.js +53 -27
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +4 -3
- 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 +12 -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 +228 -73
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +117 -43
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- 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 +19 -2
- package/dist/session-watcher-claude.js +74 -19
- package/dist/session-watcher.js +156 -10
- package/dist/sessoes-contas.js +9 -0
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- 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 +507 -0
- package/dist/verify.js +472 -29
- 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 +9 -4
- 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,11 @@ 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");
|
|
49
100
|
/** Teto de tempo de um comando de verificacao (build e suite completa cabem). */
|
|
50
101
|
exports.TIMEOUT_VERIFY_MS = 10 * 60 * 1000;
|
|
51
102
|
/** Ultimas linhas da saida real, o suficiente para servir de evidencia no ledger. */
|
|
@@ -66,14 +117,60 @@ const TIMEOUT_BIN = '/usr/bin/timeout';
|
|
|
66
117
|
* valvula de escape: comando que precise delas vira escalacao para humano.
|
|
67
118
|
*/
|
|
68
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]);
|
|
69
125
|
function ambienteDoVerify(base = process.env) {
|
|
70
|
-
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)));
|
|
71
128
|
}
|
|
72
129
|
/** I-37 (D2): o prazo de um comando, resolvido uma vez por rodada (D3). */
|
|
73
130
|
function prazoDoComando(manifesto, nome) {
|
|
74
131
|
const porComando = manifesto.verify.timeout_ms_por_comando;
|
|
75
132
|
return porComando?.[nome] ?? manifesto.verify.timeout_ms ?? exports.TIMEOUT_VERIFY_MS;
|
|
76
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
|
+
}
|
|
77
174
|
/**
|
|
78
175
|
* Executa um comando de verificacao pelo shell, no diretorio de trabalho da thread.
|
|
79
176
|
*
|
|
@@ -83,14 +180,20 @@ function prazoDoComando(manifesto, nome) {
|
|
|
83
180
|
* o proprio `ork` morrer no meio, o `timeout` segue de pe e encerra o grupo no prazo.
|
|
84
181
|
* O estouro continua saindo como `code: -1`, o contrato de antes.
|
|
85
182
|
*/
|
|
86
|
-
function executar(nome, comando, cwd, tetoMs = exports.TIMEOUT_VERIFY_MS) {
|
|
183
|
+
function executar(nome, comando, cwd, tetoMs = exports.TIMEOUT_VERIFY_MS, ambienteExtra) {
|
|
87
184
|
const comGrupo = (0, node_fs_1.existsSync)(TIMEOUT_BIN);
|
|
88
185
|
const inicio = Date.now();
|
|
89
|
-
const ambiente = ambienteDoVerify();
|
|
186
|
+
const ambiente = { ...ambienteDoVerify(), ...ambienteExtra };
|
|
90
187
|
const r = comGrupo
|
|
91
188
|
? (0, util_1.exec)(TIMEOUT_BIN, ['--kill-after=15', `${Math.ceil(tetoMs / 1000)}`, 'bash', '-c', comando], cwd, tetoMs + 30_000, ambiente)
|
|
92
189
|
: (0, util_1.exec)('bash', ['-c', comando], cwd, tetoMs, ambiente);
|
|
93
|
-
|
|
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) {
|
|
94
197
|
const causa = causaDoEncerramento({ code: r.code, signal: r.signal ?? null, error: r.error, comGrupo, duracaoMs, tetoMs });
|
|
95
198
|
const estourou = causa === 'timeout';
|
|
96
199
|
const resultado = {
|
|
@@ -191,10 +294,15 @@ function causaDoEncerramento(r) {
|
|
|
191
294
|
}
|
|
192
295
|
/** I-37 (D8): o que o ledger grava de um comando. Sucesso e o codigo 0; falha leva a evidencia. */
|
|
193
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) } : {}) };
|
|
194
302
|
if (c.ok)
|
|
195
|
-
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 };
|
|
196
304
|
return {
|
|
197
|
-
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,
|
|
198
306
|
...(c.causa ? { causa: c.causa } : {}),
|
|
199
307
|
...(c.prazoMs !== undefined ? { prazoMs: c.prazoMs } : {}),
|
|
200
308
|
...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}),
|
|
@@ -207,7 +315,7 @@ function comandoNoLedger(c) {
|
|
|
207
315
|
/** Comandos declarados em `verify:` no manifesto, na ordem canonica. */
|
|
208
316
|
function comandosDoManifesto(manifesto) {
|
|
209
317
|
const lista = [];
|
|
210
|
-
for (const nome of ['typecheck', 'build', 'test']) {
|
|
318
|
+
for (const nome of ['typecheck', 'build', 'test', 'security_scan']) {
|
|
211
319
|
const comando = manifesto.verify[nome];
|
|
212
320
|
if (comando && comando.trim() !== '')
|
|
213
321
|
lista.push({ nome, comando });
|
|
@@ -257,27 +365,213 @@ function pedidoDoVerify(carregado, threadId, operacao, comandos, conducao) {
|
|
|
257
365
|
/** O executor que renova o prazo da conducao antes de cada comando (D3). */
|
|
258
366
|
function executorSobConducao(base, manifesto, conducao) {
|
|
259
367
|
return (nome, comando, cwd) => {
|
|
260
|
-
conducao.renovar(
|
|
368
|
+
conducao.renovar(prazoDaExecucao(manifesto, nome, comando));
|
|
261
369
|
return base(nome, comando, cwd);
|
|
262
370
|
};
|
|
263
371
|
}
|
|
264
|
-
/**
|
|
265
|
-
|
|
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) {
|
|
266
517
|
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,
|
|
518
|
+
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => naFilaPesada(carregado, threadId, 'baseline', conducao, () => gravarBaselineSobConducao(carregado, threadId, executor, tomada, origem, leitor, modo)));
|
|
268
519
|
}
|
|
269
|
-
function gravarBaselineSobConducao(carregado, threadId,
|
|
520
|
+
function gravarBaselineSobConducao(carregado, threadId, base, tomada, origem, leitor, modo) {
|
|
270
521
|
const { raiz, manifesto } = carregado;
|
|
271
522
|
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
272
523
|
const cwd = cwdDaThread(raiz, thread);
|
|
273
|
-
|
|
274
|
-
|
|
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 } };
|
|
275
564
|
thread.baseline = baseline;
|
|
276
565
|
(0, thread_1.gravarThread)(raiz, thread);
|
|
277
566
|
(0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, ledger_1.TIPOS_DE_EVENTO.baselineGravada, {
|
|
278
567
|
commit: baseline.commit,
|
|
279
568
|
cwd,
|
|
280
|
-
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),
|
|
281
575
|
fonte: 'execucao real no HEAD, nao relatorio de fase',
|
|
282
576
|
origem,
|
|
283
577
|
});
|
|
@@ -344,10 +638,14 @@ function verificar(carregado, threadId, opcoes = {}) {
|
|
|
344
638
|
}
|
|
345
639
|
function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, filaPesada) {
|
|
346
640
|
const { raiz, manifesto } = carregado;
|
|
641
|
+
const inicioDaRodada = Date.now();
|
|
347
642
|
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
348
643
|
const cwd = cwdDaThread(raiz, thread);
|
|
644
|
+
exigirDependenciasDaWorktree(carregado, threadId, cwd, 'verify', conducao, opcoes.executor);
|
|
349
645
|
const commit = commitReal(cwd);
|
|
350
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);
|
|
351
649
|
// I-43 (D4, viga b): os criterios de pronto da thread viram claims do nucleo ANTES
|
|
352
650
|
// da reexecucao, para entrarem no MESMO veredito das demais alegacoes. Idempotente:
|
|
353
651
|
// `ork verify` roda em toda fase, e uma claim por criterio por rodada viraria
|
|
@@ -357,21 +655,61 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
357
655
|
const instabilidade = (0, instabilidade_1.lerRegistroDeInstabilidade)(cwd, opcoes.agoraMs);
|
|
358
656
|
const leitor = opcoes.lerProcStat ?? steal_1.lerProcStat;
|
|
359
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() };
|
|
360
662
|
// I-37 (D2, D3): o prazo de cada comando sai do manifesto carregado no inicio da rodada;
|
|
361
663
|
// editar o manifesto no meio dela nao muda o teto de quem ainda vai rodar.
|
|
362
|
-
const executor = executorSobConducao(
|
|
363
|
-
|
|
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;
|
|
364
672
|
// I-54 (D10): o preparo roda UMA vez, antes das claims. Ele nunca e condicao para uma claim
|
|
365
673
|
// passar (cada uma roda o proprio comando inteiro); ele so deixa pronta a compilacao. A
|
|
366
674
|
// identidade do produto e tomada logo depois dele e conferida no fim da rodada.
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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
|
+
};
|
|
371
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;
|
|
372
710
|
const claims = (0, claims_1.lerClaims)(raiz, threadId)
|
|
373
711
|
.filter((c) => c.estado !== 'retirada')
|
|
374
|
-
.map((c) => verificarClaim(c, cwd,
|
|
712
|
+
.map((c) => verificarClaim(c, cwd, executorDaClaim));
|
|
375
713
|
for (const r of claims) {
|
|
376
714
|
// Estouro de prazo e comando que nao rodou nao julgam a alegacao: o estado anterior vale.
|
|
377
715
|
if (r.motivo === 'verify.timeout' || r.motivo === 'verify.sem-veredito')
|
|
@@ -384,14 +722,30 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
384
722
|
if (r.claim.estado !== estado)
|
|
385
723
|
(0, claims_1.carimbarEstado)(raiz, r.claim, estado);
|
|
386
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;
|
|
387
731
|
const comandos = opcoes.soClaims
|
|
388
732
|
? []
|
|
389
|
-
:
|
|
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 ?? []);
|
|
390
742
|
const baseline = thread.baseline ?? null;
|
|
391
743
|
const regressoes = [];
|
|
392
744
|
const preExistentes = [];
|
|
393
745
|
const falhasSemBaseline = [];
|
|
394
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);
|
|
395
749
|
for (const atual of comandos) {
|
|
396
750
|
if (atual.ok)
|
|
397
751
|
continue;
|
|
@@ -400,7 +754,7 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
400
754
|
continue;
|
|
401
755
|
}
|
|
402
756
|
const antes = baseline?.comandos.find((c) => c.nome === atual.nome);
|
|
403
|
-
if (!antes)
|
|
757
|
+
if (!antes || vereditoDaBaseline(antes) === 'sem-veredito')
|
|
404
758
|
falhasSemBaseline.push(atual);
|
|
405
759
|
else if (antes.ok)
|
|
406
760
|
regressoes.push(atual);
|
|
@@ -435,8 +789,11 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
435
789
|
if (produtoAlterado || naoExecutados.length > 0 || claims.some((c) => c.motivo === 'verify.sem-veredito')) {
|
|
436
790
|
motivos.push('verify.sem-veredito');
|
|
437
791
|
}
|
|
792
|
+
if (dadoPrivadoBloqueia.length > 0)
|
|
793
|
+
motivos.push('policy.violation');
|
|
438
794
|
const bloqueantes = motivos.filter((m) => m !== 'claims.unverifiable');
|
|
439
795
|
const ok = bloqueantes.length === 0;
|
|
796
|
+
const duracaoMs = Date.now() - inicioDaRodada;
|
|
440
797
|
(0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.verificacao, {
|
|
441
798
|
commit,
|
|
442
799
|
cwd,
|
|
@@ -447,6 +804,10 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
447
804
|
verificado: c.verificado,
|
|
448
805
|
motivo: c.motivo,
|
|
449
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) } : {}),
|
|
450
811
|
...(falhou ? { execucao: comandoNoLedger(falhou) } : {}),
|
|
451
812
|
};
|
|
452
813
|
}),
|
|
@@ -455,6 +816,7 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
455
816
|
regressoes: regressoes.map((r) => r.nome),
|
|
456
817
|
preExistentes: preExistentes.map((r) => r.nome),
|
|
457
818
|
falhasSemBaseline: falhasSemBaseline.map((r) => r.nome),
|
|
819
|
+
...(baselineSemVeredito.length > 0 ? { baselineSemVeredito } : {}),
|
|
458
820
|
estouros: estouros.map((r) => r.nome),
|
|
459
821
|
prazoMs: manifesto.verify.timeout_ms ?? exports.TIMEOUT_VERIFY_MS,
|
|
460
822
|
steal,
|
|
@@ -465,12 +827,24 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
465
827
|
identidade: preparo.identidade.slice(0, 16), identidadeFinal: identidadeFinal.slice(0, 16), produtoAlterado } } : {}),
|
|
466
828
|
motivos,
|
|
467
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 } : {}),
|
|
468
835
|
// I-36: por qual canal a verificacao chegou; a reentrada da sessao que conduz aparece aqui.
|
|
469
836
|
canal,
|
|
470
837
|
conducao: { identidade: conducao.identidade, reentrada: conducao.reentrada },
|
|
471
838
|
// RM-058 N2: se a rodada esperou a vez na fila pesada, e quanto.
|
|
472
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) } : {}),
|
|
473
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
|
+
}
|
|
474
848
|
for (const motivo of bloqueantes) {
|
|
475
849
|
(0, gates_1.registrarGateBloqueado)(dir, threadId, {
|
|
476
850
|
gate: 'verify',
|
|
@@ -493,7 +867,13 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
493
867
|
...naoExecutados.map((c) => `${c.nome} nao foi executado`),
|
|
494
868
|
...claims.filter((c) => c.motivo === 'verify.sem-veredito').map((c) => `${c.claim.id}: ${c.detalhe}`)]
|
|
495
869
|
.filter(Boolean).join('; ')
|
|
496
|
-
:
|
|
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)' : ''),
|
|
497
877
|
evidencia: `reexecucao no HEAD ${commit} em ${cwd}`,
|
|
498
878
|
correcao: motivo === 'claims.failed'
|
|
499
879
|
? 'corrija o artefato ou a alegacao e rode `ork verify` de novo'
|
|
@@ -501,9 +881,13 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
501
881
|
? 'rode `ork verify` de novo; se estourar sempre, suba verify.timeout_ms no manifesto ou divida o comando'
|
|
502
882
|
: motivo === 'verify.sem-veredito'
|
|
503
883
|
? 'rode `ork verify` de novo, sem editar a worktree durante a rodada'
|
|
504
|
-
:
|
|
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`',
|
|
505
887
|
});
|
|
506
888
|
}
|
|
889
|
+
// RM-072 (D17): o ultimo modo do CHECK fica na thread, para o status mostrar.
|
|
890
|
+
registrarModoNaThread(raiz, threadId, check, commit);
|
|
507
891
|
return {
|
|
508
892
|
thread: threadId,
|
|
509
893
|
commit,
|
|
@@ -519,10 +903,23 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
|
|
|
519
903
|
steal,
|
|
520
904
|
instabilidade,
|
|
521
905
|
filaPesada,
|
|
906
|
+
dadoPrivado,
|
|
907
|
+
check,
|
|
908
|
+
duracaoMs,
|
|
909
|
+
agile: resumoDoAgile,
|
|
522
910
|
motivos,
|
|
523
911
|
ok,
|
|
524
912
|
};
|
|
525
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
|
+
}
|
|
526
923
|
/** `FALHOU (codigo 1)`, ou `ESTOUROU O PRAZO (600 s, rodou 612 s)`: a causa e dita pelo nome. */
|
|
527
924
|
function situacaoDoComando(c) {
|
|
528
925
|
const m = (0, locale_1.msg)().verify;
|
|
@@ -537,6 +934,21 @@ function situacaoDoComando(c) {
|
|
|
537
934
|
return m.mortoPorSinal(c.code);
|
|
538
935
|
return m.falhou(c.code);
|
|
539
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;
|
|
951
|
+
}
|
|
540
952
|
/** Texto de `ork verify`. O detalhe da claim veio do catalogo em pt-BR e sai remontado no locale ativo. */
|
|
541
953
|
function textoDoVerify(r) {
|
|
542
954
|
const m = (0, locale_1.msg)().verify;
|
|
@@ -544,6 +956,14 @@ function textoDoVerify(r) {
|
|
|
544
956
|
linhas.push(m.titulo(r.thread));
|
|
545
957
|
linhas.push(m.head(r.commit));
|
|
546
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 ?? ''));
|
|
547
967
|
linhas.push(r.baseline ? m.baseline((0, util_1.shaCurto)(r.baseline.commit), (0, horario_1.formatarDataHoraRotulada)(r.baseline.gravadaEm)) : m.semBaseline);
|
|
548
968
|
if (r.preparo) {
|
|
549
969
|
const p = r.preparo;
|
|
@@ -588,10 +1008,33 @@ function textoDoVerify(r) {
|
|
|
588
1008
|
linhas.push(m.regressao(c.nome, c.comando));
|
|
589
1009
|
for (const c of r.preExistentes)
|
|
590
1010
|
linhas.push(m.preExistente(c.nome, c.comando));
|
|
591
|
-
|
|
592
|
-
|
|
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
|
+
}
|
|
593
1016
|
}
|
|
1017
|
+
if (r.dadoPrivado)
|
|
1018
|
+
linhas.push('', ...textoDaBarreira(r.dadoPrivado));
|
|
594
1019
|
linhas.push('');
|
|
595
1020
|
linhas.push(r.ok ? m.verdade : m.reprovado(r.motivos.join(', ')));
|
|
596
1021
|
return linhas.join('\n');
|
|
597
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
|
+
}
|