sneakoscope 2.0.15 → 2.0.17
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 +5 -3
- 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/cli/command-registry.js +1 -1
- package/dist/commands/proof.js +21 -0
- package/dist/commands/zellij-slot-pane.js +7 -1
- package/dist/core/agents/agent-orchestrator.js +68 -3
- package/dist/core/agents/agent-scheduler.js +217 -86
- package/dist/core/agents/agent-schema.js +1 -1
- package/dist/core/agents/native-cli-session-swarm.js +97 -27
- package/dist/core/agents/native-cli-worker.js +56 -7
- package/dist/core/agents/parallel-runtime-proof.js +276 -0
- package/dist/core/agents/runtime-proof-summary.js +75 -0
- package/dist/core/codex-control/codex-task-runner.js +32 -4
- package/dist/core/codex-control/model-call-concurrency.js +106 -0
- package/dist/core/commands/naruto-command.js +65 -8
- package/dist/core/commands/team-command.js +6 -487
- package/dist/core/commands/team-legacy-observe-command.js +182 -0
- package/dist/core/db-safety.js +49 -6
- package/dist/core/feature-registry.js +4 -2
- package/dist/core/fsx.js +1 -1
- package/dist/core/git/git-worktree-capability.js +18 -0
- package/dist/core/git/git-worktree-manager.js +80 -0
- package/dist/core/git/git-worktree-pool.js +4 -0
- package/dist/core/hooks-runtime.js +41 -4
- package/dist/core/init.js +1 -0
- package/dist/core/mad-db/mad-db-capability.js +42 -2
- package/dist/core/mad-db/mad-db-ledger.js +14 -0
- package/dist/core/mad-db/mad-db-policy-resolver.js +2 -0
- package/dist/core/mad-db/mad-db-result-lifecycle.js +136 -0
- package/dist/core/naruto/naruto-concurrency-governor.js +14 -1
- package/dist/core/release/release-gate-affected-selector.js +47 -5
- package/dist/core/release/release-gate-dag.js +5 -1
- package/dist/core/release/release-gate-scheduler.js +2 -1
- package/dist/core/routes.js +3 -1
- package/dist/core/version.js +1 -1
- package/dist/core/zellij/zellij-slot-pane-renderer.js +74 -1
- package/dist/core/zellij/zellij-slot-telemetry.js +81 -3
- package/dist/core/zellij/zellij-ui-mode.js +12 -2
- package/dist/scripts/prepublish-release-check-or-fast.js +3 -3
- package/dist/scripts/release-speed-summary.js +23 -1
- package/package.json +38 -3
- package/schemas/agents/parallel-runtime-proof.schema.json +79 -0
|
@@ -19,6 +19,7 @@ import { buildNarutoGptFinalPack } from '../naruto/naruto-gpt-final-pack.js';
|
|
|
19
19
|
import { planNarutoZellijDashboard } from '../zellij/zellij-naruto-dashboard.js';
|
|
20
20
|
import { checkPromptPlaceholders } from '../prompt/prompt-placeholder-guard.js';
|
|
21
21
|
import { evaluateGitWorktreeCapability } from '../git/git-worktree-capability.js';
|
|
22
|
+
import { buildRuntimeProofSummary, renderRuntimeProofSummary } from '../agents/runtime-proof-summary.js';
|
|
22
23
|
const NARUTO_RESULT_SCHEMA = 'sks.naruto-command-result.v1';
|
|
23
24
|
const NARUTO_ROUTE = '$Naruto';
|
|
24
25
|
// $Naruto — Shadow Clone Swarm (影分身 / Kage Bunshin no Jutsu).
|
|
@@ -37,6 +38,8 @@ export async function narutoCommand(commandOrArgs = 'naruto', maybeArgs = []) {
|
|
|
37
38
|
return narutoDashboard(parsed);
|
|
38
39
|
if (parsed.action === 'workers')
|
|
39
40
|
return narutoWorkers(parsed);
|
|
41
|
+
if (parsed.action === 'proof')
|
|
42
|
+
return narutoProof(parsed);
|
|
40
43
|
return narutoRun(parsed);
|
|
41
44
|
}
|
|
42
45
|
async function narutoRun(parsed) {
|
|
@@ -165,10 +168,12 @@ async function narutoRun(parsed) {
|
|
|
165
168
|
requestedClones: roster.agent_count,
|
|
166
169
|
totalWorkItems: workGraph.total_work_items,
|
|
167
170
|
pendingWorkQueueSize: workGraph.total_work_items,
|
|
168
|
-
backend: schedulerBackend
|
|
171
|
+
backend: schedulerBackend,
|
|
172
|
+
parallelismMode: parsed.parallelism
|
|
169
173
|
});
|
|
170
174
|
const backendMinimum = schedulerBackend === 'fake' ? roster.agent_count : Math.min(roster.agent_count, 2);
|
|
171
|
-
const
|
|
175
|
+
const activeCap = parsed.parallelism === 'safe' ? safe.cap : MAX_NARUTO_AGENT_COUNT;
|
|
176
|
+
const activeSlots = Math.max(1, Math.min(roster.agent_count, parsed.concurrency || Math.max(governor.safe_active_workers, backendMinimum), activeCap));
|
|
172
177
|
const zellijVisiblePanes = Math.max(1, Math.min(activeSlots, governor.safe_zellij_visible_panes));
|
|
173
178
|
const activePool = await runNarutoActivePool({ graph: workGraph, governor: { ...governor, safe_active_workers: activeSlots } });
|
|
174
179
|
const runPreRunSmoke = parsed.smoke === true || process.env.SKS_NARUTO_PRE_RUN_SMOKE === '1';
|
|
@@ -281,6 +286,20 @@ async function narutoRun(parsed) {
|
|
|
281
286
|
prompt: parsed.prompt
|
|
282
287
|
});
|
|
283
288
|
let liveZellij = null;
|
|
289
|
+
if (!parsed.json) {
|
|
290
|
+
console.log('$Naruto starting:');
|
|
291
|
+
console.log(' clones requested: ' + roster.agent_count);
|
|
292
|
+
console.log(' work items: ' + workGraph.total_work_items);
|
|
293
|
+
console.log(' target active workers: ' + activeSlots);
|
|
294
|
+
console.log(' visible panes: ' + zellijVisiblePanes);
|
|
295
|
+
console.log(' headless workers: ' + Math.max(0, activeSlots - zellijVisiblePanes));
|
|
296
|
+
console.log(' backend: ' + schedulerBackend);
|
|
297
|
+
console.log(' parallelism mode: ' + parsed.parallelism);
|
|
298
|
+
if (activeSlots < roster.agent_count)
|
|
299
|
+
console.log(' cap reasons: ' + (governor.reasons.join(', ') || 'host safety cap'));
|
|
300
|
+
if (parsed.parallelism !== 'safe' && activeSlots < 10)
|
|
301
|
+
console.log(' warning: active workers below 10 in non-safe mode');
|
|
302
|
+
}
|
|
284
303
|
if (!parsed.json && !parsed.mock && !parsed.noOpenZellij) {
|
|
285
304
|
liveZellij = await launchZellijLayout({
|
|
286
305
|
root,
|
|
@@ -356,8 +375,11 @@ async function narutoRun(parsed) {
|
|
|
356
375
|
narutoRebalancePolicy: rebalancePolicy,
|
|
357
376
|
json: parsed.json
|
|
358
377
|
});
|
|
378
|
+
const parallelRuntime = result.parallel_runtime_proof || null;
|
|
359
379
|
const nativeProofOk = result.proof?.ok === true || result.proof?.status === 'passed';
|
|
360
380
|
const finalAccepted = result.proof?.status === 'passed' || result.proof?.gpt_final_status === 'approved';
|
|
381
|
+
const parallelRuntimeOk = !parsed.mock || roster.agent_count < 16 || (parallelRuntime?.passed === true
|
|
382
|
+
&& Number(parallelRuntime.max_observed_active_workers || 0) >= Math.min(16, activeSlots));
|
|
361
383
|
await writeJsonAtomic(path.join(mission.dir, 'naruto-gate.json'), {
|
|
362
384
|
schema: 'sks.naruto-gate.v1',
|
|
363
385
|
passed: result.ok === true && nativeProofOk && finalAccepted,
|
|
@@ -374,9 +396,10 @@ async function narutoRun(parsed) {
|
|
|
374
396
|
gpt_final_pack_ready: true,
|
|
375
397
|
zellij_dashboard_ready: zellijDashboard.ok === true,
|
|
376
398
|
native_agent_proof: nativeProofOk,
|
|
399
|
+
parallel_runtime_proof: parallelRuntimeOk,
|
|
377
400
|
final_arbiter_accepted: finalAccepted,
|
|
378
401
|
session_cleanup: result.proof?.all_sessions_closed === true || nativeProofOk,
|
|
379
|
-
blockers: result.proof?.blockers || [],
|
|
402
|
+
blockers: [...(result.proof?.blockers || []), ...(parallelRuntimeOk ? [] : ['naruto_parallel_runtime_proof_below_gate'])],
|
|
380
403
|
updated_at: nowIso()
|
|
381
404
|
});
|
|
382
405
|
await setCurrent(root, {
|
|
@@ -442,6 +465,15 @@ async function narutoRun(parsed) {
|
|
|
442
465
|
worker_lifecycle_sample: realActivePoolSmoke.worker_lifecycle.slice(0, 5)
|
|
443
466
|
}
|
|
444
467
|
},
|
|
468
|
+
parallel_runtime: parallelRuntime ? {
|
|
469
|
+
proof_path: path.join(result.ledger_root || '', 'parallel-runtime-proof.json'),
|
|
470
|
+
max_observed_active_workers: parallelRuntime.max_observed_active_workers,
|
|
471
|
+
unique_worker_pids: parallelRuntime.unique_worker_pids,
|
|
472
|
+
speedup_ratio: parallelRuntime.speedup_ratio,
|
|
473
|
+
visible_panes: parallelRuntime.visible_panes,
|
|
474
|
+
headless_workers: parallelRuntime.headless_workers,
|
|
475
|
+
passed: parallelRuntime.passed
|
|
476
|
+
} : null,
|
|
445
477
|
local_worker: localWorkerSummary,
|
|
446
478
|
proof: result.proof?.status || 'missing',
|
|
447
479
|
run: compactNarutoRunResult(result),
|
|
@@ -455,6 +487,13 @@ async function narutoRun(parsed) {
|
|
|
455
487
|
console.log('Backend: ' + result.backend);
|
|
456
488
|
console.log('Roles: ' + roleDistribution.entries.map((entry) => `${entry.role}:${entry.count}`).join(', '));
|
|
457
489
|
console.log('Proof: ' + summary.proof);
|
|
490
|
+
if (summary.parallel_runtime) {
|
|
491
|
+
console.log('$Naruto parallel proof:');
|
|
492
|
+
console.log(' max active workers: ' + summary.parallel_runtime.max_observed_active_workers);
|
|
493
|
+
console.log(' unique PIDs: ' + summary.parallel_runtime.unique_worker_pids);
|
|
494
|
+
console.log(' speedup: ' + summary.parallel_runtime.speedup_ratio + 'x');
|
|
495
|
+
console.log(' result: ' + (summary.parallel_runtime.passed ? 'passed' : 'blocked'));
|
|
496
|
+
}
|
|
458
497
|
if (summary.zellij?.ok && summary.zellij.capability?.status === 'ok')
|
|
459
498
|
console.log('Zellij: prepared ' + zellijVisiblePanes + ' visible active clone lane(s) in ' + summary.zellij.session_name + '; dashboard tracks ' + Math.max(0, activeSlots - zellijVisiblePanes) + ' headless active worker(s)');
|
|
460
499
|
else if (summary.zellij?.ok)
|
|
@@ -666,6 +705,16 @@ async function narutoWorkers(parsed) {
|
|
|
666
705
|
console.log(`Active ${summary.active} · completed ${summary.completed} · failed ${summary.failed} · visible ${summary.visible_worker_panes.length} · headless ${summary.headless_workers.length}`);
|
|
667
706
|
});
|
|
668
707
|
}
|
|
708
|
+
async function narutoProof(parsed) {
|
|
709
|
+
const root = await sksRoot();
|
|
710
|
+
const id = parsed.missionId && parsed.missionId !== 'latest' ? parsed.missionId : await findLatestMission(root);
|
|
711
|
+
if (!id)
|
|
712
|
+
return emit(parsed, { schema: NARUTO_RESULT_SCHEMA, ok: false, action: 'proof', status: 'missing_mission' }, () => console.log('No Naruto mission found.'));
|
|
713
|
+
const summary = await buildRuntimeProofSummary(root, id);
|
|
714
|
+
return emit(parsed, { ...summary, action: 'proof' }, () => {
|
|
715
|
+
console.log(renderRuntimeProofSummary(summary));
|
|
716
|
+
});
|
|
717
|
+
}
|
|
669
718
|
async function narutoHelp(parsed) {
|
|
670
719
|
const help = {
|
|
671
720
|
schema: NARUTO_RESULT_SCHEMA,
|
|
@@ -675,7 +724,8 @@ async function narutoHelp(parsed) {
|
|
|
675
724
|
description: 'Shadow Clone Swarm: fan out up to ' + MAX_NARUTO_AGENT_COUNT + ' parallel clone sessions.',
|
|
676
725
|
usage: [
|
|
677
726
|
'sks naruto run "<task>" [--clones N] [--backend codex-sdk|fake|ollama] [--local-model|--no-ollama] [--work-items N] [--real] [--readonly] [--json]',
|
|
678
|
-
'sks naruto status [--mission <id>] [--json]'
|
|
727
|
+
'sks naruto status [--mission <id>] [--json]',
|
|
728
|
+
'sks naruto proof latest [--json]'
|
|
679
729
|
],
|
|
680
730
|
defaults: { clones: DEFAULT_NARUTO_CLONES, max_clones: MAX_NARUTO_AGENT_COUNT, backend: 'codex-sdk' }
|
|
681
731
|
};
|
|
@@ -690,7 +740,7 @@ function parseNarutoArgs(args = []) {
|
|
|
690
740
|
if (hasFlag(args, '--help') || hasFlag(args, '-h'))
|
|
691
741
|
args = ['help', ...args.filter((arg) => arg !== '--help' && arg !== '-h')];
|
|
692
742
|
const first = args[0] && !String(args[0]).startsWith('--') ? String(args[0]) : '';
|
|
693
|
-
const actions = new Set(['run', 'status', 'help', 'dashboard', 'workers']);
|
|
743
|
+
const actions = new Set(['run', 'status', 'help', 'dashboard', 'workers', 'proof']);
|
|
694
744
|
const action = (actions.has(first) ? first : 'run');
|
|
695
745
|
const rest = action === first ? args.slice(1) : args;
|
|
696
746
|
const json = hasFlag(args, '--json');
|
|
@@ -707,7 +757,7 @@ function parseNarutoArgs(args = []) {
|
|
|
707
757
|
const readonly = hasFlag(args, '--readonly') || hasFlag(args, '--read-only');
|
|
708
758
|
const writeModeRaw = String(readOption(args, '--write-mode', hasFlag(args, '--parallel-write') ? 'parallel' : '') || '');
|
|
709
759
|
const writeMode = (['proof-safe', 'parallel', 'serial', 'off'].includes(writeModeRaw) ? writeModeRaw : null);
|
|
710
|
-
const positionalMission = action === 'dashboard' || action === 'workers' || action === 'status'
|
|
760
|
+
const positionalMission = action === 'dashboard' || action === 'workers' || action === 'status' || action === 'proof'
|
|
711
761
|
? positionalArgs(rest, new Set()).find((arg) => /^latest$|^M-/.test(arg))
|
|
712
762
|
: null;
|
|
713
763
|
const missionId = String(readOption(args, '--mission', readOption(args, '--mission-id', positionalMission || 'latest')));
|
|
@@ -716,9 +766,16 @@ function parseNarutoArgs(args = []) {
|
|
|
716
766
|
const noOpenZellij = hasFlag(args, '--no-open-zellij') || hasFlag(args, '--no-zellij');
|
|
717
767
|
const attach = hasFlag(args, '--attach');
|
|
718
768
|
const smoke = hasFlag(args, '--smoke');
|
|
719
|
-
const
|
|
769
|
+
const parallelism = normalizeParallelism(readOption(args, '--parallelism', 'extreme'));
|
|
770
|
+
const valueFlags = new Set(['--clones', '--agents', '--work-items', '--concurrency', '--target-active-slots', '--backend', '--write-mode', '--mission', '--mission-id', '--ollama-model', '--local-model-model', '--ollama-base-url', '--local-model-base-url', '--parallelism']);
|
|
720
771
|
const prompt = positionalArgs(rest, valueFlags).join(' ').trim() || 'Naruto shadow clone swarm run';
|
|
721
|
-
return { action, prompt, clones, workItems, concurrency, backend, backendExplicit, mock, real, readonly, ollamaEnabled: useOllama && !noOllama, noOllama, ollamaModel, ollamaBaseUrl, writeMode, json, missionId, noOpenZellij, attach, smoke };
|
|
772
|
+
return { action, prompt, clones, workItems, concurrency, backend, backendExplicit, mock, real, readonly, ollamaEnabled: useOllama && !noOllama, noOllama, ollamaModel, ollamaBaseUrl, writeMode, json, missionId, noOpenZellij, attach, smoke, parallelism };
|
|
773
|
+
}
|
|
774
|
+
function normalizeParallelism(value) {
|
|
775
|
+
const text = String(value || 'extreme').toLowerCase();
|
|
776
|
+
if (text === 'safe' || text === 'balanced' || text === 'extreme')
|
|
777
|
+
return text;
|
|
778
|
+
return 'extreme';
|
|
722
779
|
}
|
|
723
780
|
async function writeNarutoArtifacts(ledgerRoot, artifacts) {
|
|
724
781
|
await writeJsonAtomic(path.join(ledgerRoot, 'naruto-work-graph.json'), artifacts.workGraph);
|