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.
Files changed (46) hide show
  1. package/README.md +5 -3
  2. package/crates/sks-core/Cargo.lock +1 -1
  3. package/crates/sks-core/Cargo.toml +1 -1
  4. package/crates/sks-core/src/main.rs +1 -1
  5. package/dist/.sks-build-stamp.json +4 -4
  6. package/dist/bin/sks.js +1 -1
  7. package/dist/cli/command-registry.js +1 -1
  8. package/dist/commands/proof.js +21 -0
  9. package/dist/commands/zellij-slot-pane.js +7 -1
  10. package/dist/core/agents/agent-orchestrator.js +68 -3
  11. package/dist/core/agents/agent-scheduler.js +217 -86
  12. package/dist/core/agents/agent-schema.js +1 -1
  13. package/dist/core/agents/native-cli-session-swarm.js +97 -27
  14. package/dist/core/agents/native-cli-worker.js +56 -7
  15. package/dist/core/agents/parallel-runtime-proof.js +276 -0
  16. package/dist/core/agents/runtime-proof-summary.js +75 -0
  17. package/dist/core/codex-control/codex-task-runner.js +32 -4
  18. package/dist/core/codex-control/model-call-concurrency.js +106 -0
  19. package/dist/core/commands/naruto-command.js +65 -8
  20. package/dist/core/commands/team-command.js +6 -487
  21. package/dist/core/commands/team-legacy-observe-command.js +182 -0
  22. package/dist/core/db-safety.js +49 -6
  23. package/dist/core/feature-registry.js +4 -2
  24. package/dist/core/fsx.js +1 -1
  25. package/dist/core/git/git-worktree-capability.js +18 -0
  26. package/dist/core/git/git-worktree-manager.js +80 -0
  27. package/dist/core/git/git-worktree-pool.js +4 -0
  28. package/dist/core/hooks-runtime.js +41 -4
  29. package/dist/core/init.js +1 -0
  30. package/dist/core/mad-db/mad-db-capability.js +42 -2
  31. package/dist/core/mad-db/mad-db-ledger.js +14 -0
  32. package/dist/core/mad-db/mad-db-policy-resolver.js +2 -0
  33. package/dist/core/mad-db/mad-db-result-lifecycle.js +136 -0
  34. package/dist/core/naruto/naruto-concurrency-governor.js +14 -1
  35. package/dist/core/release/release-gate-affected-selector.js +47 -5
  36. package/dist/core/release/release-gate-dag.js +5 -1
  37. package/dist/core/release/release-gate-scheduler.js +2 -1
  38. package/dist/core/routes.js +3 -1
  39. package/dist/core/version.js +1 -1
  40. package/dist/core/zellij/zellij-slot-pane-renderer.js +74 -1
  41. package/dist/core/zellij/zellij-slot-telemetry.js +81 -3
  42. package/dist/core/zellij/zellij-ui-mode.js +12 -2
  43. package/dist/scripts/prepublish-release-check-or-fast.js +3 -3
  44. package/dist/scripts/release-speed-summary.js +23 -1
  45. package/package.json +38 -3
  46. 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 activeSlots = Math.max(1, Math.min(roster.agent_count, parsed.concurrency || Math.max(governor.safe_active_workers, backendMinimum), safe.cap));
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 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']);
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);