@orkastery/cli 0.2.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +86 -65
  3. package/adapters/README.md +30 -15
  4. package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
  5. package/adapters/claude-code/README.md +110 -8
  6. package/adapters/claude-code/commands/check.md +4 -3
  7. package/adapters/claude-code/commands/goal.md +3 -2
  8. package/adapters/claude-code/commands/master.md +3 -2
  9. package/adapters/claude-code/commands/onboarding.md +21 -0
  10. package/adapters/claude-code/commands/ork.md +99 -27
  11. package/adapters/claude-code/hooks/hooks.json +6 -1
  12. package/adapters/claude-code/hooks/ork-guard.js +1 -1
  13. package/adapters/claude-code/hooks/ork-sensor.js +66 -0
  14. package/adapters/codex/skills/ork/SKILL.md +57 -0
  15. package/adapters/hermes/README.md +161 -0
  16. package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
  17. package/adapters/hermes/bin/ork-brain.sh +4 -0
  18. package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
  19. package/adapters/hermes/bin/ork-maestro.sh +6 -0
  20. package/adapters/hermes/bin/ork-master-enviar.py +84 -0
  21. package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
  22. package/adapters/hermes/hermes.plugin.json +24 -4
  23. package/adapters/hermes/hitl-ingress/__init__.py +356 -0
  24. package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
  25. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
  26. package/adapters/openclaw/README.md +136 -27
  27. package/adapters/openclaw/bin/ork-brain.sh +4 -0
  28. package/adapters/openclaw/construir.sh +19 -0
  29. package/adapters/openclaw/dist/hitl-ingress.js +199 -0
  30. package/adapters/openclaw/dist/index.js +437 -0
  31. package/adapters/openclaw/openclaw.plugin.json +39 -134
  32. package/adapters/openclaw/package.json +26 -0
  33. package/adapters/openclaw/src/hitl-ingress.ts +180 -0
  34. package/adapters/openclaw/src/index.ts +460 -0
  35. package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
  36. package/adapters/openclaw/tsconfig.json +15 -0
  37. package/assets/docs/markdownlint-cli2.jsonc +22 -0
  38. package/assets/docs/padroes/documentacao-de-produto.md +133 -0
  39. package/assets/docs/padroes/roadmap-de-produto.md +98 -0
  40. package/assets/docs/produto/README.md +14 -0
  41. package/assets/docs/produto/_modelo-feature.md +59 -0
  42. package/assets/docs/roadmap/README.md +14 -0
  43. package/assets/docs/roadmap/_modelo-item.md +73 -0
  44. package/assets/orkmind-native-schema.json +32 -0
  45. package/assets/orkmind_bridge.py +357 -0
  46. package/assets/orkmind_fixture.py +67 -0
  47. package/assets/orkmind_prospective.py +138 -0
  48. package/assets/reference-tariffs-i07.json +23 -0
  49. package/dist/adapters/claude-bg.js +488 -39
  50. package/dist/adapters/codex-controller-sensor.js +449 -0
  51. package/dist/adapters/codex-controller-worker.js +361 -0
  52. package/dist/adapters/codex-controller.js +252 -0
  53. package/dist/adapters/codex-events.js +205 -0
  54. package/dist/adapters/codex-question.js +26 -0
  55. package/dist/adapters/codex-runner.js +133 -0
  56. package/dist/adapters/codex.js +394 -0
  57. package/dist/agents-md.js +84 -0
  58. package/dist/auditoria.js +12 -9
  59. package/dist/auditrun.js +5 -4
  60. package/dist/board.js +174 -23
  61. package/dist/branch-de-estado.js +136 -0
  62. package/dist/canarios-hitl.js +177 -0
  63. package/dist/canarios-i43.js +543 -0
  64. package/dist/canarios-pulse.js +147 -0
  65. package/dist/canarios-sensores.js +129 -0
  66. package/dist/canarios.js +111 -2
  67. package/dist/catalogo.js +9 -0
  68. package/dist/ci.js +223 -0
  69. package/dist/ciclos.js +2 -1
  70. package/dist/claim-lint.js +64 -0
  71. package/dist/claims.js +60 -0
  72. package/dist/company-brain-capture.js +195 -0
  73. package/dist/company-brain-cli.js +123 -0
  74. package/dist/company-brain-client.js +61 -0
  75. package/dist/company-brain-contract.js +166 -0
  76. package/dist/company-brain-journal.js +192 -0
  77. package/dist/company-brain-mcp.js +33 -0
  78. package/dist/company-brain-migration.js +60 -0
  79. package/dist/company-brain-source.js +177 -0
  80. package/dist/company-brain-worker.js +18 -0
  81. package/dist/conducao-texto.js +61 -0
  82. package/dist/conducao.js +876 -0
  83. package/dist/contrato-publico.js +39 -0
  84. package/dist/creation-operation-store.js +251 -0
  85. package/dist/creation-operation.js +148 -0
  86. package/dist/decisao-autonoma.js +183 -0
  87. package/dist/delegation.js +79 -0
  88. package/dist/demo.js +120 -0
  89. package/dist/docs.js +828 -0
  90. package/dist/doctor.js +184 -25
  91. package/dist/entrega-pr.js +117 -0
  92. package/dist/escopo-escrita.js +71 -0
  93. package/dist/estado-thread.js +222 -0
  94. package/dist/evalrunner.js +12 -0
  95. package/dist/fabrica-estado.js +329 -0
  96. package/dist/fabrica-publicar.js +76 -0
  97. package/dist/fix.js +22 -1
  98. package/dist/gates.js +59 -11
  99. package/dist/handoff.js +39 -23
  100. package/dist/hitl-canais.js +333 -0
  101. package/dist/hitl-classificacao.js +131 -0
  102. package/dist/hitl-contract.js +465 -0
  103. package/dist/hitl-estado.js +136 -0
  104. package/dist/hitl-gates.js +554 -0
  105. package/dist/hitl-ingress-receipt.js +382 -0
  106. package/dist/hitl-local-atestado.js +57 -0
  107. package/dist/hitl-local-receipt.js +328 -0
  108. package/dist/hitl-local.js +143 -0
  109. package/dist/hitl-lock.js +139 -0
  110. package/dist/hitl-lote.js +223 -0
  111. package/dist/hitl-native-offer.js +97 -0
  112. package/dist/hitl-native.js +65 -0
  113. package/dist/hitl-presentation.js +209 -0
  114. package/dist/hitl-public-receipt.js +176 -0
  115. package/dist/hitl-resumo.js +209 -0
  116. package/dist/hitl-sessions.js +475 -0
  117. package/dist/hitl.js +711 -0
  118. package/dist/horario.js +269 -0
  119. package/dist/hosts.js +198 -22
  120. package/dist/index.js +1741 -94
  121. package/dist/indice.js +99 -0
  122. package/dist/init.js +28 -3
  123. package/dist/integracoes-locais.js +17 -0
  124. package/dist/leases.js +65 -21
  125. package/dist/ledger-stats.js +272 -0
  126. package/dist/ledger.js +109 -2
  127. package/dist/licoes.js +221 -0
  128. package/dist/liveness.js +218 -0
  129. package/dist/maestro-actions.js +51 -0
  130. package/dist/maestro-authority.js +152 -0
  131. package/dist/maestro-cli.js +97 -0
  132. package/dist/maestro-contract.js +55 -0
  133. package/dist/maestro-discovery.js +132 -0
  134. package/dist/maestro-runtime.js +268 -0
  135. package/dist/maestro-snapshot.js +86 -0
  136. package/dist/maestro-sources.js +224 -0
  137. package/dist/manifest.js +165 -6
  138. package/dist/maquina.js +102 -0
  139. package/dist/master-audit.js +101 -0
  140. package/dist/master-batch.js +43 -0
  141. package/dist/master-digest.js +149 -0
  142. package/dist/master-migracao.js +155 -0
  143. package/dist/master.js +361 -77
  144. package/dist/mcp-artifacts.js +234 -0
  145. package/dist/mcp-git.js +433 -0
  146. package/dist/mcp-install.js +310 -0
  147. package/dist/mcp-maestro.js +25 -0
  148. package/dist/mcp-server.js +469 -0
  149. package/dist/mcp-ship.js +436 -0
  150. package/dist/mcp-verify.js +173 -0
  151. package/dist/memoria-humana.js +207 -0
  152. package/dist/memoria.js +314 -78
  153. package/dist/memory-migration.js +279 -0
  154. package/dist/memory-prospective.js +148 -0
  155. package/dist/modos-migracao.js +191 -0
  156. package/dist/modos.js +151 -15
  157. package/dist/monitor-lock.js +110 -0
  158. package/dist/objective.js +449 -0
  159. package/dist/ocupacao.js +267 -0
  160. package/dist/onboarding.js +303 -0
  161. package/dist/orkmind.js +389 -90
  162. package/dist/orquestracao.js +96 -69
  163. package/dist/phase.js +612 -151
  164. package/dist/playbook-capabilities.js +150 -0
  165. package/dist/playbook-contracts.js +188 -0
  166. package/dist/policies.js +72 -0
  167. package/dist/portfolio-context.js +61 -0
  168. package/dist/portfolio.js +180 -0
  169. package/dist/preflight.js +207 -0
  170. package/dist/process-audit.js +112 -0
  171. package/dist/project-state.js +93 -0
  172. package/dist/prompts.js +25 -5
  173. package/dist/prova-minima.js +112 -0
  174. package/dist/pulse-cadencia.js +163 -0
  175. package/dist/pulse-consentimento.js +260 -0
  176. package/dist/pulse-delivery.js +323 -0
  177. package/dist/pulse-resposta.js +542 -0
  178. package/dist/pulse.js +262 -0
  179. package/dist/ratelimit.js +35 -2
  180. package/dist/recall.js +80 -3
  181. package/dist/redacao-saida.js +45 -0
  182. package/dist/redacao-url.js +66 -0
  183. package/dist/retry.js +640 -118
  184. package/dist/roadmap-reservas.js +243 -0
  185. package/dist/runtime-ambiente.js +38 -0
  186. package/dist/runtime-context.js +215 -0
  187. package/dist/runtime-profiles.js +869 -0
  188. package/dist/runtimes.js +103 -0
  189. package/dist/sandbox.js +9 -0
  190. package/dist/session-events.js +203 -0
  191. package/dist/session-watcher-claude.js +637 -0
  192. package/dist/session-watcher.js +700 -0
  193. package/dist/sessoes-adopt.js +154 -0
  194. package/dist/sessoes-inventario.js +159 -0
  195. package/dist/sessoes.js +16 -35
  196. package/dist/setup.js +691 -0
  197. package/dist/ship.js +168 -19
  198. package/dist/slug.js +1 -1
  199. package/dist/thread-close.js +115 -0
  200. package/dist/thread.js +142 -28
  201. package/dist/tokens.js +1 -1
  202. package/dist/util.js +4 -2
  203. package/dist/verify-sandbox.js +265 -0
  204. package/dist/verify.js +270 -25
  205. package/dist/versao.js +60 -0
  206. package/dist/worktree.js +31 -2
  207. package/dist/write-activation.js +291 -0
  208. package/dist/yaml.js +5 -1
  209. package/eval/casos/master-metrics.json +1 -1
  210. package/eval/casos/onboarding.json +102 -0
  211. package/eval/casos/orkastery-bootstrap.json +37 -3
  212. package/eval/casos/scope-check-capability-map.json +45 -7
  213. package/eval/casos/ship-release.json +3 -3
  214. package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
  215. package/eval/fixtures/b2-master-log/caso.json +1 -1
  216. package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
  217. package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
  218. package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
  219. package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
  220. package/eval/fixtures/fx-codex-dry/caso.json +18 -0
  221. package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
  222. package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
  223. package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
  224. package/eval/fixtures/fx-happy/caso.json +6 -4
  225. package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
  226. package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
  227. package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
  228. package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
  229. package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
  230. package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
  231. package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
  232. package/eval/fixtures/fx-omnicanal/caso.json +17 -0
  233. package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
  234. package/monitor/company-brain.cjs +17 -0
  235. package/monitor/pulse-scope.cjs +45 -0
  236. package/monitor/pulse.cron +18 -0
  237. package/monitor/varredura-pulse.sh +27 -0
  238. package/package.json +28 -7
  239. package/references/definition-of-done.md +2 -2
  240. package/schemas/claims.schema.json +25 -0
  241. package/schemas/company-brain.schema.json +1158 -0
  242. package/schemas/creation-operation.schema.json +365 -0
  243. package/schemas/maestro-snapshot.schema.json +2716 -0
  244. package/skills/README.md +3 -3
  245. package/skills/core/onboarding/SKILL.md +50 -0
  246. package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
  247. package/skills/core/thread-state/SKILL.md +3 -1
  248. package/skills/governance/decision-triage/SKILL.md +4 -4
  249. package/skills/governance/narrative-guardian/SKILL.md +1 -1
  250. package/skills/governance/roadmap-keeper/SKILL.md +1 -1
  251. package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
  252. package/skills/observability/thread-tracing/SKILL.md +1 -1
  253. package/skills/phases/check-quality/SKILL.md +2 -2
  254. package/skills/phases/goal-definition/SKILL.md +1 -1
  255. package/skills/phases/master-metrics/SKILL.md +9 -7
  256. package/skills/phases/plan-specification/SKILL.md +1 -1
  257. package/skills/phases/ship-release/SKILL.md +1 -1
@@ -1,7 +1,10 @@
1
1
  {
2
- "descricao": "Fixture minima do bloco B0: pedido do builder com #TAG produz slug de 3 partes, blocos do modo e numero de pausas humanas.",
2
+ "descricao": "Fixture minima do bloco B0: pedido do builder com #TAG de modo VIVO produz slug de 3 partes, blocos do modo e numero de pausas humanas. I-43 tirou daqui os casos de #Look e #Ork: eles pararam de ser escritos, e a recusa deles e provada por fx-modo-aposentado-escritor.",
3
3
  "manifesto": {
4
- "project": { "name": "orkastery", "abbrev": "ork" }
4
+ "project": {
5
+ "name": "orkastery",
6
+ "abbrev": "ork"
7
+ }
5
8
  },
6
9
  "casos": [
7
10
  {
@@ -9,31 +12,21 @@
9
12
  "nome": "core b0",
10
13
  "modoEsperado": "auto",
11
14
  "slugEsperado": "ork-coreb0-full",
12
- "blocosEsperados": ["GOAL-PLAN-GO-CHECK-SHIP-MASTER"],
15
+ "blocosEsperados": [
16
+ "GOAL-PLAN-GO-CHECK-SHIP-MASTER"
17
+ ],
13
18
  "pausasEsperadas": 0
14
19
  },
15
- {
16
- "pedido": "Refatorar o checkout do carrinho #Ork",
17
- "nome": "checkout",
18
- "modoEsperado": "ork",
19
- "slugEsperado": "ork-checkout-f12",
20
- "blocosEsperados": ["GOAL-PLAN", "GO", "CHECK", "SHIP", "MASTER"],
21
- "pausasEsperadas": 5
22
- },
23
- {
24
- "pedido": "Migracao de dados com risco alto #Look",
25
- "nome": "migracao",
26
- "modoEsperado": "look",
27
- "slugEsperado": "ork-migracao-goal",
28
- "blocosEsperados": ["GOAL", "PLAN", "GO", "CHECK", "SHIP", "MASTER"],
29
- "pausasEsperadas": 6
30
- },
31
20
  {
32
21
  "pedido": "Ajuste simples e claro no rodape #Maestro",
33
22
  "nome": "rodape",
34
23
  "modoEsperado": "maestro",
35
24
  "slugEsperado": "ork-rodape-f12",
36
- "blocosEsperados": ["GOAL-PLAN", "GO-CHECK-SHIP", "MASTER"],
25
+ "blocosEsperados": [
26
+ "GOAL-PLAN",
27
+ "GO-CHECK-SHIP",
28
+ "MASTER"
29
+ ],
37
30
  "pausasEsperadas": 1
38
31
  },
39
32
  {
@@ -41,15 +34,35 @@
41
34
  "nome": "pipeline",
42
35
  "modoEsperado": "classic",
43
36
  "slugEsperado": "ork-pipeline-goal",
44
- "blocosEsperados": ["GOAL", "PLAN", "GO-CHECK", "SHIP-MASTER"],
37
+ "blocosEsperados": [
38
+ "GOAL",
39
+ "PLAN",
40
+ "GO-CHECK",
41
+ "SHIP-MASTER"
42
+ ],
45
43
  "pausasEsperadas": 3
46
44
  },
45
+ {
46
+ "pedido": "Arruma o typo do rodape #Fast",
47
+ "nome": "typo rodape",
48
+ "modoEsperado": "fast",
49
+ "slugEsperado": "ork-typorodape-go",
50
+ "blocosEsperados": [
51
+ "GO"
52
+ ],
53
+ "pausasEsperadas": 0
54
+ },
47
55
  {
48
56
  "pedido": "Pedido sem tag nenhuma",
49
57
  "nome": "semtag",
50
58
  "modoEsperado": null,
51
59
  "slugEsperado": "ork-semtag-goal",
52
- "blocosEsperados": ["GOAL", "PLAN", "GO-CHECK", "SHIP-MASTER"],
60
+ "blocosEsperados": [
61
+ "GOAL",
62
+ "PLAN",
63
+ "GO-CHECK",
64
+ "SHIP-MASTER"
65
+ ],
53
66
  "pausasEsperadas": 3
54
67
  }
55
68
  ]
@@ -42,7 +42,7 @@
42
42
  "fases": ["GOAL", "PLAN", "GO", "CHECK", "SHIP", "MASTER"],
43
43
  "score": 4,
44
44
  "justificativa": "entregou o combinado; a base andou no meio e exigiu ressincronizacao",
45
- "avaliadoPor": "julio",
45
+ "avaliadoPor": "dono-do-projeto",
46
46
  "avaliadoEm": "2026-01-15T12:00:00.000Z",
47
47
  "classesDeFalha": ["base-avancou"],
48
48
  "resumo": "thread ork-checkout fechada com score 4/5",
@@ -0,0 +1,19 @@
1
+ {
2
+ "id": "fx-adapter-editado-detectado",
3
+ "sobre": "Uma cópia de adapter editada fora do catálogo continua sendo DETECTADA, NOMEADA e classificada como `copia-editada`, e continua barrando; a saída traz o diff e um caminho de UM comando, sem oferecer `--force`.",
4
+ "porque": "R1 do GOAL chama esta de a remoção com maior risco, e pelo motivo certo: a cerimônia de instalação é o único mecanismo que pega uma cópia instalada editada à mão, e nenhum teste da suíte alcança isso, porque a suíte roda sobre o CATÁLOGO e não sobre a cópia. Trocar uma recusa barulhenta por nada seria trocar investigação de madrugada por defeito que ninguém vê. O que muda é o que BARRA, não o que DETECTA: no adapter real do Hermes, dos 9 divergentes, 7 são `catalogo-andou` e se resolvem sozinhos, e sobram 2 para o operador decidir — incluindo exatamente o `skills/orkastery-devmaster/SKILL.md` que o dono investigou de madrugada. `naoOfereceForce` é a metade que impede o regime antigo de voltar: `--force` ressincronizava tudo sem mostrar o que mudava, e era o único caminho de saída oferecido.",
5
+ "precisa": [],
6
+ "esperado": {
7
+ "semDivergenciaAoInstalar": true,
8
+ "reciboGravado": true,
9
+ "reinstalarNaoAcusa": true,
10
+ "detectouAEdicao": true,
11
+ "nomeiaOArquivo": true,
12
+ "classificouComoCopiaEditada": true,
13
+ "barrouSemDecisao": true,
14
+ "temDiffNaSaida": true,
15
+ "temUmComando": true,
16
+ "naoOfereceForce": true,
17
+ "umComandoResolve": true
18
+ }
19
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "fx-auto-quiet",
3
+ "sobre": "Prova SIMULADA de silêncio por modo, preservando policy",
4
+ "esperado": {
5
+ "simulado": true,
6
+ "pedidosRecusados": 2,
7
+ "humanosSemEscalacao": 0,
8
+ "policyPreservada": true
9
+ },
10
+ "porque": "Exercitar guardas HITL reais em sandbox SIMULADO; impedir retorno de aprovação cega ou previsão incompatível com o modo."
11
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "id": "fx-blanket-approve",
3
+ "sobre": "Prova SIMULADA de recusa de aprovação cega (I-43: um modo vivo, `#Classic`, o único que abre pedido de gate em GOAL)",
4
+ "esperado": {
5
+ "simulado": true,
6
+ "recusas": 2,
7
+ "humanos": 0
8
+ },
9
+ "porque": "Exercitar guardas HITL reais em sandbox SIMULADO; impedir retorno de aprovação cega ou previsão incompatível com o modo."
10
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "id": "fx-check-runtime-cruzado",
3
+ "sobre": "Uma thread que exige validação cruzada RECUSA o CHECK no mesmo runtime que fez o GO, com motivo tipado que nomeia o runtime e diz o que destrava; aceita em outro runtime; e a thread que não exige despacha normalmente.",
4
+ "porque": "É a viga (a) do Objective Envelope, a única regra do produto que dizia \"quem valida não pode ser quem executou\", e ela estava presa dentro de um mecanismo que nunca rodou: valia só na criação do envelope, para três threads com zero sessões, e `validationRuntimes` não aparecia em nenhum arquivo além de `objective.ts` e `index.ts`. O regime que ela combate está medido: das 137 threads, 16 registram sessões de GO e de CHECK, e em 11 delas o CHECK rodou apenas em runtime que o GO também usou; as quatro mais recentes (I-32, I-33, I-34, I-35) são todas `claude-bg` conferindo `claude-bg`. Os três lados são exigidos porque só o positivo não provaria nada: uma regra que nunca recusa e uma regra que recusa sempre são igualmente inúteis.",
5
+ "precisa": [
6
+ "git"
7
+ ],
8
+ "esperado": {
9
+ "recusaMesmoRuntime": true,
10
+ "recusaTipada": true,
11
+ "recusaNomeiaORuntimeDoGo": true,
12
+ "recusaDizOQueDestrava": true,
13
+ "aceitaOutroRuntime": true,
14
+ "semExigenciaDespacha": true,
15
+ "naoVazaParaOGo": true,
16
+ "motivoNoCatalogo": true,
17
+ "semRetryAutomatico": true,
18
+ "escalaParaHumano": true
19
+ }
20
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "fx-codex-dry",
3
+ "sobre": "O setup do bloco leva o despacho governado ao controller Codex app-server via stdio em dry-run; o default continua claude-bg.",
4
+ "porque": "Novos despachos governados precisam de entrada bidirecional e controller próprio. O canário exige o comando app-server via stdio, preserva runtime/modelo/esforço e garante que dry-run não despacha. Provas de recepção nativa são separadas.",
5
+ "precisa": [
6
+ "git"
7
+ ],
8
+ "esperado": {
9
+ "padraoRuntime": "claude-bg",
10
+ "padraoComando": "claude",
11
+ "codexRuntime": "codex",
12
+ "codexComando": "codex app-server",
13
+ "codexModel": "gpt-6-astra",
14
+ "codexEffort": "xhigh",
15
+ "codexHeadless": true,
16
+ "nadaDespachado": true
17
+ }
18
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "id": "fx-donewhen-executavel",
3
+ "sobre": "Um critério de pronto cujo comando FALHA reprova o verify, e o veredito nomeia o critério que falhou; o critério sustentado pelo comando passa; e registrar de novo não duplica claim.",
4
+ "porque": "É a viga (b) do Objective Envelope, e salvá-la não foi mover código: foi criar capacidade. Dentro do envelope, `doneWhen` era PROSA — `objective.ts:205` despejava os itens como lista no `SPEC.md` e nenhum código os executava, e os critérios do envelope real eram frases como \"D1: ork phase run recusa o despacho quando o objective da thread não está approved, com teste que cobre a recusa\": bonito, e impossível de reprovar. As duas metades são exigidas porque critério que só passa não prova nada. A idempotência é condição: `ork verify` roda em toda fase, e uma claim por critério por rodada transformaria a lista num acumulador em vez de uma verificação.",
5
+ "precisa": ["git"],
6
+ "esperado": {
7
+ "criteriosViraramClaim": 2,
8
+ "naoDuplicaAoRepetir": true,
9
+ "verifyReprovou": true,
10
+ "motivoTipado": true,
11
+ "vereditoNomeiaOCriterio": true,
12
+ "criterioSustentadoPassa": true,
13
+ "marcadaComoDoNucleo": true
14
+ }
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "id": "fx-estado-dividido",
3
+ "sobre": "fx-estado-dividido da I-01",
4
+ "porque": "Reproduzir o incidente com estado real em sandbox e comparar observação com contrato versionado.",
5
+ "precisa": [
6
+ "git"
7
+ ],
8
+ "esperado": {
9
+ "eventosMain": 14,
10
+ "eventosWorktree": 90,
11
+ "auditOk": false,
12
+ "syncOk": false,
13
+ "copiasPreservadas": true
14
+ }
15
+ }
@@ -0,0 +1,116 @@
1
+ {
2
+ "id": "fx-fase-orfa",
3
+ "sobre": "fx-fase-orfa da I-01",
4
+ "porque": "Reproduzir o incidente com estado real em sandbox e comparar observação com contrato versionado.",
5
+ "precisa": [
6
+ "git"
7
+ ],
8
+ "esperado": {
9
+ "detectadas": 3,
10
+ "latenciaMaxMin": 10,
11
+ "motivos": [
12
+ "runtime.silencio"
13
+ ],
14
+ "automaticas": 0,
15
+ "precisamDeHumano": 3
16
+ },
17
+ "replay": [
18
+ {
19
+ "threadOrigem": "ork-elevarqualid",
20
+ "fonte": ".orkastery/threads/ork-elevarqualid/ledger.jsonl",
21
+ "sha256": "f3f8b5df8d72eacd3dc66aedf47120d8c69ad34e3263e775ed0c6893628618d7",
22
+ "linhasDoPrefixo": [
23
+ 6,
24
+ 8
25
+ ],
26
+ "consultaEm": "2026-09-07T15:47:18.799Z",
27
+ "eventos": [
28
+ {
29
+ "ts": "2026-09-07T15:37:18.799Z",
30
+ "tipo": "phase_dispatch",
31
+ "fase": "GO",
32
+ "sessionId": "01a07c84-4636-7a40-8485-e5a11a4f6db0",
33
+ "runtime": "codex",
34
+ "origem": "phase.run"
35
+ },
36
+ {
37
+ "ts": "2026-09-07T15:37:18.799Z",
38
+ "tipo": "phase_dispatch_verified",
39
+ "fase": "GO",
40
+ "sessionId": "01a07c84-4636-7a40-8485-e5a11a4f6db0"
41
+ },
42
+ {
43
+ "ts": "2026-09-07T15:37:18.799Z",
44
+ "tipo": "autonomous_decision",
45
+ "fase": "GO",
46
+ "sessionId": "01a07c84-4636-7a40-8485-e5a11a4f6db0"
47
+ }
48
+ ]
49
+ },
50
+ {
51
+ "threadOrigem": "ork-grandeevoluc",
52
+ "fonte": ".orkastery/threads/ork-grandeevoluc/ledger.jsonl",
53
+ "sha256": "a4ad63d61fe746965dd28a9267a7e766149696280bb7ad42ff6a388f34e22559",
54
+ "linhasDoPrefixo": [
55
+ 10,
56
+ 12
57
+ ],
58
+ "consultaEm": "2026-09-07T15:00:43.661Z",
59
+ "eventos": [
60
+ {
61
+ "ts": "2026-09-07T14:50:43.661Z",
62
+ "tipo": "phase_dispatch",
63
+ "fase": "GO",
64
+ "sessionId": "01a07c59-9d9e-7981-885a-7f0634a07169",
65
+ "runtime": "codex",
66
+ "origem": "phase.run"
67
+ },
68
+ {
69
+ "ts": "2026-09-07T14:50:43.662Z",
70
+ "tipo": "phase_dispatch_verified",
71
+ "fase": "GO",
72
+ "sessionId": "01a07c59-9d9e-7981-885a-7f0634a07169"
73
+ },
74
+ {
75
+ "ts": "2026-09-07T14:50:43.662Z",
76
+ "tipo": "autonomous_decision",
77
+ "fase": "GO",
78
+ "sessionId": "01a07c59-9d9e-7981-885a-7f0634a07169"
79
+ }
80
+ ]
81
+ },
82
+ {
83
+ "threadOrigem": "ork-trocarosdois",
84
+ "fonte": ".orkastery/threads/ork-trocarosdois/ledger.jsonl",
85
+ "sha256": "e4c993a13a9e928896dfbd832f1be73b53364a2b343959072bcd5008756d0ad5",
86
+ "linhasDoPrefixo": [
87
+ 3,
88
+ 5
89
+ ],
90
+ "consultaEm": "2026-09-07T12:40:49.654Z",
91
+ "eventos": [
92
+ {
93
+ "ts": "2026-09-07T12:30:49.654Z",
94
+ "tipo": "phase_dispatch",
95
+ "fase": "GOAL",
96
+ "sessionId": "01a07bd9-892a-7280-b0fc-67a472a9f039",
97
+ "runtime": "codex",
98
+ "origem": "phase.run"
99
+ },
100
+ {
101
+ "ts": "2026-09-07T12:30:49.654Z",
102
+ "tipo": "phase_dispatch_verified",
103
+ "fase": "GOAL",
104
+ "sessionId": "01a07bd9-892a-7280-b0fc-67a472a9f039"
105
+ },
106
+ {
107
+ "ts": "2026-09-07T12:30:49.654Z",
108
+ "tipo": "autonomous_decision",
109
+ "fase": "GOAL",
110
+ "sessionId": "01a07bd9-892a-7280-b0fc-67a472a9f039"
111
+ }
112
+ ]
113
+ }
114
+ ],
115
+ "limiteDaProva": "Replay do primeiro despacho Codex visto pela main em 07/09: prefixo append-only anterior ao próximo redespacho, limitado a dez minutos. Eventos antigos anexados pela reconciliação posterior não estavam visíveis nesse prefixo. Sensores externos de commit/rollout não fazem parte desta captura. GO-FIX I-06: este prefixo nao comprova morte. Tres alertas humanos, sem autorizar retry automatico."
116
+ }
@@ -2,11 +2,13 @@
2
2
  "id": "fx-happy",
3
3
  "sobre": "O ciclo que funciona: thread aberta no modo do pedido, fase montada com prompt gravado e hash, e claim que passa na reexecucao no HEAD real.",
4
4
  "porque": "Um corpus que so tem canario de falha nao percebe quando o caminho feliz para de funcionar. Este e o unico que reprova se o produto deixar de fazer o basico.",
5
- "precisa": ["git"],
5
+ "precisa": [
6
+ "git"
7
+ ],
6
8
  "esperado": {
7
- "slug": "evl-checkout-f12",
8
- "modo": "ork",
9
- "pausas": 5,
9
+ "slug": "evl-checkout-goal",
10
+ "modo": "classic",
11
+ "pausas": 3,
10
12
  "promptGravado": true,
11
13
  "promptSha256Hex": true,
12
14
  "despachoBloqueado": false,
@@ -0,0 +1,20 @@
1
+ {
2
+ "id": "fx-hitl-latency",
3
+ "sobre": "fx-hitl-latency: preserva alerta I-01 e acrescenta resposta CLI I-03 SIMULADA",
4
+ "porque": "Reproduzir o incidente com estado real em sandbox e comparar observação com contrato versionado.",
5
+ "precisa": [
6
+ "git"
7
+ ],
8
+ "esperado": {
9
+ "latenciaMin": 4,
10
+ "enviadas": 1,
11
+ "repetidas": 0,
12
+ "sinkRecebeu": true,
13
+ "simulado": true,
14
+ "respostaRecebida": true,
15
+ "respostaAbaixo60s": true,
16
+ "idempotente": true,
17
+ "adulteradaRecusada": true,
18
+ "conteudoAusente": true
19
+ }
20
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "id": "fx-indice-reversao",
3
+ "sobre": "Uma entrega revertida depois do ship se rebaixa SOZINHA no caminho que o produto percorre de verdade: `ork master` mostra a reversão em vez de \"sem tropeço\", e a aceitação por omissão grava score 2, não 5, sem ninguém pontuar nada.",
4
+ "porque": "É o canário que libera a saída da fila de ratificação de score, e prova a propriedade exata que a fila não entregava: ela tinha 13 entradas esperando nota humana justamente porque lembrete não converte em nota, e nenhuma delas dizia se a entrega havia sido desfeita depois. Na primeira versão ele chamava `registrarReversaoDaEntrega` À MÃO, e o CHECK de 20/09/2026 provou com `git revert` real que isso não provava nada: no produto o único chamador era o começo de um `ork ship` SEGUINTE da mesma thread, que depois do MASTER não acontece, e `ork master --aceitar-omissao` gravava score 5 com a justificativa \"sem reversão\" sobre uma entrega desfeita. Agora o canário roda o que o dono roda: `tabelaDeEntregas` e `aceitarPorOmissao`. A detecção ancora no marcador que o próprio git escreve (\"This reverts commit <sha>\") e não em diff de árvore, porque um arquivo que voltou ao estado anterior pode ser trabalho de outra thread, e chamar isso de reversão rebaixaria entrega alheia por coincidência. A idempotência é condição dura agora que a detecção roda em toda consulta: sem ela, abrir a tabela afundaria a nota da thread a cada vez.",
5
+ "precisa": [
6
+ "git"
7
+ ],
8
+ "esperado": {
9
+ "antesDeTudo": 5,
10
+ "depoisDoShip": 5,
11
+ "depoisDaReversao": 2,
12
+ "tabelaMostraAReversao": true,
13
+ "tabelaDizSemTropeco": false,
14
+ "indiceDoAceite": 2,
15
+ "scoreGravado": 2,
16
+ "regimeGravado": "omissao",
17
+ "masterLogScore": 2,
18
+ "justificativaDizSemReversao": false,
19
+ "justificativaCitaAReversao": true,
20
+ "avaliadoPor": "nucleo ork (omissao)",
21
+ "depoisDeRepetir": 2,
22
+ "rollbacks": 1,
23
+ "eventoNoCatalogo": true
24
+ }
25
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "fx-listagem-abertas",
3
+ "sobre": "O default de `ork thread list` mostra o que ainda pede atenção (aberta e pausada) e omite a fechada, avisando que omitiu; `--todas` abre o resto.",
4
+ "porque": "O custo medido era o DEFAULT e não a falta de flag: em 20/09/2026 o comando imprimia 137 linhas para as 31 que interessavam, e 71 delas (52 por cento) eram threads `Sessão adotada claude-bg <uuid>`, lixo do mecanismo de adoção de 07 a 14/09. Quem pagava era quem não sabia que existia flag, porque flag nenhuma existia. A thread PAUSADA é a razão de o default ser \"não fechadas\" e não \"só abertas\", que era o texto do GOAL: esconder a pausada seria esconder justamente a que mais pede atenção. O canário roda em sandbox porque `ork thread list` dentro de uma worktree lê o estado da árvore principal (M8): conferir \"no projeto\" seria afirmar contagem de artefato vivo, que reprova sozinha quando a branch cresce.",
5
+ "precisa": ["git"],
6
+ "esperado": {
7
+ "noDefault": ["aberta", "pausada"],
8
+ "defaultTemAAberta": true,
9
+ "defaultTemAPausada": true,
10
+ "defaultEscondeAFechada": true,
11
+ "comTodas": 3,
12
+ "todasTemAFechada": true,
13
+ "somaBate": true,
14
+ "avisaQueEscondeu": true
15
+ }
16
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "fx-maestro-bootstrap",
3
+ "sobre": "SIMULADO: consulta, ação com readback e policy block no modo Auto",
4
+ "porque": "Exercitar o núcleo em projeto temporário sem confundir fixture com ativação live dos hosts.",
5
+ "precisa": [
6
+ "git"
7
+ ],
8
+ "entrada": "orkastery maestro",
9
+ "esperado": {
10
+ "simulado": true,
11
+ "contract": "ork.maestro-snapshot/v1",
12
+ "queryExit": 0,
13
+ "createsThread": false,
14
+ "childRedispatch": false,
15
+ "actionCalls": 1,
16
+ "readbackMatches": true,
17
+ "autoPolicyBlocked": true,
18
+ "noDispatch": true,
19
+ "promptNotWritten": true
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "fx-modo-aposentado-escritor",
3
+ "sobre": "Modo aposentado escrito em qualquer entrada recebe recusa TIPADA `modo.aposentado`, que nomeia o modo pedido e oferece só substitutos que existem hoje.",
4
+ "porque": "Ignorar em silêncio é o pecado que o produto inteiro combate, e seria o pior resultado possível desta aposentadoria: o builder escreve `#Look` no pedido e recebe uma thread em `#Auto` sem saber que trocou de regime de supervisão. `semModoInexistente` cobra que toda #TAG do texto da recusa é um modo da matriz, e `semCicloParcialNaOferta` cobra que o substituto oferecido é de ciclo completo: com a I-42 o `#Fast` existe, mas só roda a GO e não substitui um modo de vigilância máxima.",
5
+ "precisa": [
6
+ "git"
7
+ ],
8
+ "esperado": {
9
+ "recusasNoParse": 2,
10
+ "recusasNaCriacao": 2,
11
+ "tagsReconhecidas": 2,
12
+ "todasTipadas": true,
13
+ "nomeiaOModoPedido": true,
14
+ "substitutosVivos": true,
15
+ "semMaestroNaOferta": true,
16
+ "semModoInexistente": true,
17
+ "semCicloParcialNaOferta": true,
18
+ "initSoComVivos": true,
19
+ "initTemTodosOsVivos": true
20
+ }
21
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "fx-modo-aposentado-leitor",
3
+ "sobre": "Thread e recibo gravados em #Look ou #Ork continuam sendo LIDOS inteiros depois da aposentadoria: a tag certa, a estrutura de blocos do modo e a profundidade do recibo assinado.",
4
+ "porque": "O jeito conhecido de esta remoção parecer certa e não ser é encolher o LEITOR junto com o ESCRITOR. As três threads reais (ork-smokeb0 em 02/09, ork-b2worktree e ork-b4adapt em 03/09) estão fechadas mas continuam abrindo, e há 276 ocorrências desses modos no estado em disco. Se a matriz encolhesse, `tagDoModo` devolveria `#?look` no board e um pedido `ork.hitl/v1` com `modo: look, profundidade: profunda` deixaria de validar EM SILÊNCIO: o produto passaria a negar o recibo que ele mesmo emitiu e assinou.",
5
+ "precisa": ["git"],
6
+ "esperado": {
7
+ "tags": ["#Look", "#Ork"],
8
+ "pausas": [6, 5],
9
+ "recibosValidos": 2,
10
+ "todoAposentadoTemDefinicao": true,
11
+ "nenhumAposentadoEscrivel": true,
12
+ "todoVivoEhLegado": true,
13
+ "profundidadeDeLook": "profunda",
14
+ "profundidadeDeOrk": "detalhada"
15
+ }
16
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "fx-objective-oscillation",
3
+ "sobre": "Um objetivo revisado repetidamente não pode consumir a orquestra em loop.",
4
+ "porque": "A terceira revisão consecutiva aciona uma pausa tipada e preserva todas as versões do Objective Envelope para diagnóstico humano.",
5
+ "precisa": ["git"],
6
+ "esperado": {
7
+ "threads": 3,
8
+ "revisions": 3,
9
+ "state": "paused",
10
+ "reason": "objective.oscillation",
11
+ "history": 3,
12
+ "currentVersion": 4
13
+ }
14
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "fx-omnicanal",
3
+ "sobre": "Prova SIMULADA de que os quatro canais homologados respondem e ficam distinguiveis no recibo",
4
+ "esperado": {
5
+ "simulado": true,
6
+ "canaisRegistrados": 4,
7
+ "transportes": 2,
8
+ "chavesIndependentes": 2,
9
+ "aprovados": 4,
10
+ "canaisDistinguiveis": 4,
11
+ "canalPorInferencia": 0,
12
+ "recusas": 5,
13
+ "humanosSemIngresso": 0,
14
+ "ofertaDisponivel": 4
15
+ },
16
+ "porque": "D12 exige HITL omnicanal nos quatro hosts homologados com identidade, correlacao e recibo equivalentes, e FX1 exige que a chave de ingresso seja de cada canal. O canario impede quatro regressoes: reduzir a lista de canais, voltar a gravar recibo que nao distingue Hermes de OpenClaw, aceitar resposta sem ingresso homologado (aprovacao cega, transcrito de tool ou canal de outro transporte), e voltar a compartilhar uma chave entre os dois canais de telegram."
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "fx-sensores-runtime",
3
+ "sobre": "Integração I-04 com hook/CLI, supervisor e watcher em sandbox Git",
4
+ "porque": "Medir ingestão, classificações, morte e domicílio único sem credenciais ou estado operacional; T9 comprova runtimes reais separadamente.",
5
+ "precisa": ["git"],
6
+ "esperado": {
7
+ "tipoProva": "harness isolado; protocolo Codex sintético",
8
+ "classificacoes": ["fase_concluida", "human.pending", "gate_blocked"],
9
+ "subprocessosComRecibo": 3,
10
+ "hookAbaixo5s": true,
11
+ "morteAntesDoLimite": false,
12
+ "morteLatenciaMs": 600000,
13
+ "mortosSemEvento": 0,
14
+ "duplicatas": 0,
15
+ "estadoUnico": true
16
+ }
17
+ }
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ // Foreground worker; service manager owns restart. No broad pulse reconciliation.
3
+ const { spawn } = require('node:child_process');
4
+ const args = process.argv.slice(2);
5
+ if (args.length !== 2 || args[0] !== '--thread' || !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/.test(args[1])) {
6
+ console.error('brain.worker.scope-required'); process.exit(2);
7
+ }
8
+ const cli = require('node:path').resolve(__dirname, '../core/dist/index.js');
9
+ let child, timer, stopped=false;
10
+ const stop=()=>{stopped=true;clearTimeout(timer);if(child)child.kill('SIGTERM');};
11
+ process.on('SIGTERM',stop);process.on('SIGINT',stop);
12
+ function tick(){
13
+ child=spawn(process.execPath,[cli,'brain','sync','--thread',args[1]],{stdio:'inherit',shell:false});
14
+ child.once('error',()=>{console.error('brain.worker.unavailable');stop();process.exitCode=1;});
15
+ child.once('exit',code=>{child=null;if(code){stop();process.exitCode=1;}else if(!stopped)timer=setTimeout(tick,5000);});
16
+ }
17
+ tick();
@@ -0,0 +1,45 @@
1
+ /** D17: allowlist duravel do projeto; configuracao invalida impede a varredura. */
2
+ const fs = require('node:fs');
3
+ const path = require('node:path');
4
+
5
+ function lerEscopo(arquivo) {
6
+ const stat = fs.lstatSync(arquivo);
7
+ if (!stat.isFile() || stat.isSymbolicLink()) throw Error('pulse.scope.special-file');
8
+ let config;
9
+ try { config = JSON.parse(fs.readFileSync(arquivo, 'utf8')); }
10
+ catch { throw Error('pulse.scope.invalid-json'); }
11
+ if (![1, 2].includes(config?.versao) || (config.versao === 2 && config.activation !== 'receipt-required') || !Array.isArray(config.threads) || !config.threads.length ||
12
+ config.threads.some(id => typeof id !== 'string' || !/^[a-z0-9][a-z0-9-]*$/.test(id)) ||
13
+ new Set(config.threads).size !== config.threads.length) throw Error('pulse.scope.invalid');
14
+ // O nucleo aplica tambem a policy de threads protegidas antes de qualquer carimbo.
15
+ return config.threads.join(',');
16
+ }
17
+
18
+ function escopoAtivo(arquivo) {
19
+ const candidato = lerEscopo(arquivo);
20
+ const api = [path.join(__dirname, '../core/dist'), path.join(__dirname, '../dist')]
21
+ .find(p => fs.existsSync(path.join(p, 'write-activation.js')));
22
+ if (!api) throw Error('pulse.scope.runtime-unavailable');
23
+ const { exigirManifesto } = require(path.join(api, 'manifest.js'));
24
+ const { lerAtivacao } = require(path.join(api, 'write-activation.js'));
25
+ const c = exigirManifesto(path.dirname(path.dirname(arquivo)));
26
+ let ativacao;
27
+ try { ativacao = lerAtivacao(c); }
28
+ catch (e) {
29
+ process.stderr.write('pulse.scope.activation-pending: ' + (String(e.message).startsWith('write.activation.') ? e.message : 'invalid receipt') + '\n');
30
+ return ''; // Observacao/alertas continuam; escrita nao foi autorizada.
31
+ }
32
+ if (!ativacao.ativa || !ativacao.plano.alvos.includes('pulse')) return '';
33
+ const autorizado = ativacao.plano.threads.join(',');
34
+ if (candidato !== autorizado) throw Error('pulse.scope.activation-conflict');
35
+ return autorizado;
36
+ }
37
+ module.exports = { lerEscopo, escopoAtivo };
38
+ if (require.main === module) {
39
+ try { process.stdout.write(escopoAtivo(process.argv[2])); }
40
+ catch (e) {
41
+ const mensagem = e.message.startsWith('pulse.scope.') ? e.message : 'pulse.scope.unreadable';
42
+ process.stderr.write(mensagem + '\n');
43
+ process.exitCode = 1;
44
+ }
45
+ }
@@ -0,0 +1,18 @@
1
+ # Substitua /CAMINHO/orkastery pelo checkout principal e confira o PATH do host.
2
+ # Instale junto das entradas existentes com crontab. Nunca usar cron LLM deliver=origin.
3
+ # A rotina inclui $HOME/.local/bin; outro prefixo usa ORK_PULSE_RUNTIME_BIN.
4
+ # O launcher carrega monitor/pulse-write-scope.json do projeto alvo (D17).
5
+ # Sem arquivo nem ORK_PULSE_WRITE_SCOPE, apenas observa e entrega alertas.
6
+ # Ambiente e arquivo divergentes interrompem a rodada com erro explicito.
7
+ # Novos IDs exigem decisao explicita. Nao carregar credenciais no launcher.
8
+ # SHIP requer rebuild de core/dist na main e prova de escopo antes de concluir.
9
+ # Threads protegidas sao recusadas; nao usar escopo global nem derivado do inventario.
10
+ #
11
+ # A batida e de 15 em 15 minutos e quem decide se ESTA batida entrega e o nucleo (I-50, RM-039):
12
+ # pergunta nova ao dono sai na batida seguinte; o resumo periodico so sai quando a janela da
13
+ # cadencia virou. A cadencia e a tag que o dono manda no canal, sem editar este arquivo:
14
+ # #OrkPulseOff (8h, as 08h, 16h e 00h), #OrkPulseOn (2h), #OrkPulseOn-15m, -30m e -60m (o padrao).
15
+ # A entrega e UM resumo por varredura, nunca uma mensagem por item: entregar por item a cada
16
+ # poucos minutos inunda o canal do dono. Esse teto nao e configuravel, e vive no nucleo.
17
+ PATH=/usr/local/bin:/usr/bin:/bin
18
+ */15 * * * * /CAMINHO/orkastery/monitor/varredura-pulse.sh