@orkastery/cli 0.5.6 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +37 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +123 -9
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/adapters/grok-events.js +227 -0
  105. package/dist/adapters/grok-mcp-servidor.js +612 -0
  106. package/dist/adapters/grok-mcp.js +178 -0
  107. package/dist/adapters/grok.js +686 -0
  108. package/dist/agendador-cpu.js +92 -0
  109. package/dist/atualizar-branch.js +245 -0
  110. package/dist/auditoria.js +13 -11
  111. package/dist/auditrun.js +51 -46
  112. package/dist/autorizacao-duravel.js +327 -0
  113. package/dist/board.js +94 -40
  114. package/dist/branch-de-estado.js +23 -10
  115. package/dist/busca-semantica.js +7 -5
  116. package/dist/catalogo.js +2 -1
  117. package/dist/changelog-reconciliacao.js +290 -0
  118. package/dist/check-agil.js +528 -0
  119. package/dist/check-modo.js +41 -0
  120. package/dist/check-paralelo.js +238 -0
  121. package/dist/ci.js +248 -45
  122. package/dist/ciclos.js +8 -6
  123. package/dist/claim-lint.js +12 -8
  124. package/dist/claims-conferir.js +47 -39
  125. package/dist/claims.js +10 -9
  126. package/dist/company-brain-client.js +10 -3
  127. package/dist/company-brain-migration.js +11 -5
  128. package/dist/conducao-batida.js +759 -0
  129. package/dist/conducao-sentinela.js +25 -8
  130. package/dist/conducao.js +89 -29
  131. package/dist/conhecimento-consulta.js +270 -0
  132. package/dist/conhecimento.js +111 -87
  133. package/dist/conta-esgotada.js +127 -0
  134. package/dist/dado-privado.js +816 -0
  135. package/dist/decisao-autonoma.js +5 -4
  136. package/dist/demo.js +14 -12
  137. package/dist/dependencias-da-worktree.js +25 -0
  138. package/dist/divida.js +38 -36
  139. package/dist/docs.js +89 -89
  140. package/dist/doctor-forja.js +343 -0
  141. package/dist/doctor-pulse-cron.js +113 -1
  142. package/dist/doctor.js +164 -6
  143. package/dist/dsn-da-memoria.js +417 -0
  144. package/dist/entrega-por-mod.js +503 -0
  145. package/dist/entrega-pr.js +154 -54
  146. package/dist/esgotamentos.js +13 -11
  147. package/dist/estado-thread.js +21 -18
  148. package/dist/evalrunner.js +35 -32
  149. package/dist/fabrica-batida.js +34 -21
  150. package/dist/fabrica-estado.js +33 -21
  151. package/dist/fix.js +21 -19
  152. package/dist/forja/adaptador.js +6 -0
  153. package/dist/forja/ambiente-de-ci.js +27 -0
  154. package/dist/forja/api.js +256 -0
  155. package/dist/forja/cache.js +89 -0
  156. package/dist/forja/cli.js +60 -0
  157. package/dist/forja/contrato.js +9 -0
  158. package/dist/forja/endereco.js +43 -0
  159. package/dist/forja/estado.js +22 -0
  160. package/dist/forja/executor.js +73 -0
  161. package/dist/forja/github/ci.js +95 -0
  162. package/dist/forja/github/dono-da-rede.js +18 -0
  163. package/dist/forja/github/metadados.js +15 -0
  164. package/dist/forja/github/pedidos.js +200 -0
  165. package/dist/forja/gitlab/ci.js +141 -0
  166. package/dist/forja/gitlab/consultas.js +59 -0
  167. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  168. package/dist/forja/gitlab/metadados.js +15 -0
  169. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  170. package/dist/forja/gitlab/pedidos.js +141 -0
  171. package/dist/forja/produtor.js +32 -0
  172. package/dist/forja/registro.js +31 -0
  173. package/dist/forja/resolver.js +121 -0
  174. package/dist/forja/texto.js +13 -0
  175. package/dist/forja/versao.js +71 -0
  176. package/dist/forja.js +123 -80
  177. package/dist/handoff.js +23 -13
  178. package/dist/hitl-contract.js +46 -43
  179. package/dist/hitl-curto.js +37 -25
  180. package/dist/hitl-gates.js +13 -11
  181. package/dist/hitl-local-receipt.js +51 -0
  182. package/dist/hitl-local.js +11 -2
  183. package/dist/hitl-lock.js +5 -11
  184. package/dist/hitl-public-receipt.js +11 -0
  185. package/dist/hitl-resumo.js +44 -1
  186. package/dist/hitl-sessions.js +62 -9
  187. package/dist/hitl-texto-livre.js +7 -4
  188. package/dist/hitl.js +34 -31
  189. package/dist/horario.js +20 -1
  190. package/dist/hosts.js +104 -134
  191. package/dist/index.js +864 -554
  192. package/dist/indice-vetorial.js +14 -12
  193. package/dist/init.js +11 -2
  194. package/dist/integracoes-locais.js +4 -0
  195. package/dist/intelligence-graph-cli.js +123 -69
  196. package/dist/intelligence-graph-query.js +37 -22
  197. package/dist/leases.js +19 -18
  198. package/dist/ledger-stats.js +17 -16
  199. package/dist/ledger.js +31 -1
  200. package/dist/licoes.js +12 -11
  201. package/dist/locale-accounts.js +228 -0
  202. package/dist/locale-adapter.js +291 -0
  203. package/dist/locale-ajuda.js +86 -10
  204. package/dist/locale-audit.js +199 -0
  205. package/dist/locale-claims.js +213 -0
  206. package/dist/locale-conducao.js +138 -0
  207. package/dist/locale-conhecimento.js +181 -0
  208. package/dist/locale-decisao.js +205 -0
  209. package/dist/locale-docs.js +230 -0
  210. package/dist/locale-estado.js +101 -0
  211. package/dist/locale-forja.js +288 -0
  212. package/dist/locale-gerados.js +5 -0
  213. package/dist/locale-grafo.js +129 -0
  214. package/dist/locale-master.js +83 -0
  215. package/dist/locale-network.js +524 -0
  216. package/dist/locale-operacao-restante.js +931 -0
  217. package/dist/locale-projetos.js +100 -0
  218. package/dist/locale-prompts.js +194 -0
  219. package/dist/locale-pulse.js +140 -2
  220. package/dist/locale-reservas.js +87 -0
  221. package/dist/locale-retry.js +183 -6
  222. package/dist/locale-security-scan.js +69 -0
  223. package/dist/locale-setup.js +192 -0
  224. package/dist/locale-ship.js +177 -66
  225. package/dist/locale-thread.js +149 -5
  226. package/dist/locale-verify.js +80 -4
  227. package/dist/locale-worktree.js +246 -0
  228. package/dist/locale.js +553 -9
  229. package/dist/maestro-runtime.js +22 -3
  230. package/dist/manifest.js +293 -12
  231. package/dist/maquina-ociosa.js +211 -0
  232. package/dist/maquina.js +10 -5
  233. package/dist/master-nota-local.js +200 -0
  234. package/dist/master-nota.js +10 -2
  235. package/dist/master.js +118 -41
  236. package/dist/mcp-conhecimento.js +52 -0
  237. package/dist/mcp-experiencia.js +26 -5
  238. package/dist/mcp-install.js +90 -15
  239. package/dist/mcp-noctum.js +101 -0
  240. package/dist/mcp-server.js +116 -22
  241. package/dist/mcp-ship-transporte.js +977 -0
  242. package/dist/mcp-ship.js +68 -24
  243. package/dist/mcp-transportes.js +17 -0
  244. package/dist/memoria.js +63 -58
  245. package/dist/merge-da-entrega.js +85 -0
  246. package/dist/modos-migracao.js +8 -6
  247. package/dist/modos.js +17 -18
  248. package/dist/network-roadmap.js +94 -54
  249. package/dist/noctum-aceite.js +929 -0
  250. package/dist/noctum-arco.js +540 -33
  251. package/dist/noctum-capacidade.js +3 -3
  252. package/dist/noctum-changelog.js +399 -0
  253. package/dist/noctum-cli.js +539 -0
  254. package/dist/noctum-coordenacao.js +1225 -0
  255. package/dist/noctum-entrega.js +1217 -0
  256. package/dist/noctum-envelope.js +253 -17
  257. package/dist/noctum-execucao.js +100 -24
  258. package/dist/noctum-fechamento.js +416 -0
  259. package/dist/noctum-fila.js +49 -10
  260. package/dist/noctum-guarda.js +333 -0
  261. package/dist/noctum-integracao.js +507 -0
  262. package/dist/noctum-maquinas.js +387 -0
  263. package/dist/noctum-medicao.js +450 -0
  264. package/dist/noctum-modo.js +390 -0
  265. package/dist/noctum-pergunta-canal.js +96 -0
  266. package/dist/noctum-pergunta.js +115 -0
  267. package/dist/noctum-provas.js +838 -0
  268. package/dist/noctum-reconciliacao.js +594 -0
  269. package/dist/noctum-rede.js +102 -0
  270. package/dist/noctum-registro.js +215 -0
  271. package/dist/noctum-relatorio.js +861 -0
  272. package/dist/noctum-resposta.js +207 -0
  273. package/dist/noctum-retomada-rede.js +71 -0
  274. package/dist/noctum-sessoes-em-voo.js +93 -0
  275. package/dist/noctum-supervisao.js +649 -0
  276. package/dist/noctum-terminal.js +459 -0
  277. package/dist/noctum-transporte.js +655 -0
  278. package/dist/noctum-vigia.js +679 -0
  279. package/dist/ocupacao.js +3 -1
  280. package/dist/onboarding.js +16 -5
  281. package/dist/orkmind.js +39 -23
  282. package/dist/orquestracao.js +31 -35
  283. package/dist/parado-no-condutor.js +160 -139
  284. package/dist/phase.js +96 -42
  285. package/dist/policies.js +33 -0
  286. package/dist/postura-local.js +11 -6
  287. package/dist/preflight.js +2 -1
  288. package/dist/procedencia.js +9 -14
  289. package/dist/projeto-alvo.js +59 -20
  290. package/dist/prompts.js +136 -42
  291. package/dist/prova-minima.js +5 -6
  292. package/dist/pulse-cadencia.js +5 -4
  293. package/dist/pulse-consentimento.js +53 -1
  294. package/dist/pulse-delivery.js +143 -27
  295. package/dist/pulse-resposta.js +368 -4
  296. package/dist/pulse.js +136 -3
  297. package/dist/ratelimit.js +13 -4
  298. package/dist/recall.js +14 -13
  299. package/dist/rede-adesao.js +13 -8
  300. package/dist/rede-forja.js +108 -24
  301. package/dist/rede-status.js +63 -45
  302. package/dist/rede.js +86 -46
  303. package/dist/retomada-checkpoint.js +101 -0
  304. package/dist/retry.js +326 -78
  305. package/dist/roadmap-reservas.js +32 -32
  306. package/dist/runtime-ambiente.js +5 -0
  307. package/dist/runtime-context.js +279 -85
  308. package/dist/runtime-escada.js +429 -0
  309. package/dist/runtime-profiles.js +130 -63
  310. package/dist/runtimes.js +42 -5
  311. package/dist/saida-segura.js +3 -2
  312. package/dist/security-scan/agil.js +366 -0
  313. package/dist/security-scan/cli.js +76 -0
  314. package/dist/security-scan/compare.js +149 -0
  315. package/dist/security-scan/config.js +93 -0
  316. package/dist/security-scan/detect.js +97 -0
  317. package/dist/security-scan/executor.js +196 -0
  318. package/dist/security-scan/guard.js +180 -0
  319. package/dist/security-scan/imagem-de-lint.js +96 -0
  320. package/dist/security-scan/normalize/actionlint.js +12 -0
  321. package/dist/security-scan/normalize/eslint.js +12 -0
  322. package/dist/security-scan/normalize/gitleaks.js +13 -0
  323. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  324. package/dist/security-scan/normalize/govulncheck.js +36 -0
  325. package/dist/security-scan/normalize/index.js +25 -0
  326. package/dist/security-scan/normalize/npm-audit.js +30 -0
  327. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  328. package/dist/security-scan/normalize/oxlint.js +51 -0
  329. package/dist/security-scan/normalize/pip-audit.js +16 -0
  330. package/dist/security-scan/normalize/ruff.js +12 -0
  331. package/dist/security-scan/normalize/semgrep.js +20 -0
  332. package/dist/security-scan/normalize/trivy.js +33 -0
  333. package/dist/security-scan/normalize/util.js +204 -0
  334. package/dist/security-scan/normalize/zizmor.js +19 -0
  335. package/dist/security-scan/report.js +156 -0
  336. package/dist/security-scan/run.js +448 -0
  337. package/dist/security-scan/tools.js +62 -0
  338. package/dist/security-scan/trabalhador.js +74 -0
  339. package/dist/security-scan/types.js +15 -0
  340. package/dist/session-events.js +19 -2
  341. package/dist/session-watcher-claude.js +74 -19
  342. package/dist/session-watcher-grok.js +425 -0
  343. package/dist/session-watcher.js +174 -13
  344. package/dist/sessoes-contas.js +42 -5
  345. package/dist/sessoes-inventario.js +1 -1
  346. package/dist/sessoes.js +25 -23
  347. package/dist/setup.js +67 -66
  348. package/dist/ship-publicar.js +263 -92
  349. package/dist/ship.js +160 -17
  350. package/dist/superficie.js +14 -11
  351. package/dist/thread-close.js +9 -9
  352. package/dist/thread.js +121 -18
  353. package/dist/tokens.js +15 -11
  354. package/dist/trabalho-thread.js +297 -0
  355. package/dist/transporte-do-canal.js +189 -0
  356. package/dist/types.js +12 -1
  357. package/dist/util.js +5 -2
  358. package/dist/varredura-acoes.js +500 -0
  359. package/dist/verify.js +491 -32
  360. package/dist/worktree-local.js +12 -10
  361. package/dist/worktree.js +81 -85
  362. package/eval/casos/check-quality.json +77 -0
  363. package/eval/casos/security-auditor.json +148 -0
  364. package/eval/casos/security-remediation.json +161 -0
  365. package/eval/fixtures/security-scan/README.md +8 -0
  366. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  367. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  368. package/eval/fixtures/security-scan/go/README.md +4 -0
  369. package/eval/fixtures/security-scan/go/config.go +4 -0
  370. package/eval/fixtures/security-scan/go/go.mod +5 -0
  371. package/eval/fixtures/security-scan/go/go.sum +2 -0
  372. package/eval/fixtures/security-scan/go/main.go +31 -0
  373. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  374. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  375. package/eval/fixtures/security-scan/js/README.md +4 -0
  376. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  377. package/eval/fixtures/security-scan/js/package.json +10 -0
  378. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  379. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  380. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  381. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  382. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  383. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  384. package/eval/fixtures/security-scan/python/README.md +4 -0
  385. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  386. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  387. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  388. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  389. package/package.json +10 -5
  390. package/references/security-checklist.md +3 -3
  391. package/skills/README.md +1 -0
  392. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  393. package/skills/phases/check-quality/SKILL.md +16 -0
  394. package/skills/phases/go-implementation/SKILL.md +6 -0
  395. package/skills/phases/security-remediation/SKILL.md +70 -0
  396. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -33,7 +33,11 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.PRAZO_PADRAO_MIN = exports.ENDERECO_DA_RESPOSTA = exports.ALVO_DO_PULSE = exports.TAMANHO_DO_CODIGO = exports.ALFABETO_DO_CODIGO = exports.CONTRATO_CONSENTIMENTO = void 0;
36
+ exports.PRAZO_PADRAO_MIN = exports.REPLY_A_OUTRA = exports.REFERENCIA_DO_REPLY = exports.CODIGO_CURTO = exports.ENDERECO_DA_RESPOSTA = exports.ALVO_DO_PULSE = exports.TAMANHO_DO_CODIGO = exports.ALFABETO_DO_CODIGO = exports.CONTRATO_CONSENTIMENTO = void 0;
37
+ exports.lerReferenciaDoReply = lerReferenciaDoReply;
38
+ exports.referenciaDoReplyValida = referenciaDoReplyValida;
39
+ exports.enderecoDoPulse = enderecoDoPulse;
40
+ exports.enderecoDoPulseValido = enderecoDoPulseValido;
37
41
  exports.arquivoDoConsentimento = arquivoDoConsentimento;
38
42
  exports.gerarCodigo = gerarCodigo;
39
43
  exports.interpretarResposta = interpretarResposta;
@@ -93,6 +97,54 @@ const LETRAS_DO_CODIGO = 'ABCDEFGHJKMNPQRSTVWXYZ';
93
97
  */
94
98
  exports.ALVO_DO_PULSE = 'pulse';
95
99
  exports.ENDERECO_DA_RESPOSTA = 'resposta';
100
+ /**
101
+ * RM-057 (resposta curta, D3 da ork-rm057respost): a forma de um código curto, como `gerarCodigo` o faz (letra na frente
102
+ * e ao menos um dígito), em maiúsculas.
103
+ */
104
+ exports.CODIGO_CURTO = /^(?=[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{0,2}[2-9])[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{3}$/;
105
+ /**
106
+ * RM-057 (resposta curta, D3; GO-FIX 1, achado 2): a referência do reply, `<código>:<id>`. O código vem do título da
107
+ * pergunta do arco que o dono respondeu, e o id é o da mensagem respondida no Telegram. O núcleo só aceita o reply quando
108
+ * esse id é o da mensagem em que a pergunta foi entregue, gravado na entrega: confirmação, recusa e conversa nunca são
109
+ * a pergunta, mesmo quando trazem o código.
110
+ */
111
+ exports.REFERENCIA_DO_REPLY = /^((?=[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{0,2}[2-9])[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{3}):([1-9][0-9]{0,19})$/;
112
+ /** O código e o id da mensagem respondida, ou `null` quando a referência não tem a forma. */
113
+ function lerReferenciaDoReply(referencia) {
114
+ const m = typeof referencia === 'string' ? exports.REFERENCIA_DO_REPLY.exec(referencia) : null;
115
+ return m ? { codigo: m[1], mensagem: m[2] } : null;
116
+ }
117
+ /**
118
+ * RM-057 (GO-FIX 2, R1 do CHECK da ork-rm057respost): a marca do reply a OUTRA mensagem. Quando o dono responde com a
119
+ * palavra solta em reply a uma mensagem que não é a pergunta do arco (a confirmação de um gate, a mensagem de outra pessoa
120
+ * do grupo, a do assistente), o gateway assina `resposta:outra`: a palavra nunca vira palavra solta, e o núcleo a recusa
121
+ * dizendo por quê. Nenhuma prova aceita este endereço.
122
+ */
123
+ exports.REPLY_A_OUTRA = 'outra';
124
+ /** A referência que o gateway pode assinar: a da pergunta respondida (`<código>:<id>`) ou a marca do reply a outra mensagem. */
125
+ function referenciaDoReplyValida(referencia) {
126
+ return referencia === exports.REPLY_A_OUTRA || lerReferenciaDoReply(referencia) !== null;
127
+ }
128
+ /**
129
+ * RM-057 (resposta curta, D3): o endereço que o gateway assina quando o dono responde EM REPLY à mensagem de uma pergunta.
130
+ * A referência (`<código>:<id da mensagem respondida>`) entra na posição de pedido do corpo assinado
131
+ * (`resposta:<código>:<id>`), dentro do HMAC, e o texto do dono continua na posição de resposta, como ele digitou. A
132
+ * palavra solta em reply a outra mensagem vai em `resposta:outra` (GO-FIX 2). Sem reply, o endereço é o de sempre.
133
+ */
134
+ function enderecoDoPulse(referencia) {
135
+ if (referencia === undefined || referencia === null)
136
+ return exports.ENDERECO_DA_RESPOSTA;
137
+ if (!referenciaDoReplyValida(referencia))
138
+ throw new Error('resposta do pulse: referência do reply fora da forma <código>:<mensagem> (ou outra)');
139
+ return `${exports.ENDERECO_DA_RESPOSTA}:${referencia}`;
140
+ }
141
+ /** Os dois endereços do pulse que provam resposta: o de sempre e o do reply. */
142
+ function enderecoDoPulseValido(endereco) {
143
+ if (endereco === exports.ENDERECO_DA_RESPOSTA)
144
+ return true;
145
+ return typeof endereco === 'string' && endereco.startsWith(`${exports.ENDERECO_DA_RESPOSTA}:`) &&
146
+ lerReferenciaDoReply(endereco.slice(exports.ENDERECO_DA_RESPOSTA.length + 1)) !== null;
147
+ }
96
148
  /** Uma hora, a mesma janela do resumo pedido em 20/09. Vencido nao nega: so deixa de valer. */
97
149
  exports.PRAZO_PADRAO_MIN = 60;
98
150
  const sha = (s) => (0, node_crypto_1.createHash)('sha256').update(s).digest('hex');
@@ -33,11 +33,14 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.RETEM_PARADO_MS = exports.adquirirLockMonitor = void 0;
36
+ exports.FIM_DO_EPISODIO_OCIOSO_MS = exports.RETEM_PARADO_MS = exports.adquirirLockMonitor = void 0;
37
37
  exports.assinaturaPulse = assinaturaPulse;
38
38
  exports.assinaturaDoResumo = assinaturaDoResumo;
39
39
  exports.mensagemPulse = mensagemPulse;
40
+ exports.idsDaEntrega = idsDaEntrega;
41
+ exports.entregarPeloTransporte = entregarPeloTransporte;
40
42
  exports.varrerPulse = varrerPulse;
43
+ exports.agirDepoisDaEntrega = agirDepoisDaEntrega;
41
44
  exports.varrerEDepoisPublicarNaRede = varrerEDepoisPublicarNaRede;
42
45
  exports.enviarPayloadHost = enviarPayloadHost;
43
46
  const manifest_1 = require("./manifest");
@@ -64,11 +67,20 @@ const maquina_1 = require("./maquina");
64
67
  const rede_1 = require("./rede");
65
68
  const rede_adesao_1 = require("./rede-adesao");
66
69
  const pulse_cadencia_1 = require("./pulse-cadencia");
70
+ const conducao_batida_1 = require("./conducao-batida");
71
+ const doctor_pulse_cron_1 = require("./doctor-pulse-cron");
72
+ const transporte_do_canal_1 = require("./transporte-do-canal");
73
+ const ledger_1 = require("./ledger");
67
74
  // O lock dos monitores mudou de modulo (I-41, GO-FIX 1); quem o importava daqui continua importando.
68
75
  var monitor_lock_2 = require("./monitor-lock");
69
76
  Object.defineProperty(exports, "adquirirLockMonitor", { enumerable: true, get: function () { return monitor_lock_2.adquirirLockMonitor; } });
70
77
  /** RM-037 (fatia 4): por quanto tempo a parada ja informada continua sabida depois de sumir de uma batida. */
71
78
  exports.RETEM_PARADO_MS = 6 * 60 * 60 * 1000;
79
+ /**
80
+ * RM-063 (F6): o fim de um episodio de maquina ociosa. A marca do alerta fica enquanto ela continua ociosa e por mais
81
+ * duas batidas depois: a maquina que volta a ficar ociosa depois disso e outro episodio, e o dono e avisado de novo.
82
+ */
83
+ exports.FIM_DO_EPISODIO_OCIOSO_MS = 30 * 60 * 1000;
72
84
  /**
73
85
  * I-41 (D9): a assinatura de deduplicacao NAO inclui `apresentacao`.
74
86
  *
@@ -114,6 +126,64 @@ function gravarCache(file, vistas) {
114
126
  fs.writeFileSync(tmp, JSON.stringify({ versao: 1, vistas }) + '\n', { mode: 0o600 });
115
127
  fs.renameSync(tmp, file);
116
128
  }
129
+ /** Os ids de mensagem que o transporte imprimiu ao entregar: só inteiros positivos do Telegram, no máximo dez. */
130
+ function idsDaEntrega(saida) {
131
+ const texto = String(saida ?? '').trim();
132
+ let j = null;
133
+ for (const candidato of [texto, texto.split('\n').filter(Boolean).at(-1) ?? '']) {
134
+ try {
135
+ j = JSON.parse(candidato);
136
+ break;
137
+ }
138
+ catch {
139
+ j = null;
140
+ }
141
+ }
142
+ if (!j || typeof j !== 'object' || Array.isArray(j))
143
+ return [];
144
+ const o = j;
145
+ const brutos = [...(Array.isArray(o.message_ids) ? o.message_ids : []), o.message_id, o.messageId];
146
+ const ids = brutos.map(v => (typeof v === 'number' && Number.isSafeInteger(v) && v > 0) ? String(v)
147
+ : typeof v === 'string' && /^[1-9][0-9]{0,19}$/.test(v) ? v : null).filter((v) => v !== null);
148
+ return [...new Set(ids)].slice(0, 10);
149
+ }
150
+ /**
151
+ * RM-063 (fatia 3, H4): entrega a mensagem pelo transporte do pulse e, quando ele falha, pelos outros hosts configurados
152
+ * (`alternativos`), na ordem. Cada entrega vai ao `transporte.log` (`transporte_entrega`, com cada tentativa), que o
153
+ * `ork doctor` le: a falha do principal aparece la mesmo quando o outro host entregou. A mensagem entra como texto:
154
+ * `$&` e `$'` nela nao sao padrao de substituicao (CHECK da RM-037, fatia 4).
155
+ */
156
+ function entregarPeloTransporte(raiz, mensagem, opcoes) {
157
+ const dir = opcoes.dir ?? path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery', 'monitor');
158
+ // RM-047 (P2): o executavel do transporte so sai do arquivo local, nunca de um versionado no git.
159
+ if (!opcoes.config)
160
+ (0, procedencia_1.exigirHostLocal)(raiz, path.join(dir, 'pulse-host.json'));
161
+ const config = opcoes.config ?? JSON.parse(fs.readFileSync(path.join(dir, 'pulse-host.json'), 'utf8'));
162
+ if (!(0, transporte_do_canal_1.transporteValido)(config))
163
+ throw new Error('transporte requer executavel e argumentos com {{mensagem}}');
164
+ const todos = [config, ...(Array.isArray(config.alternativos) ? config.alternativos.filter(transporte_do_canal_1.transporteValido) : [])];
165
+ const tentativas = [];
166
+ let entregue = null, mensagens = [];
167
+ for (const t of todos) {
168
+ const host = (0, transporte_do_canal_1.hostDoTransporte)(t);
169
+ const r = (0, node_child_process_1.spawnSync)(t.executavel, t.argumentos.map((a) => a.replaceAll('{{mensagem}}', () => mensagem)), { cwd: raiz, encoding: 'utf8', input: mensagem, timeout: 30000, maxBuffer: 1024 * 1024 });
170
+ const ok = r.status === 0;
171
+ tentativas.push({ host, ok, codigo: r.status, detalhe: ok ? '' : (0, hitl_1.redigirSegredos)(`${r.error ? r.error.message : ''} ${r.stderr ?? ''}`)
172
+ .replace(/\s+/g, ' ').trim().slice(0, 200) });
173
+ if (ok) {
174
+ entregue = host;
175
+ mensagens = idsDaEntrega(r.stdout ?? '');
176
+ break;
177
+ }
178
+ }
179
+ try {
180
+ fs.mkdirSync(dir, { recursive: true });
181
+ fs.appendFileSync(path.join(dir, doctor_pulse_cron_1.ARQUIVO_DO_TRANSPORTE), JSON.stringify({ ts: opcoes.quando ?? new Date().toISOString(),
182
+ tipo: 'transporte_entrega', oQue: opcoes.oQue, ok: entregue !== null, host: entregue, tentativas }) + '\n', { mode: 0o600 });
183
+ }
184
+ catch { /* o log e do doctor; a entrega vale sem ele */ }
185
+ return { ok: entregue !== null, host: entregue, tentativas, mensagens };
186
+ }
117
187
  /**
118
188
  * I-41 (escopo do dono, 20/09 16:5x): a varredura entrega UMA mensagem, nunca uma por item.
119
189
  *
@@ -195,18 +265,33 @@ function varrerPulse(opcoes) {
195
265
  const chaveDoParado = (p) => `parado:${p.thread}:${p.caso}`;
196
266
  for (const p of parados)
197
267
  presentes.add(chaveDoParado(p));
268
+ // RM-063 (F5): o que a varredura fez sozinha, pela autorizacao do dono, e noticia uma vez, como a decisao informada.
269
+ const feitas = pulse.varredura?.feitas ?? [];
270
+ const chaveDaFeita = (id) => `varredura:${id}`;
271
+ for (const f of feitas)
272
+ presentes.add(chaveDaFeita(f.eventId));
198
273
  // A parada que some por uma batida (gh que falhou, um `ork verify` do condutor) e volta nao e noticia
199
274
  // nova: a marca fica guardada por `RETEM_PARADO_MS` depois da ultima vez que a parada apareceu.
200
- const guardada = (id, valor) => id.startsWith('parado:') &&
201
- Date.parse(quando) - Number(valor.split('|')[1]) < exports.RETEM_PARADO_MS;
275
+ // RM-063 (F6): a maquina ociosa e alerta uma vez por episodio; a marca guarda a ultima vez que ela apareceu ociosa.
276
+ const ociosa = pulse.maquinaOciosa ?? null;
277
+ const chaveDaOciosa = ociosa ? `ociosa:${ociosa.maquina}` : null;
278
+ if (chaveDaOciosa)
279
+ presentes.add(chaveDaOciosa);
280
+ const guardada = (id, valor) => (id.startsWith('parado:') &&
281
+ Date.parse(quando) - Number(valor.split('|')[1]) < exports.RETEM_PARADO_MS) ||
282
+ (id.startsWith('ociosa:') && Date.parse(quando) - Number(valor.split('|')[1]) < exports.FIM_DO_EPISODIO_OCIOSO_MS);
202
283
  vistas = Object.fromEntries(Object.entries(vistas).filter(([id, valor]) => presentes.has(id) || guardada(id, valor)));
203
284
  const esperaNovaFora = esperasFora.some(k => vistas[k] === undefined);
204
285
  const decisoesNovas = decisoes.filter(d => vistas[chaveDaDecisao(d.id)] === undefined);
286
+ const feitasNovas = feitas.filter(f => vistas[chaveDaFeita(f.eventId)] === undefined);
205
287
  const paradosNovos = parados.filter(p => vistas[chaveDoParado(p)] === undefined);
206
288
  // A marca guarda o instante em milissegundos: e dado de maquina, nao texto para o dono.
207
289
  for (const p of parados)
208
290
  if (vistas[chaveDoParado(p)] !== undefined)
209
291
  vistas[chaveDoParado(p)] = `informada|${Date.parse(quando)}`;
292
+ const ociosaNova = !!chaveDaOciosa && vistas[chaveDaOciosa] === undefined;
293
+ if (chaveDaOciosa && !ociosaNova)
294
+ vistas[chaveDaOciosa] = `informada|${Date.parse(quando)}`;
210
295
  // I-41 (GO-FIX 1): a thread que ja recebeu a pergunta e ainda nao respondeu nao e noticia. A
211
296
  // mudanca no item dela (o pedido que o sim do dono abriu) e obra nossa, e avisar sobre ela seria
212
297
  // mandar ao dono um resumo sobre a pergunta que ele acabou de receber.
@@ -223,22 +308,8 @@ function varrerPulse(opcoes) {
223
308
  if (jaServida(i))
224
309
  vistas[i.id] = assinaturaPulse(i);
225
310
  const entregar = (mensagem, oQue) => {
226
- let entregue;
227
- if (opcoes.enviar)
228
- entregue = opcoes.enviar(mensagem);
229
- else {
230
- // RM-047 (P2): o executavel do transporte so sai do arquivo local, nunca de um versionado no git.
231
- if (!opcoes.transporte)
232
- (0, procedencia_1.exigirHostLocal)(raiz, path.join(dir, 'pulse-host.json'));
233
- const config = opcoes.transporte ?? JSON.parse(fs.readFileSync(path.join(dir, 'pulse-host.json'), 'utf8'));
234
- if (typeof config.executavel !== 'string' || !config.executavel || !Array.isArray(config.argumentos) ||
235
- !config.argumentos.every(a => typeof a === 'string') || !config.argumentos.some(a => a.includes('{{mensagem}}'))) {
236
- throw new Error('transporte requer executavel e argumentos com {{mensagem}}');
237
- }
238
- // A mensagem entra como texto: `$&` e `$'` nela nao sao padrao de substituicao (CHECK da RM-037, fatia 4).
239
- const r = (0, node_child_process_1.spawnSync)(config.executavel, config.argumentos.map(a => a.replaceAll('{{mensagem}}', () => mensagem)), { cwd: raiz, encoding: 'utf8', input: mensagem, timeout: 30000, maxBuffer: 1024 * 1024 });
240
- entregue = r.status === 0;
241
- }
311
+ const entregue = opcoes.enviar ? opcoes.enviar(mensagem)
312
+ : entregarPeloTransporte(raiz, mensagem, { dir, oQue, quando, ...(opcoes.transporte ? { config: opcoes.transporte } : {}) }).ok;
242
313
  if (!entregue)
243
314
  throw new Error(`transporte não confirmou ${oQue}; novidade preservada`);
244
315
  enviadas++;
@@ -260,14 +331,22 @@ function varrerPulse(opcoes) {
260
331
  // I-50: pergunta nova sai na hora; o resto (status, decisoes informadas) espera a janela da
261
332
  // cadencia do dono, e a novidade que esperou continua nao vista ate sair.
262
333
  const noPrazo = !opcoes.comCadencia || (0, pulse_cadencia_1.janelaAberta)(cadencia, (0, pulse_cadencia_1.lerUltimoResumo)(opcoes.raiz, dir), quando);
263
- const informacaoNova = novas > 0 || decisoesNovas.length > 0 || paradosNovos.length > 0;
264
- const adiada = !conjuntoNovo && !esperaNovaFora && !impedimentoNovo && informacaoNova && !noPrazo;
265
- if (conjuntoNovo || esperaNovaFora || impedimentoNovo || (noPrazo && informacaoNova)) {
334
+ const informacaoNova = novas > 0 || decisoesNovas.length > 0 || paradosNovos.length > 0 || feitasNovas.length > 0;
335
+ // RM-063 (F6): a maquina ociosa sai na hora, como a pergunta nova: esperar a janela da cadencia (ate 8 h no
336
+ // #OrkPulseOff) e exatamente a maquina parada sem o dono saber.
337
+ const adiada = !conjuntoNovo && !esperaNovaFora && !impedimentoNovo && !ociosaNova && informacaoNova && !noPrazo;
338
+ if (conjuntoNovo || esperaNovaFora || impedimentoNovo || ociosaNova || (noPrazo && informacaoNova)) {
266
339
  const guardadas = anterior ? fila.candidatos.filter(c => anterior.candidatos.some(a => a.thread === c.thread)).length : 0;
267
340
  const resumo = (0, hitl_resumo_1.resumirHitl)(itens, { quando, janelaMin, prontas: fila.candidatos.length, acumuladas: guardadas,
268
341
  consertos: fila.consertos, atoDoItem: i => fila.atos.get(`${i.thread}|${i.fase}`),
269
342
  decisoes: decisoesNovas, acimaDoLimiar: pulse.acimaDoLimiar ?? [], outrasMaquinas: outras, paradosNoCondutor: parados,
270
343
  impedimentosDoDono: impedimentos,
344
+ // RM-063 (F5): o que espera o dono na varredura, com o comando, e o que ela fez sozinha desde o ultimo resumo.
345
+ acoesDaVarredura: (pulse.varredura?.pendentes ?? []).filter(a => a.quemFaz === 'dono')
346
+ .map(a => ({ thread: a.thread, acao: a.acao, texto: (0, pulse_1.textoDaAcaoDaVarredura)(a), comando: (0, pulse_1.comandoDaAcaoDaVarredura)(a) })),
347
+ feitasPelaVarredura: feitasNovas.map(f => ({ thread: f.thread, acao: f.acao, texto: `${f.acao}: ${f.detalhe}`, comando: null })),
348
+ maquinaOciosa: ociosa ? { maquina: ociosa.maquina, livres: ociosa.livres, limite: ociosa.limite, reservados: ociosa.reservados,
349
+ sugeridas: ociosa.sugeridas.map(x => ({ item: x.item, thread: x.thread, passo: x.passo, comando: x.comando })) } : null,
271
350
  // RM-057 (fatia 3): a linha so acompanha o resumo que ja sai; nao e novidade nem fura a cadencia.
272
351
  ...(pulse.hitlDeConducao ? { hitlDeConducao: pulse.hitlDeConducao } : {}) });
273
352
  // Pedir licenca para mandar zero perguntas era o defeito: sem pergunta, nao ha codigo.
@@ -289,6 +368,19 @@ function varrerPulse(opcoes) {
289
368
  vistas[k] = 'informada';
290
369
  for (const p of parados)
291
370
  vistas[chaveDoParado(p)] = `informada|${Date.parse(quando)}`;
371
+ for (const f of feitas)
372
+ vistas[chaveDaFeita(f.eventId)] = 'informada';
373
+ if (chaveDaOciosa)
374
+ vistas[chaveDaOciosa] = `informada|${Date.parse(quando)}`;
375
+ // RM-063 (F6): o aviso de maquina ociosa vai ao ledger do projeto, uma linha por episodio: e a metrica do item.
376
+ if (ociosa && ociosaNova) {
377
+ try {
378
+ (0, ledger_1.registrar)(path.join(raiz, '.orkastery'), 'projeto', ledger_1.TIPOS_DE_EVENTO.maquinaOciosaAvisada, { maquina: ociosa.maquina,
379
+ livres: ociosa.livres, limite: ociosa.limite, reservados: ociosa.reservados, sugeridas: ociosa.sugeridas.map(x => x.item),
380
+ fonte: ociosa.fonte });
381
+ }
382
+ catch { /* o aviso ja saiu; o ledger e a metrica */ }
383
+ }
292
384
  (0, pulse_cadencia_1.gravarUltimoResumo)(opcoes.raiz, quando, dir);
293
385
  }
294
386
  gravarCache(cache, vistas);
@@ -303,6 +395,21 @@ function varrerPulse(opcoes) {
303
395
  trava.liberar();
304
396
  }
305
397
  }
398
+ /**
399
+ * RM-063 (F5 e F7): a parte que age da batida, depois da entrega ao dono (a busca da base, o merge e o registro do PR nao
400
+ * atrasam o resumo): a batida da conducao (`ork conducao batida`), com o merge dos PRs prontos, a varredura da F5 e o
401
+ * despacho da fase seguinte, cada rodada no `hitl.log` (`varredura_acoes`). Uma batida por vez (`varredura-acoes.lock`):
402
+ * a que chega com outra agindo so registra a vez perdida. Nunca lanca.
403
+ */
404
+ function agirDepoisDaEntrega(carregado, opcoes = {}) {
405
+ try {
406
+ const r = (0, conducao_batida_1.baterConducao)(carregado, opcoes);
407
+ return r.ocupada ? null : r;
408
+ }
409
+ catch {
410
+ return null;
411
+ }
412
+ }
306
413
  /**
307
414
  * RM-053: a entrega ao dono vem primeiro, e a rede depois, mesmo quando a varredura falha. M4 do
308
415
  * CHECK 1: antes da entrega, uma forja lenta atrasava o HITL em minutos. S13 da revisao 2: sem o
@@ -352,13 +459,22 @@ if (require.main === module) {
352
459
  // RM-053 (D9): depois da entrega ao dono, a mesma batida publica o retrato desta maquina na rede da
353
460
  // pessoa (so membro, uma tentativa a cada 14 min, retrato igual so de hora em hora).
354
461
  const r = varrerEDepoisPublicarNaRede(() => varrerPulse({ raiz, escopo, comCadencia: true, outrasMaquinas }), () => {
462
+ // RM-063 (F5 e F7): a batida da conducao vem depois da entrega ao dono e antes da rede: com a autorizacao duravel
463
+ // do dono, mescla o PR pronto, limpa as sessoes fantasmas, registra a entrega do PR ja mesclado, fecha pelo MASTER
464
+ // por omissao e despacha a fase seguinte; o resumo seguinte diz o que ela fez, e o que ficou sem autorizacao ja
465
+ // esta na fila do dono. Ela nunca lanca.
355
466
  try {
356
- const rede = (0, rede_1.publicarRedeNaBatida)({ diretorio: carregado.raiz });
357
- if (rede)
358
- (0, rede_adesao_1.registrarNaRede)({ ...rede, origem: 'pulse' });
467
+ agirDepoisDaEntrega(carregado);
359
468
  }
360
- catch (e) {
361
- (0, rede_adesao_1.registrarNaRede)({ acao: 'falhou', origem: 'pulse', erro: e.message });
469
+ finally {
470
+ try {
471
+ const rede = (0, rede_1.publicarRedeNaBatida)({ diretorio: carregado.raiz });
472
+ if (rede)
473
+ (0, rede_adesao_1.registrarNaRede)({ ...rede, origem: 'pulse' });
474
+ }
475
+ catch (e) {
476
+ (0, rede_adesao_1.registrarNaRede)({ acao: 'falhou', origem: 'pulse', erro: e.message });
477
+ }
362
478
  }
363
479
  });
364
480
  console.log(JSON.stringify(r));