@orkastery/cli 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) 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 +118 -4
  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/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/retry.js CHANGED
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.TETO_DO_PROMPT_GRAVADO = exports.POLITICA_DE_RETRY = exports.ESCADA_DE_ESFORCO = void 0;
36
+ exports.LIMITE_SEM_PROVA = exports.TETO_DO_PROMPT_GRAVADO = exports.POLITICA_DE_RETRY = exports.ESCADA_DE_ESFORCO = void 0;
37
37
  exports.proximoEsforco = proximoEsforco;
38
38
  exports.politicaDoMotivo = politicaDoMotivo;
39
39
  exports.podeReexecutar = podeReexecutar;
@@ -55,6 +55,7 @@ exports.cancelarPedido = cancelarPedido;
55
55
  exports.alvosDeFallback = alvosDeFallback;
56
56
  exports.proximoAlvo = proximoAlvo;
57
57
  exports.producaoNoIntervalo = producaoNoIntervalo;
58
+ exports.recusasSemProvaSeguidas = recusasSemProvaSeguidas;
58
59
  exports.executarRetry = executarRetry;
59
60
  exports.textoDoPlano = textoDoPlano;
60
61
  exports.textoDoRetry = textoDoRetry;
@@ -90,6 +91,8 @@ const gates_1 = require("./gates");
90
91
  const ledger_1 = require("./ledger");
91
92
  const estado_thread_1 = require("./estado-thread");
92
93
  const vida_da_thread_1 = require("./vida-da-thread");
94
+ const runtime_escada_1 = require("./runtime-escada");
95
+ const claude_bg_2 = require("./adapters/claude-bg");
93
96
  const phase_1 = require("./phase");
94
97
  const runtime_context_1 = require("./runtime-context");
95
98
  const slug_1 = require("./slug");
@@ -112,6 +115,7 @@ const procedencia_1 = require("./procedencia");
112
115
  const postura_local_1 = require("./postura-local");
113
116
  const locale_1 = require("./locale");
114
117
  const locale_retry_1 = require("./locale-retry");
118
+ const retomada_checkpoint_1 = require("./retomada-checkpoint");
115
119
  /** RM-061 (F2b, D3): `porque` e `correcao` de cada motivo tem a fonte no catalogo pt-BR; o `--json` nao muda. */
116
120
  const TEXTOS_DA_POLITICA = locale_retry_1.RETRY_PT_BR.politica;
117
121
  /**
@@ -228,10 +232,9 @@ exports.POLITICA_DE_RETRY = {
228
232
  automatica: true,
229
233
  ...TEXTOS_DA_POLITICA['runtime.rate-limited'],
230
234
  },
231
- // I-33 (D5, D11): a falha e da CONTA. O perfil sai do rodizio e o MESMO prompt vai ao proximo
232
- // perfil ativo, depois ao runtime de fallback do bloco, e so por ultimo a fila duravel. A
233
- // rotacao so redespacha quando a prova do `ork` confirma que o intervalo nao produziu nada;
234
- // producao parcial sob cota esgotada vira `human.pending`, nunca redespacho sobre a worktree.
235
+ // I-33 (D5, D11) + RM-064 T3: a falha e da CONTA. O perfil sai do rodizio e o pedido segue ao
236
+ // proximo perfil ativo, depois ao fallback e por ultimo a fila. Interrupcao no meio da fase leva
237
+ // checkpoint derivado do ledger/Git; o prompt original permanece gravado e referenciado.
235
238
  'runtime.quota-exhausted': {
236
239
  motivo: 'runtime.quota-exhausted',
237
240
  acao: 'reexecutar',
@@ -317,13 +320,15 @@ function podeReexecutar(motivo) {
317
320
  }
318
321
  /** Tabela de `ork retry policy`. */
319
322
  function tabelaDaPolitica() {
323
+ const m = (0, locale_1.msg)().retry;
324
+ const c = m.complementar;
320
325
  const linhas = Object.values(exports.POLITICA_DE_RETRY).map((p) => [
321
326
  p.motivo,
322
327
  p.acao,
323
- p.automatica ? 'sim' : 'nao',
324
- p.porque,
328
+ p.automatica ? c.sim : c.nao,
329
+ m.politica[p.motivo].porque,
325
330
  ]);
326
- return (0, util_1.tabela)(['MOTIVO TIPADO', 'ACAO DE RETRY', 'AUTOMATICA', 'POR QUE'], linhas);
331
+ return (0, util_1.tabela)([...c.colunasPolitica], linhas);
327
332
  }
328
333
  /** A fase a que um evento de gate reprovado se refere. */
329
334
  function faseDoEvento(evento, thread) {
@@ -353,8 +358,12 @@ function ultimaReprovacao(raiz, threadId) {
353
358
  * planejou: planejar nao gasta janela nem toca no repositorio.
354
359
  */
355
360
  function tentativasFeitas(raiz, threadId, fase, motivo) {
361
+ const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, threadId));
362
+ // RM-063 (F4): a escada de `runtime.unavailable` vale por episodio, e as tentativas dela tambem: o pedido novo da fase
363
+ // (`ork phase run`) recomeca a contagem.
364
+ const desde = motivo === 'runtime.unavailable' ? (0, runtime_escada_1.inicioDoEpisodio)(eventos, fase) : -1;
356
365
  // RM-055 (continuacao, D2): a recusa pelo impedimento do dono fica no ledger com `conta: false` e nao conta.
357
- return (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, threadId)).filter((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.retryTentado && e.fase === fase && e.motivo === motivo && e.conta !== false).length;
366
+ return eventos.filter((e, i) => i > desde && e.tipo === ledger_1.TIPOS_DE_EVENTO.retryTentado && e.fase === fase && e.motivo === motivo && e.conta !== false).length;
358
367
  }
359
368
  /** O bloco de loop desta fase pausa para o humano neste modo? */
360
369
  function blocoPausa(thread, fase) {
@@ -417,6 +426,17 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
417
426
  razao: (0, locale_1.textoDoCatalogo)((m) => m.retry.politica[motivo].porque),
418
427
  };
419
428
  }
429
+ // RM-063 (F4): a escada de `runtime.unavailable` diz o proximo degrau do episodio; sem degrau, o dono e chamado.
430
+ const escada = motivo === 'runtime.unavailable' ? (0, runtime_escada_1.estadoDaEscada)((0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, threadId)), fase) : null;
431
+ const naEscada = escada ? { degrau: escada.proximo, tipo: escada.proximo ? runtime_escada_1.DEGRAUS_DA_ESCADA[escada.proximo - 1] : null,
432
+ consumidos: escada.consumidos.map((d) => ({ degrau: d.degrau, tipo: d.tipo, resultado: d.resultado, em: d.em })) } : null;
433
+ if (escada && escada.proximo === null) {
434
+ return {
435
+ thread: threadId, modo: thread.modo, fase, motivo, detalhe, politica, acao: 'escalar-humano', tentativas, limite,
436
+ effort: effortBase, effortAnterior: effortBase, automatica: false, bloqueio: 'escalacao.limite',
437
+ razao: (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.esgotada((0, runtime_escada_1.resumoDosDegraus)(escada.consumidos))), escada: naEscada,
438
+ };
439
+ }
420
440
  // Limite de escalacao: pausa QUALQUER modo, inclusive #Auto.
421
441
  if (tentativas >= limite) {
422
442
  return {
@@ -439,7 +459,8 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
439
459
  // Da 2a tentativa em diante o esforco sobe um degrau, quando o manifesto permite.
440
460
  // `tentativas` e quantas JA rodaram, entao a 1a tentativa (tentativas 0) sai no
441
461
  // esforco base do manifesto e so a partir da 2a a escada anda.
442
- const escala = manifesto.retry.escalar_esforco && tentativas >= 1;
462
+ // RM-063 (F4): runtime fora nao e prompt fraco. A escada de `runtime.unavailable` troca o destino, nunca o esforco.
463
+ const escala = manifesto.retry.escalar_esforco && tentativas >= 1 && !escada;
443
464
  const effortAnterior = escalarEsforco(effortBase, Math.max(0, tentativas - 1));
444
465
  const effort = escala ? escalarEsforco(effortBase, tentativas) : effortBase;
445
466
  const acao = escala ? 'escalar-esforco' : politica.acao;
@@ -450,6 +471,10 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
450
471
  let bloqueio = null;
451
472
  let automatica = politica.automatica;
452
473
  let razao = (0, locale_1.textoDoCatalogo)((m) => m.retry.politica[motivo].porque);
474
+ // RM-063 (F4): o plano de `runtime.unavailable` diz o degrau da escada que a execucao sobe.
475
+ const degrau = escada?.proximo ?? null;
476
+ if (degrau)
477
+ razao = (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.proximo(degrau, m.retry.escada.degraus[runtime_escada_1.DEGRAUS_DA_ESCADA[degrau - 1]]));
453
478
  if (delegacao.permitida && politica.automatica) {
454
479
  razao = (0, locale_1.textoDoCatalogo)((m) => m.retry.comDelegacao(m.retry.politica[motivo].porque, delegacao.razao, String(delegacao.delegado), String(delegacao.evidencia)));
455
480
  }
@@ -476,7 +501,7 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
476
501
  }
477
502
  return {
478
503
  thread: threadId, modo: thread.modo, fase, motivo, detalhe, politica, acao, tentativas,
479
- limite, effort, effortAnterior, automatica, bloqueio, razao,
504
+ limite, effort, effortAnterior, automatica, bloqueio, razao, ...(naEscada ? { escada: naEscada } : {}),
480
505
  };
481
506
  }
482
507
  /** O esforco depois de `n` escaladas a partir do esforco base do manifesto. */
@@ -606,8 +631,8 @@ tomadaPrevia) {
606
631
  dryRun: opcoes.dryRun === true,
607
632
  };
608
633
  }
609
- const prompt = fs.readFileSync(absoluto, 'utf8');
610
- const shaAtual = (0, phase_1.hashDoPrompt)(prompt);
634
+ const promptOriginal = fs.readFileSync(absoluto, 'utf8');
635
+ const shaAtual = (0, phase_1.hashDoPrompt)(promptOriginal);
611
636
  if (shaAtual !== sha) {
612
637
  return {
613
638
  ...vazio,
@@ -617,6 +642,10 @@ tomadaPrevia) {
617
642
  dryRun: opcoes.dryRun === true,
618
643
  };
619
644
  }
645
+ const retomada = opcoes.checkpoint ? (0, retomada_checkpoint_1.prepararPromptDeRetomada)(raiz, thread, fase, { prompt: promptOriginal, promptPath: absoluto, promptSha256: sha }, !opcoes.dryRun) : null;
646
+ const prompt = retomada?.prompt ?? promptOriginal;
647
+ const promptExecutadoPath = retomada?.promptPath ?? absoluto;
648
+ const promptExecutadoSha = retomada?.promptSha256 ?? sha;
620
649
  const violacoes = (0, policies_1.bloqueantes)((0, policies_1.avaliarPolicies)(manifesto, { gate: 'phase.dispatch', prompt }));
621
650
  if (violacoes.length > 0) {
622
651
  const motivo = (0, policies_1.motivoDominante)(violacoes);
@@ -630,7 +659,7 @@ tomadaPrevia) {
630
659
  fase,
631
660
  slug,
632
661
  origem: opcoes.origem ?? 'retry',
633
- evidencia: `prompt sha256 ${sha} (retomada recusada antes de despachar)`,
662
+ evidencia: `prompt sha256 ${promptExecutadoSha} (origem ${sha}; retomada recusada antes de despachar)`,
634
663
  });
635
664
  return { ...vazio, ok: false, motivo, detalhe, dryRun: opcoes.dryRun === true };
636
665
  }
@@ -641,7 +670,7 @@ tomadaPrevia) {
641
670
  : (0, runtime_context_1.novaIdentidadeDeDespacho)(thread.id, fase);
642
671
  const canal = opcoes.canal ?? (0, conducao_1.canalDoProcesso)();
643
672
  const doBlocoDaConducao = (0, setup_1.limitesDoBloco)(manifesto, (0, setup_1.lerSetup)(raiz), thread.modo, fase);
644
- const pedidoDeConducao = { canal, correlacao: null, operacao: 'retry.run', fase, promptSha256: sha,
673
+ const pedidoDeConducao = { canal, correlacao: null, operacao: 'retry.run', fase, promptSha256: promptExecutadoSha,
645
674
  identidade: identidade.dispatchId, prazoMs: (0, phase_1.prazoDaSessao)(doBlocoDaConducao) };
646
675
  let conducao = null;
647
676
  if (tomadaPrevia) {
@@ -658,7 +687,7 @@ tomadaPrevia) {
658
687
  const tomada = (0, conducao_1.tomarConducao)(raiz, thread.id, pedidoDeConducao);
659
688
  if (!tomada.ok) {
660
689
  if (tomada.idempotente && tomada.atual) {
661
- (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, thread.id), thread.id, ledger_1.TIPOS_DE_EVENTO.despachoIdempotente, { fase, promptSha256: sha, canal,
690
+ (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, thread.id), thread.id, ledger_1.TIPOS_DE_EVENTO.despachoIdempotente, { fase, promptSha256: promptExecutadoSha, canal,
662
691
  sessionId: tomada.atual.sessao, origem: opcoes.origem ?? 'retry',
663
692
  razao: 'mesma fase e mesmo prompt de quem ja conduz: a sessao em andamento atende a retomada, sem sessao nova' });
664
693
  const sessao = String(tomada.atual.sessao).slice(0, 8);
@@ -677,8 +706,9 @@ tomadaPrevia) {
677
706
  try {
678
707
  cwd = opcoes.cwd !== undefined ? (0, procedencia_1.exigirCwdLocal)(raiz, thread.id, opcoes.cwd, 'fila') : (0, procedencia_1.diretorioDaThread)(raiz, thread);
679
708
  }
709
+ // RM-061 (F3b, GO-FIX 1): o erro do catalogo fica registrado, e a impressao o remonta.
680
710
  catch (e) {
681
- return { ...vazio, ok: false, motivo: 'tree.blocked', detalhe: e.message, dryRun: opcoes.dryRun === true };
711
+ return { ...vazio, ok: false, motivo: 'tree.blocked', detalhe: (0, locale_1.textoDoErro)(e), dryRun: opcoes.dryRun === true };
682
712
  }
683
713
  // Mesma resolucao do `ork phase run`: a retomada carimba no ledger o trio que ela de
684
714
  // fato despachou, inclusive quando o pedido da fila trazia um modelo proprio. O setup
@@ -711,22 +741,19 @@ tomadaPrevia) {
711
741
  }
712
742
  return pendente;
713
743
  }
714
- // D14 (GO-FIX 2): a retomada claude-bg abre com a mesma colaboração e o mesmo contexto de
715
- // runtime do `ork phase run`; sem eles, o PLAN retomado saía sem negar Edit, Write e
716
- // NotebookEdit e sem a allowlist do núcleo. O ramo Codex não muda.
744
+ // RM-064 T8: toda retomada abre com o mesmo contexto de runtime do `ork phase run`.
745
+ // Sem ele, a escada que troca para Codex perde o MCP vinculado à thread e ao despacho.
717
746
  let contextoRuntime;
718
- if (runtime === 'claude-bg') {
719
- try {
720
- contextoRuntime = (0, runtime_context_1.contextoDoProjeto)(raiz, runtime, cwd, thread.id);
721
- }
722
- catch (e) {
723
- const erro = e.message;
724
- return { ...vazio, ok: false, motivo: 'runtime.unavailable',
725
- detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.runtimeIndisponivel(erro)), dryRun: opcoes.dryRun === true };
726
- }
727
- if (contextoRuntime)
728
- contextoRuntime.identidade = identidade;
747
+ try {
748
+ contextoRuntime = (0, runtime_context_1.contextoDoProjeto)(raiz, runtime, cwd, thread.id);
749
+ }
750
+ catch (e) {
751
+ const erro = e.message;
752
+ return { ...vazio, ok: false, motivo: 'runtime.unavailable',
753
+ detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.runtimeIndisponivel(erro)), dryRun: opcoes.dryRun === true };
729
754
  }
755
+ if (contextoRuntime)
756
+ contextoRuntime.identidade = identidade;
730
757
  // I-33 (D4, D7): a retomada escolhe o perfil como o `ork phase run`, com o login conferido.
731
758
  let escolha;
732
759
  try {
@@ -754,10 +781,11 @@ tomadaPrevia) {
754
781
  dryRun: opcoes.dryRun,
755
782
  sandbox: manifesto.runtime.sandbox,
756
783
  logDir: path.join((0, thread_1.dirThread)(raiz, thread.id), 'sessoes'),
757
- vinculo: { thread: thread.id, fase, promptSha256: sha },
784
+ vinculo: { thread: thread.id, fase, promptSha256: promptExecutadoSha },
758
785
  ...(perfil ? { perfil } : {}),
759
786
  // RM-037 (defeito 2): o modo plano segue a mesma regra do `ork phase run`, pelo bloco.
760
- ...(runtime === 'claude-bg' ? { contextoRuntime, ...((0, phase_1.modoDaSessaoDoBloco)(thread, fase).plano ? { colaboracao: 'plan' } : {}) } : {}),
787
+ contextoRuntime,
788
+ ...(runtime === 'claude-bg' && (0, phase_1.modoDaSessaoDoBloco)(thread, fase).plano ? { colaboracao: 'plan' } : {}),
761
789
  // I-36 (D4): a sessao retomada herda a identidade do despacho e o canal, como no `ork phase run`.
762
790
  ambienteExtra: (0, conducao_1.ambienteDaConducao)(identidade.dispatchId, thread.id, canal),
763
791
  });
@@ -775,15 +803,21 @@ tomadaPrevia) {
775
803
  };
776
804
  }
777
805
  if (!resultado.ok || !resultado.sessionId) {
806
+ // RM-063 (F4, GO-FIX): o `claude --bg` lento diz o id e estoura o prazo com a sessao aberta. A falha guarda a sessao,
807
+ // como no `ork phase run`: e por ela que o retry e a escada provam que ninguem trabalha na worktree antes de outro
808
+ // destino.
809
+ const daSessao = resultado.sessionId ? { sessionId: resultado.sessionId } : {};
778
810
  (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, thread.id), thread.id, 'phase_dispatch_failed', { fase, runtime, slug, cwd,
779
- promptPath: absoluto, promptSha256: sha, controlador: resultado.controlador, model, effort,
811
+ promptPath: promptExecutadoPath, promptSha256: promptExecutadoSha,
812
+ ...(retomada ? { promptOriginalPath: absoluto, promptOriginalSha256: sha } : {}),
813
+ controlador: resultado.controlador, model, effort,
780
814
  erro: resultado.erro ?? 'runtime.unavailable: sem sessionId', stderr: (resultado.stderr ?? '').slice(0, 500),
781
- origem: 'retry', ...(perfil ? { perfil } : {}) });
815
+ origem: 'retry', ...(perfil ? { perfil } : {}), ...daSessao });
782
816
  const sinal = resultado.rateLimit ?? null;
783
817
  // RM-055: o redespacho recusado pelo que so o dono resolve reabre a pausa dele, com o mesmo comando.
784
818
  const impedimento = !resultado.falhaDeConta && !sinal
785
819
  ? (0, impedimento_1.registrarImpedimentoDoDono)((0, thread_1.dirThread)(raiz, thread.id), thread, { fase, slug, runtime, cwd, origem: 'retry',
786
- promptPath: absoluto, promptSha256: sha, perfil, saida: `${resultado.stderr ?? ''}\n${resultado.erro ?? ''}` })
820
+ promptPath: promptExecutadoPath, promptSha256: promptExecutadoSha, perfil, saida: `${resultado.stderr ?? ''}\n${resultado.erro ?? ''}` })
787
821
  : null;
788
822
  if (impedimento) {
789
823
  return { ok: false, slug, sessionId: null, verificada: false, motivo: impedimento.motivo,
@@ -800,7 +834,7 @@ tomadaPrevia) {
800
834
  return {
801
835
  ok: false,
802
836
  slug,
803
- sessionId: null,
837
+ sessionId: resultado.sessionId ?? null,
804
838
  verificada: false,
805
839
  // I-33 (D11b): falha de conta reconhecida na saida e o motivo mais especifico.
806
840
  motivo: resultado.falhaDeConta?.motivo ?? (sinal ? 'runtime.rate-limited' : 'runtime.unavailable'),
@@ -822,8 +856,9 @@ tomadaPrevia) {
822
856
  thread,
823
857
  fase,
824
858
  slug,
825
- promptPath: absoluto,
826
- promptSha256: sha,
859
+ promptPath: promptExecutadoPath,
860
+ promptSha256: promptExecutadoSha,
861
+ ...(retomada ? { promptOriginal: { path: absoluto, sha256: sha } } : {}),
827
862
  runtime,
828
863
  cwd,
829
864
  model,
@@ -839,10 +874,11 @@ tomadaPrevia) {
839
874
  sessionId: resultado.sessionId,
840
875
  verificada: resultado.verificada,
841
876
  motivo: null,
842
- detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.redespachada(String(resultado.sessionId), sha.slice(0, 12), perfil ? perfil.id : null, runtime)),
877
+ detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.redespachada(String(resultado.sessionId), promptExecutadoSha.slice(0, 12), perfil ? perfil.id : null, runtime)),
843
878
  sinal: null,
844
879
  perfil: perfil ?? null,
845
880
  comando: resultado.comando,
881
+ controlador: resultado.controlador,
846
882
  dryRun: false,
847
883
  };
848
884
  }
@@ -895,6 +931,15 @@ function playbookDaRetomada(carregado, pedido, opcoes = {}) {
895
931
  function retomarPedido(carregado, pedidoOriginal, opcoes = {}) {
896
932
  const { raiz } = carregado;
897
933
  const quando = opcoes.quando ?? (0, util_1.agora)();
934
+ // RM-058 N4 (D17 da ork-rm058n4): o pedido do despacho de um arco #Noctum é retomado pelo vigia do arco, pelo passo dele
935
+ // (conferência do envelope e reserva). Aqui ele não é redespachado nem regravado, e o ledger da thread não muda.
936
+ const arco = (0, ratelimit_1.arcoDoPedido)(pedidoOriginal);
937
+ if (arco) {
938
+ return { pedido: pedidoOriginal, playbook: 'mesma-sessao', slug: pedidoOriginal.slug, despachada: false, sessionId: null, verificada: false,
939
+ motivo: null, dryRun: opcoes.dryRun === true,
940
+ detalhe: `o pedido ${pedidoOriginal.id} é do arco ${arco}: quem o retoma é o vigia do arco, com a conferência do envelope e a reserva; ` +
941
+ `nada foi despachado (sem o vigia, o dono tira o pedido da fila com ork retry cancel ${pedidoOriginal.id} --motivo "..." e retoma a fase à mão)` };
942
+ }
898
943
  const thread = (0, thread_1.lerThread)(raiz, pedidoOriginal.thread);
899
944
  const dir = (0, thread_1.dirThread)(raiz, thread.id);
900
945
  let pedido = pedidoOriginal;
@@ -973,6 +1018,7 @@ function retomarPedido(carregado, pedidoOriginal, opcoes = {}) {
973
1018
  effort: alvo.effort,
974
1019
  cwd: pedido.cwd,
975
1020
  origem: 'retry.rate-limit',
1021
+ checkpoint: doPedido.checkpoint === true,
976
1022
  dryRun: opcoes.dryRun,
977
1023
  });
978
1024
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.retryTentado, {
@@ -1084,7 +1130,8 @@ function alvoDaRetomada(carregado, thread, pedido) {
1084
1130
  const principal = pedido.runtime ?? doBloco?.runtime ?? manifesto.runtime.adapter;
1085
1131
  const candidatos = [{ runtime: principal, model: pedido.model, effort: pedido.effort },
1086
1132
  ...alvosDeFallback(doBloco, doBloco?.runtime ?? manifesto.runtime.adapter).filter(f => f.runtime !== principal)
1087
- .map(f => ({ runtime: f.runtime, model: f.model, effort: f.effort ?? pedido.effort }))];
1133
+ .map(f => ({ runtime: f.runtime, model: f.model, effort: f.effort ?? pedido.effort }))]
1134
+ .filter(c => (0, runtime_context_1.capacidadeDoRuntimeNoProjeto)(raiz, c.runtime).capaz);
1088
1135
  const runtimes = candidatos.map(c => c.runtime);
1089
1136
  const store = (0, runtime_profiles_1.lerPerfisComContas)(raiz), politica = (0, runtime_profiles_1.politicaDeRotacao)(manifesto);
1090
1137
  for (const c of candidatos) {
@@ -1145,11 +1192,12 @@ function alvosDeFallback(bloco, principal) {
1145
1192
  function proximoAlvo(raiz, atual, fallback, excluir, politica, agoraMs = Date.now()) {
1146
1193
  const store = (0, runtime_profiles_1.lerPerfisComContas)(raiz, agoraMs);
1147
1194
  const perfis = [...excluir.perfis, ...(atual.perfil ? [atual.perfil.id] : [])];
1148
- const mesmo = (0, runtime_profiles_1.proximoPerfilDisponivel)(store, atual.runtime, politica, { excluir: perfis, agoraMs });
1195
+ const mesmo = (0, runtime_context_1.capacidadeDoRuntimeNoProjeto)(raiz, atual.runtime).capaz
1196
+ ? (0, runtime_profiles_1.proximoPerfilDisponivel)(store, atual.runtime, politica, { excluir: perfis, agoraMs }) : null;
1149
1197
  if (mesmo)
1150
1198
  return { runtime: atual.runtime, perfil: (0, runtime_profiles_1.perfilDeDespacho)(mesmo), model: null, effort: null };
1151
1199
  for (const f of fallback) {
1152
- if (f.runtime === atual.runtime)
1200
+ if (f.runtime === atual.runtime || !(0, runtime_context_1.capacidadeDoRuntimeNoProjeto)(raiz, f.runtime).capaz)
1153
1201
  continue;
1154
1202
  if ((0, runtime_profiles_1.perfisDoRuntime)(store, f.runtime).length > 0) {
1155
1203
  const p = (0, runtime_profiles_1.proximoPerfilDisponivel)(store, f.runtime, politica, { excluir: perfis, agoraMs });
@@ -1263,6 +1311,25 @@ function ultimoDespachoFalho(raiz, threadId, fase, silencio = false) {
1263
1311
  }
1264
1312
  return null;
1265
1313
  }
1314
+ /**
1315
+ * RM-063 (F4, GO-FIX): quantas recusas seguidas, no episodio da fase, sairam porque o runtime nao respondeu a prova de
1316
+ * vida (`semProva`). Uma tentativa que andou (contada, ou recusada com sessao viva) zera a conta.
1317
+ */
1318
+ function recusasSemProvaSeguidas(eventos, fase) {
1319
+ const desde = (0, runtime_escada_1.inicioDoEpisodio)(eventos, fase);
1320
+ let seguidas = 0;
1321
+ for (let i = eventos.length - 1; i > desde; i--) {
1322
+ const e = eventos[i];
1323
+ if (e.tipo !== ledger_1.TIPOS_DE_EVENTO.retryTentado || e.fase !== fase || e.motivo !== 'runtime.unavailable')
1324
+ continue;
1325
+ if (e.semProva !== true)
1326
+ break;
1327
+ seguidas += 1;
1328
+ }
1329
+ return seguidas;
1330
+ }
1331
+ /** Recusas seguidas sem resposta do runtime, no mesmo episodio, ate o dono ser chamado. */
1332
+ exports.LIMITE_SEM_PROVA = 3;
1266
1333
  /**
1267
1334
  * Executa a acao de retry do ultimo gate reprovado da thread.
1268
1335
  *
@@ -1308,6 +1375,28 @@ function executarRetry(carregado, threadId, opcoes = {}) {
1308
1375
  razao: plano.razao,
1309
1376
  });
1310
1377
  if (!plano.automatica || plano.motivo === null) {
1378
+ // RM-063 (F4, GO-FIX, achado 9): a escada esgotada pelo plano (a sessao do ultimo degrau morreu depois) chama o dono
1379
+ // pela escada, com as alternativas e o comando que retoma com o mesmo prompt; a escalada generica so repetia o retry.
1380
+ if (plano.motivo === 'runtime.unavailable' && plano.escada && plano.escada.degrau === null && plano.fase && !opcoes.dryRun) {
1381
+ const eventos = (0, ledger_1.lerLedger)(dir);
1382
+ const ultimo = despachoParaRedespachar(eventos, plano.fase, null);
1383
+ if (ultimo && typeof ultimo.promptPath === 'string' && typeof ultimo.promptSha256 === 'string') {
1384
+ const origem = (0, runtime_escada_1.destinoDoEpisodio)(eventos, plano.fase);
1385
+ let perfil = null;
1386
+ try {
1387
+ perfil = perfilDoEvento(ultimo);
1388
+ }
1389
+ catch {
1390
+ perfil = null;
1391
+ }
1392
+ const despacho = { promptPath: localizarPromptGravado(raiz, threadId, ultimo.promptPath, ultimo.promptSha256) ?? ultimo.promptPath,
1393
+ promptSha256: ultimo.promptSha256, perfil: origem?.perfil ?? perfil,
1394
+ runtime: origem?.runtime ?? (typeof ultimo.runtime === 'string' ? ultimo.runtime : carregado.manifesto.runtime.adapter),
1395
+ model: origem?.model ?? null, effort: origem?.effort ?? null };
1396
+ const detalhe = (0, runtime_escada_1.escalarEscada)(carregado, thread, plano.fase, despacho, (0, runtime_escada_1.estadoDaEscada)(eventos, plano.fase).consumidos, plano.tentativas, plano.limite);
1397
+ return { ...vazio, detalhe };
1398
+ }
1399
+ }
1311
1400
  // Escalacao e custo viram gate humano explicito no ledger, nao silencio.
1312
1401
  if (plano.bloqueio === 'escalacao.limite' || plano.acao === 'sem-retry') {
1313
1402
  (0, gates_1.registrarGateBloqueado)(dir, threadId, {
@@ -1372,7 +1461,8 @@ function executarRetry(carregado, threadId, opcoes = {}) {
1372
1461
  }
1373
1462
  if (acaoBase === 'sincronizar-worktree') {
1374
1463
  const sync = (0, worktree_1.sincronizarWorktree)(carregado, threadId, { dryRun: opcoes.dryRun });
1375
- const detalhe = (0, locale_1.textoDoCatalogo)((m) => sync.ok ? m.retry.sincronizada(sync.passos.join('; ')) : m.retry.sincronizacaoFalhou(sync.detalhe));
1464
+ // RM-061 (F3b): o detalhe da worktree tambem vem do catalogo; remontado aqui, ele segue o locale da impressao.
1465
+ const detalhe = (0, locale_1.textoDoCatalogo)((m) => sync.ok ? m.retry.sincronizada(sync.passos.join('; ')) : m.retry.sincronizacaoFalhou((0, locale_1.remontar)(sync.detalhe)));
1376
1466
  registrarTentativa(sync.ok, detalhe);
1377
1467
  return { ...vazio, executada: sync.ok, sync, detalhe };
1378
1468
  }
@@ -1419,7 +1509,60 @@ function executarRetry(carregado, threadId, opcoes = {}) {
1419
1509
  // despacho que falhou depois de abrir a sessao (o `claude --bg` lento) e o adaptador que lanca deixariam duas sessoes
1420
1510
  // na mesma worktree. Sem a prova, nada e redespachado, e a tentativa nao conta.
1421
1511
  const ids = [falho.sessionId, gateDoPlano?.sessionId].filter((x) => typeof x === 'string' && !!x);
1422
- const viva = (0, vida_da_thread_1.sessaoVivaNaThread)(raiz, thread, ids);
1512
+ const provar = (conhecidos) => (0, vida_da_thread_1.sessaoVivaNaThread)(raiz, thread, conhecidos);
1513
+ let viva = provar(ids);
1514
+ // RM-063 (F4): `runtime.unavailable` sobe a escada de recuperacao (reerguer o daemon, o fallback do bloco, outro perfil),
1515
+ // sempre com o mesmo prompt e o mesmo sha256. Ate aqui o retry so sabia repetir o destino que tinha acabado de falhar.
1516
+ if (plano.motivo === 'runtime.unavailable') {
1517
+ let perfilFalho = null;
1518
+ try {
1519
+ perfilFalho = perfilDoEvento(falho);
1520
+ }
1521
+ catch {
1522
+ perfilFalho = null;
1523
+ }
1524
+ // O destino de origem e o do pedido novo que abriu o episodio; o despacho do gate completa o que faltar.
1525
+ const origem = (0, runtime_escada_1.destinoDoEpisodio)((0, ledger_1.lerLedger)(dir), plano.fase);
1526
+ const sha = falho.promptSha256;
1527
+ // GO-FIX (achado 10): o caminho do ledger e relativo a quem despachou; o absoluto e o que o dono roda de qualquer lugar.
1528
+ const promptPath = localizarPromptGravado(raiz, threadId, falho.promptPath, sha) ?? falho.promptPath;
1529
+ const despacho = { promptPath, promptSha256: sha, perfil: origem?.perfil ?? perfilFalho,
1530
+ runtime: origem?.runtime ?? (typeof falho.runtime === 'string' ? falho.runtime : carregado.manifesto.runtime.adapter),
1531
+ model: origem?.model ?? (typeof falho.model === 'string' ? falho.model : null),
1532
+ effort: origem?.effort ?? (typeof falho.effort === 'string' ? falho.effort : plano.effort) };
1533
+ // GO-FIX (a conferir da revisao): com o daemon travado, o proprio `claude agents` pode nao responder, e a prova de vida
1534
+ // segurava a escada para sempre. No claude-bg, o degrau 1 reergue o daemon antes (o `--keep-workers` deixa as sessoes
1535
+ // de pe) e a prova e refeita; sem resposta de novo, nada sai, e na terceira vez seguida no episodio o dono e chamado.
1536
+ let daemonJaReerguido = null;
1537
+ if (!viva.respondeu && despacho.runtime === 'claude-bg' && !opcoes.dryRun) {
1538
+ daemonJaReerguido = (0, runtime_escada_1.reerguerDaemon)(opcoes.daemon ?? claude_bg_2.DAEMON_DO_CLAUDE, despacho.perfil);
1539
+ viva = provar(ids);
1540
+ }
1541
+ if (!viva.respondeu || viva.sessionId) {
1542
+ const { sessionId: sessao, detalhe: falhaDaConsulta } = viva;
1543
+ const detalhe = sessao ? (0, locale_1.textoDoCatalogo)((m) => m.retry.sessaoAindaViva(sessao.slice(0, 8), threadId))
1544
+ : (0, locale_1.textoDoCatalogo)((m) => m.retry.runtimeSemProva(falhaDaConsulta ?? '', threadId));
1545
+ registrarTentativa(false, detalhe, { conta: false, ...(sessao ? {} : { semProva: true }),
1546
+ ...(daemonJaReerguido ? { daemon: daemonJaReerguido } : {}) });
1547
+ const seguidas = sessao ? 0 : recusasSemProvaSeguidas((0, ledger_1.lerLedger)(dir), plano.fase);
1548
+ if (seguidas >= exports.LIMITE_SEM_PROVA && !opcoes.dryRun) {
1549
+ const escada = (0, runtime_escada_1.estadoDaEscada)((0, ledger_1.lerLedger)(dir), plano.fase);
1550
+ const motivo = (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.semResposta(seguidas, falhaDaConsulta ?? '-'));
1551
+ return { ...vazio, detalhe: (0, runtime_escada_1.escalarEscada)(carregado, thread, plano.fase, despacho, escada.consumidos, plano.tentativas, plano.limite, motivo) };
1552
+ }
1553
+ return { ...vazio, detalhe };
1554
+ }
1555
+ const saida = (0, runtime_escada_1.subirAEscada)({
1556
+ carregado, thread, fase: plano.fase, despacho,
1557
+ tentativas: plano.tentativas, limite: plano.limite, dryRun: opcoes.dryRun, daemon: opcoes.daemon, daemonJaReerguido,
1558
+ idsConhecidos: ids, provaDeVida: provar,
1559
+ redespachar: (d) => redespachar(carregado, thread, plano.fase, promptPath, sha, { runtime: d.runtime, perfil: d.perfil,
1560
+ model: d.model, effort: d.effort, origem: 'retry.escada', dryRun: opcoes.dryRun }),
1561
+ // RM-055 (D2): a recusa do runtime por um impedimento do dono nao gasta tentativa, tambem na escada.
1562
+ registrarTentativa: (ok, detalhe, extra = {}) => registrarTentativa(ok, detalhe, { ...extra, ...((0, impedimento_1.ehImpedimentoDoDono)(extra.motivoDoRedespacho) ? { conta: false } : {}) }),
1563
+ });
1564
+ return { ...vazio, executada: saida.executada, redespacho: saida.redespacho, detalhe: saida.detalhe };
1565
+ }
1423
1566
  if (!viva.respondeu || viva.sessionId) {
1424
1567
  const { sessionId: sessao, detalhe: falhaDaConsulta } = viva;
1425
1568
  const detalhe = sessao ? (0, locale_1.textoDoCatalogo)((m) => m.retry.sessaoAindaViva(sessao.slice(0, 8), threadId))
@@ -1447,11 +1590,10 @@ function executarRetry(carregado, threadId, opcoes = {}) {
1447
1590
  };
1448
1591
  }
1449
1592
  /**
1450
- * D5 + D11: rotacao depois de falha da conta. Com sessao no gate (o observador classificou a
1451
- * morte), a prova do `ork` decide antes: producao parcial vira `human.pending` com diagnostico.
1452
- * Sem producao, o perfil sai do rodizio e o MESMO prompt segue no proximo destino; recusa da
1453
- * conta no redespacho (nada rodou) continua a rotacao na mesma chamada, dentro do limite de
1454
- * tentativas. Sem destino: fila ate o menor prazo, ou o humano quando nenhum prazo existe.
1593
+ * D5 + RM-064 T2/T3: rotação depois de falha da conta. Produção parcial sob cota segue com um
1594
+ * checkpoint derivado do ledger e do Git; sem produção, o prompt original segue no próximo
1595
+ * destino. Recusa da conta no redespacho continua a rotação dentro do limite de tentativas.
1596
+ * Sem destino: fila até o menor prazo, ou o humano quando nenhum prazo existe.
1455
1597
  */
1456
1598
  function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTentativa) {
1457
1599
  const { raiz, manifesto } = carregado;
@@ -1486,15 +1628,18 @@ function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTenta
1486
1628
  const erro = e.message;
1487
1629
  return escalar('perfil registrado invalido', (0, locale_1.textoDoCatalogo)((m) => m.retry.rotacaoRecusada(erro)));
1488
1630
  }
1489
- // D11 (c): sessao que morreu por cota depois de produzir nao e redespachada.
1631
+ // RM-064 T3: produção parcial sob cota é preservada no checkpoint; não é razão para recomeçar nem escalar.
1632
+ let checkpoint = false;
1490
1633
  if (typeof gate?.sessionId === 'string' && typeof gate.despachoEm === 'string') {
1491
1634
  const producao = producaoNoIntervalo(raiz, thread, { sessionId: gate.sessionId, fase, despachadaEm: gate.despachoEm }, eventos);
1492
- if (producao.produziu) {
1493
- return escalar('producao parcial sob falha da conta', (0, locale_1.textoDoCatalogo)((m) => m.retry.producaoParcialConta(motivo === 'runtime.quota-exhausted', String(producao.evidencia))));
1494
- }
1635
+ checkpoint = motivo === 'runtime.quota-exhausted' &&
1636
+ (producao.produziu || gate?.origem === 'account.quota-exhausted');
1495
1637
  }
1638
+ const promptOriginalPath = typeof despacho.promptOriginalPath === 'string' ? despacho.promptOriginalPath : despacho.promptPath;
1639
+ const promptOriginalSha = typeof despacho.promptOriginalSha256 === 'string' ? despacho.promptOriginalSha256 : despacho.promptSha256;
1496
1640
  const doBloco = (0, setup_1.configDoBloco)((0, setup_1.lerSetup)(raiz), thread.modo, fase);
1497
- const fallback = alvosDeFallback(doBloco, doBloco?.runtime ?? manifesto.runtime.adapter);
1641
+ const fallback = alvosDeFallback(doBloco, doBloco?.runtime ?? manifesto.runtime.adapter)
1642
+ .filter(f => (0, runtime_context_1.capacidadeDoRuntimeNoProjeto)(raiz, f.runtime).capaz);
1498
1643
  const politica = (0, runtime_profiles_1.politicaDeRotacao)(manifesto);
1499
1644
  const falha = sinalDoGate(gate, motivo);
1500
1645
  // I-33 (D12): o observador ja marca o perfil no caminho terminal; remarcar empurraria o prazo a cada retry.
@@ -1516,7 +1661,7 @@ function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTenta
1516
1661
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.perfilRotacionado, { fase, motivo: falhaAtual.motivo, origem: 'retry.rotacao',
1517
1662
  de: { runtime: atual.runtime, perfil: atual.perfil?.id ?? null },
1518
1663
  para: para ? { runtime: para.runtime, perfil: para.perfil?.id ?? null } : null,
1519
- evidencia: falhaAtual.trecho, razao, promptSha256: despacho.promptSha256, modo: thread.modo,
1664
+ evidencia: falhaAtual.trecho, razao, promptSha256: promptOriginalSha, modo: thread.modo,
1520
1665
  autorizadoPor: `politica de retry da I-33 (D5), bloco sem pausa ou delegado no modo ${thread.modo}` });
1521
1666
  };
1522
1667
  for (;;) {
@@ -1525,11 +1670,11 @@ function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTenta
1525
1670
  break;
1526
1671
  emitir(alvo, alvo.runtime === atual.runtime ? 'proximo perfil ativo do mesmo runtime' : 'fallback de runtime pela ordem do bloco');
1527
1672
  const mudouRuntime = alvo.runtime !== runtime;
1528
- ultimo = redespachar(carregado, thread, fase, despacho.promptPath, despacho.promptSha256, {
1673
+ ultimo = redespachar(carregado, thread, fase, promptOriginalPath, promptOriginalSha, {
1529
1674
  runtime: alvo.runtime, perfil: alvo.perfil?.id ?? null,
1530
1675
  model: mudouRuntime ? alvo.model : typeof despacho.model === 'string' ? despacho.model : null,
1531
1676
  effort: mudouRuntime ? alvo.effort ?? (typeof despacho.effort === 'string' ? despacho.effort : null) : plano.effort,
1532
- origem: 'retry.rotacao', dryRun: opcoes.dryRun,
1677
+ origem: 'retry.rotacao', checkpoint, dryRun: opcoes.dryRun,
1533
1678
  });
1534
1679
  registrarTentativa(ultimo.ok, ultimo.detalhe);
1535
1680
  tentativas += 1;
@@ -1565,14 +1710,16 @@ function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTenta
1565
1710
  emitir(null, `nenhum perfil ativo em ${runtimes.join(', ')}: fila duravel ate ${liberaEm}`);
1566
1711
  if (opcoes.dryRun)
1567
1712
  return { ...vazio, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.entrariaNaFila(liberaEm)) };
1568
- const pedido = (0, ratelimit_1.enfileirar)(carregado, { thread: thread.id, fase, slug: typeof despacho.slug === 'string' ? despacho.slug : (0, phase_1.slugDaSessao)(thread, fase),
1569
- promptPath: despacho.promptPath, promptSha256: despacho.promptSha256,
1713
+ let pedido = (0, ratelimit_1.enfileirar)(carregado, { thread: thread.id, fase, slug: typeof despacho.slug === 'string' ? despacho.slug : (0, phase_1.slugDaSessao)(thread, fase),
1714
+ promptPath: promptOriginalPath, promptSha256: promptOriginalSha,
1570
1715
  cwd: typeof despacho.cwd === 'string' ? despacho.cwd : thread.worktree ?? raiz,
1571
1716
  model: typeof despacho.model === 'string' ? despacho.model : null, effort: typeof despacho.effort === 'string' ? despacho.effort : null,
1572
1717
  sinal: { resetEm: prazo, fonte: prazo ? 'iso' : 'sem-horario', trecho: falhaAtual.trecho },
1573
1718
  detalhe: `${falhaAtual.motivo}: nenhum perfil ativo em ${runtimes.join(', ')}`, runtime, perfil: null, motivo: falhaAtual.motivo });
1719
+ if (checkpoint)
1720
+ pedido = (0, ratelimit_1.gravarPedido)(raiz, { ...pedido, checkpoint: true });
1574
1721
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.rateLimitEnfileirado, { fase, slug: pedido.slug, pedido: pedido.id, liberaEm: pedido.liberaEm,
1575
- janelaEstimada: pedido.janelaEstimada, motivo: falhaAtual.motivo, promptSha256: despacho.promptSha256,
1722
+ janelaEstimada: pedido.janelaEstimada, motivo: falhaAtual.motivo, promptSha256: promptOriginalSha, checkpoint,
1576
1723
  correcao: `ork retry resume (ou aguarde ate ${pedido.liberaEm})` });
1577
1724
  registrarTentativa(true, `fila duravel: pedido ${pedido.id} libera em ${pedido.liberaEm}`);
1578
1725
  return { ...vazio, executada: true, fila: [pedido], redespacho: ultimo, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.pedidoAte(pedido.id, pedido.liberaEm)) };
@@ -1625,14 +1772,16 @@ function destinosQueRecusaramOModelo(eventos, fase) {
1625
1772
  */
1626
1773
  function proximoDestinoDoModelo(raiz, runtime, model, fallback, recusados) {
1627
1774
  const store = (0, runtime_profiles_1.lerPerfisComContas)(raiz);
1628
- const utilizavel = (p) => !['desativado', 'provider-pago', 'sem-auth'].includes(p.estado) && (0, runtime_profiles_1.perfilDisponivel)(p);
1629
- const mesmo = (0, runtime_profiles_1.perfisDoRuntime)(store, runtime).find(p => utilizavel(p) && !recusados.has(chaveDoModelo(runtime, p.id, model)));
1775
+ const mesmo = (0, runtime_context_1.capacidadeDoRuntimeNoProjeto)(raiz, runtime).capaz
1776
+ ? (0, runtime_profiles_1.perfisDisponiveis)(store, runtime).find(p => !recusados.has(chaveDoModelo(runtime, p.id, model))) : null;
1630
1777
  if (mesmo)
1631
1778
  return { runtime, perfil: (0, runtime_profiles_1.perfilDeDespacho)(mesmo), model, effort: null };
1632
1779
  for (const f of fallback) {
1780
+ if (!(0, runtime_context_1.capacidadeDoRuntimeNoProjeto)(raiz, f.runtime).capaz)
1781
+ continue;
1633
1782
  const perfis = (0, runtime_profiles_1.perfisDoRuntime)(store, f.runtime);
1634
1783
  if (perfis.length) {
1635
- const p = perfis.find(x => utilizavel(x) && !recusados.has(chaveDoModelo(f.runtime, x.id, f.model)));
1784
+ const p = (0, runtime_profiles_1.perfisDisponiveis)(store, f.runtime).find(x => !recusados.has(chaveDoModelo(f.runtime, x.id, f.model)));
1636
1785
  if (p)
1637
1786
  return { runtime: f.runtime, perfil: (0, runtime_profiles_1.perfilDeDespacho)(p), model: f.model, effort: f.effort ?? null };
1638
1787
  continue;
@@ -1697,7 +1846,8 @@ function trocarDestinoDoModelo(carregado, thread, plano, opcoes, vazio, registra
1697
1846
  }
1698
1847
  const recusados = new Set([...destinosQueRecusaramOModelo(eventos, fase), chaveDoModelo(runtime, perfil?.id ?? null, model)]);
1699
1848
  const doBloco = (0, setup_1.configDoBloco)((0, setup_1.lerSetup)(raiz), thread.modo, fase);
1700
- const fallback = alvosDeFallback(doBloco, doBloco?.runtime ?? manifesto.runtime.adapter);
1849
+ const fallback = alvosDeFallback(doBloco, doBloco?.runtime ?? manifesto.runtime.adapter)
1850
+ .filter(f => (0, runtime_context_1.capacidadeDoRuntimeNoProjeto)(raiz, f.runtime).capaz);
1701
1851
  let atual = { runtime, perfil, model };
1702
1852
  let tentativas = plano.tentativas;
1703
1853
  for (;;) {
@@ -1753,6 +1903,10 @@ function textoDoPlano(p) {
1753
1903
  linhas.push(m.tentativas(p.tentativas, p.limite));
1754
1904
  linhas.push(m.esforco(p.effort, p.effort !== p.effortAnterior ? p.effortAnterior : null));
1755
1905
  linhas.push(m.automatica(p.automatica));
1906
+ // RM-063 (F4): o degrau da escada de `runtime.unavailable`, ou o fim dela.
1907
+ const escada = p.escada;
1908
+ if (escada)
1909
+ linhas.push(escada.degrau && escada.tipo ? m.escada.noPlano(escada.degrau, m.escada.degraus[escada.tipo]) : m.escada.noPlanoEsgotada);
1756
1910
  if (p.bloqueio)
1757
1911
  linhas.push(m.bloqueio(p.bloqueio));
1758
1912
  linhas.push(m.razao((0, locale_1.remontar)(p.razao)));
@@ -1791,19 +1945,20 @@ function textoDoRetry(r) {
1791
1945
  }
1792
1946
  /** Texto de `ork retry resume`. */
1793
1947
  function textoDaRetomada(rs) {
1948
+ const m = (0, locale_1.msg)().retry.complementar;
1794
1949
  if (rs.length === 0) {
1795
- return 'Nenhum pedido da fila de rate limit com a janela liberada agora.';
1950
+ return m.retomadaVazia;
1796
1951
  }
1797
1952
  const linhas = [];
1798
1953
  for (const r of rs) {
1799
- linhas.push(`${r.pedido.id} thread ${r.pedido.thread} fase ${r.pedido.fase}`);
1800
- linhas.push(` playbook ${r.playbook}`);
1801
- linhas.push(` slug ${r.slug}`);
1802
- linhas.push(` retomada ${r.despachada ? `sim (sessao ${r.sessionId})` : 'nao'}`);
1954
+ linhas.push(m.retomadaCabecalho(r.pedido.id, r.pedido.thread, r.pedido.fase));
1955
+ linhas.push(m.playbook(r.playbook));
1956
+ linhas.push(m.slug(r.slug));
1957
+ linhas.push(m.retomada(r.despachada, r.sessionId));
1803
1958
  if (r.motivo)
1804
- linhas.push(` motivo ${r.motivo}`);
1805
- linhas.push(` detalhe ${(0, horario_1.localizarTexto)(r.detalhe)}`);
1806
- linhas.push(` estado ${r.pedido.estado}`);
1959
+ linhas.push(m.motivoRetomada(r.motivo));
1960
+ linhas.push(m.detalhe((0, horario_1.localizarTexto)(r.detalhe)));
1961
+ linhas.push(m.estado(m.estados[r.pedido.estado] ?? r.pedido.estado));
1807
1962
  }
1808
1963
  if (rs.some((r) => (0, horario_1.localizarTexto)(r.detalhe) !== r.detalhe))
1809
1964
  linhas.push((0, horario_1.legendaDoFuso)());