@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
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sessoesEmVooDoArco = exports.CONTRATO_FECHAMENTO = void 0;
4
+ exports.condicaoDeFechamento = condicaoDeFechamento;
5
+ exports.trabalhosDoArco = trabalhosDoArco;
6
+ exports.lerFechamento = lerFechamento;
7
+ exports.fecharSeDevido = fecharSeDevido;
8
+ exports.textoDaParada = textoDaParada;
9
+ /**
10
+ * RM-058, fatia N6 (D2, D6 e D8 da ork-rm058n6): o fechamento do arco por hora, por custo e por fila vazia.
11
+ *
12
+ * A tabela "Condição / Comportamento / Estado deixado para retomar" da página manda:
13
+ *
14
+ * - hora final, ou envelope expirado ou revogado: parar admissões e efeitos novos e encerrar as sessões em voo de modo
15
+ * controlado, deixando checkpoints, motivos de interrupção e as operações em voo para reconciliar;
16
+ * - fila vazia confirmada: encerrar cedo, sem abrir escopo novo, com o retrato das fontes e dos itens concluídos;
17
+ * - teto do arco: parar globalmente, sem retry nem troca de conta para contornar, com o consumo, as reservas em voo e a
18
+ * reconciliação pendente identificados.
19
+ *
20
+ * O teto em `sessoes` conta cada sessão na reserva: alcançado, nenhuma reserva nova passa (`noctum.orcamento.esgotado`, em
21
+ * qualquer conta), e o arco fecha quando a última sessão admitida acaba, porque pará-las não protege o teto, só joga
22
+ * trabalho fora (a hora final para as que passarem do fim). Em unidade contínua, o consumo segue enquanto a sessão roda:
23
+ * a leitura que alcança o teto fecha o arco e para as sessões em voo.
24
+ *
25
+ * As condições valem nesta ordem: revogado, hora, a parada da supervisão da N4 (RM-058, integração, D7 da
26
+ * ork-rm058integra; a parada pelo teto do arco fica com a regra do custo e, sem sessão admitida em voo e com o consumo
27
+ * abaixo do teto, fecha pela supervisão: N2 do CHECK 2), custo, fila vazia (D8). Revogado, hora, a parada e o teto em sessões não dependem da fila nem da
28
+ * medição, e nenhuma falha delas segura esse fechamento. Com uma condição, o fechamento grava primeiro o
29
+ * `encerrado` no log do arco (`encerrarArco`): dali em diante nenhuma reserva de despacho nem efeito passa, e nenhuma
30
+ * reserva devolvida reabre o arco. Só depois vêm o retrato do fechamento e o pedido de parada de cada sessão em voo, no
31
+ * registro próprio da N6 (`fechamento.jsonl`). A parada é pedida uma vez por sessão, pelo controle da conta dela (o
32
+ * `pararSessao` do núcleo no claude-bg); o codex fica `sem-controle`, porque parar uma sessão dele exige o controller
33
+ * vinculado (limite da N4). A reserva pendente para pelo id que a falha do runtime disse no ledger da thread, quando
34
+ * disse; sem ele, não há o que parar. No tique seguinte, a listagem do runtime confirma a parada, ou a deixa
35
+ * `nao-confirmada`. O retrato é gravado uma vez; se o processo cair entre o `encerrado` e o registro, o tique seguinte o
36
+ * grava.
37
+ *
38
+ * Subteto de conta ou runtime esgotado não fecha o arco: a reserva por aquela conta ou runtime é recusada, e trocar para
39
+ * outra conta admitida é da N4. Consumo com lacuna também não fecha por custo (o teto não se prova alcançado); a admissão
40
+ * já recusa por falta de medida.
41
+ *
42
+ * Interfaces para as fatias que correm em paralelo (D6): a parada (`parar`) e a listagem das sessões (`listarSessoes`)
43
+ * são injetáveis; a N4 pluga o controle dela aí. Nada aqui despacha.
44
+ */
45
+ const horario_1 = require("./horario");
46
+ const ledger_1 = require("./ledger");
47
+ const master_1 = require("./master");
48
+ const noctum_arco_1 = require("./noctum-arco");
49
+ const noctum_envelope_1 = require("./noctum-envelope");
50
+ const noctum_fila_1 = require("./noctum-fila");
51
+ const noctum_medicao_1 = require("./noctum-medicao");
52
+ const noctum_registro_1 = require("./noctum-registro");
53
+ const noctum_supervisao_1 = require("./noctum-supervisao");
54
+ const noctum_sessoes_em_voo_1 = require("./noctum-sessoes-em-voo");
55
+ Object.defineProperty(exports, "sessoesEmVooDoArco", { enumerable: true, get: function () { return noctum_sessoes_em_voo_1.sessoesEmVooDoArco; } });
56
+ const sessoes_contas_1 = require("./sessoes-contas");
57
+ const sessoes_1 = require("./sessoes");
58
+ const thread_1 = require("./thread");
59
+ const util_1 = require("./util");
60
+ exports.CONTRATO_FECHAMENTO = 'ork.noctum-fechamento/v1';
61
+ /**
62
+ * A condição de fechamento no instante dado, pura, na ordem da D8. `null` quando o arco segue (ou nunca foi autorizado).
63
+ * O custo só fecha com o teto do arco provado alcançado: em `sessoes`, pelas reservas não recusadas e sem sessão admitida
64
+ * em voo (`emVoo`, as sessões e reservas pendentes que ainda podem rodar); em outra unidade, pelo consumo medido sem
65
+ * lacuna. A parada pelo teto do arco espera as sessões admitidas e, sem nenhuma em voo, fecha pelo custo com o consumo no
66
+ * teto, ou pela supervisão abaixo dele (a reserva devolvida, a emenda que subiu o teto depois da parada).
67
+ */
68
+ function condicaoDeFechamento(estado, fila, medicao, quando, emVoo = 0, parada = null) {
69
+ if (!estado || !estado.autorizadoPor || !estado.conteudo)
70
+ return null;
71
+ if (estado.encerramento)
72
+ return { motivo: estado.encerramento.motivo, detalhe: estado.encerramento.detalhe };
73
+ if (estado.situacao === 'revogado')
74
+ return { motivo: 'revogado', detalhe: 'o dono revogou o arco pelo ingresso autenticado' };
75
+ const fim = estado.conteudo.janela.fim;
76
+ if (Date.parse(quando) >= Date.parse(fim)) {
77
+ return { motivo: 'hora', detalhe: `o fim do envelope chegou (${(0, horario_1.formatarDataHora)(fim, { fuso: estado.conteudo.janela.fuso, locale: 'pt-BR' })}, ` +
78
+ `${estado.conteudo.janela.fuso}); nada o prorroga` };
79
+ }
80
+ // RM-058, integração (D7): a supervisão parou o arco (o vigia nunca encerra; quem encerra é o fechamento, por ela). A
81
+ // parada pelo teto do arco em sessões é a regra do custo logo abaixo: as sessões admitidas terminam, e o arco fecha
82
+ // quando a última acaba (A1 do CHECK); fechar por ela pediria a parada de trabalho já contado no teto.
83
+ if (parada && parada.motivo !== 'teto-do-arco')
84
+ return { motivo: 'supervisao', detalhe: `a supervisão parou o arco (${parada.motivo}): ${parada.detalhe}` };
85
+ const teto = estado.conteudo.orcamento.arco;
86
+ if (teto.unidade === 'sessoes') {
87
+ // Cada sessão admitida já está contada no teto: o arco fecha quando a última acaba, não por cima dela.
88
+ if (estado.consumo.arco >= teto.valor && emVoo === 0) {
89
+ return { motivo: 'custo', detalhe: `o teto do arco é de ${teto.valor} sessoes e ${estado.consumo.arco} foram reservadas; nenhuma segue em voo` };
90
+ }
91
+ }
92
+ else if (medicao) {
93
+ const c = (0, noctum_medicao_1.consumoDoEscopoNaUnidade)(medicao, 'arco', teto.unidade);
94
+ if (c.valor !== null && Number.isFinite(c.valor) && c.valor >= teto.valor) {
95
+ return { motivo: 'custo', detalhe: `o teto do arco é de ${teto.valor} ${teto.unidade} e o consumo medido é ${(0, noctum_medicao_1.textoDoConsumo)(c)}` };
96
+ }
97
+ }
98
+ // N2 do CHECK 2: a parada pelo teto segue terminal com o consumo abaixo dele (a reserva devolvida, a emenda que subiu o teto
99
+ // depois da parada): sem sessão admitida em voo, o arco fecha pela supervisão, em vez de ficar parado e aberto até a hora.
100
+ if (parada && emVoo === 0) {
101
+ return { motivo: 'supervisao', detalhe: `a supervisão parou o arco (${parada.motivo}): ${parada.detalhe}; nenhuma sessão admitida segue em voo` };
102
+ }
103
+ if (estado.situacao === 'agendado')
104
+ return null;
105
+ if (fila?.situacao === 'vazia' && fila.decisao.acao === 'encerrar' && fila.decisao.motivo === 'fila-vazia') {
106
+ // A entrega registrada (`ship_done`) pode vir sem a prova do push; o relatório diz qual tem prova.
107
+ return { motivo: 'fila-vazia', detalhe: 'todo trabalho do envelope tem a entrega registrada (ship_done), fechou sem entrega ou depende ' +
108
+ 'de um que fechou sem entrega; nada sobra para este arco' };
109
+ }
110
+ return null;
111
+ }
112
+ /**
113
+ * RM-058, integração (T4, D8): as threads que este arco entregou (o `ship_done` da entrega dele, com o arco na evidência) e
114
+ * cujo MASTER por omissão a entrega dele ainda faz, como em `noctum-entrega.ts`: o envelope `v2`, o trabalho sem isolamento,
115
+ * a thread aberta e sem MASTER ratificado. A thread que não se lê não segura o fechamento: a fila já a mostra.
116
+ */
117
+ function mastersDevidos(raiz, estado, fila, sup) {
118
+ if (estado.conteudo?.contrato !== noctum_envelope_1.CONTRATO_ENVELOPE_V2)
119
+ return [];
120
+ const devidos = [];
121
+ for (const t of fila.trabalhos) {
122
+ if (t.estado !== 'entregue' || !t.thread || sup.isolados.has(t.id))
123
+ continue;
124
+ try {
125
+ const doArco = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, t.thread)).some(e => e.tipo === ledger_1.TIPOS_DE_EVENTO.shipConcluido &&
126
+ e.evidencia?.arco === estado.arco);
127
+ if (doArco && (0, thread_1.lerThread)(raiz, t.thread).status !== 'fechada' && !(0, master_1.masterRatificado)(raiz, t.thread))
128
+ devidos.push(t.thread);
129
+ }
130
+ catch { /* a leitura que falhou não prende o arco aberto */ }
131
+ }
132
+ return devidos;
133
+ }
134
+ const gitDoDisco = (cwd, args) => {
135
+ const r = (0, util_1.exec)('git', ['-C', cwd, ...args], undefined, 15_000);
136
+ return r.ok ? r.stdout.trim() : null;
137
+ };
138
+ /** As sessões vivas pelo `claude agents` e pelos rollouts de todas as contas que o `ork` conhece. */
139
+ function sessoesDoRuntime(raiz) {
140
+ try {
141
+ const l = (0, sessoes_contas_1.consultarContas)(raiz);
142
+ return { lidas: l.fontes.every(f => f.ok), vivas: new Set(l.sessoes.filter(s => s.viva && !(0, sessoes_contas_1.encerradaNaLista)(s)).map(s => s.sessionId)) };
143
+ }
144
+ catch {
145
+ return { lidas: false, vivas: new Set() };
146
+ }
147
+ }
148
+ /** O controle de produção: o claude-bg para pela conta dele; o codex não tem controle sem o controller vinculado. */
149
+ function pararPeloNucleo(raiz) {
150
+ return (s) => {
151
+ if (!s.sessionId)
152
+ return { ok: false, detalhe: 'sem id de sessão' };
153
+ const r = (0, sessoes_1.pararSessao)(s.sessionId, raiz);
154
+ return { ok: r.codigo === 0, detalhe: r.texto.slice(0, 300) };
155
+ };
156
+ }
157
+ function trabalhosNaRetomada(raiz, fila, git) {
158
+ return (fila?.trabalhos ?? []).map(t => {
159
+ let branch = null, ponta = null, arvoreLimpa = null;
160
+ if (t.thread) {
161
+ let wt = null;
162
+ try {
163
+ wt = (0, thread_1.lerThread)(raiz, t.thread).worktree ?? null;
164
+ }
165
+ catch {
166
+ wt = null;
167
+ }
168
+ if (wt) {
169
+ branch = git(wt, ['rev-parse', '--abbrev-ref', 'HEAD']);
170
+ ponta = git(wt, ['rev-parse', 'HEAD']);
171
+ const status = git(wt, ['status', '--porcelain']);
172
+ arvoreLimpa = status === null ? null : status.length === 0;
173
+ }
174
+ }
175
+ return { id: t.id, item: t.item, thread: t.thread, estado: t.estado, fase: t.fase, motivo: t.motivo, detalhe: t.detalhe,
176
+ entregueEm: t.entregueEm, branch, ponta, arvoreLimpa };
177
+ });
178
+ }
179
+ function instrucaoDeRetomada(arco, trabalhos, reservas, emVoo) {
180
+ const linhas = [`O arco ${arco} não reabre: o trabalho que sobrou volta num arco novo, com envelope vigente proposto por ` +
181
+ '`ork noctum propor` e autorizado pelo dono por ingresso autenticado.'];
182
+ if (reservas.length) {
183
+ linhas.push(`As reservas pendentes (${reservas.map(r => r.seq).join(', ')}) precisam ser reconciliadas antes do primeiro despacho do arco ` +
184
+ 'novo, pela N4 ou pelo dono: o runtime pode ter aberto a sessão, e nada deve ser despachado por cima dela.');
185
+ }
186
+ for (const t of trabalhos.filter(x => x.thread && x.estado !== 'entregue' && x.estado !== 'encerrado-sem-entrega')) {
187
+ linhas.push(`A thread ${t.thread} (${t.id}) retoma pelo passo do arco novo${t.fase ? `, na fase ${t.fase}` : ''}, pela prova mais adiantada` +
188
+ `${t.arvoreLimpa === false ? '; a árvore tem mudanças não commitadas, que a sessão seguinte confere' : ''}.`);
189
+ }
190
+ if (emVoo.some(s => s.runtime === 'codex' && s.sessionId)) {
191
+ linhas.push('A sessão do codex em voo não tem controle de parada sem o controller vinculado: confira-a antes do arco novo.');
192
+ }
193
+ linhas.push('Commit, push ou merge de resultado incerto nunca se repete às cegas: quem retoma reconcilia antes de agir.');
194
+ return linhas;
195
+ }
196
+ /**
197
+ * A classificação de cada trabalho como se o arco estivesse vigente. `montarFila` não classifica nada num arco expirado,
198
+ * revogado ou encerrado (nada é candidato), e o retrato do fechamento e o relatório precisam saber onde cada trabalho
199
+ * parou justamente nesses arcos. A decisão desta fila não vale para despachar: só a classificação é lida.
200
+ */
201
+ function trabalhosDoArco(fatos) {
202
+ const e = fatos.estado;
203
+ if (!e || !e.conteudo || !e.autorizadoPor || e.situacao === 'vigente')
204
+ return (0, noctum_fila_1.montarFila)(fatos);
205
+ return (0, noctum_fila_1.montarFila)({ ...fatos, estado: { ...e, situacao: 'vigente' } });
206
+ }
207
+ /** O retrato gravado e as paradas e conferências do registro do fechamento. */
208
+ function lerFechamento(raiz, arco) {
209
+ const linhas = (0, noctum_registro_1.lerRegistro)(raiz, arco, 'fechamento');
210
+ const fechado = linhas.find(l => l.evento.tipo === 'fechado')?.evento;
211
+ return {
212
+ retrato: fechado?.tipo === 'fechado' ? fechado.retrato : null,
213
+ paradas: linhas.filter(l => l.evento.tipo === 'parada_pedida').map(l => l.evento.parada),
214
+ conferencias: linhas.filter(l => l.evento.tipo === 'parada_conferida').map(l => l.evento.conferencia),
215
+ };
216
+ }
217
+ /** O retrato do fechamento: o consumo, a fila e o estado de retomada, lidos no instante dado e gravados uma vez. */
218
+ function gravarRetrato(carregado, arco, estado, encerramento, quando, o) {
219
+ const { raiz } = carregado;
220
+ let trabalhosDaFila = null;
221
+ try {
222
+ trabalhosDaFila = trabalhosDoArco((0, noctum_fila_1.fatosDaFila)(carregado, arco, { quando, maquina: o.maquina, lerReservas: o.lerReservas }));
223
+ }
224
+ catch (e) {
225
+ if (!(e instanceof noctum_envelope_1.RecusaDoArco))
226
+ throw e;
227
+ }
228
+ let consumo;
229
+ try {
230
+ const medicao = o.medir(raiz, estado, quando);
231
+ consumo = Object.fromEntries(noctum_envelope_1.UNIDADES.map(u => [u, (0, noctum_medicao_1.consumoDoEscopoNaUnidade)(medicao, 'arco', u)]));
232
+ }
233
+ catch (e) {
234
+ const lacuna = `a medição falhou no fechamento (${e.message.slice(0, 200)})`;
235
+ consumo = Object.fromEntries(noctum_envelope_1.UNIDADES.map(u => [u, { unidade: u, valor: null, lacunas: [lacuna], parcial: false, tetoSuperior: false,
236
+ sessoes: 0 }]));
237
+ }
238
+ const emVoo = (0, noctum_sessoes_em_voo_1.sessoesEmVooDoArco)(raiz, estado);
239
+ const trabalhos = trabalhosNaRetomada(raiz, trabalhosDaFila, o.git);
240
+ const reservasEmVoo = estado.despachos.filter(d => d.desfecho === 'pendente')
241
+ .map(d => ({ seq: d.seq, trabalho: d.trabalho, thread: d.threadDespachada ?? d.thread }));
242
+ const ditaNaFalha = new Map(emVoo.filter(s => s.daReservaPendente && s.sessionId).map(s => [s.seq, s.sessionId]));
243
+ const retrato = {
244
+ contrato: exports.CONTRATO_FECHAMENTO, arco, motivo: encerramento.motivo, detalhe: encerramento.detalhe, em: encerramento.em,
245
+ versao: encerramento.versao, envelopeSha256: encerramento.envelopeSha256, consumo,
246
+ // A situação da fila como se o arco seguisse: a do arco encerrado é sempre vazia, e não diz onde o trabalho parou.
247
+ fila: { situacao: trabalhosDaFila?.situacao ?? null,
248
+ lacunas: trabalhosDaFila ? trabalhosDaFila.lacunas : ['a fila do arco não pôde ser lida no fechamento'], lida: !!trabalhosDaFila },
249
+ retomada: { trabalhos, reservasEmVoo,
250
+ reconciliacaoPendente: [...reservasEmVoo.map(r => ditaNaFalha.has(r.seq)
251
+ ? `reserva ${r.seq} (${r.trabalho}): pendente, com a sessão ${ditaNaFalha.get(r.seq)} dita na falha do runtime`
252
+ : `reserva ${r.seq} (${r.trabalho}): pendente, sem id de sessão`),
253
+ ...emVoo.filter(s => s.sessionId && !s.daReservaPendente).map(s => `sessão ${s.sessionId} (${s.trabalho}): em voo no fechamento`)],
254
+ instrucao: instrucaoDeRetomada(arco, trabalhos, reservasEmVoo, emVoo) },
255
+ };
256
+ (0, noctum_registro_1.comRegistro)(raiz, arco, 'fechamento', (linhas, anexar) => {
257
+ if (!linhas.some(l => l.evento.tipo === 'fechado'))
258
+ anexar({ tipo: 'fechado', retrato }, quando);
259
+ }, { esperarMs: 5_000 });
260
+ }
261
+ /**
262
+ * Fecha o arco se alguma condição vale, e confirma as paradas pendentes de um arco já fechado. Idempotente: o segundo
263
+ * chamado não grava outro retrato nem pede a mesma parada de novo. Lança só o erro que não é recusa tipada do arco.
264
+ */
265
+ function fecharSeDevido(carregado, arco, opcoes = {}) {
266
+ const quando = opcoes.quando ?? new Date().toISOString();
267
+ const { raiz } = carregado;
268
+ const nada = (detalhe) => ({ fechado: false, agora: false, motivo: null, detalhe, retrato: null, paradas: [], conferencias: [] });
269
+ let estado;
270
+ try {
271
+ estado = (0, noctum_arco_1.lerArco)(raiz, arco, quando);
272
+ }
273
+ catch (e) {
274
+ if (e instanceof noctum_envelope_1.RecusaDoArco)
275
+ return nada(e.message);
276
+ throw e;
277
+ }
278
+ if (!estado)
279
+ return nada(`o arco ${arco} não tem proposta`);
280
+ if (!estado.autorizadoPor || !estado.conteudo)
281
+ return nada(`o arco ${arco} nunca foi autorizado pelo dono`);
282
+ const medir = opcoes.medir ?? ((r, e, q) => (0, noctum_medicao_1.medirArco)(r, e, { quando: q }));
283
+ const git = opcoes.git ?? gitDoDisco;
284
+ const parar = opcoes.parar ?? pararPeloNucleo(raiz);
285
+ const listar = opcoes.listarSessoes ?? (() => sessoesDoRuntime(raiz));
286
+ let agora = false;
287
+ if (!estado.encerramento) {
288
+ const emVooAgora = (0, noctum_sessoes_em_voo_1.sessoesEmVooDoArco)(raiz, estado).length;
289
+ // RM-058, integração (D7): a parada da supervisão; o log dela que não se lê não segura o fechamento pelas outras condições.
290
+ let sup = null;
291
+ try {
292
+ sup = (0, noctum_supervisao_1.lerSupervisao)(raiz, arco);
293
+ }
294
+ catch (e) {
295
+ if (!(e instanceof noctum_supervisao_1.RecusaDaSupervisao))
296
+ throw e;
297
+ }
298
+ const parada = sup?.parada ?? null;
299
+ // Revogado, hora, a parada e o teto em sessões vêm primeiro e sem a fila nem a medição: nenhuma falha delas segura esse fechamento.
300
+ let condicao = condicaoDeFechamento(estado, null, null, quando, emVooAgora, parada);
301
+ let falhaDaMedicao = '';
302
+ if (!condicao) {
303
+ let fila = null;
304
+ try {
305
+ fila = (0, noctum_fila_1.montarFila)((0, noctum_fila_1.fatosDaFila)(carregado, arco, { quando, maquina: opcoes.maquina, lerReservas: opcoes.lerReservas }));
306
+ }
307
+ catch (e) {
308
+ if (!(e instanceof noctum_envelope_1.RecusaDoArco))
309
+ throw e;
310
+ }
311
+ let medicao = null;
312
+ if (estado.conteudo.orcamento.arco.unidade !== 'sessoes') {
313
+ // A medição que falha não prova o teto alcançado: o custo não fecha, e a fila vazia ainda pode fechar.
314
+ try {
315
+ medicao = medir(raiz, estado, quando);
316
+ }
317
+ catch (e) {
318
+ falhaDaMedicao = `; a medição falhou (${e.message.slice(0, 200)})`;
319
+ }
320
+ }
321
+ condicao = condicaoDeFechamento(estado, fila, medicao, quando, emVooAgora, parada);
322
+ // RM-058, integração (T4, D8): a fila vazia não fecha o arco por cima do MASTER por omissão que a entrega dele ainda
323
+ // deve; o passo seguinte o faz, e o fechamento vem depois. A hora, a parada e o teto fecharam antes, sem esperar.
324
+ const devidos = condicao?.motivo === 'fila-vazia' && fila && sup ? mastersDevidos(raiz, estado, fila, sup) : [];
325
+ if (devidos.length) {
326
+ return nada(`o arco segue: a fila está vazia, mas a entrega do arco ainda faz o MASTER por omissão de ${devidos.join(', ')}`);
327
+ }
328
+ }
329
+ if (!condicao)
330
+ return nada(`o arco segue: nenhuma condição de fechamento vale agora${falhaDaMedicao}`);
331
+ // O terminal primeiro: daqui em diante nenhum despacho nem efeito passa.
332
+ estado = (0, noctum_arco_1.encerrarArco)(raiz, arco, condicao, quando);
333
+ agora = true;
334
+ }
335
+ const encerramento = estado.encerramento;
336
+ // O retrato do fechamento, uma vez: se o processo caiu entre o encerrado e o registro, o tique seguinte o grava.
337
+ if (!lerFechamento(raiz, arco).retrato)
338
+ gravarRetrato(carregado, arco, estado, encerramento, quando, { ...opcoes, medir, git });
339
+ // Pede a parada de cada sessão em voo uma vez, e confere as pedidas antes; tudo sob a trava do registro do fechamento.
340
+ const atual = (0, noctum_arco_1.lerArco)(raiz, arco, quando) ?? estado;
341
+ const emVoo = (0, noctum_sessoes_em_voo_1.sessoesEmVooDoArco)(raiz, atual);
342
+ const novas = [], conferidas = [];
343
+ (0, noctum_registro_1.comRegistro)(raiz, arco, 'fechamento', (linhas, anexar) => {
344
+ const pedidas = linhas.filter(l => l.evento.tipo === 'parada_pedida').map(l => l.evento.parada);
345
+ const jaConferidas = new Set(linhas.filter(l => l.evento.tipo === 'parada_conferida')
346
+ .map(l => l.evento.conferencia.sessionId));
347
+ const aConferir = pedidas.filter(p => p.resultado === 'pedida' && p.sessionId && !jaConferidas.has(p.sessionId));
348
+ if (aConferir.length && !agora) {
349
+ const lista = listar();
350
+ if (lista.lidas) {
351
+ for (const p of aConferir) {
352
+ const conferencia = { sessionId: p.sessionId, confirmada: !lista.vivas.has(p.sessionId),
353
+ detalhe: lista.vivas.has(p.sessionId) ? 'a sessão segue viva na listagem do runtime depois do pedido de parada'
354
+ : 'a sessão não aparece viva na listagem do runtime' };
355
+ anexar({ tipo: 'parada_conferida', conferencia }, quando);
356
+ conferidas.push(conferencia);
357
+ }
358
+ }
359
+ }
360
+ const chave = (s) => s.sessionId ?? `reserva:${s.seq}`;
361
+ const jaPedidas = new Set(pedidas.map(chave));
362
+ for (const s of emVoo.filter(x => !jaPedidas.has(chave(x)))) {
363
+ let resultado, detalhe;
364
+ if (!s.sessionId) {
365
+ resultado = 'sem-id';
366
+ detalhe = 'reserva pendente: a sessão pode ter aberto sem id, e não há o que parar';
367
+ }
368
+ else if (s.runtime !== 'claude-bg') {
369
+ resultado = 'sem-controle';
370
+ detalhe = 'parar a sessão do codex exige o controller vinculado';
371
+ }
372
+ else {
373
+ let r;
374
+ try {
375
+ r = parar(s);
376
+ }
377
+ catch (e) {
378
+ r = { ok: false, detalhe: e.message.slice(0, 300) };
379
+ }
380
+ resultado = r.ok ? 'pedida' : 'falhou';
381
+ detalhe = r.detalhe || (r.ok ? 'o runtime aceitou o pedido de parada' : 'o runtime não aceitou o pedido de parada');
382
+ }
383
+ const parada = { seq: s.seq, sessionId: s.sessionId, trabalho: s.trabalho, thread: s.thread, runtime: s.runtime,
384
+ conta: s.conta, resultado, detalhe };
385
+ anexar({ tipo: 'parada_pedida', parada }, quando);
386
+ novas.push(parada);
387
+ }
388
+ }, { esperarMs: 5_000 });
389
+ const registro = lerFechamento(raiz, arco);
390
+ return { fechado: true, agora, motivo: encerramento.motivo, detalhe: encerramento.detalhe, retrato: registro.retrato,
391
+ paradas: registro.paradas, conferencias: registro.conferencias };
392
+ }
393
+ /** O que cada desfecho da parada quer dizer para o dono, sem o código. */
394
+ const PARADA_EM_TEXTO = Object.freeze({
395
+ 'sem-id': () => 'reserva pendente sem id de sessão, nada a parar; reconciliar antes do arco novo',
396
+ 'sem-controle': (p) => `sem controle de parada no ${p.runtime}; conferir a sessão antes do arco novo`,
397
+ falhou: (p) => `o pedido de parada falhou (${p.detalhe})`,
398
+ });
399
+ /** Uma linha por parada, para o retrato e o relatório. */
400
+ function textoDaParada(p, conferencias) {
401
+ const c = p.sessionId ? conferencias.find(x => x.sessionId === p.sessionId) : undefined;
402
+ const situacao = p.resultado !== 'pedida' ? PARADA_EM_TEXTO[p.resultado](p) : !c ? 'parada pedida, sem conferência ainda'
403
+ : c.confirmada ? 'parada confirmada' : 'parada não confirmada';
404
+ return `${p.sessionId ?? `reserva ${p.seq}`} (${p.trabalho}, ${p.runtime}): ${situacao}`;
405
+ }
@@ -22,6 +22,11 @@ exports.fatosDaFila = fatosDaFila;
22
22
  * id) deixa o trabalho na fila, e o despacho seguinte sai por outra conta. Fechar o arco e o relatório são da N6.
23
23
  *
24
24
  * `fatosDaFila` relê o disco a cada chamada; `montarFila` é pura sobre os fatos e o instante. Nada aqui despacha nem grava.
25
+ *
26
+ * RM-058, fatia N4 (D8 e D21 da ork-rm058n4): a fila respeita, quando vem, o que a supervisão do arco decidiu. O trabalho
27
+ * isolado não sai sozinho neste arco; o trabalho bloqueado para a N4 sem reserva pendente (a falha com id antes do primeiro
28
+ * despacho, o passo de retomar, o fim de turno sem resultado e o que ficou sem passo depois da sessão morta) volta à fila
29
+ * na fase da retomada que o vigia autorizou. A reserva pendente nunca é sobreposta. Sem a supervisão, nada muda.
25
30
  */
26
31
  const roadmap_reservas_1 = require("./roadmap-reservas");
27
32
  const branch_de_estado_1 = require("./branch-de-estado");
@@ -69,6 +74,13 @@ function classificar(t, posicao, f, fatos, entregues, semSaida, estado) {
69
74
  const base = { id: t.id, item: t.item, prioridade: t.prioridade, posicao, thread: null, fase: null,
70
75
  motivo: null, entregueEm: null };
71
76
  const bloqueado = (motivo, detalhe) => ({ ...base, estado: 'bloqueado', motivo, detalhe });
77
+ // N3: a entrega em outra máquina do arco vale aqui, até sem thread nesta raiz.
78
+ const naRede = fatos.coordenacao?.entregues.get(t.id);
79
+ if (naRede)
80
+ return { ...base, thread: f?.threads[0]?.id ?? null, estado: 'entregue', entregueEm: naRede, detalhe: 'entregue em outra máquina do arco' };
81
+ if (fatos.coordenacao?.encerrados?.has(t.id)) {
82
+ return { ...base, thread: f?.threads[0]?.id ?? null, estado: 'encerrado-sem-entrega', detalhe: 'encerrado sem entrega em outra máquina do arco' };
83
+ }
72
84
  if (!f)
73
85
  return bloqueado('thread-ilegivel', 'o trabalho não foi lido');
74
86
  if (f.ilegivel)
@@ -86,6 +98,10 @@ function classificar(t, posicao, f, fatos, entregues, semSaida, estado) {
86
98
  return { ...base, estado: 'entregue', entregueEm: f.entregueEm, detalhe: `ship_done da thread ${th.id}` };
87
99
  if (th && th.status === 'fechada')
88
100
  return { ...base, estado: 'encerrado-sem-entrega', detalhe: `a thread ${th.id} fechou sem ship_done` };
101
+ // RM-058 N4 (D16): o trabalho isolado pela supervisão não sai sozinho neste arco, nem com uma sessão de fora rodando nele.
102
+ const isolado = fatos.supervisao?.isolados.get(t.id);
103
+ if (isolado !== undefined)
104
+ return bloqueado('isolado', isolado);
89
105
  if (th && f.passo?.conduzida)
90
106
  return { ...base, estado: 'em-curso', detalhe: `a thread ${th.id} está sendo conduzida agora` };
91
107
  const mortas = t.dependeDe.filter(d => semSaida.has(d));
@@ -95,6 +111,9 @@ function classificar(t, posicao, f, fatos, entregues, semSaida, estado) {
95
111
  const faltam = t.dependeDe.filter(d => !entregues.has(d));
96
112
  if (faltam.length)
97
113
  return bloqueado('dependencia', `depende de ${faltam.join(', ')}, ainda não entregue(s)`);
114
+ if (fatos.coordenacao && !fatos.coordenacao.trabalhos.has(t.id)) {
115
+ return bloqueado('sem-ordem', 'o trabalho não tem ordem aceita desta máquina no ramo de coordenação do arco');
116
+ }
98
117
  if (fatos.reservas.leitura === 'sem-copia')
99
118
  return bloqueado('reserva-sem-leitura', 'esta máquina não tem cópia da branch de reservas');
100
119
  const reserva = fatos.reservas.porItem.get(t.item);
@@ -113,6 +132,12 @@ function classificar(t, posicao, f, fatos, entregues, semSaida, estado) {
113
132
  if (erros >= exports.ERROS_SEGUIDOS_QUE_BLOQUEIAM) {
114
133
  return bloqueado('erro-repetido', `os ${erros} últimos despachos falharam no núcleo antes de lançar; quem decide é a N4 ou o dono`);
115
134
  }
135
+ // RM-058 N4 (D8): o bloqueio que a N2 deixou para a N4 vira a retomada que o vigia autorizou, na fase dela.
136
+ const retomada = fatos.supervisao?.retomadas.get(t.id);
137
+ const paraAN4 = (motivo, detalhe) => retomada
138
+ ? { ...base, estado: 'despachavel', fase: retomada.fase,
139
+ detalhe: `retomada autorizada pela supervisão (tentativa ${retomada.tentativa}, ${retomada.motivo}) no lugar de: ${detalhe}` }
140
+ : bloqueado(motivo, detalhe);
116
141
  if (!th) {
117
142
  // A4 do CHECK: abrir a thread num projeto que não deixa criar #Auto falharia toda noite; o arco nem tenta.
118
143
  if (!fatos.modosPermitidos.includes('auto'))
@@ -128,7 +153,7 @@ function classificar(t, posicao, f, fatos, entregues, semSaida, estado) {
128
153
  if (!f.despachada) {
129
154
  // B1 da rodada 2: a falha disse o id da sessão, que pode estar aberta; despachar de novo abriria outra.
130
155
  if (f.despachoFalho)
131
- return bloqueado('retomada', `o despacho da thread ${th.id} falhou depois de o runtime dizer o id da sessão; a retomada é da N4`);
156
+ return paraAN4('retomada', `o despacho da thread ${th.id} falhou depois de o runtime dizer o id da sessão; a retomada é da N4`);
132
157
  return { ...base, estado: 'despachavel', fase: th.faseAtual, detalhe: `a thread ${th.id} nunca foi despachada` };
133
158
  }
134
159
  const passo = f.passo;
@@ -138,12 +163,12 @@ function classificar(t, posicao, f, fatos, entregues, semSaida, estado) {
138
163
  return { ...base, estado: 'despachavel', fase: passo.fase, detalhe: passo.porque };
139
164
  }
140
165
  if (passo?.acao === 'retomar')
141
- return bloqueado('retomada', `${passo.porque}; a retomada é da N4`);
166
+ return paraAN4('retomada', `${passo.porque}; a retomada é da N4`);
142
167
  if (f.espera?.tipo === 'stop-sem-resultado')
143
- return bloqueado('fim-de-turno-sem-resultado', 'o turno acabou sem o resultado da fase; quem decide é a N4');
168
+ return paraAN4('fim-de-turno-sem-resultado', 'o turno acabou sem o resultado da fase; quem decide é a N4');
144
169
  if (f.espera?.tipo === 'concluida')
145
170
  return { ...base, estado: 'aguardando-entrega', detalhe: `${passo?.porque ?? 'fase concluída'}; a entrega é da N5` };
146
- return bloqueado('sem-passo', passo?.porque ?? 'nenhum passo do condutor para a thread');
171
+ return paraAN4('sem-passo', passo?.porque ?? 'nenhum passo do condutor para a thread');
147
172
  }
148
173
  /** O último progresso do arco: a autorização, um despacho ou uma entrega. O backoff conta a partir dele. */
149
174
  function ultimoProgresso(estado, trabalhos) {
@@ -165,20 +190,28 @@ function montarFila(fatos) {
165
190
  return vazia('fonte-indisponivel', { acao: 'aguardar', motivo: 'sem-autorizacao', ate: daqui(exports.CADENCIA_MS) }, ['o arco não tem envelope autorizado']);
166
191
  }
167
192
  const conteudo = estado.conteudo;
168
- if (estado.situacao === 'revogado' || estado.situacao === 'expirado')
193
+ // RM-058 N6: o arco encerrado (hora, custo ou fila vazia) também acabou: nada é candidato.
194
+ if (estado.situacao === 'revogado' || estado.situacao === 'expirado' || estado.situacao === 'encerrado') {
169
195
  return vazia('vazia', { acao: 'encerrar', motivo: 'arco-encerrado' });
196
+ }
170
197
  if (estado.situacao === 'agendado')
171
198
  return vazia('bloqueada', { acao: 'aguardar', motivo: 'agendado', ate: conteudo.janela.inicio });
172
199
  if (!(0, noctum_envelope_1.envelopeComTrabalhos)(conteudo)) {
173
200
  return vazia('fonte-indisponivel', { acao: 'aguardar', motivo: 'fonte-indisponivel', ate: daqui(exports.CADENCIA_MS, conteudo.janela.fim) }, ['o envelope vigente é v1, sem lista de trabalhos']);
174
201
  }
175
- // Primeiro quem já foi entregue, para as dependências; depois cada trabalho.
202
+ // Primeiro quem já foi entregue, para as dependências (aqui ou, no arco entre máquinas, em outra); depois cada trabalho.
176
203
  const entregues = new Set(conteudo.trabalhos.filter(t => {
177
204
  const f = fatos.porTrabalho.get(t.id);
178
- return !!f && f.threads.length === 1 && !!f.entregueEm && f.threads[0].roadmap === t.item;
205
+ return fatos.coordenacao?.entregues.has(t.id) || (!!f && f.threads.length === 1 && !!f.entregueEm && f.threads[0].roadmap === t.item);
179
206
  }).map(t => t.id));
180
- // S7 do CHECK: quem fechou sem entrega nunca mais entrega neste arco, nem quem depende dele, de qualquer distância.
207
+ // S7 do CHECK: quem fechou sem entrega nunca mais entrega neste arco, nem quem depende dele, de qualquer distância. No arco
208
+ // entre máquinas (B1 e S1 da rodada 3 da ork-rm058n3), a rede decide antes da thread local: o entregue lá nunca fica sem
209
+ // saída por uma thread antiga fechada aqui, e o encerrado lá fica sem saída aqui também.
181
210
  const semSaida = new Set(conteudo.trabalhos.filter(t => {
211
+ if (fatos.coordenacao?.entregues.has(t.id))
212
+ return false;
213
+ if (fatos.coordenacao?.encerrados?.has(t.id))
214
+ return true;
182
215
  const f = fatos.porTrabalho.get(t.id);
183
216
  return !!f && f.threads.length === 1 && !f.entregueEm && f.threads[0].status === 'fechada' && f.threads[0].roadmap === t.item;
184
217
  }).map(t => t.id));
@@ -220,7 +253,8 @@ function fatosDaFila(carregado, arco, opcoes = {}) {
220
253
  ? { leitura: 'sem-copia', reservas: [] }
221
254
  : { leitura: 'copia-local', reservas: (0, roadmap_reservas_1.reservasLocais)(raiz) }))();
222
255
  const fatos = { arco, quando, maquina, estado, porTrabalho: new Map(), threadsIlegiveis: [],
223
- modosPermitidos: carregado.manifesto.conduction.allowed_modes,
256
+ modosPermitidos: carregado.manifesto.conduction.allowed_modes, ...(opcoes.coordenacao ? { coordenacao: opcoes.coordenacao } : {}),
257
+ ...(opcoes.supervisao ? { supervisao: opcoes.supervisao } : {}),
224
258
  reservas: { leitura: lidas.leitura, porItem: new Map(lidas.reservas.map(r => [r.item, { maquina: r.maquina, thread: r.thread }])) } };
225
259
  if (!estado?.conteudo || !(0, noctum_envelope_1.envelopeComTrabalhos)(estado.conteudo))
226
260
  return fatos;