@orkastery/cli 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +195 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/autoridade.json +56 -0
  16. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  17. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  18. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  19. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  20. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  21. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  23. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  24. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  25. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  26. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  27. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  28. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  29. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  30. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  31. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  32. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  33. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  35. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  36. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  37. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  38. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  39. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  40. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  41. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  42. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  43. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  44. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  45. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  46. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  47. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  48. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  49. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  50. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
  51. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  52. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  53. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  54. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  55. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  56. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  57. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  58. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  59. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  61. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  62. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  63. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  64. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  65. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  66. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  67. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  68. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  69. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  70. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  71. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  72. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  73. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  74. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  75. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  76. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  77. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  78. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  79. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  80. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  82. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  83. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  84. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  85. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  86. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  87. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  88. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  89. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  90. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  91. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  92. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  93. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  94. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  95. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  96. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  97. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  98. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  99. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  100. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  101. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  102. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  103. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  104. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  105. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  106. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  107. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  108. package/adapters/codex/skills/ork/SKILL.md +2 -0
  109. package/adapters/hermes/README.md +64 -1
  110. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  111. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  112. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  113. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  114. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  115. package/adapters/hermes/hermes.plugin.json +4 -0
  116. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  117. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
  118. package/adapters/openclaw/README.md +83 -10
  119. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  120. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  121. package/adapters/openclaw/dist/index.js +86 -0
  122. package/adapters/openclaw/openclaw.plugin.json +34 -4
  123. package/adapters/openclaw/package.json +2 -2
  124. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  125. package/adapters/openclaw/src/index.ts +94 -0
  126. package/assets/adapters-en/claude-code/README.md +403 -0
  127. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  128. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  129. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  130. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  131. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  132. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  133. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  134. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  135. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  136. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  137. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  138. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  139. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  140. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  141. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  142. package/assets/adapters-en/hermes/README.md +273 -0
  143. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  144. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  145. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  146. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  147. package/assets/docs-en/produto/README.md +14 -0
  148. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  149. package/assets/docs-en/roadmap/README.md +14 -0
  150. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  151. package/assets/references-en/README.md +25 -0
  152. package/assets/references-en/code-review-axes.md +82 -0
  153. package/assets/references-en/definition-of-done.md +74 -0
  154. package/assets/references-en/performance-checklist.md +53 -0
  155. package/assets/references-en/security-checklist.md +101 -0
  156. package/assets/references-en/testing-patterns.md +51 -0
  157. package/assets/security-scan/defaults/.golangci.yml +2 -0
  158. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  159. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  160. package/assets/security-scan/defaults/ruff.toml +1 -0
  161. package/assets/security-scan/tools-agil.json +87 -0
  162. package/assets/security-scan/tools.json +625 -0
  163. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  164. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  165. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  166. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  167. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  168. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  169. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  170. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  171. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  172. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  173. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  174. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  175. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  176. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  177. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  178. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  179. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  180. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  181. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  182. package/dist/adapters/claude-bg.js +193 -15
  183. package/dist/adapters/codex-controller-worker.js +12 -5
  184. package/dist/adapters/codex-events.js +16 -4
  185. package/dist/adapters/codex.js +13 -2
  186. package/dist/agents-md.js +24 -15
  187. package/dist/atualizar-branch.js +245 -0
  188. package/dist/auditoria.js +13 -11
  189. package/dist/auditrun.js +68 -48
  190. package/dist/autorizacao-duravel.js +327 -0
  191. package/dist/board.js +98 -43
  192. package/dist/branch-de-estado.js +39 -9
  193. package/dist/busca-semantica.js +7 -5
  194. package/dist/catalogo.js +35 -1
  195. package/dist/changelog-reconciliacao.js +290 -0
  196. package/dist/check-agil.js +500 -0
  197. package/dist/check-modo.js +41 -0
  198. package/dist/check-paralelo.js +183 -0
  199. package/dist/ci.js +255 -46
  200. package/dist/ciclos.js +8 -6
  201. package/dist/claim-lint.js +12 -8
  202. package/dist/claims-conferir.js +350 -0
  203. package/dist/claims.js +13 -10
  204. package/dist/company-brain-client.js +45 -3
  205. package/dist/company-brain-journal.js +2 -1
  206. package/dist/company-brain-migration.js +47 -6
  207. package/dist/conducao-batida.js +759 -0
  208. package/dist/conducao-sentinela.js +405 -0
  209. package/dist/conducao-texto.js +12 -18
  210. package/dist/conducao.js +206 -59
  211. package/dist/conhecimento-consulta.js +270 -0
  212. package/dist/conhecimento.js +514 -0
  213. package/dist/conta-esgotada.js +127 -0
  214. package/dist/dado-privado.js +816 -0
  215. package/dist/decisao-autonoma.js +5 -4
  216. package/dist/demo.js +14 -12
  217. package/dist/dependencias-da-worktree.js +25 -0
  218. package/dist/divida.js +38 -36
  219. package/dist/docs.js +103 -82
  220. package/dist/doctor-forja.js +345 -0
  221. package/dist/doctor-pulse-cron.js +294 -27
  222. package/dist/doctor-rede.js +18 -17
  223. package/dist/doctor.js +278 -116
  224. package/dist/dsn-da-memoria.js +417 -0
  225. package/dist/entrega-por-mod.js +503 -0
  226. package/dist/entrega-pr.js +158 -57
  227. package/dist/escopo-escrita.js +10 -1
  228. package/dist/esgotamentos.js +13 -11
  229. package/dist/estado-thread.js +42 -17
  230. package/dist/evalrunner.js +35 -32
  231. package/dist/experiencia-instalacao.js +45 -25
  232. package/dist/fabrica-batida.js +323 -0
  233. package/dist/fabrica-estado.js +49 -16
  234. package/dist/fabrica-publicar.js +3 -1
  235. package/dist/fila-pesada.js +444 -0
  236. package/dist/fix.js +24 -21
  237. package/dist/forja/adaptador.js +6 -0
  238. package/dist/forja/ambiente-de-ci.js +27 -0
  239. package/dist/forja/api.js +256 -0
  240. package/dist/forja/cache.js +89 -0
  241. package/dist/forja/cli.js +60 -0
  242. package/dist/forja/contrato.js +9 -0
  243. package/dist/forja/endereco.js +43 -0
  244. package/dist/forja/estado.js +22 -0
  245. package/dist/forja/executor.js +73 -0
  246. package/dist/forja/github/ci.js +95 -0
  247. package/dist/forja/github/dono-da-rede.js +18 -0
  248. package/dist/forja/github/metadados.js +15 -0
  249. package/dist/forja/github/pedidos.js +200 -0
  250. package/dist/forja/gitlab/ci.js +141 -0
  251. package/dist/forja/gitlab/consultas.js +59 -0
  252. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  253. package/dist/forja/gitlab/metadados.js +15 -0
  254. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  255. package/dist/forja/gitlab/pedidos.js +141 -0
  256. package/dist/forja/produtor.js +32 -0
  257. package/dist/forja/registro.js +31 -0
  258. package/dist/forja/resolver.js +121 -0
  259. package/dist/forja/texto.js +13 -0
  260. package/dist/forja/versao.js +71 -0
  261. package/dist/forja.js +124 -81
  262. package/dist/gates.js +3 -28
  263. package/dist/handoff.js +33 -19
  264. package/dist/hitl-contract.js +46 -43
  265. package/dist/hitl-curto.js +37 -25
  266. package/dist/hitl-gates.js +13 -11
  267. package/dist/hitl-local-receipt.js +53 -0
  268. package/dist/hitl-local.js +11 -2
  269. package/dist/hitl-lock.js +5 -11
  270. package/dist/hitl-public-receipt.js +11 -0
  271. package/dist/hitl-resumo.js +72 -3
  272. package/dist/hitl-sessions.js +62 -9
  273. package/dist/hitl-tempo-parado.js +4 -4
  274. package/dist/hitl-texto-livre.js +7 -4
  275. package/dist/hitl.js +63 -64
  276. package/dist/horario.js +30 -7
  277. package/dist/hosts.js +155 -134
  278. package/dist/impedimento.js +108 -14
  279. package/dist/index.js +1421 -1019
  280. package/dist/indice-vetorial.js +14 -12
  281. package/dist/indice.js +7 -1
  282. package/dist/init.js +54 -49
  283. package/dist/instabilidade.js +144 -0
  284. package/dist/integracoes-locais.js +4 -0
  285. package/dist/intelligence-graph-cli.js +213 -88
  286. package/dist/intelligence-graph-contexto.js +56 -17
  287. package/dist/intelligence-graph-contract.js +2 -1
  288. package/dist/intelligence-graph-extract-md.js +56 -4
  289. package/dist/intelligence-graph-extract-ts.js +71 -3
  290. package/dist/intelligence-graph-query.js +96 -34
  291. package/dist/leases.js +19 -18
  292. package/dist/ledger-stats.js +17 -16
  293. package/dist/ledger.js +46 -2
  294. package/dist/licoes.js +12 -11
  295. package/dist/liveness.js +6 -3
  296. package/dist/locale-accounts.js +220 -0
  297. package/dist/locale-adapter.js +291 -0
  298. package/dist/locale-ajuda.js +833 -0
  299. package/dist/locale-audit.js +199 -0
  300. package/dist/locale-claims.js +213 -0
  301. package/dist/locale-conducao.js +138 -0
  302. package/dist/locale-conhecimento.js +181 -0
  303. package/dist/locale-decisao.js +205 -0
  304. package/dist/locale-docs.js +230 -0
  305. package/dist/locale-estado.js +101 -0
  306. package/dist/locale-forja.js +290 -0
  307. package/dist/locale-gerados.js +165 -0
  308. package/dist/locale-grafo.js +129 -0
  309. package/dist/locale-master.js +182 -0
  310. package/dist/locale-network.js +524 -0
  311. package/dist/locale-onboarding.js +92 -0
  312. package/dist/locale-operacao-restante.js +931 -0
  313. package/dist/locale-phase.js +151 -0
  314. package/dist/locale-projetos.js +100 -0
  315. package/dist/locale-prompts.js +194 -0
  316. package/dist/locale-pulse.js +349 -0
  317. package/dist/locale-reservas.js +87 -0
  318. package/dist/locale-retry.js +524 -0
  319. package/dist/locale-roadmap.js +102 -0
  320. package/dist/locale-security-scan.js +69 -0
  321. package/dist/locale-setup.js +192 -0
  322. package/dist/locale-ship.js +597 -0
  323. package/dist/locale-thread.js +421 -0
  324. package/dist/locale-verify.js +201 -0
  325. package/dist/locale-worktree.js +246 -0
  326. package/dist/locale.js +1258 -0
  327. package/dist/maestro-runtime.js +22 -3
  328. package/dist/manifest.js +415 -13
  329. package/dist/maquina-ociosa.js +211 -0
  330. package/dist/maquina.js +31 -7
  331. package/dist/master-digest.js +6 -1
  332. package/dist/master-nota-local.js +200 -0
  333. package/dist/master-nota.js +14 -8
  334. package/dist/master.js +139 -65
  335. package/dist/mcp-artifacts.js +11 -2
  336. package/dist/mcp-conhecimento.js +52 -0
  337. package/dist/mcp-experiencia.js +26 -5
  338. package/dist/mcp-git.js +23 -6
  339. package/dist/mcp-grafo.js +7 -4
  340. package/dist/mcp-install.js +73 -8
  341. package/dist/mcp-noctum.js +101 -0
  342. package/dist/mcp-server.js +90 -16
  343. package/dist/mcp-ship-transporte.js +977 -0
  344. package/dist/mcp-ship.js +71 -25
  345. package/dist/mcp-transportes.js +17 -0
  346. package/dist/mcp-verify.js +6 -1
  347. package/dist/memoria.js +63 -58
  348. package/dist/modos-migracao.js +8 -6
  349. package/dist/modos.js +20 -24
  350. package/dist/network-roadmap.js +90 -51
  351. package/dist/noctum-aceite.js +789 -0
  352. package/dist/noctum-arco.js +1418 -0
  353. package/dist/noctum-capacidade.js +141 -0
  354. package/dist/noctum-changelog.js +399 -0
  355. package/dist/noctum-cli.js +482 -0
  356. package/dist/noctum-coordenacao.js +1225 -0
  357. package/dist/noctum-entrega.js +1169 -0
  358. package/dist/noctum-envelope.js +1046 -0
  359. package/dist/noctum-execucao.js +376 -0
  360. package/dist/noctum-fechamento.js +405 -0
  361. package/dist/noctum-fila.js +314 -0
  362. package/dist/noctum-guarda.js +256 -0
  363. package/dist/noctum-integracao.js +507 -0
  364. package/dist/noctum-maquinas.js +383 -0
  365. package/dist/noctum-medicao.js +450 -0
  366. package/dist/noctum-modo.js +362 -0
  367. package/dist/noctum-pergunta-canal.js +96 -0
  368. package/dist/noctum-pergunta.js +115 -0
  369. package/dist/noctum-provas.js +838 -0
  370. package/dist/noctum-reconciliacao.js +591 -0
  371. package/dist/noctum-registro.js +215 -0
  372. package/dist/noctum-relatorio.js +827 -0
  373. package/dist/noctum-resposta.js +207 -0
  374. package/dist/noctum-sessoes-em-voo.js +93 -0
  375. package/dist/noctum-supervisao.js +649 -0
  376. package/dist/noctum-terminal.js +459 -0
  377. package/dist/noctum-transporte.js +655 -0
  378. package/dist/noctum-vigia.js +639 -0
  379. package/dist/ocupacao.js +32 -3
  380. package/dist/onboarding.js +56 -26
  381. package/dist/orkmind.js +48 -25
  382. package/dist/orquestracao.js +44 -47
  383. package/dist/parado-no-condutor.js +174 -127
  384. package/dist/phase.js +144 -63
  385. package/dist/policies.js +37 -4
  386. package/dist/portfolio.js +4 -2
  387. package/dist/postura-local.js +235 -0
  388. package/dist/preflight.js +11 -10
  389. package/dist/procedencia.js +220 -0
  390. package/dist/projeto-alvo.js +186 -24
  391. package/dist/prompts.js +140 -42
  392. package/dist/prova-minima.js +5 -6
  393. package/dist/pulse-cadencia.js +5 -4
  394. package/dist/pulse-consentimento.js +53 -1
  395. package/dist/pulse-delivery.js +151 -24
  396. package/dist/pulse-resposta.js +368 -4
  397. package/dist/pulse.js +188 -22
  398. package/dist/ratelimit.js +16 -6
  399. package/dist/recall.js +14 -13
  400. package/dist/redacao-saida.js +63 -0
  401. package/dist/rede-adesao.js +13 -8
  402. package/dist/rede-forja.js +108 -24
  403. package/dist/rede-status.js +66 -47
  404. package/dist/rede.js +86 -46
  405. package/dist/retomada-checkpoint.js +101 -0
  406. package/dist/retry.js +451 -212
  407. package/dist/roadmap-reservas.js +45 -28
  408. package/dist/roadmap-status.js +129 -33
  409. package/dist/runtime-ambiente.js +5 -0
  410. package/dist/runtime-context.js +284 -32
  411. package/dist/runtime-escada.js +423 -0
  412. package/dist/runtime-profiles.js +103 -46
  413. package/dist/runtimes.js +2 -1
  414. package/dist/saida-segura.js +3 -2
  415. package/dist/security-scan/agil.js +355 -0
  416. package/dist/security-scan/cli.js +76 -0
  417. package/dist/security-scan/compare.js +149 -0
  418. package/dist/security-scan/config.js +93 -0
  419. package/dist/security-scan/detect.js +97 -0
  420. package/dist/security-scan/executor.js +188 -0
  421. package/dist/security-scan/guard.js +180 -0
  422. package/dist/security-scan/imagem-de-lint.js +96 -0
  423. package/dist/security-scan/normalize/actionlint.js +12 -0
  424. package/dist/security-scan/normalize/eslint.js +12 -0
  425. package/dist/security-scan/normalize/gitleaks.js +13 -0
  426. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  427. package/dist/security-scan/normalize/govulncheck.js +36 -0
  428. package/dist/security-scan/normalize/index.js +25 -0
  429. package/dist/security-scan/normalize/npm-audit.js +30 -0
  430. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  431. package/dist/security-scan/normalize/oxlint.js +51 -0
  432. package/dist/security-scan/normalize/pip-audit.js +16 -0
  433. package/dist/security-scan/normalize/ruff.js +12 -0
  434. package/dist/security-scan/normalize/semgrep.js +20 -0
  435. package/dist/security-scan/normalize/trivy.js +33 -0
  436. package/dist/security-scan/normalize/util.js +204 -0
  437. package/dist/security-scan/normalize/zizmor.js +19 -0
  438. package/dist/security-scan/report.js +156 -0
  439. package/dist/security-scan/run.js +448 -0
  440. package/dist/security-scan/tools.js +62 -0
  441. package/dist/security-scan/trabalhador.js +74 -0
  442. package/dist/security-scan/types.js +15 -0
  443. package/dist/session-events.js +26 -5
  444. package/dist/session-watcher-claude.js +81 -20
  445. package/dist/session-watcher.js +340 -42
  446. package/dist/sessoes-contas.js +10 -1
  447. package/dist/sessoes-inventario.js +1 -1
  448. package/dist/sessoes.js +25 -23
  449. package/dist/setup.js +59 -58
  450. package/dist/ship-publicar.js +971 -0
  451. package/dist/ship.js +243 -97
  452. package/dist/steal.js +77 -0
  453. package/dist/superficie.js +14 -11
  454. package/dist/thread-close.js +12 -11
  455. package/dist/thread.js +274 -100
  456. package/dist/tokens.js +15 -11
  457. package/dist/trabalho-thread.js +297 -0
  458. package/dist/transporte-do-canal.js +189 -0
  459. package/dist/types.js +12 -1
  460. package/dist/util.js +13 -3
  461. package/dist/varredura-acoes.js +507 -0
  462. package/dist/verify.js +608 -76
  463. package/dist/vida-da-thread.js +254 -0
  464. package/dist/worktree-local.js +167 -0
  465. package/dist/worktree.js +99 -83
  466. package/dist/yaml.js +27 -8
  467. package/eval/casos/check-quality.json +77 -0
  468. package/eval/casos/security-auditor.json +148 -0
  469. package/eval/casos/security-remediation.json +161 -0
  470. package/eval/fixtures/security-scan/README.md +8 -0
  471. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  472. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  473. package/eval/fixtures/security-scan/go/README.md +4 -0
  474. package/eval/fixtures/security-scan/go/config.go +4 -0
  475. package/eval/fixtures/security-scan/go/go.mod +5 -0
  476. package/eval/fixtures/security-scan/go/go.sum +2 -0
  477. package/eval/fixtures/security-scan/go/main.go +31 -0
  478. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  479. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  480. package/eval/fixtures/security-scan/js/README.md +4 -0
  481. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  482. package/eval/fixtures/security-scan/js/package.json +10 -0
  483. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  484. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  485. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  486. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  487. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  488. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  489. package/eval/fixtures/security-scan/python/README.md +4 -0
  490. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  491. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  492. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  493. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  494. package/package.json +9 -4
  495. package/references/security-checklist.md +3 -3
  496. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  497. package/skills/README.md +1 -0
  498. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  499. package/skills/phases/check-quality/SKILL.md +16 -0
  500. package/skills/phases/go-implementation/SKILL.md +6 -0
  501. package/skills/phases/security-remediation/SKILL.md +70 -0
  502. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.rotuloDoNo = exports.ErroDeConsulta = exports.AVISO_DE_PARCIALIDADE = exports.CANDIDATOS_LISTADOS = exports.LIMITE_MAXIMO = exports.LIMITE_PADRAO = exports.PROFUNDIDADE_MAXIMA = exports.CONSULTA_SCHEMA = void 0;
3
+ exports.rotuloDoNo = exports.ErroDeConsulta = exports.TUDO_IGUAL = exports.TEXTOS_DA_CONSULTA = exports.AVISO_DE_PARCIALIDADE = exports.CANDIDATOS_LISTADOS = exports.LIMITE_MAXIMO = exports.LIMITE_PADRAO = exports.PROFUNDIDADE_MAXIMA = exports.CONSULTA_SCHEMA = void 0;
4
4
  exports.filtrarGrafo = filtrarGrafo;
5
5
  exports.prepararConsulta = prepararConsulta;
6
6
  exports.resolverNo = resolverNo;
@@ -23,6 +23,10 @@ exports.textoDaResposta = textoDaResposta;
23
23
  *
24
24
  * D7: a resposta e a mesma para o mesmo grafo e a mesma pergunta, byte a byte, em texto e em JSON
25
25
  * (`ork.code-graph-query/v0`, provisorio e fora do contrato): ordem por code point, sem horario.
26
+ *
27
+ * RM-031 KG5 fatia 5 (D2 a D4, D9, D10): a resposta traz `fontes`, o sha256 e o blob de cada caminho
28
+ * citado, e cada aresta diz se as fontes dela conferem com a arvore. Quem chama passa a situacao de
29
+ * cada caminho (o CLI le os bytes); sem ela, tudo vale `igual`, e a consulta continua sem arquivo.
26
30
  */
27
31
  const intelligence_graph_contract_1 = require("./intelligence-graph-contract");
28
32
  exports.CONSULTA_SCHEMA = 'ork.code-graph-query/v0';
@@ -32,6 +36,25 @@ exports.LIMITE_MAXIMO = 10_000;
32
36
  /** Candidatos listados quando um nome solto e ambiguo. */
33
37
  exports.CANDIDATOS_LISTADOS = 20;
34
38
  exports.AVISO_DE_PARCIALIDADE = 'parcial: so arestas que o extrator prova; chamada por despacho de tipo, import nao resolvido e as lacunas do relatorio de extracao ficam fora';
39
+ exports.TEXTOS_DA_CONSULTA = {
40
+ titulo: (repositorio, revisao, chave, snapshot) => `grafo de ${repositorio} na revisao ${revisao}, indice ${chave}, snapshot ${snapshot}`,
41
+ arvore: 'aviso: a arvore tem mudanca rastreada; a resposta e do HEAD, nao da arvore',
42
+ fontes: (lista, resto) => `fontes que mudaram na arvore: ${lista}${resto ? ` e mais ${resto}` : ''}`,
43
+ marca: ' [fonte modificada na arvore]',
44
+ pagina: (pagina) => `pagina ${pagina}`,
45
+ extratores: (lista) => `extratores: ${lista}`,
46
+ semCaminho: (de, para, sentido, nos) => `sem caminho de ${de} para ${para} (sentido ${sentido}): ${nos} nos explorados`,
47
+ caminho: (de, para, sentido, passos) => `caminho de ${de} para ${para} (sentido ${sentido}): ${passos} passo(s)`,
48
+ contra: '(contra a aresta) ',
49
+ todos: 'todos',
50
+ resultado: (tipo, alvo, profundidade, filtro, arestas, nos) => `${tipo} de ${alvo} (profundidade ${profundidade}${filtro}): ${arestas} aresta(s), ${nos} no(s)`,
51
+ filtro: (sentido, tipos) => `, sentido ${sentido}, tipos ${tipos}`,
52
+ truncado: (devolvidas, total) => `truncado: ${devolvidas} de ${total} arestas, as mais perto do alvo; use --limite`,
53
+ parcial: exports.AVISO_DE_PARCIALIDADE,
54
+ };
55
+ /** Sem saber da arvore, toda fonte vale `igual`: e o que a arvore limpa garante. */
56
+ const TUDO_IGUAL = () => 'igual';
57
+ exports.TUDO_IGUAL = TUDO_IGUAL;
35
58
  /** Erro tipado da consulta; `candidatos` so no nome ambiguo, e so com nos visiveis. */
36
59
  class ErroDeConsulta extends Error {
37
60
  codigo;
@@ -101,7 +124,11 @@ function prepararConsulta(grafoInteiro, concessao) {
101
124
  lista.sort(ordem((a) => rotulos.get(a.from)));
102
125
  for (const lista of porFragmento.values())
103
126
  lista.sort((x, y) => (0, intelligence_graph_contract_1.compararUtf8)((0, exports.rotuloDoNo)(x), (0, exports.rotuloDoNo)(y)));
104
- return { repository_id: grafo.repository_id, snapshot_id: grafo.snapshot.snapshot_id, nos, rotulos, porLocalizador, arquivos, porFragmento, saida, entrada };
127
+ const fontes = new Map();
128
+ for (const m of grafo.snapshot.source_manifest)
129
+ if (visivel(m.access, concessao))
130
+ fontes.set(m.path, { source_hash: m.source_hash, source_version: m.source_version });
131
+ return { repository_id: grafo.repository_id, snapshot_id: grafo.snapshot.snapshot_id, nos, rotulos, porLocalizador, arquivos, porFragmento, saida, entrada, fontes };
105
132
  }
106
133
  function ambiguo(texto, candidatos) {
107
134
  const rotulos = candidatos.map(exports.rotuloDoNo).sort(intelligence_graph_contract_1.compararUtf8);
@@ -169,6 +196,31 @@ function arestaDaResposta(g, a, distancia) {
169
196
  || (0, intelligence_graph_contract_1.compararUtf8)(x.extractor_id, y.extractor_id) || (0, intelligence_graph_contract_1.compararUtf8)(x.extraction_method, y.extraction_method));
170
197
  return { kind: a.kind, from: g.rotulos.get(a.from), to: g.rotulos.get(a.to), edge_id: a.edge_id, distancia, evidencias };
171
198
  }
199
+ /**
200
+ * KG5 fatia 5 (D4): a aresta so e `igual` quando as fontes dela inteiras conferem: o arquivo da origem, o
201
+ * do alvo (calls e imports resolvem o alvo nele) e os das evidencias. So as devolvidas pedem a situacao.
202
+ * Com teto, a busca binaria monta respostas com limites diferentes, e o CLI le os arquivos citados pela
203
+ * maior delas, a do limite pedido, mesmo os que o corte tira (CHECK rodada 1, S4).
204
+ */
205
+ function comArvore(g, a, r, situacao) {
206
+ const caminhos = [g.nos.get(a.from).locator.path, g.nos.get(a.to).locator.path, ...r.evidencias.map((e) => e.path)];
207
+ const { evidencias, ...resto } = r;
208
+ return { ...resto, arvore: caminhos.every((p) => situacao(p) === 'igual') ? 'igual' : 'modificada', evidencias };
209
+ }
210
+ /** KG5 fatia 5 (D2, D10): uma entrada por caminho dos nos e das evidencias da resposta, em ordem UTF-8. */
211
+ function fontesDaResposta(g, nos, arestas, situacao) {
212
+ const caminhos = new Set(nos.map((n) => n.path));
213
+ for (const a of arestas)
214
+ for (const e of a.evidencias)
215
+ caminhos.add(e.path);
216
+ const fontes = [];
217
+ for (const p of [...caminhos].sort(intelligence_graph_contract_1.compararUtf8)) {
218
+ const f = g.fontes.get(p);
219
+ if (f)
220
+ fontes.push({ path: p, source_hash: f.source_hash, source_version: f.source_version, arvore: situacao(p) });
221
+ }
222
+ return fontes;
223
+ }
172
224
  /** CHECK rodada 1 (A2): primeiro as arestas mais perto do alvo, e o limite corta as mais longe. */
173
225
  const ordemDasArestas = (x, y) => (x.distancia - y.distancia)
174
226
  || (0, intelligence_graph_contract_1.compararUtf8)(x.kind, y.kind) || (0, intelligence_graph_contract_1.compararUtf8)(x.from, y.from) || (0, intelligence_graph_contract_1.compararUtf8)(x.to, y.to) || (0, intelligence_graph_contract_1.compararUtf8)(x.edge_id, y.edge_id);
@@ -204,7 +256,7 @@ function tiposValidos(tipos) {
204
256
  * cada uma com a distancia do no que a explorou. `limite` corta pela distancia e pela ordem fixa, e
205
257
  * a lista de nos so traz o alvo e as pontas das arestas devolvidas.
206
258
  */
207
- function vizinhanca(g, cabecalho, tipo, texto, opcoes) {
259
+ function vizinhanca(g, cabecalho, tipo, texto, opcoes, situacao) {
208
260
  const profundidade = inteiroEntre('profundidade', opcoes.profundidade ?? 1, 1, exports.PROFUNDIDADE_MAXIMA);
209
261
  const limite = inteiroEntre('limite', opcoes.limite ?? exports.LIMITE_PADRAO, 1, exports.LIMITE_MAXIMO);
210
262
  const sentido = opcoes.sentido ?? 'ambos';
@@ -228,8 +280,8 @@ function vizinhanca(g, cabecalho, tipo, texto, opcoes) {
228
280
  }
229
281
  camada = proxima;
230
282
  }
231
- const todas = [...vistas.values()].map(({ aresta, d }) => arestaDaResposta(g, aresta, d)).sort(ordemDasArestas);
232
- const devolvidas = todas.slice(0, limite);
283
+ const todas = [...vistas.values()].map(({ aresta, d }) => ({ aresta, r: arestaDaResposta(g, aresta, d) })).sort((x, y) => ordemDasArestas(x.r, y.r));
284
+ const devolvidas = todas.slice(0, limite).map(({ aresta, r }) => comArvore(g, aresta, r, situacao));
233
285
  const idPorRotulo = new Map([...distancia.keys()].map((id) => [g.rotulos.get(id), id]));
234
286
  const pontas = new Set([alvo.node_id, ...devolvidas.flatMap((a) => [idPorRotulo.get(a.from), idPorRotulo.get(a.to)])]);
235
287
  const nos = [...pontas].map((id) => noDaResposta(g, g.nos.get(id), distancia.get(id)))
@@ -239,31 +291,31 @@ function vizinhanca(g, cabecalho, tipo, texto, opcoes) {
239
291
  consulta: { tipo, alvo: texto, para: null, profundidade, sentido, tipos, limite },
240
292
  indice: cabecalho, alvo: noDaResposta(g, alvo, 0), para: null, nos, total_nos: distancia.size,
241
293
  arestas: devolvidas, total_arestas: todas.length, truncado: todas.length > limite,
242
- caminho: null, nos_explorados: null, parcial: exports.AVISO_DE_PARCIALIDADE,
294
+ caminho: null, nos_explorados: null, fontes: fontesDaResposta(g, nos, devolvidas, situacao), parcial: exports.AVISO_DE_PARCIALIDADE,
243
295
  };
244
296
  }
245
- function vizinhos(g, cabecalho, alvo, opcoes = {}) {
246
- return vizinhanca(g, cabecalho, 'vizinhos', alvo, opcoes);
297
+ function vizinhos(g, cabecalho, alvo, opcoes = {}, situacao = exports.TUDO_IGUAL) {
298
+ return vizinhanca(g, cabecalho, 'vizinhos', alvo, opcoes, situacao);
247
299
  }
248
300
  /** Quem chama o simbolo: as arestas `calls` que chegam, ate `profundidade` saltos. */
249
- function chamadores(g, cabecalho, alvo, opcoes = {}) {
301
+ function chamadores(g, cabecalho, alvo, opcoes = {}, situacao = exports.TUDO_IGUAL) {
250
302
  if (resolverNo(g, alvo).kind !== 'symbol')
251
303
  throw new ErroDeConsulta('grafo.consulta.alvo-invalido', 'chamadores pede um simbolo; para arquivo, use importadores ou vizinhos');
252
- return vizinhanca(g, cabecalho, 'chamadores', alvo, { ...opcoes, sentido: 'entrada', tipos: ['calls'] });
304
+ return vizinhanca(g, cabecalho, 'chamadores', alvo, { ...opcoes, sentido: 'entrada', tipos: ['calls'] }, situacao);
253
305
  }
254
306
  /** Quem importa o arquivo ou o simbolo: as arestas `imports` que chegam, ate `profundidade` saltos. */
255
- function importadores(g, cabecalho, alvo, opcoes = {}) {
307
+ function importadores(g, cabecalho, alvo, opcoes = {}, situacao = exports.TUDO_IGUAL) {
256
308
  const kind = resolverNo(g, alvo).kind;
257
309
  if (kind !== 'file' && kind !== 'symbol')
258
310
  throw new ErroDeConsulta('grafo.consulta.alvo-invalido', 'importadores pede um arquivo ou um simbolo');
259
- return vizinhanca(g, cabecalho, 'importadores', alvo, { ...opcoes, sentido: 'entrada', tipos: ['imports'] });
311
+ return vizinhanca(g, cabecalho, 'importadores', alvo, { ...opcoes, sentido: 'entrada', tipos: ['imports'] }, situacao);
260
312
  }
261
313
  /**
262
314
  * D5: o menor caminho de `de` a `para`, pelas arestas no sentido pedido (padrao: `saida`, a direcao
263
315
  * da aresta). Busca em largura com a expansao na ordem fixa: entre caminhos do mesmo tamanho, sai
264
316
  * sempre o mesmo. Sem caminho, `caminho` e `null`, com os nos explorados.
265
317
  */
266
- function caminho(g, cabecalho, de, para, opcoes = {}) {
318
+ function caminho(g, cabecalho, de, para, opcoes = {}, situacao = exports.TUDO_IGUAL) {
267
319
  const sentido = opcoes.sentido ?? 'saida';
268
320
  if (!['entrada', 'saida', 'ambos'].includes(sentido))
269
321
  throw new ErroDeConsulta('grafo.consulta.uso', `sentido desconhecido: ${sentido}`);
@@ -284,61 +336,71 @@ function caminho(g, cabecalho, de, para, opcoes = {}) {
284
336
  if (anterior.has(destino.node_id)) {
285
337
  const cadeia = [];
286
338
  for (let id = destino.node_id, atual = anterior.get(id); atual; id = atual.de, atual = anterior.get(id)) {
287
- cadeia.push({ id, passo: { sentido: atual.sentido, aresta: arestaDaResposta(g, atual.aresta, 0) } });
339
+ cadeia.push({ id, sentido: atual.sentido, aresta: atual.aresta });
288
340
  }
289
341
  cadeia.reverse();
290
- cadeia.forEach((c, n) => { c.passo.aresta.distancia = n; });
291
- passos = cadeia.map((c) => c.passo);
342
+ passos = cadeia.map((c, n) => ({ sentido: c.sentido, aresta: comArvore(g, c.aresta, arestaDaResposta(g, c.aresta, n), situacao) }));
292
343
  nos = [origem.node_id, ...cadeia.map((c) => c.id)].map((id, d) => noDaResposta(g, g.nos.get(id), d));
293
344
  }
345
+ const arestas = passos ? passos.map((p) => p.aresta) : [];
294
346
  return {
295
347
  schema: exports.CONSULTA_SCHEMA,
296
348
  consulta: { tipo: 'caminho', alvo: de, para, profundidade: null, sentido, tipos, limite: null },
297
349
  indice: cabecalho, alvo: noDaResposta(g, origem, 0), para: noDaResposta(g, destino, passos ? passos.length : null),
298
350
  nos, total_nos: nos.length,
299
- arestas: passos ? passos.map((p) => p.aresta) : [], total_arestas: passos ? passos.length : 0, truncado: false,
300
- caminho: passos, nos_explorados: anterior.size, parcial: exports.AVISO_DE_PARCIALIDADE,
351
+ arestas, total_arestas: arestas.length, truncado: false,
352
+ caminho: passos, nos_explorados: anterior.size, fontes: fontesDaResposta(g, nos, arestas, situacao), parcial: exports.AVISO_DE_PARCIALIDADE,
301
353
  };
302
354
  }
303
355
  function jsonDaResposta(r) {
304
356
  return JSON.stringify(r, null, 2);
305
357
  }
306
- function linhasDaEvidencia(e) {
358
+ function linhasDaEvidencia(e, m) {
307
359
  const s = e.span;
308
360
  const onde = s.type === 'text'
309
361
  ? `${e.path}:${s.line_start ?? '?'}${s.line_end !== null && s.line_end !== s.line_start ? `-${s.line_end}` : ''}`
310
- : `${e.path} pagina ${s.page}`;
362
+ : `${e.path} ${m.pagina(s.page)}`;
311
363
  return ` ${e.extractor_id} ${e.extraction_method} ${onde} bytes ${s.byte_start}-${s.byte_end}`;
312
364
  }
313
- function linhasDaAresta(a, prefixo = ' ') {
314
- return [`${prefixo}${a.kind} ${a.from} -> ${a.to}`, ...a.evidencias.map(linhasDaEvidencia)];
365
+ /** KG5 fatia 5 (D9): a aresta cuja fonte mudou diz isso na propria linha, como o JSON diz no campo `arvore`. */
366
+ function linhasDaAresta(a, m, prefixo = ' ') {
367
+ const marca = a.arvore === 'modificada' ? m.marca : '';
368
+ return [`${prefixo}${a.kind} ${a.from} -> ${a.to}${marca}`, ...a.evidencias.map((e) => linhasDaEvidencia(e, m))];
369
+ }
370
+ /** KG5 fatia 5 (D9): ate cinco fontes que nao tem na arvore os bytes do indice, com a situacao de cada uma. */
371
+ function linhaDasFontesMudadas(fontes, m) {
372
+ const mudaram = fontes.filter((f) => f.arvore !== 'igual');
373
+ if (!mudaram.length)
374
+ return [];
375
+ return [m.fontes(mudaram.slice(0, 5).map((f) => `${f.path} (${f.arvore})`).join(', '), Math.max(0, mudaram.length - 5))];
315
376
  }
316
- function textoDaResposta(r) {
377
+ function textoDaResposta(r, m = exports.TEXTOS_DA_CONSULTA) {
317
378
  const c = r.consulta, i = r.indice;
318
379
  const linhas = [
319
- `grafo de ${i.repository_id} na revisao ${i.revision.slice(0, 12)}, indice ${i.chave.slice(0, 16)}, snapshot ${i.snapshot_id.slice(0, 17)}`,
380
+ m.titulo(i.repository_id, i.revision.slice(0, 12), i.chave.slice(0, 16), i.snapshot_id.slice(0, 17)),
320
381
  ];
321
382
  if (i.arvore === 'modificada')
322
- linhas.push('aviso: a arvore tem mudanca rastreada; a resposta e do HEAD, nao da arvore');
323
- linhas.push(`extratores: ${i.extratores.map((e) => `${e.extractor_id} ${e.extractor_version}`).join(', ')}`);
383
+ linhas.push(m.arvore);
384
+ linhas.push(...linhaDasFontesMudadas(r.fontes, m));
385
+ linhas.push(m.extratores(i.extratores.map((e) => `${e.extractor_id} ${e.extractor_version}`).join(', ')));
324
386
  if (c.tipo === 'caminho') {
325
387
  const para = r.para;
326
388
  if (!r.caminho) {
327
- linhas.push(`sem caminho de ${r.alvo.rotulo} para ${para.rotulo} (sentido ${c.sentido}): ${r.nos_explorados} nos explorados`);
389
+ linhas.push(m.semCaminho(r.alvo.rotulo, para.rotulo, c.sentido, r.nos_explorados));
328
390
  }
329
391
  else {
330
- linhas.push(`caminho de ${r.alvo.rotulo} para ${para.rotulo} (sentido ${c.sentido}): ${r.caminho.length} passo(s)`);
331
- r.caminho.forEach((p, n) => linhas.push(...linhasDaAresta(p.aresta, ` ${n + 1}. ${p.sentido === 'entrada' ? '(contra a aresta) ' : ''}`)));
392
+ linhas.push(m.caminho(r.alvo.rotulo, para.rotulo, c.sentido, r.caminho.length));
393
+ r.caminho.forEach((p, n) => linhas.push(...linhasDaAresta(p.aresta, m, ` ${n + 1}. ${p.sentido === 'entrada' ? m.contra : ''}`)));
332
394
  }
333
395
  }
334
396
  else {
335
- const filtro = c.tipo === 'vizinhos' ? `, sentido ${c.sentido}, tipos ${c.tipos.length === intelligence_graph_contract_1.TIPOS_DE_ARESTA.length ? 'todos' : c.tipos.join(',')}` : '';
336
- linhas.push(`${c.tipo} de ${r.alvo.rotulo} (profundidade ${c.profundidade}${filtro}): ${r.total_arestas} aresta(s), ${r.total_nos - 1} no(s)`);
397
+ const filtro = c.tipo === 'vizinhos' ? m.filtro(c.sentido, c.tipos.length === intelligence_graph_contract_1.TIPOS_DE_ARESTA.length ? m.todos : c.tipos.join(',')) : '';
398
+ linhas.push(m.resultado(c.tipo, r.alvo.rotulo, c.profundidade, filtro, r.total_arestas, r.total_nos - 1));
337
399
  for (const a of r.arestas)
338
- linhas.push(...linhasDaAresta(a));
400
+ linhas.push(...linhasDaAresta(a, m));
339
401
  if (r.truncado)
340
- linhas.push(`truncado: ${r.arestas.length} de ${r.total_arestas} arestas, as mais perto do alvo; use --limite`);
402
+ linhas.push(m.truncado(r.arestas.length, r.total_arestas));
341
403
  }
342
- linhas.push(r.parcial);
404
+ linhas.push(m.parcial);
343
405
  return linhas.join('\n');
344
406
  }
package/dist/leases.js CHANGED
@@ -97,6 +97,7 @@ const horario_1 = require("./horario");
97
97
  const conducao_texto_1 = require("./conducao-texto");
98
98
  const ledger_1 = require("./ledger");
99
99
  const thread_1 = require("./thread");
100
+ const locale_1 = require("./locale");
100
101
  /** Nome do lease que serializa o merge na base (visao, paridade 5). */
101
102
  exports.LEASE_MAIN_TREE = 'main-tree';
102
103
  /** TTL padrao de 30 minutos: um SHIP que passe disso deixou de existir. */
@@ -1033,24 +1034,25 @@ function adquirirRegiao(raiz, nome, opcoes) {
1033
1034
  }
1034
1035
  /** Texto de `ork lease list`: leases ativos, familias e a fila por colisao. */
1035
1036
  function tabelaDeLeases(raiz) {
1037
+ const m = (0, locale_1.msg)().operacao.restante.lease;
1036
1038
  const emDisco = leasesEmDisco(raiz);
1037
1039
  const fila = lerFila(raiz);
1038
- const linhas = ['Leases do projeto', ''];
1040
+ const linhas = [m.titulo, ''];
1039
1041
  const principal = (0, estado_thread_1.raizDoEstado)(raiz);
1040
1042
  if (emDisco.length === 0) {
1041
- linhas.push(' Nenhum lease tomado. O merge na base esta liberado.');
1043
+ linhas.push(m.nenhum);
1042
1044
  }
1043
1045
  else {
1044
1046
  for (const { lease: l, legado } of emDisco) {
1045
- const situacao = expirado(l) ? 'VENCIDO (tomavel)' : 'ativo';
1046
- linhas.push(` ${textoSeguro(l.nome).padEnd(28)} [${tipoDoLease(l.nome)}] thread ${textoSeguro(l.thread).padEnd(18)} ${situacao}`);
1047
- linhas.push(` desde ${(0, horario_1.formatarDataHora)(l.adquiridoEm)} ate ${(0, horario_1.formatarDataHora)(l.expiraEm)} (pid ${l.pid})`);
1048
- linhas.push(` motivo: ${textoSeguro(l.motivo)}`);
1047
+ const situacao = expirado(l) ? m.situacao.vencido : m.situacao.ativo;
1048
+ linhas.push(m.item(textoSeguro(l.nome), tipoDoLease(l.nome), textoSeguro(l.thread), situacao));
1049
+ linhas.push(m.periodo((0, horario_1.formatarDataHora)(l.adquiridoEm), (0, horario_1.formatarDataHora)(l.expiraEm), l.pid));
1050
+ linhas.push(m.motivo(textoSeguro(l.motivo)));
1049
1051
  // RM-036: a copia antiga e somente lida, ate vencer ou encerrar a janela.
1050
1052
  if (legado) {
1051
1053
  const relativo = path.relative(principal, legado);
1052
1054
  const onde = relativo && !relativo.startsWith('..') && !path.isAbsolute(relativo) ? relativo : legado;
1053
- linhas.push(` legado: ${textoSeguro(onde)} (vale enquanto vivo, dentro da janela de 30 min da troca)`);
1055
+ linhas.push(m.legado(textoSeguro(onde)));
1054
1056
  }
1055
1057
  // I-36: o lease de execucao diz quem conduz, com a mesma linha das outras superficies.
1056
1058
  const conducao = (0, conducao_texto_1.conducaoDoLease)(l);
@@ -1088,15 +1090,15 @@ function tabelaDeLeases(raiz) {
1088
1090
  }
1089
1091
  if (tipoDoLease(nome) === 'exec')
1090
1092
  continue;
1091
- linhas.push(` legado: ${textoSeguro(arquivo)} INVALIDO ou ILEGIVEL (ignorado)`);
1092
- linhas.push(' arquivo legado preservado; ignorado sem alterar o lease canonico');
1093
+ linhas.push(m.legadoInvalido(textoSeguro(arquivo)));
1094
+ linhas.push(m.legadoPreservado);
1093
1095
  }
1094
1096
  }
1095
1097
  linhas.push('');
1096
1098
  // Consulta nao recolhe candidatos: mostra a fila, inclusive sobras de SIGKILL.
1097
1099
  const pasta = dirLeases(raiz);
1098
1100
  const retomadas = fs.existsSync(pasta) ? fs.readdirSync(pasta).filter((n) => n.endsWith('.json.retomadas')).sort() : [];
1099
- linhas.push(`Fila de retomada: ${retomadas.length === 0 ? 'vazia' : `${retomadas.length} lease(s)`}`);
1101
+ linhas.push(m.filaRetomada(retomadas.length));
1100
1102
  for (const nome of retomadas) {
1101
1103
  const dir = path.join(pasta, nome);
1102
1104
  linhas.push(` ${textoSeguro(nome)}`);
@@ -1108,25 +1110,24 @@ function tabelaDeLeases(raiz) {
1108
1110
  if (!c)
1109
1111
  continue;
1110
1112
  const idade = Math.max(0, Date.now() - c.stat.mtimeMs), vencido = idade >= exports.TTL_PADRAO_MS;
1111
- linhas.push(` ${textoSeguro(c.nome)} pid ${c.pid} ${c.ticket === null ? 'temporario' : `ticket ${c.ticket}`} idade ${Math.floor(idade / 1000)}s`);
1113
+ linhas.push(m.candidato(textoSeguro(c.nome), c.pid, c.ticket, Math.floor(idade / 1000)));
1112
1114
  if (vencido)
1113
- linhas.push(' lease.resume-unavailable: prazo de 30 min excedido; repita a aquisicao para recolher e consulte ork lease list');
1115
+ linhas.push(m.prazo);
1114
1116
  }
1115
1117
  }
1116
1118
  catch {
1117
- linhas.push(' lease.resume-unavailable: fila ilegivel ou insegura; inspecione candidatos antes de repetir a aquisicao');
1119
+ linhas.push(m.filaInsegura);
1118
1120
  }
1119
1121
  }
1120
1122
  const merge = fila.filter((p) => p.tipo === 'main-tree');
1121
1123
  const regiao = fila.filter((p) => p.tipo !== 'main-tree');
1122
- linhas.push(`Fila de merge (lease ${exports.LEASE_MAIN_TREE}): ${merge.length === 0 ? 'vazia' : `${merge.length} na espera`}`);
1124
+ linhas.push(m.filaMerge(merge.length));
1123
1125
  merge.forEach((p, i) => {
1124
- linhas.push(` ${i + 1}. thread ${textoSeguro(p.thread)} desde ${(0, horario_1.formatarDesde)(p.desdeEm)} (bloqueada por ${textoSeguro(p.bloqueadaPor)})`);
1126
+ linhas.push(m.esperaMerge(i + 1, textoSeguro(p.thread), (0, horario_1.formatarDesde)(p.desdeEm), textoSeguro(p.bloqueadaPor)));
1125
1127
  });
1126
- linhas.push(`Fila por colisao de regiao: ${regiao.length === 0 ? 'vazia' : `${regiao.length} na espera`}`);
1128
+ linhas.push(m.filaRegiao(regiao.length));
1127
1129
  regiao.forEach((p, i) => {
1128
- linhas.push(` ${i + 1}. thread ${textoSeguro(p.thread)} quer ${textoSeguro(p.nome)}, colide com ${textoSeguro(p.colidiuCom)} ` +
1129
- `(thread ${textoSeguro(p.bloqueadaPor)}) desde ${(0, horario_1.formatarDesde)(p.desdeEm)}`);
1130
+ linhas.push(m.esperaRegiao(i + 1, textoSeguro(p.thread), textoSeguro(p.nome), textoSeguro(p.colidiuCom), textoSeguro(p.bloqueadaPor), (0, horario_1.formatarDesde)(p.desdeEm)));
1130
1131
  });
1131
1132
  if (emDisco.length > 0 || fila.length > 0)
1132
1133
  linhas.push((0, horario_1.legendaDoFuso)());
@@ -45,6 +45,7 @@ const ledger_1 = require("./ledger");
45
45
  const util_1 = require("./util");
46
46
  const horario_1 = require("./horario");
47
47
  const hitl_tempo_parado_1 = require("./hitl-tempo-parado");
48
+ const locale_1 = require("./locale");
48
49
  const MOTIVOS_PREVENTIVOS = new Set([
49
50
  'policy.violation', 'cost.violation', 'verify.regression', 'claims.failed', 'claims.unverifiable',
50
51
  ]);
@@ -260,27 +261,27 @@ function registrarEstimativaPlano(raiz, threadId, dados) {
260
261
  throw Error('ledger.estimate.head-unavailable');
261
262
  return (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, 'plan_estimate', { fase: 'PLAN', unidade: 'hours', semIaHoras: dados.semIaHoras, iaSemOrkHoras: dados.iaSemOrkHoras, por: dados.por, metodo: dados.metodo, premissas: dados.premissas, incerteza: dados.incerteza ?? 'nao informada', head: head.stdout.trim() });
262
263
  }
263
- const minutos = (ms) => ms === null ? 'sem resposta medida' : `${(ms / 60_000).toFixed(1)} min`;
264
+ const minutos = (ms) => ms === null ? (0, locale_1.msg)().operacao.ledger.semResposta : `${(ms / 60_000).toFixed(1)} min`;
264
265
  /** RM-057: uma linha, com a meta ao lado da mediana, para o dono ver o tempo parado sem abrir o JSON. */
265
266
  function linhaDoHitlDeConducao(h) {
266
- const meta = h.dentroDaMeta === null ? '' : h.dentroDaMeta ? ' (dentro da meta de 5 min)' : ' (acima da meta de 5 min)';
267
- return ` HITL de conducao ${h.pedidos} pergunta(s); parado ${(h.paradoMs / 3_600_000).toFixed(2)} h; ` +
268
- `mediana ${minutos(h.medianaRespostaMs)}${meta}; ${h.abertos} aberta(s); ` +
269
- `texto fora da excecao ${h.emTexto.foraDaExcecao}`;
267
+ const m = (0, locale_1.msg)().operacao.ledger;
268
+ const meta = h.dentroDaMeta === null ? '' : h.dentroDaMeta ? m.metaDentro : m.metaFora;
269
+ return m.hitl(h.pedidos, (h.paradoMs / 3_600_000).toFixed(2), minutos(h.medianaRespostaMs), meta, h.abertos, h.emTexto.foraDaExcecao);
270
270
  }
271
271
  function textoDasEstatisticas(r) {
272
- const dinheiro = r.custoReferencia.valor === null ? 'sem cobertura' : `USD ${r.custoReferencia.valor.toFixed(6)}`;
272
+ const m = (0, locale_1.msg)().operacao.ledger;
273
+ const dinheiro = r.custoReferencia.valor === null ? m.semCobertura : `USD ${r.custoReferencia.valor.toFixed(6)}`;
273
274
  return [
274
- `Ledger stats ${(0, horario_1.formatarDataHora)(r.periodo.desde)} ate ${(0, horario_1.formatarDataHoraRotulada)(r.periodo.ate)} ${r.periodo.intervalo}`,
275
- ` threads/sessoes ${r.threads} / ${r.sessoes.concluidas} concluidas (${r.sessoes.despachadas} despachos)`,
276
- ` throughput ${r.throughput.ships} ship(s); ${r.sessoes.retries} retry(ies)`,
277
- ` execucao ${r.execucao.horas.toFixed(2)} h (${r.execucao.cobertura.medidas} medidas; ${r.execucao.cobertura.semMedida} ausentes)`,
278
- ` tokens ${r.tokens.total} total; input ${r.tokens.input} (cached ${r.tokens.cachedInput}); output ${r.tokens.output}`,
279
- ` custo referencia ${dinheiro} — estimativa por tarifa publica, nao gasto/fatura`,
280
- ` espera humana ${(r.esperaHumana.milissegundos / 3_600_000).toFixed(2)} h; ${r.esperaHumana.abertas} aberta(s)`,
275
+ m.periodo((0, horario_1.formatarDataHora)(r.periodo.desde), (0, horario_1.formatarDataHoraRotulada)(r.periodo.ate), r.periodo.intervalo),
276
+ m.sessoes(r.threads, r.sessoes.concluidas, r.sessoes.despachadas),
277
+ m.throughput(r.throughput.ships, r.sessoes.retries),
278
+ m.execucao(r.execucao.horas.toFixed(2), r.execucao.cobertura.medidas, r.execucao.cobertura.semMedida),
279
+ m.tokens(r.tokens.total, r.tokens.input, r.tokens.cachedInput, r.tokens.output),
280
+ m.custo(dinheiro),
281
+ m.espera((r.esperaHumana.milissegundos / 3_600_000).toFixed(2), r.esperaHumana.abertas),
281
282
  linhaDoHitlDeConducao(r.hitlDeConducao),
282
- ` riscos evitados ${r.riscosPreventivos.total} gate(s) preventivo(s)`,
283
- ` estimativas PLAN ${r.estimativasPlano.amostras} amostra(s)`,
284
- ...r.qualidade.observacoes.map(o => ` cobertura ${o}`),
283
+ m.riscos(r.riscosPreventivos.total),
284
+ m.estimativas(r.estimativasPlano.amostras),
285
+ ...r.qualidade.observacoes.map(o => m.cobertura(m.observacao(o))),
285
286
  ].join('\n');
286
287
  }
package/dist/ledger.js CHANGED
@@ -52,6 +52,7 @@ const path = __importStar(require("node:path"));
52
52
  const util_1 = require("./util");
53
53
  const node_crypto_1 = require("node:crypto");
54
54
  const company_brain_journal_1 = require("./company-brain-journal");
55
+ const locale_1 = require("./locale");
55
56
  /** Tipos de evento do ledger. B0 abriu a lista; o B1 acrescenta os seus. */
56
57
  exports.TIPOS_DE_EVENTO = {
57
58
  // Bloco B0
@@ -60,6 +61,10 @@ exports.TIPOS_DE_EVENTO = {
60
61
  faseDespachada: 'phase_dispatch',
61
62
  despachoVerificado: 'phase_dispatch_verified',
62
63
  despachoFalhou: 'phase_dispatch_failed',
64
+ // RM-063 (F3): o prompt foi ao disco e ao ledger, com o sha256, ANTES do adaptador. O despacho que morre
65
+ // depois (contexto do runtime, adaptador que lanca, processo morto) deixa o que o `ork retry run`
66
+ // redespacha sem pedir o texto. Escritor: `phase.ts` (`rodarFaseSobLock`).
67
+ promptGravado: 'phase_prompt_recorded',
63
68
  decisaoAutonoma: 'autonomous_decision',
64
69
  pausaHumana: 'human_gate',
65
70
  // Bloco B1: verdade, leases, ship e handoff
@@ -73,6 +78,10 @@ exports.TIPOS_DE_EVENTO = {
73
78
  shipIniciado: 'ship_started',
74
79
  shipConcluido: 'ship_done',
75
80
  shipBloqueado: 'ship_blocked',
81
+ // Security scan: a loop category was not scanned for the candidate SHA and a human authorized the delivery anyway.
82
+ entregaSemScanAutorizada: 'ship_unscanned_authorized',
83
+ // RM-059 (F7, T7.1): o `ork ship publicar` publicou a branch ou abriu o PR, com a prova do `ls-remote`.
84
+ shipPublicado: 'ship_published',
76
85
  /**
77
86
  * I-43 (D3): a entrega foi revertida na base depois do ship.
78
87
  *
@@ -96,6 +105,13 @@ exports.TIPOS_DE_EVENTO = {
96
105
  handoffRecuperado: 'handoff_recalled',
97
106
  // Bloco B2: worktree gerenciada, fila de leases, escalonador e MASTER/score
98
107
  worktreeGarantida: 'worktree_ensured',
108
+ /** RM-037 (defeito 2 de 19 e 20/10/2026): o preparo de `worktree.dependencias` na worktree nova. */
109
+ worktreeDependencias: 'worktree_dependencias',
110
+ /**
111
+ * RM-037 (CHECK 3 da ork-rm037defeit2): o preparo que a criacao adiou (o passo do arco abre a thread sob a trava de
112
+ * despacho); a baseline e o verify o rodam antes do primeiro comando.
113
+ */
114
+ worktreeDependenciasPendentes: 'worktree_dependencias_pendentes',
99
115
  worktreeSincronizada: 'worktree_synced',
100
116
  worktreeAuditada: 'worktree_audited',
101
117
  worktreeLiberada: 'worktree_released',
@@ -175,6 +191,33 @@ exports.TIPOS_DE_EVENTO = {
175
191
  // RM-037 (rm037defeito, A-1 do CHECK 3): o despacho recusado antes da sessao devolveu o lease que a tomada consumiu.
176
192
  conducaoDevolvida: 'conducao_devolvida',
177
193
  conducaoRenovada: 'conducao_renovada',
194
+ // RM-063 (F1): a batida da varredura instalada ou removida no crontab desta maquina, pelo
195
+ // `ork fabrica batida`. Mora no ledger da maquina (`~/.orkastery/ledger.jsonl`, thread `maquina`):
196
+ // o crontab e do usuario na maquina, nao de uma thread. Escritor: `fabrica-batida.ts`.
197
+ batidaInstalada: 'batida_instalada',
198
+ batidaRemovida: 'batida_removida',
199
+ // RM-063 (F4): um degrau da escada de recuperacao do runtime (reerguer o daemon, o fallback do bloco, outro
200
+ // perfil), feito, pulado ou falho, com o destino e o mesmo sha256 do prompt. Escritor: `runtime-escada.ts`.
201
+ recuperacaoDoRuntime: 'runtime_recuperacao',
202
+ // RM-063 (F5): uma acao da varredura (limpar sessao fantasma, registrar a entrega de PR mesclado, MASTER por omissao),
203
+ // feita ou recusada, com a autorizacao duravel do dono que a permitiu. Escritor: `varredura-acoes.ts`.
204
+ acaoDaVarredura: 'varredura_acao',
205
+ // RM-063 (F6): o dono foi avisado de que a maquina esta ociosa (vaga livre e item reservado para ela sem ninguem
206
+ // trabalhando), uma linha por episodio, no ledger do projeto. Escritor: a varredura (`pulse-delivery.ts`).
207
+ maquinaOciosaAvisada: 'maquina_ociosa_avisada',
208
+ // RM-063 (F7): o dono gravou a autorizacao duravel desta maquina (`ork conducao autorizar`), no ledger do projeto, com
209
+ // quem autorizou, ate quando, o que pode e a que ela substituiu. Escritor: `autorizacao-duravel.ts`.
210
+ autorizacaoConcedida: 'autorizacao_concedida',
211
+ // RM-059 (F6, T6.4): a Sentinela do Condutor ligou ou desligou nesta maquina (ledger do projeto, so na troca).
212
+ sentinelaLigada: 'sentinela_ligada',
213
+ sentinelaDesligada: 'sentinela_desligada',
214
+ // RM-059 (F9, T9.1): a resposta de sessao `claude-bg` pelo Mensageiro de Sessoes (`entrega-por-mod.ts`), sem o
215
+ // texto, so o sha256 do corpo. Na fila: o `enviar` do controle por mod, no servidor do dono que recebeu a resposta.
216
+ // Enviada: a `ork_session_outbox` com o resultado do `$.session.send`. Reservada: a `ork_session_inbox` do servidor
217
+ // preso ao despacho, quando a conferencia no receptor passa. O `session_answered` sai da reconciliacao de sempre.
218
+ entregaNaFila: 'session_delivery_queued',
219
+ entregaEnviada: 'session_delivery_sent',
220
+ entregaReservada: 'session_delivery_reserved',
178
221
  };
179
222
  /**
180
223
  * I-41 (GO-FIX 1, B4 e D11): o rastro tipado da decisao autonoma.
@@ -190,7 +233,8 @@ function exigirRastroDeDecisaoAutonoma(dados) {
190
233
  for (const campo of ['quemDecidiu', 'evidencia', 'razao']) {
191
234
  const v = dados[campo];
192
235
  if (typeof v !== 'string' || !v.trim() || v.length > 1000 || /[\x00-\x08\x0b-\x1f\x7f]/.test(v)) {
193
- throw new Error(`decisão autônoma exige ${campo}: quem decidiu, com que evidência e por quê`);
236
+ // RM-061 F3c: a recusa sai do catalogo, na lingua de quem a le; o pt-BR e o de sempre.
237
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.rastroObrigatorio(campo));
194
238
  }
195
239
  }
196
240
  }
@@ -223,7 +267,7 @@ function registrarSeExiste(dirThread, threadId, tipo, dados = {}) {
223
267
  return null;
224
268
  let fd;
225
269
  try {
226
- fd = fs.openSync(caminhoLedger(dirThread), fs.constants.O_WRONLY | fs.constants.O_APPEND);
270
+ fd = fs.openSync(caminhoLedger(dirThread), fs.constants.O_WRONLY | fs.constants.O_APPEND | fs.constants.O_NOFOLLOW);
227
271
  }
228
272
  catch (e) {
229
273
  if (e.code === 'ENOENT')
package/dist/licoes.js CHANGED
@@ -58,6 +58,7 @@ const path = __importStar(require("node:path"));
58
58
  const estado_thread_1 = require("./estado-thread");
59
59
  const ledger_1 = require("./ledger");
60
60
  const policies_1 = require("./policies");
61
+ const locale_1 = require("./locale");
61
62
  /** O que evita cada bloqueio, na forma de comando. Sem dica, a licao so conta a recorrencia. */
62
63
  exports.DICA_DO_MOTIVO = {
63
64
  'claims.failed': 'rode o comando da claim antes de registra-la; claim sem prova local volta como GO-FIX',
@@ -154,17 +155,16 @@ const curto = (t, teto) => (t.length > teto ? `${t.slice(0, teto - 3)}...` : t);
154
155
  function textoDasLicoes(r) {
155
156
  if (r.threads === 0 || (r.motivos.length === 0 && r.classes.length === 0 && r.recentes.length === 0))
156
157
  return '';
157
- const linhas = [`Das ${r.threads} threads ja fechadas pelo MASTER neste produto:`];
158
+ const m = (0, locale_1.msg)().operacao.restante.licoes;
159
+ const linhas = [m.resumo(r.threads)];
158
160
  for (const m of r.motivos) {
159
- linhas.push(`- o bloqueio ${m.nome} apareceu em ${m.threads.length} ${m.threads.length === 1 ? 'thread' : 'threads'}` +
160
- (m.dica ? `; o que evita: ${m.dica}` : ''));
161
+ linhas.push((0, locale_1.msg)().operacao.restante.licoes.bloqueio(m.nome, m.threads.length, m.threads.length === 1 ? 'thread' : 'threads', m.dica));
161
162
  }
162
163
  for (const c of r.classes) {
163
- linhas.push(`- a classe de falha ${c.nome} fechou ${c.threads.length} ${c.threads.length === 1 ? 'thread' : 'threads'}` +
164
- (c.dica ? `; o que evita: ${c.dica}` : ''));
164
+ linhas.push(m.classe(c.nome, c.threads.length, c.threads.length === 1 ? 'thread' : 'threads', c.dica));
165
165
  }
166
166
  for (const l of r.recentes)
167
- linhas.push(`- ${l.thread} fechou com ${l.score}/5: ${curto(l.justificativa, 160)}`);
167
+ linhas.push(m.nota(l.thread, l.score, curto(l.justificativa, 160)));
168
168
  return linhas.join('\n');
169
169
  }
170
170
  /** Janela e piso da recorrencia que vira proposta de policy. */
@@ -208,16 +208,17 @@ function registrarPropostasNovas(raiz, agoraIso = new Date().toISOString()) {
208
208
  }
209
209
  /** `ork licoes`: o que volta no proximo GOAL e PLAN, e as propostas de policy. */
210
210
  function textoDeLicoes(raiz, agoraIso = new Date().toISOString()) {
211
+ const m = (0, locale_1.msg)().operacao.restante.licoes;
211
212
  const resumo = resumoDasLicoes(raiz, null);
212
- const linhas = ['Licoes que voltam no GOAL e no PLAN da proxima thread', ''];
213
- linhas.push(textoDasLicoes(resumo) || 'Nenhuma thread fechada pelo MASTER ainda: nada a ensinar.');
213
+ const linhas = [m.titulo, ''];
214
+ linhas.push(textoDasLicoes(resumo) || m.nenhuma);
214
215
  const propostas = propostasDePolicy(raiz, agoraIso);
215
216
  linhas.push('');
216
- linhas.push(`Propostas de policy (a mesma falha em ${exports.PISO_DA_PROPOSTA}+ threads nos ultimos ${exports.JANELA_DA_PROPOSTA_DIAS} dias):`);
217
+ linhas.push(m.propostas(exports.PISO_DA_PROPOSTA, exports.JANELA_DA_PROPOSTA_DIAS));
217
218
  if (propostas.length === 0)
218
- linhas.push(' nenhuma');
219
+ linhas.push(m.propostaNenhuma);
219
220
  for (const p of propostas)
220
221
  linhas.push(` ${p.chave} em ${p.threads.length} threads (${p.threads.slice(0, 5).join(', ')})`, ` ${p.sugestao}`);
221
- linhas.push('', 'Proposta nao bloqueia nada: vira policy so quando o dono a declara em `policies:` no orkastery.yaml.');
222
+ linhas.push('', m.fecho);
222
223
  return linhas.join('\n');
223
224
  }
package/dist/liveness.js CHANGED
@@ -46,6 +46,7 @@ const thread_1 = require("./thread");
46
46
  const ledger_1 = require("./ledger");
47
47
  const retry_1 = require("./retry");
48
48
  const util_1 = require("./util");
49
+ const procedencia_1 = require("./procedencia");
49
50
  /**
50
51
  * Transcrição local do Claude. O UUID evita interpretar identificador como caminho.
51
52
  * I-33 (D4): `config` é o diretório já resolvido pelo perfil da sessão (ou o implícito, sem
@@ -70,8 +71,10 @@ function transcricaoClaude(sessionId, cwd, config) {
70
71
  }
71
72
  return undefined;
72
73
  }
73
- function fontesReais(t, d) {
74
- const commit = t.worktree ? (0, util_1.exec)('git', ['log', '-1', '--format=%cI'], t.worktree) : null;
74
+ function fontesReais(raiz, t, d) {
75
+ // RM-047 (P2): o git da prova de vida so roda na worktree registrada.
76
+ const wt = t.worktree ? (0, procedencia_1.cwdLocalOuNulo)(raiz, t.id, t.worktree, 'thread') : null;
77
+ const commit = wt ? (0, util_1.exec)('git', ['log', '-1', '--format=%cI'], wt) : null;
75
78
  const commitEm = commit?.ok ? commit.stdout.trim() : undefined;
76
79
  if (typeof d.sessionId !== 'string')
77
80
  return { commitEm };
@@ -157,7 +160,7 @@ function detectarFasesOrfas(carregado, opcoes = {}) {
157
160
  incorporar(e.ts, e.tipo);
158
161
  }
159
162
  }
160
- const fontes = (opcoes.fontes ?? fontesReais)(t, d);
163
+ const fontes = opcoes.fontes ? opcoes.fontes(t, d) : fontesReais(carregado.raiz, t, d);
161
164
  incorporar(fontes.commitEm, 'commit na worktree');
162
165
  const file = path.join(dir, 'liveness.json'), chave = `${d.ts}|${d.sessionId}`;
163
166
  let anterior = null;