@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
@@ -42,7 +42,25 @@ nos perfis `coding` e `messaging` (`toolMetadata`): sem isso, no perfil `coding`
42
42
  plugin chega ao modelo. `ork_network_status` espera a RM-053 na `main`. `network-roadmap-hosts.test.ts` prova a rota de cada host e o aceite do incidente de 29/09
43
43
  pela extensão do OpenClaw com o `ork` real.
44
44
 
45
+ ## Paridade do conhecimento escrito
46
+
47
+ O conhecimento escrito ([RM-026](../docs/roadmap/RM-026-workspace-empresarial.md) K7) chega aos quatro hosts pelas
48
+ mesmas quatro tools `ork_conhecimento_*`: tools do MCP no Claude Code e no Codex, tool argv no OpenClaw (só no
49
+ perfil `coding`) e wrapper no Hermes, cada uma uma chamada de `ork conhecimento <consulta> --json`. A descrição
50
+ das tools do OpenClaw e a skill do Hermes dizem a mesma regra: a lacuna tipada é lacuna, nunca resposta.
51
+ `conhecimento-hosts.test.ts` confere os nomes, o schema e a frase e, com o `ork` real, o mesmo JSON nas três
52
+ superfícies.
53
+
45
54
  Usabilidade HITL é prioridade máxima: recomendação, opções claras e canal disponível
46
55
  associado ao pedido. MCP local conserva elicitation; Telegram segue disponível
47
56
  quando configurado. Ingresso nativo Hermes/Discord e OpenClaw depende de callback
48
57
  autenticado e binding privado; terminal Hermes/ACP não está homologado.
58
+
59
+ ## Batida do host e canal (RM-063)
60
+
61
+ Os dois hosts de canal ganham a mesma segunda linha da fábrica: `bin/ork-vigia-batida.js` numa
62
+ automação de comando do OpenClaw e `bin/ork-vigia-batida.py` no cron do Hermes leem o
63
+ `ork doctor --json` a cada 30 min e avisam o dono quando a batida passou de 30 min, sem chamada de
64
+ modelo. `#OrkRetomar` e `#OrkFabrica` entram pelo mesmo ingresso assinado do pulse nos dois, e o
65
+ `ork onboarding` grava o `pulse-host.json` do host escolhido. `conducao-canal.test.mjs` e
66
+ `conducao_canal_test.py` provam os dois lados com `ork` e host SIMULADOS.
@@ -20,6 +20,7 @@
20
20
  "./skills/phases/goal-definition",
21
21
  "./skills/phases/master-metrics",
22
22
  "./skills/phases/plan-specification",
23
+ "./skills/phases/security-remediation",
23
24
  "./skills/phases/ship-release",
24
25
  "./skills/reviewers/code-reviewer",
25
26
  "./skills/reviewers/security-auditor",
@@ -72,11 +72,11 @@ descartável; o recibo traz o sha256 dos arquivos globais antes e depois. Modelo
72
72
  | `/ork` | Painel: doctor, board, escalonador, modos, fila de score |
73
73
 
74
74
  Mais seis subagentes (`ork-goal`, `ork-plan`, `ork-go`, `ork-check`, `ork-ship`, `ork-master`) para
75
- isolar o contexto de cada fase, e o guard `PreToolUse`.
75
+ isolar o contexto de cada fase, o guard `PreToolUse` e o hook `UserPromptSubmit` da resposta curta do dono.
76
76
 
77
77
  ## O guard PreToolUse
78
78
 
79
- Um hook, em `Bash`, chamando `hooks/ork-guard.js`. Ele bloqueia seis classes de comando:
79
+ Um hook, em `Bash`, chamando `hooks/ork-guard.js`. Ele bloqueia sete classes de comando:
80
80
 
81
81
  | Bloqueio | Por que |
82
82
  |---|---|
@@ -86,12 +86,44 @@ Um hook, em `Bash`, chamando `hooks/ork-guard.js`. Ele bloqueia seis classes de
86
86
  | `git push` | Push na mao nao e provado: a entrega passa por `ork ship` |
87
87
  | `git reset --hard`, `git clean -fd`, `git checkout -- .` | Descarte em massa sem rastro |
88
88
  | `rm -rf` com alvo amplo ou variavel | Apaga o que ninguem pediu |
89
+ | `ork noctum terminal` e o hook da resposta chamados pela ferramenta | A resposta do dono no terminal vem do hook da sessão dele; o agente que chama esse ingresso se passa pelo dono (RM-057) |
89
90
 
90
91
  **O guard nao tem regra de negocio.** Ele nao le ledger, nao sabe quem autorizou o que e nao
91
92
  conhece thread nenhuma: ele reconhece a forma do comando e manda o agente pelo caminho que o `ork`
92
93
  verifica. Comando que comeca com `ork` passa direto, porque quem prova o push e serializa o merge e
93
- o nucleo. E se o proprio guard quebrar, ele **libera**: um hook que derruba a sessao por bug proprio
94
- e pior que nenhum hook.
94
+ o nucleo; a exceção é o ingresso da resposta do dono (`ork noctum terminal`), barrado antes dessa
95
+ passagem. E se o proprio guard quebrar, ele **libera**: um hook que derruba a sessao por bug proprio
96
+ e pior que nenhum hook. A barreira do ingresso da resposta é lombada, não prova: quem roda como o
97
+ mesmo usuário do sistema a contorna, e o limite está dito abaixo.
98
+
99
+ ## A resposta curta do dono no terminal (RM-057)
100
+
101
+ **Desligada.** Desde o GO-FIX 2 da RM-057, o núcleo não grava nada pelo terminal. Numa sessão interativa do
102
+ Claude Code, quando o dono digita a resposta curta a uma pergunta que espera por ele (`sim`, `a` ou
103
+ `<código> a`), o hook `UserPromptSubmit` (`hooks/ork-resposta.js`) leva o evento ao núcleo pelo
104
+ `ork noctum terminal --hook-stdin`, e o núcleo só devolve a recusa `noctum.terminal.desligado`: com alguém
105
+ presente, o dono vê um aviso (`systemMessage`) para responder pelo Telegram, em reply à mensagem da
106
+ pergunta ou com o código e a letra, ou pela janela de confirmação do Claude Code (o diálogo nativo, um
107
+ clique). O prompt segue ao modelo, e nada é gravado nem encaminhado, nem a resposta a um gate. Conversa
108
+ comum nem chama o núcleo, e o prompt que a máquina escreveu (o campo `source` do evento diferente de
109
+ `user`) também não.
110
+
111
+ **Por que desligada:** o Claude Code instalado (2.1.306) ainda não manda o `source` do evento, e sem ele
112
+ nada do dono gravaria. E o agente da própria sessão do dono, pela ferramenta Bash, troca o shell pelo
113
+ núcleo com `exec`, tira a marca `AI_AGENT` e forja o evento com `source` igual a `user`: a cadeia de
114
+ processos e o guard são lombadas, não prova. Ligado, o ingresso não serviria ao dono e serviria a quem
115
+ forja o evento.
116
+
117
+ **O que falta para voltar**, numa fatia própria: o Claude Code mandar a origem humana do evento
118
+ (`source`); uma prova de que o evento veio do hook do harness, e não de um processo do mesmo usuário; e,
119
+ para a palavra solta, a pergunta mostrada exigida como a linha que o núcleo monta para ela, ou só o código
120
+ com a letra. O código do ingresso segue no núcleo atrás da chave `TERMINAL_LIGADO`, desligada; só os
121
+ testes a ligam, e o CLI e o hook nunca.
122
+
123
+ **Limite:** a fronteira é a conta do sistema. No diálogo nativo, qualquer cliente MCP do mesmo usuário que
124
+ declare o formulário passa, sem chave. Para separar o núcleo dos agentes, rode os agentes em outra conta
125
+ ou sandbox. O aviso só aparece depois de reinstalar o plugin (`ork adapter install claude-code`) e do
126
+ `ork` com o `noctum terminal`.
95
127
 
96
128
  ## Sensores de sessão
97
129
 
@@ -151,6 +183,164 @@ Sem `tool_use_id`, cada invocação do hook recebe uma identidade de ocorrência
151
183
  do transcript não identifica uma ocorrência; eventos de um novo episódio de permissão
152
184
  podem chegar sem alteração do arquivo. Replays com `tool_use_id` continuam idempotentes.
153
185
 
186
+ ## Mods nas sessões de fase (RM-059)
187
+
188
+ Mod é plugin de *function hooks* do Claude Code 2.1.287 ou mais novo. Cada mod do Orkastery mora
189
+ em `adapters/claude-code/mods/<mod>/`, com o próprio `.claude-plugin/plugin.json`, e declara o
190
+ papel em `orkastery-mod.json`:
191
+
192
+ ```json
193
+ {"formato":"ork.mod/v1","papeis":["fase"],"claudeCodeMinimo":"2.1.287"}
194
+ ```
195
+
196
+ O papel `dono` roda na sessão de quem conduz; o papel `fase`, nas sessões de fase que o `ork`
197
+ despacha. O `ork adapter install claude-code` copia os mods com o resto do adaptador e grava cada
198
+ arquivo deles no `INSTALADO.json`. No despacho `claude-bg`, cada mod de papel `fase` entra com o
199
+ próprio `--plugin-dir`, logo depois do plugin do Orkastery, quando:
200
+
201
+ - a pasta instalada do mod tem exatamente os arquivos do recibo, com os mesmos bytes e sem link;
202
+ os tipos que o próprio Claude Code escreve em `.claude-plugin/types/` (`*.d.ts` e
203
+ `tsconfig.json`) ficam fora da conta;
204
+ - o `claude --version` atende o `claudeCodeMinimo` do mod e o 2.1.287 da API de mods.
205
+
206
+ Mod que pede versão mais nova fica fora do comando, e o despacho segue: o núcleo não depende de
207
+ mod. Mod cuja dependência ficou de fora (pela versão, ou por ser só de papel `dono`) também fica.
208
+ Declaração inválida, manifesto fora do recibo ou arquivo a mais na pasta recusa o despacho com
209
+ `runtime.context.installation`, como um byte divergente. Arquivo de mod que saiu do catálogo sai da
210
+ cópia na reinstalação: o `ork adapter install claude-code` tira o que ele mesmo instalou e ninguém
211
+ editou. Arquivo editado ou acrescentado à mão fica, e a recusa diz o caminho para apagar. A dependência (`dependencies` do
212
+ `plugin.json` do mod) entra antes de quem depende; o resto segue o nome. Os mods que foram ficam no
213
+ comando gravado no evento `phase_dispatch` do ledger da thread.
214
+
215
+ O arquivo comum da raiz de `mods/`, como a lista de autoridade que a ponte lê em `../autoridade.json`
216
+ antes da própria pasta, segue a mesma regra quando há mod de fase no despacho: fora do recibo, link
217
+ ou arquivo especial recusam, e o que saiu do catálogo sai da cópia na reinstalação.
218
+
219
+ Para tirar um mod das sessões de fase, mude o papel no `orkastery-mod.json` do catálogo, ou tire o
220
+ mod, e rode `ork adapter install claude-code` de novo.
221
+
222
+ O mod de papel `dono` não vai ao despacho: ele roda na sessão de quem conduz. Num projeto com o
223
+ adaptador instalado, a cópia dele já está em `.claude/plugins/orkastery/mods/<mod>`, com cada
224
+ arquivo registrado no `INSTALADO.json` e os arquivos comuns da raiz de `mods/` ao lado. Nesse
225
+ carregamento ninguém confere os bytes: a conferência contra o recibo roda no despacho, para mod de
226
+ fase. Carregue-a na sessão com:
227
+
228
+ ```bash
229
+ claude --plugin-dir .claude/plugins/orkastery/mods/<mod>
230
+ ```
231
+
232
+ Sem o adaptador local, cada mod tem uma entrada no marketplace próprio do repositório
233
+ (`.claude-plugin/marketplace.json`, gerado por `node core/scripts/gerar-marketplaces.cjs`), que aponta
234
+ para uma cópia gerada em `marketplaces/claude-code/mods/<mod>/`. Instalado pelo marketplace, o plugin
235
+ é só a própria pasta, então o arquivo comum da raiz de `adapters/claude-code/mods/` (a lista de
236
+ autoridade da ponte, por exemplo) vai dentro de cada cópia. A instalação é no escopo do projeto:
237
+
238
+ ```bash
239
+ claude plugin marketplace add orkastery/orkastery
240
+ claude plugin install <mod>@orkastery --scope project
241
+ ```
242
+
243
+ Os dois marketplaces se chamam `orkastery`, e o local, registrado na instalação acima a partir de
244
+ `.claude/plugins/orkastery`, não lista os mods. Não troque um pelo outro num projeto que usa o
245
+ plugin do adaptador: remover um marketplace desinstala os plugins que vieram dele (medido no
246
+ Claude Code 2.1.296), e o plugin do marketplace do repositório não traz o guard `PreToolUse` nem o
247
+ MCP do adaptador.
248
+
249
+ ### Freio de Lote (`ork-freio`)
250
+
251
+ O primeiro mod de papel `fase`. Na sessão de fase, depois de cada lote de ferramentas, ele:
252
+
253
+ - acha os arquivos que o lote mexeu: os caminhos de `Edit`, `Write`, `MultiEdit` e `NotebookEdit` e a
254
+ diferença do `git status` entre um lote e outro, que pega também a edição feita por `Bash`;
255
+ - acha as claims da thread que citam esses arquivos, pelo `arquivo` ou pelo texto do comando, e avisa
256
+ quando o lote mexeu fora dos `touch_paths` do plano;
257
+ - pede ao núcleo, em segundo plano, a conferência dessas claims com
258
+ `ork claims conferir <thread> --claims ... --json`, no sandbox do verify, uma rodada por vez;
259
+ - devolve ao modelo, no lote seguinte do laço principal, o que quebrou: o id da claim, o comando e o
260
+ fim da saída. Lote sem claim afetada passa sem texto, e a linha de status mostra as claims em risco.
261
+ O lote de um subagente conta os arquivos tocados, mas não leva a entrega nem o aviso.
262
+
263
+ O Freio nunca roda o comando de uma claim, nunca grava estado de claim e nunca para o laço: quem
264
+ verifica de verdade continua sendo o `ork verify`. Ele lê o papel e a thread pelo `$.ork` da ponte, e
265
+ as claims e o plano pelas ferramentas de leitura `ork_claims_list` e `ork_artifact_read`, nunca do
266
+ disco em `.orkastery/`. Precisa de um `ork` com `ork claims conferir` no `PATH` da sessão; sem ele, ou
267
+ sem o sandbox do verify, avisa uma vez que a conferência está indisponível e segue. Teste que cria
268
+ processo pode reprovar no sandbox e passar no `ork verify`, e o aviso diz isso junto da falha. O
269
+ resultado chega no lote seguinte: se a sessão terminar antes dele, a última conferência fica sem
270
+ entrega. Falha de claim cujo arquivo foi tocado de novo durante a conferência não é entregue, porque
271
+ uma conferência nova já foi pedida. Um `Edit` que falhou também conta como toque e pode pedir uma
272
+ conferência a mais.
273
+
274
+ ### Portão de Tarefas (`ork-portao`)
275
+
276
+ O segundo mod de papel `fase`. Os portões do quadro agem só na sessão de fase cujo bloco atual tem o GO
277
+ (pelo slug do bloco no retrato do núcleo) e cuja thread tem plano com ao menos uma tarefa `T<n>` que
278
+ serve ao quadro: com `touch_paths` (caminhos entre crases, com barra, ponto ou curinga) e um verify com um
279
+ comando só entre crases, a regra do `ork claims conferir --tarefa`. Plano sem nenhuma tarefa assim não
280
+ ganha portão, para não travar o quadro do GO. Com o portão ligado:
281
+
282
+ - **criação:** `TaskCreated` recusa a tarefa cujo assunto não traz o id de uma tarefa do plano
283
+ (`T2.1 ...`), ou cuja tarefa do plano não serve ao quadro. A recusa volta ao modelo com o motivo e as
284
+ tarefas do plano que servem;
285
+ - **conclusão:** `TaskCompleted` da tarefa registrada na criação, ou da que cita no assunto uma tarefa do
286
+ plano que serve, pede ao núcleo `ork claims conferir <thread> --tarefa T2.1 --prazo 540 --json`, no
287
+ sandbox do verify, e só deixa a tarefa fechar com o item aprovado. Reprovação volta com o comando, o
288
+ código e o fim da saída; sem veredito, recusa tipada, outra condução na thread, conferência que não roda
289
+ ou falha do próprio Portão também bloqueiam, sempre com a saída: corrigir e concluir de novo, ou devolver
290
+ a tarefa para `pending` e seguir. A tarefa registrada continua conferida mesmo com o plano ilegível na
291
+ hora, porque o núcleo lê o plano por conta própria. Uma conferência por vez: a conclusão que chega no
292
+ meio de outra é recusada na hora. Da terceira reprovação igual em diante, o texto manda deixar a tarefa
293
+ aberta;
294
+ - **teammate ocioso:** com agent teams no piloto (abaixo), `TeammateIdle` entrega ao teammate a próxima
295
+ tarefa do plano que serve, não fechou nesta sessão e cuja região está livre: nenhum lease `path:` ativo,
296
+ de nenhuma thread, cruza os `touch_paths` dela e ela não cruza as tarefas dos outros teammates. Os leases
297
+ vêm do retrato de todas as threads pela consulta `maestro` da ponte
298
+ (`ork maestro --json --section leases --offset N`), seguindo o `nextOffset` das páginas que o teto de
299
+ bytes do retrato corta, até 10 páginas, porque o servidor MCP da sessão de fase só mostra os da própria
300
+ thread. O Portão não toma nem solta lease: o `ork_git_commit` toma o `path:` de cada arquivo na hora do
301
+ commit e recusa o commit com qualquer lease no caminho. Quem fica ocioso sem concluir devolve a tarefa,
302
+ que sai da distribuição automática desta sessão. Sem a lista de leases inteira (seção indisponível,
303
+ lacuna, retrato em conflito ou mais de 10 páginas), no teto de custo ou sem tarefa livre, o teammate
304
+ fica ocioso.
305
+
306
+ O Portão nunca roda o verify por conta própria: quem verifica de verdade continua sendo o `ork verify`.
307
+ Ele lê o papel pelo `$.ork.contexto` da ponte, o estado e o bloco pelo `$.ork.retrato`, os leases pela
308
+ consulta `maestro` da ponte e o plano pelo `ork_artifact_read`, nunca do disco em `.orkastery/`. Teste que
309
+ cria processo pode reprovar no sandbox e passar no `ork verify`, e o bloqueio diz isso.
310
+
311
+ Agent teams na sessão de fase só rodam no piloto, desligado por padrão. Quem conduz liga no manifesto da
312
+ raiz:
313
+
314
+ ```yaml
315
+ runtime:
316
+ agent_teams:
317
+ ligado: true
318
+ teammates: 2 # teto de teammates vivos, de 1 a 8
319
+ custo_usd: 10 # teto do custo da sessão, como o /cost soma, até 500
320
+ ```
321
+
322
+ Com a chave ligada, o GO no bloco da fase atual e o Portão entre os mods que vão à sessão, o despacho
323
+ `claude-bg` acrescenta ao `--settings` a variável `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS`, os dois tetos
324
+ (`ORK_AGENT_TEAMS_TEAMMATES` e `ORK_AGENT_TEAMS_CUSTO_USD`) e `teammateMode` `in-process`, porque a sessão
325
+ de fundo não tem `tmux`. Teto inválido vira aviso do manifesto e deixa desligado. Em toda sessão de fase,
326
+ com ou sem o portão do quadro, o Portão recusa o nascimento de teammate sem os tetos, no teto de teammates
327
+ vivos ou com o custo da sessão no teto, e no teto de custo não entrega tarefa nova.
328
+
329
+ Limites conhecidos:
330
+
331
+ - o quadro do Portão vale para a sessão: numa sessão de GO redespachada, tarefa fechada na anterior pode
332
+ ser entregue de novo ao teammate, que a encontra pronta no quadro e no git;
333
+ - o líder não recebe aviso quando um teammate devolve uma tarefa; ele a vê aberta no quadro;
334
+ - a conferência do Freio, em segundo plano, e a do Portão, na conclusão, podem rodar ao mesmo tempo na
335
+ mesma worktree; cada mod só serializa as próprias;
336
+ - os tetos dependem de o Portão carregar de verdade: o despacho decide pelo `--plugin-dir`, e se o mod não
337
+ registrar na sessão, agent teams fica ligado sem ninguém aplicando os tetos;
338
+ - se o turno for interrompido no meio da conferência, o Claude Code segue sem a resposta do gancho;
339
+ - nome de lease que o retrato redige (caminho absoluto ou texto com cara de segredo) chega irreconhecível e
340
+ não cruza nenhuma região;
341
+ - o comportamento desses eventos numa sessão `claude --bg` real com agent teams ainda não foi medido; os
342
+ testes do kit e do núcleo cobrem o mod e o despacho.
343
+
154
344
  ## A #TAG de conducao
155
345
 
156
346
  O comando `/goal` extrai o modo do proprio pedido, sem reimplementar nada:
@@ -174,7 +364,7 @@ tres e o `--dry-run` mostra o que ele vai fazer sobre cada um.
174
364
  (`core/`, `phases/`, `reviewers/`, ...) que este catalogo usa. Por isso `plugin.json` declara os
175
365
  caminhos um a um. O teste compara esses caminhos com o catálogo fonte e exige
176
366
  `onboarding`, acrescentada por I15. Neste catálogo, `claude plugin details orkastery`
177
- deve reportar 28 entradas: 20 skills e 8 comandos (a linha `Skills (28)`). O startup registra
367
+ deve reportar 29 entradas: 21 skills e 8 comandos (a linha `Skills (29)`). O startup registra
178
368
  separadamente skills e comandos. As provas anteriores, com 17 e 18 skills, são históricas.
179
369
  Confira também os seis agentes e seis eventos de hooks, sem erros de carregamento.
180
370
 
@@ -27,6 +27,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
27
27
 
28
28
  - O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
29
29
  - Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
30
+ - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
30
31
  - Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
31
32
  fica registrada no ledger.
32
33
  - Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
@@ -27,6 +27,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
27
27
 
28
28
  - O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
29
29
  - Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
30
+ - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
30
31
  - Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
31
32
  fica registrada no ledger.
32
33
  - Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
@@ -28,6 +28,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
28
28
 
29
29
  - O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
30
30
  - Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
31
+ - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
31
32
  - Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
32
33
  fica registrada no ledger.
33
34
  - Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
@@ -29,6 +29,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
29
29
 
30
30
  - O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
31
31
  - Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
32
+ - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
32
33
  - Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
33
34
  fica registrada no ledger.
34
35
  - Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
@@ -27,6 +27,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
27
27
 
28
28
  - O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
29
29
  - Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
30
+ - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
30
31
  - Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
31
32
  fica registrada no ledger.
32
33
  - Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
@@ -27,6 +27,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
27
27
 
28
28
  - O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
29
29
  - Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
30
+ - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
30
31
  - Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
31
32
  fica registrada no ledger.
32
33
  - Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
@@ -17,6 +17,7 @@
17
17
  "Notification": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }],
18
18
  "Stop": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }],
19
19
  "SubagentStop": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }],
20
- "PostToolUse": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }]
20
+ "PostToolUse": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }],
21
+ "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-resposta.js\"", "timeout": 10 }] }]
21
22
  }
22
23
  }
@@ -62,11 +62,25 @@ const BLOQUEIOS = [
62
62
  },
63
63
  ];
64
64
 
65
+ /**
66
+ * RM-057 (resposta curta, D11 da ork-rm057respost): a resposta do dono no terminal vem do hook `UserPromptSubmit` da
67
+ * sessao dele. Um agente que chama esse ingresso pela ferramenta se passa pelo dono, e por isso esta regra roda ANTES da
68
+ * passagem livre do `ork`. E lombada, nao prova: quem roda como o mesmo usuario contorna (o limite dito na RM-058), ate
69
+ * com o subcomando entre aspas. Desde o GO-FIX 2 (D22) o ingresso do terminal esta desligado e nao grava nada.
70
+ */
71
+ const RESPOSTA_DO_DONO = {
72
+ nome: 'resposta-do-dono-por-ferramenta',
73
+ regex: /\bnoctum\s+terminal\b|ork-resposta\.js/,
74
+ motivo: 'a resposta do dono no terminal vem do hook UserPromptSubmit da sessao dele; o agente que chama esse ingresso se passa pelo dono',
75
+ caminho: 'mostre a pergunta ao dono e espere a resposta dele no Telegram ou pela janela de confirmacao do host; nunca responda por ele',
76
+ };
77
+
65
78
  function decidir(entrada) {
66
79
  const nome = entrada && entrada.tool_name;
67
80
  if (nome !== 'Bash') return null;
68
81
  const comando = String((entrada.tool_input && entrada.tool_input.command) || '');
69
82
  if (comando.trim() === '') return null;
83
+ if (RESPOSTA_DO_DONO.regex.test(comando)) return RESPOSTA_DO_DONO;
70
84
  // Comando do proprio `ork` passa: quem verifica o push provado e o merge serializado e ele.
71
85
  if (/^\s*(?:[A-Za-z0-9_]+=\S*\s+)*(?:\S*\/)?ork\s/.test(comando)) return null;
72
86
  for (const b of BLOQUEIOS) {
@@ -127,4 +141,4 @@ process.stdin.on('end', () => {
127
141
  process.exitCode = codigo;
128
142
  });
129
143
 
130
- module.exports = { BLOQUEIOS, decidir };
144
+ module.exports = { BLOQUEIOS, RESPOSTA_DO_DONO, decidir };
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * Hook `UserPromptSubmit` do adaptador Claude Code: a resposta curta do dono no terminal (RM-057, ork-rm057respost).
5
+ *
6
+ * GO-FIX 2 (D22): o ingresso do terminal esta DESLIGADO no nucleo. Quando o dono digita a resposta curta a uma pergunta
7
+ * que espera por ele, o nucleo nao grava nada e devolve so a recusa `noctum.terminal.desligado`, que este hook mostra ao
8
+ * dono (`systemMessage`): responda pelo Telegram (em reply a mensagem da pergunta, ou com o codigo) ou pela janela de
9
+ * confirmacao do Claude Code (o dialogo nativo). O transporte abaixo continua o mesmo, para quando uma fatia propria
10
+ * religar o ingresso.
11
+ *
12
+ * O dono aprova onde estiver. Numa sessao interativa, ele responde a pergunta do arco #Noctum com "sim", "a" ou
13
+ * "<codigo> a"; este hook leva o evento ao nucleo (`ork noctum terminal --hook-stdin`) e transporta a decisao dele:
14
+ *
15
+ * - gravada (ou sem efeito, detalhe, ou a pergunta de volta): a frase do nucleo substitui o prompt (`decision: block`),
16
+ * e o "sim" nao chega ao modelo;
17
+ * - resposta a um gate: o contexto vai ao modelo (`additionalContext`), para o condutor abrir o dialogo nativo;
18
+ * - recusa pela origem com alguem presente: um aviso ao dono (`systemMessage`), e o prompt segue ao modelo;
19
+ * - o resto: nada, e o prompt segue como sempre.
20
+ *
21
+ * Ele NAO tem regra de negocio: nao le ledger, nao conhece pergunta e nao prova nada; quem confere a origem da sessao e o
22
+ * nucleo. So texto curto de uma linha chama o nucleo. Erro do hook ou do nucleo nunca bloqueia nem quebra a sessao.
23
+ *
24
+ * GO-FIX 1 (achado 1): o prompt que a maquina injeta na sessao do dono (a tarefa agendada, a volta do /loop, a mensagem
25
+ * de canal ou de outra sessao, o SDK) nunca chega ao nucleo: o evento diz quem o escreveu (`source`), e so `user`, o
26
+ * compositor interativo, passa. Sem o campo (versao do Claude Code que ainda nao o manda), o nucleo recebe o evento,
27
+ * recusa e diz ao dono por que; ele tambem exige `user`, para quem chamar o nucleo sem este hook.
28
+ */
29
+ const fs = require('node:fs');
30
+ const path = require('node:path');
31
+ const { spawnSync } = require('node:child_process');
32
+
33
+ /**
34
+ * A forma da resposta curta, larga o bastante para o nucleo decidir e estreita o bastante para conversa comum nem chamar o
35
+ * nucleo: o codigo com a resposta ("NX4K a"), o numero com a letra ("1a") ou uma palavra solta de ate duas palavras e 20
36
+ * caracteres ("sim", "pode seguir"). Tudo numa linha so, ate 64 caracteres.
37
+ */
38
+ const TETO_DO_PROMPT = 64;
39
+ const CODIGO_E_RESPOSTA = /^[A-HJKMNP-TV-Z](?=[2-9A-HJKMNP-TV-Z]{0,2}[2-9])[2-9A-HJKMNP-TV-Z]{3}\s+\S/i;
40
+ const NUMERO_E_LETRA = /^[0-9]{1,2}\s*[a-e][.!]?$/i;
41
+ const PALAVRA_SOLTA = /^\S+(?:\s\S+)?$/;
42
+ const TETO_DA_ENTRADA = 1024 * 1024;
43
+
44
+ function pareceRespostaCurta(t) {
45
+ if (!t || t.length > TETO_DO_PROMPT || /[\r\n]/.test(t)) return false;
46
+ return CODIGO_E_RESPOSTA.test(t) || NUMERO_E_LETRA.test(t) || (t.length <= 20 && PALAVRA_SOLTA.test(t));
47
+ }
48
+
49
+ function lerEntrada() {
50
+ const buffer = Buffer.alloc(TETO_DA_ENTRADA + 1);
51
+ let bytes = 0;
52
+ while (bytes <= TETO_DA_ENTRADA) {
53
+ const n = fs.readSync(0, buffer, bytes, buffer.length - bytes, null);
54
+ if (!n) break;
55
+ bytes += n;
56
+ }
57
+ if (bytes > TETO_DA_ENTRADA) return null;
58
+ return JSON.parse(buffer.subarray(0, bytes).toString('utf8'));
59
+ }
60
+
61
+ /** O texto que o nucleo montou, com teto: o hook transporta, nunca reescreve. */
62
+ const texto = (v, teto) => (typeof v === 'string' && v.trim() ? v.slice(0, teto) : '');
63
+
64
+ function executar() {
65
+ const h = lerEntrada();
66
+ if (!h || h.hook_event_name !== 'UserPromptSubmit' || typeof h.prompt !== 'string' ||
67
+ typeof h.cwd !== 'string' || !path.isAbsolute(h.cwd)) return;
68
+ // O prompt que a maquina escreveu nao e do dono: nao chega ao nucleo, e segue ao modelo como sempre.
69
+ if (h.source !== undefined && h.source !== 'user') return;
70
+ if (!pareceRespostaCurta(h.prompt.trim())) return;
71
+ const r = spawnSync(process.env.ORK_SENSOR_CLI || 'ork', ['noctum', 'terminal', '--hook-stdin'], {
72
+ cwd: h.cwd, input: JSON.stringify(h), encoding: 'utf8', timeout: 8000, maxBuffer: 256 * 1024, windowsHide: true,
73
+ });
74
+ if (r.status !== 0 || typeof r.stdout !== 'string' || !r.stdout.trim()) return;
75
+ let d;
76
+ try { d = JSON.parse(r.stdout); } catch { return; }
77
+ if (!d || d.contrato !== 'ork.noctum-terminal/v1') return;
78
+ let saida = null;
79
+ if (['registrada', 'sem-efeito', 'detalhe', 'pergunta'].includes(d.acao) && texto(d.mensagem, 8000)) {
80
+ saida = { decision: 'block', reason: texto(d.mensagem, 8000) };
81
+ } else if (d.acao === 'encaminhar' && texto(d.contexto, 2000)) {
82
+ saida = { hookSpecificOutput: { hookEventName: 'UserPromptSubmit', additionalContext: texto(d.contexto, 2000) } };
83
+ } else if (d.acao === 'recusada' && d.presenca === true && texto(d.mensagem, 2000)) {
84
+ saida = { systemMessage: texto(d.mensagem, 2000) };
85
+ }
86
+ if (saida) process.stdout.write(JSON.stringify(saida) + '\n');
87
+ }
88
+
89
+ try { executar(); }
90
+ catch { process.stderr.write('ork resposta: entrada invalida ou nucleo indisponivel; o prompt segue sem mudanca.\n'); }
91
+ process.exitCode = 0;
@@ -5,6 +5,7 @@ const fs = require('node:fs');
5
5
  const path = require('node:path');
6
6
  const { spawnSync } = require('node:child_process');
7
7
  const { createHash, randomUUID } = require('node:crypto');
8
+ const { accountFailure } = require('./quota-signal');
8
9
 
9
10
  function executar() {
10
11
  const limite = 1024 * 1024;
@@ -25,6 +26,15 @@ function executar() {
25
26
  if (!tipo) return;
26
27
  const payload = { observedAt: new Date().toISOString() };
27
28
  if (h.hook_event_name === 'Notification') payload.notificationType = h.notification_type;
29
+ // RM-037 (CHECK 3 da ork-rm037defeit2): o Stop conta o trabalho que ainda vai acordar a sessão. Com despertar agendado
30
+ // (CronCreate, ScheduleWakeup, /loop) ou tarefa MCP, o Claude Code mostra a sessão `idle`; só a entrada do Stop separa
31
+ // a sessão encerrada da que vai voltar a escrever. Runtime sem os campos não manda nada, e o ork não supõe zero.
32
+ if (h.hook_event_name === 'Stop') {
33
+ if (Array.isArray(h.background_tasks)) payload.backgroundTasks = h.background_tasks.length;
34
+ if (Array.isArray(h.session_crons)) payload.sessionCrons = h.session_crons.length;
35
+ }
36
+ const falhaDaConta = accountFailure(h);
37
+ if (falhaDaConta && (tipo === 'notification' || tipo === 'stop')) payload.accountFailure = falhaDaConta;
28
38
  // tool_use_id identifica replay da mesma ferramenta. Sem id do protocolo,
29
39
  // cada invocação é uma ocorrência; stat do transcript não identifica eventos.
30
40
  payload.eventId = typeof h.tool_use_id === 'string'
@@ -47,11 +57,17 @@ function executar() {
47
57
  }
48
58
  }
49
59
  }
50
- const r = spawnSync(process.env.ORK_SENSOR_CLI || 'ork',
60
+ const enviar = (p) => spawnSync(process.env.ORK_SENSOR_CLI || 'ork',
51
61
  ['sessions', 'event', '--tipo', tipo, '--sessao', h.session_id], {
52
- cwd: h.cwd, input: JSON.stringify(payload), encoding: 'utf8', timeout: 3000,
62
+ cwd: h.cwd, input: JSON.stringify(p), encoding: 'utf8', timeout: 3000,
53
63
  maxBuffer: 32768, windowsHide: true,
54
64
  });
65
+ let r = enviar(payload);
66
+ // O `ork` de antes das contagens recusa o campo novo antes de gravar qualquer coisa: o Stop vai de novo sem elas, como ia.
67
+ if (r.status === 1 && /^evento recusado: campo de payload inválido: (?:backgroundTasks|sessionCrons)$/m.test(r.stderr || '')) {
68
+ const { backgroundTasks: _tarefas, sessionCrons: _despertares, ...semContagens } = payload;
69
+ r = enviar(semContagens);
70
+ }
55
71
  if (r.status !== 0) {
56
72
  // Recusa conhecida não identifica o papel da sessão nem comprova ingestão.
57
73
  const semVinculo = r.status === 1 && !r.error && !r.stdout?.trim() &&
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * RM-064 T1: reconhece apenas o fato de a conta ter esgotado. O chamador persiste
5
+ * o código devolvido, nunca os textos que serviram de entrada.
6
+ */
7
+ function accountFailure(h) {
8
+ const partes = [h?.message, h?.reason, h?.stop_reason, h?.error?.message, h?.error?.code]
9
+ .filter((v) => typeof v === 'string').join('\n');
10
+ return /(?:you(?:'|’)ve hit your (?:weekly|session|individual spend|usage) limit|seu limite de uso foi atingido|usage_limit_(?:exceeded|reached)|insufficient_quota|out of credits|spend (?:cap|limit))/i.test(partes)
11
+ ? 'runtime.quota-exhausted' : null;
12
+ }
13
+
14
+ module.exports = { accountFailure };
@@ -0,0 +1,56 @@
1
+ {
2
+ "formato": "ork.mods-autoridade/v1",
3
+ "regra": "Nenhum mod aprova gate, permissão, nota do MASTER, push ou tag pelo dono, nem fala como o dono (D5 do plano dos mods, com o nome que o dono deu a ela). A decisão autônoma registrada pelo núcleo não entra nesta lista: está em permitidos.",
4
+ "leitores": [
5
+ "core/scripts/checar-mods.cjs",
6
+ "adapters/claude-code/mods/ork-ponte/hooks/register.ts"
7
+ ],
8
+ "ganchosProibidos": [
9
+ { "id": "elicitation", "evento": "classic.Elicitation", "porque": "responderia o diálogo nativo do MCP no lugar do dono" },
10
+ { "id": "elicitation-result", "evento": "classic.ElicitationResult", "porque": "trocaria a resposta que o dono deu no diálogo nativo" },
11
+ { "id": "permission-request", "evento": "classic.PermissionRequest", "porque": "aprovaria permissão pelo dono" },
12
+ { "id": "ask-user-question", "evento": "ui.render", "componente": "AskUserQuestion", "porque": "redesenharia a pergunta feita ao dono" }
13
+ ],
14
+ "decisoesProibidas": [
15
+ { "id": "tool-check-allow", "evento": "tool.check", "decisao": "allow", "porque": "aprovaria uma chamada de ferramenta pelo dono" }
16
+ ],
17
+ "chamadasProibidas": [
18
+ { "id": "prompt-submit", "chamada": "prompt.submit", "porque": "manda texto como se fosse o dono" },
19
+ { "id": "session-append-usuario", "chamada": "session.append", "tipo": "user", "porque": "grava linha de usuário que o modelo lê como palavra do dono" }
20
+ ],
21
+ "argvProibido": [
22
+ { "id": "gate-answer", "sequencia": ["gate", "answer"], "porque": "responde gate pelo dono" },
23
+ { "id": "sessions-answer", "sequencia": ["sessions", "answer"], "porque": "entrega resposta a uma sessão como se fosse do dono" },
24
+ { "id": "pulse-responder", "sequencia": ["pulse", "responder"], "porque": "responde o resumo pelo dono" },
25
+ { "id": "master-nota", "sequencia": ["master"], "opcao": "--score", "porque": "dá ou propõe a nota do MASTER" },
26
+ { "id": "master-batch", "sequencia": ["master", "batch"], "porque": "aceita MASTER em lote pelo dono" },
27
+ { "id": "master-digest-responder", "sequencia": ["master", "digest", "responder"], "porque": "responde o digest pelo dono" },
28
+ { "id": "retry-run-por", "sequencia": ["retry", "run"], "opcao": "--por", "porque": "autoriza o retry quando o modo pausa" },
29
+ { "id": "ship-autorizar-push", "sequencia": ["ship"], "opcao": "--autorizar-push", "porque": "autoriza push pelo dono" },
30
+ { "id": "git-push", "programa": "git", "subcomando": "push", "porque": "publica sem a prova do núcleo" },
31
+ { "id": "git-tag", "programa": "git", "subcomando": "tag", "porque": "tag é ato do dono; listar tags sai por outro comando de leitura" },
32
+ { "id": "gh", "programa": "gh", "porque": "PR, merge e release ficam com o núcleo e o dono" }
33
+ ],
34
+ "ambienteProibido": [
35
+ { "id": "hitl-env", "prefixo": "ORK_HITL_", "porque": "credenciais e verificadores do ingresso humano" }
36
+ ],
37
+ "caminhosProibidos": [
38
+ { "id": "hermes-env", "trecho": ".hermes/.env", "porque": "segredos do canal do dono" }
39
+ ],
40
+ "reservadosAPonte": [
41
+ { "id": "processos", "evento": "process.*", "porque": "a guarda da ponte vigia os processos" },
42
+ { "id": "ambiente", "evento": "env.*", "porque": "a guarda vigia o ambiente, e o papel da sessão sai dele" },
43
+ { "id": "arquivos", "evento": "fs.*", "porque": "a guarda vigia leituras, e a lista de autoridade sai do disco" },
44
+ { "id": "mcp", "evento": "mcp.*", "porque": "o retrato do núcleo sai do MCP" },
45
+ { "id": "store", "evento": "store.*", "porque": "o registro do que foi mostrado ao dono fica no store da ponte" },
46
+ { "id": "estado", "evento": "state.*", "porque": "a faixa, os caminhos vigiados e o cache ficam no estado da ponte" },
47
+ { "id": "ferramentas", "evento": "tool.list", "porque": "o papel dono sai da lista de ferramentas" },
48
+ { "id": "raiz", "evento": "session.root", "porque": "o papel e a raiz do estado saem da raiz da sessão" },
49
+ { "id": "registro", "evento": "plugin.register", "porque": "só a ponte confere os mods que carregam" },
50
+ { "id": "prompt", "evento": "prompt.submit", "porque": "só a ponte decide sobre texto enviado por mod" },
51
+ { "id": "transcript", "evento": "session.append", "porque": "só a ponte decide sobre linha anexada por mod" }
52
+ ],
53
+ "permitidos": [
54
+ { "id": "decisao-autonoma", "sequencia": ["decisao", "registrar"], "porque": "decisão autônoma registrada pelo núcleo, com critério e evidência, que vai ao dono no lote seguinte com o custo de reverter (M4)" }
55
+ ]
56
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "ork-clima",
3
+ "version": "0.1.0",
4
+ "description": "Clima de Cota do Orkastery no Claude Code: prevê quando a cota da conta acaba no ritmo atual, avisa na faixa antes de a fase morrer no meio e diz qual retomada não cabe. Só lê e avisa.",
5
+ "author": {
6
+ "name": "Orkastery contributors",
7
+ "url": "https://github.com/orkastery"
8
+ },
9
+ "homepage": "https://orkastery.com/",
10
+ "repository": "https://github.com/orkastery/orkastery",
11
+ "license": "MIT",
12
+ "types": "./types/index.d.ts",
13
+ "dependencies": ["ork-ponte"]
14
+ }