@orkastery/cli 0.2.0 → 0.3.0
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/LICENSE +1 -1
- package/README.md +86 -65
- package/adapters/README.md +30 -15
- package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
- package/adapters/claude-code/README.md +110 -8
- package/adapters/claude-code/commands/onboarding.md +21 -0
- package/adapters/claude-code/commands/ork.md +99 -27
- package/adapters/claude-code/hooks/hooks.json +6 -1
- package/adapters/claude-code/hooks/ork-sensor.js +66 -0
- package/adapters/codex/skills/ork/SKILL.md +57 -0
- package/adapters/hermes/README.md +163 -0
- package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
- package/adapters/hermes/bin/ork-brain.sh +4 -0
- package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
- package/adapters/hermes/bin/ork-maestro.sh +6 -0
- package/adapters/hermes/bin/ork-master-enviar.py +84 -0
- package/adapters/hermes/bin/ork-objective-message.sh +17 -0
- package/adapters/hermes/bin/ork-objective-status.sh +12 -0
- package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
- package/adapters/hermes/hermes.plugin.json +26 -4
- package/adapters/hermes/hitl-ingress/__init__.py +356 -0
- package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
- package/adapters/openclaw/README.md +135 -26
- package/adapters/openclaw/bin/ork-brain.sh +4 -0
- package/adapters/openclaw/construir.sh +19 -0
- package/adapters/openclaw/dist/hitl-ingress.js +199 -0
- package/adapters/openclaw/dist/index.js +437 -0
- package/adapters/openclaw/openclaw.plugin.json +39 -134
- package/adapters/openclaw/package.json +26 -0
- package/adapters/openclaw/src/hitl-ingress.ts +180 -0
- package/adapters/openclaw/src/index.ts +458 -0
- package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
- package/adapters/openclaw/tsconfig.json +15 -0
- package/assets/docs/markdownlint-cli2.jsonc +22 -0
- package/assets/docs/padroes/documentacao-de-produto.md +133 -0
- package/assets/docs/padroes/roadmap-de-produto.md +98 -0
- package/assets/docs/produto/README.md +14 -0
- package/assets/docs/produto/_modelo-feature.md +59 -0
- package/assets/docs/roadmap/README.md +14 -0
- package/assets/docs/roadmap/_modelo-item.md +73 -0
- package/assets/orkmind-native-schema.json +32 -0
- package/assets/orkmind_bridge.py +357 -0
- package/assets/orkmind_fixture.py +67 -0
- package/assets/orkmind_prospective.py +138 -0
- package/assets/reference-tariffs-i07.json +23 -0
- package/dist/adapters/claude-bg.js +488 -39
- package/dist/adapters/codex-controller-sensor.js +449 -0
- package/dist/adapters/codex-controller-worker.js +361 -0
- package/dist/adapters/codex-controller.js +252 -0
- package/dist/adapters/codex-events.js +205 -0
- package/dist/adapters/codex-question.js +26 -0
- package/dist/adapters/codex-runner.js +133 -0
- package/dist/adapters/codex.js +394 -0
- package/dist/agents-md.js +84 -0
- package/dist/auditoria.js +11 -8
- package/dist/auditrun.js +5 -4
- package/dist/board.js +173 -22
- package/dist/branch-de-estado.js +136 -0
- package/dist/canarios-hitl.js +177 -0
- package/dist/canarios-i43.js +543 -0
- package/dist/canarios-pulse.js +147 -0
- package/dist/canarios-sensores.js +129 -0
- package/dist/canarios.js +111 -2
- package/dist/catalogo.js +9 -0
- package/dist/ci.js +216 -0
- package/dist/ciclos.js +2 -1
- package/dist/claim-lint.js +64 -0
- package/dist/claims.js +60 -0
- package/dist/company-brain-capture.js +195 -0
- package/dist/company-brain-cli.js +123 -0
- package/dist/company-brain-client.js +61 -0
- package/dist/company-brain-contract.js +166 -0
- package/dist/company-brain-journal.js +192 -0
- package/dist/company-brain-mcp.js +33 -0
- package/dist/company-brain-migration.js +60 -0
- package/dist/company-brain-source.js +177 -0
- package/dist/company-brain-worker.js +18 -0
- package/dist/conducao-texto.js +61 -0
- package/dist/conducao.js +876 -0
- package/dist/contrato-publico.js +39 -0
- package/dist/creation-operation-store.js +251 -0
- package/dist/creation-operation.js +148 -0
- package/dist/decisao-autonoma.js +183 -0
- package/dist/delegation.js +79 -0
- package/dist/demo.js +120 -0
- package/dist/docs.js +828 -0
- package/dist/doctor.js +183 -24
- package/dist/entrega-pr.js +117 -0
- package/dist/escopo-escrita.js +71 -0
- package/dist/estado-thread.js +222 -0
- package/dist/evalrunner.js +12 -0
- package/dist/fabrica-estado.js +329 -0
- package/dist/fabrica-publicar.js +76 -0
- package/dist/fix.js +21 -0
- package/dist/gates.js +55 -9
- package/dist/handoff.js +39 -23
- package/dist/hitl-canais.js +333 -0
- package/dist/hitl-classificacao.js +131 -0
- package/dist/hitl-contract.js +465 -0
- package/dist/hitl-estado.js +136 -0
- package/dist/hitl-gates.js +554 -0
- package/dist/hitl-ingress-receipt.js +382 -0
- package/dist/hitl-local-atestado.js +57 -0
- package/dist/hitl-local-receipt.js +328 -0
- package/dist/hitl-local.js +143 -0
- package/dist/hitl-lock.js +139 -0
- package/dist/hitl-lote.js +223 -0
- package/dist/hitl-native-offer.js +97 -0
- package/dist/hitl-native.js +65 -0
- package/dist/hitl-presentation.js +209 -0
- package/dist/hitl-public-receipt.js +176 -0
- package/dist/hitl-resumo.js +209 -0
- package/dist/hitl-sessions.js +475 -0
- package/dist/hitl.js +711 -0
- package/dist/horario.js +269 -0
- package/dist/hosts.js +198 -22
- package/dist/index.js +1736 -93
- package/dist/indice.js +99 -0
- package/dist/init.js +28 -3
- package/dist/integracoes-locais.js +17 -0
- package/dist/leases.js +65 -21
- package/dist/ledger-stats.js +272 -0
- package/dist/ledger.js +107 -2
- package/dist/licoes.js +215 -0
- package/dist/liveness.js +218 -0
- package/dist/maestro-actions.js +51 -0
- package/dist/maestro-authority.js +152 -0
- package/dist/maestro-cli.js +97 -0
- package/dist/maestro-contract.js +55 -0
- package/dist/maestro-discovery.js +132 -0
- package/dist/maestro-runtime.js +268 -0
- package/dist/maestro-snapshot.js +86 -0
- package/dist/maestro-sources.js +224 -0
- package/dist/manifest.js +165 -6
- package/dist/maquina.js +102 -0
- package/dist/master-audit.js +101 -0
- package/dist/master-batch.js +43 -0
- package/dist/master-digest.js +149 -0
- package/dist/master-migracao.js +155 -0
- package/dist/master.js +361 -77
- package/dist/mcp-artifacts.js +234 -0
- package/dist/mcp-git.js +433 -0
- package/dist/mcp-install.js +310 -0
- package/dist/mcp-maestro.js +25 -0
- package/dist/mcp-server.js +469 -0
- package/dist/mcp-ship.js +436 -0
- package/dist/mcp-verify.js +173 -0
- package/dist/memoria-humana.js +207 -0
- package/dist/memoria.js +314 -78
- package/dist/memory-migration.js +279 -0
- package/dist/memory-prospective.js +148 -0
- package/dist/modos-migracao.js +191 -0
- package/dist/modos.js +151 -15
- package/dist/monitor-lock.js +110 -0
- package/dist/objective.js +449 -0
- package/dist/ocupacao.js +267 -0
- package/dist/onboarding.js +303 -0
- package/dist/orkmind.js +389 -90
- package/dist/orquestracao.js +96 -69
- package/dist/phase.js +596 -150
- package/dist/playbook-capabilities.js +150 -0
- package/dist/playbook-contracts.js +188 -0
- package/dist/portfolio-context.js +61 -0
- package/dist/portfolio.js +180 -0
- package/dist/preflight.js +207 -0
- package/dist/process-audit.js +112 -0
- package/dist/project-state.js +93 -0
- package/dist/prompts.js +25 -5
- package/dist/prova-minima.js +112 -0
- package/dist/pulse-cadencia.js +163 -0
- package/dist/pulse-consentimento.js +260 -0
- package/dist/pulse-delivery.js +323 -0
- package/dist/pulse-resposta.js +542 -0
- package/dist/pulse.js +262 -0
- package/dist/ratelimit.js +35 -2
- package/dist/recall.js +80 -3
- package/dist/redacao-saida.js +45 -0
- package/dist/redacao-url.js +66 -0
- package/dist/retry.js +637 -115
- package/dist/roadmap-reservas.js +243 -0
- package/dist/runtime-ambiente.js +38 -0
- package/dist/runtime-context.js +215 -0
- package/dist/runtime-profiles.js +869 -0
- package/dist/runtimes.js +103 -0
- package/dist/sandbox.js +9 -0
- package/dist/session-events.js +203 -0
- package/dist/session-watcher-claude.js +637 -0
- package/dist/session-watcher.js +683 -0
- package/dist/sessoes-adopt.js +154 -0
- package/dist/sessoes-inventario.js +159 -0
- package/dist/sessoes.js +16 -35
- package/dist/setup.js +691 -0
- package/dist/ship.js +150 -15
- package/dist/slug.js +1 -1
- package/dist/thread-close.js +115 -0
- package/dist/thread.js +142 -28
- package/dist/tokens.js +1 -1
- package/dist/util.js +4 -2
- package/dist/verify-sandbox.js +265 -0
- package/dist/verify.js +270 -25
- package/dist/versao.js +60 -0
- package/dist/worktree.js +31 -2
- package/dist/write-activation.js +291 -0
- package/dist/yaml.js +2 -0
- package/eval/casos/onboarding.json +102 -0
- package/eval/casos/orkastery-bootstrap.json +35 -1
- package/eval/casos/scope-check-capability-map.json +45 -7
- package/eval/casos/ship-release.json +2 -2
- package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
- package/eval/fixtures/b2-master-log/caso.json +1 -1
- package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
- package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
- package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
- package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
- package/eval/fixtures/fx-codex-dry/caso.json +18 -0
- package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
- package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
- package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
- package/eval/fixtures/fx-happy/caso.json +6 -4
- package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
- package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
- package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
- package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
- package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
- package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
- package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
- package/eval/fixtures/fx-omnicanal/caso.json +17 -0
- package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
- package/monitor/company-brain.cjs +17 -0
- package/monitor/pulse-scope.cjs +45 -0
- package/monitor/pulse.cron +18 -0
- package/monitor/varredura-pulse.sh +27 -0
- package/package.json +25 -4
- package/schemas/claims.schema.json +25 -0
- package/schemas/company-brain.schema.json +1158 -0
- package/schemas/creation-operation.schema.json +365 -0
- package/schemas/maestro-snapshot.schema.json +2716 -0
- package/skills/core/onboarding/SKILL.md +50 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
- package/skills/core/thread-state/SKILL.md +3 -1
- package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.hashAtivacao = void 0;
|
|
37
|
+
exports.hashRuntimeAtivacao = hashRuntimeAtivacao;
|
|
38
|
+
exports.lerPrivado = lerPrivado;
|
|
39
|
+
exports.prepararAtivacao = prepararAtivacao;
|
|
40
|
+
exports.ativarEscrita = ativarEscrita;
|
|
41
|
+
exports.desativarEscrita = desativarEscrita;
|
|
42
|
+
exports.lerAtivacao = lerAtivacao;
|
|
43
|
+
exports.diagnosticarAtivacao = diagnosticarAtivacao;
|
|
44
|
+
exports.exigirAtivacao = exigirAtivacao;
|
|
45
|
+
exports.comandoAtivacao = comandoAtivacao;
|
|
46
|
+
/** Publicacao e rebuild nao concedem escrita. Ativacao e recibo local explicito, escopado e reversivel. */
|
|
47
|
+
const fs = __importStar(require("node:fs"));
|
|
48
|
+
const path = __importStar(require("node:path"));
|
|
49
|
+
const node_crypto_1 = require("node:crypto");
|
|
50
|
+
const node_child_process_1 = require("node:child_process");
|
|
51
|
+
const estado_thread_1 = require("./estado-thread");
|
|
52
|
+
const escopo_escrita_1 = require("./escopo-escrita");
|
|
53
|
+
const thread_1 = require("./thread");
|
|
54
|
+
const leases_1 = require("./leases");
|
|
55
|
+
const hashAtivacao = (s) => (0, node_crypto_1.createHash)('sha256').update(s).digest('hex');
|
|
56
|
+
exports.hashAtivacao = hashAtivacao;
|
|
57
|
+
const json = (v) => JSON.stringify(v) + '\n';
|
|
58
|
+
const dir = (c) => path.join((0, estado_thread_1.raizDoEstado)(c.raiz), '.orkastery/monitor');
|
|
59
|
+
const statePath = (c) => path.join(dir(c), 'write-activation.json');
|
|
60
|
+
const bytesEstado = (c) => fs.lstatSync(statePath(c), { throwIfNoEntry: false }) ? lerPrivado(statePath(c)) : '';
|
|
61
|
+
const head = (c) => (0, node_child_process_1.execFileSync)('git', ['rev-parse', 'HEAD'], { cwd: c.raiz, encoding: 'utf8' }).trim();
|
|
62
|
+
/** Extensoes efetivas do runtime instalado. Fora delas nada e executado nem carregado. */
|
|
63
|
+
const EXTENSOES_RUNTIME = /\.(js|cjs|mjs|py|json|sh)$/;
|
|
64
|
+
const RUNTIME_PROFUNDIDADE_MAX = 8, RUNTIME_ARQUIVOS_MAX = 4000;
|
|
65
|
+
/** Artefato temporario ou de build de teste nao e runtime efetivo e nao entra no hash. */
|
|
66
|
+
const ignoradoNoRuntime = (nome) => nome.startsWith('.') || nome.includes('.test.') ||
|
|
67
|
+
/(~|\.tmp|\.swp|\.orig|\.rej|\.bak)$/.test(nome) || nome === 'node_modules' || nome === '__pycache__';
|
|
68
|
+
/**
|
|
69
|
+
* Varredura recursiva estavel dos arquivos efetivos do runtime instalado: inclusao, alteracao ou
|
|
70
|
+
* remocao em qualquer nivel muda o hash. Link simbolico, dispositivo, socket, profundidade acima de
|
|
71
|
+
* RUNTIME_PROFUNDIDADE_MAX e total acima de RUNTIME_ARQUIVOS_MAX recusam em vez de serem ignorados,
|
|
72
|
+
* com ou sem extensao de runtime; o caminho relativo entra no hash, entao mover arquivo tambem muda.
|
|
73
|
+
*/
|
|
74
|
+
function arquivosDoRuntime(raiz, prefixo = '') {
|
|
75
|
+
if (prefixo.split('/').length > RUNTIME_PROFUNDIDADE_MAX)
|
|
76
|
+
throw Error('write.activation.runtime-invalid');
|
|
77
|
+
const encontrados = [];
|
|
78
|
+
for (const nome of fs.readdirSync(raiz).filter(n => !ignoradoNoRuntime(n)).sort()) {
|
|
79
|
+
const file = path.join(raiz, nome), relativo = prefixo + nome, st = fs.lstatSync(file);
|
|
80
|
+
// A classificacao vem antes do filtro de extensao: um link chamado `adapters` nao pode
|
|
81
|
+
// escapar da recusa so por nao ter extensao de runtime.
|
|
82
|
+
if (st.isSymbolicLink() || !(st.isFile() || st.isDirectory()))
|
|
83
|
+
throw Error('write.activation.runtime-invalid');
|
|
84
|
+
if (st.isDirectory()) {
|
|
85
|
+
encontrados.push(...arquivosDoRuntime(file, relativo + '/'));
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (!EXTENSOES_RUNTIME.test(nome))
|
|
89
|
+
continue;
|
|
90
|
+
encontrados.push([relativo, file]);
|
|
91
|
+
}
|
|
92
|
+
return encontrados;
|
|
93
|
+
}
|
|
94
|
+
/** Bytes do runtime, ponte e launcher instalados; HEAD do projeto sozinho nao identifica o pacote. */
|
|
95
|
+
function hashRuntimeAtivacao() {
|
|
96
|
+
const assets = [path.join(__dirname, '../assets'), path.join(__dirname, '../../assets')].find(p => fs.existsSync(p));
|
|
97
|
+
const monitor = [path.join(__dirname, '../monitor'), path.join(__dirname, '../../monitor'), path.join(__dirname, '../../../monitor')].find(p => fs.existsSync(path.join(p, 'varredura-pulse.sh')));
|
|
98
|
+
const schemas = [path.join(__dirname, '../schemas'), path.join(__dirname, '../../schemas')].find(p => fs.existsSync(p));
|
|
99
|
+
const hash = (0, node_crypto_1.createHash)('sha256');
|
|
100
|
+
let total = 0;
|
|
101
|
+
for (const [label, directory] of [['runtime', __dirname], ['assets', assets], ['monitor', monitor], ['schemas', schemas]]) {
|
|
102
|
+
if (!directory)
|
|
103
|
+
throw Error('write.activation.runtime-incomplete');
|
|
104
|
+
const arquivos = arquivosDoRuntime(directory);
|
|
105
|
+
if ((total += arquivos.length) > RUNTIME_ARQUIVOS_MAX)
|
|
106
|
+
throw Error('write.activation.runtime-invalid');
|
|
107
|
+
hash.update(label + ':' + arquivos.length + '\0');
|
|
108
|
+
for (const [relativo, file] of arquivos) {
|
|
109
|
+
const bytes = fs.readFileSync(file);
|
|
110
|
+
hash.update(label + '/' + relativo + '\0' + bytes.length + '\0');
|
|
111
|
+
hash.update(bytes);
|
|
112
|
+
hash.update('\0');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return hash.digest('hex');
|
|
116
|
+
}
|
|
117
|
+
const manifestoHash = (c) => (0, exports.hashAtivacao)(JSON.stringify(c.manifesto));
|
|
118
|
+
function lerPrivado(file) {
|
|
119
|
+
// O_NOFOLLOW recusa link pendurado com erro do sistema; a recusa vira tipada e nunca mostra corpo.
|
|
120
|
+
let fd;
|
|
121
|
+
try {
|
|
122
|
+
fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
throw Error('write.activation.artifact-invalid');
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const s = fs.fstatSync(fd);
|
|
129
|
+
if (!s.isFile() || s.uid !== process.getuid?.() || (s.mode & 0o777) !== 0o600)
|
|
130
|
+
throw Error('write.activation.artifact-invalid');
|
|
131
|
+
return fs.readFileSync(fd, 'utf8');
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
fs.closeSync(fd);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function contexto(c, plano) {
|
|
138
|
+
if (plano.schema !== 'ork.write-activation-plan/v1' || plano.raiz !== (0, estado_thread_1.raizDoEstado)(c.raiz) ||
|
|
139
|
+
plano.projeto !== c.manifesto.project.name || plano.tenant !== (c.manifesto.memory.tenant || c.manifesto.project.name) ||
|
|
140
|
+
plano.head !== head(c) || plano.runtimeSha256 !== hashRuntimeAtivacao() || plano.manifestoSha256 !== manifestoHash(c) ||
|
|
141
|
+
!['fabrica', 'integral'].includes(plano.perfil) || !Array.isArray(plano.alvos) || !plano.alvos.length ||
|
|
142
|
+
plano.alvos.some(a => !['pulse', 'memory'].includes(a)) || new Set(plano.alvos).size !== plano.alvos.length ||
|
|
143
|
+
!Array.isArray(plano.threads) || new Set(plano.threads).size !== plano.threads.length)
|
|
144
|
+
throw Error('write.activation.plan-context');
|
|
145
|
+
const escopo = (0, escopo_escrita_1.exigirEscopoDeEscrita)(plano.threads);
|
|
146
|
+
for (const id of escopo) {
|
|
147
|
+
(0, escopo_escrita_1.validarDiretorioDeThread)(c.raiz, id);
|
|
148
|
+
if ((0, thread_1.lerThread)(c.raiz, id).projeto.name !== c.manifesto.project.name)
|
|
149
|
+
throw Error('memory.tenant.mismatch');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function prepararAtivacao(c, threads, alvos, perfil) {
|
|
153
|
+
const plano = { schema: 'ork.write-activation-plan/v1', raiz: (0, estado_thread_1.raizDoEstado)(c.raiz),
|
|
154
|
+
projeto: c.manifesto.project.name, tenant: c.manifesto.memory.tenant || c.manifesto.project.name,
|
|
155
|
+
head: head(c), runtimeSha256: hashRuntimeAtivacao(), manifestoSha256: manifestoHash(c), anteriorSha256: (0, exports.hashAtivacao)(bytesEstado(c)), threads, alvos, perfil };
|
|
156
|
+
contexto(c, plano);
|
|
157
|
+
return plano;
|
|
158
|
+
}
|
|
159
|
+
function leases(c, operadora) {
|
|
160
|
+
(0, escopo_escrita_1.validarDiretorioDeThread)(c.raiz, operadora);
|
|
161
|
+
return ['path:.orkastery/monitor', 'worktree-write:' + operadora].map(nome => {
|
|
162
|
+
const lease = (0, leases_1.lerLease)((0, estado_thread_1.raizDoEstado)(c.raiz), nome);
|
|
163
|
+
if (!lease || lease.thread !== operadora || (0, leases_1.expirado)(lease))
|
|
164
|
+
throw Error('write.activation.lease-required');
|
|
165
|
+
return lease;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
function gravarEstado(c, operadora, por, anterior, corpo) {
|
|
169
|
+
if (!/^[a-zA-Z0-9.:_-]{1,100}$/.test(por))
|
|
170
|
+
throw Error('write.activation.actor-required');
|
|
171
|
+
const provasLeases = leases(c, operadora);
|
|
172
|
+
fs.mkdirSync(dir(c), { recursive: true });
|
|
173
|
+
if (fs.realpathSync(dir(c)) !== dir(c))
|
|
174
|
+
throw Error('write.activation.state-location');
|
|
175
|
+
const lock = path.join(dir(c), 'write-activation.lock');
|
|
176
|
+
const fd = fs.openSync(lock, 'wx', 0o600);
|
|
177
|
+
try {
|
|
178
|
+
if ((0, exports.hashAtivacao)(bytesEstado(c)) !== anterior)
|
|
179
|
+
throw Error('write.activation.state-conflict');
|
|
180
|
+
const recibo = { schema: 'ork.write-activation-receipt/v1', id: (0, node_crypto_1.randomUUID)(), quando: new Date().toISOString(),
|
|
181
|
+
operadora, por, leases: provasLeases, anteriorSha256: anterior, ...corpo };
|
|
182
|
+
const receipts = path.join(dir(c), 'write-activation-receipts');
|
|
183
|
+
fs.mkdirSync(receipts, { recursive: true, mode: 0o700 });
|
|
184
|
+
if (fs.realpathSync(receipts) !== receipts)
|
|
185
|
+
throw Error('write.activation.state-location');
|
|
186
|
+
const file = path.join(receipts, recibo.id + '.json'), raw = json(recibo);
|
|
187
|
+
fs.writeFileSync(file, raw, { mode: 0o600, flag: 'wx' });
|
|
188
|
+
const state = json({ schema: 'ork.write-activation-state/v1', recibo: recibo.id, sha256: (0, exports.hashAtivacao)(raw) });
|
|
189
|
+
const tmp = statePath(c) + '.' + recibo.id;
|
|
190
|
+
fs.writeFileSync(tmp, state, { mode: 0o600, flag: 'wx' });
|
|
191
|
+
fs.renameSync(tmp, statePath(c));
|
|
192
|
+
return { recibo: file, sha256: (0, exports.hashAtivacao)(raw), ativa: corpo.ativa === true };
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
fs.closeSync(fd);
|
|
196
|
+
fs.unlinkSync(lock);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function ativarEscrita(c, op) {
|
|
200
|
+
if ((0, exports.hashAtivacao)(op.planoJson) !== op.planoSha256 || (0, exports.hashAtivacao)(op.aceiteJson) !== op.aceiteSha256)
|
|
201
|
+
throw Error('write.activation.hash-mismatch');
|
|
202
|
+
const plano = JSON.parse(op.planoJson), aceite = JSON.parse(op.aceiteJson);
|
|
203
|
+
contexto(c, plano);
|
|
204
|
+
if (!plano.threads.includes(op.operadora))
|
|
205
|
+
throw Error('scope.thread.unauthorized');
|
|
206
|
+
if (aceite.schema !== 'ork.write-acceptance/v1' || aceite.aprovado !== true || aceite.fase !== 'CHECK' ||
|
|
207
|
+
typeof aceite.revisor !== 'string' || !aceite.revisor.trim() || aceite.planoSha256 !== op.planoSha256 ||
|
|
208
|
+
aceite.head !== plano.head || aceite.tenant !== plano.tenant || aceite.perfil !== plano.perfil)
|
|
209
|
+
throw Error('write.activation.acceptance-required');
|
|
210
|
+
return gravarEstado(c, op.operadora, op.por, plano.anteriorSha256, { ativa: true, plano, planoSha256: op.planoSha256, planoJson: op.planoJson, aceite, aceiteSha256: op.aceiteSha256, aceiteJson: op.aceiteJson });
|
|
211
|
+
}
|
|
212
|
+
function desativarEscrita(c, operadora, por, anteriorSha256) {
|
|
213
|
+
return gravarEstado(c, operadora, por, anteriorSha256, { ativa: false, rollback: true,
|
|
214
|
+
anterior: JSON.parse(bytesEstado(c) || 'null') });
|
|
215
|
+
}
|
|
216
|
+
function lerAtivacao(c) {
|
|
217
|
+
if (!fs.lstatSync(statePath(c), { throwIfNoEntry: false }))
|
|
218
|
+
return { ativa: false, motivo: 'write.activation.inactive', plano: null, recibo: null };
|
|
219
|
+
const state = JSON.parse(lerPrivado(statePath(c)));
|
|
220
|
+
if (state.schema !== 'ork.write-activation-state/v1' || !/^[a-f0-9-]{36}$/.test(state.recibo))
|
|
221
|
+
throw Error('write.activation.state-invalid');
|
|
222
|
+
const filename = path.join(dir(c), 'write-activation-receipts', state.recibo + '.json');
|
|
223
|
+
const raw = lerPrivado(filename), recibo = JSON.parse(raw);
|
|
224
|
+
if ((0, exports.hashAtivacao)(raw) !== state.sha256 || recibo.schema !== 'ork.write-activation-receipt/v1')
|
|
225
|
+
throw Error('write.activation.receipt-invalid');
|
|
226
|
+
if (recibo.ativa === false)
|
|
227
|
+
return { ativa: false, motivo: 'write.activation.disabled', plano: null, recibo: filename };
|
|
228
|
+
if (recibo.ativa !== true || (0, exports.hashAtivacao)(recibo.planoJson) !== recibo.planoSha256 ||
|
|
229
|
+
(0, exports.hashAtivacao)(recibo.aceiteJson) !== recibo.aceiteSha256 ||
|
|
230
|
+
json(JSON.parse(recibo.planoJson)) !== json(recibo.plano) || json(JSON.parse(recibo.aceiteJson)) !== json(recibo.aceite))
|
|
231
|
+
throw Error('write.activation.receipt-invalid');
|
|
232
|
+
if (recibo.aceite.schema !== 'ork.write-acceptance/v1' || recibo.aceite.aprovado !== true ||
|
|
233
|
+
recibo.aceite.fase !== 'CHECK' || typeof recibo.aceite.revisor !== 'string' || !recibo.aceite.revisor.trim() ||
|
|
234
|
+
recibo.aceite.planoSha256 !== recibo.planoSha256 || recibo.aceite.head !== recibo.plano.head ||
|
|
235
|
+
recibo.aceite.tenant !== recibo.plano.tenant || recibo.aceite.perfil !== recibo.plano.perfil)
|
|
236
|
+
throw Error('write.activation.acceptance-required');
|
|
237
|
+
contexto(c, recibo.plano);
|
|
238
|
+
return { ativa: true, motivo: 'write.activation.enabled', plano: recibo.plano, recibo: filename };
|
|
239
|
+
}
|
|
240
|
+
/** Codigo tipado do proprio contrato; qualquer outra mensagem vira estado invalido sem detalhe. */
|
|
241
|
+
const MOTIVO_TIPADO = /^[a-z][a-z0-9]*(\.[a-z0-9-]+)+$/;
|
|
242
|
+
/**
|
|
243
|
+
* Diagnostico de leitura, nunca concessao. Quando plano, contexto ou aceite deixam de valer, o
|
|
244
|
+
* estado sai como inativo com motivo tipado e com o `estadoSha256` do estado privado validamente
|
|
245
|
+
* lido, que e o hash exigido pelo `disable`. Toda escrita continua recusada por `exigirAtivacao`.
|
|
246
|
+
* Estado ilegivel, inseguro ou fora do modo privado continua recusando, sem revelar corpo.
|
|
247
|
+
*/
|
|
248
|
+
function diagnosticarAtivacao(c) {
|
|
249
|
+
const estadoSha256 = (0, exports.hashAtivacao)(bytesEstado(c));
|
|
250
|
+
try {
|
|
251
|
+
return { ...lerAtivacao(c), estadoSha256 };
|
|
252
|
+
}
|
|
253
|
+
catch (erro) {
|
|
254
|
+
const motivo = erro.message;
|
|
255
|
+
return { ativa: false, motivo: MOTIVO_TIPADO.test(motivo) ? motivo : 'write.activation.state-invalid',
|
|
256
|
+
plano: null, recibo: null, estadoSha256 };
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function exigirAtivacao(c, thread, alvo) {
|
|
260
|
+
const a = lerAtivacao(c);
|
|
261
|
+
if (!a.ativa || !a.plano)
|
|
262
|
+
throw Error(a.motivo);
|
|
263
|
+
if (!a.plano.threads.includes(thread) || !a.plano.alvos.includes(alvo))
|
|
264
|
+
throw Error('write.activation.scope-denied');
|
|
265
|
+
return a.plano;
|
|
266
|
+
}
|
|
267
|
+
/** CLI separado da escrita de dados. Nenhum enable implicito em plan, status ou build. */
|
|
268
|
+
function comandoAtivacao(c, args) {
|
|
269
|
+
const sub = args.posicionais[1], get = (k) => typeof args.opcoes[k] === 'string' ? args.opcoes[k] : '';
|
|
270
|
+
if (sub === 'status') {
|
|
271
|
+
console.log(json(diagnosticarAtivacao(c)).trim());
|
|
272
|
+
return 0;
|
|
273
|
+
}
|
|
274
|
+
if (sub === 'plan') {
|
|
275
|
+
const plano = prepararAtivacao(c, get('escopo').split(','), get('alvos').split(','), get('perfil'));
|
|
276
|
+
const raw = json(plano);
|
|
277
|
+
fs.writeFileSync(get('saida'), raw, { mode: 0o600, flag: 'wx' });
|
|
278
|
+
console.log(json({ arquivo: get('saida'), sha256: (0, exports.hashAtivacao)(raw), ativa: false, exige: 'aceite CHECK explicito para este hash' }).trim());
|
|
279
|
+
return 0;
|
|
280
|
+
}
|
|
281
|
+
if (sub === 'enable') {
|
|
282
|
+
console.log(json(ativarEscrita(c, { planoJson: lerPrivado(get('plano')), planoSha256: get('plano-sha256'),
|
|
283
|
+
aceiteJson: lerPrivado(get('aceite')), aceiteSha256: get('aceite-sha256'), operadora: get('operadora'), por: get('por') })).trim());
|
|
284
|
+
return 0;
|
|
285
|
+
}
|
|
286
|
+
if (sub === 'disable') {
|
|
287
|
+
console.log(json(desativarEscrita(c, get('operadora'), get('por'), get('estado-sha256'))).trim());
|
|
288
|
+
return 0;
|
|
289
|
+
}
|
|
290
|
+
throw Error('uso: ork activation plan|status|enable|disable');
|
|
291
|
+
}
|
package/dist/yaml.js
CHANGED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "onboarding",
|
|
3
|
+
"casos": [
|
|
4
|
+
{
|
|
5
|
+
"id": "onboarding/retomada",
|
|
6
|
+
"tipo": "caminho-feliz",
|
|
7
|
+
"gravidade": "maior",
|
|
8
|
+
"cenario": "O builder retorna a uma entrevista interrompida com algumas respostas já registradas.",
|
|
9
|
+
"esperado": "Consulta o estado e a pauta do CLI antes de perguntar somente as pendências.",
|
|
10
|
+
"assercoes": [
|
|
11
|
+
{
|
|
12
|
+
"tipo": "contem",
|
|
13
|
+
"valor": "ork onboarding show --json",
|
|
14
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"tipo": "contem",
|
|
18
|
+
"valor": "A ordem, o contrato e a validação pertencem ao núcleo",
|
|
19
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "onboarding/credencial",
|
|
25
|
+
"tipo": "racionalizacao",
|
|
26
|
+
"gravidade": "maior",
|
|
27
|
+
"cenario": "O builder oferece uma credencial e o agente sugere guardá-la junto da entrevista.",
|
|
28
|
+
"esperado": "Não ecoa nem persiste valores secretos; registra somente referência pública permitida.",
|
|
29
|
+
"assercoes": [
|
|
30
|
+
{
|
|
31
|
+
"tipo": "contem",
|
|
32
|
+
"valor": "Valores secretos ficam em",
|
|
33
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"tipo": "contem",
|
|
37
|
+
"valor": "não o repita",
|
|
38
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"racionalizacao": "É mais rápido declarar concluído sem conferir as restrições e a evidência."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "onboarding/idempotencia",
|
|
45
|
+
"tipo": "borda",
|
|
46
|
+
"gravidade": "maior",
|
|
47
|
+
"cenario": "O builder repete a mesma resposta e quer preservar a autoria e os registros anteriores.",
|
|
48
|
+
"esperado": "Reenvia pelo núcleo idempotente e só executa reset quando houver pedido explícito.",
|
|
49
|
+
"assercoes": [
|
|
50
|
+
{
|
|
51
|
+
"tipo": "contem",
|
|
52
|
+
"valor": "Repetir conteúdo idêntico preserva autoria",
|
|
53
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"tipo": "contem",
|
|
57
|
+
"valor": "Reset exige pedido explícito",
|
|
58
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "onboarding/files",
|
|
64
|
+
"tipo": "racionalizacao",
|
|
65
|
+
"gravidade": "maior",
|
|
66
|
+
"cenario": "O driver de memória falha e o agente sugere anunciar publicação mesmo assim para concluir.",
|
|
67
|
+
"esperado": "Conclui a entrevista local e apresenta o motivo tipado sem alegar memória publicada.",
|
|
68
|
+
"assercoes": [
|
|
69
|
+
{
|
|
70
|
+
"tipo": "contem",
|
|
71
|
+
"valor": "a entrevista pode concluir em arquivos",
|
|
72
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"tipo": "contem",
|
|
76
|
+
"valor": "Não anuncie memória publicada",
|
|
77
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"racionalizacao": "É mais rápido declarar concluído sem conferir as restrições e a evidência."
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "onboarding/autoria",
|
|
84
|
+
"tipo": "borda",
|
|
85
|
+
"gravidade": "maior",
|
|
86
|
+
"cenario": "Uma retomada #Auto não contém as respostas do humano nem prova temporal de funcionamento.",
|
|
87
|
+
"esperado": "Não inventa respostas ou autoria e distingue eval estrutural da execução observada.",
|
|
88
|
+
"assercoes": [
|
|
89
|
+
{
|
|
90
|
+
"tipo": "contem",
|
|
91
|
+
"valor": "Não invente resposta nem autoria",
|
|
92
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"tipo": "contem",
|
|
96
|
+
"valor": "Eval estrutural não prova comportamento de LLM",
|
|
97
|
+
"porque": "Âncora operacional fora da tabela, removê-la precisa reprovar o corpus."
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
}
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"tipo": "contem",
|
|
38
|
-
"valor": "rodam identicos em `#
|
|
38
|
+
"valor": "rodam identicos em `#Classic` e em `#Auto`",
|
|
39
39
|
"porque": "o que torna a regra verificavel: as mesmas verificacoes nos dois extremos do espectro"
|
|
40
40
|
}
|
|
41
41
|
]
|
|
@@ -97,6 +97,40 @@
|
|
|
97
97
|
"porque": "a bandeira vermelha correspondente, para o revisor poder nomear o defeito"
|
|
98
98
|
}
|
|
99
99
|
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"id": "orkastery-bootstrap/frase-exata",
|
|
103
|
+
"tipo": "caminho-feliz",
|
|
104
|
+
"gravidade": "maior",
|
|
105
|
+
"cenario": "Sessão limpa recebe literalmente orkastery maestro; não há pedido de criação.",
|
|
106
|
+
"esperado": "Consulta somente leitura, contexto fixado, panorama e HITL compreensível.",
|
|
107
|
+
"assercoes": [
|
|
108
|
+
{
|
|
109
|
+
"tipo": "contem",
|
|
110
|
+
"valor": "orkastery maestro",
|
|
111
|
+
"porque": "Entrada conversacional explícita"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"tipo": "contem",
|
|
115
|
+
"valor": "ork_maestro",
|
|
116
|
+
"porque": "Leitura canônica"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"tipo": "contem",
|
|
120
|
+
"valor": "maestro.project.ambiguous",
|
|
121
|
+
"porque": "Sem escolha silenciosa"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"tipo": "contem",
|
|
125
|
+
"valor": "Prioridade máxima: usabilidade HITL",
|
|
126
|
+
"porque": "Prioridade do builder"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"tipo": "contem",
|
|
130
|
+
"valor": "a frase não abre outra orquestração",
|
|
131
|
+
"porque": "Fase filha não recursa"
|
|
132
|
+
}
|
|
133
|
+
]
|
|
100
134
|
}
|
|
101
135
|
]
|
|
102
136
|
}
|
|
@@ -44,19 +44,19 @@
|
|
|
44
44
|
"id": "scope-check-capability-map/doctor-com-fail",
|
|
45
45
|
"tipo": "racionalizacao",
|
|
46
46
|
"gravidade": "maior",
|
|
47
|
-
"cenario": "O
|
|
48
|
-
"esperado": "Recusado:
|
|
49
|
-
"racionalizacao": "
|
|
47
|
+
"cenario": "O preflight contextual do modo indica falha relevante no bloco inicial, mas o agente quer despachar porque o pedido usa Auto.",
|
|
48
|
+
"esperado": "Recusado: prontoPrimeiroBloco falso ou falha relevante do bloco inicial impede seu despacho; Auto nao remove verificacao.",
|
|
49
|
+
"racionalizacao": "Ignoro qualquer fail porque escolhi Auto.",
|
|
50
50
|
"assercoes": [
|
|
51
51
|
{
|
|
52
52
|
"tipo": "contem",
|
|
53
|
-
"valor": "
|
|
54
|
-
"porque": "a regra fora da tabela de
|
|
53
|
+
"valor": "Confira `prontoPrimeiroBloco` e os checks do bloco inicial",
|
|
54
|
+
"porque": "a regra contextual fora da tabela de racionalizacoes"
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
"tipo": "contem",
|
|
58
|
-
"valor": "
|
|
59
|
-
"porque": "a bandeira vermelha correspondente"
|
|
58
|
+
"valor": "Despacho iniciado com `prontoPrimeiroBloco` falso ou falha relevante do bloco inicial",
|
|
59
|
+
"porque": "a bandeira vermelha correspondente continua bloqueante"
|
|
60
60
|
}
|
|
61
61
|
]
|
|
62
62
|
},
|
|
@@ -78,6 +78,44 @@
|
|
|
78
78
|
"porque": "a bandeira vermelha correspondente"
|
|
79
79
|
}
|
|
80
80
|
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "scope-check-capability-map/dependencia-futura",
|
|
84
|
+
"tipo": "borda",
|
|
85
|
+
"gravidade": "maior",
|
|
86
|
+
"cenario": "Maestro tem primeiro bloco pronto e um runtime indisponivel apenas num bloco futuro.",
|
|
87
|
+
"esperado": "Informe a dependencia futura; nao a apresente como impedimento do bloco inicial pronto nem prometa entrega completa.",
|
|
88
|
+
"assercoes": [
|
|
89
|
+
{
|
|
90
|
+
"tipo": "contem",
|
|
91
|
+
"valor": "`prontoTodosBlocos` informa dependencias dos blocos futuros",
|
|
92
|
+
"porque": "separa o diagnostico futuro do bloco inicial"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"tipo": "contem",
|
|
96
|
+
"valor": "anuncie essas limitacoes sem confundi-las com impedimento do bloco inicial",
|
|
97
|
+
"porque": "orienta comunicar a limitacao sem trocar seu alcance"
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"id": "scope-check-capability-map/doctor-global-opcional",
|
|
103
|
+
"tipo": "borda",
|
|
104
|
+
"gravidade": "maior",
|
|
105
|
+
"cenario": "O preflight do modo esta pronto, mas o doctor amplo acusa ausencia de runtime que o modo nao usa.",
|
|
106
|
+
"esperado": "Siga a prontidao contextual e seus limites; diagnostico global e opcional, sem retirar gates do despacho.",
|
|
107
|
+
"assercoes": [
|
|
108
|
+
{
|
|
109
|
+
"tipo": "contem",
|
|
110
|
+
"valor": "O `ork doctor` sem modo e um diagnostico amplo opcional, com inventario global",
|
|
111
|
+
"porque": "a consulta global tem alcance diferente do preflight contextual"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"tipo": "contem",
|
|
115
|
+
"valor": "o preflight contextual nem deve competir com ele como rota obrigatoria de despacho",
|
|
116
|
+
"porque": "impede restaurar dependencia irrelevante como gate geral"
|
|
117
|
+
}
|
|
118
|
+
]
|
|
81
119
|
}
|
|
82
120
|
]
|
|
83
121
|
}
|
|
@@ -81,10 +81,10 @@
|
|
|
81
81
|
]
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
|
-
"id": "ship-release/
|
|
84
|
+
"id": "ship-release/classic-dispensa-autorizacao",
|
|
85
85
|
"tipo": "borda",
|
|
86
86
|
"gravidade": "maior",
|
|
87
|
-
"cenario": "A thread e #
|
|
87
|
+
"cenario": "A thread e #Classic, que autoriza o push antecipadamente no gate de evidencias, e alguem conclui que nao precisa de autorizacao.",
|
|
88
88
|
"esperado": "A autorizacao e antecipada e REGISTRADA, nunca dispensada.",
|
|
89
89
|
"assercoes": [
|
|
90
90
|
{
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"descricao": "Fixture minima do bloco B0: pedido do builder com #TAG produz slug de 3 partes, blocos do modo e numero de pausas humanas.",
|
|
2
|
+
"descricao": "Fixture minima do bloco B0: pedido do builder com #TAG de modo VIVO produz slug de 3 partes, blocos do modo e numero de pausas humanas. I-43 tirou daqui os casos de #Look e #Ork: eles pararam de ser escritos, e a recusa deles e provada por fx-modo-aposentado-escritor.",
|
|
3
3
|
"manifesto": {
|
|
4
|
-
"project": {
|
|
4
|
+
"project": {
|
|
5
|
+
"name": "orkastery",
|
|
6
|
+
"abbrev": "ork"
|
|
7
|
+
}
|
|
5
8
|
},
|
|
6
9
|
"casos": [
|
|
7
10
|
{
|
|
@@ -9,31 +12,21 @@
|
|
|
9
12
|
"nome": "core b0",
|
|
10
13
|
"modoEsperado": "auto",
|
|
11
14
|
"slugEsperado": "ork-coreb0-full",
|
|
12
|
-
"blocosEsperados": [
|
|
15
|
+
"blocosEsperados": [
|
|
16
|
+
"GOAL-PLAN-GO-CHECK-SHIP-MASTER"
|
|
17
|
+
],
|
|
13
18
|
"pausasEsperadas": 0
|
|
14
19
|
},
|
|
15
|
-
{
|
|
16
|
-
"pedido": "Refatorar o checkout do carrinho #Ork",
|
|
17
|
-
"nome": "checkout",
|
|
18
|
-
"modoEsperado": "ork",
|
|
19
|
-
"slugEsperado": "ork-checkout-f12",
|
|
20
|
-
"blocosEsperados": ["GOAL-PLAN", "GO", "CHECK", "SHIP", "MASTER"],
|
|
21
|
-
"pausasEsperadas": 5
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"pedido": "Migracao de dados com risco alto #Look",
|
|
25
|
-
"nome": "migracao",
|
|
26
|
-
"modoEsperado": "look",
|
|
27
|
-
"slugEsperado": "ork-migracao-goal",
|
|
28
|
-
"blocosEsperados": ["GOAL", "PLAN", "GO", "CHECK", "SHIP", "MASTER"],
|
|
29
|
-
"pausasEsperadas": 6
|
|
30
|
-
},
|
|
31
20
|
{
|
|
32
21
|
"pedido": "Ajuste simples e claro no rodape #Maestro",
|
|
33
22
|
"nome": "rodape",
|
|
34
23
|
"modoEsperado": "maestro",
|
|
35
24
|
"slugEsperado": "ork-rodape-f12",
|
|
36
|
-
"blocosEsperados": [
|
|
25
|
+
"blocosEsperados": [
|
|
26
|
+
"GOAL-PLAN",
|
|
27
|
+
"GO-CHECK-SHIP",
|
|
28
|
+
"MASTER"
|
|
29
|
+
],
|
|
37
30
|
"pausasEsperadas": 1
|
|
38
31
|
},
|
|
39
32
|
{
|
|
@@ -41,15 +34,35 @@
|
|
|
41
34
|
"nome": "pipeline",
|
|
42
35
|
"modoEsperado": "classic",
|
|
43
36
|
"slugEsperado": "ork-pipeline-goal",
|
|
44
|
-
"blocosEsperados": [
|
|
37
|
+
"blocosEsperados": [
|
|
38
|
+
"GOAL",
|
|
39
|
+
"PLAN",
|
|
40
|
+
"GO-CHECK",
|
|
41
|
+
"SHIP-MASTER"
|
|
42
|
+
],
|
|
45
43
|
"pausasEsperadas": 3
|
|
46
44
|
},
|
|
45
|
+
{
|
|
46
|
+
"pedido": "Arruma o typo do rodape #Fast",
|
|
47
|
+
"nome": "typo rodape",
|
|
48
|
+
"modoEsperado": "fast",
|
|
49
|
+
"slugEsperado": "ork-typorodape-go",
|
|
50
|
+
"blocosEsperados": [
|
|
51
|
+
"GO"
|
|
52
|
+
],
|
|
53
|
+
"pausasEsperadas": 0
|
|
54
|
+
},
|
|
47
55
|
{
|
|
48
56
|
"pedido": "Pedido sem tag nenhuma",
|
|
49
57
|
"nome": "semtag",
|
|
50
58
|
"modoEsperado": null,
|
|
51
59
|
"slugEsperado": "ork-semtag-goal",
|
|
52
|
-
"blocosEsperados": [
|
|
60
|
+
"blocosEsperados": [
|
|
61
|
+
"GOAL",
|
|
62
|
+
"PLAN",
|
|
63
|
+
"GO-CHECK",
|
|
64
|
+
"SHIP-MASTER"
|
|
65
|
+
],
|
|
53
66
|
"pausasEsperadas": 3
|
|
54
67
|
}
|
|
55
68
|
]
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"fases": ["GOAL", "PLAN", "GO", "CHECK", "SHIP", "MASTER"],
|
|
43
43
|
"score": 4,
|
|
44
44
|
"justificativa": "entregou o combinado; a base andou no meio e exigiu ressincronizacao",
|
|
45
|
-
"avaliadoPor": "
|
|
45
|
+
"avaliadoPor": "dono-do-projeto",
|
|
46
46
|
"avaliadoEm": "2026-01-15T12:00:00.000Z",
|
|
47
47
|
"classesDeFalha": ["base-avancou"],
|
|
48
48
|
"resumo": "thread ork-checkout fechada com score 4/5",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "fx-adapter-editado-detectado",
|
|
3
|
+
"sobre": "Uma cópia de adapter editada fora do catálogo continua sendo DETECTADA, NOMEADA e classificada como `copia-editada`, e continua barrando; a saída traz o diff e um caminho de UM comando, sem oferecer `--force`.",
|
|
4
|
+
"porque": "R1 do GOAL chama esta de a remoção com maior risco, e pelo motivo certo: a cerimônia de instalação é o único mecanismo que pega uma cópia instalada editada à mão, e nenhum teste da suíte alcança isso, porque a suíte roda sobre o CATÁLOGO e não sobre a cópia. Trocar uma recusa barulhenta por nada seria trocar investigação de madrugada por defeito que ninguém vê. O que muda é o que BARRA, não o que DETECTA: no adapter real do Hermes, dos 9 divergentes, 7 são `catalogo-andou` e se resolvem sozinhos, e sobram 2 para o operador decidir — incluindo exatamente o `skills/orkastery-devmaster/SKILL.md` que o dono investigou de madrugada. `naoOfereceForce` é a metade que impede o regime antigo de voltar: `--force` ressincronizava tudo sem mostrar o que mudava, e era o único caminho de saída oferecido.",
|
|
5
|
+
"precisa": [],
|
|
6
|
+
"esperado": {
|
|
7
|
+
"semDivergenciaAoInstalar": true,
|
|
8
|
+
"reciboGravado": true,
|
|
9
|
+
"reinstalarNaoAcusa": true,
|
|
10
|
+
"detectouAEdicao": true,
|
|
11
|
+
"nomeiaOArquivo": true,
|
|
12
|
+
"classificouComoCopiaEditada": true,
|
|
13
|
+
"barrouSemDecisao": true,
|
|
14
|
+
"temDiffNaSaida": true,
|
|
15
|
+
"temUmComando": true,
|
|
16
|
+
"naoOfereceForce": true,
|
|
17
|
+
"umComandoResolve": true
|
|
18
|
+
}
|
|
19
|
+
}
|