@orkastery/cli 0.6.1 → 0.6.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 (102) hide show
  1. package/adapters/claude-code/README.md +1 -1
  2. package/adapters/claude-code/agents/ork-check.md +1 -1
  3. package/adapters/claude-code/agents/ork-go.md +1 -1
  4. package/adapters/claude-code/agents/ork-goal.md +1 -1
  5. package/adapters/claude-code/agents/ork-master.md +1 -1
  6. package/adapters/claude-code/agents/ork-plan.md +1 -1
  7. package/adapters/claude-code/agents/ork-ship.md +1 -1
  8. package/adapters/claude-code/commands/ork.md +1 -1
  9. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +2 -0
  10. package/adapters/codex/skills/ork/SKILL.md +1 -1
  11. package/adapters/hermes/README.md +1 -1
  12. package/adapters/openclaw/openclaw.plugin.json +1 -1
  13. package/adapters/openclaw/package.json +1 -1
  14. package/assets/adapters-en/claude-code/README.md +1 -1
  15. package/assets/adapters-en/claude-code/agents/ork-check.md +1 -1
  16. package/assets/adapters-en/claude-code/agents/ork-go.md +1 -1
  17. package/assets/adapters-en/claude-code/agents/ork-goal.md +1 -1
  18. package/assets/adapters-en/claude-code/agents/ork-master.md +1 -1
  19. package/assets/adapters-en/claude-code/agents/ork-plan.md +1 -1
  20. package/assets/adapters-en/claude-code/agents/ork-ship.md +1 -1
  21. package/assets/adapters-en/claude-code/commands/ork.md +1 -1
  22. package/assets/adapters-en/codex/skills/ork/SKILL.md +1 -1
  23. package/assets/adapters-en/hermes/README.md +1 -1
  24. package/assets/docs/padroes/roadmap-de-produto.md +1 -1
  25. package/assets/docs-en/padroes/roadmap-de-produto.md +1 -1
  26. package/assets/orkmind_fixture.py +4 -1
  27. package/assets/references-en/testing-patterns.md +1 -1
  28. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +1 -1
  29. package/assets/skills-en/phases/check-quality/SKILL.md +1 -1
  30. package/assets/skills-en/phases/go-implementation/SKILL.md +1 -1
  31. package/dist/adapters/claude-bg.js +3 -1
  32. package/dist/adapters/grok-mcp-servidor.js +22 -12
  33. package/dist/adapters/grok.js +1 -1
  34. package/dist/agendador-cpu.js +10 -2
  35. package/dist/catalogo.js +3 -3
  36. package/dist/{canarios-hitl.js → cenarios-hitl.js} +7 -7
  37. package/dist/{canarios-i43.js → cenarios-i43.js} +16 -16
  38. package/dist/{canarios-pulse.js → cenarios-pulse.js} +3 -3
  39. package/dist/{canarios-rm057.js → cenarios-rm057.js} +3 -3
  40. package/dist/{canarios-sensores.js → cenarios-sensores.js} +5 -5
  41. package/dist/{canarios.js → cenarios.js} +22 -22
  42. package/dist/changelog-check.js +217 -0
  43. package/dist/check-agil.js +242 -5
  44. package/dist/check-paralelo.js +17 -4
  45. package/dist/ci.js +3 -2
  46. package/dist/claim-lint.js +29 -0
  47. package/dist/claims.js +5 -1
  48. package/dist/docs.js +8 -1
  49. package/dist/evalrunner.js +37 -37
  50. package/dist/fila-pesada.js +121 -11
  51. package/dist/hitl-canais.js +1 -1
  52. package/dist/hitl-classificacao.js +1 -0
  53. package/dist/hitl-presentation.js +1 -1
  54. package/dist/hitl-tempo-parado.js +1 -1
  55. package/dist/index.js +47 -29
  56. package/dist/init.js +1 -1
  57. package/dist/intelligence-graph-cli.js +27 -9
  58. package/dist/locale-ajuda.js +6 -6
  59. package/dist/locale-claims.js +16 -2
  60. package/dist/locale-grafo.js +56 -1
  61. package/dist/locale-maestro.js +38 -0
  62. package/dist/locale-network.js +8 -6
  63. package/dist/locale-onboarding.js +14 -0
  64. package/dist/locale-operacao-restante.js +18 -18
  65. package/dist/locale-preflight.js +80 -0
  66. package/dist/locale-projetos.js +6 -0
  67. package/dist/locale-prompts.js +8 -8
  68. package/dist/locale-pulse.js +4 -0
  69. package/dist/locale-retry.js +16 -0
  70. package/dist/locale-security-scan.js +35 -1
  71. package/dist/locale-verify.js +15 -0
  72. package/dist/locale.js +24 -7
  73. package/dist/maestro-cli.js +12 -17
  74. package/dist/mcp-install.js +2 -1
  75. package/dist/mcp-server.js +20 -17
  76. package/dist/mcp-verify-async.js +353 -0
  77. package/dist/mcp-verify-worker.js +17 -0
  78. package/dist/mcp-verify.js +10 -1
  79. package/dist/pedido-conducao.js +51 -0
  80. package/dist/preflight.js +25 -26
  81. package/dist/prompts.js +4 -2
  82. package/dist/pulse.js +4 -2
  83. package/dist/rede.js +24 -12
  84. package/dist/retry.js +12 -0
  85. package/dist/sandbox.js +11 -11
  86. package/dist/security-scan/cli.js +2 -2
  87. package/dist/security-scan/report.js +1 -1
  88. package/dist/session-watcher.js +33 -7
  89. package/dist/verify.js +166 -34
  90. package/eval/README.md +8 -8
  91. package/eval/fixtures/fx-codex-dry/caso.json +1 -1
  92. package/eval/fixtures/fx-happy/caso.json +1 -1
  93. package/eval/fixtures/fx-indice-reversao/caso.json +1 -1
  94. package/eval/fixtures/fx-listagem-abertas/caso.json +1 -1
  95. package/eval/fixtures/fx-omnicanal/caso.json +1 -1
  96. package/eval/fixtures/fx-pedido-colado/caso.json +1 -1
  97. package/eval/fixtures/fx-schema-drift/caso.json +1 -1
  98. package/package.json +1 -1
  99. package/references/testing-patterns.md +1 -1
  100. package/skills/core/orkastery-bootstrap/SKILL.md +1 -1
  101. package/skills/phases/check-quality/SKILL.md +1 -1
  102. package/skills/phases/go-implementation/SKILL.md +1 -1
package/dist/verify.js CHANGED
@@ -78,6 +78,7 @@ const thread_1 = require("./thread");
78
78
  const estado_thread_1 = require("./estado-thread");
79
79
  const dependencias_da_worktree_1 = require("./dependencias-da-worktree");
80
80
  const fs = __importStar(require("node:fs"));
81
+ const os = __importStar(require("node:os"));
81
82
  const node_fs_1 = require("node:fs");
82
83
  const path = __importStar(require("node:path"));
83
84
  const node_path_1 = require("node:path");
@@ -98,6 +99,7 @@ const check_modo_1 = require("./check-modo");
98
99
  const check_agil_1 = require("./check-agil");
99
100
  const check_paralelo_1 = require("./check-paralelo");
100
101
  const agendador_cpu_1 = require("./agendador-cpu");
102
+ const changelog_check_1 = require("./changelog-check");
101
103
  /** Teto de tempo de um comando de verificacao (build e suite completa cabem). */
102
104
  exports.TIMEOUT_VERIFY_MS = 10 * 60 * 1000;
103
105
  /** Ultimas linhas da saida real, o suficiente para servir de evidencia no ledger. */
@@ -302,6 +304,7 @@ function comandoNoLedger(c) {
302
304
  // RM-072 (D2): a duracao vai tambem no comando que passa, para a meta do CHECK ser medida pelo ledger. RM-072 (D4, D5):
303
305
  // no Agile, o uso do preparo e as lanes; o Classic nao tem esses campos.
304
306
  const doAgile = { ...(c.preparo ? { preparo: c.preparo } : {}),
307
+ ...(c.lane ? { lane: c.lane } : {}),
305
308
  ...(c.lanes ? { lanes: c.lanes.map((l) => ({ ...l, comando: (0, redacao_url_1.redigirCredenciaisUrl)(l.comando) })) } : {}),
306
309
  ...(c.comandoExecutado ? { comandoExecutado: (0, redacao_url_1.redigirCredenciaisUrl)(c.comandoExecutado) } : {}) };
307
310
  if (c.ok)
@@ -327,6 +330,19 @@ function comandosDoManifesto(manifesto) {
327
330
  }
328
331
  return lista;
329
332
  }
333
+ /** A regra estrutural do CHANGELOG entra no mesmo veredito e na mesma baseline dos comandos do manifesto. */
334
+ function verificarChangelog(cwd, base, baseCarimbada) {
335
+ if (!(0, changelog_check_1.changelogAplicavel)(cwd))
336
+ return null;
337
+ const inicio = Date.now();
338
+ const comando = `node core/scripts/checar-changelog.cjs --base "${base}"`;
339
+ const r = (0, changelog_check_1.checarChangelog)(cwd, { base, head: 'HEAD', baseCarimbada });
340
+ return {
341
+ nome: 'changelog', comando, ok: r.ok, code: r.ok ? 0 : r.motivo === 'changelog.base-indisponivel' ? 2 : 1,
342
+ resumo: r.ok ? r.detalhe : `${r.motivo}: ${r.detalhe}\ncorrecao: ${r.correcao ?? 'corrija o CHANGELOG'}`,
343
+ causa: 'exit', prazoMs: 0, duracaoMs: Date.now() - inicio, executado: true,
344
+ };
345
+ }
330
346
  /**
331
347
  * Diretorio onde a verificacao roda: a worktree da thread, ou a raiz do projeto. RM-047 (P2): a worktree
332
348
  * do `thread.json` so vale registrada no `git worktree list` e com o estado local (`estado.rastreado`,
@@ -464,12 +480,15 @@ function agileNoLedger(raiz, threadId, commit, pecasDoVerify, doAgile, guarda, r
464
480
  relatorio.fechar();
465
481
  const doRelatorio = (0, check_agil_1.pecasDoRelatorio)(linhas);
466
482
  const listas = (0, check_agil_1.listasDasLanes)(linhas);
483
+ const resultados = (0, check_agil_1.resultadosDasLanes)(linhas);
467
484
  const usos = claims.flatMap((c) => c.execucoes.map((e) => e.preparo).filter((u) => !!u));
485
+ const usosDasLanes = claims.flatMap((c) => c.execucoes.filter((e) => e.lane));
468
486
  const resumo = {
469
487
  pecas: [...pecasDoVerify, ...doRelatorio],
470
488
  grupo: { paralelo: doAgile?.paralelo ?? false, lanes: doAgile?.lanes ?? [] },
471
489
  produto: guarda.hashCurto(),
472
- claims: { reaproveitadas: usos.filter((u) => u.reaproveitado).length, inteiras: usos.filter((u) => !u.reaproveitado).length },
490
+ claims: { reaproveitadas: usos.filter((u) => u.reaproveitado).length, inteiras: usos.filter((u) => !u.reaproveitado).length,
491
+ lanes: usosDasLanes.length },
473
492
  lanes: listas.map((l) => ({ lane: l.lane, arquivos: l.arquivos.length, sha256: l.sha256 })),
474
493
  orcamento: linhas.filter((l) => l.tipo === 'duracoes').map(({ tipo: _tipo, ...resto }) => resto),
475
494
  };
@@ -478,7 +497,7 @@ function agileNoLedger(raiz, threadId, commit, pecasDoVerify, doAgile, guarda, r
478
497
  const arquivo = path.join((0, thread_1.dirThread)(raiz, threadId), 'check', `${commit.slice(0, 12)}-lanes.json`);
479
498
  try {
480
499
  fs.mkdirSync(path.dirname(arquivo), { recursive: true, mode: 0o700 });
481
- fs.writeFileSync(arquivo, JSON.stringify({ commit, lanes: listas.map((l) => ({ lane: l.lane, arquivos: l.arquivos })) }, null, 1) + '\n', { mode: 0o600 });
500
+ fs.writeFileSync(arquivo, JSON.stringify({ commit, lanes: listas.map((l) => ({ lane: l.lane, arquivos: l.arquivos })), resultados }, null, 1) + '\n', { mode: 0o600 });
482
501
  resumo.evidencia = path.relative((0, estado_thread_1.raizDoEstado)(raiz), arquivo);
483
502
  }
484
503
  catch { /* sem o arquivo, o ledger ainda guarda a contagem e o sha256 de cada lane */ }
@@ -529,7 +548,7 @@ function exigirDependenciasDaWorktree(carregado, threadId, cwd, operacao, conduc
529
548
  }
530
549
  /** `ork verify --baseline`: grava o estado do mundo ANTES do GO. Sem `executor`, o da rodada (`executorDaRodada`). */
531
550
  function gravarBaseline(carregado, threadId, executor, conducao = {}, origem = 'cli', leitor = steal_1.lerProcStat, modo) {
532
- const pedido = pedidoDoVerify(carregado, threadId, 'baseline', comandosDoManifesto(carregado.manifesto).length, conducao);
551
+ const pedido = pedidoDoVerify(carregado, threadId, 'baseline', comandosDoManifesto(carregado.manifesto).length + 1, conducao);
533
552
  return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => naFilaPesada(carregado, threadId, 'baseline', conducao, () => gravarBaselineSobConducao(carregado, threadId, executor, tomada, origem, leitor, modo)));
534
553
  }
535
554
  function gravarBaselineSobConducao(carregado, threadId, base, tomada, origem, leitor, modo) {
@@ -551,7 +570,7 @@ function gravarBaselineSobConducao(carregado, threadId, base, tomada, origem, le
551
570
  // seria reaproveitado e os comandos rodam como no Classic.
552
571
  // RM-072 (A6 do CHECK): as pecas do preparo, do grupo e do relatorio vao ao `baseline_recorded`, como no `verify_run`.
553
572
  const pecasDaBaseline = [];
554
- const comandos = relatorio && manifesto.check?.agile?.produto?.length
573
+ const comandosDoManifestoExecutados = relatorio && manifesto.check?.agile?.produto?.length
555
574
  ? (() => {
556
575
  const p = (0, check_agil_1.prepararNoAgile)(manifesto, cwd, executor);
557
576
  pecasDaBaseline.push(...p.pecas);
@@ -560,6 +579,8 @@ function gravarBaselineSobConducao(carregado, threadId, base, tomada, origem, le
560
579
  return r.comandos;
561
580
  })()
562
581
  : comandosDoManifesto(manifesto).map((c) => executorDosComandos(c.nome, c.comando, cwd));
582
+ const changelog = verificarChangelog(cwd, manifesto.worktree.base_branch, thread.base?.commit);
583
+ const comandos = changelog ? [...comandosDoManifestoExecutados, changelog] : comandosDoManifestoExecutados;
563
584
  if (relatorio) {
564
585
  if (base)
565
586
  pecasDaBaseline.push(check_agil_1.PECA_SEM_RELATORIO);
@@ -582,7 +603,9 @@ function gravarBaselineSobConducao(carregado, threadId, base, tomada, origem, le
582
603
  commit: baseline.commit,
583
604
  cwd,
584
605
  comandos: comandos.map((c) => ({ nome: c.nome, comando: c.comando, ok: c.ok, code: c.code, prazoMs: c.prazoMs ?? null,
585
- ...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}), ...(c.ok ? {} : { causa: c.causa ?? null }) })),
606
+ ...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}), ...(c.ok ? {} : { causa: c.causa ?? null }),
607
+ ...(c.testeQueCaiu?.length ? { testeQueCaiu: c.testeQueCaiu } : {}),
608
+ ...(c.lanes?.length ? { lanes: c.lanes.map((l) => ({ ...l, comando: (0, redacao_url_1.redigirCredenciaisUrl)(l.comando) })) } : {}) })),
586
609
  check: checkNoLedger(check),
587
610
  ...(pecasDaBaseline.length ? { agile: { pecas: pecasDaBaseline } } : {}),
588
611
  // RM-037 (defeito 1 de 19 e 20/10/2026): o que a baseline nao provou fica dito no proprio evento.
@@ -592,6 +615,38 @@ function gravarBaselineSobConducao(carregado, threadId, base, tomada, origem, le
592
615
  });
593
616
  return baseline;
594
617
  }
618
+ function nomesUnicos(nomes) {
619
+ return [...new Set(nomes ?? [])];
620
+ }
621
+ /** Compara os conjuntos que o runner realmente nomeou; sucesso prova que o conjunto atual e vazio. */
622
+ function compararComBaseline(atual, antes) {
623
+ if (atual.ok && antes.ok)
624
+ return null;
625
+ const nomesAntes = nomesUnicos(antes.testeQueCaiu);
626
+ const nomesAtuais = nomesUnicos(atual.testeQueCaiu);
627
+ const baselineNominal = antes.ok || nomesAntes.length > 0;
628
+ const rodadaNominal = atual.ok || nomesAtuais.length > 0;
629
+ if (baselineNominal && rodadaNominal) {
630
+ const antesSet = new Set(nomesAntes);
631
+ const atualSet = new Set(nomesAtuais);
632
+ return {
633
+ comando: atual.nome,
634
+ granularidade: 'teste',
635
+ regressoes: nomesAtuais.filter((nome) => !antesSet.has(nome)),
636
+ preExistentes: nomesAtuais.filter((nome) => antesSet.has(nome)),
637
+ corrigidos: nomesAntes.filter((nome) => !atualSet.has(nome)),
638
+ };
639
+ }
640
+ return {
641
+ comando: atual.nome,
642
+ granularidade: 'comando',
643
+ regressoes: [],
644
+ preExistentes: [],
645
+ corrigidos: [],
646
+ classificacaoDoComando: atual.ok ? 'corrigido' : antes.ok ? 'regressao' : 'pre-existente',
647
+ motivoDoFallback: baselineNominal ? 'rodada-sem-nomes' : 'baseline-sem-nomes',
648
+ };
649
+ }
595
650
  /**
596
651
  * Reexecuta a claim no HEAD real e devolve o veredito com o motivo tipado.
597
652
  *
@@ -656,6 +711,7 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
656
711
  const inicioDaRodada = Date.now();
657
712
  const thread = (0, thread_1.lerThread)(raiz, threadId);
658
713
  const cwd = cwdDaThread(raiz, thread);
714
+ opcoes.progresso?.('preflight');
659
715
  exigirDependenciasDaWorktree(carregado, threadId, cwd, 'verify', conducao, opcoes.executor);
660
716
  const commit = commitReal(cwd);
661
717
  const dir = (0, thread_1.dirThread)(raiz, threadId);
@@ -673,14 +729,26 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
673
729
  // RM-072 (D8): no Agile, as pecas contam o que rodaram num relatorio da rodada, lido no fim.
674
730
  const agil = check.modo === 'agile';
675
731
  const relatorio = agil ? new check_agil_1.RelatorioDoCheck() : null;
676
- const ambienteDaRodada = { ...ambienteDoModo(check), ...relatorio?.ambiente() };
732
+ const casaDaRodada = agil && !(process.env.ORKASTERY_HOME || '').trim()
733
+ ? fs.mkdtempSync(path.join(os.tmpdir(), 'ork-verify-casa-')) : null;
734
+ const ambienteFuncional = { ...ambienteDoModo(check), ...(casaDaRodada ? { ORKASTERY_HOME: casaDaRodada } : {}) };
735
+ const ambienteDaRodada = { ...ambienteFuncional, ...relatorio?.ambiente() };
677
736
  // I-37 (D2, D3): o prazo de cada comando sai do manifesto carregado no inicio da rodada;
678
737
  // editar o manifesto no meio dela nao muda o teto de quem ainda vai rodar.
679
- const executor = executorSobConducao(executorDaRodada(manifesto, instabilidade, opcoes.executor, leitor, ambienteDaRodada), manifesto, conducao);
738
+ const observar = (base) => opcoes.progresso
739
+ ? (nome, comando, dir) => { opcoes.progresso(nome); return base(nome, comando, dir); }
740
+ : base;
741
+ const executor = executorSobConducao(observar(executorDaRodada(manifesto, instabilidade, opcoes.executor, leitor, ambienteDaRodada)), manifesto, conducao);
680
742
  // RM-072 (A3 do CHECK): as claims recebem o modo, nunca o relatorio da rodada; o teste que roda a varredura dentro de uma
681
743
  // claim gravaria pecas de fixture no relatorio do verify. O relatorio fica com o preparo e o grupo.
682
744
  const executorDasClaims = relatorio
683
- ? executorSobConducao(executorDaRodada(manifesto, instabilidade, opcoes.executor, leitor, ambienteDoModo(check)), manifesto, conducao)
745
+ ? executorSobConducao(observar(executorDaRodada(manifesto, instabilidade, opcoes.executor, leitor, ambienteFuncional)), manifesto, conducao)
746
+ : executor;
747
+ // Uma claim `node --test` elegivel usa o mesmo ambiente funcional das lanes: casa compartilhada, sem o modo da
748
+ // orquestracao. Assim o fallback da claim e a prova reaproveitada observam exatamente a mesma bateria.
749
+ const ambienteFuncionalDasLanes = { ...(casaDaRodada ? { ORKASTERY_HOME: casaDaRodada } : {}) };
750
+ const executorDasClaimsComoLane = relatorio
751
+ ? executorSobConducao(observar(executorDaRodada(manifesto, instabilidade, opcoes.executor, leitor, ambienteFuncionalDasLanes)), manifesto, conducao)
684
752
  : executor;
685
753
  // RM-072 (S-b do CHECK 2): fora do preparo, so a varredura e as lanes recebem o relatorio.
686
754
  const executorDosComandos = relatorio ? soAVarreduraEAsLanesComRelatorio(executor, executorDasClaims) : executor;
@@ -713,15 +781,34 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
713
781
  pecas.push(...(0, check_agil_1.refazerPreparo)(manifesto, cwd, executor, vigente, (p) => guardaDoPreparo(manifesto, cwd, p), quando));
714
782
  };
715
783
  let preparosRefeitos = 0;
784
+ let lanesVigentes = true;
716
785
  const refazerAntesDaClaim = (nome) => {
717
786
  if (!vigente || preparosRefeitos >= check_agil_1.MAXIMO_DE_PREPAROS_REFEITOS)
718
787
  return false;
719
788
  preparosRefeitos++;
789
+ lanesVigentes = false;
720
790
  refazer(`antes da claim ${nome}`);
721
791
  return true;
722
792
  };
793
+ // RM-074 M1: no Agile, as lanes rodam antes das claims para seus resultados nominais poderem provar `node --test`.
794
+ // Classic conserva a ordem anterior. O build continua vindo do preparo desta mesma rodada.
795
+ let doAgile = null;
796
+ const grupoAntesDasClaims = !opcoes.soClaims && !!vigente && vigente.guarda.conferir() === null
797
+ && Object.keys(manifesto.check?.agile?.test ?? {}).length > 0;
798
+ let comandosDoManifestoExecutados = grupoAntesDasClaims
799
+ ? (opcoes.progresso?.('grupo-agile'), doAgile = (0, check_agil_1.comandosNoAgile)(manifesto, cwd, comandosDoManifesto(manifesto), executorDosComandos, executorDoGrupo(manifesto, ambienteDaRodada, instabilidade, leitor, conducao, opcoes.executor ? executor : undefined, opcoes.medicaoCpuAgendador), vigente.guarda, vigente.preparo)).comandos
800
+ : [];
801
+ if (doAgile)
802
+ pecas.push(...doAgile.pecas);
803
+ const evidenciasDasLanes = relatorio && doAgile ? (0, check_agil_1.resultadosDasLanes)(relatorio.ler()) : [];
804
+ const ambienteEfetivoDasClaims = { ...ambienteDoVerify(), ...ambienteFuncionalDasLanes };
805
+ const executorComLanes = evidenciasDasLanes.length > 0
806
+ ? (0, check_agil_1.executorDaClaimPelasLanes)(executorDasClaims, evidenciasDasLanes, { head: commit, ambiente: ambienteEfetivoDasClaims,
807
+ podeReaproveitar: () => lanesVigentes && vigente?.guarda.conferir() === null,
808
+ executorEquivalente: executorDasClaimsComoLane })
809
+ : executorDasClaims;
723
810
  // Claim retirada sai do gate: o historico guarda a alegacao e o motivo da retirada.
724
- const executorDaClaim = vigente ? (0, check_agil_1.executorDaClaimNoAgile)(manifesto, executorDasClaims, vigente, refazerAntesDaClaim) : executorDasClaims;
811
+ const executorDaClaim = vigente ? (0, check_agil_1.executorDaClaimNoAgile)(manifesto, executorComLanes, vigente, refazerAntesDaClaim) : executorComLanes;
725
812
  const claims = (0, claims_1.lerClaims)(raiz, threadId)
726
813
  .filter((c) => c.estado !== 'retirada')
727
814
  .map((c) => verificarClaim(c, cwd, executorDaClaim));
@@ -737,20 +824,33 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
737
824
  if (r.claim.estado !== estado)
738
825
  (0, claims_1.carimbarEstado)(raiz, r.claim, estado);
739
826
  }
740
- // RM-072 (A1 do CHECK): o produto que mudou durante as claims tem o preparo refeito antes do grupo, que segue em paralelo.
741
- // S-h do CHECK 3: o grupo tem a vaga dele, fora do teto das claims.
742
- if (vigente && !opcoes.soClaims && vigente.guarda.conferir() === 'produto-mudou')
743
- refazer('antes do grupo');
744
- // RM-072 (D4, D6): no Agile, build do preparo e o resto no grupo paralelo, com a guarda valendo.
745
- let doAgile = null;
746
- const comandos = opcoes.soClaims
747
- ? []
748
- : vigente
749
- ? (doAgile = (0, check_agil_1.comandosNoAgile)(manifesto, cwd, comandosDoManifesto(manifesto), executorDosComandos, executorDoGrupo(manifesto, ambienteDaRodada, instabilidade, leitor, conducao, opcoes.executor ? executor : undefined, opcoes.medicaoCpuAgendador), vigente.guarda, vigente.preparo)).comandos
750
- : comandosDoManifesto(manifesto).map((c) => executor(c.nome, c.comando, cwd));
751
- if (doAgile)
827
+ // Claim nao reaproveitada pode recompilar e mudar o produto depois das lanes. Nesse caso o preparo e o grupo rodam
828
+ // novamente sobre o produto final; na rodada comum, as claims de teste vieram das lanes e este caminho nao custa nada.
829
+ const guardaDepoisDasClaims = grupoAntesDasClaims ? vigente?.guarda.conferir() : null;
830
+ if (grupoAntesDasClaims && guardaDepoisDasClaims) {
831
+ if (guardaDepoisDasClaims === 'produto-mudou')
832
+ refazer('depois das claims');
833
+ opcoes.progresso?.('grupo-agile');
834
+ doAgile = (0, check_agil_1.comandosNoAgile)(manifesto, cwd, comandosDoManifesto(manifesto), executorDosComandos, executorDoGrupo(manifesto, ambienteDaRodada, instabilidade, leitor, conducao, opcoes.executor ? executor : undefined, opcoes.medicaoCpuAgendador), vigente.guarda, vigente.preparo);
835
+ comandosDoManifestoExecutados = doAgile.comandos;
752
836
  pecas.push(...doAgile.pecas);
837
+ }
838
+ if (!opcoes.soClaims && !grupoAntesDasClaims) {
839
+ comandosDoManifestoExecutados = vigente
840
+ ? (opcoes.progresso?.('grupo-agile'), doAgile = (0, check_agil_1.comandosNoAgile)(manifesto, cwd, comandosDoManifesto(manifesto), executorDosComandos, executorDoGrupo(manifesto, ambienteDaRodada, instabilidade, leitor, conducao, opcoes.executor ? executor : undefined, opcoes.medicaoCpuAgendador), vigente.guarda, vigente.preparo)).comandos
841
+ : comandosDoManifesto(manifesto).map((c) => executorDosComandos(c.nome, c.comando, cwd));
842
+ if (doAgile)
843
+ pecas.push(...doAgile.pecas);
844
+ }
845
+ const changelog = opcoes.soClaims ? null
846
+ : verificarChangelog(cwd, manifesto.worktree.base_branch, thread.base?.commit);
847
+ const comandos = opcoes.soClaims ? []
848
+ : changelog ? [...comandosDoManifestoExecutados, changelog] : comandosDoManifestoExecutados;
753
849
  const resumoDoAgile = vigente ? agileNoLedger(raiz, threadId, commit, pecas, doAgile, vigente.guarda, relatorio, claims) : null;
850
+ if (relatorio && !vigente)
851
+ relatorio.fechar();
852
+ if (casaDaRodada)
853
+ fs.rmSync(casaDaRodada, { recursive: true, force: true });
754
854
  // RM-062 (F2): a barreira de dado privado no diff da thread, so com a policy `dado_privado` no manifesto.
755
855
  const dadoPrivado = (0, dado_privado_1.barreiraDaThread)(carregado, thread, cwd, 'verify');
756
856
  const dadoPrivadoBloqueia = (0, policies_1.bloqueantes)(dadoPrivado?.violacoes ?? []);
@@ -758,23 +858,41 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
758
858
  const regressoes = [];
759
859
  const preExistentes = [];
760
860
  const falhasSemBaseline = [];
861
+ const comparacoes = [];
761
862
  const estouros = [];
762
863
  // RM-037 (defeito 1 de 19 e 20/10/2026): o comando sem veredito na baseline nao separa regressao de divida.
763
864
  const baselineSemVeredito = (baseline?.comandos ?? []).filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome);
764
865
  for (const atual of comandos) {
765
- if (atual.ok)
866
+ // I-54 (D11): comando que nao rodou nao tem resultado para comparar. O motivo tipado entra abaixo como
867
+ // `verify.sem-veredito`, sem tambem inventar regressao ou divida a partir da ausencia de nomes.
868
+ if (atual.executado === false)
766
869
  continue;
767
- if (semVereditoPorTempo(atual)) {
870
+ if (!atual.ok && semVereditoPorTempo(atual)) {
768
871
  estouros.push(atual);
769
872
  continue;
770
873
  }
771
874
  const antes = baseline?.comandos.find((c) => c.nome === atual.nome);
772
- if (!antes || vereditoDaBaseline(antes) === 'sem-veredito')
773
- falhasSemBaseline.push(atual);
774
- else if (antes.ok)
875
+ if (!antes || vereditoDaBaseline(antes) === 'sem-veredito') {
876
+ if (!atual.ok)
877
+ falhasSemBaseline.push(atual);
878
+ continue;
879
+ }
880
+ const comparacao = compararComBaseline(atual, antes);
881
+ if (!comparacao)
882
+ continue;
883
+ comparacoes.push(comparacao);
884
+ if (comparacao.granularidade === 'teste') {
885
+ if (comparacao.regressoes.length > 0)
886
+ regressoes.push(atual);
887
+ if (comparacao.preExistentes.length > 0)
888
+ preExistentes.push(atual);
889
+ }
890
+ else if (comparacao.classificacaoDoComando === 'regressao') {
775
891
  regressoes.push(atual);
776
- else
892
+ }
893
+ else if (comparacao.classificacaoDoComando === 'pre-existente') {
777
894
  preExistentes.push(atual);
895
+ }
778
896
  }
779
897
  // I-54 (D11): o produto mudou entre o preparo e o fim da rodada? Entao nenhum veredito vale.
780
898
  const identidadeFinal = preparo ? identidadeDoProduto(cwd) : null;
@@ -823,6 +941,7 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
823
941
  duracaoMs: c.execucoes.reduce((t, e) => t + (e.duracaoMs ?? 0), 0),
824
942
  // RM-072 (D5): no Agile, o que a guarda fez com cada comando da claim.
825
943
  ...(c.execucoes.some((e) => e.preparo) ? { preparo: c.execucoes.map((e) => e.preparo ?? null) } : {}),
944
+ ...(c.execucoes.some((e) => e.lane) ? { lane: c.execucoes.map((e) => e.lane ?? null) } : {}),
826
945
  ...(falhou ? { execucao: comandoNoLedger(falhou) } : {}),
827
946
  };
828
947
  }),
@@ -831,6 +950,7 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
831
950
  regressoes: regressoes.map((r) => r.nome),
832
951
  preExistentes: preExistentes.map((r) => r.nome),
833
952
  falhasSemBaseline: falhasSemBaseline.map((r) => r.nome),
953
+ comparacoes,
834
954
  ...(baselineSemVeredito.length > 0 ? { baselineSemVeredito } : {}),
835
955
  estouros: estouros.map((r) => r.nome),
836
956
  prazoMs: manifesto.verify.timeout_ms ?? exports.TIMEOUT_VERIFY_MS,
@@ -871,7 +991,9 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
871
991
  .map((c) => `${c.claim.id}: ${c.detalhe}`)
872
992
  .join('; ')
873
993
  : motivo === 'verify.regression'
874
- ? `regressao em: ${regressoes.map((r) => r.nome).join(', ')}`
994
+ ? `regressao em: ${comparacoes.flatMap((c) => c.granularidade === 'teste'
995
+ ? c.regressoes.map((teste) => `${c.comando}: ${teste}`)
996
+ : c.classificacaoDoComando === 'regressao' ? [c.comando] : []).join(', ')}`
875
997
  : motivo === 'verify.timeout'
876
998
  ? `sem veredito por tempo (prazo estourado, ou teste com relogio sob steal acima de ${steal_1.LIMIAR_STEAL_PCT}%): ${[
877
999
  ...estouros.map((r) => (0, check_agil_1.porQueDasLanes)(r) ? `${r.nome} (${(0, check_agil_1.porQueDasLanes)(r)})` : r.nome),
@@ -914,6 +1036,7 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, fila
914
1036
  regressoes,
915
1037
  preExistentes,
916
1038
  falhasSemBaseline,
1039
+ comparacoes,
917
1040
  estouros,
918
1041
  preparo: preparo ? { ...preparo, identidadeFinal: identidadeFinal, produtoAlterado } : null,
919
1042
  steal,
@@ -1017,13 +1140,22 @@ function textoDoVerify(r) {
1017
1140
  linhas.push('');
1018
1141
  linhas.push(m.semVeredito(r.estouros.map((c) => c.nome).join(', ')));
1019
1142
  }
1020
- if (r.regressoes.length > 0 || r.preExistentes.length > 0 || r.falhasSemBaseline.length > 0) {
1143
+ if (r.comparacoes.length > 0 || r.falhasSemBaseline.length > 0) {
1021
1144
  linhas.push('');
1022
- linhas.push(m.classificacao(r.regressoes.length, r.preExistentes.length, r.falhasSemBaseline.length));
1023
- for (const c of r.regressoes)
1024
- linhas.push(m.regressao(c.nome, c.comando));
1025
- for (const c of r.preExistentes)
1026
- linhas.push(m.preExistente(c.nome, c.comando));
1145
+ for (const c of r.comparacoes) {
1146
+ if (c.granularidade === 'teste') {
1147
+ linhas.push(m.comparacaoPorTeste(c.comando, c.regressoes.length, c.preExistentes.length, c.corrigidos.length));
1148
+ for (const teste of c.regressoes)
1149
+ linhas.push(m.testeRegressao(teste));
1150
+ for (const teste of c.preExistentes)
1151
+ linhas.push(m.testePreExistente(teste));
1152
+ for (const teste of c.corrigidos)
1153
+ linhas.push(m.testeCorrigido(teste));
1154
+ }
1155
+ else {
1156
+ linhas.push(m.comparacaoPorComando(c.comando, c.classificacaoDoComando, c.motivoDoFallback));
1157
+ }
1158
+ }
1027
1159
  // RM-037 (defeito 1 de 19 e 20/10/2026): a baseline existe, mas nao teve veredito deste comando.
1028
1160
  const semVeredito = new Set((r.baseline?.comandos ?? []).filter((c) => vereditoDaBaseline(c) === 'sem-veredito').map((c) => c.nome));
1029
1161
  for (const c of r.falhasSemBaseline) {
package/eval/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # eval/
2
2
 
3
3
  Avaliacao deterministica do Orkastery, rodada por `ork eval`. Regra do catalogo original,
4
- mantida e agora executavel: **skill sem eval nao entra**, e comportamento sem canario tambem nao.
4
+ mantida e agora executavel: **skill sem eval nao entra**, e comportamento sem cenario tambem nao.
5
5
 
6
6
  ```bash
7
- ork eval # canarios + corpus das skills
8
- ork eval --so-canarios # so o comportamento do nucleo
7
+ ork eval # cenarios + corpus das skills
8
+ ork eval --so-cenarios # so o comportamento do nucleo
9
9
  ork eval --skill code-reviewer # so uma skill
10
- ork eval --canario fx-stale-base # so um canario
10
+ ork eval --cenario fx-stale-base # so um cenario
11
11
  ork eval --json # para o CI
12
12
  ```
13
13
 
@@ -35,14 +35,14 @@ monta uma copia do catalogo, apaga uma regra, planta uma skill sem eval e ancora
35
35
  dentro da tabela de desculpas, e confere que os tres ficam vermelhos. Corpus que fica verde
36
36
  depois de a regra sumir nao protege nada.
37
37
 
38
- ## `fixtures/`, os canarios
38
+ ## `fixtures/`, os cenarios
39
39
 
40
40
  Seis comportamentos do nucleo, exercitados ponta a ponta contra git de verdade, em repositorio
41
41
  temporario, sem rede e sem credencial. A expectativa de cada um e **dado versionado**
42
- (`caso.json`), e o executor e codigo tipado (`core/src/canarios.ts`): assim, mudar o que se
42
+ (`caso.json`), e o executor e codigo tipado (`core/src/cenarios.ts`): assim, mudar o que se
43
43
  espera do produto e um diff que aparece na revisao, revisavel por quem nao le TypeScript.
44
44
 
45
- | Canario | O que ele impede de voltar |
45
+ | Cenario | O que ele impede de voltar |
46
46
  |---|---|
47
47
  | `fx-happy` | O caminho feliz parar de funcionar sem ninguem notar |
48
48
  | `fx-hallucination` | Citacao de arquivo e de teste que nao existem passar no gate |
@@ -54,7 +54,7 @@ espera do produto e um diff que aparece na revisao, revisavel por quem nao le Ty
54
54
  Ha ainda duas fixtures de contrato, mais antigas, rodadas pela suite (`npm test`) em
55
55
  `core/test/eval.test.ts`: `b0-slug-e-modos` (a #TAG do pedido vira slug, blocos e pausas) e
56
56
  `b2-master-log` (o contrato congelado do MASTER log, com as mutacoes que precisam reprovar).
57
- A segunda tem dois consumidores de proposito: a suite e o canario `fx-schema-drift`.
57
+ A segunda tem dois consumidores de proposito: a suite e o cenario `fx-schema-drift`.
58
58
 
59
59
  ## `casos/`, o corpus das skills
60
60
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "fx-codex-dry",
3
3
  "sobre": "O setup do bloco leva o despacho governado ao controller Codex app-server via stdio em dry-run; o default continua claude-bg.",
4
- "porque": "Novos despachos governados precisam de entrada bidirecional e controller próprio. O canário exige o comando app-server via stdio, preserva runtime/modelo/esforço e garante que dry-run não despacha. Provas de recepção nativa são separadas.",
4
+ "porque": "Novos despachos governados precisam de entrada bidirecional e controller próprio. O cenário exige o comando app-server via stdio, preserva runtime/modelo/esforço e garante que dry-run não despacha. Provas de recepção nativa são separadas.",
5
5
  "precisa": [
6
6
  "git"
7
7
  ],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "fx-happy",
3
3
  "sobre": "O ciclo que funciona: thread aberta no modo do pedido, fase montada com prompt gravado e hash, e claim que passa na reexecucao no HEAD real.",
4
- "porque": "Um corpus que so tem canario de falha nao percebe quando o caminho feliz para de funcionar. Este e o unico que reprova se o produto deixar de fazer o basico.",
4
+ "porque": "Um corpus que so tem cenario de falha nao percebe quando o caminho feliz para de funcionar. Este e o unico que reprova se o produto deixar de fazer o basico.",
5
5
  "precisa": [
6
6
  "git"
7
7
  ],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "fx-indice-reversao",
3
3
  "sobre": "Uma entrega revertida depois do ship se rebaixa SOZINHA no caminho que o produto percorre de verdade: `ork master` mostra a reversão em vez de \"sem tropeço\", e a aceitação por omissão grava score 2, não 5, sem ninguém pontuar nada.",
4
- "porque": "É o canário que libera a saída da fila de ratificação de score, e prova a propriedade exata que a fila não entregava: ela tinha 13 entradas esperando nota humana justamente porque lembrete não converte em nota, e nenhuma delas dizia se a entrega havia sido desfeita depois. Na primeira versão ele chamava `registrarReversaoDaEntrega` À MÃO, e o CHECK de 20/09/2026 provou com `git revert` real que isso não provava nada: no produto o único chamador era o começo de um `ork ship` SEGUINTE da mesma thread, que depois do MASTER não acontece, e `ork master --aceitar-omissao` gravava score 5 com a justificativa \"sem reversão\" sobre uma entrega desfeita. Agora o canário roda o que o dono roda: `tabelaDeEntregas` e `aceitarPorOmissao`. A detecção ancora no marcador que o próprio git escreve (\"This reverts commit <sha>\") e não em diff de árvore, porque um arquivo que voltou ao estado anterior pode ser trabalho de outra thread, e chamar isso de reversão rebaixaria entrega alheia por coincidência. A idempotência é condição dura agora que a detecção roda em toda consulta: sem ela, abrir a tabela afundaria a nota da thread a cada vez.",
4
+ "porque": "É o cenário que libera a saída da fila de ratificação de score, e prova a propriedade exata que a fila não entregava: ela tinha 13 entradas esperando nota humana justamente porque lembrete não converte em nota, e nenhuma delas dizia se a entrega havia sido desfeita depois. Na primeira versão ele chamava `registrarReversaoDaEntrega` À MÃO, e o CHECK de 20/09/2026 provou com `git revert` real que isso não provava nada: no produto o único chamador era o começo de um `ork ship` SEGUINTE da mesma thread, que depois do MASTER não acontece, e `ork master --aceitar-omissao` gravava score 5 com a justificativa \"sem reversão\" sobre uma entrega desfeita. Agora o cenário roda o que o dono roda: `tabelaDeEntregas` e `aceitarPorOmissao`. A detecção ancora no marcador que o próprio git escreve (\"This reverts commit <sha>\") e não em diff de árvore, porque um arquivo que voltou ao estado anterior pode ser trabalho de outra thread, e chamar isso de reversão rebaixaria entrega alheia por coincidência. A idempotência é condição dura agora que a detecção roda em toda consulta: sem ela, abrir a tabela afundaria a nota da thread a cada vez.",
5
5
  "precisa": [
6
6
  "git"
7
7
  ],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "fx-listagem-abertas",
3
3
  "sobre": "O default de `ork thread list` mostra o que ainda pede atenção (aberta e pausada) e omite a fechada, avisando que omitiu; `--todas` abre o resto.",
4
- "porque": "O custo medido era o DEFAULT e não a falta de flag: em 20/09/2026 o comando imprimia 137 linhas para as 31 que interessavam, e 71 delas (52 por cento) eram threads `Sessão adotada claude-bg <uuid>`, lixo do mecanismo de adoção de 07 a 14/09. Quem pagava era quem não sabia que existia flag, porque flag nenhuma existia. A thread PAUSADA é a razão de o default ser \"não fechadas\" e não \"só abertas\", que era o texto do GOAL: esconder a pausada seria esconder justamente a que mais pede atenção. O canário roda em sandbox porque `ork thread list` dentro de uma worktree lê o estado da árvore principal (M8): conferir \"no projeto\" seria afirmar contagem de artefato vivo, que reprova sozinha quando a branch cresce.",
4
+ "porque": "O custo medido era o DEFAULT e não a falta de flag: em 20/09/2026 o comando imprimia 137 linhas para as 31 que interessavam, e 71 delas (52 por cento) eram threads `Sessão adotada claude-bg <uuid>`, lixo do mecanismo de adoção de 07 a 14/09. Quem pagava era quem não sabia que existia flag, porque flag nenhuma existia. A thread PAUSADA é a razão de o default ser \"não fechadas\" e não \"só abertas\", que era o texto do GOAL: esconder a pausada seria esconder justamente a que mais pede atenção. O cenário roda em sandbox porque `ork thread list` dentro de uma worktree lê o estado da árvore principal (M8): conferir \"no projeto\" seria afirmar contagem de artefato vivo, que reprova sozinha quando a branch cresce.",
5
5
  "precisa": ["git"],
6
6
  "esperado": {
7
7
  "noDefault": ["aberta", "pausada"],
@@ -13,5 +13,5 @@
13
13
  "humanosSemIngresso": 0,
14
14
  "ofertaDisponivel": 4
15
15
  },
16
- "porque": "D12 exige HITL omnicanal nos quatro hosts homologados com identidade, correlacao e recibo equivalentes, e FX1 exige que a chave de ingresso seja de cada canal. O canario impede quatro regressoes: reduzir a lista de canais, voltar a gravar recibo que nao distingue Hermes de OpenClaw, aceitar resposta sem ingresso homologado (aprovacao cega, transcrito de tool ou canal de outro transporte), e voltar a compartilhar uma chave entre os dois canais de telegram."
16
+ "porque": "D12 exige HITL omnicanal nos quatro hosts homologados com identidade, correlacao e recibo equivalentes, e FX1 exige que a chave de ingresso seja de cada canal. O cenario impede quatro regressoes: reduzir a lista de canais, voltar a gravar recibo que nao distingue Hermes de OpenClaw, aceitar resposta sem ingresso homologado (aprovacao cega, transcrito de tool ou canal de outro transporte), e voltar a compartilhar uma chave entre os dois canais de telegram."
17
17
  }
@@ -16,5 +16,5 @@
16
16
  "tempoParadoMs": 0,
17
17
  "adaptadoresComARegra": 4
18
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."
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 cená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
20
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "fx-schema-drift",
3
3
  "sobre": "Seis mutacoes do MASTER log valido: contrato trocado sem trocar a versao, score fora da escala, classe de falha inventada, fase fora do ciclo canonico, justificativa vazia e evidencia ausente.",
4
- "porque": "O MASTER log e contrato publico congelado (ork.master-log/v1). Se ele aceitar mutacao em silencio, a telemetria de conducao deixa de ser comparavel entre threads e o score vira opiniao com formato de dado. O canario le a mesma fixture b2-master-log que a suite ja usa: uma fonte, dois consumidores.",
4
+ "porque": "O MASTER log e contrato publico congelado (ork.master-log/v1). Se ele aceitar mutacao em silencio, a telemetria de conducao deixa de ser comparavel entre threads e o score vira opiniao com formato de dado. O cenario le a mesma fixture b2-master-log que a suite ja usa: uma fonte, dois consumidores.",
5
5
  "precisa": [],
6
6
  "esperado": {
7
7
  "validoPassa": true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orkastery/cli",
3
- "version": "0.6.1",
3
+ "version": "0.6.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",
@@ -33,7 +33,7 @@ flowchart LR
33
33
  | 6 | A suite roda no HEAD real, no diretorio de trabalho da thread. Passagem relatada por agente nao e passagem. | `ork verify <thread>` reexecuta os comandos do manifesto e as claims, e carimba o commit real. |
34
34
  | 7 | Nenhum teste foi desligado, marcado para pular ou afrouxado para fechar a entrega. Pular teste e mudanca de escopo com registro, nunca ajuste de rota silencioso. | Diff sobre os arquivos de teste, procurando teste removido, `skip` e assercao relaxada. |
35
35
  | 8 | Nenhuma assercao foi trocada pelo valor que o codigo produz hoje sem que alguem tenha dito por que o valor certo mudou. Ajustar o esperado ao observado e a forma mais comum de transformar defeito em contrato. | Diff das assercoes contra a intencao declarada no PLAN. |
36
- | 9 | Teste nao depende de rede, de credencial paga nem de relogio de parede. Fixture deterministica e o padrao; o que precisa de mundo externo fica fora do gate e e declarado. | Rodar a suite offline. No `ork`, os canarios de `ork eval` montam repositorio git temporario e nao tocam a rede. |
36
+ | 9 | Teste nao depende de rede, de credencial paga nem de relogio de parede. Fixture deterministica e o padrao; o que precisa de mundo externo fica fora do gate e e declarado. | Rodar a suite offline. No `ork`, os cenarios de `ork eval` montam repositorio git temporario e nao tocam a rede. |
37
37
  | 10 | Teste nao depende de outro teste nem da ordem de execucao. Estado compartilhado entre casos e defeito, mesmo quando a suite esta verde hoje. | Rodar em ordem embaralhada ou isoladamente o caso suspeito. |
38
38
 
39
39
  ## Contagem e cobertura
@@ -21,7 +21,7 @@ Distinga o contexto antes de agir:
21
21
  - **Sessao condutora:** recebe o pedido do dono, identifica ou abre a thread, despacha pelo `ork` e acompanha o resultado; nunca escreve codigo de produto no lugar da sessao despachada.
22
22
  - **Sessao de fase ja despachada:** recebeu thread, fase, prompt e worktree do `ork`.
23
23
  Trabalhe nesse escopo pela skill da fase. Nao abra outra thread nem redespache a propria fase para fazer o trabalho que ja lhe foi atribuido.
24
- - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
24
+ - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; prefira `ork_verify` assíncrono e consulte `ork_verify_status` a cada 30–60 s; sem essa ferramenta, rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
25
25
 
26
26
  ## Comecar ou retomar
27
27
 
@@ -23,7 +23,7 @@ ork worktree audit <thread> # a worktree confere no proprio git
23
23
  ork gate request <thread> # o pedido da pausa; o humano responde pelo canal autenticado
24
24
  ```
25
25
 
26
- - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
26
+ - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; prefira `ork_verify` assíncrono e consulte `ork_verify_status` a cada 30–60 s; sem essa ferramenta, rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
27
27
 
28
28
  Quando o veredito e PRECISA DE MUDANCA, o sub-loop GO-FIX / CHECK-REVERIFY do bloco B3 e
29
29
  quem conduz a volta, e ele nao depende de humano ate o veredito final:
@@ -24,7 +24,7 @@ ork claims add <thread> <arquivo> --claim "<...>" --verificar "<comando>" --fase
24
24
  ork verify <thread> # reexecuta no HEAD real
25
25
  ```
26
26
 
27
- - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
27
+ - Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; prefira `ork_verify` assíncrono e consulte `ork_verify_status` a cada 30–60 s; sem essa ferramenta, rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
28
28
 
29
29
  ## O que o GO entrega
30
30