@orkastery/cli 0.6.2 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/adapters/claude-code/README.md +1 -1
  2. package/adapters/hermes/README.md +1 -1
  3. package/adapters/openclaw/openclaw.plugin.json +1 -1
  4. package/adapters/openclaw/package.json +1 -1
  5. package/assets/adapters-en/claude-code/README.md +1 -1
  6. package/assets/adapters-en/hermes/README.md +1 -1
  7. package/assets/docs/padroes/roadmap-de-produto.md +1 -1
  8. package/assets/docs-en/padroes/roadmap-de-produto.md +1 -1
  9. package/assets/references-en/testing-patterns.md +1 -1
  10. package/dist/agendador-cpu.js +49 -5
  11. package/dist/catalogo.js +3 -3
  12. package/dist/{canarios-hitl.js → cenarios-hitl.js} +7 -7
  13. package/dist/{canarios-i43.js → cenarios-i43.js} +16 -16
  14. package/dist/{canarios-pulse.js → cenarios-pulse.js} +3 -3
  15. package/dist/{canarios-rm057.js → cenarios-rm057.js} +3 -3
  16. package/dist/{canarios-sensores.js → cenarios-sensores.js} +9 -8
  17. package/dist/{canarios.js → cenarios.js} +22 -22
  18. package/dist/check-agil.js +2 -1
  19. package/dist/check-paralelo.js +337 -14
  20. package/dist/claims.js +1 -1
  21. package/dist/docs.js +1 -1
  22. package/dist/evalrunner.js +37 -37
  23. package/dist/hitl-canais.js +1 -1
  24. package/dist/hitl-presentation.js +1 -1
  25. package/dist/hitl-tempo-parado.js +1 -1
  26. package/dist/index.js +4 -4
  27. package/dist/init.js +1 -1
  28. package/dist/locale-ajuda.js +6 -6
  29. package/dist/locale-operacao-restante.js +18 -18
  30. package/dist/sandbox.js +11 -11
  31. package/dist/security-scan/agil.js +28 -12
  32. package/dist/security-scan/executor.js +1 -0
  33. package/dist/security-scan/incremental.js +289 -0
  34. package/dist/security-scan/trabalhador.js +53 -5
  35. package/dist/verify.js +12 -1
  36. package/eval/README.md +8 -8
  37. package/eval/fixtures/fx-codex-dry/caso.json +1 -1
  38. package/eval/fixtures/fx-happy/caso.json +1 -1
  39. package/eval/fixtures/fx-indice-reversao/caso.json +1 -1
  40. package/eval/fixtures/fx-listagem-abertas/caso.json +1 -1
  41. package/eval/fixtures/fx-omnicanal/caso.json +1 -1
  42. package/eval/fixtures/fx-pedido-colado/caso.json +1 -1
  43. package/eval/fixtures/fx-schema-drift/caso.json +1 -1
  44. package/package.json +1 -1
  45. 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 canário `node core/dist/index.js eval --so-canarios --canario fx-sensores-runtime`
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 caná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.
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.2",
5
+ "version": "0.6.4",
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.2",
3
+ "version": "0.6.4",
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 canary `node core/dist/index.js eval --so-canarios --canario fx-sensores-runtime`
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 canary 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.
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/Canary`, `Parcial`, `Geral` | Configuração por ambiente/coorte e verificação. |
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/Canary` (pilot/canary), `Parcial` (partial), `Geral` (general) | Configuration per environment/cohort and verification. |
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` canaries build a temporary git repository and do not touch the network. |
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
@@ -1,6 +1,7 @@
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_CONTAINERS_DA_LANE = exports.ENV_CPUS_DOCKER = exports.ENV_SINAL_DA_RESERVA = exports.ENV_CPUS_DA_LANE_APOS_RESERVA = exports.ENV_CPUS_DA_LANE_APOS_VARREDURA = exports.ENV_CPUS_DA_LANE = void 0;
4
+ exports.registrarContainerDaLane = registrarContainerDaLane;
4
5
  exports.cargaDoProcLoadavg = cargaDoProcLoadavg;
5
6
  exports.medirCpuDoGrupo = medirCpuDoGrupo;
6
7
  exports.planejarCpuDoGrupo = planejarCpuDoGrupo;
@@ -16,10 +17,25 @@ exports.paredeAgileSimulada = paredeAgileSimulada;
16
17
  const node_fs_1 = require("node:fs");
17
18
  const steal_1 = require("./steal");
18
19
  exports.ENV_CPUS_DA_LANE = 'ORK_CHECK_CPUS_DA_LANE';
20
+ exports.ENV_CPUS_DA_LANE_APOS_VARREDURA = 'ORK_CHECK_CPUS_DA_LANE_APOS_VARREDURA';
21
+ exports.ENV_CPUS_DA_LANE_APOS_RESERVA = 'ORK_CHECK_CPUS_DA_LANE_APOS_RESERVA';
22
+ exports.ENV_SINAL_DA_RESERVA = 'ORK_CHECK_RESERVA_DEVOLVIDA';
19
23
  exports.ENV_CPUS_DOCKER = 'ORK_CHECK_CPUS_DOCKER';
24
+ /** Registro privado da rodada: quem sobe um container na lane anota o nome para a sonda de CPU. */
25
+ exports.ENV_CONTAINERS_DA_LANE = 'ORK_CHECK_CONTAINERS_DA_LANE';
20
26
  exports.RESERVA_DO_GRUPO = 2;
21
27
  exports.LIMIAR_STEAL_DO_AGENDADOR_PCT = 10;
22
28
  exports.JANELA_DA_SONDA_MS = 250;
29
+ /** Registra o container antes do `docker run`; falha de evidencia nunca impede a ferramenta de rodar. */
30
+ function registrarContainerDaLane(nome, ambiente = process.env) {
31
+ const arquivo = ambiente[exports.ENV_CONTAINERS_DA_LANE];
32
+ if (!arquivo || !nome)
33
+ return;
34
+ try {
35
+ (0, node_fs_1.appendFileSync)(arquivo, JSON.stringify({ nome, em: new Date().toISOString() }) + '\n', { mode: 0o600 });
36
+ }
37
+ catch { /* a medicao fica incompleta e o agendador conserva a reserva */ }
38
+ }
23
39
  const cpusValidas = (cpus) => Math.max(1, Math.floor(Number.isFinite(cpus) ? cpus : 1));
24
40
  /** A carga de um minuto de `/proc/loadavg`; entrada invalida ou ausencia nao inventam saturacao. */
25
41
  function cargaDoProcLoadavg(conteudo) {
@@ -66,13 +82,23 @@ function planejarCpuDoGrupo(cpusInformadas, medicao) {
66
82
  const saturado = motivos.length > 0;
67
83
  const fatia = saturado ? classic : Math.min(exports.RESERVA_DO_GRUPO, cpus - 1);
68
84
  const ferramentas = Math.max(1, Math.floor(fatia));
85
+ const medida = medicao.cpusIntegracao;
86
+ const cpusIntegracao = saturado ? ferramentas : Math.max(1, Math.min(ferramentas, Number.isFinite(medida) && medida > 0 ? Math.ceil(medida) : ferramentas));
87
+ const medidaCompativel = medicao.fonteCpusIntegracao === 'medida' && medida !== null && medida !== undefined;
88
+ const integracaoEmParalelo = !saturado && medidaCompativel && cpus - fatia - cpusIntegracao >= 1;
69
89
  return {
70
90
  cpus,
71
91
  ordem: saturado ? 'classic' : 'paralela',
72
92
  saturado,
73
- motivo: motivos.join('; ') || `carga e steal abaixo dos limiares; ${fatia} CPU(s) reservadas ao grupo`,
74
- cpusHermetica: saturado ? classic : Math.max(1, cpus - fatia),
75
- cpusIntegracao: ferramentas,
93
+ motivo: motivos.join('; ') || `carga e steal abaixo dos limiares; ${fatia} CPU(s) reservadas a varredura; ` +
94
+ (integracaoEmParalelo ? `integracao medida cabe em paralelo com ${cpusIntegracao} CPU(s)` : 'integracao permanece encadeada'),
95
+ cpusHermetica: saturado ? classic : Math.max(1, cpus - fatia - (integracaoEmParalelo ? cpusIntegracao : 0)),
96
+ cpusHermeticaAposVarredura: saturado ? classic : Math.max(1, cpus - cpusIntegracao),
97
+ cpusHermeticaAposReserva: saturado ? classic : cpus,
98
+ cpusIntegracao,
99
+ fonteCpusIntegracao: saturado ? 'classic' : medidaCompativel
100
+ ? 'medida' : 'conservadora',
101
+ integracaoEmParalelo,
76
102
  cpusDaFatia: fatia,
77
103
  ferramentasDaVarredura: ferramentas,
78
104
  cpusPorContainer: Math.max(0.01, Math.floor((fatia / ferramentas) * 100) / 100),
@@ -88,5 +114,23 @@ function paredeAgileSimulada(plano, trabalho) {
88
114
  return trabalho.hermetica / plano.cpusHermetica + trabalho.varredura / plano.cpusDaFatia
89
115
  + trabalho.integracao / plano.cpusIntegracao;
90
116
  }
91
- return Math.max(trabalho.hermetica / plano.cpusHermetica, trabalho.varredura / plano.cpusDaFatia + trabalho.integracao / plano.cpusIntegracao);
117
+ const paredeVarredura = trabalho.varredura / plano.cpusDaFatia;
118
+ const paredeIntegracao = trabalho.integracao / plano.cpusIntegracao;
119
+ if (plano.integracaoEmParalelo) {
120
+ let instante = 0, restante = trabalho.hermetica, capacidade = plano.cpusHermetica;
121
+ for (const evento of [{ em: paredeVarredura, libera: plano.cpusDaFatia },
122
+ { em: paredeIntegracao, libera: plano.cpusIntegracao }].sort((a, b) => a.em - b.em)) {
123
+ restante = Math.max(0, restante - (evento.em - instante) * capacidade);
124
+ instante = evento.em;
125
+ capacidade += evento.libera;
126
+ }
127
+ return Math.max(paredeVarredura, paredeIntegracao, instante + restante / capacidade);
128
+ }
129
+ const feitoNaVarredura = Math.min(trabalho.hermetica, paredeVarredura * plano.cpusHermetica);
130
+ const restanteAposVarredura = trabalho.hermetica - feitoNaVarredura;
131
+ const feitoNaIntegracao = Math.min(restanteAposVarredura, paredeIntegracao * plano.cpusHermeticaAposVarredura);
132
+ const restanteFinal = restanteAposVarredura - feitoNaIntegracao;
133
+ const paredeDaHermetica = (feitoNaVarredura ? paredeVarredura : 0)
134
+ + (feitoNaIntegracao ? paredeIntegracao : 0) + restanteFinal / plano.cpusHermeticaAposReserva;
135
+ return Math.max(paredeDaHermetica, paredeVarredura + paredeIntegracao);
92
136
  }
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 canários, os hooks e o `core/dist`
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 canarios, os hooks e o core/dist do catalogo, e so roda o do proprio pacote. ` +
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 canario chama. No repositorio ele fica em `core/dist/`; no pacote npm o catalogo e
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.CANARIOS_HITL = void 0;
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.CANARIOS_HITL = [
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 canario nunca compartilha segredo.
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-canario-hermes-00000000',
81
- openclaw: 'chave-SIMULADA-do-canario-openclaw-000000' };
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-canario-openclaw';
84
- [chaves.hermes, chaves.openclaw, conta, '42', '-7', '/tmp/ork-hitl-canario', '999']
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
- * Canarios da I-43: cada remocao so e dada como pronta junto do canario que prova que
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 canario nao e simplificacao, e aposta. E a razao de este arquivo existir
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 canarios rodam em sandbox git propria (`sandboxGit`), nunca contra o board vivo:
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.CANARIOS_I43 = void 0;
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 canario grava uma thread em modo aposentado direto no disco da sandbox, como uma
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 canario cobra as tres coisas juntas: a recusa acontece, ela e TIPADA, e ela nomeia
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 canario roda em SANDBOX e nunca contra o board vivo, e isso nao e detalhe: M8 do
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 canario.
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 canario.
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 canario que libera a saida da fila de ratificacao de score, e ele prova a
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 canario ficava verde com
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 canario prova os TRES lados, porque so o positivo nao provaria nada:
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 canario prova as duas metades, porque criterio que so passa nao prova nada:
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 canario cobra os dois lados:
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-canario' };
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.CANARIOS_I43 = [
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.CANARIOS_PULSE = void 0;
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.CANARIOS_PULSE = [
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 = 'canario-SIMULADO-sem-credencial-real-000';
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 canario do incidente de 01/10/2026.
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 canario refaz a conducao inteira em sandbox SIMULADO e exige que o mesmo
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: 'canario-SIMULADO', evidencia: 'pedido colado',
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.CANARIO_SENSORES = void 0;
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"));
@@ -47,14 +47,14 @@ const estado_thread_1 = require("./estado-thread");
47
47
  const catalogo_1 = require("./catalogo");
48
48
  const linha = (e) => JSON.stringify(e) + '\n';
49
49
  function esperar(teste) {
50
- const limite = Date.now() + 5000;
50
+ const limite = Date.now() + 15000;
51
51
  while (!teste()) {
52
52
  if (Date.now() >= limite)
53
- throw new Error('subprocesso do canário não terminou em 5000 ms');
53
+ throw new Error('subprocesso do cenário não terminou no prazo de transporte');
54
54
  Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 10);
55
55
  }
56
56
  }
57
- exports.CANARIO_SENSORES = {
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');
@@ -71,11 +71,12 @@ exports.CANARIO_SENSORES = {
71
71
  const hook = path.join(catalogo, 'adapters/claude-code/hooks/ork-sensor.js');
72
72
  const cli = (0, catalogo_1.cliDoCatalogo)(catalogo);
73
73
  const start = Date.now();
74
- const h = (0, node_child_process_1.spawnSync)(process.execPath, [hook], { cwd: wt, encoding: 'utf8', timeout: 5000,
74
+ // O teto de transporte absorve a fila do Classic; a fixture continua exigindo a latência funcional abaixo de 5 s.
75
+ const h = (0, node_child_process_1.spawnSync)(process.execPath, [hook], { cwd: wt, encoding: 'utf8', timeout: 15000,
75
76
  input: JSON.stringify({ cwd: wt, session_id: 'fixture-claude', hook_event_name: 'PermissionRequest', tool_use_id: 'fixture-tool' }),
76
77
  env: { ...process.env, ORK_SENSOR_CLI: cli } });
77
78
  if (h.status !== 0 || h.stderr || h.stdout)
78
- throw new Error('hook/CLI do canário indisponível');
79
+ throw new Error('hook/CLI do cenário indisponível');
79
80
  const hookLatenciaMs = Date.now() - start;
80
81
  const bloqueio = (0, ledger_1.lerLedger)(dir).find(e => e.tipo === 'sessao_bloqueada');
81
82
  const carimboLatenciaMs = bloqueio ? Date.parse(String(bloqueio.recebidoEm)) - Date.parse(bloqueio.ts) : null;
@@ -98,9 +99,9 @@ exports.CANARIO_SENSORES = {
98
99
  }
99
100
  // A identidade vem de um processo realmente executado e encerrado, sem recibo.
100
101
  const runner = require.resolve('./adapters/codex-runner');
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
+ 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: 15000 });
102
103
  if (morto.status !== 0)
103
- throw new Error('processo de morte do canário indisponível');
104
+ throw new Error('processo de morte do cenário indisponível');
104
105
  const filho = JSON.parse(morto.stdout);
105
106
  if ((0, codex_runner_1.estadoProcesso)(filho) !== 'ausente')
106
107
  throw new Error('processo ainda não está ausente');
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  /**
3
- * Os 7 canarios de `ork eval` (6 do bloco B4 + fx-codex-dry da homologacao do codex).
3
+ * Os 7 cenarios de `ork eval` (6 do bloco B4 + fx-codex-dry da homologacao do codex).
4
4
  *
5
- * Canario nao e teste unitario: e um comportamento inteiro do produto, exercitado ponta a
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.CANARIOS = void 0;
55
- exports.canarioPorId = canarioPorId;
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 canarios_pulse_1 = require("./canarios-pulse");
71
- const canarios_sensores_1 = require("./canarios-sensores");
72
- const canarios_hitl_1 = require("./canarios-hitl");
73
- const canarios_i43_1 = require("./canarios-i43");
74
- const canarios_rm057_1 = require("./canarios-rm057");
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 canario: a policy bloqueante do nucleo, que reprova entregar em cima
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: canario nao gasta assinatura de ninguem.
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: 'Canário Maestro', modo: 'auto' }).thread;
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 canarios registrados, na ordem em que o `ork eval` os roda. */
363
- exports.CANARIOS = [
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
- ...canarios_pulse_1.CANARIOS_PULSE,
374
- canarios_sensores_1.CANARIO_SENSORES,
375
- ...canarios_hitl_1.CANARIOS_HITL,
376
- ...canarios_i43_1.CANARIOS_I43,
377
- canarios_rm057_1.fxPedidoColado,
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 canario por id, ou null quando a fixture aponta para um canario que nao existe. */
380
- function canarioPorId(id) {
381
- return exports.CANARIOS.find((c) => c.id === id) ?? null;
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
  }
@@ -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', 'ORK_CHECK_CPUS_DOCKER',
630
+ || ['ORK_CHECK_RELATORIO', 'ORK_CHECK_CPUS_DA_LANE', 'ORK_CHECK_CPUS_DA_LANE_APOS_VARREDURA',
631
+ 'ORK_CHECK_CPUS_DA_LANE_APOS_RESERVA', 'ORK_CHECK_RESERVA_DEVOLVIDA', 'ORK_CHECK_CONTAINERS_DA_LANE', '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));