@orkastery/cli 0.5.1 → 0.5.6

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 (260) hide show
  1. package/adapters/claude-code/README.md +158 -0
  2. package/adapters/claude-code/agents/ork-master.md +2 -0
  3. package/adapters/claude-code/commands/master.md +8 -0
  4. package/adapters/claude-code/commands/ork.md +9 -0
  5. package/adapters/claude-code/mods/autoridade.json +56 -0
  6. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  7. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  8. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  9. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  10. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  11. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  12. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  13. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  14. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  15. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  16. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  17. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  18. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  19. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  20. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  21. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  22. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  23. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  24. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  25. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  27. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  28. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  29. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  30. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  31. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  32. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
  33. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  35. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  36. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  37. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  38. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  39. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  40. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  41. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  42. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  43. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  44. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  45. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  46. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  47. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  48. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  49. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  50. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  51. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  52. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  53. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  54. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  55. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  56. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  57. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  58. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  59. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  61. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  62. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  63. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  64. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  65. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  66. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  67. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  68. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  69. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  70. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  71. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  72. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  73. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  74. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  75. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  76. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  77. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  78. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  79. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  80. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  82. package/adapters/codex/skills/ork/SKILL.md +18 -3
  83. package/adapters/hermes/README.md +1 -0
  84. package/adapters/hermes/bin/ork-network-status.sh +10 -0
  85. package/adapters/hermes/hermes.plugin.json +1 -0
  86. package/adapters/hermes/hitl-ingress/__init__.py +2 -2
  87. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +7 -6
  88. package/adapters/openclaw/README.md +26 -5
  89. package/adapters/openclaw/dist/hitl-ingress.js +2 -2
  90. package/adapters/openclaw/dist/index.js +46 -11
  91. package/adapters/openclaw/openclaw.plugin.json +5 -1
  92. package/adapters/openclaw/package.json +2 -2
  93. package/adapters/openclaw/src/hitl-ingress.ts +2 -2
  94. package/adapters/openclaw/src/index.ts +49 -11
  95. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  96. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  97. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  98. package/assets/docs-en/produto/README.md +14 -0
  99. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  100. package/assets/docs-en/roadmap/README.md +14 -0
  101. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  102. package/assets/orkmind_bridge.py +117 -9
  103. package/dist/adapters/claude-bg.js +116 -18
  104. package/dist/adapters/codex.js +14 -4
  105. package/dist/agents-md.js +24 -14
  106. package/dist/auditrun.js +22 -3
  107. package/dist/board.js +20 -17
  108. package/dist/branch-de-estado.js +88 -10
  109. package/dist/busca-semantica.js +52 -12
  110. package/dist/canarios-rm057.js +149 -0
  111. package/dist/canarios.js +2 -0
  112. package/dist/catalogo.js +33 -0
  113. package/dist/ci.js +21 -8
  114. package/dist/claims-conferir.js +342 -0
  115. package/dist/claims.js +41 -1
  116. package/dist/company-brain-client.js +36 -1
  117. package/dist/company-brain-context.js +158 -22
  118. package/dist/company-brain-journal.js +2 -1
  119. package/dist/company-brain-migration.js +36 -1
  120. package/dist/conducao-sentinela.js +388 -0
  121. package/dist/conducao-texto.js +12 -18
  122. package/dist/conducao.js +122 -30
  123. package/dist/conhecimento.js +490 -0
  124. package/dist/docs.js +70 -17
  125. package/dist/doctor-pulse-cron.js +349 -0
  126. package/dist/doctor-rede.js +150 -0
  127. package/dist/doctor.js +195 -111
  128. package/dist/entrega-pr.js +42 -29
  129. package/dist/escopo-escrita.js +10 -1
  130. package/dist/esgotamentos.js +181 -0
  131. package/dist/estado-thread.js +23 -1
  132. package/dist/experiencia-instalacao.js +45 -25
  133. package/dist/experiencia.js +12 -2
  134. package/dist/fabrica-batida.js +310 -0
  135. package/dist/fabrica-estado.js +52 -14
  136. package/dist/fabrica-publicar.js +9 -1
  137. package/dist/fechamento.js +20 -66
  138. package/dist/fila-pesada.js +444 -0
  139. package/dist/fix.js +3 -2
  140. package/dist/forja.js +31 -7
  141. package/dist/gates.js +3 -24
  142. package/dist/handoff.js +10 -6
  143. package/dist/hitl-contract.js +59 -4
  144. package/dist/hitl-curto.js +11 -6
  145. package/dist/hitl-gates.js +5 -0
  146. package/dist/hitl-local-receipt.js +2 -0
  147. package/dist/hitl-lote.js +5 -2
  148. package/dist/hitl-resumo.js +38 -3
  149. package/dist/hitl-tempo-parado.js +201 -0
  150. package/dist/hitl-texto-livre.js +5 -5
  151. package/dist/hitl.js +29 -33
  152. package/dist/horario.js +41 -7
  153. package/dist/hosts.js +104 -11
  154. package/dist/impedimento.js +299 -0
  155. package/dist/index.js +961 -542
  156. package/dist/indice-vetorial.js +87 -10
  157. package/dist/indice.js +9 -1
  158. package/dist/init.js +56 -43
  159. package/dist/instabilidade.js +144 -0
  160. package/dist/integracoes-locais.js +4 -0
  161. package/dist/intelligence-graph-cli.js +170 -16
  162. package/dist/intelligence-graph-contexto.js +254 -0
  163. package/dist/intelligence-graph-contract.js +2 -1
  164. package/dist/intelligence-graph-extract-md.js +56 -4
  165. package/dist/intelligence-graph-extract-ts.js +71 -3
  166. package/dist/intelligence-graph-parsers.js +6 -4
  167. package/dist/intelligence-graph-query.js +66 -19
  168. package/dist/leases.js +664 -87
  169. package/dist/ledger-stats.js +15 -1
  170. package/dist/ledger.js +18 -1
  171. package/dist/licoes.js +1 -0
  172. package/dist/liveness.js +6 -3
  173. package/dist/locale-ajuda.js +761 -0
  174. package/dist/locale-gerados.js +160 -0
  175. package/dist/locale-master.js +99 -0
  176. package/dist/locale-onboarding.js +92 -0
  177. package/dist/locale-phase.js +151 -0
  178. package/dist/locale-pulse.js +211 -0
  179. package/dist/locale-retry.js +385 -0
  180. package/dist/locale-roadmap.js +102 -0
  181. package/dist/locale-ship.js +494 -0
  182. package/dist/locale-thread.js +277 -0
  183. package/dist/locale-verify.js +125 -0
  184. package/dist/locale.js +714 -0
  185. package/dist/maestro-runtime.js +4 -1
  186. package/dist/manifest.js +149 -4
  187. package/dist/maquina.js +23 -4
  188. package/dist/master-digest.js +6 -1
  189. package/dist/master-nota.js +18 -11
  190. package/dist/master.js +145 -31
  191. package/dist/mcp-artifacts.js +43 -3
  192. package/dist/mcp-git.js +42 -8
  193. package/dist/mcp-grafo-worker.js +5 -3
  194. package/dist/mcp-grafo.js +55 -6
  195. package/dist/mcp-server.js +22 -3
  196. package/dist/mcp-ship.js +3 -1
  197. package/dist/mcp-verify.js +6 -1
  198. package/dist/memoria.js +48 -6
  199. package/dist/modos.js +3 -6
  200. package/dist/network-roadmap.js +196 -18
  201. package/dist/noctum-arco.js +911 -0
  202. package/dist/noctum-capacidade.js +141 -0
  203. package/dist/noctum-envelope.js +810 -0
  204. package/dist/noctum-execucao.js +304 -0
  205. package/dist/noctum-fila.js +280 -0
  206. package/dist/ocupacao.js +40 -5
  207. package/dist/onboarding.js +40 -21
  208. package/dist/orkmind.js +99 -7
  209. package/dist/orquestracao.js +24 -21
  210. package/dist/parado-no-condutor.js +219 -38
  211. package/dist/phase.js +160 -52
  212. package/dist/policies.js +56 -5
  213. package/dist/portfolio.js +8 -3
  214. package/dist/postura-local.js +234 -0
  215. package/dist/preflight.js +11 -10
  216. package/dist/procedencia.js +225 -0
  217. package/dist/projeto-alvo.js +132 -5
  218. package/dist/prompts.js +40 -1
  219. package/dist/prova-ativacao.js +75 -6
  220. package/dist/pulse-delivery.js +47 -4
  221. package/dist/pulse.js +98 -19
  222. package/dist/ratelimit.js +24 -6
  223. package/dist/recall.js +3 -1
  224. package/dist/redacao-saida.js +63 -0
  225. package/dist/rede-adesao.js +399 -0
  226. package/dist/rede-forja.js +289 -0
  227. package/dist/rede-projetos.js +239 -0
  228. package/dist/rede-status.js +337 -0
  229. package/dist/rede.js +980 -0
  230. package/dist/retry.js +291 -140
  231. package/dist/roadmap-reservas.js +20 -3
  232. package/dist/roadmap-status.js +150 -34
  233. package/dist/runtime-context.js +181 -3
  234. package/dist/runtime-profiles.js +22 -1
  235. package/dist/runtimes.js +2 -1
  236. package/dist/saida-segura.js +58 -0
  237. package/dist/session-events.js +7 -3
  238. package/dist/session-watcher-claude.js +120 -24
  239. package/dist/session-watcher.js +185 -33
  240. package/dist/sessoes-contas.js +187 -0
  241. package/dist/sessoes-inventario.js +6 -18
  242. package/dist/sessoes.js +83 -2
  243. package/dist/ship-publicar.js +800 -0
  244. package/dist/ship.js +157 -88
  245. package/dist/steal.js +77 -0
  246. package/dist/thread-close.js +3 -2
  247. package/dist/thread.js +299 -49
  248. package/dist/util.js +8 -1
  249. package/dist/verify.js +141 -52
  250. package/dist/vida-da-thread.js +254 -0
  251. package/dist/worktree-local.js +165 -0
  252. package/dist/worktree.js +25 -2
  253. package/dist/yaml.js +27 -8
  254. package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
  255. package/package.json +7 -3
  256. package/references/definition-of-done.md +1 -1
  257. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  258. package/skills/README.md +1 -1
  259. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  260. package/skills/phases/master-metrics/SKILL.md +8 -3
package/dist/phase.js CHANGED
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.REGRAS_DE_EVIDENCIA = exports.CONTRATO_DAS_FASES = void 0;
37
37
  exports.escolherPerfil = escolherPerfil;
38
+ exports.perfilPedido = perfilPedido;
38
39
  exports.perfilParaDespacho = perfilParaDespacho;
39
40
  exports.runtimeCruzadoParaDespacho = runtimeCruzadoParaDespacho;
40
41
  exports.estadoParaDespacho = estadoParaDespacho;
@@ -71,17 +72,21 @@ const board_1 = require("./board");
71
72
  const verify_1 = require("./verify");
72
73
  const session_watcher_1 = require("./session-watcher");
73
74
  const session_watcher_claude_1 = require("./session-watcher-claude");
75
+ const manifest_1 = require("./manifest");
76
+ const mcp_grafo_1 = require("./mcp-grafo");
74
77
  const runtimes_1 = require("./runtimes");
75
78
  const setup_1 = require("./setup");
76
79
  const modos_1 = require("./modos");
77
80
  const gates_1 = require("./gates");
78
81
  const policies_1 = require("./policies");
79
82
  const ratelimit_1 = require("./ratelimit");
83
+ const impedimento_1 = require("./impedimento");
80
84
  const claude_bg_1 = require("./adapters/claude-bg");
81
85
  const codex_1 = require("./adapters/codex");
82
86
  const memoria_1 = require("./memoria");
83
87
  const prompts_1 = require("./prompts");
84
88
  const slug_1 = require("./slug");
89
+ const locale_1 = require("./locale");
85
90
  const thread_1 = require("./thread");
86
91
  const types_1 = require("./types");
87
92
  const util_1 = require("./util");
@@ -89,7 +94,10 @@ const ledger_1 = require("./ledger");
89
94
  const estado_thread_1 = require("./estado-thread");
90
95
  const horario_1 = require("./horario");
91
96
  const runtime_profiles_1 = require("./runtime-profiles");
97
+ const sessoes_contas_1 = require("./sessoes-contas");
92
98
  const maquina_1 = require("./maquina");
99
+ const procedencia_1 = require("./procedencia");
100
+ const postura_local_1 = require("./postura-local");
93
101
  const fabrica_publicar_1 = require("./fabrica-publicar");
94
102
  const conducao_1 = require("./conducao");
95
103
  /**
@@ -102,18 +110,14 @@ function escolherPerfil(raiz, runtime, opcoes = {}) {
102
110
  // I-49: o despacho enxerga o estado que as outras fabricas viram na mesma conta.
103
111
  const store = (0, runtime_profiles_1.lerPerfisComContas)(raiz, opcoes.agoraMs);
104
112
  const doRuntime = (0, runtime_profiles_1.perfisDoRuntime)(store, runtime);
105
- if (opcoes.perfil !== undefined) {
106
- const pedido = doRuntime.find(p => p.id === opcoes.perfil);
107
- if (!pedido)
108
- return { perfil: null, configurados: doRuntime.length, erro: `perfil "${opcoes.perfil}" nao existe para o runtime ${runtime}` };
109
- if (!(0, runtime_profiles_1.perfilDisponivel)(pedido, opcoes.agoraMs))
110
- return { perfil: null, configurados: doRuntime.length,
111
- erro: `perfil "${pedido.id}" esta ${pedido.estado}${pedido.esgotadoAte ? ` ate ${pedido.esgotadoAte}` : ''}` };
112
- return { perfil: (0, runtime_profiles_1.perfilDeDespacho)(pedido), configurados: doRuntime.length };
113
- }
113
+ if (opcoes.perfil !== undefined)
114
+ return perfilPedido(store, runtime, opcoes.perfil, opcoes.agoraMs);
114
115
  if (doRuntime.length === 0)
115
116
  return { perfil: null, configurados: 0 };
116
- const proximo = (0, runtime_profiles_1.proximoPerfilDisponivel)(store, runtime, opcoes.politica ?? runtime_profiles_1.POLITICA_PADRAO, opcoes);
117
+ const politica = opcoes.politica ?? runtime_profiles_1.POLITICA_PADRAO;
118
+ const proximo = politica.distribuir === 'carga' && opcoes.carga
119
+ ? (0, runtime_profiles_1.proximoPerfilPorCarga)(store, runtime, politica, opcoes.carga, opcoes)
120
+ : (0, runtime_profiles_1.proximoPerfilDisponivel)(store, runtime, politica, opcoes);
117
121
  if (proximo)
118
122
  return { perfil: (0, runtime_profiles_1.perfilDeDespacho)(proximo), configurados: doRuntime.length };
119
123
  const agoraMs = opcoes.agoraMs ?? Date.now();
@@ -125,6 +129,41 @@ function escolherPerfil(raiz, runtime, opcoes = {}) {
125
129
  return { perfil: null, configurados: doRuntime.length, motivo,
126
130
  erro: `nenhum perfil disponivel do runtime ${runtime} (${doRuntime.map(p => `${p.id}: ${p.estado}`).join(', ')})` };
127
131
  }
132
+ /**
133
+ * RM-056 (D1): o perfil PEDIDO (`--perfil`), validado contra o store. Recusa com motivo tipado e nunca
134
+ * troca de perfil: inexistente ou de outro runtime e `runtime.profile-invalid`; esgotado, a cota; sem
135
+ * login (ou de provider pago), o motivo do estado. Funcao propria, para o despacho da RM-055 rebasar limpo.
136
+ */
137
+ function perfilPedido(store, runtime, id, agoraMs = Date.now()) {
138
+ const doRuntime = (0, runtime_profiles_1.perfisDoRuntime)(store, runtime);
139
+ const pedido = doRuntime.find(p => p.id === id);
140
+ if (!pedido) {
141
+ const outro = store.perfis.find(p => p.id === id);
142
+ return { perfil: null, configurados: doRuntime.length, motivo: 'runtime.profile-invalid',
143
+ erro: outro ? `perfil "${id}" e do runtime ${outro.runtime}, nao do ${runtime}`
144
+ : `perfil "${id}" nao existe no store (${doRuntime.length ? `perfis do ${runtime}: ${doRuntime.map(p => p.id).join(', ')}` : `nenhum perfil do ${runtime}`})` };
145
+ }
146
+ if ((0, runtime_profiles_1.perfilDisponivel)(pedido, agoraMs))
147
+ return { perfil: (0, runtime_profiles_1.perfilDeDespacho)(pedido), configurados: doRuntime.length };
148
+ const motivo = pedido.estado === 'esgotado' ? 'runtime.quota-exhausted' : pedido.estado === 'sem-auth'
149
+ ? 'runtime.auth-missing' : pedido.estado === 'provider-pago' ? 'cost.violation' : 'runtime.profile-invalid';
150
+ return { perfil: null, configurados: doRuntime.length, motivo,
151
+ erro: `perfil "${pedido.id}" esta ${pedido.estado}${pedido.esgotadoAte ? ` ate ${pedido.esgotadoAte}` : ''}` };
152
+ }
153
+ /**
154
+ * RM-056 (D3): a carga dos perfis do runtime, so quando o manifesto pede `distribuir: carga` e o
155
+ * dono nao pediu um perfil. Consulta falha vale carga desconhecida (zero): decide o desempate.
156
+ */
157
+ function cargaDoDespacho(carregado, runtime, politica, pedido) {
158
+ if (politica.distribuir !== 'carga' || pedido !== undefined || !(0, runtime_profiles_1.runtimeComPerfil)(runtime))
159
+ return undefined;
160
+ try {
161
+ return (0, sessoes_contas_1.sessoesVivasPorPerfil)(carregado.raiz, runtime, carregado.manifesto.concurrency.stale_after_min);
162
+ }
163
+ catch {
164
+ return new Map();
165
+ }
166
+ }
128
167
  /**
129
168
  * I-33 (D7, D13): preflight de auth antes do despacho. O perfil escolhido tem o login conferido
130
169
  * pelo proprio CLI com o env dele; reprovado, vira `sem-auth` no store (ou `provider-pago`, quando
@@ -136,8 +175,9 @@ function perfilParaDespacho(carregado, thread, fase, runtime, opcoes) {
136
175
  const { raiz } = carregado;
137
176
  const excluir = [...(opcoes.excluir ?? [])];
138
177
  const politica = (0, runtime_profiles_1.politicaDeRotacao)(carregado.manifesto);
178
+ const carga = cargaDoDespacho(carregado, runtime, politica, opcoes.perfil);
139
179
  for (;;) {
140
- const escolha = escolherPerfil(raiz, runtime, { perfil: opcoes.perfil, excluir, politica });
180
+ const escolha = escolherPerfil(raiz, runtime, { perfil: opcoes.perfil, excluir, politica, carga });
141
181
  if (escolha.erro || !escolha.perfil || opcoes.dryRun)
142
182
  return escolha;
143
183
  const auth = runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(escolha.perfil) : runtime === 'codex' ? (0, codex_1.conferirAuth)(escolha.perfil)
@@ -164,7 +204,7 @@ function perfilParaDespacho(carregado, thread, fase, runtime, opcoes) {
164
204
  razao = 'o preflight de auth reprovou o perfil antes do despacho (D7): perfil sem login nunca recebe despacho';
165
205
  }
166
206
  excluir.push(escolha.perfil.id);
167
- const proximo = opcoes.perfil === undefined ? escolherPerfil(raiz, runtime, { excluir, politica }).perfil : null;
207
+ const proximo = opcoes.perfil === undefined ? escolherPerfil(raiz, runtime, { excluir, politica, carga }).perfil : null;
168
208
  (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, thread.id), thread.id, ledger_1.TIPOS_DE_EVENTO.perfilRotacionado, {
169
209
  fase, motivo, origem: `${opcoes.origem}.preflight`,
170
210
  de: { runtime, perfil: escolha.perfil.id }, para: proximo ? { runtime, perfil: proximo.id } : null,
@@ -218,6 +258,8 @@ function estadoParaDespacho(raiz, thread, dryRun = false) {
218
258
  if (!thread.worktree)
219
259
  return null;
220
260
  try {
261
+ // RM-047 (P2): a worktree do thread.json so vale registrada no git e com o estado local.
262
+ (0, procedencia_1.diretorioDaThread)(raiz, thread);
221
263
  (0, estado_thread_1.vincularEstado)(raiz, thread.id, thread.worktree, dryRun);
222
264
  return null;
223
265
  }
@@ -239,6 +281,10 @@ exports.REGRAS_DE_EVIDENCIA = [
239
281
  'Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.',
240
282
  'Trabalhe apenas no diretorio de trabalho indicado acima.',
241
283
  'Passos irreversiveis (push, merge, delecao) so acontecem quando o modo autoriza.',
284
+ // RM-058 N2 (D13 da ork-rm058n2): tres sessoes de 12/10/2026 mandaram verify ou suite para segundo plano com `&`,
285
+ // perderam o processo e esperaram para sempre.
286
+ 'Verify, build e suite rodam em primeiro plano, com timeout, nunca com `&` no comando: o processo em segundo plano ' +
287
+ 'se perde e a sessao espera para sempre. O `ork verify` espera a vez na fila de recursos pesados.',
242
288
  ];
243
289
  /**
244
290
  * I-42 (D11): as fases que o cabecalho do prompt descreve.
@@ -314,8 +360,10 @@ function montarPrompt(thread, fase, pedido, raiz, memoriaInjetada = '') {
314
360
  */
315
361
  function montarPromptComMemoria(carregado, thread, fase, pedido, memoria) {
316
362
  const injecao = (0, memoria_1.injecaoDaFase)(carregado, memoria, thread, fase);
363
+ // Mesma raiz usada pelo MCP e runtime-context; o manifesto da WT nao habilita a dica.
364
+ const ligado = (0, mcp_grafo_1.grafoLigado)((0, manifest_1.exigirManifesto)((0, estado_thread_1.raizDoEstado)(carregado.raiz)).manifesto);
317
365
  return {
318
- prompt: montarPrompt(thread, fase, pedido, carregado.raiz, injecao.texto),
366
+ prompt: montarPrompt(thread, fase, (0, prompts_1.pedidoComDicaDoGrafo)(pedido, thread.id, ligado), carregado.raiz, injecao.texto),
319
367
  injecao,
320
368
  };
321
369
  }
@@ -372,10 +420,10 @@ function resolverDespacho(manifesto, opcoes, doBloco) {
372
420
  const origem = doBloco?.runtime ?? manifesto.runtime.adapter;
373
421
  const runtime = opcoes.runtime ?? origem;
374
422
  if ((0, runtimes_1.runtimeConhecido)(runtime) && runtime !== origem && !opcoes.model?.trim())
375
- 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.`);
423
+ throw new locale_1.ErroDoCatalogo((m) => m.phase.modeloAoTrocarRuntime(origem, runtime));
376
424
  const model = opcoes.model ?? doBloco?.model ?? manifesto.runtime.model;
377
425
  if (!model.trim())
378
- throw new Error(`setup.model.required: modelo pendente para ${runtime}; informe --model <modelo> neste despacho ou complete o bloco em ork setup.`);
426
+ throw new locale_1.ErroDoCatalogo((m) => m.phase.modeloPendente(runtime));
379
427
  const effort = opcoes.effort ??
380
428
  (opcoes.model !== undefined ? 'high' : doBloco?.effort ?? manifesto.runtime.effort);
381
429
  return { runtime, model, effort };
@@ -580,7 +628,8 @@ function garantirBaselineDoDespacho(carregado, threadId, opcoes, identidade) {
580
628
  if (!baselineDoDespachoNecessaria(carregado, threadId, opcoes))
581
629
  return;
582
630
  try {
583
- (0, verify_1.gravarBaseline)(carregado, threadId, undefined, { canal: opcoes.canal ?? (0, conducao_1.canalDoProcesso)(), correlacao: opcoes.correlacao ?? null, ...(identidade ? { identidade } : {}) }, 'phase.run');
631
+ (0, verify_1.gravarBaseline)(carregado, threadId, undefined, { canal: opcoes.canal ?? (0, conducao_1.canalDoProcesso)(), correlacao: opcoes.correlacao ?? null, ...(identidade ? { identidade } : {}),
632
+ filaPesada: { esperarMs: opcoes.esperarMs, ...opcoes.filaPesada } }, 'phase.run');
584
633
  }
585
634
  catch (e) {
586
635
  if (!(e instanceof conducao_1.ErroDeConducao))
@@ -723,6 +772,17 @@ tomadaPrevia) {
723
772
  verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
724
773
  runtime, model, effort, bloqueado: true, motivo: 'runtime.autoconferencia', violacoes, erro: erroDeRuntime };
725
774
  }
775
+ // RM-047 (P1): sandbox afrouxado pelo manifesto so despacha com a confirmacao local desta maquina.
776
+ const erroDePostura = (0, postura_local_1.recusaDePostura)(raiz, manifesto, runtime);
777
+ if (erroDePostura) {
778
+ const postura = (0, postura_local_1.posturaAfrouxada)(manifesto) ?? '';
779
+ if (!opcoes.dryRun)
780
+ (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'policy.violation',
781
+ modo: thread.modo, detalhe: erroDePostura, correcao: (0, postura_local_1.comandoDeConfirmacao)(postura), fase, slug });
782
+ return { thread, slug, promptPath, promptSha256: sha, comando: [], sessionId: null,
783
+ verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
784
+ runtime, model, effort, bloqueado: true, motivo: 'policy.violation', violacoes, erro: erroDePostura };
785
+ }
726
786
  const erroDeEstado = estadoParaDespacho(raiz, thread, opcoes.dryRun);
727
787
  if (erroDeEstado) {
728
788
  (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'tree.blocked',
@@ -819,7 +879,17 @@ tomadaPrevia) {
819
879
  return pendente;
820
880
  }
821
881
  }
822
- const cwd = thread.worktree ?? raiz;
882
+ const cwd = (0, procedencia_1.diretorioDaThread)(raiz, thread);
883
+ // RM-063 (F3): o prompt vai ao disco e ao ledger, com o sha256, ANTES do contexto do runtime e do adaptador. No
884
+ // incidente de 12/10/2026 a fase morreu no despacho e o `ork retry run` saiu com "nao ha despacho falho registrado
885
+ // em GO com prompt gravado"; daqui em diante, toda tentativa deixa o prompt que o retry redespacha sem pedir o texto.
886
+ (0, util_1.gravar)(promptPath, prompt);
887
+ const promptNoLedger = { promptPath: path.relative(raiz, promptPath), promptSha256: sha };
888
+ if (!opcoes.dryRun) {
889
+ (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.promptGravado, { fase, slug, modo: thread.modo, runtime, model, effort, cwd,
890
+ ...promptNoLedger, origem: 'phase.run', canal, ...(opcoes.correlacao ? { correlacao: opcoes.correlacao } : {}), identidade });
891
+ }
892
+ const correcaoDoRetry = `ork retry run ${thread.id} redespacha o mesmo prompt (sha256 ${sha.slice(0, 12)})`;
823
893
  let contextoRuntime;
824
894
  try {
825
895
  contextoRuntime = (0, runtime_context_1.contextoDoProjeto)(raiz, runtime, cwd, thread.id);
@@ -827,14 +897,13 @@ tomadaPrevia) {
827
897
  catch (e) {
828
898
  const erro = `runtime.unavailable: ${e.message}`;
829
899
  (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable',
830
- modo: thread.modo, detalhe: erro, fase, slug });
900
+ modo: thread.modo, detalhe: erro, fase, slug, ...(opcoes.dryRun ? {} : { ...promptNoLedger, correcao: correcaoDoRetry }) });
831
901
  return { thread, slug, promptPath, promptSha256: sha, comando: [], sessionId: null,
832
902
  verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
833
903
  runtime, model, effort, bloqueado: true, motivo: 'runtime.unavailable', violacoes, erro };
834
904
  }
835
905
  if (contextoRuntime)
836
906
  contextoRuntime.identidade = identidade;
837
- (0, util_1.gravar)(promptPath, prompt);
838
907
  // I-33 (D2, D4, D7): o perfil sai do store com o login conferido. Sem perfil disponivel, o
839
908
  // despacho nao sai pela conta errada: o prompt ja gravado fica registrado para a rotacao do
840
909
  // retry (outro runtime da ordem de fallback, ou a fila), com o motivo tipado.
@@ -895,7 +964,7 @@ tomadaPrevia) {
895
964
  : undefined;
896
965
  // I-33 (N1): lido antes de a sessao existir; depois dela, um commit rapido ja estaria no HEAD.
897
966
  const headNoDespacho = fase === 'GO' && runtime === 'codex' && !opcoes.dryRun ? (0, session_watcher_claude_1.headDaWorktree)(cwd) : undefined;
898
- const resultado = rt.despachar({
967
+ const pedidoAoRuntime = {
899
968
  prompt,
900
969
  nome: slug,
901
970
  cwd,
@@ -916,7 +985,7 @@ tomadaPrevia) {
916
985
  ...(limites ? { duracaoMaximaMs: limites.duracaoMs } : {}),
917
986
  // I-36 (D4): a sessao filha herda a identidade do despacho e o canal; e assim que ela reentra.
918
987
  ambienteExtra: (0, conducao_1.ambienteDaConducao)(identidade.dispatchId, thread.id, canal),
919
- });
988
+ };
920
989
  const ctx = {
921
990
  identidade,
922
991
  canal,
@@ -937,6 +1006,22 @@ tomadaPrevia) {
937
1006
  ...(perfil ? { perfil } : {}),
938
1007
  ...(headNoDespacho !== undefined ? { headNoDespacho } : {}),
939
1008
  };
1009
+ let resultado;
1010
+ try {
1011
+ resultado = rt.despachar(pedidoAoRuntime);
1012
+ }
1013
+ catch (e) {
1014
+ // RM-063 (F3): o adaptador que lanca (o daemon do runtime fora do ar) deixa no ledger a falha do despacho com o
1015
+ // prompt e o sha256, e o gate tipado que o `ork retry run` le; o erro segue para quem chamou, como antes.
1016
+ if (!opcoes.dryRun) {
1017
+ const erro = `runtime.unavailable: o runtime adapter lancou no despacho: ${e.message}`;
1018
+ (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.despachoFalhou, { ...dadosDoDespacho(ctx, []), erro });
1019
+ (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable', modo: thread.modo,
1020
+ detalhe: erro, correcao: correcaoDoRetry, fase, slug, runtime, origem: 'phase.run', ...promptNoLedger,
1021
+ evidencia: 'excecao real do runtime adapter no despacho, nao relato do agente' });
1022
+ }
1023
+ throw e;
1024
+ }
940
1025
  const comum = dadosDoDespacho(ctx, resultado.comando);
941
1026
  if (opcoes.dryRun) {
942
1027
  return {
@@ -961,11 +1046,15 @@ tomadaPrevia) {
961
1046
  }
962
1047
  if (!resultado.ok || !resultado.sessionId) {
963
1048
  const erro = resultado.erro ?? 'sem sessionId na saida do runtime';
1049
+ // RM-063 (F3, GO-FIX): o `claude --bg` que sai com erro, ou estoura o prazo, depois de dizer o id deixa a sessao
1050
+ // aberta; o id vai a falha e ao gate, para o retry conferir que ela morreu antes de redespachar.
1051
+ const daSessao = resultado.sessionId ? { sessionId: resultado.sessionId } : {};
964
1052
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.despachoFalhou, {
965
1053
  ...comum,
966
1054
  controlador: resultado.controlador,
967
1055
  erro,
968
1056
  stderr: resultado.stderr.slice(0, 500),
1057
+ ...daSessao,
969
1058
  });
970
1059
  // I-33 (D1, D5): a CONTA recusou o despacho. Nada rodou, entao nada foi produzido: o perfil
971
1060
  // sai do rodizio e o gate tipado fica para a rotacao do retry, que redespacha o mesmo prompt.
@@ -1039,6 +1128,20 @@ tomadaPrevia) {
1039
1128
  erro,
1040
1129
  };
1041
1130
  }
1131
+ // RM-055: o que so o dono resolve no terminal vira a pausa dele, com o comando exato e o que o ork
1132
+ // faz depois. O prompt ja esta gravado com o sha256 acima, e e ele que o retry re-despacha.
1133
+ const impedimento = (0, impedimento_1.registrarImpedimentoDoDono)(dir, thread, { fase, slug, runtime, cwd, origem: 'phase.run',
1134
+ promptPath, promptSha256: sha, perfil, saida: `${resultado.stderr}\n${erro}` });
1135
+ if (impedimento) {
1136
+ return { thread, slug, promptPath, promptSha256: sha, comando: resultado.comando, controlador: resultado.controlador,
1137
+ sessionId: null, verificada: false, pausaAoFim, dryRun: false, runtime, model, effort, bloqueado: false,
1138
+ motivo: impedimento.motivo, violacoes, naFila: null, erro: `${impedimento.motivo}: ${impedimento.trecho}` };
1139
+ }
1140
+ // RM-063 (F3): a falha seca do adaptador vira gate tipado, com o prompt e o sha256. Antes so o `phase_dispatch_failed`
1141
+ // a registrava: o `ork retry plan` nao a via e a fase ficava parada sem ninguem saber.
1142
+ (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable', modo: thread.modo,
1143
+ detalhe: erro, correcao: correcaoDoRetry, fase, slug, runtime, origem: 'phase.run', ...promptNoLedger, ...daSessao,
1144
+ evidencia: 'saida real do runtime adapter no despacho, nao relato do agente' });
1042
1145
  return {
1043
1146
  thread,
1044
1147
  slug,
@@ -1091,8 +1194,11 @@ function tabelaDoLedger(raiz, threadId) {
1091
1194
  // Thread inexistente e erro, nao ledger vazio: o CLI precisa reprovar o id errado.
1092
1195
  (0, thread_1.lerThread)(raiz, threadId);
1093
1196
  const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, threadId));
1197
+ // RM-061 (F2a): a moldura e os rotulos vem do catalogo; o valor de cada evento (decisao, estado,
1198
+ // erro, detalhe) e dado do ledger e sai como foi gravado.
1199
+ const m = (0, locale_1.msg)().phase;
1094
1200
  if (eventos.length === 0) {
1095
- return `Ledger vazio para a thread ${threadId}.`;
1201
+ return m.ledgerVazio(threadId);
1096
1202
  }
1097
1203
  const linhas = eventos.map((e) => {
1098
1204
  const detalhe = [];
@@ -1101,86 +1207,88 @@ function tabelaDoLedger(raiz, threadId) {
1101
1207
  if (e.slug)
1102
1208
  detalhe.push(String(e.slug));
1103
1209
  if (e.sessionId)
1104
- detalhe.push(`sessao ${String(e.sessionId).slice(0, 8)}`);
1210
+ detalhe.push(m.sessao(String(e.sessionId).slice(0, 8)));
1105
1211
  if (e.decisao)
1106
1212
  detalhe.push(String(e.decisao));
1107
1213
  if (e.previstaSobre)
1108
- detalhe.push(`pausa sobre ${String(e.previstaSobre)}`);
1214
+ detalhe.push(m.pausaSobre((0, locale_1.msg)().thread.pausaSobre(String(e.previstaSobre))));
1109
1215
  if (e.encontrada !== undefined)
1110
- detalhe.push(`no runtime: ${e.encontrada ? 'sim' : 'nao'}`);
1216
+ detalhe.push(m.noRuntime(!!e.encontrada));
1111
1217
  // Fato verificavel do despacho: o par modelo/esforco real, lido do proprio evento.
1112
1218
  if (e.model)
1113
- detalhe.push(`modelo ${String(e.model)}/${String(e.effort ?? '-')}`);
1219
+ detalhe.push(m.modelo(String(e.model), String(e.effort ?? '-')));
1114
1220
  // Eventos do bloco B1: motivo tipado, veredito e as provas do ship.
1115
1221
  if (e.motivo)
1116
- detalhe.push(`motivo ${String(e.motivo)}`);
1222
+ detalhe.push(m.motivo(String(e.motivo)));
1117
1223
  if (e.claim)
1118
1224
  detalhe.push(`claim ${String(e.claim)}`);
1119
1225
  if (e.veredito)
1120
- detalhe.push(`veredito: ${String(e.veredito)}`);
1226
+ detalhe.push(m.veredito(String(e.veredito)));
1121
1227
  if (e.fonte && e.ocupacao !== undefined) {
1122
- detalhe.push(`ocupacao ${e.ocupacao === null ? 'nao medivel' : String(e.ocupacao)} (${String(e.fonte)})`);
1228
+ detalhe.push(m.ocupacao(e.ocupacao === null ? null : String(e.ocupacao), String(e.fonte)));
1123
1229
  }
1124
1230
  if (e.slugSugerido)
1125
- detalhe.push(`proximo slug ${String(e.slugSugerido)}`);
1231
+ detalhe.push(m.proximoSlug(String(e.slugSugerido)));
1126
1232
  if (e.lease)
1127
1233
  detalhe.push(`lease ${String(e.lease)}`);
1128
1234
  // Eventos do bloco B3: acao de retry, playbook da retomada e rodada de GO-FIX.
1129
1235
  if (e.acao)
1130
- detalhe.push(`acao ${String(e.acao)}`);
1236
+ detalhe.push(m.acao(String(e.acao)));
1131
1237
  if (e.playbook)
1132
1238
  detalhe.push(`playbook ${String(e.playbook)}`);
1133
- if (e.pedido)
1134
- detalhe.push(`pedido ${String(e.pedido)}`);
1239
+ // Ensaio de 03/10/2026 (RM-049): na decisao autonoma o pedido e o objeto `ork.hitl/v2`, e a tabela
1240
+ // mostrava "pedido [object Object]"; do objeto sai o id curto.
1241
+ if (typeof e.pedido === 'string' && e.pedido !== '')
1242
+ detalhe.push(m.pedido(e.pedido));
1243
+ else if (e.pedido && typeof e.pedido === 'object' && typeof e.pedido.id === 'string') {
1244
+ detalhe.push(m.pedido(e.pedido.id.slice(0, 8)));
1245
+ }
1135
1246
  if (e.rodada !== undefined)
1136
- detalhe.push(`rodada ${String(e.rodada)}`);
1247
+ detalhe.push(m.rodada(String(e.rodada)));
1137
1248
  if (e.cobertura)
1138
- detalhe.push(`cobertura ${String(e.cobertura)}`);
1249
+ detalhe.push(m.cobertura(String(e.cobertura)));
1139
1250
  if (e.liberaEm)
1140
- detalhe.push(`libera em ${(0, horario_1.formatarDataHora)(String(e.liberaEm))}`);
1251
+ detalhe.push(m.liberaEm((0, horario_1.formatarDataHora)(String(e.liberaEm))));
1141
1252
  if (e.tentativa !== undefined && e.limite !== undefined) {
1142
- detalhe.push(`tentativa ${String(e.tentativa)}/${String(e.limite)}`);
1253
+ detalhe.push(m.tentativa(String(e.tentativa), String(e.limite)));
1143
1254
  }
1144
1255
  if (e.mergeSha)
1145
1256
  detalhe.push(`merge ${String(e.mergeSha).slice(0, 8)}`);
1146
1257
  if (e.shaRemoto)
1147
- detalhe.push(`remoto ${String(e.shaRemoto).slice(0, 8)}`);
1258
+ detalhe.push(m.remoto(String(e.shaRemoto).slice(0, 8)));
1148
1259
  if (e.pushVerificado !== undefined)
1149
- detalhe.push(`push provado: ${e.pushVerificado ? 'sim' : 'nao'}`);
1260
+ detalhe.push(m.pushProvado(!!e.pushVerificado));
1150
1261
  if (e.autorizadoPor)
1151
- detalhe.push(`autorizado por ${String(e.autorizadoPor)}`);
1262
+ detalhe.push(m.autorizadoPor(String(e.autorizadoPor)));
1152
1263
  if (e.sobre)
1153
- detalhe.push(`sobre ${String(e.sobre)}`);
1264
+ detalhe.push(m.sobre(String(e.sobre)));
1154
1265
  if (e.estado)
1155
1266
  detalhe.push(String(e.estado));
1156
1267
  if (typeof e.de === 'string' && typeof e.para === 'string') {
1157
1268
  detalhe.push(`${e.de} -> ${e.para}`);
1158
1269
  }
1159
1270
  if (e.dryRun === true)
1160
- detalhe.push('ensaio (--dry-run)');
1271
+ detalhe.push(m.ensaio);
1161
1272
  if (e.tipo === ledger_1.TIPOS_DE_EVENTO.worktreeCriada && e.dir) {
1162
- detalhe.push(`${String(e.branch)} em ${String(e.dir)}`);
1273
+ detalhe.push(m.worktreeEm(String(e.branch), String(e.dir)));
1163
1274
  }
1164
1275
  if (e.inline !== undefined) {
1165
- detalhe.push(`triagem ${String(e.inline)} inline / ${String(e.pointers)} ponteiros / ${String(e.summaries)} resumos`);
1276
+ detalhe.push(m.triagem(String(e.inline), String(e.pointers), String(e.summaries)));
1166
1277
  }
1167
1278
  if (e.location)
1168
- detalhe.push(`ponteiro ${String(e.location)}`);
1279
+ detalhe.push(m.ponteiro(String(e.location)));
1169
1280
  if (e.erro)
1170
- detalhe.push(`erro: ${String(e.erro)}`);
1281
+ detalhe.push(m.erro(String(e.erro)));
1171
1282
  if (e.detalhe && !e.decisao)
1172
1283
  detalhe.push((0, horario_1.localizarTexto)(String(e.detalhe)).slice(0, 90));
1173
1284
  if (e.modo && !e.fase)
1174
- detalhe.push(`modo ${String(e.modo)}`);
1285
+ detalhe.push(m.modo(String(e.modo)));
1175
1286
  return [(0, horario_1.formatarDataHora)(e.ts, { segundos: true }), e.tipo, detalhe.join(' | ')];
1176
1287
  });
1177
- return `${(0, util_1.tabela)(['QUANDO', 'EVENTO', 'DETALHE'], linhas)}\n${(0, horario_1.legendaDoFuso)()}`;
1288
+ return `${(0, util_1.tabela)([...m.colunas], linhas)}\n${(0, horario_1.legendaDoFuso)()}`;
1178
1289
  }
1179
1290
  /** Slug legivel por humano de uma sessao (usado nas mensagens do CLI). */
1180
1291
  function descreverSlug(slug) {
1181
1292
  const p = (0, slug_1.parseSlug)(slug);
1182
- if (!p)
1183
- return slug;
1184
- const rot = p.rotacao ? `, rotacao ${p.rotacao}` : '';
1185
- return `produto "${p.produto}", assunto "${p.assunto}", fases "${p.fases}"${rot}`;
1293
+ return p ? (0, locale_1.msg)().thread.slug(p.produto, p.assunto, p.fases, p.rotacao) : slug;
1186
1294
  }
package/dist/policies.js CHANGED
@@ -11,8 +11,9 @@
11
11
  * ela volta na lista de desconhecidas, para o `doctor` e o CLI dizerem que ela nao vale.
12
12
  */
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.POLICIES_CONHECIDAS = void 0;
14
+ exports.POLICIES_DE_PROVA_LOCAL = exports.POLICIES_CONHECIDAS = void 0;
15
15
  exports.procurarSegredos = procurarSegredos;
16
+ exports.policyDeProvaLocal = policyDeProvaLocal;
16
17
  exports.policiesDesconhecidas = policiesDesconhecidas;
17
18
  exports.avaliarPolicies = avaliarPolicies;
18
19
  exports.avisos = avisos;
@@ -20,6 +21,7 @@ exports.bloqueantes = bloqueantes;
20
21
  exports.motivoDominante = motivoDominante;
21
22
  exports.linhasDeAviso = linhasDeAviso;
22
23
  exports.textoDeViolacoes = textoDeViolacoes;
24
+ const locale_1 = require("./locale");
23
25
  /**
24
26
  * Variaveis que REDIRECIONAM o despacho do `claude` para um provider pago.
25
27
  * Mesma lista do `ork doctor`: presenca delas com `subscription-only` e bloqueante.
@@ -95,7 +97,28 @@ exports.POLICIES_CONHECIDAS = {
95
97
  quando: ['ship'],
96
98
  descricao: 'avisa quando a branch da thread esta atras da base',
97
99
  },
100
+ // RM-008 (B8): a licao `claims.failed` ("rode o comando da claim antes de registra-la"). Desligada por
101
+ // padrao; declarada, o `ork claims add` roda o comando uma vez no prazo do verify. So avisa, nunca para.
102
+ claim_sem_prova_local: {
103
+ quando: ['claims.add'],
104
+ descricao: 'avisa quando o comando da claim reprova (ou estoura o prazo do verify) no registro',
105
+ },
106
+ claims_failed: {
107
+ quando: ['claims.add'],
108
+ descricao: 'a mesma conferencia de claim_sem_prova_local, com o nome que o ork licoes propoe',
109
+ },
98
110
  };
111
+ /** RM-008 (B8): as policies que conferem a claim no registro (um aviso so, como verify_regression e verify_failed). */
112
+ exports.POLICIES_DE_PROVA_LOCAL = ['claim_sem_prova_local', 'claims_failed'];
113
+ /** A primeira policy de prova local declarada fora de `off`, ou `null` (o `claims add` nao roda nada). */
114
+ function policyDeProvaLocal(manifesto) {
115
+ const declaradas = manifesto.policies ?? {};
116
+ for (const [nome, bruta] of Object.entries(declaradas)) {
117
+ if (exports.POLICIES_DE_PROVA_LOCAL.includes(nome) && severidade(bruta) !== 'off')
118
+ return nome;
119
+ }
120
+ return null;
121
+ }
99
122
  /**
100
123
  * Ensaio da 0.5.0: a thread criada sem `--worktree auto` entrega a base para a base, e a correcao
101
124
  * repetia o proprio `ork ship`. A thread que ainda nao passou do GO ganha a branch com
@@ -122,6 +145,8 @@ function avaliarPolicies(manifesto, ctx) {
122
145
  const violacoes = [];
123
146
  // verify_regression e verify_failed conferem a mesma coisa: um aviso so, com o nome da primeira declarada.
124
147
  let baselineJaAvaliada = false;
148
+ // claim_sem_prova_local e claims_failed idem.
149
+ let provaLocalJaAvaliada = false;
125
150
  for (const [nome, bruta] of Object.entries(declaradas)) {
126
151
  const conhecida = exports.POLICIES_CONHECIDAS[nome];
127
152
  if (!conhecida || !conhecida.quando.includes(ctx.gate))
@@ -224,6 +249,33 @@ function avaliarPolicies(manifesto, ctx) {
224
249
  }
225
250
  continue;
226
251
  }
252
+ if (exports.POLICIES_DE_PROVA_LOCAL.includes(nome)) {
253
+ if (provaLocalJaAvaliada)
254
+ continue;
255
+ provaLocalJaAvaliada = true;
256
+ const r = ctx.provaLocalReprovada;
257
+ if (r) {
258
+ const id = ctx.threadId ?? '<thread>';
259
+ violacoes.push({
260
+ policy: nome,
261
+ // O registro de claim nunca para: `block` declarado avisa como `warn`.
262
+ severidade: 'warn',
263
+ motivo: r.estourou ? 'verify.timeout' : 'claims.failed',
264
+ detalhe: r.semDiretorio
265
+ ? `a worktree da thread (${r.semDiretorio}) nao existe; o comando da claim ${r.claim} nao rodou e a claim entrou sem prova local`
266
+ : r.estourou
267
+ ? `o comando da claim ${r.claim} estourou o prazo do verify (${Math.round(r.prazoMs / 1000)} s) no registro; a claim entrou sem prova local`
268
+ : `o comando da claim ${r.claim} saiu ${r.code} no registro; a claim entrou sem prova local e reprova no verify`,
269
+ correcao: r.semDiretorio
270
+ ? `recrie a worktree da thread (ou feche a thread que perdeu a worktree); depois, ork verify ${id}`
271
+ : r.estourou
272
+ ? `divida o comando ou suba verify.timeout_ms; depois, ork verify ${id}`
273
+ : `corrija o produto ou o comando e anexe o certo com ork claims verificar ${id} ${r.claim} --comando "<comando>"; ` +
274
+ `se a alegacao nao vale, ork claims retirar ${id} ${r.claim} --motivo "<motivo>"`,
275
+ });
276
+ }
277
+ continue;
278
+ }
227
279
  if (nome === 'tree_blocked') {
228
280
  if (ctx.branchAtrasDaBase === true) {
229
281
  violacoes.push({
@@ -262,10 +314,9 @@ function motivoDominante(violacoes) {
262
314
  }
263
315
  /** RM-008 (fatia 3): as linhas de aviso (policies em warn) para a saida do CLI. Nada quando nao ha aviso. */
264
316
  function linhasDeAviso(violacoes, recuo = ' ') {
265
- return avisos(violacoes).flatMap((v) => [
266
- `${recuo}aviso da policy ${v.policy}: ${v.detalhe}`,
267
- `${recuo} correcao: ${v.correcao}`,
268
- ]);
317
+ // RM-061 (F2a): a moldura segue o locale do comando; detalhe e correcao sao dado da policy avaliada.
318
+ const m = (0, locale_1.msg)().phase;
319
+ return avisos(violacoes).flatMap((v) => [m.avisoDaPolicy(recuo, v.policy, v.detalhe), m.avisoCorrecao(recuo, v.correcao)]);
269
320
  }
270
321
  /** Texto das violacoes para a saida do CLI. */
271
322
  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;
@@ -44,10 +45,12 @@ exports.assertCycleScope = assertCycleScope;
44
45
  /** Catálogo determinístico de produto -> projeto -> iniciativa. */
45
46
  const fs = __importStar(require("node:fs"));
46
47
  const project_state_1 = require("./project-state");
48
+ const estado_thread_1 = require("./estado-thread");
47
49
  const company_brain_journal_1 = require("./company-brain-journal");
48
50
  const util_1 = require("./util");
49
51
  const creation_operation_store_1 = require("./creation-operation-store");
50
- 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}$/;
51
54
  const PREFIX = { product: 'prod-', project: 'proj-', initiative: 'init-' };
52
55
  const statuses = ['idea', 'planned', 'ready', 'in_progress', 'validating', 'delivered', 'blocked', 'cancelled'];
53
56
  const unique = (values = []) => [...new Set(values.map((v) => v.trim()).filter(Boolean))];
@@ -65,10 +68,12 @@ function readPortfolio(root) {
65
68
  }
66
69
  function persist(root, value) { value.updatedAt = (0, util_1.agora)(); (0, company_brain_journal_1.replaceWithJournal)(file(root), value); return value; }
67
70
  function mutatePortfolio(root, run) {
68
- return (0, creation_operation_store_1.withCreationLock)(root, 'portfolio', () => (0, company_brain_journal_1.portfolioMutation)(file(root), run));
71
+ // RM-036 (D5): o portfolio.json e canonico, e o lock de espera tambem: chamado da raiz ou de uma worktree,
72
+ // quem chega depois espera a vez, em vez de recusar com brain.journal.busy no lock interno.
73
+ return (0, creation_operation_store_1.withCreationLock)((0, estado_thread_1.raizDoEstado)(root), 'portfolio', () => (0, company_brain_journal_1.portfolioMutation)(file(root), run));
69
74
  }
70
75
  function validateBase(kind, input) {
71
- if (!ID.test(input.id) || !input.id.startsWith(PREFIX[kind]))
76
+ if (!exports.ID_DE_ENTIDADE.test(input.id) || !input.id.startsWith(PREFIX[kind]))
72
77
  throw new Error(`${kind} exige id ${PREFIX[kind]}...`);
73
78
  if (!input.title.trim() || input.title.length > 160)
74
79
  throw new Error('título deve ter entre 1 e 160 caracteres');