@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.
- package/adapters/claude-code/README.md +1 -1
- package/adapters/claude-code/agents/ork-check.md +1 -1
- package/adapters/claude-code/agents/ork-go.md +1 -1
- 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/ork.md +1 -1
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +2 -0
- package/adapters/codex/skills/ork/SKILL.md +1 -1
- package/adapters/hermes/README.md +1 -1
- package/adapters/openclaw/openclaw.plugin.json +1 -1
- package/adapters/openclaw/package.json +1 -1
- package/assets/adapters-en/claude-code/README.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-check.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-go.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-goal.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-master.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-plan.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-ship.md +1 -1
- package/assets/adapters-en/claude-code/commands/ork.md +1 -1
- package/assets/adapters-en/codex/skills/ork/SKILL.md +1 -1
- package/assets/adapters-en/hermes/README.md +1 -1
- package/assets/docs/padroes/roadmap-de-produto.md +1 -1
- package/assets/docs-en/padroes/roadmap-de-produto.md +1 -1
- package/assets/orkmind_fixture.py +4 -1
- package/assets/references-en/testing-patterns.md +1 -1
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +1 -1
- package/assets/skills-en/phases/check-quality/SKILL.md +1 -1
- package/assets/skills-en/phases/go-implementation/SKILL.md +1 -1
- package/dist/adapters/claude-bg.js +3 -1
- package/dist/adapters/grok-mcp-servidor.js +22 -12
- package/dist/adapters/grok.js +1 -1
- package/dist/agendador-cpu.js +10 -2
- package/dist/catalogo.js +3 -3
- package/dist/{canarios-hitl.js → cenarios-hitl.js} +7 -7
- package/dist/{canarios-i43.js → cenarios-i43.js} +16 -16
- package/dist/{canarios-pulse.js → cenarios-pulse.js} +3 -3
- package/dist/{canarios-rm057.js → cenarios-rm057.js} +3 -3
- package/dist/{canarios-sensores.js → cenarios-sensores.js} +5 -5
- package/dist/{canarios.js → cenarios.js} +22 -22
- package/dist/changelog-check.js +217 -0
- package/dist/check-agil.js +242 -5
- package/dist/check-paralelo.js +17 -4
- package/dist/ci.js +3 -2
- package/dist/claim-lint.js +29 -0
- package/dist/claims.js +5 -1
- package/dist/docs.js +8 -1
- package/dist/evalrunner.js +37 -37
- package/dist/fila-pesada.js +121 -11
- package/dist/hitl-canais.js +1 -1
- package/dist/hitl-classificacao.js +1 -0
- package/dist/hitl-presentation.js +1 -1
- package/dist/hitl-tempo-parado.js +1 -1
- package/dist/index.js +47 -29
- package/dist/init.js +1 -1
- package/dist/intelligence-graph-cli.js +27 -9
- package/dist/locale-ajuda.js +6 -6
- package/dist/locale-claims.js +16 -2
- package/dist/locale-grafo.js +56 -1
- package/dist/locale-maestro.js +38 -0
- package/dist/locale-network.js +8 -6
- package/dist/locale-onboarding.js +14 -0
- package/dist/locale-operacao-restante.js +18 -18
- package/dist/locale-preflight.js +80 -0
- package/dist/locale-projetos.js +6 -0
- package/dist/locale-prompts.js +8 -8
- package/dist/locale-pulse.js +4 -0
- package/dist/locale-retry.js +16 -0
- package/dist/locale-security-scan.js +35 -1
- package/dist/locale-verify.js +15 -0
- package/dist/locale.js +24 -7
- package/dist/maestro-cli.js +12 -17
- package/dist/mcp-install.js +2 -1
- package/dist/mcp-server.js +20 -17
- package/dist/mcp-verify-async.js +353 -0
- package/dist/mcp-verify-worker.js +17 -0
- package/dist/mcp-verify.js +10 -1
- package/dist/pedido-conducao.js +51 -0
- package/dist/preflight.js +25 -26
- package/dist/prompts.js +4 -2
- package/dist/pulse.js +4 -2
- package/dist/rede.js +24 -12
- package/dist/retry.js +12 -0
- package/dist/sandbox.js +11 -11
- package/dist/security-scan/cli.js +2 -2
- package/dist/security-scan/report.js +1 -1
- package/dist/session-watcher.js +33 -7
- package/dist/verify.js +166 -34
- package/eval/README.md +8 -8
- package/eval/fixtures/fx-codex-dry/caso.json +1 -1
- package/eval/fixtures/fx-happy/caso.json +1 -1
- package/eval/fixtures/fx-indice-reversao/caso.json +1 -1
- package/eval/fixtures/fx-listagem-abertas/caso.json +1 -1
- package/eval/fixtures/fx-omnicanal/caso.json +1 -1
- package/eval/fixtures/fx-pedido-colado/caso.json +1 -1
- package/eval/fixtures/fx-schema-drift/caso.json +1 -1
- package/package.json +1 -1
- package/references/testing-patterns.md +1 -1
- package/skills/core/orkastery-bootstrap/SKILL.md +1 -1
- package/skills/phases/check-quality/SKILL.md +1 -1
- 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
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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
|
-
//
|
|
741
|
-
//
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
?
|
|
748
|
-
|
|
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
|
-
|
|
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
|
-
|
|
774
|
-
|
|
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
|
-
|
|
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: ${
|
|
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.
|
|
1143
|
+
if (r.comparacoes.length > 0 || r.falhasSemBaseline.length > 0) {
|
|
1021
1144
|
linhas.push('');
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
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
|
|
4
|
+
mantida e agora executavel: **skill sem eval nao entra**, e comportamento sem cenario tambem nao.
|
|
5
5
|
|
|
6
6
|
```bash
|
|
7
|
-
ork eval #
|
|
8
|
-
ork eval --so-
|
|
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 --
|
|
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
|
|
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/
|
|
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
|
-
|
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|