@orkastery/cli 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +11 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +3 -1
- package/adapters/claude-code/agents/ork-check.md +1 -1
- package/adapters/claude-code/agents/ork-go.md +2 -2
- package/adapters/claude-code/agents/ork-goal.md +1 -1
- package/adapters/claude-code/agents/ork-master.md +1 -1
- package/adapters/claude-code/agents/ork-plan.md +1 -1
- package/adapters/claude-code/agents/ork-ship.md +1 -1
- package/adapters/claude-code/commands/master.md +11 -8
- package/adapters/claude-code/commands/ork.md +8 -0
- package/adapters/claude-code/commands/ship.md +2 -2
- package/adapters/codex/skills/ork/SKILL.md +12 -1
- package/adapters/hermes/README.md +3 -0
- package/adapters/hermes/bin/ork-abrir-thread.sh +17 -2
- package/adapters/hermes/bin/ork-brain.sh +3 -0
- package/adapters/hermes/bin/ork-maestro.sh +4 -1
- package/adapters/hermes/bin/ork-network-roadmap.sh +11 -0
- package/adapters/hermes/bin/ork-roadmap-status.sh +9 -0
- package/adapters/hermes/hermes.plugin.json +2 -0
- package/adapters/hermes/hitl-ingress/__init__.py +36 -3
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +19 -20
- package/adapters/openclaw/README.md +34 -2
- package/adapters/openclaw/dist/hitl-ingress.js +37 -3
- package/adapters/openclaw/dist/index.js +92 -20
- package/adapters/openclaw/openclaw.plugin.json +10 -1
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +32 -3
- package/adapters/openclaw/src/index.ts +108 -20
- package/assets/docs/padroes/documentacao-de-produto.md +2 -2
- package/assets/docs/padroes/roadmap-de-produto.md +1 -1
- package/assets/docs/produto/_modelo-feature.md +2 -0
- package/assets/orkmind_bridge.py +214 -1
- package/dist/adapters/claude-bg.js +6 -3
- package/dist/board.js +74 -0
- package/dist/branch-de-estado.js +5 -4
- package/dist/busca-semantica.js +161 -0
- package/dist/ci.js +141 -10
- package/dist/company-brain-cli.js +27 -2
- package/dist/company-brain-context.js +132 -0
- package/dist/company-brain-dossie.js +376 -0
- package/dist/company-brain-mcp.js +4 -1
- package/dist/conducao.js +71 -18
- package/dist/decisao-autonoma.js +42 -0
- package/dist/docs.js +64 -22
- package/dist/doctor.js +33 -0
- package/dist/entrega-pr.js +109 -5
- package/dist/experiencia-instalacao.js +256 -0
- package/dist/experiencia.js +72 -0
- package/dist/fabrica-estado.js +43 -10
- package/dist/fechamento.js +105 -0
- package/dist/forja.js +435 -0
- package/dist/gates.js +9 -1
- package/dist/hitl-classificacao.js +11 -1
- package/dist/hitl-contract.js +50 -7
- package/dist/hitl-curto.js +158 -0
- package/dist/hitl-gates.js +67 -1
- package/dist/hitl-lote.js +30 -15
- package/dist/hitl-presentation.js +10 -7
- package/dist/hitl-resumo.js +33 -12
- package/dist/hitl-texto-livre.js +150 -0
- package/dist/hosts.js +86 -1
- package/dist/index.js +602 -38
- package/dist/indice-vetorial.js +317 -0
- package/dist/init.js +13 -0
- package/dist/integracoes-locais.js +1 -1
- package/dist/intelligence-benchmark-contract.js +570 -0
- package/dist/intelligence-graph-cli.js +430 -0
- package/dist/intelligence-graph-contract.js +577 -0
- package/dist/intelligence-graph-extract-md.js +469 -0
- package/dist/intelligence-graph-extract-ts.js +810 -0
- package/dist/intelligence-graph-extract.js +369 -0
- package/dist/intelligence-graph-index.js +512 -0
- package/dist/intelligence-graph-parsers.js +327 -0
- package/dist/intelligence-graph-query.js +344 -0
- package/dist/intelligence-graph-repo.js +187 -0
- package/dist/leases.js +84 -0
- package/dist/ledger.js +14 -0
- package/dist/maestro-cli.js +10 -1
- package/dist/maestro-contract.js +5 -1
- package/dist/maestro-discovery.js +16 -2
- package/dist/maestro-snapshot.js +6 -2
- package/dist/manifest.js +142 -5
- package/dist/master-batch.js +3 -2
- package/dist/master-digest.js +2 -2
- package/dist/master-nota.js +203 -0
- package/dist/master.js +4 -0
- package/dist/mcp-experiencia.js +164 -0
- package/dist/mcp-git.js +4 -0
- package/dist/mcp-install.js +3 -1
- package/dist/mcp-maestro.js +3 -2
- package/dist/mcp-server.js +84 -5
- package/dist/memoria.js +147 -1
- package/dist/network-roadmap.js +907 -0
- package/dist/ocupacao.js +38 -2
- package/dist/onboarding.js +113 -7
- package/dist/orkmind.js +165 -9
- package/dist/phase.js +166 -13
- package/dist/policies.js +2 -0
- package/dist/projeto-alvo.js +551 -0
- package/dist/prompts.js +1 -1
- package/dist/pulse-consentimento.js +4 -2
- package/dist/pulse-delivery.js +5 -0
- package/dist/pulse-resposta.js +674 -49
- package/dist/pulse.js +21 -0
- package/dist/retry.js +51 -8
- package/dist/roadmap-reservas.js +262 -20
- package/dist/roadmap-status.js +213 -0
- package/dist/thread-close.js +3 -0
- package/dist/verify.js +4 -3
- package/eval/casos/orchestration-experience-pt-br.json +48 -0
- package/eval/casos/orchestration-experience.json +48 -0
- package/package.json +1 -1
- package/schemas/code-artifact-graph.v1.schema.json +581 -0
- package/schemas/graph-benchmark.v1.schema.json +2240 -0
- package/schemas/maestro-snapshot.schema.json +23 -0
- package/skills/README.md +7 -5
- package/skills/core/onboarding/SKILL.md +7 -0
- package/skills/core/orchestration-experience/SKILL.md +113 -0
- package/skills/core/orchestration-experience-pt-br/SKILL.md +112 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/go-implementation/SKILL.md +2 -0
package/adapters/README.md
CHANGED
|
@@ -31,6 +31,17 @@ ativação em sessão nova. `maestro-parity.test.ts` compara o contrato canônic
|
|
|
31
31
|
instalações temporárias. Os testes específicos de cada adaptador exercitam o
|
|
32
32
|
transporte fixture; os recibos live são uma etapa posterior e separada.
|
|
33
33
|
|
|
34
|
+
## Paridade do roadmap da rede
|
|
35
|
+
|
|
36
|
+
O status do roadmap vem de `ork_network_roadmap` nos quatro hosts (RM-054, fatia 2): tool argv no
|
|
37
|
+
OpenClaw, wrapper no Hermes, tool do MCP no Claude Code e no Codex (o projeto servido, em todas as
|
|
38
|
+
máquinas) e `ork network roadmap` nas entradas `/orkastery:ork` e `$ork`. A descrição manda
|
|
39
|
+
transportar o texto como vem: lacuna e "Não consultado" nunca viram "roadmap vazio". A frase
|
|
40
|
+
`orkastery maestro` sem projeto oferece o mesmo panorama. No OpenClaw, o manifesto declara a tool
|
|
41
|
+
nos perfis `coding` e `messaging` (`toolMetadata`): sem isso, no perfil `coding`, nenhuma tool de
|
|
42
|
+
plugin chega ao modelo. `ork_network_status` espera a RM-053 na `main`. `network-roadmap-hosts.test.ts` prova a rota de cada host e o aceite do incidente de 29/09
|
|
43
|
+
pela extensão do OpenClaw com o `ork` real.
|
|
44
|
+
|
|
34
45
|
Usabilidade HITL é prioridade máxima: recomendação, opções claras e canal disponível
|
|
35
46
|
associado ao pedido. MCP local conserva elicitation; Telegram segue disponível
|
|
36
47
|
quando configurado. Ingresso nativo Hermes/Discord e OpenClaw depende de callback
|
|
@@ -25,7 +25,9 @@
|
|
|
25
25
|
"./skills/reviewers/security-auditor",
|
|
26
26
|
"./skills/reviewers/test-engineer",
|
|
27
27
|
"./skills/reviewers/web-performance-auditor",
|
|
28
|
-
"./skills/core/onboarding"
|
|
28
|
+
"./skills/core/onboarding",
|
|
29
|
+
"./skills/core/orchestration-experience",
|
|
30
|
+
"./skills/core/orchestration-experience-pt-br"
|
|
29
31
|
],
|
|
30
32
|
"commands": "./commands",
|
|
31
33
|
"keywords": [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ork-check
|
|
3
|
-
description: Conduz a fase CHECK: reexecuta a verificacao contra a baseline, percorre os cinco eixos e consolida um veredito unico. Nao corrige o que encontra.
|
|
3
|
+
description: "Conduz a fase CHECK: reexecuta a verificacao contra a baseline, percorre os cinco eixos e consolida um veredito unico. Nao corrige o que encontra."
|
|
4
4
|
tools: Bash(ork:*), Bash(git:*), Read, Glob, Grep
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ork-go
|
|
3
|
-
description: Conduz a fase GO dentro da worktree da thread: um commit atomico por tarefa, baseline gravada antes de comecar.
|
|
3
|
+
description: "Conduz a fase GO dentro da worktree da thread: um commit atomico por tarefa, baseline gravada antes de comecar."
|
|
4
4
|
tools: Bash, Read, Write, Edit, Glob, Grep
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -20,7 +20,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
|
|
|
20
20
|
|
|
21
21
|
- Trabalhe SOMENTE na worktree da thread. A arvore principal nao e area de trabalho.
|
|
22
22
|
- Baseline antes da primeira linha: `ork verify <thread> --baseline`.
|
|
23
|
-
- Um commit por tarefa, arquivos nomeados. `git add -A
|
|
23
|
+
- Um commit por tarefa, arquivos nomeados. Nada de `git add -A`: ele engole arquivo de outra thread, e o guard do adaptador por projeto (`ork adapter install claude-code`) o bloqueia.
|
|
24
24
|
- Toda alegacao vira claim com comando. Passagem relatada nao e passagem.
|
|
25
25
|
|
|
26
26
|
## Regras que valem em toda fase
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ork-goal
|
|
3
|
-
description: Conduz a fase GOAL de uma thread do Orkastery: exploracao do repositorio real, premissas explicitas e criterios que viram claims verificaveis. Nao implementa.
|
|
3
|
+
description: "Conduz a fase GOAL de uma thread do Orkastery: exploracao do repositorio real, premissas explicitas e criterios que viram claims verificaveis. Nao implementa."
|
|
4
4
|
tools: Bash(ork:*), Read, Glob, Grep
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ork-master
|
|
3
|
-
description: Conduz a fase MASTER: POSTMORTEM tipado, MASTER log no contrato congelado e coleta do score humano. Nunca inventa nota.
|
|
3
|
+
description: "Conduz a fase MASTER: POSTMORTEM tipado, MASTER log no contrato congelado e coleta do score humano. Nunca inventa nota."
|
|
4
4
|
tools: Bash(ork:*), Read
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ork-plan
|
|
3
|
-
description: Conduz a fase PLAN: tarefas fatiadas com touch_paths e verify por tarefa, decisoes com domicilio unico. Nao implementa.
|
|
3
|
+
description: "Conduz a fase PLAN: tarefas fatiadas com touch_paths e verify por tarefa, decisoes com domicilio unico. Nao implementa."
|
|
4
4
|
tools: Bash(ork:*), Read, Glob, Grep
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ork-ship
|
|
3
|
-
description: Conduz a fase SHIP pelo `ork ship`: merge serializado por lease e push provado por comando.
|
|
3
|
+
description: "Conduz a fase SHIP pelo `ork ship`: merge serializado por lease e push provado por comando."
|
|
4
4
|
tools: Bash(ork:*), Bash(git status:*), Bash(git log:*), Read
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Fecha a thread com POSTMORTEM tipado e o score humano de 0 a 5.
|
|
3
|
-
argument-hint: "<thread-id>
|
|
3
|
+
argument-hint: "<thread-id>"
|
|
4
4
|
allowed-tools: Bash(ork:*), Read, Glob, Grep
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -16,22 +16,25 @@ Fase MASTER (F6): POSTMORTEM tipado, MASTER log no contrato congelado e o score
|
|
|
16
16
|
ork master classes
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
2. Pede ao
|
|
20
|
-
comando nunca inventa nota
|
|
21
|
-
|
|
22
|
-
3. Fecha a thread:
|
|
19
|
+
2. Pede a nota ao dono pelo canal com prova (RM-048). **O score e do humano, em todos os modos.**
|
|
20
|
+
Este comando nunca inventa nota e nunca escreve `--por` em nome de ninguem:
|
|
23
21
|
|
|
24
22
|
```bash
|
|
25
|
-
ork master <thread> --
|
|
23
|
+
ork master pedir <thread> --formato terminal
|
|
26
24
|
```
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
Mostre a linha como vem. O dono responde no Telegram (`<codigo> <0 a 5> <porque>`) e o nucleo
|
|
27
|
+
grava a nota com o recibo do ingresso. `ork master <thread> --score ... --por` chamado daqui e
|
|
28
|
+
recusado com `master.prova-de-canal`; do terminal dele, fora do host, o dono pode usa-lo.
|
|
29
|
+
3. Confira que a nota entrou no ledger:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
ork master --todas
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
+
4. Nos modos sem pausa de MASTER, a entrega e aceita a menos que o builder diga o contrario; o
|
|
36
|
+
`ork master --todas` mostra as entregas com o indice derivado do ledger, inclusive as ja pontuadas.
|
|
37
|
+
|
|
35
38
|
## Regras do adaptador
|
|
36
39
|
|
|
37
40
|
- **Zero regra de negocio aqui.** Este comando traduz intencao em chamada de `ork` e nada mais.
|
|
@@ -32,6 +32,12 @@ Os comandos de fase continuam disponiveis como atalhos; o dono nao precisa conhe
|
|
|
32
32
|
A frase literal `orkastery maestro`, em sessão limpa, pede leitura do panorama.
|
|
33
33
|
Descubra a ferramenta com `ToolSearch` em `select:mcp__orkastery__ork_maestro`,
|
|
34
34
|
então consulte o projeto fixado. Não abre thread nem despacho por consulta.
|
|
35
|
+
Sem projeto nomeado, ofereça também o panorama da rede (RM-054): `ork network roadmap`
|
|
36
|
+
(todos os projetos conhecidos, as threads de todas as máquinas, fontes, frescor e lacunas)
|
|
37
|
+
ou `mcp__orkastery__ork_network_roadmap` (o projeto fixado, em todas as máquinas), mostrado como vem.
|
|
38
|
+
O MCP atende só o projeto fixado; `projeto` em qualquer ferramenta apenas confere esse
|
|
39
|
+
projeto (`projeto.fora-do-servidor` quando é outro). Pedido de outro projeto vai ao CLI com
|
|
40
|
+
`--projeto <nome>` (RM-052). Leia "Projeto consultado" e "Não lido" antes de responder.
|
|
35
41
|
Projeto ausente/ambíguo exige resolver o contexto permitido pelo núcleo.
|
|
36
42
|
Se já recebeu fase/thread/worktree, execute o bloco recebido, sem recursão.
|
|
37
43
|
MCP ausente ou autenticação negada permanece impedimento; não troque runtime,
|
|
@@ -46,6 +52,7 @@ UUID interno e cancelamento preservado. A condutora usa
|
|
|
46
52
|
| Demanda nova | Resolva o modo pelo nucleo, confira o preflight e abra/despache a thread correspondente. |
|
|
47
53
|
| "Continue" ou thread/roadmap existente | Leia o estado e o ultimo resultado; retome o proximo passo autorizado, sem duplicar despacho. |
|
|
48
54
|
| "Como esta?" ou status | Consulte a thread conhecida; apresente progresso comprovado, impedimento e proximo passo. |
|
|
55
|
+
| Status do roadmap | Rode `ork network roadmap` (com `--projeto <nome>` quando o dono nomear o projeto) e mostre o texto como vem: traz as threads de todas as maquinas, as reservas e a fonte e a hora de cada parte; `ork roadmap status` le so esta maquina. Nao escreva relatorio proprio de roadmap nem o deduza do board ou do panorama: zero threads nao e roadmap vazio, e lacuna ou "Nao consultado" nunca e roadmap vazio. |
|
|
49
56
|
| Decisao ou resposta | Correlacione com o pedido/gate apresentado, transporte pelo caminho suportado e confira o resultado. |
|
|
50
57
|
| Onboarding | Use a pauta de `ork onboarding` e retome as etapas existentes. |
|
|
51
58
|
| board, plan, doctor ou modos | Execute a consulta correspondente e interprete o resultado para a intencao do dono. |
|
|
@@ -69,6 +76,7 @@ As consultas CLI abaixo continuam uteis quando a ferramenta correspondente nao e
|
|
|
69
76
|
```bash
|
|
70
77
|
ork thread status <thread>
|
|
71
78
|
ork phase list <thread>
|
|
79
|
+
ork network roadmap [--projeto <nome>]
|
|
72
80
|
ork pulse --json
|
|
73
81
|
ork board plan
|
|
74
82
|
ork doctor
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Entrega a thread pelo `ork ship`: merge serializado e push provado.
|
|
2
|
+
description: "Entrega a thread pelo `ork ship`: merge serializado e push provado."
|
|
3
3
|
argument-hint: "<thread-id> [--para <branch>]"
|
|
4
4
|
allowed-tools: Bash(ork:*), Read, Glob, Grep
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# /ship
|
|
8
8
|
|
|
9
|
-
Fase SHIP (F5): merge serializado por lease, atualizacao contra a base, push provado por comando e plano de rollback. Nada de `git push` na mao:
|
|
9
|
+
Fase SHIP (F5): merge serializado por lease, atualizacao contra a base, push provado por comando e plano de rollback. Nada de `git push` na mao: push na mao nao e provado, e o guard do adaptador por projeto (`ork adapter install claude-code`) o bloqueia.
|
|
10
10
|
|
|
11
11
|
## O que este comando faz
|
|
12
12
|
|
|
@@ -6,9 +6,17 @@ 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,
|
|
10
|
+
leia `../core/<skill>/SKILL.md`, usando o nome devolvido em `skill` pelo núcleo:
|
|
11
|
+
`orchestration-experience-pt-br` ou `orchestration-experience`. Idioma, fuso e profundidade
|
|
12
|
+
vêm da mesma consulta. Se false, não ative o pacote. O bloco próprio de AGENTS.md também
|
|
13
|
+
aponta para esse catálogo; instalação não altera permissões nativas.
|
|
14
|
+
|
|
9
15
|
Ao receber literalmente `orkastery maestro`, descubra `ork_maestro` no namespace
|
|
10
16
|
efetivamente exposto e consulte o projeto fixado pelo MCP. A frase pede panorama,
|
|
11
|
-
sem abrir trabalho.
|
|
17
|
+
sem abrir trabalho. Sem projeto nomeado, ofereça também o panorama da rede
|
|
18
|
+
(`ork_network_roadmap`, ou `ork network roadmap` no CLI), com fontes, frescor e lacunas.
|
|
19
|
+
Siga a seleção de contexto e os limites do bootstrap comum.
|
|
12
20
|
Sem MCP, a consulta `ork maestro --json` continua somente leitura se o CLI estiver
|
|
13
21
|
disponível; mutações sem transporte nativo permanecem pendentes. Nunca use Bash Git
|
|
14
22
|
ou mudança de sandbox como substitutos. Sessão filha continua a fase recebida.
|
|
@@ -31,6 +39,9 @@ e `ork_request_decision(threadId, pedidoId)`. Use o namespace efetivamente expos
|
|
|
31
39
|
- Pedido novo: resolva o modo pelo `ork`, confira preflight e abra/despache a thread.
|
|
32
40
|
- Retomada: leia `ork thread status <thread>` e o ultimo resultado em `ork phase list <thread>`;
|
|
33
41
|
continue o trabalho autorizado sem repetir onboarding, aprovacao ou implementacao.
|
|
42
|
+
- Status do roadmap: use `ork_network_roadmap` (ou `ork network roadmap --projeto <nome>`) e mostre o
|
|
43
|
+
texto como vem, com as threads de todas as maquinas, as fontes e as lacunas; `ork_roadmap_status` e
|
|
44
|
+
so desta maquina. Nao escreva relatorio proprio de roadmap: lacuna nunca e roadmap vazio.
|
|
34
45
|
- Status: apresente a evidencia da thread; `ork pulse --json` mostra quem precisa agir.
|
|
35
46
|
As pausas dos blocos do modo sao previstas: so diga "aguardando voce" com pendencia
|
|
36
47
|
humana atual comprovada no estado/ultimo resultado, identificando gate, pedido ou evento.
|
|
@@ -44,6 +44,9 @@ ork adapter install hermes --dry-run # lista o que seria escrito
|
|
|
44
44
|
| `hermes.plugin.json` | Declara a skill, o binario do `ork` e as tags de conducao |
|
|
45
45
|
| `bin/ork-abrir-thread.sh` | Abre a thread com o modo lido do pedido, em um comando |
|
|
46
46
|
| `bin/ork-brain.sh` | Consulta o Company Brain pelo contrato e identidade autenticada do OrkMind |
|
|
47
|
+
| `bin/ork-maestro.sh` | `ork_maestro`: o panorama Maestro do projeto pedido (`ork maestro --json`) |
|
|
48
|
+
| `bin/ork-roadmap-status.sh` | `ork_roadmap_status`: o status report do roadmap so desta maquina (`ork roadmap status`) |
|
|
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) |
|
|
47
50
|
|
|
48
51
|
## Tickets `obj-*` aposentados
|
|
49
52
|
|
|
@@ -5,11 +5,14 @@
|
|
|
5
5
|
# nucleo, e a validacao contra `conduction.allowed_modes` acontece dentro do `ork thread new`.
|
|
6
6
|
# Este script existe para o host nao ser tentado a reimplementar o parse da #TAG.
|
|
7
7
|
#
|
|
8
|
-
# Uso: ork-abrir-thread.sh "<nome curto>" "<pedido inteiro do builder>" [--worktree auto]
|
|
8
|
+
# Uso: ork-abrir-thread.sh "<nome curto>" "<pedido inteiro do builder>" [--worktree auto] [--projeto <nome>]
|
|
9
9
|
|
|
10
10
|
set -eu
|
|
11
11
|
# I-36 (D6): o adaptador declara o canal de conducao do Hermes; descreve a porta, nao da autoridade.
|
|
12
12
|
export ORK_CANAL="${ORK_CANAL:-hermes}"
|
|
13
|
+
# RM-052 (D3): o cwd do gateway nao escolhe projeto. Sem --projeto <nome> (que passa em "$@"), o
|
|
14
|
+
# nucleo usa o unico projeto conhecido da maquina ou devolve a escolha. ORK_PROJETO_EXPLICITO=0 desliga.
|
|
15
|
+
export ORK_PROJETO_EXPLICITO="${ORK_PROJETO_EXPLICITO:-1}"
|
|
13
16
|
|
|
14
17
|
if [ "$#" -lt 2 ]; then
|
|
15
18
|
echo "uso: ork-abrir-thread.sh \"<nome curto>\" \"<pedido do builder>\" [argumentos extras]" >&2
|
|
@@ -21,7 +24,19 @@ NOME="$1"
|
|
|
21
24
|
PEDIDO="$2"
|
|
22
25
|
shift 2
|
|
23
26
|
|
|
24
|
-
|
|
27
|
+
# RM-052: o --projeto dos argumentos extras vale tambem para ler o modo padrao do projeto certo.
|
|
28
|
+
PROJETO=""
|
|
29
|
+
anterior=""
|
|
30
|
+
for a in "$@"; do
|
|
31
|
+
if [ "$anterior" = "--projeto" ]; then PROJETO="$a"; fi
|
|
32
|
+
case "$a" in --projeto=*) PROJETO="${a#--projeto=}" ;; esac
|
|
33
|
+
anterior="$a"
|
|
34
|
+
done
|
|
35
|
+
if [ -n "$PROJETO" ]; then
|
|
36
|
+
MODO="$("$ORK" --projeto "$PROJETO" modos --do-pedido "$PEDIDO")"
|
|
37
|
+
else
|
|
38
|
+
MODO="$("$ORK" modos --do-pedido "$PEDIDO")"
|
|
39
|
+
fi
|
|
25
40
|
echo "modo de conducao lido do pedido: $MODO" >&2
|
|
26
41
|
|
|
27
42
|
exec "$ORK" thread new "$NOME" --mode "$MODO" "$@"
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/bin/sh
|
|
2
2
|
# Host routing only. Authenticated principal and grants belong to the transport.
|
|
3
3
|
set -eu
|
|
4
|
+
# RM-052 (D3): o cwd do gateway nao escolhe projeto. Sem --projeto <nome> (que passa em "$@"), o
|
|
5
|
+
# nucleo usa o unico projeto conhecido da maquina ou devolve a escolha. ORK_PROJETO_EXPLICITO=0 desliga.
|
|
6
|
+
export ORK_PROJETO_EXPLICITO="${ORK_PROJETO_EXPLICITO:-1}"
|
|
4
7
|
exec "{{ork_bin}}" brain "$@"
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
#!/bin/sh
|
|
2
|
-
# Somente leitura
|
|
2
|
+
# Somente leitura. Argumentos continuam dados.
|
|
3
3
|
set -eu
|
|
4
|
+
# RM-052 (D3): o cwd do gateway nao escolhe projeto. Sem --projeto <nome> (que passa em "$@"), o
|
|
5
|
+
# nucleo usa o unico projeto conhecido da maquina ou devolve a escolha. ORK_PROJETO_EXPLICITO=0 desliga.
|
|
6
|
+
export ORK_PROJETO_EXPLICITO="${ORK_PROJETO_EXPLICITO:-1}"
|
|
4
7
|
# I-36 (D6): o adaptador declara o canal de conducao do Hermes; descreve a porta, nao da autoridade.
|
|
5
8
|
export ORK_CANAL="${ORK_CANAL:-hermes}"
|
|
6
9
|
exec "${ORK_BIN:-{{ork_bin}}}" maestro --json "$@"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# RM-054 (fatia 2): o roadmap da rede, montado pelo nucleo (`ork network roadmap`): o status report
|
|
3
|
+
# com as threads de todas as maquinas, as reservas, a fonte e a hora de cada parte e as lacunas.
|
|
4
|
+
# Somente leitura; o Hermes transporta o texto como vem, sem reescrever. Argumentos continuam dados.
|
|
5
|
+
set -eu
|
|
6
|
+
export ORK_CANAL="${ORK_CANAL:-hermes}"
|
|
7
|
+
# RM-052 (D3): o cwd do gateway nao escolhe projeto. Com ORK_PROJETO_EXPLICITO=1 o nucleo aceita no
|
|
8
|
+
# --projeto (que passa em "$@") so o nome registrado ou a forja (github:dono/repo), e o projeto do
|
|
9
|
+
# diretorio do gateway so entra se estiver no registro. ORK_PROJETO_EXPLICITO=0 desliga.
|
|
10
|
+
export ORK_PROJETO_EXPLICITO="${ORK_PROJETO_EXPLICITO:-1}"
|
|
11
|
+
exec "${ORK_BIN:-{{ork_bin}}}" network roadmap "$@"
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# RM-048 (item 7): o status report unico do roadmap, montado pelo nucleo. Somente leitura; o Hermes
|
|
3
|
+
# transporta o texto como vem, sem reescrever. Argumentos continuam dados.
|
|
4
|
+
set -eu
|
|
5
|
+
export ORK_CANAL="${ORK_CANAL:-hermes}"
|
|
6
|
+
# RM-052 (D3): o cwd do gateway nao escolhe projeto. Sem --projeto <nome> (que passa em "$@"), o
|
|
7
|
+
# nucleo usa o unico projeto conhecido da maquina ou devolve a escolha. ORK_PROJETO_EXPLICITO=0 desliga.
|
|
8
|
+
export ORK_PROJETO_EXPLICITO="${ORK_PROJETO_EXPLICITO:-1}"
|
|
9
|
+
exec "${ORK_BIN:-{{ork_bin}}}" roadmap status "$@"
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
],
|
|
11
11
|
"bin": {
|
|
12
12
|
"ork_maestro": "./bin/ork-maestro.sh",
|
|
13
|
+
"ork_roadmap_status": "./bin/ork-roadmap-status.sh",
|
|
14
|
+
"ork_network_roadmap": "./bin/ork-network-roadmap.sh",
|
|
13
15
|
"ork-abrir-thread": "./bin/ork-abrir-thread.sh",
|
|
14
16
|
"ork_brain": "./bin/ork-brain.sh",
|
|
15
17
|
"ork_gate_answer": "./bin/ork-hitl-answer.py",
|
|
@@ -23,11 +23,23 @@ NATIVE_COMMAND = re.compile(r'^/ork (offer|gate|session) ([a-zA-Z0-9][a-zA-Z0-9.
|
|
|
23
23
|
# (GRAMATICA_DO_PULSE, core/src/pulse-resposta.ts) e um teste do nucleo confere que continuam
|
|
24
24
|
# iguais. O codigo comeca por letra e tem digito: conversa comum nao tem esta forma, e ele
|
|
25
25
|
# nunca se confunde com a resposta ao lote, que comeca pelo numero da pergunta.
|
|
26
|
-
PULSE_CONSENT = re.compile(r'^[ \t]*(?=[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{0,2}[2-9])[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{3}[ \t]+[^\r\n]{1,
|
|
26
|
+
PULSE_CONSENT = re.compile(r'^[ \t]*(?=[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{0,2}[2-9])[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{3}[ \t]+[^\r\n]{1,200}$', re.IGNORECASE)
|
|
27
27
|
PULSE_LOTE = re.compile(r'^[ \t]*[0-9]{1,2}[ \t]*[a-zA-Z](?:[ \t,;]*[0-9]{1,2}[ \t]*[a-zA-Z])*[ \t]*[.!]?[ \t]*$')
|
|
28
28
|
# I-50 (RM-039): a tag da cadencia do resumo, sozinha na mensagem. Comeca por '#': nunca se
|
|
29
29
|
# confunde com as outras duas formas, e tag no meio de uma frase continua indo para o assistente.
|
|
30
30
|
PULSE_CADENCIA = re.compile(r'^[ \t]*#OrkPulse(?:On(?:-(?:15|30|60)m)?|Off)[ \t]*[.!]?[ \t]*$', re.IGNORECASE)
|
|
31
|
+
# RM-048 (D2 e D3): as formas do texto livre, geradas no nucleo do vocabulario fechado. `lista`
|
|
32
|
+
# ("1. B, 2. aprovo") e interceptada sempre; `livre` ("sim", "aprovo", "a") so enquanto a janela
|
|
33
|
+
# de escuta do nucleo estiver aberta: fora dela, a palavra vai ao assistente, como sempre foi. A
|
|
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)
|
|
37
|
+
# RM-048 (item 8): a linha do teclado do digest ("ratificar <thread> <assinatura> <classe>") vai ao
|
|
38
|
+
# nucleo pelo mesmo endereco assinado; o agente nao escreve mais `--por` em nome do dono.
|
|
39
|
+
PULSE_RATIFICACAO = re.compile(r'^[ \t]*ratificar(?:-lote)?(?:[ \t]+[A-Za-z0-9._-]{1,80}){2,3}[ \t]*$', re.IGNORECASE)
|
|
40
|
+
# Texto acima disto nunca e testado contra as formas: elas rodam antes da allowlist.
|
|
41
|
+
PULSE_TETO = 300
|
|
42
|
+
ESCUTA_TETO = 4096
|
|
31
43
|
# O endereco do pulse no corpo assinado: nem thread nem pedido. Quem traduz e o nucleo.
|
|
32
44
|
PULSE_ALVO, PULSE_ENDERECO = 'pulse', 'resposta'
|
|
33
45
|
CORE_TIMEOUT = 10
|
|
@@ -55,9 +67,30 @@ def _status(entry=None, replay=False):
|
|
|
55
67
|
'effect': effect, 'confirmation': confirmation, 'replay': replay}
|
|
56
68
|
|
|
57
69
|
|
|
70
|
+
def _escuta_aberta(root):
|
|
71
|
+
"""Janela da palavra solta (ork.pulse-escuta/v1), lida com teto de bytes, sem seguir erro."""
|
|
72
|
+
try:
|
|
73
|
+
if not os.path.isabs(root):
|
|
74
|
+
return False
|
|
75
|
+
with open(os.path.join(root, '.orkastery', 'monitor', 'pulse-escuta.json'), 'rb') as f:
|
|
76
|
+
raw = f.read(ESCUTA_TETO + 1)
|
|
77
|
+
if len(raw) > ESCUTA_TETO:
|
|
78
|
+
return False
|
|
79
|
+
value = json.loads(raw)
|
|
80
|
+
until = value.get('livreAte') if isinstance(value, dict) and value.get('contrato') == 'ork.pulse-escuta/v1' else None
|
|
81
|
+
return (isinstance(until, str)
|
|
82
|
+
and datetime.fromisoformat(until.replace('Z', '+00:00')) > datetime.now(timezone.utc))
|
|
83
|
+
except Exception:
|
|
84
|
+
return False
|
|
85
|
+
|
|
86
|
+
|
|
58
87
|
def _is_pulse(text):
|
|
59
|
-
|
|
60
|
-
|
|
88
|
+
if '\x00' in text or len(text) > PULSE_TETO:
|
|
89
|
+
return False
|
|
90
|
+
if (PULSE_CONSENT.fullmatch(text) or PULSE_LOTE.fullmatch(text) or PULSE_CADENCIA.fullmatch(text)
|
|
91
|
+
or PULSE_LISTA.fullmatch(text) or PULSE_RATIFICACAO.fullmatch(text)):
|
|
92
|
+
return True
|
|
93
|
+
return bool(PULSE_LIVRE.fullmatch(text)) and _escuta_aberta(os.environ.get('ORK_HITL_ROOT', ''))
|
|
61
94
|
|
|
62
95
|
|
|
63
96
|
def _receipt_ok(receipt, operation, pedido):
|
|
@@ -8,9 +8,11 @@ license: MIT
|
|
|
8
8
|
|
|
9
9
|
# Orkastery no Hermes
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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.
|
|
12
|
+
|
|
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
|
+
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.
|
|
15
|
+
Apresente fontes/lacunas e próximas ações; ausência/ambiguidade de projeto exige contexto permitido; leia o cabeçalho "Projeto consultado" e o "Não lido" antes de responder.
|
|
14
16
|
Em sessão de fase já despachada, siga o bloco recebido sem abrir outra orquestração.
|
|
15
17
|
Ações usam os comandos tipados do núcleo com precondições e readback.
|
|
16
18
|
|
|
@@ -21,6 +23,7 @@ Sem ingresso no canal escolhido, conserve o pedido pendente e explique o motivo.
|
|
|
21
23
|
Não altere runtime, provider, perfil filho ou sandbox para contornar falha.
|
|
22
24
|
Horário para o dono sai no fuso dele (`owner.timezone`): use `prazoLocal` e os fatos
|
|
23
25
|
`*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".
|
|
24
27
|
|
|
25
28
|
## O que esta skill e
|
|
26
29
|
|
|
@@ -28,10 +31,7 @@ O roteador do Orkastery dentro do Hermes, e **so isso**. Ela nao conduz fase por
|
|
|
28
31
|
nao escreve codigo e nao guarda metodologia: ela traduz o pedido do builder em chamada de `ork`,
|
|
29
32
|
mostra o que o `ork` respondeu e para nos gates.
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
quem "lembrava" das regras. Isso e exatamente a fragilidade que corroeu o Devmaster original:
|
|
33
|
-
regra que existe so como texto e regra que ninguem verifica. **Agora a metodologia e executavel e
|
|
34
|
-
mora no `ork`; aqui ficou o roteador.**
|
|
34
|
+
A metodologia executável mora no núcleo `ork`; a entrada do host só roteia operações.
|
|
35
35
|
|
|
36
36
|
## Quando usar
|
|
37
37
|
|
|
@@ -97,10 +97,10 @@ ork ship <thread> --para main --autorizar-push "<quem>"
|
|
|
97
97
|
ork master <thread>
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
Quando o dono pedir estado do Company Brain, use o binário instalado `ork_brain` para
|
|
101
|
-
`
|
|
102
|
-
|
|
103
|
-
thread explícita
|
|
100
|
+
Quando o dono pedir estado do Company Brain, use o binário instalado `ork_brain` para `status`,
|
|
101
|
+
`query`, `get`, `context` (pacote citável: fonte, frescor e lacunas; cite o `digest`) ou `dossie`
|
|
102
|
+
(decisão com vínculo, alternativas, quem decidiu e evidência; resposta sem recibo vira lacuna).
|
|
103
|
+
Identidade só do transporte autenticado, nunca principal, DSN ou raiz da conversa; thread explícita, só leitura.
|
|
104
104
|
|
|
105
105
|
Cada `phase run` grava o prompt exato com sha256 e registra no ledger. O `ork` reverifica no
|
|
106
106
|
runtime que a sessao existe: self-report de despacho nao vale como evidencia.
|
|
@@ -124,20 +124,19 @@ O nucleo monta e o Hermes so transporta: (1) UM resumo recorrente com as contage
|
|
|
124
124
|
(3) com o sim, ate cinco objetivas a–d com uma recomendada, respondidas numa linha (`1a 2c 3b`).
|
|
125
125
|
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
126
|
|
|
127
|
-
O plugin `orkastery-hitl`
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
127
|
+
O plugin `orkastery-hitl` registra essas formas, a resposta numerada em prosa curta (`1. B, 2. A`,
|
|
128
|
+
`1 aprovo`), o codigo curto do gate (`DE6H a`, `DE6H detalhes`) e, so na janela curta depois da
|
|
129
|
+
pergunta, a palavra solta (`aprovo`, `sim`, `a`); ambiguo volta como pergunta (RM-048). Pedido ao dono sai
|
|
130
|
+
de `ork gate request <thread> --formato telegram`, com o codigo estavel; mande como vem. **Voce nunca responde pelo dono**: `ork gate answer` do terminal falha com
|
|
131
131
|
`proveniencia em argv diverge do envelope`, e essa e a defesa funcionando.
|
|
132
132
|
|
|
133
|
-
Quando o bloco nao pausa (`#Maestro`, `#Auto`, `#Fast`), o `ork` registra a decisao autonoma com quem
|
|
134
|
-
decidiu, com que evidencia e por que. **O modo afrouxa a pausa, NUNCA a verificacao.**
|
|
133
|
+
Quando o bloco nao pausa (`#Maestro`, `#Auto`, `#Fast`), o `ork` registra a decisao autonoma com quem decidiu, com que evidencia e por que. **O modo afrouxa a pausa, NUNCA a verificacao.**
|
|
135
134
|
|
|
136
135
|
## Passo 5: a entrega e o MASTER
|
|
137
136
|
|
|
138
|
-
O MASTER fecha com POSTMORTEM tipado e indice derivado do ledger;
|
|
139
|
-
|
|
140
|
-
|
|
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`
|
|
139
|
+
e o ingresso prova a origem. Nunca `--por` em nome dele: daqui da `master.prova-de-canal` (RM-048).
|
|
141
140
|
|
|
142
141
|
Memoria "degradada" tem dois portoes: a variavel da DSN no ambiente do processo
|
|
143
142
|
(`memory_degraded` com `dsn.env-ausente`) e a ativacao de escrita com aceite humano
|
|
@@ -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
|
-
**
|
|
5
|
+
**27 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
|
|
|
@@ -58,13 +58,45 @@ fallback: usa `ORK_BIN` do ambiente ou o `ork` do PATH.
|
|
|
58
58
|
| `ork_verify` / `ork_verify_baseline` | Reexecuta no HEAD real; grava a baseline antes do GO |
|
|
59
59
|
| `ork_worktree_ensure` / `ork_worktree_audit` | Worktree isolada, conferida no proprio git |
|
|
60
60
|
| `ork_portfolio_list` | Lista produtos, projetos e iniciativas canônicos |
|
|
61
|
+
| `ork_brain_dossie` | Dossiê de decisão da thread no Company Brain, com vínculo, alternativas, quem decidiu e evidência (RM-026) |
|
|
61
62
|
| `ork_gate_answer` | Resposta humana correlacionada a um gate |
|
|
62
63
|
| `ork_session_answer` | Resposta humana correlacionada a uma sessão |
|
|
63
64
|
| `ork_ship` | Merge serializado por lease e push provado contra o remoto |
|
|
64
65
|
| `ork_master` | POSTMORTEM tipado e o score HUMANO de 0 a 5 |
|
|
65
|
-
| `ork_board` |
|
|
66
|
+
| `ork_board` | As threads DESTE projeto e o escalonador; nao le o roadmap (zero threads nao e roadmap vazio) |
|
|
67
|
+
| `ork_roadmap_status` | Status report do roadmap so desta maquina (`ork roadmap status`), transportado como vem |
|
|
68
|
+
| `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 |
|
|
66
69
|
| `ork_master_batch` | Todas as entregas, com o indice do ledger (`ork master --todas`; a fila de score saiu na I-43) |
|
|
67
70
|
|
|
71
|
+
### O projeto de cada chamada (RM-052)
|
|
72
|
+
|
|
73
|
+
Toda tool aceita `projeto`, o **nome** de um projeto registrado nesta maquina (`ork projetos`),
|
|
74
|
+
nunca um caminho. Ele vai ao `ork` como `--projeto <nome>`. O adaptador declara
|
|
75
|
+
`ORK_PROJETO_EXPLICITO=1`: o diretorio do gateway nao escolhe projeto. Sem `projeto` e com mais de
|
|
76
|
+
um projeto conhecido, a resposta e a escolha tipada `projeto.escolha`, com os candidatos; com um
|
|
77
|
+
so, vale ele. Toda resposta de `ork_maestro`, `ork_board` e `ork_roadmap_status` comeca dizendo o
|
|
78
|
+
projeto consultado e o que nao foi lido.
|
|
79
|
+
|
|
80
|
+
### O roadmap da rede (RM-054, fatia 2)
|
|
81
|
+
|
|
82
|
+
`ork_network_roadmap` e a fonte de qualquer pergunta sobre o roadmap: uma chamada de
|
|
83
|
+
`ork network roadmap`, com o status report do RM-048 e as threads de todas as maquinas, as
|
|
84
|
+
reservas, a fonte e a hora de cada parte e as lacunas. A descricao manda transportar o texto como
|
|
85
|
+
vem e nunca concluir "roadmap vazio" nem "nenhuma maquina publicou" a partir de lacuna ou de "Nao
|
|
86
|
+
consultado". O `projeto` dela aceita o nome registrado ou a forja (`github:dono/repo`,
|
|
87
|
+
`gitlab:grupo/repo`), para a maquina sem clone; caminho e URL recusam no host e no nucleo, e o
|
|
88
|
+
nucleo so aceita a forja em `github.com`, `gitlab.com` ou no host de um projeto registrado. Sem
|
|
89
|
+
`projeto`, vem o panorama de todos os projetos do registro, e e o que a frase `orkastery maestro`
|
|
90
|
+
sem projeto oferece. O projeto do diretorio do gateway so entra se estiver no registro.
|
|
91
|
+
|
|
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
|
|
94
|
+
onboarding, as tools de plugin so chegam ao modelo quando o manifesto as declara no perfil ou o
|
|
95
|
+
operador as libera. Sem isso o modelo nao ve tool `ork_*` nenhuma e vai ao `ork` pelo shell, como
|
|
96
|
+
no incidente de 29/09. As outras tools continuam sob escolha do operador:
|
|
97
|
+
`tools.alsoAllow: ["orkastery"]` no `openclaw.json` libera todas; allowlist e deny do operador
|
|
98
|
+
sempre valem.
|
|
99
|
+
|
|
68
100
|
## A #TAG de conducao
|
|
69
101
|
|
|
70
102
|
O manifesto novo do OpenClaw nao tem campo proprio para isso, entao a regra vive aqui e
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
/** D12: this host is the `openclaw` channel, and the channel is signed, not labelled. */
|
|
3
3
|
import { createHash, createHmac } from 'node:crypto';
|
|
4
4
|
import { execFile } from 'node:child_process';
|
|
5
|
+
import { readFileSync } from 'node:fs';
|
|
6
|
+
import { isAbsolute, join } from 'node:path';
|
|
5
7
|
/**
|
|
6
8
|
* I-41 (GO-FIX 1): the two shapes of an answer to the pulse summary, typed with no slash and no
|
|
7
9
|
* identifier: "P4EJ a" answers the summary and "1a 2c" answers the questions. The SAME sources
|
|
@@ -9,14 +11,46 @@ import { execFile } from 'node:child_process';
|
|
|
9
11
|
* stay equal. The code starts with a letter and has a digit: ordinary chat never has this shape,
|
|
10
12
|
* and it never reads as an answer to the batch, which starts with the question number.
|
|
11
13
|
*/
|
|
12
|
-
const PULSE_CONSENT = new RegExp("^[ \\t]*(?=[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{0,2}[2-9])[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{3}[ \\t]+[^\\r\\n]{1,
|
|
14
|
+
const PULSE_CONSENT = new RegExp("^[ \\t]*(?=[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{0,2}[2-9])[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{3}[ \\t]+[^\\r\\n]{1,200}$", 'i');
|
|
13
15
|
const PULSE_LOTE = new RegExp("^[ \\t]*[0-9]{1,2}[ \\t]*[a-zA-Z](?:[ \\t,;]*[0-9]{1,2}[ \\t]*[a-zA-Z])*[ \\t]*[.!]?[ \\t]*$");
|
|
14
16
|
/** I-50 (RM-039): the pulse cadence tag, alone in the message. It starts with '#', so it never reads as the other two. */
|
|
15
17
|
const PULSE_CADENCIA = new RegExp("^[ \\t]*#OrkPulse(?:On(?:-(?:15|30|60)m)?|Off)[ \\t]*[.!]?[ \\t]*$", 'i');
|
|
16
18
|
/** The pulse address inside the signed body: neither a thread nor a request. The core translates. */
|
|
17
19
|
const PULSE_ALVO = 'pulse', PULSE_ENDERECO = 'resposta';
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
/**
|
|
21
|
+
* RM-048 (D2 and D3): the free-text shapes, generated in the core from the closed vocabulary. `lista`
|
|
22
|
+
* ("1. B, 2. aprovo") is always claimed; `livre` ("sim", "aprovo", "a") only while the core's
|
|
23
|
+
* listening window is open: outside it, the word goes to the assistant, as it always did. The
|
|
24
|
+
* window is a routing hint, not proof: the message still goes through the signature and the core rule.
|
|
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');
|
|
28
|
+
/** RM-048 (item 8): the digest keyboard line goes to the core at the same signed address. */
|
|
29
|
+
const PULSE_RATIFICACAO = new RegExp("^[ \\t]*ratificar(?:-lote)?(?:[ \\t]+[A-Za-z0-9._-]{1,80}){2,3}[ \\t]*$", 'i');
|
|
30
|
+
/** Text above this is never tested against the shapes: they run before the allowlist. */
|
|
31
|
+
const PULSE_TETO = 300, ESCUTA_TETO = 4096;
|
|
32
|
+
/** The bare-word window (ork.pulse-escuta/v1), read with a byte cap; any error closes it. */
|
|
33
|
+
export function listeningOpen(root, now = Date.now()) {
|
|
34
|
+
try {
|
|
35
|
+
if (!root || !isAbsolute(root))
|
|
36
|
+
return false;
|
|
37
|
+
const raw = readFileSync(join(root, '.orkastery', 'monitor', 'pulse-escuta.json'));
|
|
38
|
+
if (raw.length > ESCUTA_TETO)
|
|
39
|
+
return false;
|
|
40
|
+
const value = JSON.parse(raw.toString('utf8'));
|
|
41
|
+
return value?.contrato === 'ork.pulse-escuta/v1' && typeof value.livreAte === 'string' && Date.parse(value.livreAte) > now;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function isPulseAnswer(text, root = process.env.ORK_HITL_ROOT) {
|
|
48
|
+
if (text.includes('\0') || text.length > PULSE_TETO)
|
|
49
|
+
return false;
|
|
50
|
+
if (PULSE_CONSENT.test(text) || PULSE_LOTE.test(text) || PULSE_CADENCIA.test(text) || PULSE_LISTA.test(text) ||
|
|
51
|
+
PULSE_RATIFICACAO.test(text))
|
|
52
|
+
return true;
|
|
53
|
+
return PULSE_LIVRE.test(text) && listeningOpen(root);
|
|
20
54
|
}
|
|
21
55
|
export function registerHitlIngress(api, bin) {
|
|
22
56
|
api.on('inbound_claim', async (event, ctx) => {
|