@orkastery/cli 0.5.0 → 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 (131) hide show
  1. package/adapters/claude-code/README.md +11 -2
  2. package/adapters/claude-code/agents/ork-master.md +2 -0
  3. package/adapters/claude-code/commands/master.md +8 -0
  4. package/adapters/claude-code/commands/onboarding.md +3 -2
  5. package/adapters/claude-code/commands/ork.md +9 -0
  6. package/adapters/codex/skills/ork/SKILL.md +18 -3
  7. package/adapters/hermes/README.md +1 -0
  8. package/adapters/hermes/bin/ork-network-status.sh +10 -0
  9. package/adapters/hermes/hermes.plugin.json +1 -0
  10. package/adapters/hermes/hitl-ingress/__init__.py +2 -2
  11. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +6 -5
  12. package/adapters/openclaw/README.md +35 -4
  13. package/adapters/openclaw/dist/hitl-ingress.js +2 -2
  14. package/adapters/openclaw/dist/index.js +47 -12
  15. package/adapters/openclaw/openclaw.plugin.json +5 -1
  16. package/adapters/openclaw/package.json +2 -2
  17. package/adapters/openclaw/src/hitl-ingress.ts +2 -2
  18. package/adapters/openclaw/src/index.ts +50 -12
  19. package/assets/orkmind_bridge.py +117 -9
  20. package/dist/adapters/claude-bg.js +59 -11
  21. package/dist/adapters/codex.js +4 -3
  22. package/dist/agents-md.js +1 -0
  23. package/dist/auditrun.js +6 -2
  24. package/dist/board.js +16 -14
  25. package/dist/branch-de-estado.js +66 -10
  26. package/dist/busca-semantica.js +52 -12
  27. package/dist/canarios-rm057.js +149 -0
  28. package/dist/canarios.js +2 -0
  29. package/dist/ci.js +8 -1
  30. package/dist/claim-lint.js +3 -1
  31. package/dist/claims.js +39 -1
  32. package/dist/company-brain-context.js +158 -22
  33. package/dist/docs.js +110 -3
  34. package/dist/doctor-pulse-cron.js +194 -0
  35. package/dist/doctor-rede.js +149 -0
  36. package/dist/doctor.js +294 -37
  37. package/dist/entrega-pr.js +27 -8
  38. package/dist/esgotamentos.js +181 -0
  39. package/dist/experiencia.js +12 -2
  40. package/dist/fabrica-estado.js +35 -9
  41. package/dist/fabrica-publicar.js +6 -0
  42. package/dist/fechamento.js +20 -66
  43. package/dist/fix.js +3 -3
  44. package/dist/forja.js +31 -7
  45. package/dist/gates.js +5 -1
  46. package/dist/hitl-contract.js +59 -4
  47. package/dist/hitl-curto.js +11 -6
  48. package/dist/hitl-gates.js +5 -0
  49. package/dist/hitl-lote.js +5 -2
  50. package/dist/hitl-resumo.js +33 -1
  51. package/dist/hitl-tempo-parado.js +201 -0
  52. package/dist/hitl-texto-livre.js +5 -5
  53. package/dist/horario.js +27 -0
  54. package/dist/hosts.js +59 -13
  55. package/dist/impedimento.js +205 -0
  56. package/dist/index.js +433 -88
  57. package/dist/indice-vetorial.js +87 -10
  58. package/dist/indice.js +3 -1
  59. package/dist/init.js +28 -5
  60. package/dist/integracoes-locais.js +4 -0
  61. package/dist/intelligence-graph-cli.js +267 -30
  62. package/dist/intelligence-graph-contexto.js +215 -0
  63. package/dist/intelligence-graph-contract.js +71 -12
  64. package/dist/intelligence-graph-extract-md.js +41 -23
  65. package/dist/intelligence-graph-extract-ts.js +181 -11
  66. package/dist/intelligence-graph-extract.js +186 -9
  67. package/dist/intelligence-graph-index.js +205 -24
  68. package/dist/intelligence-graph-parsers.js +6 -4
  69. package/dist/intelligence-graph-repo.js +10 -0
  70. package/dist/leases.js +680 -87
  71. package/dist/ledger-stats.js +15 -1
  72. package/dist/ledger.js +12 -0
  73. package/dist/licoes.js +6 -4
  74. package/dist/liveness.js +2 -1
  75. package/dist/maestro-runtime.js +7 -1
  76. package/dist/manifest.js +44 -1
  77. package/dist/master-nota.js +14 -5
  78. package/dist/master.js +129 -12
  79. package/dist/mcp-artifacts.js +36 -3
  80. package/dist/mcp-git.js +80 -15
  81. package/dist/mcp-grafo-worker.js +93 -0
  82. package/dist/mcp-grafo.js +279 -0
  83. package/dist/mcp-install.js +2 -1
  84. package/dist/mcp-server.js +23 -1
  85. package/dist/mcp-ship.js +2 -0
  86. package/dist/mcp-verify.js +3 -1
  87. package/dist/memoria.js +48 -6
  88. package/dist/network-roadmap.js +195 -20
  89. package/dist/ocupacao.js +17 -5
  90. package/dist/onboarding.js +9 -4
  91. package/dist/orkmind.js +90 -5
  92. package/dist/orquestracao.js +14 -11
  93. package/dist/parado-no-condutor.js +1089 -0
  94. package/dist/phase.js +68 -15
  95. package/dist/policies.js +79 -3
  96. package/dist/portfolio.js +4 -1
  97. package/dist/projeto-alvo.js +5 -1
  98. package/dist/prompts.js +36 -1
  99. package/dist/prova-ativacao.js +414 -0
  100. package/dist/pulse-delivery.js +60 -7
  101. package/dist/pulse.js +99 -3
  102. package/dist/ratelimit.js +20 -4
  103. package/dist/recall.js +3 -1
  104. package/dist/rede-adesao.js +399 -0
  105. package/dist/rede-forja.js +289 -0
  106. package/dist/rede-projetos.js +239 -0
  107. package/dist/rede-status.js +336 -0
  108. package/dist/rede.js +980 -0
  109. package/dist/retry.js +69 -2
  110. package/dist/roadmap-status.js +162 -7
  111. package/dist/runtime-context.js +5 -1
  112. package/dist/runtime-profiles.js +22 -1
  113. package/dist/saida-segura.js +58 -0
  114. package/dist/session-watcher-claude.js +113 -23
  115. package/dist/sessoes-contas.js +187 -0
  116. package/dist/sessoes-inventario.js +6 -12
  117. package/dist/sessoes.js +87 -3
  118. package/dist/ship.js +110 -20
  119. package/dist/thread.js +212 -14
  120. package/dist/util.js +71 -4
  121. package/dist/verify.js +2 -2
  122. package/dist/worktree.js +34 -8
  123. package/eval/casos/onboarding.json +1 -1
  124. package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
  125. package/package.json +7 -3
  126. package/references/definition-of-done.md +1 -1
  127. package/skills/README.md +1 -1
  128. package/skills/core/onboarding/SKILL.md +3 -2
  129. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  130. package/skills/phases/master-metrics/SKILL.md +8 -3
  131. package/skills/phases/ship-release/SKILL.md +6 -3
package/dist/util.js CHANGED
@@ -34,8 +34,12 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  };
35
35
  })();
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.GITIGNORE_DA_MAQUINA = exports.COMMIT_DESCONHECIDO = void 0;
37
38
  exports.exec = exec;
39
+ exports.shaCurto = shaCurto;
40
+ exports.branchDoHead = branchDoHead;
38
41
  exports.noPath = noPath;
42
+ exports.ignorarPastaNoGit = ignorarPastaNoGit;
39
43
  exports.subirAte = subirAte;
40
44
  exports.gravar = gravar;
41
45
  exports.lerJson = lerJson;
@@ -66,10 +70,73 @@ function exec(cmd, args, cwd, timeoutMs = 120000, env = process.env) {
66
70
  ...(r.error ? { error: r.error.code ?? r.error.message } : {}),
67
71
  };
68
72
  }
69
- /** O binario esta no PATH? */
70
- function noPath(bin) {
71
- const r = exec('which', [bin]);
72
- return r.ok ? r.stdout.trim() : null;
73
+ /** O commit quando o repositorio ainda nao tem commit (base da thread, HEAD do verify). */
74
+ exports.COMMIT_DESCONHECIDO = 'desconhecido';
75
+ /**
76
+ * Sha para exibir: 8 caracteres quando o valor e um sha hexadecimal (SHA-1 ou SHA-256); qualquer
77
+ * outro valor, como o marcador de repositorio sem commit, sai inteiro (o ensaio da 0.5.0 viu "desconhe").
78
+ */
79
+ function shaCurto(valor) {
80
+ return /^[0-9a-f]{7,64}$/i.test(valor) ? valor.slice(0, 8) : valor;
81
+ }
82
+ /** A branch para onde o HEAD aponta, com ou sem commit; `null` com o HEAD destacado. */
83
+ function branchDoHead(dir) {
84
+ const r = exec('git', ['symbolic-ref', '--quiet', '--short', 'HEAD'], dir);
85
+ return r.ok && r.stdout.trim() ? r.stdout.trim() : null;
86
+ }
87
+ /**
88
+ * O binario esta no PATH? A busca e do proprio processo, como o `which` fazia: o primeiro arquivo
89
+ * regular executavel na ordem do PATH. Registro R3 do ensaio da 0.5.0: sem o binario `which` na
90
+ * maquina, o doctor dizia que o `git` e o `claude` faltavam. Entrada vazia do PATH e pulada (nao vira
91
+ * o diretorio atual), e nome com barra e conferido direto.
92
+ */
93
+ function noPath(bin, env = process.env) {
94
+ const executavel = (alvo) => {
95
+ try {
96
+ if (!fs.statSync(alvo).isFile())
97
+ return false;
98
+ fs.accessSync(alvo, fs.constants.X_OK);
99
+ return true;
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ };
105
+ if (bin.includes('/'))
106
+ return executavel(bin) ? bin : null;
107
+ for (const dir of (env.PATH ?? '').split(path.delimiter)) {
108
+ if (dir && executavel(path.join(dir, bin)))
109
+ return path.join(dir, bin);
110
+ }
111
+ return null;
112
+ }
113
+ /** O `.gitignore` que o ork poe na pasta que e da maquina (fatia 2 do ensaio da 0.5.0, P3). */
114
+ exports.GITIGNORE_DA_MAQUINA = '# Criado pelo ork: esta pasta é da máquina, não do repositório.\n*\n';
115
+ /**
116
+ * Fatia 2 do ensaio da 0.5.0 (P3): a pasta que o ork cria para a maquina (o estado em `.orkastery/`
117
+ * e a pasta das worktrees) fica fora do git por um `.gitignore` proprio com `*`; o `.gitignore` do
118
+ * usuario nao e tocado. Nunca sobrescreve um existente, so vale para pasta dentro do repositorio e
119
+ * nao cria quando o repositorio ja rastreia algo nela: o projeto que versiona o proprio estado segue
120
+ * versionando. Devolve se criou.
121
+ */
122
+ function ignorarPastaNoGit(dir, raizDoRepo) {
123
+ const relativo = path.relative(raizDoRepo, dir);
124
+ if (!relativo || relativo.startsWith('..') || path.isAbsolute(relativo))
125
+ return false;
126
+ const arquivo = path.join(dir, '.gitignore');
127
+ if (fs.existsSync(arquivo))
128
+ return false;
129
+ const rastreados = exec('git', ['ls-files', '-z', '--', relativo], raizDoRepo);
130
+ if (rastreados.ok && rastreados.stdout.length > 0)
131
+ return false;
132
+ fs.mkdirSync(dir, { recursive: true });
133
+ try {
134
+ fs.writeFileSync(arquivo, exports.GITIGNORE_DA_MAQUINA, { flag: 'wx' });
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ return true;
73
140
  }
74
141
  /** Sobe a arvore de diretorios procurando um arquivo. Retorna o diretorio que o contem. */
75
142
  function subirAte(dirInicial, arquivo) {
package/dist/verify.js CHANGED
@@ -183,7 +183,7 @@ function cwdDaThread(raiz, thread) {
183
183
  /** HEAD real do diretorio de trabalho, carimbado em toda verificacao. */
184
184
  function commitReal(cwd) {
185
185
  const r = (0, util_1.exec)('git', ['rev-parse', 'HEAD'], cwd);
186
- return r.ok ? r.stdout.trim() : 'desconhecido';
186
+ return r.ok ? r.stdout.trim() : util_1.COMMIT_DESCONHECIDO;
187
187
  }
188
188
  /** O pedido de conducao de uma verificacao, com o prazo derivado dos comandos que ela vai rodar (D3). */
189
189
  function pedidoDoVerify(carregado, threadId, operacao, comandos, conducao) {
@@ -456,7 +456,7 @@ function textoDoVerify(r) {
456
456
  linhas.push(`ork verify da thread ${r.thread}`);
457
457
  linhas.push(` HEAD real ${r.commit}`);
458
458
  linhas.push(` diretorio ${r.cwd}`);
459
- linhas.push(` baseline ${r.baseline ? `${r.baseline.commit.slice(0, 8)} de ${(0, horario_1.formatarDataHoraRotulada)(r.baseline.gravadaEm)}` : '(nao gravada: falha nao pode ser chamada de regressao)'}`);
459
+ linhas.push(` baseline ${r.baseline ? `${(0, util_1.shaCurto)(r.baseline.commit)} de ${(0, horario_1.formatarDataHoraRotulada)(r.baseline.gravadaEm)}` : '(nao gravada: falha nao pode ser chamada de regressao)'}`);
460
460
  if (r.preparo) {
461
461
  const p = r.preparo;
462
462
  linhas.push(` preparo ${p.resultado.ok ? 'ok' : situacaoDoComando(p.resultado)} em ` +
package/dist/worktree.js CHANGED
@@ -64,9 +64,12 @@ const leases_1 = require("./leases");
64
64
  const thread_1 = require("./thread");
65
65
  const util_1 = require("./util");
66
66
  const estado_thread_1 = require("./estado-thread");
67
- /** Diretorio canonico da worktree de uma thread, resolvido pelo `ork`. */
67
+ /**
68
+ * Diretorio canonico da worktree de uma thread, resolvido pelo `ork` na arvore principal: o mesmo que a criacao usa,
69
+ * tambem quando o comando roda de dentro de outra worktree (P4 do ensaio da 0.5.0).
70
+ */
68
71
  function dirDaWorktree(carregado, id) {
69
- return path.resolve(carregado.raiz, carregado.manifesto.worktree.dir, id);
72
+ return (0, thread_1.pastaDaWorktree)(carregado, id);
70
73
  }
71
74
  /** Branch canonica da worktree de uma thread. */
72
75
  function branchDaWorktree(thread) {
@@ -196,6 +199,11 @@ function garantirWorktree(carregado, id) {
196
199
  * commit que o git nao tem mais nao entra. `proprios` conta o que o HEAD tem fora delas e da base
197
200
  * atual (`null` sem nenhuma base conhecida); `pontoDePartida` e a base conhecida mais nova que e
198
201
  * ancestral do HEAD; `semAncestral` diz que HEAD e base atual nao tem historia em comum.
202
+ *
203
+ * RM-037 (fatia 3, defeito 3): `baseReescrita` diz que o ponto de partida nao esta mais na base atual.
204
+ * A base so anda para a frente; quando o ponto em que a thread saiu dela deixa de ser ancestral, a base
205
+ * foi reescrita, mesmo com ancestral comum mais antigo (force-push que tirou commits). Nesse caso o
206
+ * `git rebase <base>` reaplicaria, junto com os commits da thread, os `sairamDaBase` que a reescrita tirou.
199
207
  */
200
208
  function historiaPropria(raiz, thread, dir, shaBase) {
201
209
  const git = (...args) => (0, util_1.exec)('git', args, dir);
@@ -212,11 +220,13 @@ function historiaPropria(raiz, thread, dir, shaBase) {
212
220
  const conhecidas = [...new Set([pontoDaCriacao, ...sincronizadas])].filter(valido);
213
221
  const semAncestral = git('merge-base', 'HEAD', shaBase).code === 1;
214
222
  const pontoDePartida = [...conhecidas].reverse().find(sha => git('merge-base', '--is-ancestor', sha, 'HEAD').ok) ?? null;
223
+ const baseReescrita = pontoDePartida !== null && !git('merge-base', '--is-ancestor', pontoDePartida, shaBase).ok;
224
+ const numero = (r) => r.ok && /^\d+$/.test(r.stdout.trim()) ? Number(r.stdout.trim()) : null;
225
+ const sairamDaBase = baseReescrita ? numero(git('rev-list', '--count', pontoDePartida, '--not', shaBase)) : null;
215
226
  if (!conhecidas.length)
216
- return { proprios: null, pontoDePartida, semAncestral };
217
- const contagem = git('rev-list', '--count', 'HEAD', '--not', ...conhecidas, shaBase);
218
- const proprios = contagem.ok && /^\d+$/.test(contagem.stdout.trim()) ? Number(contagem.stdout.trim()) : null;
219
- return { proprios, pontoDePartida, semAncestral };
227
+ return { proprios: null, pontoDePartida, semAncestral, baseReescrita, sairamDaBase };
228
+ const proprios = numero(git('rev-list', '--count', 'HEAD', '--not', ...conhecidas, shaBase));
229
+ return { proprios, pontoDePartida, semAncestral, baseReescrita, sairamDaBase };
220
230
  }
221
231
  /**
222
232
  * Sincroniza a branch da thread com a base ATUAL (rebase), quando a base avancou.
@@ -360,9 +370,25 @@ function sincronizarWorktree(carregado, id, opcoes = {}) {
360
370
  `${historia.proprios ?? 'um numero desconhecido de'} commit(s) proprio(s): o rebase reaplicaria a historia antiga inteira`;
361
371
  if (!opcoes.dryRun)
362
372
  (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeSincronizada, { dir, branch, base, shaBase, shaAntes,
363
- rebaseFeito: false, motivo: 'tree.blocked', semAncestral: true, detalhe });
373
+ rebaseFeito: false, motivo: 'tree.blocked', causa: 'base-reescrita', semAncestral: true, detalhe });
374
+ return { ...vazio, shaBase, shaAntes, shaDepois: shaAntes, ok: false, jaAtualizada: false, rebaseFeito: false,
375
+ motivo: 'tree.blocked', causa: 'base-reescrita', detalhe, correcao: `reaplique so os commits da thread sobre a base nova: ${onto}` };
376
+ }
377
+ // RM-037 (fatia 3, defeito 3): com ancestral comum, o sync caia no `git rebase <base>` abaixo e
378
+ // reaplicava tambem o que a reescrita tirou da base. O ponto de partida fora da base atual e o sinal.
379
+ if (historia.baseReescrita) {
380
+ const ponto = historia.pontoDePartida;
381
+ passos.push(`git merge-base --is-ancestor ${ponto.slice(0, 8)} ${shaBase.slice(0, 8)} (falso: a base foi reescrita)`);
382
+ const detalhe = `a base ${base} foi reescrita: o ponto de partida ${ponto.slice(0, 8)} da branch ${branch} nao esta mais nela, ` +
383
+ `e o rebase comum reaplicaria ${historia.sairamDaBase ?? 'um numero desconhecido de'} commit(s) que sairam da base junto com ` +
384
+ `o(s) ${historia.proprios ?? '?'} da thread (git rev-list --count HEAD --not ${ponto.slice(0, 8)} ${shaBase.slice(0, 8)})`;
385
+ if (!opcoes.dryRun)
386
+ (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeSincronizada, { dir, branch, base, shaBase, shaAntes,
387
+ rebaseFeito: false, motivo: 'tree.blocked', causa: 'base-reescrita', baseReescrita: true, pontoDePartida: ponto,
388
+ sairamDaBase: historia.sairamDaBase, proprios: historia.proprios, detalhe });
364
389
  return { ...vazio, shaBase, shaAntes, shaDepois: shaAntes, ok: false, jaAtualizada: false, rebaseFeito: false,
365
- motivo: 'tree.blocked', detalhe, correcao: `reaplique so os commits da thread sobre a base nova: ${onto}` };
390
+ motivo: 'tree.blocked', causa: 'base-reescrita', detalhe,
391
+ correcao: `reaplique so os commits da thread sobre a base nova: git -C ${dir} rebase --onto ${shaBase} ${ponto}` };
366
392
  }
367
393
  if (opcoes.dryRun) {
368
394
  passos.push(`git rebase ${shaBase}`);
@@ -29,7 +29,7 @@
29
29
  "assercoes": [
30
30
  {
31
31
  "tipo": "contem",
32
- "valor": "Valores secretos ficam em",
32
+ "valor": "Valores secretos ficam no ambiente do",
33
33
  "porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
34
34
  },
35
35
  {
@@ -0,0 +1,20 @@
1
+ {
2
+ "id": "fx-pedido-colado",
3
+ "sobre": "Incidente de 01/10/2026 (RM-057): o pedido colado com autorização explícita segue sem parar",
4
+ "precisa": [
5
+ "git"
6
+ ],
7
+ "esperado": {
8
+ "simulado": true,
9
+ "modoDoPedido": "auto",
10
+ "semPausaDoModo": true,
11
+ "decisaoInformada": true,
12
+ "confirmoRecusado": "hitl.selecao.texto-livre",
13
+ "nadaGravadoNaRecusa": true,
14
+ "humanosNoPulse": 0,
15
+ "perguntasDeConducao": 0,
16
+ "tempoParadoMs": 0,
17
+ "adaptadoresComARegra": 4
18
+ },
19
+ "porque": "Na noite de 01 para 02/10 o condutor parou mais de 10 h pedindo um confirmo em texto livre a um pedido colado que já trazia a autorização. O canário prova, contra o código real, que o #Auto não pausa, a dúvida vira decisão informada, o confirmo em texto é recusado sem gravar nada, ninguém aparece esperando no pulse, o tempo parado é zero e os quatro adaptadores dizem a regra."
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orkastery/cli",
3
- "version": "0.5.0",
3
+ "version": "0.5.3",
4
4
  "description": "A software factory of AI agents that proves its work: parallel threads, verified results, and short decisions only when they matter.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/orkastery/orkastery#readme",
@@ -65,12 +65,16 @@
65
65
  },
66
66
  "devDependencies": {
67
67
  "@types/node": "^22.10.2",
68
- "markdownlint-cli2": "^0.23.3",
69
- "typescript": "^5.9.2"
68
+ "markdownlint-cli2": "^0.22.1"
70
69
  },
71
70
  "dependencies": {
72
71
  "@modelcontextprotocol/sdk": "1.29.0",
72
+ "decode-named-character-reference": "1.3.0",
73
+ "micromark": "4.0.2",
74
+ "micromark-extension-gfm-table": "2.1.1",
75
+ "micromark-util-decode-numeric-character-reference": "2.0.2",
73
76
  "smol-toml": "1.8.0",
77
+ "typescript": "5.9.3",
74
78
  "zod": "3.25.76",
75
79
  "zod-to-json-schema": "3.25.2"
76
80
  }
@@ -54,7 +54,7 @@ flowchart LR
54
54
 
55
55
  | # | Verificacao | Como se comprova |
56
56
  |---|---|---|
57
- | 16 | Existe MASTER log valido contra o contrato congelado `ork.master-log/v1`, com POSTMORTEM tipado, classes de falha do catalogo fixo, score inteiro de 0 a 5 e justificativa nao vazia. Uma entrega sem MASTER log nao aconteceu. | `ork master <thread> --score N --justificativa "<texto>"`. O comando recusa score fora da escala, score sem justificativa e classe fora do catalogo, e nao grava nada quando recusa. |
57
+ | 16 | Existe MASTER log valido contra o contrato congelado `ork.master-log/v1`, com POSTMORTEM tipado, classes de falha do catalogo fixo, score inteiro de 0 a 5 e justificativa nao vazia. Uma entrega sem MASTER log nao aconteceu. | `ork master <thread> --score N --justificativa "<texto>" --por <quem>`. O comando recusa score fora da escala, score sem justificativa, score sem autoria humana em `--por` e classe fora do catalogo, e nao grava nada quando recusa. |
58
58
 
59
59
  ## Toda thread, no seu inicio
60
60
 
package/skills/README.md CHANGED
@@ -18,7 +18,7 @@ faz, o nucleo vence, e a divergencia e defeito da skill.
18
18
  | phases | [go-implementation](phases/go-implementation/SKILL.md) | `ork worktree ensure`, `ork verify --baseline` |
19
19
  | phases | [check-quality](phases/check-quality/SKILL.md) | `ork verify`, `ork gate request` |
20
20
  | phases | [ship-release](phases/ship-release/SKILL.md) | `ork ship` |
21
- | phases | [master-metrics](phases/master-metrics/SKILL.md) | `ork master`, `ork master --aceitar-omissao` |
21
+ | phases | [master-metrics](phases/master-metrics/SKILL.md) | `ork master`, `ork master <thread> --aceitar-omissao` |
22
22
  | reviewers | [code-reviewer](reviewers/code-reviewer/SKILL.md) | `references/code-review-axes.md` |
23
23
  | reviewers | [security-auditor](reviewers/security-auditor/SKILL.md) | `references/security-checklist.md` |
24
24
  | reviewers | [test-engineer](reviewers/test-engineer/SKILL.md) | `references/testing-patterns.md` |
@@ -24,8 +24,9 @@ preservando as demais respostas. Exemplo de opt-out:
24
24
  `ork onboarding set maestro --conteudo '{"owner":{"experience":false}}' --por equipe`.
25
25
  Sem resposta, mantenha a pergunta pendente: defaults efetivos não são autoria humana.
26
26
 
27
- Peça somente referências de variáveis nas etapas sensíveis. Valores secretos ficam em
28
- `~/.hermes/.env`; não leia esse arquivo nem leve credenciais para conversa, onboarding ou ledger.
27
+ Peça somente referências de variáveis nas etapas sensíveis. Valores secretos ficam no ambiente do
28
+ processo ou no cofre do host (no Hermes, `~/.hermes/.env`); não os leia nem leve credenciais para
29
+ conversa, onboarding ou ledger.
29
30
  Se o builder fornecer um segredo, não o repita: oriente a configuração local e registre apenas
30
31
  a referência pública aceita pelo núcleo.
31
32
 
@@ -56,6 +56,7 @@ Prefira MCP no projeto fixado pelo servidor, sem outro root/cwd. No Claude com s
56
56
  | Demanda nova | `ork_thread_new(nome, modo)` | `ork thread new "<nome>" --mode <modo> --worktree auto` |
57
57
  | Despacho | `ork_phase_run(threadId, fase, prompt, runtime?, model?, effort?, dryRun?)` | `ork phase run <thread> GOAL --prompt "<pedido>"` |
58
58
  | Progresso nativo | `ork_observe(threadId)` | `ork thread status <thread>` |
59
+ | Contexto do grafo (somente com `grafo.mcp: true`) | `ork_grafo_contexto(threadId, tetoBytes?)`; aprofundar com `ork_grafo_vizinhos`, `ork_grafo_chamadores`, `ork_grafo_importadores`, `ork_grafo_caminho` | `ork grafo contexto <thread> --json` |
59
60
  | Pendencia/decisao | `ork_hitl_pending`, `ork_request_decision(threadId, pedidoId)` | Consulte o ingresso suportado; nao fabrique resposta. |
60
61
 
61
62
  Prefira `ork_git_commit` (HEAD atual, paths com claims), `ork_verify` e `ork_ship` (HEADs fonte/destino reais) para registrar, verificar e entregar. Autoria/commit nao e SHIP; retorno incomplete exige reconciliacao antes de repetir. Para demandas novas, use `ork modos --do-pedido "<pedido do dono>"` e `ork_preflight({modo})` (CLI: `ork doctor --modo <modo>`). A sonda por bloco não comprova autenticação, gates ou entrega.
@@ -71,8 +72,7 @@ Dry-run nao inicia modelo, mas pode gravar prompt/eventos. Confira o trio efetiv
71
72
 
72
73
  ## Conducao durante o trabalho
73
74
 
74
- O modo afrouxa a pausa, NUNCA a verificacao. Claims, verify, policies e gates tipados
75
- rodam identicos em `#Classic` e em `#Auto`; o modo decide se o veredito espera o humano.
75
+ O modo afrouxa a pausa, NUNCA a verificacao. Claims, verify, policies e gates tipados rodam identicos em `#Classic` e em `#Auto`; o modo decide se o veredito espera o humano.
76
76
 
77
77
  Depois de uma acao, use o resultado do nucleo para executar o proximo passo autorizado.
78
78
  Em #Auto/#Maestro, nao termine um bloco apenas oferecendo continuar quando ainda ha trabalho
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: master-metrics
3
- description: "Fase MASTER (F6): POSTMORTEM tipado, MASTER log no contrato congelado ork.master-log/v1 e o score humano de 0 a 5 com justificativa. Roteia para ork master e ork master --aceitar-omissao."
3
+ description: "Fase MASTER (F6): POSTMORTEM tipado, MASTER log no contrato congelado ork.master-log/v1 e o score humano de 0 a 5 com justificativa. Roteia para ork master e ork master <thread> --aceitar-omissao."
4
4
  bucket: phases
5
- roteia: "ork master <thread> --score N --justificativa \"...\" | ork master --aceitar-omissao"
5
+ roteia: "ork master <thread> --score N --justificativa \"...\" | ork master <thread> --aceitar-omissao"
6
6
  license: MIT
7
7
  ---
8
8
 
@@ -21,9 +21,14 @@ ork master classes # as classes de falha do catalogo
21
21
  ork master <thread> --score 4 --justificativa "<texto>" --classe base-avancou --por <quem>
22
22
  ork master # as entregas, com o indice derivado do ledger
23
23
  ork master --todas # inclusive as ja pontuadas
24
- ork master --aceitar-omissao # aceita as entregues, com indice e insumos no ledger
24
+ ork master <thread> --aceitar-omissao # aceita so a entrega desta thread, com indice e insumos no ledger
25
+ ork master --aceitar-omissao --dry-run # lista o que a forma sem thread fecharia, sem gravar
25
26
  ```
26
27
 
28
+ Agente fecha so a propria thread: `ork master <thread> --aceitar-omissao`. Sem a thread, o comando
29
+ aceita TODAS as entregues do projeto, inclusive as de outras frentes paralelas (o que aconteceu tres
30
+ vezes em 03/10/2026); de processo de agente com mais de uma, o `ork` avisa em stderr.
31
+
27
32
  ## O que o MASTER entrega
28
33
 
29
34
  1. **POSTMORTEM tipado**, com as fases percorridas, o que falhou e a classe de falha vinda de um
@@ -38,9 +38,12 @@ ork phase list <thread> # a prova: mergeSha, shaRemoto, push
38
38
 
39
39
  ## O que o nucleo verifica por voce
40
40
 
41
- A policy `push_direto_na_base` e bloqueante: origem igual ao destino, ou origem igual a branch base
42
- do projeto, reprova antes de o `ork` tocar no remoto. Arvore de destino ocupada sai como
43
- `tree.blocked`; lease tomado por outra thread sai como `lease.busy`.
41
+ A policy `push_direto_na_base` e bloqueante: origem igual ao destino, origem igual a branch base
42
+ do projeto, ou entrega sem delta com a base local a frente do remoto (o push publicaria commit que
43
+ nao passou por merge de thread) reprova antes de o `ork` tocar no remoto. O merge que o proprio
44
+ ship ja fez e nao chegou ao remoto (push recusado, `--sem-push`) nao conta: o ship repetido empurra.
45
+ Arvore de destino ocupada sai como `tree.blocked`; lease tomado por outra thread sai como
46
+ `lease.busy`.
44
47
 
45
48
  ## Racionalizacoes comuns
46
49