@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.
Files changed (396) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +37 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +123 -9
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/adapters/grok-events.js +227 -0
  105. package/dist/adapters/grok-mcp-servidor.js +612 -0
  106. package/dist/adapters/grok-mcp.js +178 -0
  107. package/dist/adapters/grok.js +686 -0
  108. package/dist/agendador-cpu.js +92 -0
  109. package/dist/atualizar-branch.js +245 -0
  110. package/dist/auditoria.js +13 -11
  111. package/dist/auditrun.js +51 -46
  112. package/dist/autorizacao-duravel.js +327 -0
  113. package/dist/board.js +94 -40
  114. package/dist/branch-de-estado.js +23 -10
  115. package/dist/busca-semantica.js +7 -5
  116. package/dist/catalogo.js +2 -1
  117. package/dist/changelog-reconciliacao.js +290 -0
  118. package/dist/check-agil.js +528 -0
  119. package/dist/check-modo.js +41 -0
  120. package/dist/check-paralelo.js +238 -0
  121. package/dist/ci.js +248 -45
  122. package/dist/ciclos.js +8 -6
  123. package/dist/claim-lint.js +12 -8
  124. package/dist/claims-conferir.js +47 -39
  125. package/dist/claims.js +10 -9
  126. package/dist/company-brain-client.js +10 -3
  127. package/dist/company-brain-migration.js +11 -5
  128. package/dist/conducao-batida.js +759 -0
  129. package/dist/conducao-sentinela.js +25 -8
  130. package/dist/conducao.js +89 -29
  131. package/dist/conhecimento-consulta.js +270 -0
  132. package/dist/conhecimento.js +111 -87
  133. package/dist/conta-esgotada.js +127 -0
  134. package/dist/dado-privado.js +816 -0
  135. package/dist/decisao-autonoma.js +5 -4
  136. package/dist/demo.js +14 -12
  137. package/dist/dependencias-da-worktree.js +25 -0
  138. package/dist/divida.js +38 -36
  139. package/dist/docs.js +89 -89
  140. package/dist/doctor-forja.js +343 -0
  141. package/dist/doctor-pulse-cron.js +113 -1
  142. package/dist/doctor.js +164 -6
  143. package/dist/dsn-da-memoria.js +417 -0
  144. package/dist/entrega-por-mod.js +503 -0
  145. package/dist/entrega-pr.js +154 -54
  146. package/dist/esgotamentos.js +13 -11
  147. package/dist/estado-thread.js +21 -18
  148. package/dist/evalrunner.js +35 -32
  149. package/dist/fabrica-batida.js +34 -21
  150. package/dist/fabrica-estado.js +33 -21
  151. package/dist/fix.js +21 -19
  152. package/dist/forja/adaptador.js +6 -0
  153. package/dist/forja/ambiente-de-ci.js +27 -0
  154. package/dist/forja/api.js +256 -0
  155. package/dist/forja/cache.js +89 -0
  156. package/dist/forja/cli.js +60 -0
  157. package/dist/forja/contrato.js +9 -0
  158. package/dist/forja/endereco.js +43 -0
  159. package/dist/forja/estado.js +22 -0
  160. package/dist/forja/executor.js +73 -0
  161. package/dist/forja/github/ci.js +95 -0
  162. package/dist/forja/github/dono-da-rede.js +18 -0
  163. package/dist/forja/github/metadados.js +15 -0
  164. package/dist/forja/github/pedidos.js +200 -0
  165. package/dist/forja/gitlab/ci.js +141 -0
  166. package/dist/forja/gitlab/consultas.js +59 -0
  167. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  168. package/dist/forja/gitlab/metadados.js +15 -0
  169. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  170. package/dist/forja/gitlab/pedidos.js +141 -0
  171. package/dist/forja/produtor.js +32 -0
  172. package/dist/forja/registro.js +31 -0
  173. package/dist/forja/resolver.js +121 -0
  174. package/dist/forja/texto.js +13 -0
  175. package/dist/forja/versao.js +71 -0
  176. package/dist/forja.js +123 -80
  177. package/dist/handoff.js +23 -13
  178. package/dist/hitl-contract.js +46 -43
  179. package/dist/hitl-curto.js +37 -25
  180. package/dist/hitl-gates.js +13 -11
  181. package/dist/hitl-local-receipt.js +51 -0
  182. package/dist/hitl-local.js +11 -2
  183. package/dist/hitl-lock.js +5 -11
  184. package/dist/hitl-public-receipt.js +11 -0
  185. package/dist/hitl-resumo.js +44 -1
  186. package/dist/hitl-sessions.js +62 -9
  187. package/dist/hitl-texto-livre.js +7 -4
  188. package/dist/hitl.js +34 -31
  189. package/dist/horario.js +20 -1
  190. package/dist/hosts.js +104 -134
  191. package/dist/index.js +864 -554
  192. package/dist/indice-vetorial.js +14 -12
  193. package/dist/init.js +11 -2
  194. package/dist/integracoes-locais.js +4 -0
  195. package/dist/intelligence-graph-cli.js +123 -69
  196. package/dist/intelligence-graph-query.js +37 -22
  197. package/dist/leases.js +19 -18
  198. package/dist/ledger-stats.js +17 -16
  199. package/dist/ledger.js +31 -1
  200. package/dist/licoes.js +12 -11
  201. package/dist/locale-accounts.js +228 -0
  202. package/dist/locale-adapter.js +291 -0
  203. package/dist/locale-ajuda.js +86 -10
  204. package/dist/locale-audit.js +199 -0
  205. package/dist/locale-claims.js +213 -0
  206. package/dist/locale-conducao.js +138 -0
  207. package/dist/locale-conhecimento.js +181 -0
  208. package/dist/locale-decisao.js +205 -0
  209. package/dist/locale-docs.js +230 -0
  210. package/dist/locale-estado.js +101 -0
  211. package/dist/locale-forja.js +288 -0
  212. package/dist/locale-gerados.js +5 -0
  213. package/dist/locale-grafo.js +129 -0
  214. package/dist/locale-master.js +83 -0
  215. package/dist/locale-network.js +524 -0
  216. package/dist/locale-operacao-restante.js +931 -0
  217. package/dist/locale-projetos.js +100 -0
  218. package/dist/locale-prompts.js +194 -0
  219. package/dist/locale-pulse.js +140 -2
  220. package/dist/locale-reservas.js +87 -0
  221. package/dist/locale-retry.js +183 -6
  222. package/dist/locale-security-scan.js +69 -0
  223. package/dist/locale-setup.js +192 -0
  224. package/dist/locale-ship.js +177 -66
  225. package/dist/locale-thread.js +149 -5
  226. package/dist/locale-verify.js +80 -4
  227. package/dist/locale-worktree.js +246 -0
  228. package/dist/locale.js +553 -9
  229. package/dist/maestro-runtime.js +22 -3
  230. package/dist/manifest.js +293 -12
  231. package/dist/maquina-ociosa.js +211 -0
  232. package/dist/maquina.js +10 -5
  233. package/dist/master-nota-local.js +200 -0
  234. package/dist/master-nota.js +10 -2
  235. package/dist/master.js +118 -41
  236. package/dist/mcp-conhecimento.js +52 -0
  237. package/dist/mcp-experiencia.js +26 -5
  238. package/dist/mcp-install.js +90 -15
  239. package/dist/mcp-noctum.js +101 -0
  240. package/dist/mcp-server.js +116 -22
  241. package/dist/mcp-ship-transporte.js +977 -0
  242. package/dist/mcp-ship.js +68 -24
  243. package/dist/mcp-transportes.js +17 -0
  244. package/dist/memoria.js +63 -58
  245. package/dist/merge-da-entrega.js +85 -0
  246. package/dist/modos-migracao.js +8 -6
  247. package/dist/modos.js +17 -18
  248. package/dist/network-roadmap.js +94 -54
  249. package/dist/noctum-aceite.js +929 -0
  250. package/dist/noctum-arco.js +540 -33
  251. package/dist/noctum-capacidade.js +3 -3
  252. package/dist/noctum-changelog.js +399 -0
  253. package/dist/noctum-cli.js +539 -0
  254. package/dist/noctum-coordenacao.js +1225 -0
  255. package/dist/noctum-entrega.js +1217 -0
  256. package/dist/noctum-envelope.js +253 -17
  257. package/dist/noctum-execucao.js +100 -24
  258. package/dist/noctum-fechamento.js +416 -0
  259. package/dist/noctum-fila.js +49 -10
  260. package/dist/noctum-guarda.js +333 -0
  261. package/dist/noctum-integracao.js +507 -0
  262. package/dist/noctum-maquinas.js +387 -0
  263. package/dist/noctum-medicao.js +450 -0
  264. package/dist/noctum-modo.js +390 -0
  265. package/dist/noctum-pergunta-canal.js +96 -0
  266. package/dist/noctum-pergunta.js +115 -0
  267. package/dist/noctum-provas.js +838 -0
  268. package/dist/noctum-reconciliacao.js +594 -0
  269. package/dist/noctum-rede.js +102 -0
  270. package/dist/noctum-registro.js +215 -0
  271. package/dist/noctum-relatorio.js +861 -0
  272. package/dist/noctum-resposta.js +207 -0
  273. package/dist/noctum-retomada-rede.js +71 -0
  274. package/dist/noctum-sessoes-em-voo.js +93 -0
  275. package/dist/noctum-supervisao.js +649 -0
  276. package/dist/noctum-terminal.js +459 -0
  277. package/dist/noctum-transporte.js +655 -0
  278. package/dist/noctum-vigia.js +679 -0
  279. package/dist/ocupacao.js +3 -1
  280. package/dist/onboarding.js +16 -5
  281. package/dist/orkmind.js +39 -23
  282. package/dist/orquestracao.js +31 -35
  283. package/dist/parado-no-condutor.js +160 -139
  284. package/dist/phase.js +96 -42
  285. package/dist/policies.js +33 -0
  286. package/dist/postura-local.js +11 -6
  287. package/dist/preflight.js +2 -1
  288. package/dist/procedencia.js +9 -14
  289. package/dist/projeto-alvo.js +59 -20
  290. package/dist/prompts.js +136 -42
  291. package/dist/prova-minima.js +5 -6
  292. package/dist/pulse-cadencia.js +5 -4
  293. package/dist/pulse-consentimento.js +53 -1
  294. package/dist/pulse-delivery.js +143 -27
  295. package/dist/pulse-resposta.js +368 -4
  296. package/dist/pulse.js +136 -3
  297. package/dist/ratelimit.js +13 -4
  298. package/dist/recall.js +14 -13
  299. package/dist/rede-adesao.js +13 -8
  300. package/dist/rede-forja.js +108 -24
  301. package/dist/rede-status.js +63 -45
  302. package/dist/rede.js +86 -46
  303. package/dist/retomada-checkpoint.js +101 -0
  304. package/dist/retry.js +326 -78
  305. package/dist/roadmap-reservas.js +32 -32
  306. package/dist/runtime-ambiente.js +5 -0
  307. package/dist/runtime-context.js +279 -85
  308. package/dist/runtime-escada.js +429 -0
  309. package/dist/runtime-profiles.js +130 -63
  310. package/dist/runtimes.js +42 -5
  311. package/dist/saida-segura.js +3 -2
  312. package/dist/security-scan/agil.js +366 -0
  313. package/dist/security-scan/cli.js +76 -0
  314. package/dist/security-scan/compare.js +149 -0
  315. package/dist/security-scan/config.js +93 -0
  316. package/dist/security-scan/detect.js +97 -0
  317. package/dist/security-scan/executor.js +196 -0
  318. package/dist/security-scan/guard.js +180 -0
  319. package/dist/security-scan/imagem-de-lint.js +96 -0
  320. package/dist/security-scan/normalize/actionlint.js +12 -0
  321. package/dist/security-scan/normalize/eslint.js +12 -0
  322. package/dist/security-scan/normalize/gitleaks.js +13 -0
  323. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  324. package/dist/security-scan/normalize/govulncheck.js +36 -0
  325. package/dist/security-scan/normalize/index.js +25 -0
  326. package/dist/security-scan/normalize/npm-audit.js +30 -0
  327. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  328. package/dist/security-scan/normalize/oxlint.js +51 -0
  329. package/dist/security-scan/normalize/pip-audit.js +16 -0
  330. package/dist/security-scan/normalize/ruff.js +12 -0
  331. package/dist/security-scan/normalize/semgrep.js +20 -0
  332. package/dist/security-scan/normalize/trivy.js +33 -0
  333. package/dist/security-scan/normalize/util.js +204 -0
  334. package/dist/security-scan/normalize/zizmor.js +19 -0
  335. package/dist/security-scan/report.js +156 -0
  336. package/dist/security-scan/run.js +448 -0
  337. package/dist/security-scan/tools.js +62 -0
  338. package/dist/security-scan/trabalhador.js +74 -0
  339. package/dist/security-scan/types.js +15 -0
  340. package/dist/session-events.js +19 -2
  341. package/dist/session-watcher-claude.js +74 -19
  342. package/dist/session-watcher-grok.js +425 -0
  343. package/dist/session-watcher.js +174 -13
  344. package/dist/sessoes-contas.js +42 -5
  345. package/dist/sessoes-inventario.js +1 -1
  346. package/dist/sessoes.js +25 -23
  347. package/dist/setup.js +67 -66
  348. package/dist/ship-publicar.js +263 -92
  349. package/dist/ship.js +160 -17
  350. package/dist/superficie.js +14 -11
  351. package/dist/thread-close.js +9 -9
  352. package/dist/thread.js +121 -18
  353. package/dist/tokens.js +15 -11
  354. package/dist/trabalho-thread.js +297 -0
  355. package/dist/transporte-do-canal.js +189 -0
  356. package/dist/types.js +12 -1
  357. package/dist/util.js +5 -2
  358. package/dist/varredura-acoes.js +500 -0
  359. package/dist/verify.js +491 -32
  360. package/dist/worktree-local.js +12 -10
  361. package/dist/worktree.js +81 -85
  362. package/eval/casos/check-quality.json +77 -0
  363. package/eval/casos/security-auditor.json +148 -0
  364. package/eval/casos/security-remediation.json +161 -0
  365. package/eval/fixtures/security-scan/README.md +8 -0
  366. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  367. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  368. package/eval/fixtures/security-scan/go/README.md +4 -0
  369. package/eval/fixtures/security-scan/go/config.go +4 -0
  370. package/eval/fixtures/security-scan/go/go.mod +5 -0
  371. package/eval/fixtures/security-scan/go/go.sum +2 -0
  372. package/eval/fixtures/security-scan/go/main.go +31 -0
  373. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  374. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  375. package/eval/fixtures/security-scan/js/README.md +4 -0
  376. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  377. package/eval/fixtures/security-scan/js/package.json +10 -0
  378. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  379. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  380. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  381. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  382. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  383. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  384. package/eval/fixtures/security-scan/python/README.md +4 -0
  385. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  386. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  387. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  388. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  389. package/package.json +10 -5
  390. package/references/security-checklist.md +3 -3
  391. package/skills/README.md +1 -0
  392. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  393. package/skills/phases/check-quality/SKILL.md +16 -0
  394. package/skills/phases/go-implementation/SKILL.md +6 -0
  395. package/skills/phases/security-remediation/SKILL.md +70 -0
  396. 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
- const duracaoMs = Date.now() - inicio;
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
- executado: !(r.error && NAO_LANCADO.has(r.error)),
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(prazoDoComando(manifesto, nome));
373
+ conducao.renovar(prazoDaExecucao(manifesto, nome, comando));
261
374
  return base(nome, comando, cwd);
262
375
  };
263
376
  }
264
- /** `ork verify --baseline`: grava o estado do mundo ANTES do GO. */
265
- function gravarBaseline(carregado, threadId, executor = executar, conducao = {}, origem = 'cli') {
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, executorSobConducao(executor, carregado.manifesto, tomada), origem)));
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, executor, origem) {
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
- const comandos = comandosDoManifesto(manifesto).map((c) => executor(c.nome, c.comando, cwd));
274
- const baseline = { commit: commitReal(cwd), gravadaEm: (0, util_1.agora)(), comandos };
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(executorComSteal(opcoes.executor
363
- ?? ((nome, comando, dirDeTrabalho) => executar(nome, comando, dirDeTrabalho, prazoDoComando(manifesto, nome))), leitor, (0, instabilidade_1.testesDeRelogioVigentes)(instabilidade)), manifesto, conducao);
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
- const preparo = manifesto.verify.preparo ? (() => {
368
- const resultado = executor('preparo', manifesto.verify.preparo, cwd);
369
- return { resultado, identidade: identidadeDoProduto(cwd) };
370
- })() : null;
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, executor));
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
- : comandosDoManifesto(manifesto).map((c) => executor(c.nome, c.comando, cwd));
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
- ...naoExecutados.map((c) => `${c.nome} nao foi executado`),
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
- : `falha sem baseline em: ${falhasSemBaseline.map((r) => r.nome).join(', ')}`,
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
- : 'corrija a regressao, ou grave a baseline antes do GO com `ork verify <thread> --baseline`',
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
- for (const c of r.falhasSemBaseline)
592
- linhas.push(m.falhaSemBaseline(c.nome, c.comando));
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
+ }