@orkastery/cli 0.5.3 → 0.6.0

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