@orkastery/cli 0.5.1 → 0.5.3

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 (110) hide show
  1. package/adapters/claude-code/agents/ork-master.md +2 -0
  2. package/adapters/claude-code/commands/master.md +8 -0
  3. package/adapters/claude-code/commands/ork.md +9 -0
  4. package/adapters/codex/skills/ork/SKILL.md +18 -3
  5. package/adapters/hermes/README.md +1 -0
  6. package/adapters/hermes/bin/ork-network-status.sh +10 -0
  7. package/adapters/hermes/hermes.plugin.json +1 -0
  8. package/adapters/hermes/hitl-ingress/__init__.py +2 -2
  9. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +6 -5
  10. package/adapters/openclaw/README.md +24 -4
  11. package/adapters/openclaw/dist/hitl-ingress.js +2 -2
  12. package/adapters/openclaw/dist/index.js +46 -11
  13. package/adapters/openclaw/openclaw.plugin.json +5 -1
  14. package/adapters/openclaw/package.json +2 -2
  15. package/adapters/openclaw/src/hitl-ingress.ts +2 -2
  16. package/adapters/openclaw/src/index.ts +49 -11
  17. package/assets/orkmind_bridge.py +117 -9
  18. package/dist/adapters/claude-bg.js +39 -5
  19. package/dist/adapters/codex.js +4 -3
  20. package/dist/agents-md.js +1 -0
  21. package/dist/auditrun.js +5 -1
  22. package/dist/board.js +16 -14
  23. package/dist/branch-de-estado.js +66 -10
  24. package/dist/busca-semantica.js +52 -12
  25. package/dist/canarios-rm057.js +149 -0
  26. package/dist/canarios.js +2 -0
  27. package/dist/ci.js +8 -1
  28. package/dist/claims.js +39 -1
  29. package/dist/company-brain-context.js +158 -22
  30. package/dist/docs.js +48 -9
  31. package/dist/doctor-pulse-cron.js +194 -0
  32. package/dist/doctor-rede.js +149 -0
  33. package/dist/doctor.js +89 -9
  34. package/dist/entrega-pr.js +20 -8
  35. package/dist/esgotamentos.js +181 -0
  36. package/dist/experiencia.js +12 -2
  37. package/dist/fabrica-estado.js +14 -6
  38. package/dist/fabrica-publicar.js +6 -0
  39. package/dist/fechamento.js +20 -66
  40. package/dist/forja.js +31 -7
  41. package/dist/gates.js +5 -1
  42. package/dist/hitl-contract.js +59 -4
  43. package/dist/hitl-curto.js +11 -6
  44. package/dist/hitl-gates.js +5 -0
  45. package/dist/hitl-lote.js +5 -2
  46. package/dist/hitl-resumo.js +9 -0
  47. package/dist/hitl-tempo-parado.js +201 -0
  48. package/dist/hitl-texto-livre.js +5 -5
  49. package/dist/horario.js +27 -0
  50. package/dist/hosts.js +52 -10
  51. package/dist/impedimento.js +205 -0
  52. package/dist/index.js +391 -74
  53. package/dist/indice-vetorial.js +87 -10
  54. package/dist/indice.js +3 -1
  55. package/dist/init.js +17 -0
  56. package/dist/integracoes-locais.js +2 -0
  57. package/dist/intelligence-graph-cli.js +91 -8
  58. package/dist/intelligence-graph-contexto.js +215 -0
  59. package/dist/intelligence-graph-parsers.js +6 -4
  60. package/dist/leases.js +664 -87
  61. package/dist/ledger-stats.js +15 -1
  62. package/dist/ledger.js +3 -0
  63. package/dist/licoes.js +1 -0
  64. package/dist/maestro-runtime.js +4 -1
  65. package/dist/manifest.js +20 -1
  66. package/dist/master-nota.js +14 -5
  67. package/dist/master.js +129 -12
  68. package/dist/mcp-artifacts.js +34 -3
  69. package/dist/mcp-git.js +20 -3
  70. package/dist/mcp-grafo-worker.js +5 -3
  71. package/dist/mcp-grafo.js +50 -4
  72. package/dist/mcp-server.js +14 -1
  73. package/dist/memoria.js +48 -6
  74. package/dist/network-roadmap.js +191 -16
  75. package/dist/ocupacao.js +11 -3
  76. package/dist/orkmind.js +90 -5
  77. package/dist/orquestracao.js +12 -10
  78. package/dist/parado-no-condutor.js +188 -32
  79. package/dist/phase.js +68 -15
  80. package/dist/policies.js +52 -1
  81. package/dist/portfolio.js +4 -1
  82. package/dist/projeto-alvo.js +5 -1
  83. package/dist/prompts.js +36 -1
  84. package/dist/prova-ativacao.js +75 -6
  85. package/dist/pulse-delivery.js +34 -2
  86. package/dist/pulse.js +49 -3
  87. package/dist/ratelimit.js +20 -4
  88. package/dist/recall.js +3 -1
  89. package/dist/rede-adesao.js +399 -0
  90. package/dist/rede-forja.js +289 -0
  91. package/dist/rede-projetos.js +239 -0
  92. package/dist/rede-status.js +336 -0
  93. package/dist/rede.js +980 -0
  94. package/dist/retry.js +69 -2
  95. package/dist/roadmap-status.js +23 -3
  96. package/dist/runtime-profiles.js +22 -1
  97. package/dist/saida-segura.js +58 -0
  98. package/dist/session-watcher-claude.js +113 -23
  99. package/dist/sessoes-contas.js +187 -0
  100. package/dist/sessoes-inventario.js +6 -18
  101. package/dist/sessoes.js +83 -2
  102. package/dist/ship.js +85 -19
  103. package/dist/thread.js +192 -13
  104. package/dist/worktree.js +5 -2
  105. package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
  106. package/package.json +7 -3
  107. package/references/definition-of-done.md +1 -1
  108. package/skills/README.md +1 -1
  109. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  110. package/skills/phases/master-metrics/SKILL.md +8 -3
@@ -22,6 +22,8 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
22
22
  - Classe de falha vem do catalogo fixo (`ork master classes`).
23
23
  - Justificativa vazia e recusada pelo comando, e a recusa nao grava nada.
24
24
  - Entrega sem MASTER log nao aconteceu.
25
+ - Aceite por omissao so da sua thread: `ork master <thread> --aceitar-omissao`. Sem a thread, o
26
+ comando fecha tambem as entregas de outras frentes paralelas.
25
27
 
26
28
  ## Regras que valem em toda fase
27
29
 
@@ -34,6 +34,14 @@ ork master --todas
34
34
 
35
35
  4. Nos modos sem pausa de MASTER, a entrega e aceita a menos que o builder diga o contrario; o
36
36
  `ork master --todas` mostra as entregas com o indice derivado do ledger, inclusive as ja pontuadas.
37
+ Para fechar por omissao, sempre com a thread, que e so a sua:
38
+
39
+ ```bash
40
+ ork master <thread> --aceitar-omissao
41
+ ```
42
+
43
+ Sem a thread, o comando aceita TODAS as entregues do projeto, inclusive as de outras frentes
44
+ paralelas; `ork master --aceitar-omissao --dry-run` mostra quais, sem gravar.
37
45
 
38
46
  ## Regras do adaptador
39
47
 
@@ -35,6 +35,8 @@ então consulte o projeto fixado. Não abre thread nem despacho por consulta.
35
35
  Sem projeto nomeado, ofereça também o panorama da rede (RM-054): `ork network roadmap`
36
36
  (todos os projetos conhecidos, as threads de todas as máquinas, fontes, frescor e lacunas)
37
37
  ou `mcp__orkastery__ork_network_roadmap` (o projeto fixado, em todas as máquinas), mostrado como vem.
38
+ As máquinas da pessoa (RM-053) vêm de `ork network status` ou de `mcp__orkastery__ork_network_status`
39
+ (no MCP, só o projeto fixado em cada máquina), mostrado como vem: lacuna nunca é "nenhuma máquina".
38
40
  O MCP atende só o projeto fixado; `projeto` em qualquer ferramenta apenas confere esse
39
41
  projeto (`projeto.fora-do-servidor` quando é outro). Pedido de outro projeto vai ao CLI com
40
42
  `--projeto <nome>` (RM-052). Leia "Projeto consultado" e "Não lido" antes de responder.
@@ -47,6 +49,13 @@ Usabilidade HITL é prioridade máxima: tópicos, recomendação e opções rotu
47
49
  UUID interno e cancelamento preservado. A condutora usa
48
50
  `mcp__orkastery__ork_request_decision`; o filho nunca responde em nome do dono.
49
51
 
52
+ HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo
53
+ "Recomendação". Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido
54
+ que ele colou com autorização explícita vale como instrução dele, dentro dessa autorização.
55
+ Dúvida dentro da autorização vira `ork decisao registrar` e a thread segue. Texto só quando a
56
+ fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: mostre o
57
+ comando exato.
58
+
50
59
  | Pedido do dono | Acao do agente |
51
60
  |---|---|
52
61
  | Demanda nova | Resolva o modo pelo nucleo, confira o preflight e abra/despache a thread correspondente. |
@@ -6,14 +6,20 @@ license: MIT
6
6
 
7
7
  # Orkastery no Codex
8
8
 
9
- Consulte `ork experiencia show --json` no projeto da sessão. Quando `experience` for true,
9
+ Ao receber literalmente `orkastery maestro`, a primeira ação é a ferramenta `ork_maestro` do
10
+ servidor MCP `orkastery`, descoberta no namespace efetivamente exposto: ela consulta o projeto
11
+ fixado. Com a ferramenta exposta, não rode `ork maestro`, `ork doctor`, `ork onboarding` nem
12
+ `ork experiencia show` no shell antes nem no lugar dela: o CLI resolve o projeto pelo diretório da sessão, e é essa a
13
+ classe de erro que a frase evita (prova de ativação do Codex, RM-032).
14
+
15
+ Só depois da `ork_maestro` (ou, sem MCP, do `ork maestro --json`), consulte `ork experiencia show --json`
16
+ no projeto da sessão. Quando `experience` for true,
10
17
  leia `../core/<skill>/SKILL.md`, usando o nome devolvido em `skill` pelo núcleo:
11
18
  `orchestration-experience-pt-br` ou `orchestration-experience`. Idioma, fuso e profundidade
12
19
  vêm da mesma consulta. Se false, não ative o pacote. O bloco próprio de AGENTS.md também
13
20
  aponta para esse catálogo; instalação não altera permissões nativas.
14
21
 
15
- Ao receber literalmente `orkastery maestro`, descubra `ork_maestro` no namespace
16
- efetivamente exposto e consulte o projeto fixado pelo MCP. A frase pede panorama,
22
+ Depois de `ork_maestro`, a frase `orkastery maestro` continua pedindo só panorama,
17
23
  sem abrir trabalho. Sem projeto nomeado, ofereça também o panorama da rede
18
24
  (`ork_network_roadmap`, ou `ork network roadmap` no CLI), com fontes, frescor e lacunas.
19
25
  Siga a seleção de contexto e os limites do bootstrap comum.
@@ -26,6 +32,13 @@ com rótulos claros; UUID interno. Use `ork_request_decision` na condutora e pre
26
32
  a resposta literal/cancelamento da elicitation. Não use pergunta genérica do agente
27
33
  como aprovação de gate nem texto em toolargs como identidade humana.
28
34
 
35
+ HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo
36
+ "Recomendação". Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido
37
+ que ele colou com autorização explícita vale como instrução dele, dentro dessa autorização.
38
+ Dúvida dentro da autorização vira `ork decisao registrar` e a thread segue. Texto só quando a
39
+ fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: mostre o
40
+ comando exato.
41
+
29
42
  Use a skill `orkastery-bootstrap` do mesmo catalogo instalado para conduzir o pedido.
30
43
  O dono conversa sobre o objetivo; voce opera o nucleo `ork` e apresenta o resultado e o proximo
31
44
  passo. Preserve o modo e as autorizacoes da thread. Se ja recebeu uma fase do Orkastery,
@@ -42,6 +55,8 @@ e `ork_request_decision(threadId, pedidoId)`. Use o namespace efetivamente expos
42
55
  - Status do roadmap: use `ork_network_roadmap` (ou `ork network roadmap --projeto <nome>`) e mostre o
43
56
  texto como vem, com as threads de todas as maquinas, as fontes e as lacunas; `ork_roadmap_status` e
44
57
  so desta maquina. Nao escreva relatorio proprio de roadmap: lacuna nunca e roadmap vazio.
58
+ - Maquinas da pessoa (RM-053): use `ork_network_status` (ou `ork network status`) e mostre o texto como
59
+ vem, com a batida de cada maquina, a fonte e as lacunas; lacuna nunca e "nenhuma maquina".
45
60
  - Status: apresente a evidencia da thread; `ork pulse --json` mostra quem precisa agir.
46
61
  As pausas dos blocos do modo sao previstas: so diga "aguardando voce" com pendencia
47
62
  humana atual comprovada no estado/ultimo resultado, identificando gate, pedido ou evento.
@@ -47,6 +47,7 @@ ork adapter install hermes --dry-run # lista o que seria escrito
47
47
  | `bin/ork-maestro.sh` | `ork_maestro`: o panorama Maestro do projeto pedido (`ork maestro --json`) |
48
48
  | `bin/ork-roadmap-status.sh` | `ork_roadmap_status`: o status report do roadmap so desta maquina (`ork roadmap status`) |
49
49
  | `bin/ork-network-roadmap.sh` | `ork_network_roadmap`: o roadmap da rede (`ork network roadmap`), com as threads de todas as maquinas, fonte, hora e lacunas; a fonte do status do roadmap e o panorama da frase `orkastery maestro` sem projeto (RM-054) |
50
+ | `bin/ork-network-status.sh` | `ork_network_status`: as maquinas da pessoa na Orkastery Network (`ork network status`), com a batida, as forjas, os runtimes, os hosts, a fonte e as lacunas; sem projeto (RM-054, fatia 3) |
50
51
 
51
52
  ## Tickets `obj-*` aposentados
52
53
 
@@ -0,0 +1,10 @@
1
+ #!/bin/sh
2
+ # RM-054 (fatia 3): as maquinas da pessoa na Orkastery Network (RM-053), montadas pelo nucleo
3
+ # (`ork network status`): a casa, a batida de cada maquina, forjas, runtimes, hosts e projetos, a
4
+ # fonte e as lacunas. Somente leitura; o Hermes transporta o texto como vem. Argumentos continuam dados.
5
+ set -eu
6
+ export ORK_CANAL="${ORK_CANAL:-hermes}"
7
+ # RM-052 (D3): o cwd do gateway nao e projeto. Com ORK_PROJETO_EXPLICITO=1 o nucleo nao le o projeto
8
+ # do diretorio do gateway; a rede vem da casa, do registro e dos retratos. ORK_PROJETO_EXPLICITO=0 desliga.
9
+ export ORK_PROJETO_EXPLICITO="${ORK_PROJETO_EXPLICITO:-1}"
10
+ exec "${ORK_BIN:-{{ork_bin}}}" network status "$@"
@@ -12,6 +12,7 @@
12
12
  "ork_maestro": "./bin/ork-maestro.sh",
13
13
  "ork_roadmap_status": "./bin/ork-roadmap-status.sh",
14
14
  "ork_network_roadmap": "./bin/ork-network-roadmap.sh",
15
+ "ork_network_status": "./bin/ork-network-status.sh",
15
16
  "ork-abrir-thread": "./bin/ork-abrir-thread.sh",
16
17
  "ork_brain": "./bin/ork-brain.sh",
17
18
  "ork_gate_answer": "./bin/ork-hitl-answer.py",
@@ -32,8 +32,8 @@ PULSE_CADENCIA = re.compile(r'^[ \t]*#OrkPulse(?:On(?:-(?:15|30|60)m)?|Off)[ \t]
32
32
  # ("1. B, 2. aprovo") e interceptada sempre; `livre` ("sim", "aprovo", "a") so enquanto a janela
33
33
  # de escuta do nucleo estiver aberta: fora dela, a palavra vai ao assistente, como sempre foi. A
34
34
  # janela e dica de rota, nao prova: a mensagem ainda passa pela assinatura e pela regra do nucleo.
35
- PULSE_LISTA = re.compile(r'^[ \t]*[0-9]{1,2}(?:[ \t]*[.):-])?[ \t]*(?:[a-d]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?)(?:[ \t\r\n,;]*[0-9]{1,2}(?:[ \t]*[.):-])?[ \t]*(?:[a-d]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))*[ \t]*(?:[.!][ \t]*)?$', re.IGNORECASE)
36
- PULSE_LIVRE = re.compile(r'^[ \t]*(?:[1-4]|(?:[a-d]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))[ \t]*(?:[.!]+[ \t]*)?$', re.IGNORECASE)
35
+ PULSE_LISTA = re.compile(r'^[ \t]*[0-9]{1,2}(?:[ \t]*[.):-])?[ \t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?)(?:[ \t\r\n,;]*[0-9]{1,2}(?:[ \t]*[.):-])?[ \t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))*[ \t]*(?:[.!][ \t]*)?$', re.IGNORECASE)
36
+ PULSE_LIVRE = re.compile(r'^[ \t]*(?:[1-5]|(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))[ \t]*(?:[.!]+[ \t]*)?$', re.IGNORECASE)
37
37
  # RM-048 (item 8): a linha do teclado do digest ("ratificar <thread> <assinatura> <classe>") vai ao
38
38
  # nucleo pelo mesmo endereco assinado; o agente nao escreve mais `--por` em nome do dono.
39
39
  PULSE_RATIFICACAO = re.compile(r'^[ \t]*ratificar(?:-lote)?(?:[ \t]+[A-Za-z0-9._-]{1,80}){2,3}[ \t]*$', re.IGNORECASE)
@@ -8,7 +8,7 @@ license: MIT
8
8
 
9
9
  # Orkastery no Hermes
10
10
 
11
- Consulte `ork experiencia show --json --projeto <nome>`. Se `experience` for true, leia `../<skill>/SKILL.md` conforme `skill`: `orchestration-experience-pt-br` ou `orchestration-experience`, ambas instaladas. Use idioma, fuso e profundidade efetivos; se false, não ative o pacote. Preferências não alteram permissões nem HMAC.
11
+ Mensagem literal `orkastery maestro`: a primeira ação é a `ork_maestro`; só depois dela consulte `ork experiencia show --json --projeto <nome>`. Se `experience` for true, leia `../<skill>/SKILL.md` conforme `skill`: `orchestration-experience-pt-br` ou `orchestration-experience`, ambas instaladas. Use idioma, fuso e profundidade efetivos; se false, não ative o pacote. Preferências não alteram permissões nem HMAC.
12
12
 
13
13
  Mensagem literal `orkastery maestro`: use `ork_maestro` (wrapper de `ork maestro --json`) para o panorama do projeto pedido; o nome dito pelo dono ("do orkastery") vai como `--projeto <nome>` (RM-052). Sem projeto nomeado, ofereça o panorama da rede: `ork_network_roadmap` (wrapper de `ork network roadmap`), com cada projeto conhecido, as threads de todas as máquinas, fontes, frescor e lacunas, transportado como vem (RM-054).
14
14
  Não abra thread por essa consulta. O gateway não tem diretório de projeto: `projeto.escolha` traz os candidatos; apresente-os e pergunte, nunca escolha pelo cwd.
@@ -21,9 +21,10 @@ interno. Telegram é opcional. Só anuncie ingresso humano disponível quando o
21
21
  do host estiver homologado e configurado; texto de tool não é identidade humana.
22
22
  Sem ingresso no canal escolhido, conserve o pedido pendente e explique o motivo.
23
23
  Não altere runtime, provider, perfil filho ou sandbox para contornar falha.
24
+ HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo "Recomendação". Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido que ele colou com autorização explícita vale como instrução dele, dentro dessa autorização. Dúvida dentro da autorização vira `ork decisao registrar` e a thread segue. Texto só quando a fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: mostre o comando exato.
24
25
  Horário para o dono sai no fuso dele (`owner.timezone`): use `prazoLocal` e os fatos
25
26
  `*Local` do JSON (ex.: `19/09 15:16 (horário de Brasília)`), nunca o ISO em UTC.
26
- Status do roadmap: `ork_network_roadmap` (`ork network roadmap --projeto <nome>`, ou `--projeto github:dono/repo` sem clone), com as threads de todas as máquinas, reservas, fonte e hora de cada parte e lacunas, texto como vem; `ork_roadmap_status` (`ork roadmap status --projeto <nome>`) é só desta máquina. Nunca relatório próprio nem dedução pelo board ou panorama: zero threads nunca é roadmap vazio, e lacuna ou "Não consultado" nunca vira "roadmap vazio" nem "nenhuma máquina publicou".
27
+ Status do roadmap: `ork_network_roadmap` (`ork network roadmap --projeto <nome>`, ou `--projeto github:dono/repo` sem clone), com as threads de todas as máquinas, reservas, fonte e hora de cada parte e lacunas, texto como vem; `ork_roadmap_status` (`ork roadmap status --projeto <nome>`) é só desta máquina. Nunca relatório próprio nem dedução pelo board ou panorama: zero threads nunca é roadmap vazio, e lacuna ou "Não consultado" nunca vira "roadmap vazio" nem "nenhuma máquina publicou". As máquinas da pessoa (RM-053): `ork_network_status` (`ork network status`, sem projeto), texto como vem; lacuna nunca vira "nenhuma máquina".
27
28
 
28
29
  ## O que esta skill e
29
30
 
@@ -121,7 +122,7 @@ python3 adapters/hermes/bin/ork-hitl-answer.py ork_session_answer <thread> <pedi
121
122
 
122
123
  O nucleo monta e o Hermes so transporta: (1) UM resumo recorrente com as contagens e
123
124
  `Posso te mandar as perguntas agora?`; (2) o dono responde com o codigo e a letra (`K7QX a`);
124
- (3) com o sim, ate cinco objetivas a–d com uma recomendada, respondidas numa linha (`1a 2c 3b`).
125
+ (3) com o sim, ate cinco objetivas, cada uma com de 3 a 5 alternativas a–e e uma "Recomendação", respondidas numa linha (`1a 2c 3b`).
125
126
  Decisao obvia chega tomada e informada no resumo (`ork decisao registrar`). Cadencia (I-50): so a tag na mensagem (`#OrkPulseOff` 8h, `#OrkPulseOn` 2h, `#OrkPulseOn-15m`, `-30m`, `-60m`); pedida no meio da frase, devolva a tag exata para o dono mandar sozinha.
126
127
 
127
128
  O plugin `orkastery-hitl` registra essas formas, a resposta numerada em prosa curta (`1. B, 2. A`,
@@ -134,8 +135,8 @@ Quando o bloco nao pausa (`#Maestro`, `#Auto`, `#Fast`), o `ork` registra a deci
134
135
 
135
136
  ## Passo 5: a entrega e o MASTER
136
137
 
137
- O MASTER fecha com POSTMORTEM tipado e indice derivado do ledger; `ork master --aceitar-omissao` aceita as
138
- pendentes com registro. Nota do dono: `ork master pedir <thread>` e mande a linha; ele responde `<codigo> 4 porque`
138
+ O MASTER fecha com POSTMORTEM tipado e indice derivado do ledger; `ork master <thread> --aceitar-omissao` aceita a
139
+ entrega da sua thread com registro (sem a thread, aceita tambem as de outras frentes). Nota do dono: `ork master pedir <thread>` e mande a linha; ele responde `<codigo> 4 porque`
139
140
  e o ingresso prova a origem. Nunca `--por` em nome dele: daqui da `master.prova-de-canal` (RM-048).
140
141
 
141
142
  Memoria "degradada" tem dois portoes: a variavel da DSN no ambiente do processo
@@ -2,7 +2,7 @@
2
2
 
3
3
  O OpenClaw recebe o Orkastery como uma **extensao** no formato 2026.7.1: um pacote com
4
4
  `package.json` (`openclaw.extensions: ["./dist/index.js"]`), um entry JS que registra as
5
- **27 tools `ork_*`** via `defineToolPlugin` do SDK do proprio OpenClaw, e o manifesto
5
+ **28 tools `ork_*`** via `defineToolPlugin` do SDK do proprio OpenClaw, e o manifesto
6
6
  `openclaw.plugin.json` gerado (`id`, `activation`, `contracts.tools`). Cada tool e uma
7
7
  chamada de CLI do `ork`, sem regra de negocio no host.
8
8
 
@@ -41,6 +41,9 @@ openclaw plugins install ~/.openclaw/extensions/orkastery # registra explicita
41
41
  # ou aponte plugins.load.paths para o diretorio instalado na config do OpenClaw
42
42
  ```
43
43
 
44
+ O instalador grava o `ork` que roda o install (o caminho real do CLI), nao o primeiro `ork` do
45
+ PATH; com outro `ork` no PATH, a saida avisa com as duas versoes. `--ork <caminho>` escolhe outro.
46
+
44
47
  Se a copia nao passou pelo instalador (placeholder nao renderizado), o entry cai no
45
48
  fallback: usa `ORK_BIN` do ambiente ou o `ork` do PATH.
46
49
 
@@ -66,11 +69,12 @@ fallback: usa `ORK_BIN` do ambiente ou o `ork` do PATH.
66
69
  | `ork_board` | As threads DESTE projeto e o escalonador; nao le o roadmap (zero threads nao e roadmap vazio) |
67
70
  | `ork_roadmap_status` | Status report do roadmap so desta maquina (`ork roadmap status`), transportado como vem |
68
71
  | `ork_network_roadmap` | Roadmap da rede (`ork network roadmap`): o status report com as threads de todas as maquinas, reservas, fonte e hora de cada parte e lacunas; a fonte do status do roadmap |
72
+ | `ork_network_status` | As maquinas da pessoa na Orkastery Network (`ork network status`): a batida de cada uma, forjas, runtimes, hosts e projetos, a fonte e as lacunas; sem `projeto` (RM-054, fatia 3) |
69
73
  | `ork_master_batch` | Todas as entregas, com o indice do ledger (`ork master --todas`; a fila de score saiu na I-43) |
70
74
 
71
75
  ### O projeto de cada chamada (RM-052)
72
76
 
73
- Toda tool aceita `projeto`, o **nome** de um projeto registrado nesta maquina (`ork projetos`),
77
+ Toda tool de projeto aceita `projeto`, o **nome** de um projeto registrado nesta maquina (`ork projetos`),
74
78
  nunca um caminho. Ele vai ao `ork` como `--projeto <nome>`. O adaptador declara
75
79
  `ORK_PROJETO_EXPLICITO=1`: o diretorio do gateway nao escolhe projeto. Sem `projeto` e com mais de
76
80
  um projeto conhecido, a resposta e a escolha tipada `projeto.escolha`, com os candidatos; com um
@@ -89,8 +93,15 @@ nucleo so aceita a forja em `github.com`, `gitlab.com` ou no host de um projeto
89
93
  `projeto`, vem o panorama de todos os projetos do registro, e e o que a frase `orkastery maestro`
90
94
  sem projeto oferece. O projeto do diretorio do gateway so entra se estiver no registro.
91
95
 
92
- Ela e a unica tool do catalogo declarada nos perfis `coding` e `messaging` do OpenClaw
93
- (`toolMetadata.ork_network_roadmap.profiles` no manifesto): com o perfil `coding`, o padrao do
96
+ Na fatia 3, o panorama le tambem a rede por pessoa (RM-053): a casa e as maquinas com a batida de
97
+ cada uma, o projeto que uma maquina da rede declara (que passa a ser pedido pelo nome mesmo sem clone
98
+ nem registro nesta maquina) e a maquina da rede que nao publicou na fabrica do projeto, com as
99
+ threads dela ditas como nao lidas. `ork_network_status` (sem `projeto`) devolve a rede inteira, como
100
+ `ork network status`. Com o `gh` fora do PATH do gateway (em `~/.local/bin`, por exemplo), o `ork`
101
+ o acha nas pastas de usuario, como a rede.
102
+
103
+ Ela e `ork_network_status` (fatia 3) sao as unicas tools do catalogo declaradas nos perfis `coding` e
104
+ `messaging` do OpenClaw (`toolMetadata` no manifesto): com o perfil `coding`, o padrao do
94
105
  onboarding, as tools de plugin so chegam ao modelo quando o manifesto as declara no perfil ou o
95
106
  operador as libera. Sem isso o modelo nao ve tool `ork_*` nenhuma e vai ao `ork` pelo shell, como
96
107
  no incidente de 29/09. As outras tools continuam sob escolha do operador:
@@ -200,6 +211,15 @@ recomendação e opções rotuladas, sem UUID exposto. Telegram é opcional; ing
200
211
  nativo adicional só fica disponível após prova do callback e configuração do host.
201
212
  Instalação fixture/SDK simulado não comprova ativação em uma sessão real.
202
213
 
214
+ HITL de condução é seleção (RM-057, nas descrições de `ork_modo_do_pedido`,
215
+ `ork_maestro`, `ork_phase_run`, `ork_network_roadmap` e `ork_network_status`; as duas de rede são as
216
+ únicas que o perfil `coding` expõe, e com elas a regra chega ao modelo sem `tools.alsoAllow`): de 3 a 5 alternativas, exatamente uma com o selo
217
+ "Recomendação". Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido
218
+ que ele colou com autorização explícita vale como instrução dele, dentro dessa autorização.
219
+ Dúvida dentro da autorização vira `ork decisao registrar` e a thread segue. Texto só quando a
220
+ fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: mostre o
221
+ comando exato.
222
+
203
223
  Na callback autenticada, `/ork offer <thread> <pedido>` consulta a pergunta e a
204
224
  oferta nativa sem responder ao pedido. O gateway assina uma prova efêmera da
205
225
  mensagem e chama `gate context --native-offer-stdin`; só uma prova válida para
@@ -23,8 +23,8 @@ const PULSE_ALVO = 'pulse', PULSE_ENDERECO = 'resposta';
23
23
  * listening window is open: outside it, the word goes to the assistant, as it always did. The
24
24
  * window is a routing hint, not proof: the message still goes through the signature and the core rule.
25
25
  */
26
- const PULSE_LISTA = new RegExp("^[ \\t]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-d]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?)(?:[ \\t\\r\\n,;]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-d]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))*[ \\t]*(?:[.!][ \\t]*)?$", 'i');
27
- const PULSE_LIVRE = new RegExp("^[ \\t]*(?:[1-4]|(?:[a-d]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))[ \\t]*(?:[.!]+[ \\t]*)?$", 'i');
26
+ const PULSE_LISTA = new RegExp("^[ \\t]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?)(?:[ \\t\\r\\n,;]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))*[ \\t]*(?:[.!][ \\t]*)?$", 'i');
27
+ const PULSE_LIVRE = new RegExp("^[ \\t]*(?:[1-5]|(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))[ \\t]*(?:[.!]+[ \\t]*)?$", 'i');
28
28
  /** RM-048 (item 8): the digest keyboard line goes to the core at the same signed address. */
29
29
  const PULSE_RATIFICACAO = new RegExp("^[ \\t]*ratificar(?:-lote)?(?:[ \\t]+[A-Za-z0-9._-]{1,80}){2,3}[ \\t]*$", 'i');
30
30
  /** Text above this is never tested against the shapes: they run before the allowlist. */
@@ -185,10 +185,22 @@ const PROJETO_DA_REDE = {
185
185
  descricao: 'Projeto que o dono pediu: o nome, como em `ork projetos` (ex.: orkastery), ou a forja (github:dono/repo, gitlab:grupo/repo) quando não há clone nesta máquina. Sem ele, vêm todos os projetos conhecidos. Nunca caminho nem URL.',
186
186
  recusa: 'informe o NOME de um projeto de `ork projetos` (ex.: orkastery) ou github:dono/repo, nunca caminho nem URL',
187
187
  };
188
+ /**
189
+ * RM-057 (fatia 2): a regra do HITL de conducao, a mesma frase dos adaptadores do Claude Code e do
190
+ * Codex (fatia 1). No OpenClaw o modelo so le as descricoes das tools: ela vai nas que recebem o
191
+ * pedido do dono (ork_modo_do_pedido), apresentam o panorama (ork_maestro) e despacham fase. Ensaio
192
+ * de 03/10: no perfil `coding` o modelo so ve as tools do `toolMetadata` (ork_network_roadmap e
193
+ * ork_network_status), entao a regra vai tambem nelas, sem ampliar o que o perfil expoe.
194
+ */
195
+ const REGRA_HITL_DE_CONDUCAO = 'HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo "Recomendação". ' +
196
+ 'Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido que ele colou com autorização ' +
197
+ 'explícita vale como instrução dele, dentro dessa autorização. Dúvida dentro da autorização vira `ork decisao registrar` ' +
198
+ 'e a thread segue. Texto só quando a fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: ' +
199
+ 'mostre o comando exato.';
188
200
  const FERRAMENTAS = [
189
201
  {
190
202
  name: 'ork_maestro',
191
- description: 'Ao receber a frase exata orkastery maestro: sem projeto nomeado, chame ork_network_roadmap sem projeto (o panorama da rede, com fontes, frescor e lacunas) e apresente-o como vem; com projeto nomeado, consulte este panorama somente leitura com projeto. Não cria thread. Apresente fontes, lacunas e HITL com recomendação e opções claras; horários para o dono vêm dos campos *Local (fuso do dono), nunca do ISO. O panorama NÃO lê o roadmap, as reservas nem as outras máquinas (veja notConsulted): zero threads nunca é roadmap vazio; para o roadmap use ork_network_roadmap. Ação posterior exige operação autorizada e readback.',
203
+ description: 'Ao receber a frase exata orkastery maestro: sem projeto nomeado, chame ork_network_roadmap sem projeto (o panorama da rede, com fontes, frescor e lacunas) e apresente-o como vem; com projeto nomeado, consulte este panorama somente leitura com projeto. Não cria thread. Apresente fontes, lacunas e HITL com recomendação e opções claras; horários para o dono vêm dos campos *Local (fuso do dono), nunca do ISO. O panorama NÃO lê o roadmap, as reservas nem as outras máquinas (veja notConsulted): zero threads nunca é roadmap vazio; para o roadmap use ork_network_roadmap. Ação posterior exige operação autorizada e readback. ' + REGRA_HITL_DE_CONDUCAO,
192
204
  parameters: { type: 'object', additionalProperties: false, properties: {
193
205
  thread: { type: 'string' }, section: { type: 'string', enum: ['portfolio', 'demands', 'threads', 'sessions', 'blockers', 'leases', 'retries', 'hitl', 'ship', 'master', 'nextActions'] },
194
206
  offset: { type: 'integer', minimum: 0, maximum: 100000 },
@@ -228,7 +240,7 @@ const FERRAMENTAS = [
228
240
  },
229
241
  {
230
242
  name: 'ork_modo_do_pedido',
231
- description: 'Le a #TAG de conducao do pedido do builder (#Classic, #Maestro, #Auto, #Fast) e devolve o modo. #TAG aposentada (#Look, #Ork) recebe recusa tipada modo.aposentado, com saida != 0, em vez de virar o default em silencio. Sem tag, devolve o conduction.default_mode do manifesto. Use SEMPRE este tool em vez de reconhecer a tag no host.',
243
+ description: 'Le a #TAG de conducao do pedido do builder (#Classic, #Maestro, #Auto, #Fast) e devolve o modo. #TAG aposentada (#Look, #Ork) recebe recusa tipada modo.aposentado, com saida != 0, em vez de virar o default em silencio. Sem tag, devolve o conduction.default_mode do manifesto. Use SEMPRE este tool em vez de reconhecer a tag no host. ' + REGRA_HITL_DE_CONDUCAO,
232
244
  parameters: schema({
233
245
  pedido: { type: 'string', description: 'O texto inteiro do pedido do builder' },
234
246
  }),
@@ -262,12 +274,18 @@ const FERRAMENTAS = [
262
274
  },
263
275
  {
264
276
  name: 'ork_phase_run',
265
- description: 'Despacha uma fase (GOAL PLAN GO CHECK SHIP MASTER) pelo runtime adapter, gravando o prompt exato com sha256 no ledger.',
266
- parameters: schema({
267
- thread: { type: 'string' },
268
- fase: { type: 'string', enum: ['GOAL', 'PLAN', 'GO', 'CHECK', 'SHIP', 'MASTER'] },
269
- prompt: { type: 'string', description: 'O pedido do builder para esta fase' },
270
- }),
277
+ description: 'Despacha uma fase (GOAL PLAN GO CHECK SHIP MASTER) pelo runtime adapter, gravando o prompt exato com sha256 no ledger. ' +
278
+ REGRA_HITL_DE_CONDUCAO,
279
+ parameters: {
280
+ type: 'object', additionalProperties: false, required: ['thread', 'fase', 'prompt'],
281
+ properties: {
282
+ thread: { type: 'string' },
283
+ fase: { type: 'string', enum: ['GOAL', 'PLAN', 'GO', 'CHECK', 'SHIP', 'MASTER'] },
284
+ prompt: { type: 'string', description: 'O pedido do builder para esta fase' },
285
+ // RM-056: a conta do despacho; o nucleo recusa perfil inexistente, de outro runtime, esgotado ou sem login.
286
+ perfil: { type: 'string', description: 'id do perfil de conta (ork accounts list); omita para o rodizio do nucleo' },
287
+ },
288
+ },
271
289
  argv: (p) => [
272
290
  'phase',
273
291
  'run',
@@ -275,6 +293,7 @@ const FERRAMENTAS = [
275
293
  texto(p, 'fase'),
276
294
  '--prompt',
277
295
  texto(p, 'prompt'),
296
+ ...(p.perfil === undefined ? [] : ['--perfil', texto(p, 'perfil')]),
278
297
  ],
279
298
  },
280
299
  {
@@ -428,12 +447,20 @@ const FERRAMENTAS = [
428
447
  },
429
448
  {
430
449
  name: 'ork_network_roadmap',
431
- description: 'Roadmap da rede, somente leitura: para cada projeto, o status report do roadmap (RM-048) com as threads de TODAS as máquinas, as reservas, as threads por máquina com a idade da batida, a fonte e a hora de cada parte e as lacunas. É a fonte para qualquer pergunta sobre o roadmap ou o status report: transporte o texto como vem, sem reescrever nem resumir. Passe projeto com o nome que o dono pediu (ex.: orkastery) ou github:dono/repo; sem projeto, vêm todos os projetos conhecidos, e esse é o panorama da frase orkastery maestro sem projeto. Lacuna, "não lido" e "Não consultado" são fontes que ficaram sem leitura: nunca conclua "roadmap vazio" nem "nenhuma máquina publicou" a partir delas.',
450
+ description: 'Roadmap da rede, somente leitura: para cada projeto, o status report do roadmap (RM-048) com as threads de TODAS as máquinas, as reservas, as threads por máquina com a idade da batida, a fonte e a hora de cada parte e as lacunas. É a fonte para qualquer pergunta sobre o roadmap ou o status report: transporte o texto como vem, sem reescrever nem resumir. Passe projeto com o nome que o dono pediu (ex.: orkastery) ou github:dono/repo; sem projeto, vêm todos os projetos conhecidos, e esse é o panorama da frase orkastery maestro sem projeto. Lacuna, "não lido" e "Não consultado" são fontes que ficaram sem leitura: nunca conclua "roadmap vazio" nem "nenhuma máquina publicou" a partir delas. ' + REGRA_HITL_DE_CONDUCAO,
432
451
  parameters: schema({}),
433
452
  projeto: PROJETO_DA_REDE,
434
453
  // RM-054 (fatia 2): uma chamada de CLI; o `--projeto` vai no inicio e o nucleo o devolve ao `network`.
435
454
  argv: () => ['network', 'roadmap'],
436
455
  },
456
+ {
457
+ name: 'ork_network_status',
458
+ description: 'Status da Orkastery Network, somente leitura: as máquinas da pessoa (a casa privada na forja), com a batida de cada uma, a forja e o login, os runtimes e hosts com versão e os projetos que cada uma declara, mais a fonte e as lacunas. É a fonte para "quais máquinas eu tenho" e "qual máquina está parada": transporte o texto como vem. Lacuna e "Não consultado" são o que não foi lido: nunca conclua "nenhuma máquina" nem "rede vazia" a partir delas. Não lê roadmap nem threads: para isso, ork_network_roadmap. ' + REGRA_HITL_DE_CONDUCAO,
459
+ parameters: schema({}),
460
+ semProjeto: true,
461
+ // RM-054 (fatia 3): uma chamada de CLI; a rede e da pessoa e nao recebe `--projeto`.
462
+ argv: () => ['network', 'status'],
463
+ },
437
464
  {
438
465
  name: 'ork_master_batch',
439
466
  description: 'Todas as entregas em JSON, com o indice derivado do ledger, as ja pontuadas e as aceitas por omissao. Roda ork master --todas; o nome e da antiga fila de score (ork master --batch), aposentada na I-43.',
@@ -443,6 +470,8 @@ const FERRAMENTAS = [
443
470
  ];
444
471
  /** RM-052: toda tool aceita `projeto` opcional, sem mudar o que ela ja exigia. */
445
472
  function comProjeto(f) {
473
+ if (f.semProjeto)
474
+ return f.parameters;
446
475
  const propriedades = (f.parameters.properties ?? {});
447
476
  const p = f.projeto;
448
477
  const projeto = p ? { type: 'string', pattern: p.padrao.source, description: p.descricao } : PARAMETRO_PROJETO;
@@ -451,6 +480,12 @@ function comProjeto(f) {
451
480
  /** `--projeto <nome>` vai no inicio do argv; o resto dos parametros segue para a tool como antes. */
452
481
  function argvComProjeto(f, params) {
453
482
  const { projeto, ...resto } = params;
483
+ if (f.semProjeto) {
484
+ // A tool sem `projeto` recusa o parametro em vez de ignora-lo: o modelo saberia que a rede veio filtrada.
485
+ if (projeto !== undefined)
486
+ throw new Error('projeto.invalido');
487
+ return { argv: f.argv(resto), resto };
488
+ }
454
489
  if (projeto !== undefined && (typeof projeto !== 'string' || !(f.projeto ?? PROJETO_DA_RM052).padrao.test(projeto))) {
455
490
  throw new Error('projeto.invalido');
456
491
  }
@@ -459,7 +494,7 @@ function argvComProjeto(f, params) {
459
494
  const plugin = defineToolPlugin({
460
495
  id: 'orkastery',
461
496
  name: 'Orkastery',
462
- description: 'Conducao de looping threads em 6 fases pelo nucleo `ork`, exposta ao OpenClaw como tools `ork_*`. Zero regra de negocio no host: cada tool e uma chamada de CLI. Toda tool aceita projeto (nome do projeto pedido); o cwd do gateway nunca escolhe o projeto. O status do roadmap vem de ork_network_roadmap.',
497
+ description: 'Conducao de looping threads em 6 fases pelo nucleo `ork`, exposta ao OpenClaw como tools `ork_*`. Zero regra de negocio no host: cada tool e uma chamada de CLI. Toda tool de projeto aceita projeto (nome do projeto pedido); o cwd do gateway nunca escolhe o projeto. O status do roadmap vem de ork_network_roadmap; as maquinas da pessoa, de ork_network_status (sem projeto).',
463
498
  tools: (tool) => FERRAMENTAS.map((f) => tool({
464
499
  name: f.name,
465
500
  description: f.description,
@@ -471,7 +506,7 @@ const plugin = defineToolPlugin({
471
506
  }
472
507
  catch (e) {
473
508
  if (e.message === 'projeto.invalido') {
474
- return `[ork recusou] projeto.invalido: ${(f.projeto ?? PROJETO_DA_RM052).recusa}`;
509
+ return `[ork recusou] projeto.invalido: ${f.semProjeto ? 'esta tool é da rede da pessoa e não recebe projeto; chame sem projeto' : (f.projeto ?? PROJETO_DA_RM052).recusa}`;
475
510
  }
476
511
  return '[ork recusou] resposta humana não confirmada; confira origem e correlação do pedido';
477
512
  }
@@ -2,7 +2,7 @@
2
2
  "id": "orkastery",
3
3
  "name": "Orkastery",
4
4
  "description": "Conducao de looping threads em 6 fases pelo nucleo `ork`, exposta ao OpenClaw como tools `ork_*`. Zero regra de negocio no host: cada tool e uma chamada de CLI.",
5
- "version": "0.5.1",
5
+ "version": "0.5.3",
6
6
  "configSchema": {
7
7
  "type": "object",
8
8
  "properties": {},
@@ -39,12 +39,16 @@
39
39
  "ork_board",
40
40
  "ork_roadmap_status",
41
41
  "ork_network_roadmap",
42
+ "ork_network_status",
42
43
  "ork_master_batch"
43
44
  ]
44
45
  },
45
46
  "toolMetadata": {
46
47
  "ork_network_roadmap": {
47
48
  "profiles": ["coding", "messaging"]
49
+ },
50
+ "ork_network_status": {
51
+ "profiles": ["coding", "messaging"]
48
52
  }
49
53
  }
50
54
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orkastery/openclaw-plugin",
3
- "version": "0.5.1",
4
- "description": "Plugin Orkastery para OpenClaw: 27 tools ork_* que traduzem intencao em chamada de CLI do nucleo `ork`. Zero regra de negocio no host.",
3
+ "version": "0.5.3",
4
+ "description": "Plugin Orkastery para OpenClaw: 28 tools ork_* que traduzem intencao em chamada de CLI do nucleo `ork`. Zero regra de negocio no host.",
5
5
  "type": "module",
6
6
  "private": true,
7
7
  "license": "MIT",
@@ -32,8 +32,8 @@ const PULSE_ALVO = 'pulse', PULSE_ENDERECO = 'resposta';
32
32
  * listening window is open: outside it, the word goes to the assistant, as it always did. The
33
33
  * window is a routing hint, not proof: the message still goes through the signature and the core rule.
34
34
  */
35
- const PULSE_LISTA = new RegExp("^[ \\t]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-d]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?)(?:[ \\t\\r\\n,;]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-d]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))*[ \\t]*(?:[.!][ \\t]*)?$", 'i');
36
- const PULSE_LIVRE = new RegExp("^[ \\t]*(?:[1-4]|(?:[a-d]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))[ \\t]*(?:[.!]+[ \\t]*)?$", 'i');
35
+ const PULSE_LISTA = new RegExp("^[ \\t]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?)(?:[ \\t\\r\\n,;]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))*[ \\t]*(?:[.!][ \\t]*)?$", 'i');
36
+ const PULSE_LIVRE = new RegExp("^[ \\t]*(?:[1-5]|(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))[ \\t]*(?:[.!]+[ \\t]*)?$", 'i');
37
37
  /** RM-048 (item 8): the digest keyboard line goes to the core at the same signed address. */
38
38
  const PULSE_RATIFICACAO = new RegExp("^[ \\t]*ratificar(?:-lote)?(?:[ \\t]+[A-Za-z0-9._-]{1,80}){2,3}[ \\t]*$", 'i');
39
39
  /** Text above this is never tested against the shapes: they run before the allowlist. */
@@ -189,6 +189,20 @@ const PROJETO_DA_REDE: ProjetoDaTool = {
189
189
  recusa: 'informe o NOME de um projeto de `ork projetos` (ex.: orkastery) ou github:dono/repo, nunca caminho nem URL',
190
190
  };
191
191
 
192
+ /**
193
+ * RM-057 (fatia 2): a regra do HITL de conducao, a mesma frase dos adaptadores do Claude Code e do
194
+ * Codex (fatia 1). No OpenClaw o modelo so le as descricoes das tools: ela vai nas que recebem o
195
+ * pedido do dono (ork_modo_do_pedido), apresentam o panorama (ork_maestro) e despacham fase. Ensaio
196
+ * de 03/10: no perfil `coding` o modelo so ve as tools do `toolMetadata` (ork_network_roadmap e
197
+ * ork_network_status), entao a regra vai tambem nelas, sem ampliar o que o perfil expoe.
198
+ */
199
+ const REGRA_HITL_DE_CONDUCAO =
200
+ 'HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo "Recomendação". ' +
201
+ 'Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido que ele colou com autorização ' +
202
+ 'explícita vale como instrução dele, dentro dessa autorização. Dúvida dentro da autorização vira `ork decisao registrar` ' +
203
+ 'e a thread segue. Texto só quando a fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: ' +
204
+ 'mostre o comando exato.';
205
+
192
206
  /** Catálogo em paridade nome a nome com o manifesto; aprovação genérica legada aposentada. */
193
207
  interface FerramentaOrk {
194
208
  name: string;
@@ -198,12 +212,14 @@ interface FerramentaOrk {
198
212
  entrada?: (params: Record<string, unknown>) => string;
199
213
  /** O `projeto` desta tool, quando nao e o da RM-052 (so nome). */
200
214
  projeto?: ProjetoDaTool;
215
+ /** RM-054 (fatia 3): a tool e da pessoa, nao de um projeto (`ork network status`); sem `projeto`. */
216
+ semProjeto?: true;
201
217
  }
202
218
 
203
219
  const FERRAMENTAS: FerramentaOrk[] = [
204
220
  {
205
221
  name: 'ork_maestro',
206
- description: 'Ao receber a frase exata orkastery maestro: sem projeto nomeado, chame ork_network_roadmap sem projeto (o panorama da rede, com fontes, frescor e lacunas) e apresente-o como vem; com projeto nomeado, consulte este panorama somente leitura com projeto. Não cria thread. Apresente fontes, lacunas e HITL com recomendação e opções claras; horários para o dono vêm dos campos *Local (fuso do dono), nunca do ISO. O panorama NÃO lê o roadmap, as reservas nem as outras máquinas (veja notConsulted): zero threads nunca é roadmap vazio; para o roadmap use ork_network_roadmap. Ação posterior exige operação autorizada e readback.',
222
+ description: 'Ao receber a frase exata orkastery maestro: sem projeto nomeado, chame ork_network_roadmap sem projeto (o panorama da rede, com fontes, frescor e lacunas) e apresente-o como vem; com projeto nomeado, consulte este panorama somente leitura com projeto. Não cria thread. Apresente fontes, lacunas e HITL com recomendação e opções claras; horários para o dono vêm dos campos *Local (fuso do dono), nunca do ISO. O panorama NÃO lê o roadmap, as reservas nem as outras máquinas (veja notConsulted): zero threads nunca é roadmap vazio; para o roadmap use ork_network_roadmap. Ação posterior exige operação autorizada e readback. ' + REGRA_HITL_DE_CONDUCAO,
207
223
  parameters: { type: 'object', additionalProperties: false, properties: {
208
224
  thread: { type: 'string' }, section: { type: 'string', enum: ['portfolio','demands','threads','sessions','blockers','leases','retries','hitl','ship','master','nextActions'] },
209
225
  offset: { type: 'integer', minimum: 0, maximum: 100000 },
@@ -245,7 +261,7 @@ const FERRAMENTAS: FerramentaOrk[] = [
245
261
  {
246
262
  name: 'ork_modo_do_pedido',
247
263
  description:
248
- 'Le a #TAG de conducao do pedido do builder (#Classic, #Maestro, #Auto, #Fast) e devolve o modo. #TAG aposentada (#Look, #Ork) recebe recusa tipada modo.aposentado, com saida != 0, em vez de virar o default em silencio. Sem tag, devolve o conduction.default_mode do manifesto. Use SEMPRE este tool em vez de reconhecer a tag no host.',
264
+ 'Le a #TAG de conducao do pedido do builder (#Classic, #Maestro, #Auto, #Fast) e devolve o modo. #TAG aposentada (#Look, #Ork) recebe recusa tipada modo.aposentado, com saida != 0, em vez de virar o default em silencio. Sem tag, devolve o conduction.default_mode do manifesto. Use SEMPRE este tool em vez de reconhecer a tag no host. ' + REGRA_HITL_DE_CONDUCAO,
249
265
  parameters: schema({
250
266
  pedido: { type: 'string', description: 'O texto inteiro do pedido do builder' },
251
267
  }),
@@ -281,12 +297,18 @@ const FERRAMENTAS: FerramentaOrk[] = [
281
297
  {
282
298
  name: 'ork_phase_run',
283
299
  description:
284
- 'Despacha uma fase (GOAL PLAN GO CHECK SHIP MASTER) pelo runtime adapter, gravando o prompt exato com sha256 no ledger.',
285
- parameters: schema({
286
- thread: { type: 'string' },
287
- fase: { type: 'string', enum: ['GOAL', 'PLAN', 'GO', 'CHECK', 'SHIP', 'MASTER'] },
288
- prompt: { type: 'string', description: 'O pedido do builder para esta fase' },
289
- }),
300
+ 'Despacha uma fase (GOAL PLAN GO CHECK SHIP MASTER) pelo runtime adapter, gravando o prompt exato com sha256 no ledger. ' +
301
+ REGRA_HITL_DE_CONDUCAO,
302
+ parameters: {
303
+ type: 'object', additionalProperties: false, required: ['thread', 'fase', 'prompt'],
304
+ properties: {
305
+ thread: { type: 'string' },
306
+ fase: { type: 'string', enum: ['GOAL', 'PLAN', 'GO', 'CHECK', 'SHIP', 'MASTER'] },
307
+ prompt: { type: 'string', description: 'O pedido do builder para esta fase' },
308
+ // RM-056: a conta do despacho; o nucleo recusa perfil inexistente, de outro runtime, esgotado ou sem login.
309
+ perfil: { type: 'string', description: 'id do perfil de conta (ork accounts list); omita para o rodizio do nucleo' },
310
+ },
311
+ },
290
312
  argv: (p) => [
291
313
  'phase',
292
314
  'run',
@@ -294,6 +316,7 @@ const FERRAMENTAS: FerramentaOrk[] = [
294
316
  texto(p, 'fase'),
295
317
  '--prompt',
296
318
  texto(p, 'prompt'),
319
+ ...(p.perfil === undefined ? [] : ['--perfil', texto(p, 'perfil')]),
297
320
  ],
298
321
  },
299
322
  {
@@ -458,12 +481,21 @@ const FERRAMENTAS: FerramentaOrk[] = [
458
481
  {
459
482
  name: 'ork_network_roadmap',
460
483
  description:
461
- 'Roadmap da rede, somente leitura: para cada projeto, o status report do roadmap (RM-048) com as threads de TODAS as máquinas, as reservas, as threads por máquina com a idade da batida, a fonte e a hora de cada parte e as lacunas. É a fonte para qualquer pergunta sobre o roadmap ou o status report: transporte o texto como vem, sem reescrever nem resumir. Passe projeto com o nome que o dono pediu (ex.: orkastery) ou github:dono/repo; sem projeto, vêm todos os projetos conhecidos, e esse é o panorama da frase orkastery maestro sem projeto. Lacuna, "não lido" e "Não consultado" são fontes que ficaram sem leitura: nunca conclua "roadmap vazio" nem "nenhuma máquina publicou" a partir delas.',
484
+ 'Roadmap da rede, somente leitura: para cada projeto, o status report do roadmap (RM-048) com as threads de TODAS as máquinas, as reservas, as threads por máquina com a idade da batida, a fonte e a hora de cada parte e as lacunas. É a fonte para qualquer pergunta sobre o roadmap ou o status report: transporte o texto como vem, sem reescrever nem resumir. Passe projeto com o nome que o dono pediu (ex.: orkastery) ou github:dono/repo; sem projeto, vêm todos os projetos conhecidos, e esse é o panorama da frase orkastery maestro sem projeto. Lacuna, "não lido" e "Não consultado" são fontes que ficaram sem leitura: nunca conclua "roadmap vazio" nem "nenhuma máquina publicou" a partir delas. ' + REGRA_HITL_DE_CONDUCAO,
462
485
  parameters: schema({}),
463
486
  projeto: PROJETO_DA_REDE,
464
487
  // RM-054 (fatia 2): uma chamada de CLI; o `--projeto` vai no inicio e o nucleo o devolve ao `network`.
465
488
  argv: () => ['network', 'roadmap'],
466
489
  },
490
+ {
491
+ name: 'ork_network_status',
492
+ description:
493
+ 'Status da Orkastery Network, somente leitura: as máquinas da pessoa (a casa privada na forja), com a batida de cada uma, a forja e o login, os runtimes e hosts com versão e os projetos que cada uma declara, mais a fonte e as lacunas. É a fonte para "quais máquinas eu tenho" e "qual máquina está parada": transporte o texto como vem. Lacuna e "Não consultado" são o que não foi lido: nunca conclua "nenhuma máquina" nem "rede vazia" a partir delas. Não lê roadmap nem threads: para isso, ork_network_roadmap. ' + REGRA_HITL_DE_CONDUCAO,
494
+ parameters: schema({}),
495
+ semProjeto: true,
496
+ // RM-054 (fatia 3): uma chamada de CLI; a rede e da pessoa e nao recebe `--projeto`.
497
+ argv: () => ['network', 'status'],
498
+ },
467
499
  {
468
500
  name: 'ork_master_batch',
469
501
  description:
@@ -475,6 +507,7 @@ const FERRAMENTAS: FerramentaOrk[] = [
475
507
 
476
508
  /** RM-052: toda tool aceita `projeto` opcional, sem mudar o que ela ja exigia. */
477
509
  function comProjeto(f: FerramentaOrk): Record<string, unknown> {
510
+ if (f.semProjeto) return f.parameters;
478
511
  const propriedades = (f.parameters.properties ?? {}) as Record<string, unknown>;
479
512
  const p = f.projeto;
480
513
  const projeto = p ? { type: 'string', pattern: p.padrao.source, description: p.descricao } : PARAMETRO_PROJETO;
@@ -484,6 +517,11 @@ function comProjeto(f: FerramentaOrk): Record<string, unknown> {
484
517
  /** `--projeto <nome>` vai no inicio do argv; o resto dos parametros segue para a tool como antes. */
485
518
  function argvComProjeto(f: FerramentaOrk, params: Record<string, unknown>): { argv: string[]; resto: Record<string, unknown> } {
486
519
  const { projeto, ...resto } = params;
520
+ if (f.semProjeto) {
521
+ // A tool sem `projeto` recusa o parametro em vez de ignora-lo: o modelo saberia que a rede veio filtrada.
522
+ if (projeto !== undefined) throw new Error('projeto.invalido');
523
+ return { argv: f.argv(resto), resto };
524
+ }
487
525
  if (projeto !== undefined && (typeof projeto !== 'string' || !(f.projeto ?? PROJETO_DA_RM052).padrao.test(projeto))) {
488
526
  throw new Error('projeto.invalido');
489
527
  }
@@ -494,7 +532,7 @@ const plugin = defineToolPlugin({
494
532
  id: 'orkastery',
495
533
  name: 'Orkastery',
496
534
  description:
497
- 'Conducao de looping threads em 6 fases pelo nucleo `ork`, exposta ao OpenClaw como tools `ork_*`. Zero regra de negocio no host: cada tool e uma chamada de CLI. Toda tool aceita projeto (nome do projeto pedido); o cwd do gateway nunca escolhe o projeto. O status do roadmap vem de ork_network_roadmap.',
535
+ 'Conducao de looping threads em 6 fases pelo nucleo `ork`, exposta ao OpenClaw como tools `ork_*`. Zero regra de negocio no host: cada tool e uma chamada de CLI. Toda tool de projeto aceita projeto (nome do projeto pedido); o cwd do gateway nunca escolhe o projeto. O status do roadmap vem de ork_network_roadmap; as maquinas da pessoa, de ork_network_status (sem projeto).',
498
536
  tools: (tool) =>
499
537
  FERRAMENTAS.map((f) =>
500
538
  tool({
@@ -506,7 +544,7 @@ const plugin = defineToolPlugin({
506
544
  try { chamada = argvComProjeto(f, params); }
507
545
  catch (e) {
508
546
  if ((e as Error).message === 'projeto.invalido') {
509
- return `[ork recusou] projeto.invalido: ${(f.projeto ?? PROJETO_DA_RM052).recusa}`;
547
+ return `[ork recusou] projeto.invalido: ${f.semProjeto ? 'esta tool é da rede da pessoa e não recebe projeto; chame sem projeto' : (f.projeto ?? PROJETO_DA_RM052).recusa}`;
510
548
  }
511
549
  return '[ork recusou] resposta humana não confirmada; confira origem e correlação do pedido';
512
550
  }