@orkastery/cli 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +195 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/autoridade.json +56 -0
  16. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  17. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  18. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  19. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  20. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  21. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  23. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  24. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  25. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  26. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  27. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  28. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  29. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  30. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  31. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  32. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  33. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  35. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  36. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  37. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  38. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  39. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  40. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  41. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  42. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  43. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  44. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  45. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  46. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  47. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  48. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  49. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  50. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
  51. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  52. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  53. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  54. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  55. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  56. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  57. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  58. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  59. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  61. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  62. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  63. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  64. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  65. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  66. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  67. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  68. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  69. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  70. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  71. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  72. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  73. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  74. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  75. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  76. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  77. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  78. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  79. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  80. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  82. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  83. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  84. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  85. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  86. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  87. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  88. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  89. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  90. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  91. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  92. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  93. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  94. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  95. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  96. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  97. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  98. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  99. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  100. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  101. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  102. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  103. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  104. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  105. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  106. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  107. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  108. package/adapters/codex/skills/ork/SKILL.md +2 -0
  109. package/adapters/hermes/README.md +64 -1
  110. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  111. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  112. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  113. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  114. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  115. package/adapters/hermes/hermes.plugin.json +4 -0
  116. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  117. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
  118. package/adapters/openclaw/README.md +83 -10
  119. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  120. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  121. package/adapters/openclaw/dist/index.js +86 -0
  122. package/adapters/openclaw/openclaw.plugin.json +34 -4
  123. package/adapters/openclaw/package.json +2 -2
  124. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  125. package/adapters/openclaw/src/index.ts +94 -0
  126. package/assets/adapters-en/claude-code/README.md +403 -0
  127. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  128. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  129. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  130. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  131. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  132. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  133. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  134. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  135. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  136. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  137. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  138. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  139. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  140. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  141. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  142. package/assets/adapters-en/hermes/README.md +273 -0
  143. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  144. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  145. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  146. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  147. package/assets/docs-en/produto/README.md +14 -0
  148. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  149. package/assets/docs-en/roadmap/README.md +14 -0
  150. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  151. package/assets/references-en/README.md +25 -0
  152. package/assets/references-en/code-review-axes.md +82 -0
  153. package/assets/references-en/definition-of-done.md +74 -0
  154. package/assets/references-en/performance-checklist.md +53 -0
  155. package/assets/references-en/security-checklist.md +101 -0
  156. package/assets/references-en/testing-patterns.md +51 -0
  157. package/assets/security-scan/defaults/.golangci.yml +2 -0
  158. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  159. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  160. package/assets/security-scan/defaults/ruff.toml +1 -0
  161. package/assets/security-scan/tools-agil.json +87 -0
  162. package/assets/security-scan/tools.json +625 -0
  163. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  164. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  165. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  166. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  167. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  168. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  169. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  170. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  171. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  172. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  173. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  174. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  175. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  176. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  177. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  178. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  179. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  180. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  181. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  182. package/dist/adapters/claude-bg.js +193 -15
  183. package/dist/adapters/codex-controller-worker.js +12 -5
  184. package/dist/adapters/codex-events.js +16 -4
  185. package/dist/adapters/codex.js +13 -2
  186. package/dist/agents-md.js +24 -15
  187. package/dist/atualizar-branch.js +245 -0
  188. package/dist/auditoria.js +13 -11
  189. package/dist/auditrun.js +68 -48
  190. package/dist/autorizacao-duravel.js +327 -0
  191. package/dist/board.js +98 -43
  192. package/dist/branch-de-estado.js +39 -9
  193. package/dist/busca-semantica.js +7 -5
  194. package/dist/catalogo.js +35 -1
  195. package/dist/changelog-reconciliacao.js +290 -0
  196. package/dist/check-agil.js +500 -0
  197. package/dist/check-modo.js +41 -0
  198. package/dist/check-paralelo.js +183 -0
  199. package/dist/ci.js +255 -46
  200. package/dist/ciclos.js +8 -6
  201. package/dist/claim-lint.js +12 -8
  202. package/dist/claims-conferir.js +350 -0
  203. package/dist/claims.js +13 -10
  204. package/dist/company-brain-client.js +45 -3
  205. package/dist/company-brain-journal.js +2 -1
  206. package/dist/company-brain-migration.js +47 -6
  207. package/dist/conducao-batida.js +759 -0
  208. package/dist/conducao-sentinela.js +405 -0
  209. package/dist/conducao-texto.js +12 -18
  210. package/dist/conducao.js +206 -59
  211. package/dist/conhecimento-consulta.js +270 -0
  212. package/dist/conhecimento.js +514 -0
  213. package/dist/conta-esgotada.js +127 -0
  214. package/dist/dado-privado.js +816 -0
  215. package/dist/decisao-autonoma.js +5 -4
  216. package/dist/demo.js +14 -12
  217. package/dist/dependencias-da-worktree.js +25 -0
  218. package/dist/divida.js +38 -36
  219. package/dist/docs.js +103 -82
  220. package/dist/doctor-forja.js +345 -0
  221. package/dist/doctor-pulse-cron.js +294 -27
  222. package/dist/doctor-rede.js +18 -17
  223. package/dist/doctor.js +278 -116
  224. package/dist/dsn-da-memoria.js +417 -0
  225. package/dist/entrega-por-mod.js +503 -0
  226. package/dist/entrega-pr.js +158 -57
  227. package/dist/escopo-escrita.js +10 -1
  228. package/dist/esgotamentos.js +13 -11
  229. package/dist/estado-thread.js +42 -17
  230. package/dist/evalrunner.js +35 -32
  231. package/dist/experiencia-instalacao.js +45 -25
  232. package/dist/fabrica-batida.js +323 -0
  233. package/dist/fabrica-estado.js +49 -16
  234. package/dist/fabrica-publicar.js +3 -1
  235. package/dist/fila-pesada.js +444 -0
  236. package/dist/fix.js +24 -21
  237. package/dist/forja/adaptador.js +6 -0
  238. package/dist/forja/ambiente-de-ci.js +27 -0
  239. package/dist/forja/api.js +256 -0
  240. package/dist/forja/cache.js +89 -0
  241. package/dist/forja/cli.js +60 -0
  242. package/dist/forja/contrato.js +9 -0
  243. package/dist/forja/endereco.js +43 -0
  244. package/dist/forja/estado.js +22 -0
  245. package/dist/forja/executor.js +73 -0
  246. package/dist/forja/github/ci.js +95 -0
  247. package/dist/forja/github/dono-da-rede.js +18 -0
  248. package/dist/forja/github/metadados.js +15 -0
  249. package/dist/forja/github/pedidos.js +200 -0
  250. package/dist/forja/gitlab/ci.js +141 -0
  251. package/dist/forja/gitlab/consultas.js +59 -0
  252. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  253. package/dist/forja/gitlab/metadados.js +15 -0
  254. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  255. package/dist/forja/gitlab/pedidos.js +141 -0
  256. package/dist/forja/produtor.js +32 -0
  257. package/dist/forja/registro.js +31 -0
  258. package/dist/forja/resolver.js +121 -0
  259. package/dist/forja/texto.js +13 -0
  260. package/dist/forja/versao.js +71 -0
  261. package/dist/forja.js +124 -81
  262. package/dist/gates.js +3 -28
  263. package/dist/handoff.js +33 -19
  264. package/dist/hitl-contract.js +46 -43
  265. package/dist/hitl-curto.js +37 -25
  266. package/dist/hitl-gates.js +13 -11
  267. package/dist/hitl-local-receipt.js +53 -0
  268. package/dist/hitl-local.js +11 -2
  269. package/dist/hitl-lock.js +5 -11
  270. package/dist/hitl-public-receipt.js +11 -0
  271. package/dist/hitl-resumo.js +72 -3
  272. package/dist/hitl-sessions.js +62 -9
  273. package/dist/hitl-tempo-parado.js +4 -4
  274. package/dist/hitl-texto-livre.js +7 -4
  275. package/dist/hitl.js +63 -64
  276. package/dist/horario.js +30 -7
  277. package/dist/hosts.js +155 -134
  278. package/dist/impedimento.js +108 -14
  279. package/dist/index.js +1421 -1019
  280. package/dist/indice-vetorial.js +14 -12
  281. package/dist/indice.js +7 -1
  282. package/dist/init.js +54 -49
  283. package/dist/instabilidade.js +144 -0
  284. package/dist/integracoes-locais.js +4 -0
  285. package/dist/intelligence-graph-cli.js +213 -88
  286. package/dist/intelligence-graph-contexto.js +56 -17
  287. package/dist/intelligence-graph-contract.js +2 -1
  288. package/dist/intelligence-graph-extract-md.js +56 -4
  289. package/dist/intelligence-graph-extract-ts.js +71 -3
  290. package/dist/intelligence-graph-query.js +96 -34
  291. package/dist/leases.js +19 -18
  292. package/dist/ledger-stats.js +17 -16
  293. package/dist/ledger.js +46 -2
  294. package/dist/licoes.js +12 -11
  295. package/dist/liveness.js +6 -3
  296. package/dist/locale-accounts.js +220 -0
  297. package/dist/locale-adapter.js +291 -0
  298. package/dist/locale-ajuda.js +833 -0
  299. package/dist/locale-audit.js +199 -0
  300. package/dist/locale-claims.js +213 -0
  301. package/dist/locale-conducao.js +138 -0
  302. package/dist/locale-conhecimento.js +181 -0
  303. package/dist/locale-decisao.js +205 -0
  304. package/dist/locale-docs.js +230 -0
  305. package/dist/locale-estado.js +101 -0
  306. package/dist/locale-forja.js +290 -0
  307. package/dist/locale-gerados.js +165 -0
  308. package/dist/locale-grafo.js +129 -0
  309. package/dist/locale-master.js +182 -0
  310. package/dist/locale-network.js +524 -0
  311. package/dist/locale-onboarding.js +92 -0
  312. package/dist/locale-operacao-restante.js +931 -0
  313. package/dist/locale-phase.js +151 -0
  314. package/dist/locale-projetos.js +100 -0
  315. package/dist/locale-prompts.js +194 -0
  316. package/dist/locale-pulse.js +349 -0
  317. package/dist/locale-reservas.js +87 -0
  318. package/dist/locale-retry.js +524 -0
  319. package/dist/locale-roadmap.js +102 -0
  320. package/dist/locale-security-scan.js +69 -0
  321. package/dist/locale-setup.js +192 -0
  322. package/dist/locale-ship.js +597 -0
  323. package/dist/locale-thread.js +421 -0
  324. package/dist/locale-verify.js +201 -0
  325. package/dist/locale-worktree.js +246 -0
  326. package/dist/locale.js +1258 -0
  327. package/dist/maestro-runtime.js +22 -3
  328. package/dist/manifest.js +415 -13
  329. package/dist/maquina-ociosa.js +211 -0
  330. package/dist/maquina.js +31 -7
  331. package/dist/master-digest.js +6 -1
  332. package/dist/master-nota-local.js +200 -0
  333. package/dist/master-nota.js +14 -8
  334. package/dist/master.js +139 -65
  335. package/dist/mcp-artifacts.js +11 -2
  336. package/dist/mcp-conhecimento.js +52 -0
  337. package/dist/mcp-experiencia.js +26 -5
  338. package/dist/mcp-git.js +23 -6
  339. package/dist/mcp-grafo.js +7 -4
  340. package/dist/mcp-install.js +73 -8
  341. package/dist/mcp-noctum.js +101 -0
  342. package/dist/mcp-server.js +90 -16
  343. package/dist/mcp-ship-transporte.js +977 -0
  344. package/dist/mcp-ship.js +71 -25
  345. package/dist/mcp-transportes.js +17 -0
  346. package/dist/mcp-verify.js +6 -1
  347. package/dist/memoria.js +63 -58
  348. package/dist/modos-migracao.js +8 -6
  349. package/dist/modos.js +20 -24
  350. package/dist/network-roadmap.js +90 -51
  351. package/dist/noctum-aceite.js +789 -0
  352. package/dist/noctum-arco.js +1418 -0
  353. package/dist/noctum-capacidade.js +141 -0
  354. package/dist/noctum-changelog.js +399 -0
  355. package/dist/noctum-cli.js +482 -0
  356. package/dist/noctum-coordenacao.js +1225 -0
  357. package/dist/noctum-entrega.js +1169 -0
  358. package/dist/noctum-envelope.js +1046 -0
  359. package/dist/noctum-execucao.js +376 -0
  360. package/dist/noctum-fechamento.js +405 -0
  361. package/dist/noctum-fila.js +314 -0
  362. package/dist/noctum-guarda.js +256 -0
  363. package/dist/noctum-integracao.js +507 -0
  364. package/dist/noctum-maquinas.js +383 -0
  365. package/dist/noctum-medicao.js +450 -0
  366. package/dist/noctum-modo.js +362 -0
  367. package/dist/noctum-pergunta-canal.js +96 -0
  368. package/dist/noctum-pergunta.js +115 -0
  369. package/dist/noctum-provas.js +838 -0
  370. package/dist/noctum-reconciliacao.js +591 -0
  371. package/dist/noctum-registro.js +215 -0
  372. package/dist/noctum-relatorio.js +827 -0
  373. package/dist/noctum-resposta.js +207 -0
  374. package/dist/noctum-sessoes-em-voo.js +93 -0
  375. package/dist/noctum-supervisao.js +649 -0
  376. package/dist/noctum-terminal.js +459 -0
  377. package/dist/noctum-transporte.js +655 -0
  378. package/dist/noctum-vigia.js +639 -0
  379. package/dist/ocupacao.js +32 -3
  380. package/dist/onboarding.js +56 -26
  381. package/dist/orkmind.js +48 -25
  382. package/dist/orquestracao.js +44 -47
  383. package/dist/parado-no-condutor.js +174 -127
  384. package/dist/phase.js +144 -63
  385. package/dist/policies.js +37 -4
  386. package/dist/portfolio.js +4 -2
  387. package/dist/postura-local.js +235 -0
  388. package/dist/preflight.js +11 -10
  389. package/dist/procedencia.js +220 -0
  390. package/dist/projeto-alvo.js +186 -24
  391. package/dist/prompts.js +140 -42
  392. package/dist/prova-minima.js +5 -6
  393. package/dist/pulse-cadencia.js +5 -4
  394. package/dist/pulse-consentimento.js +53 -1
  395. package/dist/pulse-delivery.js +151 -24
  396. package/dist/pulse-resposta.js +368 -4
  397. package/dist/pulse.js +188 -22
  398. package/dist/ratelimit.js +16 -6
  399. package/dist/recall.js +14 -13
  400. package/dist/redacao-saida.js +63 -0
  401. package/dist/rede-adesao.js +13 -8
  402. package/dist/rede-forja.js +108 -24
  403. package/dist/rede-status.js +66 -47
  404. package/dist/rede.js +86 -46
  405. package/dist/retomada-checkpoint.js +101 -0
  406. package/dist/retry.js +451 -212
  407. package/dist/roadmap-reservas.js +45 -28
  408. package/dist/roadmap-status.js +129 -33
  409. package/dist/runtime-ambiente.js +5 -0
  410. package/dist/runtime-context.js +284 -32
  411. package/dist/runtime-escada.js +423 -0
  412. package/dist/runtime-profiles.js +103 -46
  413. package/dist/runtimes.js +2 -1
  414. package/dist/saida-segura.js +3 -2
  415. package/dist/security-scan/agil.js +355 -0
  416. package/dist/security-scan/cli.js +76 -0
  417. package/dist/security-scan/compare.js +149 -0
  418. package/dist/security-scan/config.js +93 -0
  419. package/dist/security-scan/detect.js +97 -0
  420. package/dist/security-scan/executor.js +188 -0
  421. package/dist/security-scan/guard.js +180 -0
  422. package/dist/security-scan/imagem-de-lint.js +96 -0
  423. package/dist/security-scan/normalize/actionlint.js +12 -0
  424. package/dist/security-scan/normalize/eslint.js +12 -0
  425. package/dist/security-scan/normalize/gitleaks.js +13 -0
  426. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  427. package/dist/security-scan/normalize/govulncheck.js +36 -0
  428. package/dist/security-scan/normalize/index.js +25 -0
  429. package/dist/security-scan/normalize/npm-audit.js +30 -0
  430. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  431. package/dist/security-scan/normalize/oxlint.js +51 -0
  432. package/dist/security-scan/normalize/pip-audit.js +16 -0
  433. package/dist/security-scan/normalize/ruff.js +12 -0
  434. package/dist/security-scan/normalize/semgrep.js +20 -0
  435. package/dist/security-scan/normalize/trivy.js +33 -0
  436. package/dist/security-scan/normalize/util.js +204 -0
  437. package/dist/security-scan/normalize/zizmor.js +19 -0
  438. package/dist/security-scan/report.js +156 -0
  439. package/dist/security-scan/run.js +448 -0
  440. package/dist/security-scan/tools.js +62 -0
  441. package/dist/security-scan/trabalhador.js +74 -0
  442. package/dist/security-scan/types.js +15 -0
  443. package/dist/session-events.js +26 -5
  444. package/dist/session-watcher-claude.js +81 -20
  445. package/dist/session-watcher.js +340 -42
  446. package/dist/sessoes-contas.js +10 -1
  447. package/dist/sessoes-inventario.js +1 -1
  448. package/dist/sessoes.js +25 -23
  449. package/dist/setup.js +59 -58
  450. package/dist/ship-publicar.js +971 -0
  451. package/dist/ship.js +243 -97
  452. package/dist/steal.js +77 -0
  453. package/dist/superficie.js +14 -11
  454. package/dist/thread-close.js +12 -11
  455. package/dist/thread.js +274 -100
  456. package/dist/tokens.js +15 -11
  457. package/dist/trabalho-thread.js +297 -0
  458. package/dist/transporte-do-canal.js +189 -0
  459. package/dist/types.js +12 -1
  460. package/dist/util.js +13 -3
  461. package/dist/varredura-acoes.js +507 -0
  462. package/dist/verify.js +608 -76
  463. package/dist/vida-da-thread.js +254 -0
  464. package/dist/worktree-local.js +167 -0
  465. package/dist/worktree.js +99 -83
  466. package/dist/yaml.js +27 -8
  467. package/eval/casos/check-quality.json +77 -0
  468. package/eval/casos/security-auditor.json +148 -0
  469. package/eval/casos/security-remediation.json +161 -0
  470. package/eval/fixtures/security-scan/README.md +8 -0
  471. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  472. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  473. package/eval/fixtures/security-scan/go/README.md +4 -0
  474. package/eval/fixtures/security-scan/go/config.go +4 -0
  475. package/eval/fixtures/security-scan/go/go.mod +5 -0
  476. package/eval/fixtures/security-scan/go/go.sum +2 -0
  477. package/eval/fixtures/security-scan/go/main.go +31 -0
  478. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  479. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  480. package/eval/fixtures/security-scan/js/README.md +4 -0
  481. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  482. package/eval/fixtures/security-scan/js/package.json +10 -0
  483. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  484. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  485. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  486. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  487. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  488. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  489. package/eval/fixtures/security-scan/python/README.md +4 -0
  490. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  491. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  492. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  493. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  494. package/package.json +9 -4
  495. package/references/security-checklist.md +3 -3
  496. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  497. package/skills/README.md +1 -0
  498. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  499. package/skills/phases/check-quality/SKILL.md +16 -0
  500. package/skills/phases/go-implementation/SKILL.md +6 -0
  501. package/skills/phases/security-remediation/SKILL.md +70 -0
  502. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/phase.js CHANGED
@@ -33,12 +33,13 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.REGRAS_DE_EVIDENCIA = exports.CONTRATO_DAS_FASES = void 0;
36
+ exports.REGRAS_DE_EVIDENCIA = exports.REGRA_DAS_ESPERAS = exports.CONTRATO_DAS_FASES = void 0;
37
37
  exports.escolherPerfil = escolherPerfil;
38
38
  exports.perfilPedido = perfilPedido;
39
39
  exports.perfilParaDespacho = perfilParaDespacho;
40
40
  exports.runtimeCruzadoParaDespacho = runtimeCruzadoParaDespacho;
41
41
  exports.estadoParaDespacho = estadoParaDespacho;
42
+ exports.fechoDoGo = fechoDoGo;
42
43
  exports.fasesDoCicloNoPrompt = fasesDoCicloNoPrompt;
43
44
  exports.valoresDoPrompt = valoresDoPrompt;
44
45
  exports.montarPrompt = montarPrompt;
@@ -86,6 +87,8 @@ const codex_1 = require("./adapters/codex");
86
87
  const memoria_1 = require("./memoria");
87
88
  const prompts_1 = require("./prompts");
88
89
  const slug_1 = require("./slug");
90
+ const locale_1 = require("./locale");
91
+ const locale_prompts_1 = require("./locale-prompts");
89
92
  const thread_1 = require("./thread");
90
93
  const types_1 = require("./types");
91
94
  const util_1 = require("./util");
@@ -95,6 +98,9 @@ const horario_1 = require("./horario");
95
98
  const runtime_profiles_1 = require("./runtime-profiles");
96
99
  const sessoes_contas_1 = require("./sessoes-contas");
97
100
  const maquina_1 = require("./maquina");
101
+ const trabalho_thread_1 = require("./trabalho-thread");
102
+ const procedencia_1 = require("./procedencia");
103
+ const postura_local_1 = require("./postura-local");
98
104
  const fabrica_publicar_1 = require("./fabrica-publicar");
99
105
  const conducao_1 = require("./conducao");
100
106
  /**
@@ -255,6 +261,8 @@ function estadoParaDespacho(raiz, thread, dryRun = false) {
255
261
  if (!thread.worktree)
256
262
  return null;
257
263
  try {
264
+ // RM-047 (P2): a worktree do thread.json so vale registrada no git e com o estado local.
265
+ (0, procedencia_1.diretorioDaThread)(raiz, thread);
258
266
  (0, estado_thread_1.vincularEstado)(raiz, thread.id, thread.worktree, dryRun);
259
267
  return null;
260
268
  }
@@ -264,19 +272,31 @@ function estadoParaDespacho(raiz, thread, dryRun = false) {
264
272
  }
265
273
  /** O que cada fase canonica entrega. Vai no cabecalho do prompt de toda sessao. */
266
274
  exports.CONTRATO_DAS_FASES = {
267
- GOAL: 'GOAL (F1): objetivo verificavel, impact map, criterios de sucesso e claims com comando de verificacao. Nao implementa.',
268
- PLAN: 'PLAN (F2): plano com tarefas, touch_paths, decisoes D1..Dn com domicilio unico e verify executavel por tarefa. Nao implementa.',
269
- GO: 'GO (F3): implementacao slice por slice, um commit atomico por tarefa, dentro da worktree da thread.',
270
- CHECK: 'CHECK (F4): verificacao contra a baseline (regressao versus divida pre-existente), review de codigo, testes, seguranca e performance.',
271
- SHIP: 'SHIP (F5): merge serializado, push provado por comando, roadmap atualizado e plano de rollback.',
272
- MASTER: 'MASTER (F6): MASTER log com postmortem tipado, licoes e o score humano de 0 a 5. Uma entrega sem MASTER log nao aconteceu.',
275
+ ...locale_prompts_1.PROMPTS_PT_BR.contratoDasFases,
273
276
  };
277
+ /**
278
+ * RM-037 (ork-rm037esperas, D3): a regra das esperas, uma linha so, a mesma no prompt de toda fase e na skill e nos
279
+ * guias que o adaptador instala (`core/test/rm037-esperas.test.ts` confere os arquivos). Em 12/10/2026, sessoes de
280
+ * fase esperaram para sempre por verify ou suite mandados para segundo plano com `&`, cujo processo morreu com a
281
+ * chamada, e por lacos de espera com `pgrep -f` que acham a si mesmos, porque o proprio laco traz o texto procurado.
282
+ */
283
+ exports.REGRA_DAS_ESPERAS = locale_prompts_1.PROMPTS_PT_BR.regraDasEsperas;
274
284
  /** As regras de evidencia que valem em toda fase, em todo modo. */
275
285
  exports.REGRAS_DE_EVIDENCIA = [
276
- 'Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.',
277
- 'Trabalhe apenas no diretorio de trabalho indicado acima.',
278
- 'Passos irreversiveis (push, merge, delecao) so acontecem quando o modo autoriza.',
286
+ ...locale_prompts_1.PROMPTS_PT_BR.regrasDeEvidencia,
287
+ // RM-058 N2 (D13 da ork-rm058n2): tres sessoes de 12/10/2026 mandaram verify ou suite para segundo plano com `&`,
288
+ // perderam o processo e esperaram para sempre. RM-037 (ork-rm037esperas, D3): a linha da N2 virou a regra das
289
+ // esperas, que tambem traz a execucao em segundo plano do host e a espera por `pgrep -f`.
290
+ exports.REGRA_DAS_ESPERAS,
279
291
  ];
292
+ /**
293
+ * RM-016: o rito de saída do GO pertence ao prompt canônico, não a um adaptador. Assim Claude Code
294
+ * e Codex recebem os mesmos artefatos obrigatórios antes de a sessão encerrar. RM-061 F3c: o texto
295
+ * vem do catálogo dos prompts, e o prompt inglês leva o mesmo rito.
296
+ */
297
+ function fechoDoGo(threadId, locale = (0, locale_1.localeAtivo)()) {
298
+ return (locale === 'en' ? locale_prompts_1.PROMPTS_EN : locale_prompts_1.PROMPTS_PT_BR).fechoDoGo(threadId);
299
+ }
280
300
  /**
281
301
  * I-42 (D11): as fases que o cabecalho do prompt descreve.
282
302
  *
@@ -299,7 +319,8 @@ function fasesDoCicloNoPrompt(thread) {
299
319
  * decisao e codigo. E o que permite um projeto reescrever o texto do prompt em
300
320
  * `prompts/fase-padrao.md` sem poder mudar o que o `ork` considera verdade.
301
321
  */
302
- function valoresDoPrompt(thread, fase, pedido, memoriaInjetada = '') {
322
+ function valoresDoPrompt(thread, fase, pedido, memoriaInjetada = '', locale = (0, locale_1.localeAtivo)()) {
323
+ const mp = locale === 'en' ? locale_prompts_1.PROMPTS_EN : locale_prompts_1.PROMPTS_PT_BR;
303
324
  const def = (0, modos_1.definicaoDoModo)(thread.modo);
304
325
  const bloco = (0, thread_1.blocoDaThread)(thread, fase);
305
326
  const pausa = (0, thread_1.pausaNaThread)(thread, fase);
@@ -308,27 +329,29 @@ function valoresDoPrompt(thread, fase, pedido, memoriaInjetada = '') {
308
329
  thread: thread.id,
309
330
  bloco: bloco.fases.join('-'),
310
331
  nome: thread.nome,
311
- ciclo_canonico: fasesDoCicloNoPrompt(thread).map((f) => `${bloco.fases.includes(f) ? '>' : ' '} ${exports.CONTRATO_DAS_FASES[f]}`).join('\n'),
332
+ ciclo_canonico: fasesDoCicloNoPrompt(thread).map((f) => `${bloco.fases.includes(f) ? '>' : ' '} ${mp.contratoDasFases[f]}`).join('\n'),
312
333
  tag: def.tag,
313
334
  blocos: thread.blocos.map((b) => b.fases.join('-')).join(' / '),
314
335
  pausas: String(thread.blocos.filter((b) => b.pausa).length),
315
- linha_variante: thread.variante ? `Variante de ciclo: ${thread.variante}` : '',
336
+ linha_variante: thread.variante ? mp.variante(thread.variante) : '',
316
337
  regra_de_pausa: pausa
317
- ? `Ao fim deste bloco HA PAUSA humana sobre: ${bloco.pausaSobre}. Pare, apresente a evidencia e espere o veredito.`
318
- : 'Ao fim deste bloco NAO ha pausa humana: siga com decisao autonoma e registre no ledger quem decidiu, com que evidencia e por que.',
319
- invariantes: modos_1.INVARIANTES.map((i) => `- ${i}`).join('\n'),
338
+ ? mp.pausa(mp.pausaSobre(bloco.pausaSobre))
339
+ : mp.semPausa,
340
+ invariantes: mp.invariantes.map((i) => `- ${i}`).join('\n'),
320
341
  slug: thread.slug,
321
342
  projeto_nome: thread.projeto.name,
322
343
  projeto_abbrev: thread.projeto.abbrev,
323
344
  base_branch: thread.base.branch,
324
345
  base_commit: thread.base.commit,
325
- diretorio: thread.worktree ?? '(raiz do projeto)',
346
+ diretorio: thread.worktree ?? mp.raizDoProjeto,
347
+ trabalho: (0, trabalho_thread_1.caminhoDoTrabalho)(thread.id),
326
348
  pedido: pedido.trim(),
349
+ fecho_go: bloco.fases.includes('GO') ? mp.fechoDoGo(thread.id) : '',
327
350
  // Bloco B6: o bloco de memoria injetada deterministicamente. Vazio em toda thread sem
328
351
  // decisao fechada e sem OrkMind, e ai a linha da variavel some do prompt: o texto fica
329
352
  // byte a byte igual ao que o B4 ja despachava.
330
353
  memoria_injetada: memoriaInjetada,
331
- regras_de_evidencia: exports.REGRAS_DE_EVIDENCIA.map((r) => `- ${r}`).join('\n'),
354
+ regras_de_evidencia: [...mp.regrasDeEvidencia, mp.regraDasEsperas].map((r) => `- ${r}`).join('\n'),
332
355
  };
333
356
  }
334
357
  /**
@@ -338,8 +361,10 @@ function valoresDoPrompt(thread, fase, pedido, memoriaInjetada = '') {
338
361
  * `prompts/fase-padrao.md` (ou `prompts/fase-goal.md` e companhia) versionado no repositorio,
339
362
  * vale o do projeto, e `ork prompt lint` e quem garante que ele nao perdeu o contrato.
340
363
  */
341
- function montarPrompt(thread, fase, pedido, raiz, memoriaInjetada = '') {
342
- return (0, prompts_1.renderizar)((0, prompts_1.templateDaFase)(fase, raiz), valoresDoPrompt(thread, fase, pedido, memoriaInjetada));
364
+ function montarPrompt(thread, fase, pedido, raiz, memoriaInjetada = '', locale = (0, locale_1.localeAtivo)()) {
365
+ // RM-061 F3c: os valores falam a lingua do template escolhido; o do projeto sem par `.en` sai inteiro em pt-BR.
366
+ const template = (0, prompts_1.templateDaFase)(fase, raiz, locale);
367
+ return (0, prompts_1.renderizar)(template, valoresDoPrompt(thread, fase, pedido, memoriaInjetada, (0, prompts_1.idiomaDoTemplate)(template)));
343
368
  }
344
369
  /**
345
370
  * Monta o prompt da fase JA com a memoria injetada (bloco B6).
@@ -350,11 +375,15 @@ function montarPrompt(thread, fase, pedido, raiz, memoriaInjetada = '') {
350
375
  * com as decisoes fechadas lidas do `thread.json`: a garantia nao depende do OrkMind.
351
376
  */
352
377
  function montarPromptComMemoria(carregado, thread, fase, pedido, memoria) {
353
- const injecao = (0, memoria_1.injecaoDaFase)(carregado, memoria, thread, fase);
378
+ // RM-061 F3c: o prompt despachado e dado (arquivo com sha256 no ledger). Segue a lingua declarada do dono
379
+ // (`owner.language`), nunca o locale de quem despacha: sem ela, pt-BR, com qualquer LANG (contrato da F2a). A
380
+ // dica do grafo fala a lingua do template que conduz a fase, como os valores.
381
+ const locale = (0, prompts_1.idiomaDoTemplate)((0, prompts_1.templateDaFase)(fase, carregado.raiz, (0, locale_1.linguaDeclaradaDoDono)(carregado.manifesto.owner?.language)));
382
+ const injecao = (0, memoria_1.injecaoDaFase)(carregado, memoria, thread, fase, locale);
354
383
  // Mesma raiz usada pelo MCP e runtime-context; o manifesto da WT nao habilita a dica.
355
384
  const ligado = (0, mcp_grafo_1.grafoLigado)((0, manifest_1.exigirManifesto)((0, estado_thread_1.raizDoEstado)(carregado.raiz)).manifesto);
356
385
  return {
357
- prompt: montarPrompt(thread, fase, (0, prompts_1.pedidoComDicaDoGrafo)(pedido, thread.id, ligado), carregado.raiz, injecao.texto),
386
+ prompt: montarPrompt(thread, fase, (0, prompts_1.pedidoComDicaDoGrafo)(pedido, thread.id, ligado, locale), carregado.raiz, injecao.texto, locale),
358
387
  injecao,
359
388
  };
360
389
  }
@@ -411,10 +440,10 @@ function resolverDespacho(manifesto, opcoes, doBloco) {
411
440
  const origem = doBloco?.runtime ?? manifesto.runtime.adapter;
412
441
  const runtime = opcoes.runtime ?? origem;
413
442
  if ((0, runtimes_1.runtimeConhecido)(runtime) && runtime !== origem && !opcoes.model?.trim())
414
- throw new Error(`setup.model.required: ao trocar runtime de ${origem} para ${runtime}, informe --runtime ${runtime} --model <modelo> para este despacho; o setup do projeto permanece intacto.`);
443
+ throw new locale_1.ErroDoCatalogo((m) => m.phase.modeloAoTrocarRuntime(origem, runtime));
415
444
  const model = opcoes.model ?? doBloco?.model ?? manifesto.runtime.model;
416
445
  if (!model.trim())
417
- throw new Error(`setup.model.required: modelo pendente para ${runtime}; informe --model <modelo> neste despacho ou complete o bloco em ork setup.`);
446
+ throw new locale_1.ErroDoCatalogo((m) => m.phase.modeloPendente(runtime));
418
447
  const effort = opcoes.effort ??
419
448
  (opcoes.model !== undefined ? 'high' : doBloco?.effort ?? manifesto.runtime.effort);
420
449
  return { runtime, model, effort };
@@ -439,6 +468,8 @@ function dadosDoDespacho(ctx, comando) {
439
468
  cwd: ctx.cwd,
440
469
  promptPath: path.relative(ctx.raiz, ctx.promptPath),
441
470
  promptSha256: ctx.promptSha256,
471
+ ...(ctx.promptOriginal ? { promptOriginalPath: path.relative(ctx.raiz, ctx.promptOriginal.path),
472
+ promptOriginalSha256: ctx.promptOriginal.sha256 } : {}),
442
473
  origem: ctx.origem,
443
474
  // I-36 (T10): a porta por onde o dono chegou. `runtime` e o motor; `canal` e a porta.
444
475
  ...(ctx.canal ? { canal: ctx.canal } : {}),
@@ -557,14 +588,14 @@ function registrarObservacao(ctx, sessao, dir, controlador, sensores) {
557
588
  const mesmoDespacho = (e) => e.sessionId === sessao.sessionId && e.despachoEm === sessao.despachadaEm;
558
589
  try {
559
590
  // I-34: claude-bg observa pela fonte nativa; no PLAN o registro guarda o sha de base do artefato.
560
- // I-33 (N1): o GO codex registra o HEAD do despacho, como a fonte claude-bg; sem ele a D11c nao ve commit pelo shell.
591
+ // I-33 (N1): o GO codex registra o HEAD do despacho, como a fonte claude-bg; ele revela commit pelo shell no checkpoint.
561
592
  const head = ctx.runtime === 'codex' && ctx.fase === 'GO' ? { head: ctx.headNoDespacho ?? null } : {};
562
593
  const fonte = ctx.runtime === 'claude-bg' ? (0, session_watcher_claude_1.fonteClaudeDoDespacho)(ctx.raiz, ctx.thread.id, ctx.fase, ctx.cwd)
563
594
  : sensores?.logPath ? { logPath: sensores.logPath, processoPath: sensores.processoPath, reciboPath: sensores.reciboPath, ...head }
564
595
  : controlador ? { controlador, cwd: ctx.cwd, ...head } : null;
565
596
  if (!fonte)
566
597
  return;
567
- (0, session_watcher_1.validarFonteWatcher)(ctx.raiz, sessao.sessionId, fonte);
598
+ (0, session_watcher_1.prepararFonteWatcher)(ctx.raiz, sessao.sessionId, fonte);
568
599
  const eventos = (0, ledger_1.lerLedger)(dir);
569
600
  if (!eventos.some(e => e.tipo === 'session_sensor_registered' && mesmoDespacho(e))) {
570
601
  (0, ledger_1.registrar)(dir, ctx.thread.id, 'session_sensor_registered', { fase: ctx.fase,
@@ -619,7 +650,8 @@ function garantirBaselineDoDespacho(carregado, threadId, opcoes, identidade) {
619
650
  if (!baselineDoDespachoNecessaria(carregado, threadId, opcoes))
620
651
  return;
621
652
  try {
622
- (0, verify_1.gravarBaseline)(carregado, threadId, undefined, { canal: opcoes.canal ?? (0, conducao_1.canalDoProcesso)(), correlacao: opcoes.correlacao ?? null, ...(identidade ? { identidade } : {}) }, 'phase.run');
653
+ (0, verify_1.gravarBaseline)(carregado, threadId, undefined, { canal: opcoes.canal ?? (0, conducao_1.canalDoProcesso)(), correlacao: opcoes.correlacao ?? null, ...(identidade ? { identidade } : {}),
654
+ filaPesada: { esperarMs: opcoes.esperarMs, ...opcoes.filaPesada } }, 'phase.run');
623
655
  }
624
656
  catch (e) {
625
657
  if (!(e instanceof conducao_1.ErroDeConducao))
@@ -677,6 +709,8 @@ tomadaPrevia) {
677
709
  const thread = (0, thread_1.lerThread)(raiz, threadId);
678
710
  const fase = opcoes.fase;
679
711
  const dir = (0, thread_1.dirThread)(raiz, thread.id);
712
+ if (!opcoes.dryRun)
713
+ (0, trabalho_thread_1.garantirDiretorioDoTrabalho)(raiz, thread.id);
680
714
  const slug = slugDaSessao(thread, fase);
681
715
  // Resolve UMA vez o trio runtime/modelo/esforco: o mesmo objeto vai ao runtime adapter,
682
716
  // ao ledger e a resposta do CLI. Resolver duas vezes e o caminho curto para o ledger
@@ -762,6 +796,17 @@ tomadaPrevia) {
762
796
  verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
763
797
  runtime, model, effort, bloqueado: true, motivo: 'runtime.autoconferencia', violacoes, erro: erroDeRuntime };
764
798
  }
799
+ // RM-047 (P1): sandbox afrouxado pelo manifesto so despacha com a confirmacao local desta maquina.
800
+ const erroDePostura = (0, postura_local_1.recusaDePostura)(raiz, manifesto, runtime);
801
+ if (erroDePostura) {
802
+ const postura = (0, postura_local_1.posturaAfrouxada)(manifesto) ?? '';
803
+ if (!opcoes.dryRun)
804
+ (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'policy.violation',
805
+ modo: thread.modo, detalhe: erroDePostura, correcao: (0, postura_local_1.comandoDeConfirmacao)(postura), fase, slug });
806
+ return { thread, slug, promptPath, promptSha256: sha, comando: [], sessionId: null,
807
+ verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
808
+ runtime, model, effort, bloqueado: true, motivo: 'policy.violation', violacoes, erro: erroDePostura };
809
+ }
765
810
  const erroDeEstado = estadoParaDespacho(raiz, thread, opcoes.dryRun);
766
811
  if (erroDeEstado) {
767
812
  (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'tree.blocked',
@@ -858,7 +903,17 @@ tomadaPrevia) {
858
903
  return pendente;
859
904
  }
860
905
  }
861
- const cwd = thread.worktree ?? raiz;
906
+ const cwd = (0, procedencia_1.diretorioDaThread)(raiz, thread);
907
+ // RM-063 (F3): o prompt vai ao disco e ao ledger, com o sha256, ANTES do contexto do runtime e do adaptador. No
908
+ // incidente de 12/10/2026 a fase morreu no despacho e o `ork retry run` saiu com "nao ha despacho falho registrado
909
+ // em GO com prompt gravado"; daqui em diante, toda tentativa deixa o prompt que o retry redespacha sem pedir o texto.
910
+ (0, util_1.gravar)(promptPath, prompt);
911
+ const promptNoLedger = { promptPath: path.relative(raiz, promptPath), promptSha256: sha };
912
+ if (!opcoes.dryRun) {
913
+ (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.promptGravado, { fase, slug, modo: thread.modo, runtime, model, effort, cwd,
914
+ ...promptNoLedger, origem: 'phase.run', canal, ...(opcoes.correlacao ? { correlacao: opcoes.correlacao } : {}), identidade });
915
+ }
916
+ const correcaoDoRetry = `ork retry run ${thread.id} redespacha o mesmo prompt (sha256 ${sha.slice(0, 12)})`;
862
917
  let contextoRuntime;
863
918
  try {
864
919
  contextoRuntime = (0, runtime_context_1.contextoDoProjeto)(raiz, runtime, cwd, thread.id);
@@ -866,14 +921,13 @@ tomadaPrevia) {
866
921
  catch (e) {
867
922
  const erro = `runtime.unavailable: ${e.message}`;
868
923
  (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable',
869
- modo: thread.modo, detalhe: erro, fase, slug });
924
+ modo: thread.modo, detalhe: erro, fase, slug, ...(opcoes.dryRun ? {} : { ...promptNoLedger, correcao: correcaoDoRetry }) });
870
925
  return { thread, slug, promptPath, promptSha256: sha, comando: [], sessionId: null,
871
926
  verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
872
927
  runtime, model, effort, bloqueado: true, motivo: 'runtime.unavailable', violacoes, erro };
873
928
  }
874
929
  if (contextoRuntime)
875
930
  contextoRuntime.identidade = identidade;
876
- (0, util_1.gravar)(promptPath, prompt);
877
931
  // I-33 (D2, D4, D7): o perfil sai do store com o login conferido. Sem perfil disponivel, o
878
932
  // despacho nao sai pela conta errada: o prompt ja gravado fica registrado para a rotacao do
879
933
  // retry (outro runtime da ordem de fallback, ou a fila), com o motivo tipado.
@@ -934,7 +988,7 @@ tomadaPrevia) {
934
988
  : undefined;
935
989
  // I-33 (N1): lido antes de a sessao existir; depois dela, um commit rapido ja estaria no HEAD.
936
990
  const headNoDespacho = fase === 'GO' && runtime === 'codex' && !opcoes.dryRun ? (0, session_watcher_claude_1.headDaWorktree)(cwd) : undefined;
937
- const resultado = rt.despachar({
991
+ const pedidoAoRuntime = {
938
992
  prompt,
939
993
  nome: slug,
940
994
  cwd,
@@ -955,7 +1009,7 @@ tomadaPrevia) {
955
1009
  ...(limites ? { duracaoMaximaMs: limites.duracaoMs } : {}),
956
1010
  // I-36 (D4): a sessao filha herda a identidade do despacho e o canal; e assim que ela reentra.
957
1011
  ambienteExtra: (0, conducao_1.ambienteDaConducao)(identidade.dispatchId, thread.id, canal),
958
- });
1012
+ };
959
1013
  const ctx = {
960
1014
  identidade,
961
1015
  canal,
@@ -976,6 +1030,22 @@ tomadaPrevia) {
976
1030
  ...(perfil ? { perfil } : {}),
977
1031
  ...(headNoDespacho !== undefined ? { headNoDespacho } : {}),
978
1032
  };
1033
+ let resultado;
1034
+ try {
1035
+ resultado = rt.despachar(pedidoAoRuntime);
1036
+ }
1037
+ catch (e) {
1038
+ // RM-063 (F3): o adaptador que lanca (o daemon do runtime fora do ar) deixa no ledger a falha do despacho com o
1039
+ // prompt e o sha256, e o gate tipado que o `ork retry run` le; o erro segue para quem chamou, como antes.
1040
+ if (!opcoes.dryRun) {
1041
+ const erro = `runtime.unavailable: o runtime adapter lancou no despacho: ${e.message}`;
1042
+ (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.despachoFalhou, { ...dadosDoDespacho(ctx, []), erro });
1043
+ (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable', modo: thread.modo,
1044
+ detalhe: erro, correcao: correcaoDoRetry, fase, slug, runtime, origem: 'phase.run', ...promptNoLedger,
1045
+ evidencia: 'excecao real do runtime adapter no despacho, nao relato do agente' });
1046
+ }
1047
+ throw e;
1048
+ }
979
1049
  const comum = dadosDoDespacho(ctx, resultado.comando);
980
1050
  if (opcoes.dryRun) {
981
1051
  return {
@@ -1000,11 +1070,15 @@ tomadaPrevia) {
1000
1070
  }
1001
1071
  if (!resultado.ok || !resultado.sessionId) {
1002
1072
  const erro = resultado.erro ?? 'sem sessionId na saida do runtime';
1073
+ // RM-063 (F3, GO-FIX): o `claude --bg` que sai com erro, ou estoura o prazo, depois de dizer o id deixa a sessao
1074
+ // aberta; o id vai a falha e ao gate, para o retry conferir que ela morreu antes de redespachar.
1075
+ const daSessao = resultado.sessionId ? { sessionId: resultado.sessionId } : {};
1003
1076
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.despachoFalhou, {
1004
1077
  ...comum,
1005
1078
  controlador: resultado.controlador,
1006
1079
  erro,
1007
1080
  stderr: resultado.stderr.slice(0, 500),
1081
+ ...daSessao,
1008
1082
  });
1009
1083
  // I-33 (D1, D5): a CONTA recusou o despacho. Nada rodou, entao nada foi produzido: o perfil
1010
1084
  // sai do rodizio e o gate tipado fica para a rotacao do retry, que redespacha o mesmo prompt.
@@ -1046,6 +1120,8 @@ tomadaPrevia) {
1046
1120
  effort,
1047
1121
  sinal,
1048
1122
  detalhe: erro,
1123
+ // RM-058 N4 (D17 da ork-rm058n4): o pedido do despacho do arco é do vigia do arco, e o `ork retry resume` não o retoma.
1124
+ ...(opcoes.correlacao ? { correlacao: opcoes.correlacao } : {}),
1049
1125
  });
1050
1126
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.rateLimitEnfileirado, {
1051
1127
  fase,
@@ -1087,6 +1163,11 @@ tomadaPrevia) {
1087
1163
  sessionId: null, verificada: false, pausaAoFim, dryRun: false, runtime, model, effort, bloqueado: false,
1088
1164
  motivo: impedimento.motivo, violacoes, naFila: null, erro: `${impedimento.motivo}: ${impedimento.trecho}` };
1089
1165
  }
1166
+ // RM-063 (F3): a falha seca do adaptador vira gate tipado, com o prompt e o sha256. Antes so o `phase_dispatch_failed`
1167
+ // a registrava: o `ork retry plan` nao a via e a fase ficava parada sem ninguem saber.
1168
+ (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable', modo: thread.modo,
1169
+ detalhe: erro, correcao: correcaoDoRetry, fase, slug, runtime, origem: 'phase.run', ...promptNoLedger, ...daSessao,
1170
+ evidencia: 'saida real do runtime adapter no despacho, nao relato do agente' });
1090
1171
  return {
1091
1172
  thread,
1092
1173
  slug,
@@ -1139,8 +1220,11 @@ function tabelaDoLedger(raiz, threadId) {
1139
1220
  // Thread inexistente e erro, nao ledger vazio: o CLI precisa reprovar o id errado.
1140
1221
  (0, thread_1.lerThread)(raiz, threadId);
1141
1222
  const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, threadId));
1223
+ // RM-061 (F2a): a moldura e os rotulos vem do catalogo; o valor de cada evento (decisao, estado,
1224
+ // erro, detalhe) e dado do ledger e sai como foi gravado.
1225
+ const m = (0, locale_1.msg)().phase;
1142
1226
  if (eventos.length === 0) {
1143
- return `Ledger vazio para a thread ${threadId}.`;
1227
+ return m.ledgerVazio(threadId);
1144
1228
  }
1145
1229
  const linhas = eventos.map((e) => {
1146
1230
  const detalhe = [];
@@ -1149,91 +1233,88 @@ function tabelaDoLedger(raiz, threadId) {
1149
1233
  if (e.slug)
1150
1234
  detalhe.push(String(e.slug));
1151
1235
  if (e.sessionId)
1152
- detalhe.push(`sessao ${String(e.sessionId).slice(0, 8)}`);
1236
+ detalhe.push(m.sessao(String(e.sessionId).slice(0, 8)));
1153
1237
  if (e.decisao)
1154
1238
  detalhe.push(String(e.decisao));
1155
1239
  if (e.previstaSobre)
1156
- detalhe.push(`pausa sobre ${String(e.previstaSobre)}`);
1240
+ detalhe.push(m.pausaSobre((0, locale_1.msg)().thread.pausaSobre(String(e.previstaSobre))));
1157
1241
  if (e.encontrada !== undefined)
1158
- detalhe.push(`no runtime: ${e.encontrada ? 'sim' : 'nao'}`);
1242
+ detalhe.push(m.noRuntime(!!e.encontrada));
1159
1243
  // Fato verificavel do despacho: o par modelo/esforco real, lido do proprio evento.
1160
1244
  if (e.model)
1161
- detalhe.push(`modelo ${String(e.model)}/${String(e.effort ?? '-')}`);
1245
+ detalhe.push(m.modelo(String(e.model), String(e.effort ?? '-')));
1162
1246
  // Eventos do bloco B1: motivo tipado, veredito e as provas do ship.
1163
1247
  if (e.motivo)
1164
- detalhe.push(`motivo ${String(e.motivo)}`);
1248
+ detalhe.push(m.motivo(String(e.motivo)));
1165
1249
  if (e.claim)
1166
1250
  detalhe.push(`claim ${String(e.claim)}`);
1167
1251
  if (e.veredito)
1168
- detalhe.push(`veredito: ${String(e.veredito)}`);
1252
+ detalhe.push(m.veredito(String(e.veredito)));
1169
1253
  if (e.fonte && e.ocupacao !== undefined) {
1170
- detalhe.push(`ocupacao ${e.ocupacao === null ? 'nao medivel' : String(e.ocupacao)} (${String(e.fonte)})`);
1254
+ detalhe.push(m.ocupacao(e.ocupacao === null ? null : String(e.ocupacao), String(e.fonte)));
1171
1255
  }
1172
1256
  if (e.slugSugerido)
1173
- detalhe.push(`proximo slug ${String(e.slugSugerido)}`);
1257
+ detalhe.push(m.proximoSlug(String(e.slugSugerido)));
1174
1258
  if (e.lease)
1175
1259
  detalhe.push(`lease ${String(e.lease)}`);
1176
1260
  // Eventos do bloco B3: acao de retry, playbook da retomada e rodada de GO-FIX.
1177
1261
  if (e.acao)
1178
- detalhe.push(`acao ${String(e.acao)}`);
1262
+ detalhe.push(m.acao(String(e.acao)));
1179
1263
  if (e.playbook)
1180
1264
  detalhe.push(`playbook ${String(e.playbook)}`);
1181
1265
  // Ensaio de 03/10/2026 (RM-049): na decisao autonoma o pedido e o objeto `ork.hitl/v2`, e a tabela
1182
1266
  // mostrava "pedido [object Object]"; do objeto sai o id curto.
1183
1267
  if (typeof e.pedido === 'string' && e.pedido !== '')
1184
- detalhe.push(`pedido ${e.pedido}`);
1268
+ detalhe.push(m.pedido(e.pedido));
1185
1269
  else if (e.pedido && typeof e.pedido === 'object' && typeof e.pedido.id === 'string') {
1186
- detalhe.push(`pedido ${e.pedido.id.slice(0, 8)}`);
1270
+ detalhe.push(m.pedido(e.pedido.id.slice(0, 8)));
1187
1271
  }
1188
1272
  if (e.rodada !== undefined)
1189
- detalhe.push(`rodada ${String(e.rodada)}`);
1273
+ detalhe.push(m.rodada(String(e.rodada)));
1190
1274
  if (e.cobertura)
1191
- detalhe.push(`cobertura ${String(e.cobertura)}`);
1275
+ detalhe.push(m.cobertura(String(e.cobertura)));
1192
1276
  if (e.liberaEm)
1193
- detalhe.push(`libera em ${(0, horario_1.formatarDataHora)(String(e.liberaEm))}`);
1277
+ detalhe.push(m.liberaEm((0, horario_1.formatarDataHora)(String(e.liberaEm))));
1194
1278
  if (e.tentativa !== undefined && e.limite !== undefined) {
1195
- detalhe.push(`tentativa ${String(e.tentativa)}/${String(e.limite)}`);
1279
+ detalhe.push(m.tentativa(String(e.tentativa), String(e.limite)));
1196
1280
  }
1197
1281
  if (e.mergeSha)
1198
1282
  detalhe.push(`merge ${String(e.mergeSha).slice(0, 8)}`);
1199
1283
  if (e.shaRemoto)
1200
- detalhe.push(`remoto ${String(e.shaRemoto).slice(0, 8)}`);
1284
+ detalhe.push(m.remoto(String(e.shaRemoto).slice(0, 8)));
1201
1285
  if (e.pushVerificado !== undefined)
1202
- detalhe.push(`push provado: ${e.pushVerificado ? 'sim' : 'nao'}`);
1286
+ detalhe.push(m.pushProvado(!!e.pushVerificado));
1203
1287
  if (e.autorizadoPor)
1204
- detalhe.push(`autorizado por ${String(e.autorizadoPor)}`);
1288
+ detalhe.push(m.autorizadoPor(String(e.autorizadoPor)));
1205
1289
  if (e.sobre)
1206
- detalhe.push(`sobre ${String(e.sobre)}`);
1290
+ detalhe.push(m.sobre(String(e.sobre)));
1207
1291
  if (e.estado)
1208
1292
  detalhe.push(String(e.estado));
1209
1293
  if (typeof e.de === 'string' && typeof e.para === 'string') {
1210
1294
  detalhe.push(`${e.de} -> ${e.para}`);
1211
1295
  }
1212
1296
  if (e.dryRun === true)
1213
- detalhe.push('ensaio (--dry-run)');
1297
+ detalhe.push(m.ensaio);
1214
1298
  if (e.tipo === ledger_1.TIPOS_DE_EVENTO.worktreeCriada && e.dir) {
1215
- detalhe.push(`${String(e.branch)} em ${String(e.dir)}`);
1299
+ detalhe.push(m.worktreeEm(String(e.branch), String(e.dir)));
1216
1300
  }
1217
1301
  if (e.inline !== undefined) {
1218
- detalhe.push(`triagem ${String(e.inline)} inline / ${String(e.pointers)} ponteiros / ${String(e.summaries)} resumos`);
1302
+ detalhe.push(m.triagem(String(e.inline), String(e.pointers), String(e.summaries)));
1219
1303
  }
1220
1304
  if (e.location)
1221
- detalhe.push(`ponteiro ${String(e.location)}`);
1305
+ detalhe.push(m.ponteiro(String(e.location)));
1222
1306
  if (e.erro)
1223
- detalhe.push(`erro: ${String(e.erro)}`);
1307
+ detalhe.push(m.erro(String(e.erro)));
1224
1308
  if (e.detalhe && !e.decisao)
1225
1309
  detalhe.push((0, horario_1.localizarTexto)(String(e.detalhe)).slice(0, 90));
1226
1310
  if (e.modo && !e.fase)
1227
- detalhe.push(`modo ${String(e.modo)}`);
1311
+ detalhe.push(m.modo(String(e.modo)));
1228
1312
  return [(0, horario_1.formatarDataHora)(e.ts, { segundos: true }), e.tipo, detalhe.join(' | ')];
1229
1313
  });
1230
- return `${(0, util_1.tabela)(['QUANDO', 'EVENTO', 'DETALHE'], linhas)}\n${(0, horario_1.legendaDoFuso)()}`;
1314
+ return `${(0, util_1.tabela)([...m.colunas], linhas)}\n${(0, horario_1.legendaDoFuso)()}`;
1231
1315
  }
1232
1316
  /** Slug legivel por humano de uma sessao (usado nas mensagens do CLI). */
1233
1317
  function descreverSlug(slug) {
1234
1318
  const p = (0, slug_1.parseSlug)(slug);
1235
- if (!p)
1236
- return slug;
1237
- const rot = p.rotacao ? `, rotacao ${p.rotacao}` : '';
1238
- return `produto "${p.produto}", assunto "${p.assunto}", fases "${p.fases}"${rot}`;
1319
+ return p ? (0, locale_1.msg)().thread.slug(p.produto, p.assunto, p.fases, p.rotacao) : slug;
1239
1320
  }
package/dist/policies.js CHANGED
@@ -14,6 +14,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.POLICIES_DE_PROVA_LOCAL = exports.POLICIES_CONHECIDAS = void 0;
15
15
  exports.procurarSegredos = procurarSegredos;
16
16
  exports.policyDeProvaLocal = policyDeProvaLocal;
17
+ exports.severidadeDeclarada = severidadeDeclarada;
17
18
  exports.policiesDesconhecidas = policiesDesconhecidas;
18
19
  exports.avaliarPolicies = avaliarPolicies;
19
20
  exports.avisos = avisos;
@@ -21,6 +22,7 @@ exports.bloqueantes = bloqueantes;
21
22
  exports.motivoDominante = motivoDominante;
22
23
  exports.linhasDeAviso = linhasDeAviso;
23
24
  exports.textoDeViolacoes = textoDeViolacoes;
25
+ const locale_1 = require("./locale");
24
26
  /**
25
27
  * Variaveis que REDIRECIONAM o despacho do `claude` para um provider pago.
26
28
  * Mesma lista do `ork doctor`: presenca delas com `subscription-only` e bloqueante.
@@ -106,6 +108,13 @@ exports.POLICIES_CONHECIDAS = {
106
108
  quando: ['claims.add'],
107
109
  descricao: 'a mesma conferencia de claim_sem_prova_local, com o nome que o ork licoes propoe',
108
110
  },
111
+ // RM-062 (F2): a barreira de dado privado. Declarada, o `ork verify` varre o diff da thread e o `ork ci prepare`, o
112
+ // diff e o bundle; fora do manifesto, nenhum dos dois varre nada (projeto privado nao paga pelo que nao pediu).
113
+ dado_privado: {
114
+ quando: ['verify', 'ci.prepare'],
115
+ descricao: 'reprova (ou avisa) quando o diff da thread ou o bundle de CI leva caminho de home, e-mail fora da lista, ' +
116
+ 'hostname de maquina ou termo da lista local',
117
+ },
109
118
  };
110
119
  /** RM-008 (B8): as policies que conferem a claim no registro (um aviso so, como verify_regression e verify_failed). */
111
120
  exports.POLICIES_DE_PROVA_LOCAL = ['claim_sem_prova_local', 'claims_failed'];
@@ -134,6 +143,11 @@ function severidade(bruta) {
134
143
  return bruta;
135
144
  return 'warn';
136
145
  }
146
+ /** RM-062 (F2): a severidade da policy como o manifesto a declara, ou `null` quando ele nao a declara. */
147
+ function severidadeDeclarada(manifesto, nome) {
148
+ const bruta = manifesto.policies?.[nome];
149
+ return bruta === undefined ? null : severidade(bruta);
150
+ }
137
151
  /** Policies declaradas no manifesto que o `ork` nao sabe executar. */
138
152
  function policiesDesconhecidas(manifesto) {
139
153
  return Object.keys(manifesto.policies ?? {}).filter((p) => !(p in exports.POLICIES_CONHECIDAS));
@@ -275,6 +289,26 @@ function avaliarPolicies(manifesto, ctx) {
275
289
  }
276
290
  continue;
277
291
  }
292
+ if (nome === 'dado_privado') {
293
+ const f = ctx.dadoPrivado;
294
+ if (!f || (f.achados === 0 && !f.erro))
295
+ continue;
296
+ const lista = f.listaLocal ? 'com a lista local' : 'lista local ausente: so os padroes genericos';
297
+ violacoes.push({
298
+ policy: nome,
299
+ severidade: sev,
300
+ motivo: 'policy.violation',
301
+ detalhe: f.erro
302
+ ? `a varredura de dado privado nao rodou: ${f.erro}`
303
+ : `${f.achados} achado(s) de dado privado (${f.padroes.join(', ')}) no ${f.escopo}, ${lista}: ` +
304
+ `${f.onde.join(', ')}${f.achados > f.onde.length ? ', ...' : ''} (o valor casado nunca e impresso)`,
305
+ correcao: f.erro
306
+ ? 'corrija o orkastery.privado.json (ou tire a lista local do git) e rode de novo'
307
+ : 'troque o dado pelo generico (maquina-a, /home/usuario, pessoa@exemplo.invalid) ou, se for exemplo inventado, ' +
308
+ 'ponha a excecao com motivo em orkastery.privado.json, revisada em PR; confira com ork privado varrer --base <base>',
309
+ });
310
+ continue;
311
+ }
278
312
  if (nome === 'tree_blocked') {
279
313
  if (ctx.branchAtrasDaBase === true) {
280
314
  violacoes.push({
@@ -313,10 +347,9 @@ function motivoDominante(violacoes) {
313
347
  }
314
348
  /** RM-008 (fatia 3): as linhas de aviso (policies em warn) para a saida do CLI. Nada quando nao ha aviso. */
315
349
  function linhasDeAviso(violacoes, recuo = ' ') {
316
- return avisos(violacoes).flatMap((v) => [
317
- `${recuo}aviso da policy ${v.policy}: ${v.detalhe}`,
318
- `${recuo} correcao: ${v.correcao}`,
319
- ]);
350
+ // RM-061 (F2a): a moldura segue o locale do comando; detalhe e correcao sao dado da policy avaliada.
351
+ const m = (0, locale_1.msg)().phase;
352
+ return avisos(violacoes).flatMap((v) => [m.avisoDaPolicy(recuo, v.policy, v.detalhe), m.avisoCorrecao(recuo, v.correcao)]);
320
353
  }
321
354
  /** Texto das violacoes para a saida do CLI. */
322
355
  function textoDeViolacoes(violacoes) {
package/dist/portfolio.js CHANGED
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ID_DE_ENTIDADE = void 0;
36
37
  exports.readPortfolio = readPortfolio;
37
38
  exports.findEntity = findEntity;
38
39
  exports.createProduct = createProduct;
@@ -48,7 +49,8 @@ const estado_thread_1 = require("./estado-thread");
48
49
  const company_brain_journal_1 = require("./company-brain-journal");
49
50
  const util_1 = require("./util");
50
51
  const creation_operation_store_1 = require("./creation-operation-store");
51
- const ID = /^(prod|proj|init)-[a-z0-9][a-z0-9-]{2,47}$/;
52
+ /** Id de produto, projeto ou iniciativa: o mesmo que o Brain recebe e o conhecimento cita (RM-026 K7, D3). */
53
+ exports.ID_DE_ENTIDADE = /^(prod|proj|init)-[a-z0-9][a-z0-9-]{2,47}$/;
52
54
  const PREFIX = { product: 'prod-', project: 'proj-', initiative: 'init-' };
53
55
  const statuses = ['idea', 'planned', 'ready', 'in_progress', 'validating', 'delivered', 'blocked', 'cancelled'];
54
56
  const unique = (values = []) => [...new Set(values.map((v) => v.trim()).filter(Boolean))];
@@ -71,7 +73,7 @@ function mutatePortfolio(root, run) {
71
73
  return (0, creation_operation_store_1.withCreationLock)((0, estado_thread_1.raizDoEstado)(root), 'portfolio', () => (0, company_brain_journal_1.portfolioMutation)(file(root), run));
72
74
  }
73
75
  function validateBase(kind, input) {
74
- if (!ID.test(input.id) || !input.id.startsWith(PREFIX[kind]))
76
+ if (!exports.ID_DE_ENTIDADE.test(input.id) || !input.id.startsWith(PREFIX[kind]))
75
77
  throw new Error(`${kind} exige id ${PREFIX[kind]}...`);
76
78
  if (!input.title.trim() || input.title.length > 160)
77
79
  throw new Error('título deve ter entre 1 e 160 caracteres');