sneakoscope 2.0.2 → 2.0.5
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/README.md +12 -8
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/crates/sks-core/src/main.rs +1 -1
- package/dist/.sks-build-stamp.json +4 -4
- package/dist/bin/sks.js +1 -1
- package/dist/build-manifest.json +86 -8
- package/dist/commands/doctor.js +14 -0
- package/dist/core/agents/agent-orchestrator.js +70 -4
- package/dist/core/agents/agent-patch-proof.js +5 -0
- package/dist/core/agents/agent-proof-evidence.js +61 -0
- package/dist/core/agents/agent-roster.js +35 -6
- package/dist/core/agents/agent-schema.js +1 -1
- package/dist/core/agents/native-worker-backend-router.js +31 -9
- package/dist/core/agents/ollama-worker-config.js +164 -15
- package/dist/core/codex/codex-0-137-compat.js +119 -0
- package/dist/core/codex-control/codex-control-proof.js +4 -1
- package/dist/core/codex-control/codex-fake-sdk-adapter.js +20 -0
- package/dist/core/codex-control/codex-output-schemas.js +5 -1
- package/dist/core/codex-control/codex-sdk-capability.js +1 -1
- package/dist/core/codex-control/codex-task-runner.js +329 -5
- package/dist/core/codex-control/gpt-final-arbiter.js +160 -0
- package/dist/core/codex-control/gpt-final-context-compressor.js +17 -0
- package/dist/core/codex-control/gpt-final-proof-pack.js +120 -0
- package/dist/core/codex-control/gpt-final-review-schema.js +71 -0
- package/dist/core/codex-control/python-codex-sdk-adapter.js +197 -0
- package/dist/core/codex-control/python-codex-sdk-event-translator.js +14 -0
- package/dist/core/commands/local-model-command.js +79 -18
- package/dist/core/commands/naruto-command.js +195 -12
- package/dist/core/commands/run-command.js +6 -2
- package/dist/core/doctor/doctor-readiness-matrix.js +34 -0
- package/dist/core/feature-fixtures.js +4 -0
- package/dist/core/fsx.js +1 -1
- package/dist/core/git-simple.js +143 -4
- package/dist/core/local-llm/local-collaboration-policy.js +93 -0
- package/dist/core/local-llm/local-llm-backpressure.js +20 -0
- package/dist/core/local-llm/local-llm-capability.js +29 -0
- package/dist/core/local-llm/local-llm-client.js +100 -0
- package/dist/core/local-llm/local-llm-config.js +20 -0
- package/dist/core/local-llm/local-llm-context-cache.js +21 -0
- package/dist/core/local-llm/local-llm-control-adapter.js +101 -0
- package/dist/core/local-llm/local-llm-json-repair.js +52 -0
- package/dist/core/local-llm/local-llm-metrics.js +42 -0
- package/dist/core/local-llm/local-llm-ollama-client.js +67 -0
- package/dist/core/local-llm/local-llm-openai-compatible-client.js +30 -0
- package/dist/core/local-llm/local-llm-prompt-cache.js +12 -0
- package/dist/core/local-llm/local-llm-scheduler.js +29 -0
- package/dist/core/local-llm/local-llm-schema-enforcer.js +15 -0
- package/dist/core/local-llm/local-llm-smoke.js +83 -0
- package/dist/core/local-llm/local-llm-warmup.js +20 -0
- package/dist/core/local-llm/local-worker-eligibility.js +27 -0
- package/dist/core/naruto/hardware-capacity-probe.js +36 -0
- package/dist/core/naruto/naruto-active-pool.js +118 -0
- package/dist/core/naruto/naruto-backpressure.js +13 -0
- package/dist/core/naruto/naruto-concurrency-governor.js +65 -0
- package/dist/core/naruto/naruto-finalizer.js +18 -0
- package/dist/core/naruto/naruto-generation-scheduler.js +18 -0
- package/dist/core/naruto/naruto-gpt-final-pack.js +49 -0
- package/dist/core/naruto/naruto-parallel-patch-apply.js +95 -0
- package/dist/core/naruto/naruto-patch-transaction-batch.js +42 -0
- package/dist/core/naruto/naruto-role-policy.js +107 -0
- package/dist/core/naruto/naruto-verification-dag.js +42 -0
- package/dist/core/naruto/naruto-verification-pool.js +18 -0
- package/dist/core/naruto/naruto-work-graph.js +198 -0
- package/dist/core/naruto/naruto-work-item.js +40 -0
- package/dist/core/naruto/naruto-work-stealing.js +11 -0
- package/dist/core/naruto/resource-pressure-monitor.js +32 -0
- package/dist/core/pipeline/final-gpt-patch-stage.js +31 -0
- package/dist/core/pipeline/final-gpt-review-stage.js +5 -0
- package/dist/core/pipeline/finalize-pipeline-result.js +58 -0
- package/dist/core/pipeline/gpt-final-required.js +12 -0
- package/dist/core/prompt/prompt-placeholder-guard.js +30 -0
- package/dist/core/router/capability-card.js +13 -0
- package/dist/core/router/route-cache.js +3 -0
- package/dist/core/router/ultra-router.js +2 -1
- package/dist/core/routes.js +4 -4
- package/dist/core/safety/mutation-guard.js +2 -0
- package/dist/core/update-check.js +60 -25
- package/dist/core/version.js +1 -1
- package/dist/core/zellij/zellij-lane-runtime.js +2 -2
- package/dist/core/zellij/zellij-naruto-dashboard.js +36 -0
- package/dist/core/zellij/zellij-worker-pane-manager.js +4 -4
- package/dist/scripts/blackbox-command-import-smoke.js +10 -1
- package/dist/scripts/check-package-boundary.js +12 -3
- package/dist/scripts/codex-0-137-compat-check.js +27 -0
- package/dist/scripts/codex-environment-scoped-approvals-check.js +10 -0
- package/dist/scripts/codex-plugin-list-json-check.js +8 -0
- package/dist/scripts/codex-sdk-team-naruto-agent-pipeline-check.js +2 -1
- package/dist/scripts/codex-thread-runtime-choice-check.js +10 -0
- package/dist/scripts/gpt-final-arbiter-check.js +63 -0
- package/dist/scripts/gpt-final-arbiter-performance-check.js +36 -0
- package/dist/scripts/local-collab-all-pipelines-final-gpt-check.js +21 -0
- package/dist/scripts/local-collab-gpt-final-availability-check.js +58 -0
- package/dist/scripts/local-collab-no-local-only-final-check.js +27 -0
- package/dist/scripts/local-collab-policy-check.js +17 -0
- package/dist/scripts/local-llm-all-pipelines-check.js +11 -0
- package/dist/scripts/local-llm-cache-performance-check.js +10 -0
- package/dist/scripts/local-llm-capability-check.js +14 -0
- package/dist/scripts/local-llm-smoke-check.js +23 -0
- package/dist/scripts/local-llm-structured-output-check.js +11 -0
- package/dist/scripts/local-llm-throughput-check.js +10 -0
- package/dist/scripts/local-llm-tool-call-repair-check.js +10 -0
- package/dist/scripts/local-llm-warmup-check.js +11 -0
- package/dist/scripts/naruto-active-pool-check.js +27 -0
- package/dist/scripts/naruto-concurrency-governor-check.js +52 -0
- package/dist/scripts/naruto-gpt-final-pack-check.js +34 -0
- package/dist/scripts/naruto-parallel-patch-apply-check.js +41 -0
- package/dist/scripts/naruto-real-local-gpt-final-smoke.js +16 -0
- package/dist/scripts/naruto-role-distribution-check.js +23 -0
- package/dist/scripts/naruto-shadow-clone-swarm-check.js +6 -0
- package/dist/scripts/naruto-verification-pool-check.js +36 -0
- package/dist/scripts/naruto-work-graph-check.js +24 -0
- package/dist/scripts/naruto-zellij-massive-ui-check.js +23 -0
- package/dist/scripts/prompt-placeholder-guard-check.js +33 -0
- package/dist/scripts/python-codex-sdk-all-pipelines-check.js +47 -0
- package/dist/scripts/python-codex-sdk-capability-check.js +75 -0
- package/dist/scripts/python-codex-sdk-sandbox-policy-check.js +10 -0
- package/dist/scripts/python-codex-sdk-stream-bridge-check.js +12 -0
- package/dist/scripts/release-parallel-check.js +1 -1
- package/dist/scripts/release-real-check.js +5 -0
- package/dist/scripts/zellij-worker-pane-manager-check.js +1 -1
- package/package.json +38 -4
- package/schemas/local-llm/local-collaboration-policy.schema.json +57 -0
- package/schemas/local-llm/local-model-config.schema.json +74 -0
- package/schemas/naruto/naruto-concurrency-governor.schema.json +21 -0
- package/schemas/naruto/naruto-work-graph.schema.json +22 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist, root } from './lib/codex-sdk-gate-lib.js';
|
|
4
|
+
const cfg = await importDist('core/agents/ollama-worker-config.js');
|
|
5
|
+
const smokeMod = await importDist('core/local-llm/local-llm-smoke.js');
|
|
6
|
+
const config = cfg.normalizeLocalModelConfig({ enabled: true, status: 'enabled_unverified' });
|
|
7
|
+
if (process.env.SKS_REQUIRE_LOCAL_LLM !== '1' && !process.argv.includes('--require-real')) {
|
|
8
|
+
const skipped = cfg.applyLocalLlmSmokeResult(config, { ok: false, skipped: true, status: 'enabled_unverified', reason: 'release_check_no_real_smoke', schema_valid: false });
|
|
9
|
+
assertGate(skipped.status === 'enabled_unverified', '--skip-smoke or hermetic mode must not verify local LLM');
|
|
10
|
+
emitGate('local-llm:smoke', { status: 'hermetic_skip', config_status: skipped.status });
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
const reportPath = `${root}/.sneakoscope/reports/local-llm-smoke-real.json`;
|
|
14
|
+
const realConfig = await cfg.readLocalModelConfig();
|
|
15
|
+
const first = await smokeMod.runLocalLlmGenerationSmoke(realConfig, { reportPath, timeoutMs: 60_000 });
|
|
16
|
+
const shouldRetry = first.ok !== true && String(first.blockers || []).match(/aborted|timeout|local_llm_generate_failed/i);
|
|
17
|
+
const smoke = shouldRetry
|
|
18
|
+
? await smokeMod.runLocalLlmGenerationSmoke(realConfig, { reportPath, timeoutMs: 90_000 })
|
|
19
|
+
: first;
|
|
20
|
+
assertGate(smoke.ok === true && smoke.schema_valid === true, 'real local LLM smoke failed', { smoke, retry_count: shouldRetry ? 1 : 0, first_failure_blockers: first.blockers || [] });
|
|
21
|
+
emitGate('local-llm:smoke', { status: 'real_verified', latency_ms: smoke.latency_ms, tokens_per_second: smoke.tokens_per_second, retry_count: shouldRetry ? 1 : 0 });
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=local-llm-smoke-check.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './lib/codex-sdk-gate-lib.js';
|
|
4
|
+
const mod = await importDist('core/local-llm/local-llm-schema-enforcer.js');
|
|
5
|
+
const schema = { type: 'object', required: ['status'], properties: { status: { type: 'string' } }, additionalProperties: false };
|
|
6
|
+
const good = mod.enforceLocalLlmJsonSchema('{"status":"ok"}', schema);
|
|
7
|
+
const bad = mod.enforceLocalLlmJsonSchema('plain words', schema);
|
|
8
|
+
assertGate(good.ok === true && good.schema_valid === true, 'valid local JSON should pass');
|
|
9
|
+
assertGate(bad.ok === false, 'natural language local output must not pass');
|
|
10
|
+
emitGate('local-llm:structured-output', { good: good.ok, bad: bad.ok });
|
|
11
|
+
//# sourceMappingURL=local-llm-structured-output-check.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './lib/codex-sdk-gate-lib.js';
|
|
4
|
+
const scheduler = await importDist('core/local-llm/local-llm-scheduler.js');
|
|
5
|
+
const plan = scheduler.planLocalLlmSchedule({ workItems: Array.from({ length: 20 }, (_, i) => ({ id: i })), maxParallelRequests: 4 });
|
|
6
|
+
assertGate(plan.ok === true, 'local scheduler must not exceed max parallel requests');
|
|
7
|
+
assertGate(plan.active_requests <= plan.max_parallel_requests, 'active requests exceeded max_parallel_requests');
|
|
8
|
+
assertGate(plan.queued_count === 16, '20 worker fixture should queue work beyond max parallel requests');
|
|
9
|
+
emitGate('local-llm:throughput', { active_requests: plan.active_requests, queued_count: plan.queued_count, backpressure: plan.backpressure });
|
|
10
|
+
//# sourceMappingURL=local-llm-throughput-check.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './lib/codex-sdk-gate-lib.js';
|
|
4
|
+
const mod = await importDist('core/local-llm/local-llm-json-repair.js');
|
|
5
|
+
const repaired = mod.parseOrRepairLocalLlmJson('Here is JSON: {"status":"ok","summary":"done"} thanks');
|
|
6
|
+
const failed = mod.parseOrRepairLocalLlmJson('not json at all');
|
|
7
|
+
assertGate(repaired.ok === true && repaired.repaired === true && repaired.attempts === 1, 'bounded JSON repair should recover one object');
|
|
8
|
+
assertGate(failed.ok === false && failed.attempts === 1, 'invalid local JSON must fail after one repair attempt');
|
|
9
|
+
emitGate('local-llm:tool-call-repair', { repaired: repaired.ok, failed: failed.ok });
|
|
10
|
+
//# sourceMappingURL=local-llm-tool-call-repair-check.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './lib/codex-sdk-gate-lib.js';
|
|
4
|
+
const cfg = await importDist('core/agents/ollama-worker-config.js');
|
|
5
|
+
const warmup = await importDist('core/local-llm/local-llm-warmup.js');
|
|
6
|
+
const state = warmup.buildLocalLlmWarmupState(cfg.normalizeLocalModelConfig({ enabled: true, status: 'enabled_unverified' }), { ok: true, ttlMs: 1000 });
|
|
7
|
+
assertGate(state.explicit_only === true, 'local warmup must be explicit only');
|
|
8
|
+
assertGate(state.postinstall_allowed === false, 'postinstall must not run local warmup');
|
|
9
|
+
assertGate(state.release_check_real_warmup_allowed === false, 'release:check must not run real warmup');
|
|
10
|
+
emitGate('local-llm:warmup', { explicit_only: state.explicit_only, expires_at: state.expires_at });
|
|
11
|
+
//# sourceMappingURL=local-llm-warmup-check.js.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const workGraph = await importDist('core/naruto/naruto-work-graph.js');
|
|
5
|
+
const governorMod = await importDist('core/naruto/naruto-concurrency-governor.js');
|
|
6
|
+
const activePool = await importDist('core/naruto/naruto-active-pool.js');
|
|
7
|
+
const graph = workGraph.buildNarutoWorkGraph({ requestedClones: 20, totalWorkItems: 20, writeCapable: true, maxActiveWorkers: 5 });
|
|
8
|
+
const governor = governorMod.decideNarutoConcurrency({
|
|
9
|
+
requestedClones: 20,
|
|
10
|
+
totalWorkItems: 20,
|
|
11
|
+
pendingWorkQueueSize: 20,
|
|
12
|
+
backend: 'fake',
|
|
13
|
+
hardware: { remoteApiRateLimitBudget: 5, fileDescriptorLimit: 4096, freeMemoryBytes: 8 * 1024 * 1024 * 1024, totalMemoryBytes: 16 * 1024 * 1024 * 1024 }
|
|
14
|
+
});
|
|
15
|
+
const report = activePool.simulateNarutoActivePool({ graph, governor: { ...governor, safe_active_workers: 5 } });
|
|
16
|
+
assertGate(report.ok === true, 'active pool must drain cleanly', report);
|
|
17
|
+
assertGate(report.max_observed_active_workers <= 5, 'active pool must never exceed safe cap', report);
|
|
18
|
+
assertGate(report.completed_count >= graph.total_work_items, 'active pool must complete all base work items', report);
|
|
19
|
+
assertGate(report.refill_events >= 5, 'active pool must refill slots as work drains', report);
|
|
20
|
+
assertGate(report.duplicate_execution_count === 0, 'active pool must not duplicate work without retry', report);
|
|
21
|
+
emitGate('naruto:active-pool', {
|
|
22
|
+
safe_active_workers: report.safe_active_workers,
|
|
23
|
+
completed_count: report.completed_count,
|
|
24
|
+
refill_events: report.refill_events,
|
|
25
|
+
max_observed_active_workers: report.max_observed_active_workers
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=naruto-active-pool-check.js.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const governorMod = await importDist('core/naruto/naruto-concurrency-governor.js');
|
|
5
|
+
const normal = governorMod.decideNarutoConcurrency({
|
|
6
|
+
requestedClones: 200,
|
|
7
|
+
totalWorkItems: 340,
|
|
8
|
+
pendingWorkQueueSize: 340,
|
|
9
|
+
backend: 'codex-sdk',
|
|
10
|
+
zellijVisiblePaneCap: 12,
|
|
11
|
+
hardware: {
|
|
12
|
+
cores: 32,
|
|
13
|
+
freeMemoryBytes: 48 * 1024 * 1024 * 1024,
|
|
14
|
+
totalMemoryBytes: 64 * 1024 * 1024 * 1024,
|
|
15
|
+
fileDescriptorLimit: 4096,
|
|
16
|
+
localLlmMaxParallelRequests: 4,
|
|
17
|
+
remoteApiRateLimitBudget: 32,
|
|
18
|
+
terminalRows: 40,
|
|
19
|
+
terminalColumns: 140
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const pressure = governorMod.decideNarutoConcurrency({
|
|
23
|
+
requestedClones: 200,
|
|
24
|
+
totalWorkItems: 340,
|
|
25
|
+
pendingWorkQueueSize: 340,
|
|
26
|
+
backend: 'codex-sdk',
|
|
27
|
+
zellijVisiblePaneCap: 12,
|
|
28
|
+
hardware: {
|
|
29
|
+
cores: 8,
|
|
30
|
+
loadAverage: [16, 16, 16],
|
|
31
|
+
freeMemoryBytes: 256 * 1024 * 1024,
|
|
32
|
+
totalMemoryBytes: 4 * 1024 * 1024 * 1024,
|
|
33
|
+
fileDescriptorLimit: 128,
|
|
34
|
+
localLlmMaxParallelRequests: 4,
|
|
35
|
+
remoteApiRateLimitBudget: 32,
|
|
36
|
+
zellijPaneCount: 12,
|
|
37
|
+
diskIoPressure: 0.9
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
assertGate(normal.safe_active_workers <= 32, 'requested_clones=200 fixture must cap active workers safely', { normal });
|
|
41
|
+
assertGate(normal.safe_zellij_visible_panes === 12 && normal.headless_workers === normal.safe_active_workers - 12, 'zellij visible panes must stay within UI cap', { normal });
|
|
42
|
+
assertGate(normal.local_llm_parallel <= 4, 'local LLM active requests must respect max_parallel_requests=4', { normal });
|
|
43
|
+
assertGate(pressure.safe_active_workers < normal.safe_active_workers, 'memory/load pressure fixture must decrease active workers', { normal: normal.safe_active_workers, pressure: pressure.safe_active_workers });
|
|
44
|
+
assertGate(pressure.backpressure === 'saturated' || pressure.backpressure === 'throttled', 'pressure fixture must report backpressure', { pressure });
|
|
45
|
+
emitGate('naruto:concurrency-governor', {
|
|
46
|
+
requested_clones: normal.requested_clones,
|
|
47
|
+
total_work_items: normal.total_work_items,
|
|
48
|
+
safe_active_workers: normal.safe_active_workers,
|
|
49
|
+
safe_zellij_visible_panes: normal.safe_zellij_visible_panes,
|
|
50
|
+
pressure_safe_active_workers: pressure.safe_active_workers
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=naruto-concurrency-governor-check.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const workGraph = await importDist('core/naruto/naruto-work-graph.js');
|
|
5
|
+
const roles = await importDist('core/naruto/naruto-role-policy.js');
|
|
6
|
+
const packMod = await importDist('core/naruto/naruto-gpt-final-pack.js');
|
|
7
|
+
const graph = workGraph.buildNarutoWorkGraph({ requestedClones: 100, totalWorkItems: 120, writeCapable: true });
|
|
8
|
+
const roleDistribution = roles.buildNarutoRoleDistribution(graph.work_items);
|
|
9
|
+
const patchEnvelopes = Array.from({ length: 120 }, (_, index) => ({ id: index, token: 'sk-testsecret1234567890', file: `f-${index}.ts` }));
|
|
10
|
+
const logs = Array.from({ length: 40 }, (_, index) => `log ${index} api_key=secret-${index}`);
|
|
11
|
+
const pack = packMod.buildNarutoGptFinalPack({
|
|
12
|
+
missionId: 'M-naruto-pack',
|
|
13
|
+
graph,
|
|
14
|
+
roleDistribution,
|
|
15
|
+
changedFiles: ['src/a.ts', 'src/a.ts', 'src/b.ts'],
|
|
16
|
+
patchEnvelopes,
|
|
17
|
+
verificationResults: [{ ok: true }],
|
|
18
|
+
failedShards: [{ id: 'failed-1' }],
|
|
19
|
+
conflictMap: [{ path: 'src/a.ts' }],
|
|
20
|
+
rollbackPlan: { token: 'sk-abc12345678901234567' },
|
|
21
|
+
logs
|
|
22
|
+
});
|
|
23
|
+
const serialized = JSON.stringify(pack);
|
|
24
|
+
assertGate(pack.bounded === true && pack.secrets_redacted === true, 'GPT final pack must be bounded and redacted', pack);
|
|
25
|
+
assertGate(pack.patch_envelopes.length === 100, '100 worker results must compress to bounded patch envelope count', { count: pack.patch_envelopes.length });
|
|
26
|
+
assertGate(pack.representative_logs.length === 12, 'representative logs must be bounded', { count: pack.representative_logs.length });
|
|
27
|
+
assertGate(!serialized.includes('secret-') && !serialized.includes('sk-testsecret'), 'secrets must be redacted from final pack', pack);
|
|
28
|
+
assertGate(pack.role_distribution.ok === true && pack.work_graph_summary.write_allowed_count > 0, 'final pack must include role distribution and write work summary', pack);
|
|
29
|
+
emitGate('naruto:gpt-final-pack', {
|
|
30
|
+
patch_envelopes: pack.patch_envelopes.length,
|
|
31
|
+
representative_logs: pack.representative_logs.length,
|
|
32
|
+
changed_files: pack.changed_files
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=naruto-gpt-final-pack-check.js.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
|
|
7
|
+
const patchApply = await importDist('core/naruto/naruto-parallel-patch-apply.js');
|
|
8
|
+
const root = await fs.mkdtemp(path.join(os.tmpdir(), 'sks-naruto-patch-'));
|
|
9
|
+
const envelopes = Array.from({ length: 10 }, (_, index) => {
|
|
10
|
+
const file = `file-${index}.txt`;
|
|
11
|
+
return envelope(index + 1, file, `after-${index}`);
|
|
12
|
+
});
|
|
13
|
+
const result = await patchApply.applyNarutoPatchEnvelopes(root, envelopes, { dryRun: false });
|
|
14
|
+
assertGate(result.ok === true, 'non-overlapping patch fixture must apply', result);
|
|
15
|
+
assertGate(result.batch_count === 1 && result.parallel_apply_count === 1, 'non-overlapping patch fixture must group into a parallel batch', result);
|
|
16
|
+
assertGate(result.results.every((row) => row.changed_files.length === 1 && Object.keys(row.before_hashes).length === 1 && Object.keys(row.after_hashes).length === 1), 'patch results must include before/after hashes and changed files', result);
|
|
17
|
+
const rollback = await patchApply.rollbackNarutoPatchResult(root, result.results[0]);
|
|
18
|
+
assertGate(rollback.ok === true && rollback.restored.length === 1, 'rollback must restore before content for a patch result', rollback);
|
|
19
|
+
const conflict = await patchApply.applyNarutoPatchEnvelopes(root, [envelope(99, 'same.txt', 'a'), envelope(100, 'same.txt', 'b')], { dryRun: true });
|
|
20
|
+
assertGate(conflict.conflicts.length >= 1, 'overlapping patch fixture must serialize or mark conflict', conflict);
|
|
21
|
+
emitGate('naruto:parallel-patch-apply', {
|
|
22
|
+
batch_count: result.batch_count,
|
|
23
|
+
parallel_apply_count: result.parallel_apply_count,
|
|
24
|
+
conflict_count: conflict.conflicts.length,
|
|
25
|
+
rollback_restored: rollback.restored.length
|
|
26
|
+
});
|
|
27
|
+
function envelope(index, file, content) {
|
|
28
|
+
return {
|
|
29
|
+
schema: 'sks.agent-patch-envelope.v1',
|
|
30
|
+
source: 'fixture',
|
|
31
|
+
agent_id: `naruto-${index}`,
|
|
32
|
+
session_id: `session-${index}`,
|
|
33
|
+
slot_id: `slot-${index}`,
|
|
34
|
+
generation_index: 1,
|
|
35
|
+
task_slice_id: `NW-${index}`,
|
|
36
|
+
lease_id: `lease-${index}`,
|
|
37
|
+
allowed_paths: [file],
|
|
38
|
+
operations: [{ op: 'write', path: file, content }]
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=naruto-parallel-patch-apply-check.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const finalizer = await importDist('core/naruto/naruto-finalizer.js');
|
|
5
|
+
const draft = finalizer.evaluateNarutoFinalizer({ localParticipated: true, gptFinalStatus: null, applyPatches: true });
|
|
6
|
+
const approved = finalizer.evaluateNarutoFinalizer({ localParticipated: true, gptFinalStatus: 'approved', applyPatches: true });
|
|
7
|
+
const deterministic = finalizer.evaluateNarutoFinalizer({ localParticipated: false, applyPatches: true });
|
|
8
|
+
assertGate(draft.ok === false && draft.blockers.includes('naruto_local_worker_output_needs_gpt_final_arbiter'), 'local worker patch must be blocked until GPT final arbiter', draft);
|
|
9
|
+
assertGate(approved.ok === true && approved.final_patch_source === 'gpt_final_arbiter', 'GPT-approved local output must become final patch source', approved);
|
|
10
|
+
assertGate(deterministic.ok === true && deterministic.gpt_final_required === false, 'no-local deterministic run must not require GPT final', deterministic);
|
|
11
|
+
emitGate('naruto:real-local-gpt-final-smoke', {
|
|
12
|
+
require_real_env: process.env.SKS_REQUIRE_LOCAL_LLM === '1' || process.env.SKS_REQUIRE_GPT_FINAL === '1',
|
|
13
|
+
draft_status: draft.final_status,
|
|
14
|
+
approved_status: approved.final_status
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=naruto-real-local-gpt-final-smoke.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const workGraph = await importDist('core/naruto/naruto-work-graph.js');
|
|
5
|
+
const roles = await importDist('core/naruto/naruto-role-policy.js');
|
|
6
|
+
const roster = await importDist('core/agents/agent-roster.js');
|
|
7
|
+
const graph = workGraph.buildNarutoWorkGraph({ requestedClones: 30, totalWorkItems: 30, writeCapable: true });
|
|
8
|
+
const distribution = roles.buildNarutoRoleDistribution(graph.work_items);
|
|
9
|
+
const cloneRoster = roster.buildNarutoCloneRoster({ clones: 30, prompt: 'implement, modify, test, verify, document, and resolve conflicts' });
|
|
10
|
+
const writeCapableRoster = cloneRoster.roster.filter((row) => row.write_allowed === true);
|
|
11
|
+
assertGate(distribution.ok === true, 'write-capable Naruto role distribution must pass', distribution);
|
|
12
|
+
assertGate(distribution.verifier_only === false, 'default Naruto must not be verifier-only', distribution);
|
|
13
|
+
assertGate(distribution.implementation_like_ratio >= 0.4, 'default Naruto must keep at least 40% implementation/modification/test roles', distribution);
|
|
14
|
+
assertGate(writeCapableRoster.length >= Math.floor(cloneRoster.roster.length * 0.4), 'Naruto roster must include write-capable clone roles by default', { writeCapableRoster: writeCapableRoster.length, total: cloneRoster.roster.length });
|
|
15
|
+
const readonlyGraph = workGraph.buildNarutoWorkGraph({ requestedClones: 8, readonly: true, writeCapable: false });
|
|
16
|
+
const readonlyDistribution = roles.buildNarutoRoleDistribution(readonlyGraph.work_items, { readonly: true });
|
|
17
|
+
assertGate(readonlyDistribution.ok === true, 'readonly Naruto route may use read-only verifier/research roles', readonlyDistribution);
|
|
18
|
+
emitGate('naruto:role-distribution', {
|
|
19
|
+
implementation_like_ratio: distribution.implementation_like_ratio,
|
|
20
|
+
entries: distribution.entries,
|
|
21
|
+
write_capable_roster_count: writeCapableRoster.length
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=naruto-role-distribution-check.js.map
|
|
@@ -71,6 +71,9 @@ assertGate(bigMemoryHost.cap >= 64, 'a 64 GB host must allow >= 64 parallel code
|
|
|
71
71
|
const proofClones = 24;
|
|
72
72
|
const cli = path.join(root, 'dist', 'bin', 'sks.js');
|
|
73
73
|
assertGate(exists('dist/bin/sks.js'), 'dist/bin/sks.js missing (build first)');
|
|
74
|
+
const helpRun = spawnSync(process.execPath, [cli, 'naruto', '--help', '--json'], { cwd: root, encoding: 'utf8', timeout: 30000, maxBuffer: 1024 * 1024 });
|
|
75
|
+
const helpParsed = parseJson(helpRun.stdout);
|
|
76
|
+
assertGate(helpRun.status === 0 && helpParsed?.action === 'help', 'sks naruto --help must emit help instead of launching a run', { status: helpRun.status, stdout: tail(helpRun.stdout), stderr: tail(helpRun.stderr) });
|
|
74
77
|
const run = spawnSync(process.execPath, [
|
|
75
78
|
cli, 'naruto', 'run', 'shadow clone swarm gate proof',
|
|
76
79
|
'--clones', String(proofClones),
|
|
@@ -94,6 +97,9 @@ assertGate(parsed.target_active_slots <= fakeSafe.cap, 'active slots must be thr
|
|
|
94
97
|
assertGate(typeof parsed.concurrency_capped === 'boolean', 'naruto run must report concurrency_capped', { concurrency_capped: parsed.concurrency_capped });
|
|
95
98
|
assertGate(parsed.concurrency_capped === (parsed.clones > parsed.target_active_slots), 'concurrency_capped must reflect clones > live slots', { clones: parsed.clones, target_active_slots: parsed.target_active_slots, concurrency_capped: parsed.concurrency_capped });
|
|
96
99
|
assertGate(parsed.system && Number(parsed.system.safe_concurrency) >= 1, 'naruto run must report system safe_concurrency (host-derived cap)', { system: parsed.system });
|
|
100
|
+
assertGate(parsed.work_graph?.write_allowed_count > 0 && parsed.work_graph?.mixed_work_kinds?.length > 1, 'naruto run must report a mixed work graph with write-capable items', { work_graph: parsed.work_graph });
|
|
101
|
+
assertGate(parsed.role_distribution?.verifier_only === false, 'naruto run proof/status must distinguish active worker roles beyond verifier-only', { role_distribution: parsed.role_distribution });
|
|
102
|
+
assertGate(Number(parsed.role_distribution?.implementation_like_ratio || 0) >= 0.4, 'naruto run must include implementation-like role distribution', { role_distribution: parsed.role_distribution });
|
|
97
103
|
const state = parsed.run?.scheduler?.state || parsed.run?.scheduler || {};
|
|
98
104
|
assertGate(Number(state.completed_count) === proofClones, 'all clone work items must complete despite throttling', { completed_count: state.completed_count });
|
|
99
105
|
const explicitConcurrency = spawnSync(process.execPath, [cli, 'naruto', 'run', 'explicit concurrency', '--clones', '6', '--backend', 'fake', '--work-items', '6', '--concurrency', '6', '--json'], { cwd: root, encoding: 'utf8', timeout: 120000, maxBuffer: 4 * 1024 * 1024 });
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist, root } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const workGraph = await importDist('core/naruto/naruto-work-graph.js');
|
|
5
|
+
const governorMod = await importDist('core/naruto/naruto-concurrency-governor.js');
|
|
6
|
+
const verificationDag = await importDist('core/naruto/naruto-verification-dag.js');
|
|
7
|
+
const verificationPool = await importDist('core/naruto/naruto-verification-pool.js');
|
|
8
|
+
const graph = workGraph.buildNarutoWorkGraph({ requestedClones: 8, totalWorkItems: 12, writeCapable: true });
|
|
9
|
+
const governor = governorMod.decideNarutoConcurrency({
|
|
10
|
+
requestedClones: 8,
|
|
11
|
+
totalWorkItems: 12,
|
|
12
|
+
backend: 'fake',
|
|
13
|
+
hardware: {
|
|
14
|
+
cores: 4,
|
|
15
|
+
loadAverage: [0, 0, 0],
|
|
16
|
+
remoteApiRateLimitBudget: 8,
|
|
17
|
+
fileDescriptorLimit: 4096,
|
|
18
|
+
processCount: 1,
|
|
19
|
+
zellijPaneCount: 0,
|
|
20
|
+
diskIoPressure: 0,
|
|
21
|
+
freeMemoryBytes: 8 * 1024 * 1024 * 1024,
|
|
22
|
+
totalMemoryBytes: 16 * 1024 * 1024 * 1024
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const dag = verificationDag.buildNarutoVerificationDag(graph, { cwd: root, command: 'node -e "process.exit(0)"' });
|
|
26
|
+
const report = await verificationPool.runNarutoVerificationPool(dag, { ...governor, verification_parallel: 4 }, { cwd: root });
|
|
27
|
+
assertGate(report.ok === true, 'verification pool must pass all fixture shards', report);
|
|
28
|
+
assertGate(report.safe_concurrency === 4, 'verification pool must use its own safe concurrency', report);
|
|
29
|
+
assertGate(report.task_count > 1, 'verification pool must run multiple shards', report);
|
|
30
|
+
assertGate(report.cpu_heavy_cap_respected && report.io_heavy_cap_respected && report.api_rate_cap_respected, 'verification pool must respect resource caps', report);
|
|
31
|
+
emitGate('naruto:verification-pool', {
|
|
32
|
+
task_count: report.task_count,
|
|
33
|
+
safe_concurrency: report.safe_concurrency,
|
|
34
|
+
passed: report.passed
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=naruto-verification-pool-check.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const workGraph = await importDist('core/naruto/naruto-work-graph.js');
|
|
5
|
+
const graph = workGraph.buildNarutoWorkGraph({
|
|
6
|
+
requestedClones: 24,
|
|
7
|
+
totalWorkItems: 30,
|
|
8
|
+
writeCapable: true,
|
|
9
|
+
targetPaths: Array.from({ length: 30 }, (_, index) => `src/fixture-${index}.ts`),
|
|
10
|
+
maxActiveWorkers: 8
|
|
11
|
+
});
|
|
12
|
+
const validation = workGraph.validateNarutoWorkGraph(graph);
|
|
13
|
+
assertGate(graph.ok === true && validation.ok === true, 'Naruto work graph must validate', { graph_blockers: graph.blockers, validation });
|
|
14
|
+
assertGate(graph.total_work_items >= graph.requested_clones, 'work graph must create at least requested clone count', { total: graph.total_work_items, requested: graph.requested_clones });
|
|
15
|
+
assertGate(graph.mixed_work_kinds.length > 4, 'work graph must contain mixed work kinds, not only verification', { kinds: graph.mixed_work_kinds });
|
|
16
|
+
assertGate(graph.write_allowed_count > 0, 'write-capable Naruto graph must include write_allowed work items', { write_allowed_count: graph.write_allowed_count });
|
|
17
|
+
assertGate(graph.active_waves.every((wave) => wave.conflict_count === 0), 'active waves must not overlap write leases', { waves: graph.active_waves });
|
|
18
|
+
emitGate('naruto:work-graph', {
|
|
19
|
+
total_work_items: graph.total_work_items,
|
|
20
|
+
mixed_work_kinds: graph.mixed_work_kinds,
|
|
21
|
+
write_allowed_count: graph.write_allowed_count,
|
|
22
|
+
wave_count: graph.active_waves.length
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=naruto-work-graph-check.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const dashboardMod = await importDist('core/zellij/zellij-naruto-dashboard.js');
|
|
5
|
+
const plan = dashboardMod.planNarutoZellijDashboard({
|
|
6
|
+
targetActiveWorkers: 32,
|
|
7
|
+
visiblePaneCap: 12,
|
|
8
|
+
completed: 8,
|
|
9
|
+
failed: 1,
|
|
10
|
+
backpressure: 'normal',
|
|
11
|
+
roles: ['implementer', 'modifier', 'test_writer', 'verifier'],
|
|
12
|
+
backend: 'codex-sdk'
|
|
13
|
+
});
|
|
14
|
+
assertGate(plan.ok === true, 'Naruto Zellij dashboard plan must pass', plan);
|
|
15
|
+
assertGate(plan.visible_worker_panes === 12, 'targetActiveWorkers=32 and visiblePaneCap=12 must create 12 visible panes', plan);
|
|
16
|
+
assertGate(plan.headless_workers === 20, 'remaining active workers must be listed as headless', plan);
|
|
17
|
+
assertGate(plan.pane_titles.every((title) => /slot-\d+\/gen-1 · .+ · codex-sdk · active/.test(title)), 'pane titles must include slot/gen/role/backend/status', plan);
|
|
18
|
+
emitGate('naruto:zellij-massive-ui', {
|
|
19
|
+
visible_worker_panes: plan.visible_worker_panes,
|
|
20
|
+
headless_workers: plan.headless_workers,
|
|
21
|
+
dashboard: plan.dashboard
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=naruto-zellij-massive-ui-check.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const guardMod = await importDist('core/prompt/prompt-placeholder-guard.js');
|
|
5
|
+
const blocked = guardMod.checkPromptPlaceholders({
|
|
6
|
+
prompt: 'Use @filename and INSERT_PATH_HERE to patch the bug',
|
|
7
|
+
writeCapable: true,
|
|
8
|
+
targetPaths: ['src/core/example.ts']
|
|
9
|
+
});
|
|
10
|
+
const emptyTarget = guardMod.checkPromptPlaceholders({
|
|
11
|
+
prompt: 'Patch the bug',
|
|
12
|
+
writeCapable: true,
|
|
13
|
+
targetPaths: []
|
|
14
|
+
});
|
|
15
|
+
const pass = guardMod.checkPromptPlaceholders({
|
|
16
|
+
prompt: 'Patch src/core/example.ts',
|
|
17
|
+
writeCapable: true,
|
|
18
|
+
targetPaths: ['src/core/example.ts']
|
|
19
|
+
});
|
|
20
|
+
const readonlyWarn = guardMod.checkPromptPlaceholders({
|
|
21
|
+
prompt: 'Inspect @filename',
|
|
22
|
+
writeCapable: false
|
|
23
|
+
});
|
|
24
|
+
assertGate(blocked.ok === false && blocked.blockers.some((item) => String(item).startsWith('unresolved_prompt_placeholder')), 'write-capable Naruto prompt with @filename must block', blocked);
|
|
25
|
+
assertGate(emptyTarget.ok === false && emptyTarget.blockers.includes('write_capable_prompt_target_paths_empty'), 'write-capable Naruto route with empty target paths must block', emptyTarget);
|
|
26
|
+
assertGate(pass.ok === true, 'resolved write-capable prompt must pass placeholder guard', pass);
|
|
27
|
+
assertGate(readonlyWarn.ok === true && readonlyWarn.warnings.length > 0, 'read-only route may warn on placeholders instead of blocking', readonlyWarn);
|
|
28
|
+
emitGate('prompt:placeholder-guard', {
|
|
29
|
+
blocked_placeholders: blocked.placeholders,
|
|
30
|
+
empty_target_blockers: emptyTarget.blockers,
|
|
31
|
+
readonly_warnings: readonlyWarn.warnings
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=prompt-placeholder-guard-check.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { assertGate, emitGate, readText } from './lib/codex-sdk-gate-lib.js';
|
|
7
|
+
import { importDist, root } from './lib/codex-sdk-gate-lib.js';
|
|
8
|
+
const plane = readText('src/core/codex-control/codex-control-plane.ts');
|
|
9
|
+
const adapter = readText('src/core/codex-control/python-codex-sdk-adapter.ts');
|
|
10
|
+
assertGate(plane.includes("'python-codex-sdk'"), 'Codex Control backend union must include python-codex-sdk');
|
|
11
|
+
assertGate(adapter.includes('runPythonCodexSdkTask'), 'Python SDK adapter must expose a task runner');
|
|
12
|
+
const mod = await importDist('core/codex-control/codex-control-plane.js');
|
|
13
|
+
const schema = await importDist('core/codex-control/schemas/agent-worker-result.schema.js');
|
|
14
|
+
const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'sks-python-codex-sdk-pipeline-'));
|
|
15
|
+
const oldFake = process.env.SKS_PYTHON_CODEX_SDK_FAKE;
|
|
16
|
+
process.env.SKS_PYTHON_CODEX_SDK_FAKE = '1';
|
|
17
|
+
try {
|
|
18
|
+
const result = await mod.runCodexTask({
|
|
19
|
+
route: '$Agent',
|
|
20
|
+
missionId: 'M-python-sdk-all-pipelines',
|
|
21
|
+
workItemId: 'python-sdk-fixture',
|
|
22
|
+
slotId: 'slot-python-fixture',
|
|
23
|
+
generationIndex: 1,
|
|
24
|
+
sessionId: 'python-sdk-fixture-session',
|
|
25
|
+
cwd: root,
|
|
26
|
+
prompt: 'Hermetic Python Codex SDK backend fixture.',
|
|
27
|
+
inputFiles: [],
|
|
28
|
+
inputImages: [],
|
|
29
|
+
outputSchemaId: schema.CODEX_AGENT_WORKER_RESULT_SCHEMA_ID,
|
|
30
|
+
outputSchema: schema.codexAgentWorkerResultSchema,
|
|
31
|
+
sandboxPolicy: 'read-only',
|
|
32
|
+
requestedScopeContract: { id: 'python-sdk-fixture', read_only: true, allowed_paths: [], write_paths: [] },
|
|
33
|
+
backendPreference: ['python-codex-sdk'],
|
|
34
|
+
mutationLedgerRoot: tmp
|
|
35
|
+
});
|
|
36
|
+
assertGate(result.ok === true, 'Python SDK backend fixture must pass', result);
|
|
37
|
+
assertGate(result.backend === 'python-codex-sdk', 'Python SDK backend fixture must select python-codex-sdk', result);
|
|
38
|
+
assertGate(result.pythonSdkProofPath && result.streamEventCount > 0, 'Python SDK backend fixture must write proof and events', result);
|
|
39
|
+
emitGate('python-sdk:all-pipelines', { backend: result.backend, backend_family: result.backend_family, stream_event_count: result.streamEventCount });
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
if (oldFake === undefined)
|
|
43
|
+
delete process.env.SKS_PYTHON_CODEX_SDK_FAKE;
|
|
44
|
+
else
|
|
45
|
+
process.env.SKS_PYTHON_CODEX_SDK_FAKE = oldFake;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=python-codex-sdk-all-pipelines-check.js.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './lib/codex-sdk-gate-lib.js';
|
|
4
|
+
const mod = await importDist('core/codex-control/python-codex-sdk-adapter.js');
|
|
5
|
+
const cap = await mod.detectPythonCodexSdkCapability();
|
|
6
|
+
assertGate(['codex-app-server', 'openai-codex', 'openai-codex-sdk'].includes(cap.package_name), 'Python Codex SDK package name mismatch');
|
|
7
|
+
assertGate(cap.ok === true || cap.blockers.includes('python_codex_sdk_unavailable') || cap.blockers.includes('python_missing') || cap.blockers.includes('python_version_below_3_10'), 'Python SDK unavailable must be a capability blocker');
|
|
8
|
+
const requireReal = process.env.SKS_REQUIRE_PYTHON_CODEX_SDK === '1' || process.argv.includes('--require-real');
|
|
9
|
+
if (requireReal && !cap.ok) {
|
|
10
|
+
console.log(JSON.stringify({
|
|
11
|
+
schema: 'sks.release-gate.v1',
|
|
12
|
+
ok: false,
|
|
13
|
+
gate: 'python-sdk:real-smoke',
|
|
14
|
+
capability_ok: cap.ok,
|
|
15
|
+
capability_blockers: cap.blockers,
|
|
16
|
+
setup_action: cap.setup_action,
|
|
17
|
+
python_bin: cap.python_bin,
|
|
18
|
+
python_version: cap.python_version,
|
|
19
|
+
blockers: cap.blockers
|
|
20
|
+
}, null, 2));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
if (requireReal) {
|
|
24
|
+
const plane = await importDist('core/codex-control/codex-control-plane.js');
|
|
25
|
+
const smokeSchema = {
|
|
26
|
+
type: 'object',
|
|
27
|
+
required: ['status', 'summary', 'blockers'],
|
|
28
|
+
properties: {
|
|
29
|
+
status: { type: 'string', enum: ['done'] },
|
|
30
|
+
summary: { type: 'string' },
|
|
31
|
+
blockers: { type: 'array', items: { type: 'string' } }
|
|
32
|
+
},
|
|
33
|
+
additionalProperties: false
|
|
34
|
+
};
|
|
35
|
+
const result = await plane.runCodexTask({
|
|
36
|
+
route: '$Agent',
|
|
37
|
+
missionId: 'M-python-codex-sdk-real-smoke',
|
|
38
|
+
workItemId: 'python-real-smoke',
|
|
39
|
+
slotId: 'slot-python-real',
|
|
40
|
+
generationIndex: 1,
|
|
41
|
+
sessionId: 'python-real-smoke-session',
|
|
42
|
+
cwd: process.cwd(),
|
|
43
|
+
prompt: 'Read-only Python Codex SDK smoke. Do not edit files. Return exactly JSON: {"status":"done","summary":"python-codex-sdk real smoke passed","blockers":[]}',
|
|
44
|
+
inputFiles: [],
|
|
45
|
+
inputImages: [],
|
|
46
|
+
outputSchemaId: 'sks.python-codex-sdk-real-smoke-result.v1',
|
|
47
|
+
outputSchema: smokeSchema,
|
|
48
|
+
sandboxPolicy: 'read-only',
|
|
49
|
+
requestedScopeContract: { id: 'python-real-smoke', read_only: true, allowed_paths: [], write_paths: [] },
|
|
50
|
+
backendPreference: ['python-codex-sdk'],
|
|
51
|
+
mutationLedgerRoot: '.sneakoscope/reports/python-codex-sdk-real-smoke'
|
|
52
|
+
});
|
|
53
|
+
assertGate(result.ok === true, 'real Python Codex SDK smoke failed', result);
|
|
54
|
+
emitGate('python-sdk:real-smoke', {
|
|
55
|
+
status: 'proven',
|
|
56
|
+
capability_ok: cap.ok,
|
|
57
|
+
package_name: cap.package_name,
|
|
58
|
+
import_name: cap.import_name,
|
|
59
|
+
python_bin: cap.python_bin,
|
|
60
|
+
sdk_thread_id: result.sdkThreadId,
|
|
61
|
+
stream_event_count: result.streamEventCount,
|
|
62
|
+
backend: result.backend,
|
|
63
|
+
backend_family: result.backend_family
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
emitGate('python-sdk:capability', {
|
|
68
|
+
capability_ok: cap.ok,
|
|
69
|
+
capability_blockers: cap.blockers,
|
|
70
|
+
package_name: cap.package_name,
|
|
71
|
+
import_name: cap.import_name,
|
|
72
|
+
setup_action: cap.setup_action
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=python-codex-sdk-capability-check.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, readText } from './lib/codex-sdk-gate-lib.js';
|
|
4
|
+
const adapter = readText('src/core/codex-control/python-codex-sdk-adapter.ts');
|
|
5
|
+
const runner = readText('pytools/codex_sdk_runner.py');
|
|
6
|
+
assertGate(adapter.includes("workspace_write"), 'TS -> Python sandbox mapping must include workspace_write');
|
|
7
|
+
assertGate(adapter.includes("full_access"), 'TS -> Python sandbox mapping must include full_access');
|
|
8
|
+
assertGate(runner.includes('Sandbox.workspace_write'), 'Python runner must use SDK Sandbox presets');
|
|
9
|
+
emitGate('python-sdk:sandbox-policy', { sandboxes: ['read_only', 'workspace_write', 'full_access'] });
|
|
10
|
+
//# sourceMappingURL=python-codex-sdk-sandbox-policy-check.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate, importDist } from './lib/codex-sdk-gate-lib.js';
|
|
4
|
+
const mod = await importDist('core/codex-control/python-codex-sdk-event-translator.js');
|
|
5
|
+
const events = mod.translatePythonCodexSdkEvents([
|
|
6
|
+
{ event: 'thread_started', thread_id: 't' },
|
|
7
|
+
{ event: 'turn_completed', turn_id: 'u', status: 'completed', final_response: '{}' }
|
|
8
|
+
]);
|
|
9
|
+
assertGate(events.length === 2, 'Python SDK event translator must preserve stream events');
|
|
10
|
+
assertGate(events[1].event_type === 'turn_completed', 'Python SDK turn completion event missing');
|
|
11
|
+
emitGate('python-sdk:stream-bridge', { event_count: events.length });
|
|
12
|
+
//# sourceMappingURL=python-codex-sdk-stream-bridge-check.js.map
|
|
@@ -23,7 +23,7 @@ const deterministicReleaseEnv = {
|
|
|
23
23
|
SKS_REQUIRE_REAL_COMPUTER_USE: '0'
|
|
24
24
|
};
|
|
25
25
|
const tasks = [
|
|
26
|
-
task('build', 'npm run
|
|
26
|
+
task('build', 'npm run release:dist-freshness --silent', { outputs: ['dist'] }),
|
|
27
27
|
task('runtime:no-src-mjs', 'npm run runtime:no-src-mjs --silent', { dependencies: ['build'] }),
|
|
28
28
|
task('runtime:ts-source-of-truth', 'npm run runtime:ts-source-of-truth --silent', { dependencies: ['build'] }),
|
|
29
29
|
task('architecture:guard', 'npm run architecture:guard --silent', { dependencies: ['build', 'runtime:ts-source-of-truth'] }),
|
|
@@ -30,6 +30,7 @@ else {
|
|
|
30
30
|
}
|
|
31
31
|
for (const [script, extraArgs] of [
|
|
32
32
|
['codex:actual-config-load-probe', []],
|
|
33
|
+
['codex:0.137-compat:require-real', []],
|
|
33
34
|
['codex:0.136-compat:require-real', []],
|
|
34
35
|
['codex:0.135-compat:require-real', []],
|
|
35
36
|
['doctor:codex-doctor-parity:actual', []],
|
|
@@ -49,6 +50,10 @@ if (report.environment_required_checks.some((row) => !row.ok))
|
|
|
49
50
|
finish(false);
|
|
50
51
|
for (const [script, extraArgs] of [
|
|
51
52
|
['codex-sdk:real-smoke', ['--require-real']],
|
|
53
|
+
['local-llm:smoke', ['--require-real']],
|
|
54
|
+
['local-llm:throughput', []],
|
|
55
|
+
['local-llm:cache-performance', []],
|
|
56
|
+
['python-sdk:real-smoke', []],
|
|
52
57
|
['codex:0.134-runner-truth', []],
|
|
53
58
|
['agent:real-codex-patch-envelope-smoke', []],
|
|
54
59
|
['agent:real-codex-parallel-workers', []],
|
|
@@ -65,7 +65,7 @@ const sourceOk = source.includes("action', 'new-pane'")
|
|
|
65
65
|
&& source.includes('zellij_worker_list_panes')
|
|
66
66
|
&& source.includes('provider_context');
|
|
67
67
|
const ok = artifact.ok
|
|
68
|
-
&& artifact.pane_name === 'slot-001/gen-7 · codex-sdk · fast · codex-lb'
|
|
68
|
+
&& artifact.pane_name === 'slot-001/gen-7 · codex-sdk · fast · codex-lb · running'
|
|
69
69
|
&& artifact.pane_kind === 'worker_codex_sdk'
|
|
70
70
|
&& artifact.provider === 'codex-lb'
|
|
71
71
|
&& artifact.service_tier === 'fast'
|