@orkastery/cli 0.6.2 → 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/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/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/references-en/testing-patterns.md +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/check-agil.js +2 -1
- package/dist/check-paralelo.js +17 -4
- package/dist/claims.js +1 -1
- package/dist/docs.js +1 -1
- package/dist/evalrunner.js +37 -37
- package/dist/hitl-canais.js +1 -1
- package/dist/hitl-presentation.js +1 -1
- package/dist/hitl-tempo-parado.js +1 -1
- package/dist/index.js +4 -4
- package/dist/init.js +1 -1
- package/dist/locale-ajuda.js +6 -6
- package/dist/locale-operacao-restante.js +18 -18
- package/dist/sandbox.js +11 -11
- 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
|
@@ -144,7 +144,7 @@ resultado contém o SHA do HEAD confirmado no Git. O comando recebido nunca é e
|
|
|
144
144
|
|
|
145
145
|
Teste de integração isolado: `npm --prefix core run build && npm --prefix core run build:test && node --test core/dist-test/test/claude-sensors.test.js`.
|
|
146
146
|
|
|
147
|
-
O
|
|
147
|
+
O cenário `node core/dist/index.js eval --so-cenarios --cenario fx-sensores-runtime`
|
|
148
148
|
integra hook, CLI, supervisor e watcher em um repositório temporário. Seus eventos Codex
|
|
149
149
|
são sintéticos; a saída identifica esse limite e mede ingestão, morte e duplicatas.
|
|
150
150
|
|
|
@@ -176,7 +176,7 @@ Verificação: `python3 -m unittest discover -s adapters/hermes/test -p conducao
|
|
|
176
176
|
|
|
177
177
|
O gateway autenticado entrega o update original por stdin a `bin/ork-hitl-answer.py ork_gate_answer <thread> <pedido>` ou `ork_session_answer`. Configure `ORK_BIN`, `ORK_HITL_TELEGRAM_USERS` e `ORK_HITL_TELEGRAM_CHATS` com os ids permitidos. Responda ao alerta que contém a linha `ork-hitl <thread> <pedido>`; botões usam `ork:<thread>:<pedido>:<número>`. O transporte recusa bots, chat/usuário não autorizado e resposta sem correlação. O núcleo decide sobre prazo, modo e validade do pedido.
|
|
178
178
|
|
|
179
|
-
O script deve receber eventos diretamente do gateway, cuja autenticação do Telegram é a fronteira de confiança. JSON criado por um agente não é evidência humana. O
|
|
179
|
+
O script deve receber eventos diretamente do gateway, cuja autenticação do Telegram é a fronteira de confiança. JSON criado por um agente não é evidência humana. O cenário usa um transporte controlado; ele não mede a rede Telegram real. Para aposentar `ork-watchdog-5min`, desative o job no agendador do host e guarde o recibo; nenhum watchdog deve chamar aprovação em nome do builder.
|
|
180
180
|
|
|
181
181
|
Verificação: `python3 -m unittest discover -s adapters/hermes/test -p hitl_answer_test.py -v`.
|
|
182
182
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "orkastery",
|
|
3
3
|
"name": "Orkastery",
|
|
4
4
|
"description": "Conducao de looping threads em 6 fases pelo nucleo `ork`, exposta ao OpenClaw como tools `ork_*`. Zero regra de negocio no host: cada tool e uma chamada de CLI. Toda tool de projeto aceita projeto (nome do projeto pedido); o cwd do gateway nunca escolhe o projeto. O status do roadmap vem de ork_network_roadmap; as maquinas da pessoa, de ork_network_status (sem projeto).",
|
|
5
|
-
"version": "0.6.
|
|
5
|
+
"version": "0.6.3",
|
|
6
6
|
"configSchema": {
|
|
7
7
|
"type": "object",
|
|
8
8
|
"properties": {},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orkastery/openclaw-plugin",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "Plugin Orkastery para OpenClaw: 32 tools ork_* que traduzem intencao em chamada de CLI do nucleo `ork`. Zero regra de negocio no host.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": true,
|
|
@@ -144,7 +144,7 @@ result contains the HEAD SHA confirmed in Git. The received command is never exe
|
|
|
144
144
|
|
|
145
145
|
Isolated integration test: `npm --prefix core run build && npm --prefix core run build:test && node --test core/dist-test/test/claude-sensors.test.js`.
|
|
146
146
|
|
|
147
|
-
The
|
|
147
|
+
The scenario `node core/dist/index.js eval --so-cenarios --cenario fx-sensores-runtime`
|
|
148
148
|
integrates hook, CLI, supervisor and watcher in a temporary repository. Its Codex events
|
|
149
149
|
are synthetic; the output states that limit and measures ingestion, death and duplicates.
|
|
150
150
|
|
|
@@ -176,7 +176,7 @@ Verification: `python3 -m unittest discover -s adapters/hermes/test -p conducao_
|
|
|
176
176
|
|
|
177
177
|
The authenticated gateway delivers the original update over stdin to `bin/ork-hitl-answer.py ork_gate_answer <thread> <pedido>` or `ork_session_answer`. Set `ORK_BIN`, `ORK_HITL_TELEGRAM_USERS` and `ORK_HITL_TELEGRAM_CHATS` to the allowed ids. Reply to the alert that contains the line `ork-hitl <thread> <pedido>`; buttons use `ork:<thread>:<pedido>:<número>`. The transport refuses bots, an unauthorized chat/user and an answer without correlation. The core decides on the deadline, the mode and the validity of the request.
|
|
178
178
|
|
|
179
|
-
The script must receive events directly from the gateway, whose Telegram authentication is the trust boundary. JSON created by an agent is not human evidence. The
|
|
179
|
+
The script must receive events directly from the gateway, whose Telegram authentication is the trust boundary. JSON created by an agent is not human evidence. The scenario uses a controlled transport; it does not measure the real Telegram network. To retire `ork-watchdog-5min`, disable the job in the host scheduler and keep the receipt; no watchdog may call an approval on the builder's behalf.
|
|
180
180
|
|
|
181
181
|
Verification: `python3 -m unittest discover -s adapters/hermes/test -p hitl_answer_test.py -v`.
|
|
182
182
|
|
|
@@ -56,7 +56,7 @@ Não use um único campo para ocultar diferenças entre plano, código e entrega
|
|
|
56
56
|
| Código | `Não iniciado`, `Branch criada`, `PR aberto`, `Mesclado` | Repositório, branch/PR e commit. |
|
|
57
57
|
| Testes | `Não iniciados`, `Em execução`, `Aprovados`, `Falhando` | Execução e data; cobertura, se relevante. |
|
|
58
58
|
| Deploy | `Não implantado`, `Dev`, `Staging`, `Produção` | Pipeline, release e data efetiva. |
|
|
59
|
-
| Exposição | `Flag desligada`, `Piloto/
|
|
59
|
+
| Exposição | `Flag desligada`, `Piloto/Gradual`, `Parcial`, `Geral` | Configuração por ambiente/coorte e verificação. |
|
|
60
60
|
| Habilitação | `Pendente`, `Em andamento`, `Concluída` | Comunicação, treinamento ou material publicado. |
|
|
61
61
|
|
|
62
62
|
`Bloqueado` exige motivo, dependência, responsável e próxima revisão. `Concluído` exige critérios de aceite cumpridos, evidência de disponibilidade e registro de medição inicial ou plano de avaliação pós-lançamento. O status não deve ser atualizado por mera passagem do tempo.
|
|
@@ -58,7 +58,7 @@ Do not use a single field to hide differences between plan, code and delivery. U
|
|
|
58
58
|
| Code | `Não iniciado` (not started), `Branch criada` (branch created), `PR aberto` (PR open), `Mesclado` (merged) | Repository, branch/PR and commit. |
|
|
59
59
|
| Tests | `Não iniciados` (not started), `Em execução` (running), `Aprovados` (passing), `Falhando` (failing) | Run and date; coverage, if relevant. |
|
|
60
60
|
| Deploy | `Não implantado` (not deployed), `Dev`, `Staging`, `Produção` (production) | Pipeline, release and actual date. |
|
|
61
|
-
| Exposure | `Flag desligada` (flag off), `Piloto/
|
|
61
|
+
| Exposure | `Flag desligada` (flag off), `Piloto/Gradual` (pilot/gradual), `Parcial` (partial), `Geral` (general) | Configuration per environment/cohort and verification. |
|
|
62
62
|
| Enablement | `Pendente` (pending), `Em andamento` (in progress), `Concluída` (done) | Communication, training or published material. |
|
|
63
63
|
|
|
64
64
|
`Bloqueado` requires a reason, a dependency, an owner and a next review. `Concluído` requires met acceptance criteria, evidence of availability and a record of the initial measurement or a post-launch evaluation plan. Status must not be updated merely because time has passed.
|
|
@@ -33,7 +33,7 @@ flowchart LR
|
|
|
33
33
|
| 6 | The suite runs on the real HEAD, in the thread's working directory. A pass reported by an agent is not a pass. | `ork verify <thread>` re-runs the manifest commands and the claims, and stamps the real commit. |
|
|
34
34
|
| 7 | No test was disabled, marked to skip or loosened to close the delivery. Skipping a test is a recorded scope change, never a silent course correction. | Diff over the test files, looking for removed tests, `skip` and relaxed assertions. |
|
|
35
35
|
| 8 | No assertion was swapped for the value the code produces today without someone saying why the right value changed. Adjusting the expected to the observed is the most common way to turn a defect into a contract. | Diff of the assertions against the intent declared in the PLAN. |
|
|
36
|
-
| 9 | A test does not depend on the network, on a paid credential or on the wall clock. A deterministic fixture is the standard; whatever needs the outside world stays out of the gate and is declared. | Run the suite offline. In `ork`, the `ork eval`
|
|
36
|
+
| 9 | A test does not depend on the network, on a paid credential or on the wall clock. A deterministic fixture is the standard; whatever needs the outside world stays out of the gate and is declared. | Run the suite offline. In `ork`, the `ork eval` scenarios build a temporary git repository and do not touch the network. |
|
|
37
37
|
| 10 | A test does not depend on another test or on the execution order. State shared between cases is a defect, even when the suite is green today. | Run the suspect case in shuffled order or in isolation. |
|
|
38
38
|
|
|
39
39
|
## Count and coverage
|
package/dist/agendador-cpu.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.JANELA_DA_SONDA_MS = exports.LIMIAR_STEAL_DO_AGENDADOR_PCT = exports.RESERVA_DO_GRUPO = exports.ENV_CPUS_DOCKER = exports.ENV_CPUS_DA_LANE = void 0;
|
|
3
|
+
exports.JANELA_DA_SONDA_MS = exports.LIMIAR_STEAL_DO_AGENDADOR_PCT = exports.RESERVA_DO_GRUPO = exports.ENV_CPUS_DOCKER = exports.ENV_SINAL_DA_RESERVA = exports.ENV_CPUS_DA_LANE_APOS_RESERVA = exports.ENV_CPUS_DA_LANE = void 0;
|
|
4
4
|
exports.cargaDoProcLoadavg = cargaDoProcLoadavg;
|
|
5
5
|
exports.medirCpuDoGrupo = medirCpuDoGrupo;
|
|
6
6
|
exports.planejarCpuDoGrupo = planejarCpuDoGrupo;
|
|
@@ -16,6 +16,8 @@ exports.paredeAgileSimulada = paredeAgileSimulada;
|
|
|
16
16
|
const node_fs_1 = require("node:fs");
|
|
17
17
|
const steal_1 = require("./steal");
|
|
18
18
|
exports.ENV_CPUS_DA_LANE = 'ORK_CHECK_CPUS_DA_LANE';
|
|
19
|
+
exports.ENV_CPUS_DA_LANE_APOS_RESERVA = 'ORK_CHECK_CPUS_DA_LANE_APOS_RESERVA';
|
|
20
|
+
exports.ENV_SINAL_DA_RESERVA = 'ORK_CHECK_RESERVA_DEVOLVIDA';
|
|
19
21
|
exports.ENV_CPUS_DOCKER = 'ORK_CHECK_CPUS_DOCKER';
|
|
20
22
|
exports.RESERVA_DO_GRUPO = 2;
|
|
21
23
|
exports.LIMIAR_STEAL_DO_AGENDADOR_PCT = 10;
|
|
@@ -72,6 +74,7 @@ function planejarCpuDoGrupo(cpusInformadas, medicao) {
|
|
|
72
74
|
saturado,
|
|
73
75
|
motivo: motivos.join('; ') || `carga e steal abaixo dos limiares; ${fatia} CPU(s) reservadas ao grupo`,
|
|
74
76
|
cpusHermetica: saturado ? classic : Math.max(1, cpus - fatia),
|
|
77
|
+
cpusHermeticaAposReserva: saturado ? classic : cpus,
|
|
75
78
|
cpusIntegracao: ferramentas,
|
|
76
79
|
cpusDaFatia: fatia,
|
|
77
80
|
ferramentasDaVarredura: ferramentas,
|
|
@@ -88,5 +91,10 @@ function paredeAgileSimulada(plano, trabalho) {
|
|
|
88
91
|
return trabalho.hermetica / plano.cpusHermetica + trabalho.varredura / plano.cpusDaFatia
|
|
89
92
|
+ trabalho.integracao / plano.cpusIntegracao;
|
|
90
93
|
}
|
|
91
|
-
|
|
94
|
+
const paredeDaReserva = trabalho.varredura / plano.cpusDaFatia + trabalho.integracao / plano.cpusIntegracao;
|
|
95
|
+
const feitoAntesDaDevolucao = Math.min(trabalho.hermetica, paredeDaReserva * plano.cpusHermetica);
|
|
96
|
+
const paredeDaHermetica = feitoAntesDaDevolucao === trabalho.hermetica
|
|
97
|
+
? trabalho.hermetica / plano.cpusHermetica
|
|
98
|
+
: paredeDaReserva + (trabalho.hermetica - feitoAntesDaDevolucao) / plano.cpusHermeticaAposReserva;
|
|
99
|
+
return Math.max(paredeDaHermetica, paredeDaReserva);
|
|
92
100
|
}
|
package/dist/catalogo.js
CHANGED
|
@@ -99,7 +99,7 @@ function real(p) {
|
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
/**
|
|
102
|
-
* RM-047 (P4): o catálogo que o `ork eval` executa. O eval roda os
|
|
102
|
+
* RM-047 (P4): o catálogo que o `ork eval` executa. O eval roda os cenários, os hooks e o `core/dist`
|
|
103
103
|
* do catálogo, então ele só vale o do pacote que está rodando. Um diretório com `skills/`,
|
|
104
104
|
* `references/` e `eval/` achado a partir do cwd (um clone qualquer) que não seja o próprio pacote é
|
|
105
105
|
* recusado com `eval.catalogo-alheio`, com o comando que roda o eval daquele checkout de propósito.
|
|
@@ -112,7 +112,7 @@ function exigirCatalogoDoPacote(inicial) {
|
|
|
112
112
|
const doCwd = subirProcurando(inicial);
|
|
113
113
|
if (doCwd && real(doCwd) !== real(pacote)) {
|
|
114
114
|
throw new Error(`eval.catalogo-alheio: ${doCwd} tem skills/, references/ e eval/, mas nao e o pacote deste ork ` +
|
|
115
|
-
`(${pacote}). O eval executa os
|
|
115
|
+
`(${pacote}). O eval executa os cenarios, os hooks e o core/dist do catalogo, e so roda o do proprio pacote. ` +
|
|
116
116
|
`Para avaliar aquele checkout de proposito, rode o ork dele: node ${path.join(doCwd, 'core', 'dist', 'index.js')} eval`);
|
|
117
117
|
}
|
|
118
118
|
return pacote;
|
|
@@ -127,7 +127,7 @@ exports.BUCKETS = [
|
|
|
127
127
|
];
|
|
128
128
|
/** Todas as skills do catalogo, varridas do disco (nunca de uma lista escrita a mao). */
|
|
129
129
|
/**
|
|
130
|
-
* O CLI que um
|
|
130
|
+
* O CLI que um cenario chama. No repositorio ele fica em `core/dist/`; no pacote npm o catalogo e
|
|
131
131
|
* a propria raiz do pacote e o CLI e o que esta rodando, ao lado deste arquivo compilado.
|
|
132
132
|
*/
|
|
133
133
|
function cliDoCatalogo(catalogo) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.CENARIOS_HITL = void 0;
|
|
4
4
|
const sandbox_1 = require("./sandbox");
|
|
5
5
|
const thread_1 = require("./thread");
|
|
6
6
|
const ledger_1 = require("./ledger");
|
|
@@ -11,7 +11,7 @@ const hitl_gates_2 = require("./hitl-gates");
|
|
|
11
11
|
const hitl_gates_3 = require("./hitl-gates");
|
|
12
12
|
const hitl_local_atestado_1 = require("./hitl-local-atestado");
|
|
13
13
|
const hitl_canais_1 = require("./hitl-canais");
|
|
14
|
-
exports.
|
|
14
|
+
exports.CENARIOS_HITL = [
|
|
15
15
|
{ id: 'fx-blanket-approve', sobre: 'SIMULADO: aprovação cega e envelope sem autenticação são recusados', precisaDeGit: true, rodar: () => {
|
|
16
16
|
const s = (0, sandbox_1.sandboxGit)('blanket-approve');
|
|
17
17
|
try {
|
|
@@ -72,16 +72,16 @@ exports.CANARIOS_HITL = [
|
|
|
72
72
|
// precisam responder e ficar distinguiveis depois, que e o que D12 exige.
|
|
73
73
|
{ id: 'fx-omnicanal', sobre: 'SIMULADO: os quatro canais respondem e ficam distinguiveis no recibo', precisaDeGit: true, rodar: () => {
|
|
74
74
|
const s = (0, sandbox_1.sandboxGit)('omnicanal');
|
|
75
|
-
// FX1: cada canal de telegram tem a SUA chave; o
|
|
75
|
+
// FX1: cada canal de telegram tem a SUA chave; o cenario nunca compartilha segredo.
|
|
76
76
|
const nomes = ['ORK_HITL_INGRESS_KEY_HERMES', 'ORK_HITL_INGRESS_KEY_OPENCLAW',
|
|
77
77
|
'ORK_HITL_OPENCLAW_ACCOUNT', 'ORK_HITL_TELEGRAM_USERS', 'ORK_HITL_TELEGRAM_CHATS',
|
|
78
78
|
'ORK_HITL_ROOT', 'ORK_HITL_TELEGRAM_BOT_ID'];
|
|
79
79
|
const antigos = nomes.map(n => process.env[n]);
|
|
80
|
-
const chaves = { hermes: 'chave-SIMULADA-do-
|
|
81
|
-
openclaw: 'chave-SIMULADA-do-
|
|
80
|
+
const chaves = { hermes: 'chave-SIMULADA-do-cenario-hermes-00000000',
|
|
81
|
+
openclaw: 'chave-SIMULADA-do-cenario-openclaw-000000' };
|
|
82
82
|
// FX5: so o OpenClaw tem conta homologada, e ela entra no corpo assinado.
|
|
83
|
-
const conta = 'conta-SIMULADA-do-
|
|
84
|
-
[chaves.hermes, chaves.openclaw, conta, '42', '-7', '/tmp/ork-hitl-
|
|
83
|
+
const conta = 'conta-SIMULADA-do-cenario-openclaw';
|
|
84
|
+
[chaves.hermes, chaves.openclaw, conta, '42', '-7', '/tmp/ork-hitl-cenario', '999']
|
|
85
85
|
.forEach((v, i) => { process.env[nomes[i]] = v; });
|
|
86
86
|
try {
|
|
87
87
|
const registro = (0, hitl_canais_1.conferirRegistro)();
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Cenarios da I-43: cada remocao so e dada como pronta junto do cenario que prova que
|
|
4
4
|
* a falha evitada pelo mecanismo removido continua evitada por outra coisa.
|
|
5
5
|
*
|
|
6
|
-
* Remocao sem
|
|
6
|
+
* Remocao sem cenario nao e simplificacao, e aposta. E a razao de este arquivo existir
|
|
7
7
|
* separado: o CHECK confere as cinco remocoes num lugar so, e o que cada uma perdeu
|
|
8
8
|
* esta escrito ao lado do que a substitui.
|
|
9
9
|
*
|
|
10
|
-
* Os
|
|
10
|
+
* Os cenarios rodam em sandbox git propria (`sandboxGit`), nunca contra o board vivo:
|
|
11
11
|
* `raizDoEstado` manda o estado para a arvore principal mesmo de dentro de uma worktree
|
|
12
12
|
* vinculada, entao qualquer conferencia feita "no projeto" leria as 137 threads reais
|
|
13
13
|
* e viraria contagem de artefato vivo, que reprova sozinha quando a branch cresce.
|
|
@@ -46,7 +46,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
46
46
|
};
|
|
47
47
|
})();
|
|
48
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
-
exports.
|
|
49
|
+
exports.CENARIOS_I43 = void 0;
|
|
50
50
|
const sandbox_1 = require("./sandbox");
|
|
51
51
|
const fs = __importStar(require("node:fs"));
|
|
52
52
|
const hosts_1 = require("./hosts");
|
|
@@ -82,7 +82,7 @@ function pedidoLegado(modo) {
|
|
|
82
82
|
* `modo: look, profundidade: profunda` deixaria de validar EM SILENCIO: o produto
|
|
83
83
|
* passaria a negar o que ele mesmo emitiu e assinou.
|
|
84
84
|
*
|
|
85
|
-
* O
|
|
85
|
+
* O cenario grava uma thread em modo aposentado direto no disco da sandbox, como uma
|
|
86
86
|
* thread de setembro esta gravada, e cobra que ela abra inteira.
|
|
87
87
|
*/
|
|
88
88
|
const fxModoAposentadoLeitor = {
|
|
@@ -139,7 +139,7 @@ const fxModoAposentadoLeitor = {
|
|
|
139
139
|
* resultado desta aposentadoria: o builder escreve `#Look` no pedido e recebe uma
|
|
140
140
|
* thread em `#Auto` sem saber que trocou de regime de supervisao.
|
|
141
141
|
*
|
|
142
|
-
* O
|
|
142
|
+
* O cenario cobra as tres coisas juntas: a recusa acontece, ela e TIPADA, e ela nomeia
|
|
143
143
|
* um substituto que EXISTE. Toda #TAG do texto e um modo da matriz, e o substituto e
|
|
144
144
|
* sempre de ciclo completo: com a I-42, o `#Fast` existe, mas nao substitui modo de
|
|
145
145
|
* vigilancia maxima.
|
|
@@ -207,12 +207,12 @@ const fxModoAposentadoEscritor = {
|
|
|
207
207
|
* `Sessao adotada claude-bg <uuid>`, lixo do mecanismo de adocao de 07 a 14/09. Quem
|
|
208
208
|
* pagava era quem nao sabia que existia flag, porque flag nenhuma existia.
|
|
209
209
|
*
|
|
210
|
-
* O
|
|
210
|
+
* O cenario roda em SANDBOX e nunca contra o board vivo, e isso nao e detalhe: M8 do
|
|
211
211
|
* PLAN mediu que `ork thread list` rodado DENTRO desta worktree lista as 137 threads
|
|
212
212
|
* da arvore principal, porque `raizDoEstado` resolve o estado pelo `git-common-dir`.
|
|
213
213
|
* Conferir "no projeto" seria comparar 137 com 10 e afirmar contagem de artefato vivo,
|
|
214
214
|
* que reprova sozinha quando a branch cresce. Aqui as contagens sao 1 e 2, fixadas
|
|
215
|
-
* pelo proprio
|
|
215
|
+
* pelo proprio cenario.
|
|
216
216
|
*
|
|
217
217
|
* A thread PAUSADA e a razao de o default ser "nao fechadas" e nao "so abertas", que
|
|
218
218
|
* era o texto do GOAL: esconder a pausada seria esconder a que mais pede atencao.
|
|
@@ -246,7 +246,7 @@ const fxListagemAbertas = {
|
|
|
246
246
|
comTodas: todas.length,
|
|
247
247
|
todasTemAFechada: todas.some((l) => l.id === fechada.id),
|
|
248
248
|
// A soma bate: default + fechadas = tudo. Sem afirmar numero de artefato vivo,
|
|
249
|
-
// porque as tres threads sao criadas por este
|
|
249
|
+
// porque as tres threads sao criadas por este cenario.
|
|
250
250
|
somaBate: padrao.length + todas.filter((l) => l.status === 'fechada').length === todas.length,
|
|
251
251
|
// E o texto avisa que escondeu algo, em vez de esconder em silencio.
|
|
252
252
|
avisaQueEscondeu: texto.includes('fechada(s) omitida(s)'),
|
|
@@ -261,7 +261,7 @@ const fxListagemAbertas = {
|
|
|
261
261
|
* fx-indice-reversao: a entrega revertida se rebaixa SOZINHA, pelo caminho que o
|
|
262
262
|
* produto percorre de verdade.
|
|
263
263
|
*
|
|
264
|
-
* E o
|
|
264
|
+
* E o cenario que libera a saida da fila de ratificacao de score, e ele prova a
|
|
265
265
|
* propriedade exata que a fila nao entregava: a fila tinha 13 entradas esperando nota
|
|
266
266
|
* humana justamente porque lembrete nao converte em nota, e nenhuma delas dizia se a
|
|
267
267
|
* entrega tinha sido desfeita depois.
|
|
@@ -269,7 +269,7 @@ const fxListagemAbertas = {
|
|
|
269
269
|
* ELE NAO CHAMA A DETECCAO A MAO, e essa e a mudanca do GO-FIX 1. Na primeira versao
|
|
270
270
|
* ele chamava `registrarReversaoDaEntrega` direto, que era justamente o passo que no
|
|
271
271
|
* produto ninguem executava: o unico chamador era o COMECO de um `ork ship` seguinte
|
|
272
|
-
* da mesma thread, e depois do MASTER nao ha ship seguinte. O
|
|
272
|
+
* da mesma thread, e depois do MASTER nao ha ship seguinte. O cenario ficava verde com
|
|
273
273
|
* a propriedade quebrada, e o CHECK provou com `git revert` real que o produto gravava
|
|
274
274
|
* score 5 e a justificativa "sem reversao" numa entrega desfeita.
|
|
275
275
|
*
|
|
@@ -360,7 +360,7 @@ const fxIndiceReversao = {
|
|
|
360
360
|
* de CHECK, e em 11 delas o CHECK rodou apenas em runtime que o GO tambem usou. As
|
|
361
361
|
* quatro threads mais recentes sao todas `claude-bg` conferindo `claude-bg`.
|
|
362
362
|
*
|
|
363
|
-
* O
|
|
363
|
+
* O cenario prova os TRES lados, porque so o positivo nao provaria nada:
|
|
364
364
|
* - a thread que EXIGE recusa o CHECK no runtime do GO, com motivo tipado;
|
|
365
365
|
* - a mesma thread ACEITA o CHECK em outro runtime;
|
|
366
366
|
* - a thread que NAO exige despacha normalmente, entao a regra nao vazou para quem
|
|
@@ -421,7 +421,7 @@ const fxCheckRuntimeCruzado = {
|
|
|
421
421
|
* objective da thread nao esta approved, com teste que cobre a recusa". Bonito, e
|
|
422
422
|
* impossivel de reprovar.
|
|
423
423
|
*
|
|
424
|
-
* O
|
|
424
|
+
* O cenario prova as duas metades, porque criterio que so passa nao prova nada:
|
|
425
425
|
* - o criterio que o comando SUSTENTA passa e a thread verifica;
|
|
426
426
|
* - o criterio que o comando NAO sustenta reprova, e o veredito diz QUAL criterio
|
|
427
427
|
* falhou, pela alegacao que a claim carrega.
|
|
@@ -478,7 +478,7 @@ const fxDoneWhenExecutavel = {
|
|
|
478
478
|
* a copia. Trocar uma recusa barulhenta por nada seria trocar investigacao de
|
|
479
479
|
* madrugada por defeito que ninguem ve.
|
|
480
480
|
*
|
|
481
|
-
* O que muda e o que BARRA, nao o que DETECTA. O
|
|
481
|
+
* O que muda e o que BARRA, nao o que DETECTA. O cenario cobra os dois lados:
|
|
482
482
|
* - a copia editada e detectada, NOMEADA, e classificada como `copia-editada`;
|
|
483
483
|
* - a divergencia segura (`catalogo-andou`) resolve sozinha e nao vira decisao;
|
|
484
484
|
* - a saida traz o `diff` do arquivo e um caminho de UM comando, com o `--dir` em
|
|
@@ -492,7 +492,7 @@ const fxAdapterEditadoDetectado = {
|
|
|
492
492
|
rodar: (ctx) => {
|
|
493
493
|
const destino = (0, sandbox_1.dirTemporario)('adapter-editado');
|
|
494
494
|
try {
|
|
495
|
-
const comum = { projeto: destino, dir: '.', catalogo: ctx.catalogo, versao: '0.0.0-
|
|
495
|
+
const comum = { projeto: destino, dir: '.', catalogo: ctx.catalogo, versao: '0.0.0-cenario' };
|
|
496
496
|
// 1. Instalacao limpa: nasce o recibo com o sha de cada arquivo.
|
|
497
497
|
const primeira = (0, hosts_1.instalarAdaptador)('hermes', comum);
|
|
498
498
|
const recibo = (0, hosts_1.lerRecibo)(destino);
|
|
@@ -532,7 +532,7 @@ const fxAdapterEditadoDetectado = {
|
|
|
532
532
|
}
|
|
533
533
|
},
|
|
534
534
|
};
|
|
535
|
-
exports.
|
|
535
|
+
exports.CENARIOS_I43 = [
|
|
536
536
|
fxModoAposentadoLeitor,
|
|
537
537
|
fxModoAposentadoEscritor,
|
|
538
538
|
fxListagemAbertas,
|
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
36
|
+
exports.CENARIOS_PULSE = void 0;
|
|
37
37
|
const fs = __importStar(require("node:fs"));
|
|
38
38
|
const path = __importStar(require("node:path"));
|
|
39
39
|
const node_child_process_1 = require("node:child_process");
|
|
@@ -52,7 +52,7 @@ const pulse_1 = require("./pulse");
|
|
|
52
52
|
const orquestracao_1 = require("./orquestracao");
|
|
53
53
|
const pulse_delivery_1 = require("./pulse-delivery");
|
|
54
54
|
const catalogo_1 = require("./catalogo");
|
|
55
|
-
exports.
|
|
55
|
+
exports.CENARIOS_PULSE = [
|
|
56
56
|
{ id: 'fx-estado-dividido', sobre: '90 eventos na worktree não podem parecer 14 na main', precisaDeGit: true, rodar: () => {
|
|
57
57
|
const s = (0, sandbox_1.sandboxGit)('estado-dividido');
|
|
58
58
|
try {
|
|
@@ -116,7 +116,7 @@ exports.CANARIOS_PULSE = [
|
|
|
116
116
|
const t = (0, thread_1.novaThread)(s.carregado, { nome: 'resposta simulada', modo: 'classic' }).thread;
|
|
117
117
|
(0, ledger_1.registrar)((0, thread_1.dirThread)(s.dir, t.id), t.id, 'phase_result', { fase: 'GOAL', evidencia: 'SIMULADO' });
|
|
118
118
|
const pedido = (0, hitl_gates_1.abrirPedidoGate)(s.dir, t.id);
|
|
119
|
-
const chave = '
|
|
119
|
+
const chave = 'cenario-SIMULADO-sem-credencial-real-000';
|
|
120
120
|
const resposta = { origem: 'telegram', por: 'telegram:42', mensagem: 'telegram:-7:99',
|
|
121
121
|
resposta: '1', recebidoEm: new Date().toISOString() };
|
|
122
122
|
const envelope = { ...resposta, prova: (0, hitl_gates_1.assinaturaDaResposta)(t.id, pedido.id, resposta, chave) };
|
|
@@ -35,11 +35,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.fxPedidoColado = exports.PROMPTS_DE_CONDUCAO = exports.FRASE_DO_PEDIDO_COLADO = exports.PEDIDO_COLADO_DO_INCIDENTE = void 0;
|
|
37
37
|
/**
|
|
38
|
-
* RM-057 (fatia 2): o
|
|
38
|
+
* RM-057 (fatia 2): o cenario do incidente de 01/10/2026.
|
|
39
39
|
*
|
|
40
40
|
* Na noite de 01 para 02/10 o condutor recebeu, colado, o pedido do dono com push e merge
|
|
41
41
|
* autorizados ate um horario, parou para pedir um "confirmo" em texto livre e a fabrica ficou mais
|
|
42
|
-
* de 10 h sem produzir. O
|
|
42
|
+
* de 10 h sem produzir. O cenario refaz a conducao inteira em sandbox SIMULADO e exige que o mesmo
|
|
43
43
|
* pedido colado siga sem parar:
|
|
44
44
|
*
|
|
45
45
|
* 1. o modo sai da #TAG do texto colado (`#Auto`), pelo nucleo;
|
|
@@ -97,7 +97,7 @@ exports.fxPedidoColado = {
|
|
|
97
97
|
const decisao = (0, decisao_autonoma_1.registrarDecisao)(s.dir, t.id, {
|
|
98
98
|
decidido: 'Seguir com push e merge dentro da autorização colada', porque: 'o dono autorizou até 02/10 às 12h',
|
|
99
99
|
comoMudar: 'reverter o merge', custoDeReverter: { agora: 'um revert', depois: 'um revert' },
|
|
100
|
-
criterio: { tipo: 'ledger', referencia: `${t.id}#evento:1` }, quemDecidiu: '
|
|
100
|
+
criterio: { tipo: 'ledger', referencia: `${t.id}#evento:1` }, quemDecidiu: 'cenario-SIMULADO', evidencia: 'pedido colado',
|
|
101
101
|
});
|
|
102
102
|
const confirmo = {
|
|
103
103
|
contrato: hitl_contract_1.CONTRATO_HITL_V2, id: 'confirmo-SIMULADO', thread: t.id, fase: t.faseAtual, modo: t.modo,
|
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
36
|
+
exports.CENARIO_SENSORES = void 0;
|
|
37
37
|
/** T8: subprocessos, CLI e estado canônico reais; protocolo Codex sintético. */
|
|
38
38
|
const fs = __importStar(require("node:fs"));
|
|
39
39
|
const path = __importStar(require("node:path"));
|
|
@@ -50,11 +50,11 @@ function esperar(teste) {
|
|
|
50
50
|
const limite = Date.now() + 5000;
|
|
51
51
|
while (!teste()) {
|
|
52
52
|
if (Date.now() >= limite)
|
|
53
|
-
throw new Error('subprocesso do
|
|
53
|
+
throw new Error('subprocesso do cenário não terminou em 5000 ms');
|
|
54
54
|
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 10);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
exports.
|
|
57
|
+
exports.CENARIO_SENSORES = {
|
|
58
58
|
id: 'fx-sensores-runtime', sobre: 'hooks, supervisor e watcher integrados em sandbox Git', precisaDeGit: true,
|
|
59
59
|
rodar: ({ catalogo }) => {
|
|
60
60
|
const s = (0, sandbox_1.sandboxGit)('sensores-runtime');
|
|
@@ -75,7 +75,7 @@ exports.CANARIO_SENSORES = {
|
|
|
75
75
|
input: JSON.stringify({ cwd: wt, session_id: 'fixture-claude', hook_event_name: 'PermissionRequest', tool_use_id: 'fixture-tool' }),
|
|
76
76
|
env: { ...process.env, ORK_SENSOR_CLI: cli } });
|
|
77
77
|
if (h.status !== 0 || h.stderr || h.stdout)
|
|
78
|
-
throw new Error('hook/CLI do
|
|
78
|
+
throw new Error('hook/CLI do cenário indisponível');
|
|
79
79
|
const hookLatenciaMs = Date.now() - start;
|
|
80
80
|
const bloqueio = (0, ledger_1.lerLedger)(dir).find(e => e.tipo === 'sessao_bloqueada');
|
|
81
81
|
const carimboLatenciaMs = bloqueio ? Date.parse(String(bloqueio.recebidoEm)) - Date.parse(bloqueio.ts) : null;
|
|
@@ -100,7 +100,7 @@ exports.CANARIO_SENSORES = {
|
|
|
100
100
|
const runner = require.resolve('./adapters/codex-runner');
|
|
101
101
|
const morto = (0, node_child_process_1.spawnSync)(process.execPath, ['-e', `console.log(JSON.stringify(require(process.argv[1]).identidadeProcesso(process.pid)))`, runner], { cwd: wt, encoding: 'utf8', timeout: 5000 });
|
|
102
102
|
if (morto.status !== 0)
|
|
103
|
-
throw new Error('processo de morte do
|
|
103
|
+
throw new Error('processo de morte do cenário indisponível');
|
|
104
104
|
const filho = JSON.parse(morto.stdout);
|
|
105
105
|
if ((0, codex_runner_1.estadoProcesso)(filho) !== 'ausente')
|
|
106
106
|
throw new Error('processo ainda não está ausente');
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Os 7
|
|
3
|
+
* Os 7 cenarios de `ork eval` (6 do bloco B4 + fx-codex-dry da homologacao do codex).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Cenario nao e teste unitario: e um comportamento inteiro do produto, exercitado ponta a
|
|
6
6
|
* ponta contra git de verdade, que precisa continuar acontecendo depois de qualquer mudanca.
|
|
7
7
|
* Cada um nasce de um jeito conhecido de o trabalho de um agente parecer certo e nao ser:
|
|
8
8
|
*
|
|
@@ -51,8 +51,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
};
|
|
52
52
|
})();
|
|
53
53
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
-
exports.gitDisponivel = exports.
|
|
55
|
-
exports.
|
|
54
|
+
exports.gitDisponivel = exports.CENARIOS = void 0;
|
|
55
|
+
exports.cenarioPorId = cenarioPorId;
|
|
56
56
|
const node_child_process_1 = require("node:child_process");
|
|
57
57
|
const fs = __importStar(require("node:fs"));
|
|
58
58
|
const path = __importStar(require("node:path"));
|
|
@@ -67,11 +67,11 @@ Object.defineProperty(exports, "gitDisponivel", { enumerable: true, get: functio
|
|
|
67
67
|
const thread_1 = require("./thread");
|
|
68
68
|
const verify_1 = require("./verify");
|
|
69
69
|
const worktree_1 = require("./worktree");
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
const
|
|
70
|
+
const cenarios_pulse_1 = require("./cenarios-pulse");
|
|
71
|
+
const cenarios_sensores_1 = require("./cenarios-sensores");
|
|
72
|
+
const cenarios_hitl_1 = require("./cenarios-hitl");
|
|
73
|
+
const cenarios_i43_1 = require("./cenarios-i43");
|
|
74
|
+
const cenarios_rm057_1 = require("./cenarios-rm057");
|
|
75
75
|
const objective_1 = require("./objective");
|
|
76
76
|
const maestro_discovery_1 = require("./maestro-discovery");
|
|
77
77
|
const maestro_cli_1 = require("./maestro-cli");
|
|
@@ -196,7 +196,7 @@ const fxWikiDestroy = {
|
|
|
196
196
|
};
|
|
197
197
|
}
|
|
198
198
|
};
|
|
199
|
-
// A outra metade do
|
|
199
|
+
// A outra metade do cenario: a policy bloqueante do nucleo, que reprova entregar em cima
|
|
200
200
|
// da propria base. Guard do host e policy do nucleo sao defesas independentes de proposito.
|
|
201
201
|
const manifesto = {
|
|
202
202
|
runtime: { provider_policy: 'subscription-only' },
|
|
@@ -273,7 +273,7 @@ const fxConcurrency = {
|
|
|
273
273
|
* Nasce da homologacao do segundo runtime (thread ork-homologarcod): um `setup.json`
|
|
274
274
|
* apontando o bloco para o codex tem de mudar o COMANDO que o despacho monta, e o
|
|
275
275
|
* default sem setup tem de continuar saindo pelo claude-bg byte a byte (paridade sem
|
|
276
|
-
* downgrade). Tudo em dry-run:
|
|
276
|
+
* downgrade). Tudo em dry-run: cenario nao gasta assinatura de ninguem.
|
|
277
277
|
*/
|
|
278
278
|
const fxCodexDry = {
|
|
279
279
|
id: 'fx-codex-dry',
|
|
@@ -335,7 +335,7 @@ const fxMaestroBootstrap = {
|
|
|
335
335
|
const exit = (0, maestro_cli_1.runMaestroCli)(['--json'], s.dir, {}, { out: v => { raw = v; }, err: () => { } });
|
|
336
336
|
const clean = JSON.parse(raw);
|
|
337
337
|
const createsThread = (0, thread_1.listarIds)(s.dir).length !== before;
|
|
338
|
-
const t = (0, thread_1.novaThread)(s.carregado, { nome: '
|
|
338
|
+
const t = (0, thread_1.novaThread)(s.carregado, { nome: 'Cenário Maestro', modo: 'auto' }).thread;
|
|
339
339
|
const context = (0, maestro_discovery_1.discoverMaestro)({ cwd: s.dir });
|
|
340
340
|
const snapshot = () => (0, maestro_cli_1.readMaestro)(context, { host: { tools: ['ork_thread_status', 'ork_phase_run'], child: true } });
|
|
341
341
|
const state = snapshot();
|
|
@@ -359,8 +359,8 @@ const fxMaestroBootstrap = {
|
|
|
359
359
|
};
|
|
360
360
|
}),
|
|
361
361
|
};
|
|
362
|
-
/** Os
|
|
363
|
-
exports.
|
|
362
|
+
/** Os cenarios registrados, na ordem em que o `ork eval` os roda. */
|
|
363
|
+
exports.CENARIOS = [
|
|
364
364
|
fxHappy,
|
|
365
365
|
fxHallucination,
|
|
366
366
|
fxStaleBase,
|
|
@@ -370,13 +370,13 @@ exports.CANARIOS = [
|
|
|
370
370
|
fxCodexDry,
|
|
371
371
|
fxObjectiveOscillation,
|
|
372
372
|
fxMaestroBootstrap,
|
|
373
|
-
...
|
|
374
|
-
|
|
375
|
-
...
|
|
376
|
-
...
|
|
377
|
-
|
|
373
|
+
...cenarios_pulse_1.CENARIOS_PULSE,
|
|
374
|
+
cenarios_sensores_1.CENARIO_SENSORES,
|
|
375
|
+
...cenarios_hitl_1.CENARIOS_HITL,
|
|
376
|
+
...cenarios_i43_1.CENARIOS_I43,
|
|
377
|
+
cenarios_rm057_1.fxPedidoColado,
|
|
378
378
|
];
|
|
379
|
-
/** Um
|
|
380
|
-
function
|
|
381
|
-
return exports.
|
|
379
|
+
/** Um cenario por id, ou null quando a fixture aponta para um cenario que nao existe. */
|
|
380
|
+
function cenarioPorId(id) {
|
|
381
|
+
return exports.CENARIOS.find((c) => c.id === id) ?? null;
|
|
382
382
|
}
|
package/dist/check-agil.js
CHANGED
|
@@ -627,7 +627,8 @@ function resultadosDasLanes(linhas) {
|
|
|
627
627
|
/** Hash do ambiente funcional; transporte do CHECK, npm e bookkeeping do shell nao mudam o teste. */
|
|
628
628
|
function assinaturaDoAmbiente(env) {
|
|
629
629
|
const ignorada = (nome) => nome.startsWith('npm_') || nome.startsWith('NPM_')
|
|
630
|
-
|| ['ORK_CHECK_RELATORIO', 'ORK_CHECK_CPUS_DA_LANE', '
|
|
630
|
+
|| ['ORK_CHECK_RELATORIO', 'ORK_CHECK_CPUS_DA_LANE', 'ORK_CHECK_CPUS_DA_LANE_APOS_RESERVA', 'ORK_CHECK_RESERVA_DEVOLVIDA',
|
|
631
|
+
'ORK_CHECK_CPUS_DOCKER',
|
|
631
632
|
'NODE_TEST_CONTEXT', 'NODE_COMPILE_CACHE', 'PWD', 'OLDPWD', 'SHLVL', '_', 'INIT_CWD'].includes(nome);
|
|
632
633
|
const pares = Object.entries(env).filter(([nome, valor]) => valor !== undefined && !ignorada(nome))
|
|
633
634
|
.sort(([a], [b]) => a.localeCompare(b));
|
package/dist/check-paralelo.js
CHANGED
|
@@ -85,7 +85,8 @@ async function rodarEspecificacao(esp) {
|
|
|
85
85
|
const comGrupo = fs.existsSync(TIMEOUT_BIN);
|
|
86
86
|
const usaAgendador = esp.itens.some((i) => i.papelCpu === 'hermetica');
|
|
87
87
|
const plano = usaAgendador ? (0, agendador_cpu_1.planejarCpuDoGrupo)(esp.cpus ?? os.availableParallelism(), esp.medicaoCpu ?? await (0, agendador_cpu_1.medirCpuDoGrupo)()) : undefined;
|
|
88
|
-
const
|
|
88
|
+
const sinalDaReserva = plano && !plano.saturado ? path.join(esp.dir, 'reserva-devolvida.json') : undefined;
|
|
89
|
+
const itens = plano ? aplicarPlano(esp.itens, plano, sinalDaReserva) : esp.itens;
|
|
89
90
|
const limite = vagas(esp.maxParalelo && esp.maxParalelo > 0 ? esp.maxParalelo : itens.length);
|
|
90
91
|
const porNome = new Map();
|
|
91
92
|
const indice = new Map(itens.map((item, i) => [item.nome, i]));
|
|
@@ -112,7 +113,16 @@ async function rodarEspecificacao(esp) {
|
|
|
112
113
|
porNome.set(item.nome, vez);
|
|
113
114
|
return vez;
|
|
114
115
|
};
|
|
115
|
-
const
|
|
116
|
+
const todos = Promise.all(itens.map(vezDoItem));
|
|
117
|
+
const reservados = itens.filter((item) => item.papelCpu === 'varredura' || item.papelCpu === 'integracao');
|
|
118
|
+
const devolverReserva = async () => {
|
|
119
|
+
if (!sinalDaReserva || !reservados.some((item) => item.papelCpu === 'varredura')
|
|
120
|
+
|| !reservados.some((item) => item.papelCpu === 'integracao'))
|
|
121
|
+
return;
|
|
122
|
+
await Promise.all(reservados.map((item) => vezDoItem(item, indice.get(item.nome))));
|
|
123
|
+
fs.writeFileSync(sinalDaReserva, JSON.stringify({ em: new Date().toISOString(), vagas: plano.cpusHermeticaAposReserva }), { mode: 0o600 });
|
|
124
|
+
};
|
|
125
|
+
const [, terminados] = await Promise.all([devolverReserva(), todos]);
|
|
116
126
|
fs.writeFileSync(path.join(esp.dir, 'resultado.json'), JSON.stringify({ terminados, ...(plano ? { agendamentoCpu: plano } : {}) }), { mode: 0o600 });
|
|
117
127
|
function lancar(item, i) {
|
|
118
128
|
return new Promise((resolve) => {
|
|
@@ -141,7 +151,7 @@ async function rodarEspecificacao(esp) {
|
|
|
141
151
|
}
|
|
142
152
|
}
|
|
143
153
|
/** Aplica a mesma conta aos processos, as lanes e aos conteineres que eles criarem. */
|
|
144
|
-
function aplicarPlano(originais, plano) {
|
|
154
|
+
function aplicarPlano(originais, plano, sinalDaReserva) {
|
|
145
155
|
const itens = originais.map((item) => ({ ...item, ambiente: { ...item.ambiente } }));
|
|
146
156
|
const porPapel = (papel) => itens.filter((i) => i.papelCpu === papel);
|
|
147
157
|
const hermetica = porPapel('hermetica')[0];
|
|
@@ -158,7 +168,10 @@ function aplicarPlano(originais, plano) {
|
|
|
158
168
|
item.ambiente = { ...item.ambiente, ...valores };
|
|
159
169
|
};
|
|
160
170
|
const cpusContainer = String(plano.cpusPorContainer);
|
|
161
|
-
ambiente(hermetica, { [agendador_cpu_1.ENV_CPUS_DA_LANE]: String(plano.cpusHermetica), [agendador_cpu_1.ENV_CPUS_DOCKER]: cpusContainer
|
|
171
|
+
ambiente(hermetica, { [agendador_cpu_1.ENV_CPUS_DA_LANE]: String(plano.cpusHermetica), [agendador_cpu_1.ENV_CPUS_DOCKER]: cpusContainer,
|
|
172
|
+
...(sinalDaReserva && varredura && integracoes.length > 0 ? {
|
|
173
|
+
[agendador_cpu_1.ENV_CPUS_DA_LANE_APOS_RESERVA]: String(plano.cpusHermeticaAposReserva), [agendador_cpu_1.ENV_SINAL_DA_RESERVA]: sinalDaReserva,
|
|
174
|
+
} : {}) });
|
|
162
175
|
ambiente(varredura, {
|
|
163
176
|
ORK_CHECK_VARREDURA_PARALELA: String(plano.ferramentasDaVarredura),
|
|
164
177
|
[agendador_cpu_1.ENV_CPUS_DOCKER]: cpusContainer,
|
package/dist/claims.js
CHANGED
|
@@ -127,7 +127,7 @@ function montarClaim(entrada) {
|
|
|
127
127
|
criadoEm: (0, util_1.agora)(),
|
|
128
128
|
estado: verificar.length > 0 ? 'pendente' : 'nao-verificavel',
|
|
129
129
|
...(entrada.origem ? { origem: entrada.origem } : {}),
|
|
130
|
-
// I-53 (RM-037, P6): a mesma regra para CLI, MCP,
|
|
130
|
+
// I-53 (RM-037, P6): a mesma regra para CLI, MCP, cenarios e auditor, porque todos passam aqui.
|
|
131
131
|
lint: (0, claim_lint_1.analisarComandos)(verificar),
|
|
132
132
|
};
|
|
133
133
|
}
|
package/dist/docs.js
CHANGED
|
@@ -110,7 +110,7 @@ exports.DIMENSOES = {
|
|
|
110
110
|
codigo: ['Não iniciado', 'Branch criada', 'PR aberto', 'Mesclado'],
|
|
111
111
|
testes: ['Não iniciados', 'Em execução', 'Aprovados', 'Falhando'],
|
|
112
112
|
deploy: ['Não implantado', 'Dev', 'Staging', 'Produção'],
|
|
113
|
-
exposicao: ['Flag desligada', 'Piloto/
|
|
113
|
+
exposicao: ['Flag desligada', 'Piloto/Gradual', 'Parcial', 'Geral'],
|
|
114
114
|
habilitacao: ['Pendente', 'Em andamento', 'Concluída'],
|
|
115
115
|
};
|
|
116
116
|
exports.CATEGORIAS = ['iniciativa', 'épico', 'feature', 'melhoria'];
|
package/dist/evalrunner.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Ele julga duas coisas, e diz em voz alta que so uma delas ele consegue julgar.
|
|
6
6
|
*
|
|
7
|
-
* 1. **Os
|
|
7
|
+
* 1. **Os cenarios** (`eval/fixtures/fx-*`): comportamento real do nucleo, exercitado ponta a
|
|
8
8
|
* ponta contra git de verdade, comparado com o que a fixture declara esperar.
|
|
9
9
|
* 2. **O corpus das skills** (`eval/casos/*.json`): as regras que precisam EXISTIR no arquivo
|
|
10
10
|
* da skill para o comportamento ser possivel. Isso e deterministico, e e o que o runner
|
|
@@ -60,12 +60,12 @@ exports.posicoesDaAssercao = posicoesDaAssercao;
|
|
|
60
60
|
exports.dirDeCasos = dirDeCasos;
|
|
61
61
|
exports.dirDeFixtures = dirDeFixtures;
|
|
62
62
|
exports.lerCasos = lerCasos;
|
|
63
|
-
exports.
|
|
63
|
+
exports.rodarCenarios = rodarCenarios;
|
|
64
64
|
exports.rodarEval = rodarEval;
|
|
65
65
|
exports.textoDoEval = textoDoEval;
|
|
66
66
|
const fs = __importStar(require("node:fs"));
|
|
67
67
|
const path = __importStar(require("node:path"));
|
|
68
|
-
const
|
|
68
|
+
const cenarios_1 = require("./cenarios");
|
|
69
69
|
const catalogo_1 = require("./catalogo");
|
|
70
70
|
const util_1 = require("./util");
|
|
71
71
|
const locale_1 = require("./locale");
|
|
@@ -271,20 +271,20 @@ function comparar(esperado, observado) {
|
|
|
271
271
|
}
|
|
272
272
|
return divergencias;
|
|
273
273
|
}
|
|
274
|
-
/** Roda os
|
|
275
|
-
function
|
|
274
|
+
/** Roda os cenarios cujas fixtures existem em `eval/fixtures/fx-*`. */
|
|
275
|
+
function rodarCenarios(catalogo, filtro) {
|
|
276
276
|
const dir = dirDeFixtures(catalogo);
|
|
277
277
|
const resultados = [];
|
|
278
278
|
const falhas = [];
|
|
279
279
|
const m = (0, locale_1.msg)().operacao.restante.eval;
|
|
280
|
-
const temGit = (0,
|
|
280
|
+
const temGit = (0, cenarios_1.gitDisponivel)();
|
|
281
281
|
const nomes = fs.existsSync(dir) ? fs.readdirSync(dir).sort() : [];
|
|
282
282
|
if (filtro && filtro.length === 0) {
|
|
283
283
|
falhas.push({ codigo: 'fixture-invalida', detalhe: m.filtroVazio });
|
|
284
284
|
}
|
|
285
285
|
for (const id of new Set(filtro ?? [])) {
|
|
286
|
-
if (!nomes.includes(id) || !(0,
|
|
287
|
-
falhas.push({ codigo: '
|
|
286
|
+
if (!nomes.includes(id) || !(0, cenarios_1.cenarioPorId)(id)) {
|
|
287
|
+
falhas.push({ codigo: 'cenario-sem-executor', caso: id, detalhe: m.cenarioAusente(id) });
|
|
288
288
|
}
|
|
289
289
|
}
|
|
290
290
|
for (const nome of nomes) {
|
|
@@ -305,22 +305,22 @@ function rodarCanarios(catalogo, filtro) {
|
|
|
305
305
|
falhas.push({ codigo: 'fixture-invalida', detalhe: `${nome}: ${e.message}` });
|
|
306
306
|
continue;
|
|
307
307
|
}
|
|
308
|
-
const
|
|
308
|
+
const cenario = (0, cenarios_1.cenarioPorId)(fixture.id ?? nome);
|
|
309
309
|
if (fixture.id !== nome) {
|
|
310
310
|
falhas.push({ codigo: 'fixture-invalida', caso: nome, detalhe: m.fixtureDiverge });
|
|
311
311
|
continue;
|
|
312
312
|
}
|
|
313
|
-
if (!
|
|
313
|
+
if (!cenario) {
|
|
314
314
|
falhas.push({
|
|
315
|
-
codigo: '
|
|
315
|
+
codigo: 'cenario-sem-executor',
|
|
316
316
|
detalhe: m.semExecutor(nome, fixture.id ?? nome),
|
|
317
317
|
});
|
|
318
318
|
continue;
|
|
319
319
|
}
|
|
320
|
-
if (
|
|
320
|
+
if (cenario.precisaDeGit && !temGit) {
|
|
321
321
|
resultados.push({
|
|
322
|
-
id:
|
|
323
|
-
sobre:
|
|
322
|
+
id: cenario.id,
|
|
323
|
+
sobre: cenario.sobre,
|
|
324
324
|
estado: 'unavailable',
|
|
325
325
|
divergencias: [],
|
|
326
326
|
motivo: m.semGit,
|
|
@@ -329,11 +329,11 @@ function rodarCanarios(catalogo, filtro) {
|
|
|
329
329
|
continue;
|
|
330
330
|
}
|
|
331
331
|
try {
|
|
332
|
-
const observado =
|
|
332
|
+
const observado = cenario.rodar({ catalogo });
|
|
333
333
|
const divergencias = comparar(fixture.esperado ?? {}, observado);
|
|
334
334
|
resultados.push({
|
|
335
|
-
id:
|
|
336
|
-
sobre:
|
|
335
|
+
id: cenario.id,
|
|
336
|
+
sobre: cenario.sobre,
|
|
337
337
|
estado: divergencias.length === 0 ? 'passou' : 'falhou',
|
|
338
338
|
divergencias,
|
|
339
339
|
motivo: divergencias.length === 0 ? '' : `${divergencias.length} chave(s) divergente(s)`,
|
|
@@ -341,33 +341,33 @@ function rodarCanarios(catalogo, filtro) {
|
|
|
341
341
|
});
|
|
342
342
|
for (const d of divergencias) {
|
|
343
343
|
falhas.push({
|
|
344
|
-
codigo: '
|
|
345
|
-
caso: `${
|
|
344
|
+
codigo: 'cenario',
|
|
345
|
+
caso: `${cenario.id}/${d.chave}`,
|
|
346
346
|
detalhe: m.divergencia(JSON.stringify(d.esperado), JSON.stringify(d.observado)),
|
|
347
347
|
});
|
|
348
348
|
}
|
|
349
349
|
}
|
|
350
350
|
catch (e) {
|
|
351
351
|
resultados.push({
|
|
352
|
-
id:
|
|
353
|
-
sobre:
|
|
352
|
+
id: cenario.id,
|
|
353
|
+
sobre: cenario.sobre,
|
|
354
354
|
estado: 'falhou',
|
|
355
355
|
divergencias: [],
|
|
356
356
|
motivo: e.message,
|
|
357
357
|
observado: {},
|
|
358
358
|
});
|
|
359
|
-
falhas.push({ codigo: '
|
|
359
|
+
falhas.push({ codigo: 'cenario', caso: cenario.id, detalhe: e.message });
|
|
360
360
|
}
|
|
361
361
|
}
|
|
362
|
-
//
|
|
362
|
+
// Cenario registrado no codigo e sem fixture em disco tambem e defeito: a expectativa
|
|
363
363
|
// precisa ser dado versionado, revisavel por quem nao le TypeScript.
|
|
364
364
|
if (!filtro) {
|
|
365
|
-
for (const c of
|
|
365
|
+
for (const c of cenarios_1.CENARIOS) {
|
|
366
366
|
if (!fs.existsSync(path.join(dir, c.id, 'caso.json'))) {
|
|
367
367
|
falhas.push({
|
|
368
368
|
codigo: 'fixture-invalida',
|
|
369
369
|
caso: c.id,
|
|
370
|
-
detalhe: m.
|
|
370
|
+
detalhe: m.cenarioSemFixture(c.id),
|
|
371
371
|
});
|
|
372
372
|
}
|
|
373
373
|
}
|
|
@@ -377,20 +377,20 @@ function rodarCanarios(catalogo, filtro) {
|
|
|
377
377
|
// ---------------------------------------------------------------------------
|
|
378
378
|
// Orquestracao
|
|
379
379
|
// ---------------------------------------------------------------------------
|
|
380
|
-
/** Roda o eval inteiro:
|
|
380
|
+
/** Roda o eval inteiro: cenarios mais corpus das skills. */
|
|
381
381
|
function rodarEval(opcoes) {
|
|
382
382
|
const { catalogo } = opcoes;
|
|
383
383
|
const falhas = [];
|
|
384
384
|
const linhas = [];
|
|
385
|
-
let
|
|
385
|
+
let cenarios = [];
|
|
386
386
|
if (!opcoes.soSkills) {
|
|
387
|
-
const r =
|
|
388
|
-
|
|
387
|
+
const r = rodarCenarios(catalogo, opcoes.cenarios);
|
|
388
|
+
cenarios = r.resultados;
|
|
389
389
|
falhas.push(...r.falhas);
|
|
390
390
|
}
|
|
391
391
|
let totalDeCasos = 0;
|
|
392
392
|
let totalDeAssercoes = 0;
|
|
393
|
-
if (!opcoes.
|
|
393
|
+
if (!opcoes.soCenarios) {
|
|
394
394
|
const { arquivos, falhas: falhasDeLeitura } = lerCasos(catalogo);
|
|
395
395
|
falhas.push(...falhasDeLeitura);
|
|
396
396
|
const doCatalogo = (0, catalogo_1.skillsDoCatalogo)(catalogo);
|
|
@@ -428,7 +428,7 @@ function rodarEval(opcoes) {
|
|
|
428
428
|
return {
|
|
429
429
|
catalogo,
|
|
430
430
|
skills: linhas,
|
|
431
|
-
|
|
431
|
+
cenarios,
|
|
432
432
|
falhas,
|
|
433
433
|
totalDeCasos,
|
|
434
434
|
totalDeAssercoes,
|
|
@@ -442,10 +442,10 @@ function textoDoEval(r) {
|
|
|
442
442
|
const linhas = [];
|
|
443
443
|
linhas.push(m.titulo(r.catalogo));
|
|
444
444
|
linhas.push('');
|
|
445
|
-
if (r.
|
|
446
|
-
linhas.push(m.
|
|
445
|
+
if (r.cenarios.length > 0) {
|
|
446
|
+
linhas.push(m.cenarios);
|
|
447
447
|
linhas.push('');
|
|
448
|
-
linhas.push((0, util_1.tabela)([...m.
|
|
448
|
+
linhas.push((0, util_1.tabela)([...m.colunasCenarios], r.cenarios.map((c) => [c.id, m.estados[c.estado] ?? c.estado, c.estado === 'passou' ? c.sobre : c.motivo || c.sobre])));
|
|
449
449
|
linhas.push('');
|
|
450
450
|
}
|
|
451
451
|
if (r.skills.length > 0) {
|
|
@@ -463,9 +463,9 @@ function textoDoEval(r) {
|
|
|
463
463
|
}
|
|
464
464
|
linhas.push('');
|
|
465
465
|
}
|
|
466
|
-
const passaram = r.
|
|
467
|
-
const indisponiveis = r.
|
|
468
|
-
linhas.push(m.
|
|
466
|
+
const passaram = r.cenarios.filter((c) => c.estado === 'passou').length;
|
|
467
|
+
const indisponiveis = r.cenarios.filter((c) => c.estado === 'unavailable').length;
|
|
468
|
+
linhas.push(m.resumoCenarios(passaram, r.cenarios.length, indisponiveis));
|
|
469
469
|
linhas.push(m.resumoSkills(r.skills.length, r.totalDeCasos, r.totalDeAssercoes, r.falhas.length));
|
|
470
470
|
linhas.push(m.metade);
|
|
471
471
|
linhas.push(m.veredito(r.ok));
|
package/dist/hitl-canais.js
CHANGED
|
@@ -204,7 +204,7 @@ function recusarIngressoNaoHomologado(ingresso) {
|
|
|
204
204
|
}
|
|
205
205
|
return ingresso;
|
|
206
206
|
}
|
|
207
|
-
/** Invariantes do registro. O teste chama isto; o produto tambem, no
|
|
207
|
+
/** Invariantes do registro. O teste chama isto; o produto tambem, no cenario. */
|
|
208
208
|
function conferirRegistro() {
|
|
209
209
|
const canais = canaisHomologados();
|
|
210
210
|
if (canais.length !== hosts_1.ORDEM_DOS_HOSTS.length || canais.length !== 4) {
|
|
@@ -178,7 +178,7 @@ function pedidoHitlAberto(raiz, id, fase, sessionId) {
|
|
|
178
178
|
/**
|
|
179
179
|
* FX6: a oferta de canais que acompanha um pedido HITL REAL.
|
|
180
180
|
*
|
|
181
|
-
* `ofertaDeCanais` existia desde D12 e era chamada de um lugar so: o
|
|
181
|
+
* `ofertaDeCanais` existia desde D12 e era chamada de um lugar so: o cenario. No caminho de
|
|
182
182
|
* producao o humano via a pergunta e um `comandoResposta`, e nada dizia por quais canais dava
|
|
183
183
|
* para responder AGORA nem por que os outros nao serviam. Uma oferta que so aparece em
|
|
184
184
|
* simulacao nao e oferta; e uma tabela bonita, como a propria narrativa de D12 admitia.
|
|
@@ -29,7 +29,7 @@ exports.linhaDoHitlAcimaDaMeta = linhaDoHitlAcimaDaMeta;
|
|
|
29
29
|
* aberto nada disso ainda: a espera corre ate o fim do periodo.
|
|
30
30
|
*
|
|
31
31
|
* Limite dito: o "confirmo" que um condutor pede na conversa, fora do ork, nao chega ao ledger e
|
|
32
|
-
* nao entra aqui. Por isso o
|
|
32
|
+
* nao entra aqui. Por isso o cenario `fx-pedido-colado` e a regra nos adaptadores existem.
|
|
33
33
|
*
|
|
34
34
|
* Funcoes puras sobre eventos: nao leem disco nem relogio. Ausencia de pedido e zero pedidos, e a
|
|
35
35
|
* mediana sem resposta e `null`, nunca zero inventado. A unica leitura de disco e
|
package/dist/index.js
CHANGED
|
@@ -3622,9 +3622,9 @@ function comandoAdapter(args) {
|
|
|
3622
3622
|
return 2;
|
|
3623
3623
|
}
|
|
3624
3624
|
/**
|
|
3625
|
-
* `ork eval`:
|
|
3625
|
+
* `ork eval`: cenarios de comportamento e o corpus das skills finas (bloco B4).
|
|
3626
3626
|
*
|
|
3627
|
-
* Skill sem eval nao entra, e comportamento sem
|
|
3627
|
+
* Skill sem eval nao entra, e comportamento sem cenario tambem nao. O comando sai diferente
|
|
3628
3628
|
* de zero em qualquer falha, para o CI do kit poder barrar merge sem eval.
|
|
3629
3629
|
*/
|
|
3630
3630
|
function comandoEval(args) {
|
|
@@ -3637,8 +3637,8 @@ function comandoEval(args) {
|
|
|
3637
3637
|
const r = (0, evalrunner_1.rodarEval)({
|
|
3638
3638
|
catalogo,
|
|
3639
3639
|
skills: lista(args.opcoes.skill),
|
|
3640
|
-
|
|
3641
|
-
|
|
3640
|
+
cenarios: lista(args.opcoes.cenario) ?? lista(args.opcoes.fixture),
|
|
3641
|
+
soCenarios: args.opcoes['so-cenarios'] === true,
|
|
3642
3642
|
soSkills: args.opcoes['so-skills'] === true,
|
|
3643
3643
|
});
|
|
3644
3644
|
if (args.opcoes.json === true) {
|
package/dist/init.js
CHANGED
|
@@ -267,7 +267,7 @@ policies:
|
|
|
267
267
|
* exemplo) gravava manifesto, `AGENTS.md` e `.orkastery/` ali e saia 0; um repositorio criado depois
|
|
268
268
|
* dentro dessa pasta herdava o manifesto de fora, com outro nome e outra abbrev, e o doctor dizia PRONTO.
|
|
269
269
|
* A CLI recusa antes de gravar qualquer coisa. A funcao `init` segue aceitando qualquer pasta (demo e
|
|
270
|
-
*
|
|
270
|
+
* cenarios montam o projeto por ela).
|
|
271
271
|
*/
|
|
272
272
|
function exigirRepositorioParaInit(dir) {
|
|
273
273
|
const r = (0, util_1.exec)('git', ['rev-parse', '--is-inside-work-tree'], dir);
|
package/dist/locale-ajuda.js
CHANGED
|
@@ -364,8 +364,8 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
|
|
|
364
364
|
[--aceitar-catalogo <arquivo>] sobrescreve a copia com o catalogo, arquivo a arquivo
|
|
365
365
|
[--manter-copia <arquivo>] deixa a copia como esta, arquivo a arquivo
|
|
366
366
|
|
|
367
|
-
eval [--skill S] [--
|
|
368
|
-
[--so-
|
|
367
|
+
eval [--skill S] [--cenario C] Cenarios de comportamento + corpus das skills finas
|
|
368
|
+
[--so-cenarios] [--so-skills] [--json] (sai != 0 em qualquer falha)
|
|
369
369
|
|
|
370
370
|
audit packs [--estagio E] [--pack P] Os 7 packs, o estagio que os ativa e a postura
|
|
371
371
|
audit run <pack> [--profile P] Monta o prompt do pack e despacha pelo runtime adapter
|
|
@@ -413,7 +413,7 @@ Fases: GOAL PLAN GO CHECK SHIP MASTER. Modos: ${v.tags}.
|
|
|
413
413
|
Familias de lease: main-tree, worktree-write:<thread>, path:<glob>, board:<card>, service:<porta>.
|
|
414
414
|
Ciclos: greenfield, merge-branch, goal-plan, gap, feature-xl-faseada.
|
|
415
415
|
Fontes de medida do gate de tokens: runtime_reported, estimated, informada, unavailable.
|
|
416
|
-
Hosts de Camada 1: claude-code, codex, hermes, openclaw.
|
|
416
|
+
Hosts de Camada 1: claude-code, codex, hermes, openclaw. Cenarios: fx-happy, fx-hallucination,
|
|
417
417
|
fx-stale-base, fx-wiki-destroy, fx-schema-drift, fx-concurrency.
|
|
418
418
|
Packs de auditoria: clean-code, reuse, architecture, data-model, ux, security-privacy, process.
|
|
419
419
|
Superficie de ataque de rede (SP8..SP12, varredura deterministica): rota sem auth, endpoint de
|
|
@@ -778,8 +778,8 @@ Usage: ork [--projeto <name|path>] <command> [arguments]
|
|
|
778
778
|
[--aceitar-catalogo <file>] overwrites the copy with the catalog, file by file
|
|
779
779
|
[--manter-copia <file>] keeps the copy as it is, file by file
|
|
780
780
|
|
|
781
|
-
eval [--skill S] [--
|
|
782
|
-
[--so-
|
|
781
|
+
eval [--skill S] [--cenario C] Behavior scenarios + corpus of the thin skills
|
|
782
|
+
[--so-cenarios] [--so-skills] [--json] (exits != 0 on any failure)
|
|
783
783
|
|
|
784
784
|
audit packs [--estagio E] [--pack P] The 7 packs, the stage that activates them and the posture
|
|
785
785
|
audit run <pack> [--profile P] Builds the pack prompt and dispatches through the runtime adapter
|
|
@@ -827,7 +827,7 @@ Phases: GOAL PLAN GO CHECK SHIP MASTER. Modes: ${v.tags}.
|
|
|
827
827
|
Lease families: main-tree, worktree-write:<thread>, path:<glob>, board:<card>, service:<port>.
|
|
828
828
|
Cycles: greenfield, merge-branch, goal-plan, gap, feature-xl-faseada.
|
|
829
829
|
Token gate measurement sources: runtime_reported, estimated, informada, unavailable.
|
|
830
|
-
Layer 1 hosts: claude-code, codex, hermes, openclaw.
|
|
830
|
+
Layer 1 hosts: claude-code, codex, hermes, openclaw. Scenarios: fx-happy, fx-hallucination,
|
|
831
831
|
fx-stale-base, fx-wiki-destroy, fx-schema-drift, fx-concurrency.
|
|
832
832
|
Audit packs: clean-code, reuse, architecture, data-model, ux, security-privacy, process.
|
|
833
833
|
Network attack surface (SP8..SP12, deterministic scan): route without auth, exposed admin
|
|
@@ -339,23 +339,23 @@ exports.OPERACAO_RESTANTE_PT_BR = {
|
|
|
339
339
|
deveriaAusente: (valor, vezes) => `"${valor}" deveria estar AUSENTE da skill e aparece ${vezes}x`,
|
|
340
340
|
naoExiste: (valor, skill, porque) => `"${valor}" nao existe em skills/.../${skill}/SKILL.md (${porque})`,
|
|
341
341
|
ancora: 'todas as ancoras deste caso estao dentro da tabela de racionalizacoes: a skill lista a desculpa mas nao carrega a regra que responde a ela',
|
|
342
|
-
filtroVazio: 'filtro de
|
|
343
|
-
|
|
342
|
+
filtroVazio: 'filtro de cenários vazio: nenhuma prova foi executada',
|
|
343
|
+
cenarioAusente: (id) => `cenário solicitado ausente: ${id}`,
|
|
344
344
|
casoAusente: (nome) => `${nome}: falta caso.json`,
|
|
345
|
-
fixtureDiverge: 'id da fixture diverge do
|
|
346
|
-
semExecutor: (nome, id) => `${nome}: nenhum executor registrado para o
|
|
347
|
-
semGit: 'git nao esta nesta maquina: o
|
|
345
|
+
fixtureDiverge: 'id da fixture diverge do cenário solicitado',
|
|
346
|
+
semExecutor: (nome, id) => `${nome}: nenhum executor registrado para o cenario "${id}"`,
|
|
347
|
+
semGit: 'git nao esta nesta maquina: o cenario sai unavailable, nunca passing',
|
|
348
348
|
divergencia: (esperado, observado) => `esperado ${esperado}, observado ${observado}`,
|
|
349
|
-
|
|
349
|
+
cenarioSemFixture: (id) => `o cenario ${id} existe no codigo e nao tem eval/fixtures/${id}/caso.json`,
|
|
350
350
|
skillSemEval: (skill) => `skill sem eval nao entra no catalogo: falta eval/casos/${skill}.json`,
|
|
351
351
|
evalSemSkill: 'ha casos para uma skill que nao existe no catalogo',
|
|
352
352
|
titulo: (catalogo) => `ork eval, catalogo em ${catalogo}`,
|
|
353
|
-
|
|
354
|
-
|
|
353
|
+
cenarios: 'Cenarios (comportamento real do nucleo, contra git de verdade)',
|
|
354
|
+
colunasCenarios: ['CENARIO', 'ESTADO', 'SOBRE'],
|
|
355
355
|
estados: { passou: 'passou', unavailable: 'unavailable', falhou: 'falhou' },
|
|
356
356
|
skills: 'Corpus das skills (a metade estatica: as regras que precisam existir no arquivo)',
|
|
357
357
|
colunasSkills: ['SKILL', 'CASOS', 'ASSERCOES', 'FALHAS'], falhas: 'Falhas',
|
|
358
|
-
|
|
358
|
+
resumoCenarios: (passaram, total, indisponiveis) => `cenarios: ${passaram}/${total} verdes${indisponiveis > 0 ? ` (${indisponiveis} unavailable)` : ''}`,
|
|
359
359
|
resumoSkills: (skills, casos, assercoes, falhas) => `skills: ${skills} | casos: ${casos} | assercoes: ${assercoes} | falhas: ${falhas}`,
|
|
360
360
|
metade: 'metade comportamental (o agente resiste a desculpa?): unavailable, julgada por humano ou por modelo, nunca por este runner',
|
|
361
361
|
veredito: (ok) => `VEREDITO: ${ok ? 'verde' : 'vermelho'}`,
|
|
@@ -815,23 +815,23 @@ exports.OPERACAO_RESTANTE_EN = {
|
|
|
815
815
|
deveriaAusente: (value, times) => `"${value}" should be ABSENT from the skill and appears ${times} time(s)`,
|
|
816
816
|
naoExiste: (value, skill, why) => `"${value}" does not exist in skills/.../${skill}/SKILL.md (${why})`,
|
|
817
817
|
ancora: 'every anchor in this case is inside the rationalizations table: the skill lists the excuse but does not carry the rule that answers it',
|
|
818
|
-
filtroVazio: 'empty
|
|
819
|
-
|
|
818
|
+
filtroVazio: 'empty scenario filter: no evidence was executed',
|
|
819
|
+
cenarioAusente: (id) => `requested scenario is missing: ${id}`,
|
|
820
820
|
casoAusente: (name) => `${name}: caso.json is missing`,
|
|
821
|
-
fixtureDiverge: 'fixture id differs from the requested
|
|
822
|
-
semExecutor: (name, id) => `${name}: no executor registered for
|
|
823
|
-
semGit: 'git is not on this machine: the
|
|
821
|
+
fixtureDiverge: 'fixture id differs from the requested scenario',
|
|
822
|
+
semExecutor: (name, id) => `${name}: no executor registered for scenario "${id}"`,
|
|
823
|
+
semGit: 'git is not on this machine: the scenario is unavailable, never passing',
|
|
824
824
|
divergencia: (expected, observed) => `expected ${expected}, observed ${observed}`,
|
|
825
|
-
|
|
825
|
+
cenarioSemFixture: (id) => `scenario ${id} exists in code but has no eval/fixtures/${id}/caso.json`,
|
|
826
826
|
skillSemEval: (skill) => `a skill without eval does not enter the catalog: eval/casos/${skill}.json is missing`,
|
|
827
827
|
evalSemSkill: 'there are cases for a skill that does not exist in the catalog',
|
|
828
828
|
titulo: (catalog) => `ork eval, catalog at ${catalog}`,
|
|
829
|
-
|
|
830
|
-
|
|
829
|
+
cenarios: 'Scenarios (real core behavior, against real git)',
|
|
830
|
+
colunasCenarios: ['SCENARIO', 'STATE', 'SUBJECT'],
|
|
831
831
|
estados: { passou: 'passed', unavailable: 'unavailable', falhou: 'failed' },
|
|
832
832
|
skills: 'Skills corpus (the static half: rules that must exist in the file)',
|
|
833
833
|
colunasSkills: ['SKILL', 'CASES', 'ASSERTIONS', 'FAILURES'], falhas: 'Failures',
|
|
834
|
-
|
|
834
|
+
resumoCenarios: (passed, total, unavailable) => `scenarios: ${passed}/${total} green${unavailable > 0 ? ` (${unavailable} unavailable)` : ''}`,
|
|
835
835
|
resumoSkills: (skills, cases, assertions, failures) => `skills: ${skills} | cases: ${cases} | assertions: ${assertions} | failures: ${failures}`,
|
|
836
836
|
metade: 'behavioral half (does the agent resist the excuse?): unavailable, judged by a human or a model, never by this runner',
|
|
837
837
|
veredito: (ok) => `VERDICT: ${ok ? 'green' : 'red'}`,
|
package/dist/sandbox.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Sandbox deterministica para os
|
|
3
|
+
* Sandbox deterministica para os cenarios de `ork eval` (bloco B4).
|
|
4
4
|
*
|
|
5
|
-
* Um
|
|
5
|
+
* Um cenario precisa exercitar o comportamento REAL do nucleo: git de verdade, worktree de
|
|
6
6
|
* verdade, lease de verdade. Fazer isso no repositorio do usuario seria inaceitavel, e
|
|
7
7
|
* simular git com dublê seria testar o dublê. A saida e um repositorio git temporario,
|
|
8
8
|
* criado, usado e apagado dentro da mesma execucao.
|
|
9
9
|
*
|
|
10
10
|
* Regras que esta sandbox respeita, e por isso ela pode rodar em `ork eval` na maquina de
|
|
11
11
|
* qualquer builder: nada de rede, nada de credencial, nada fora de um diretorio temporario,
|
|
12
|
-
* e limpeza garantida mesmo quando o
|
|
12
|
+
* e limpeza garantida mesmo quando o cenario falha.
|
|
13
13
|
*/
|
|
14
14
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
15
|
if (k2 === undefined) k2 = k;
|
|
@@ -55,7 +55,7 @@ const path = __importStar(require("node:path"));
|
|
|
55
55
|
const init_1 = require("./init");
|
|
56
56
|
const manifest_1 = require("./manifest");
|
|
57
57
|
const util_1 = require("./util");
|
|
58
|
-
/** `git` existe nesta maquina? Sem ele os
|
|
58
|
+
/** `git` existe nesta maquina? Sem ele os cenarios saem `unavailable`, nunca `passing`. */
|
|
59
59
|
function gitDisponivel() {
|
|
60
60
|
return (0, util_1.noPath)('git') !== null;
|
|
61
61
|
}
|
|
@@ -75,15 +75,15 @@ function commitar(dir, arquivo, conteudo, mensagem) {
|
|
|
75
75
|
/**
|
|
76
76
|
* Repositorio git temporario com manifesto gerado pelo proprio `ork init`.
|
|
77
77
|
*
|
|
78
|
-
* O manifesto vem do `init` de verdade e nao de um objeto escrito a mao:
|
|
79
|
-
* proprio manifesto testa o
|
|
78
|
+
* O manifesto vem do `init` de verdade e nao de um objeto escrito a mao: cenario que monta o
|
|
79
|
+
* proprio manifesto testa o cenario, nao o produto.
|
|
80
80
|
*/
|
|
81
81
|
function sandboxGit(nome, abbrev = 'evl') {
|
|
82
|
-
// I-49:
|
|
82
|
+
// I-49: cenario nunca escreve no registro compartilhado de contas do usuario.
|
|
83
83
|
if (!process.env.ORK_CONTAS_DIR) {
|
|
84
84
|
process.env.ORK_CONTAS_DIR = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'ork-contas-eval-')), 'private');
|
|
85
85
|
}
|
|
86
|
-
// I-51:
|
|
86
|
+
// I-51: cenario nunca publica o estado da fabrica.
|
|
87
87
|
if (process.env.ORK_FABRICA_PUBLICAR === undefined)
|
|
88
88
|
process.env.ORK_FABRICA_PUBLICAR = '0';
|
|
89
89
|
if (!process.env.ORK_USUARIO_DIR)
|
|
@@ -91,10 +91,10 @@ function sandboxGit(nome, abbrev = 'evl') {
|
|
|
91
91
|
const dir = dirTemporario(nome);
|
|
92
92
|
(0, util_1.exec)('git', ['init', '-b', 'main'], dir);
|
|
93
93
|
(0, util_1.exec)('git', ['config', 'user.email', 'eval@orkastery.local'], dir);
|
|
94
|
-
(0, util_1.exec)('git', ['config', 'user.name', '
|
|
94
|
+
(0, util_1.exec)('git', ['config', 'user.name', 'Cenario do ork eval'], dir);
|
|
95
95
|
(0, util_1.exec)('git', ['config', 'commit.gpgsign', 'false'], dir);
|
|
96
|
-
commitar(dir, 'README.md', '# projeto do
|
|
97
|
-
(0, init_1.init)(dir, { nome: '
|
|
96
|
+
commitar(dir, 'README.md', '# projeto do cenario\n', 'inicial');
|
|
97
|
+
(0, init_1.init)(dir, { nome: 'cenario', abbrev });
|
|
98
98
|
return {
|
|
99
99
|
dir,
|
|
100
100
|
carregado: (0, manifest_1.exigirManifesto)(dir),
|
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
|