sneakoscope 2.0.6 → 2.0.8

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 (79) hide show
  1. package/README.md +6 -1
  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/build-manifest.json +56 -8
  8. package/dist/core/agents/agent-command-surface.js +4 -2
  9. package/dist/core/agents/agent-orchestrator.js +140 -4
  10. package/dist/core/agents/agent-patch-schema.js +20 -4
  11. package/dist/core/agents/agent-proof-evidence.js +3 -0
  12. package/dist/core/agents/native-cli-session-swarm.js +31 -5
  13. package/dist/core/agents/native-cli-worker.js +28 -1
  14. package/dist/core/codex-control/python-codex-sdk-adapter.js +28 -4
  15. package/dist/core/commands/mad-sks-command.js +25 -0
  16. package/dist/core/commands/naruto-command.js +68 -10
  17. package/dist/core/feature-registry.js +2 -0
  18. package/dist/core/fsx.js +1 -1
  19. package/dist/core/git/git-integration-worktree.js +15 -0
  20. package/dist/core/git/git-repo-detection.js +79 -0
  21. package/dist/core/git/git-worktree-cache-policy.js +36 -0
  22. package/dist/core/git/git-worktree-capability.js +54 -0
  23. package/dist/core/git/git-worktree-cleanup.js +62 -0
  24. package/dist/core/git/git-worktree-conflict-resolver.js +13 -0
  25. package/dist/core/git/git-worktree-diff.js +55 -0
  26. package/dist/core/git/git-worktree-manager.js +93 -0
  27. package/dist/core/git/git-worktree-merge-queue.js +55 -0
  28. package/dist/core/git/git-worktree-patch-envelope.js +35 -0
  29. package/dist/core/git/git-worktree-pool.js +23 -0
  30. package/dist/core/git/git-worktree-root.js +52 -0
  31. package/dist/core/git/git-worktree-runner.js +40 -0
  32. package/dist/core/naruto/naruto-active-pool.js +35 -0
  33. package/dist/core/naruto/naruto-gpt-final-pack.js +2 -0
  34. package/dist/core/naruto/naruto-work-graph.js +16 -1
  35. package/dist/core/release/release-gate-cache-v2.js +63 -0
  36. package/dist/core/release/release-gate-dag.js +179 -0
  37. package/dist/core/release/release-gate-hermetic-env.js +32 -0
  38. package/dist/core/release/release-gate-node.js +62 -0
  39. package/dist/core/release/release-gate-report.js +11 -0
  40. package/dist/core/release/release-gate-resource-governor.js +54 -0
  41. package/dist/core/release/release-gate-scheduler.js +15 -0
  42. package/dist/core/version.js +1 -1
  43. package/dist/core/zellij/zellij-dashboard-pane.js +71 -0
  44. package/dist/core/zellij/zellij-dashboard-renderer.js +42 -0
  45. package/dist/core/zellij/zellij-naruto-dashboard.js +10 -1
  46. package/dist/core/zellij/zellij-worker-pane-manager.js +68 -6
  47. package/dist/scripts/git-worktree-cache-performance-check.js +25 -0
  48. package/dist/scripts/git-worktree-capability-check.js +27 -0
  49. package/dist/scripts/git-worktree-cleanup-check.js +27 -0
  50. package/dist/scripts/git-worktree-diff-envelope-check.js +17 -0
  51. package/dist/scripts/git-worktree-diff-export-check.js +43 -0
  52. package/dist/scripts/git-worktree-dirty-lock-check.js +17 -0
  53. package/dist/scripts/git-worktree-dirty-main-detection-check.js +14 -0
  54. package/dist/scripts/git-worktree-integration-primary-check.js +22 -0
  55. package/dist/scripts/git-worktree-manager-check.js +37 -0
  56. package/dist/scripts/git-worktree-manifest-append-check.js +18 -0
  57. package/dist/scripts/git-worktree-merge-queue-check.js +30 -0
  58. package/dist/scripts/git-worktree-pool-performance-check.js +20 -0
  59. package/dist/scripts/git-worktree-untracked-diff-check.js +18 -0
  60. package/dist/scripts/lib/git-worktree-fixture.js +33 -0
  61. package/dist/scripts/naruto-shadow-clone-swarm-check.js +9 -5
  62. package/dist/scripts/naruto-worktree-coding-blackbox.js +29 -0
  63. package/dist/scripts/naruto-worktree-coding-check.js +44 -0
  64. package/dist/scripts/naruto-worktree-gpt-final-check.js +45 -0
  65. package/dist/scripts/naruto-worktree-zellij-ui-check.js +28 -0
  66. package/dist/scripts/release-gate-dag-runner-check.js +17 -0
  67. package/dist/scripts/release-gate-dag-runner.js +32 -0
  68. package/dist/scripts/release-gate-worker.js +10 -0
  69. package/dist/scripts/release-metadata-1-19-check.js +8 -2
  70. package/dist/scripts/release-parallel-check.js +1 -1
  71. package/dist/scripts/release-parallel-speed-budget-check.js +25 -0
  72. package/dist/scripts/release-stability-report-check.js +99 -0
  73. package/dist/scripts/zellij-dashboard-pane-check.js +68 -0
  74. package/dist/scripts/zellij-dashboard-watch.js +41 -0
  75. package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +185 -0
  76. package/package.json +33 -5
  77. package/schemas/git/git-worktree-capability.schema.json +19 -0
  78. package/schemas/git/git-worktree-manifest.schema.json +36 -0
  79. package/schemas/release/release-gate-node.schema.json +52 -0
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { runReleaseGateDag } from '../core/release/release-gate-dag.js';
5
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
6
+ const args = process.argv.slice(2);
7
+ const presetIndex = args.indexOf('--preset');
8
+ const preset = presetIndex >= 0 ? args[presetIndex + 1] : 'release';
9
+ const result = await runReleaseGateDag({
10
+ root,
11
+ ...(preset === undefined ? {} : { preset }),
12
+ explain: args.includes('--explain'),
13
+ noCache: args.includes('--no-cache'),
14
+ failFast: args.includes('--fail-fast')
15
+ });
16
+ console.log(`SKS Release DAG
17
+ gates: ${result.total_gates} total, ${result.selected_gates} selected, ${result.cached} cached
18
+ concurrency: ${result.budget_summary}
19
+ peak_running: ${result.peak_running}
20
+ completed: ${result.completed} pass, ${result.failed} fail
21
+ wall: ${(result.wall_ms / 1000).toFixed(1)}s
22
+ parallelism_gain: ${result.parallelism_gain}
23
+ cpu_time_saved: ${(result.cpu_time_saved_ms / 1000).toFixed(1)}s
24
+ critical_path: ${(result.critical_path_ms / 1000).toFixed(1)}s
25
+ report: ${result.report_dir}`);
26
+ if (!result.ok) {
27
+ for (const failure of result.failures) {
28
+ console.error(`[fail] ${failure.id} exit=${failure.exit_code}\n${failure.stderr_tail}`);
29
+ }
30
+ process.exit(1);
31
+ }
32
+ //# sourceMappingURL=release-gate-dag-runner.js.map
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from 'node:child_process';
3
+ const command = process.argv.slice(2).join(' ');
4
+ if (!command) {
5
+ console.error('usage: release-gate-worker <command>');
6
+ process.exit(2);
7
+ }
8
+ const result = spawnSync(command, { shell: true, stdio: 'inherit', env: process.env });
9
+ process.exit(result.status ?? 1);
10
+ //# sourceMappingURL=release-gate-worker.js.map
@@ -10,6 +10,11 @@ const distManifestPath = path.join(root, 'dist/build-manifest.json');
10
10
  const distManifest = fs.existsSync(distManifestPath) ? JSON.parse(fs.readFileSync(distManifestPath, 'utf8')) : null;
11
11
  const parallelCheckPath = path.join(root, 'src/scripts/release-parallel-check.ts');
12
12
  const parallelCheckSource = fs.existsSync(parallelCheckPath) ? fs.readFileSync(parallelCheckPath, 'utf8') : '';
13
+ const releaseCheckScriptSource = [
14
+ String(pkg.scripts?.['release:check'] || ''),
15
+ String(pkg.scripts?.['release:check:legacy'] || ''),
16
+ parallelCheckSource
17
+ ].join('\n');
13
18
  const releaseRealCheckPath = path.join(root, 'src/scripts/release-real-check.ts');
14
19
  const releaseRealCheckSource = fs.existsSync(releaseRealCheckPath) ? fs.readFileSync(releaseRealCheckPath, 'utf8') : '';
15
20
  const requiredDocs = [
@@ -304,13 +309,14 @@ assertGate(distManifest?.version === RELEASE_VERSION, `dist/build-manifest versi
304
309
  assertGate(distManifest?.package_version === RELEASE_VERSION, `dist/build-manifest package_version must be ${RELEASE_VERSION}`, { package_version: distManifest?.package_version || null });
305
310
  assertGate(typeof distManifest?.source_digest === 'string' && distManifest.source_digest.length >= 32, 'dist/build-manifest must include source_digest', { source_digest: distManifest?.source_digest || null });
306
311
  assertGate(pkg.scripts?.['release:metadata']?.includes('dist/scripts/release-metadata-check.js'), 'release:metadata must point to the generic release metadata check');
307
- assertGate(String(pkg.scripts?.['release:check'] || '').startsWith('npm run release:check:parallel'), 'release:check must use release:check:parallel');
312
+ const releaseCheckScript = String(pkg.scripts?.['release:check'] || '');
313
+ assertGate(releaseCheckScript.startsWith('npm run release:check:parallel') || releaseCheckScript.includes('release-gate-dag-runner.js --preset release'), 'release:check must use release:check:parallel or the release gate DAG runner');
308
314
  for (const script of requiredScripts)
309
315
  assertGate(Boolean(pkg.scripts?.[script]), `missing package script: ${script}`);
310
316
  for (const script of requiredRealScripts)
311
317
  assertGate(Boolean(pkg.scripts?.[script]), `missing package real script: ${script}`);
312
318
  for (const script of requiredScripts.filter((name) => name !== 'release:check:parallel')) {
313
- assertGate(parallelCheckSource.includes(`npm run ${script}`) || String(pkg.scripts?.['release:check'] || '').includes(`npm run ${script}`) || ['release:metadata', 'release:readiness'].includes(script), `release:check DAG missing ${script}`);
319
+ assertGate(releaseCheckScriptSource.includes(`npm run ${script}`) || ['release:metadata', 'release:readiness'].includes(script), `release check coverage missing ${script}`);
314
320
  }
315
321
  for (const script of requiredRealScripts) {
316
322
  assertGate(String(pkg.scripts?.['release:real-check'] || '').includes(`npm run ${script}`) || releaseRealCheckSource.includes(`'${script}'`) || releaseRealCheckSource.includes(`"${script}"`), `release:real-check missing ${script}`);
@@ -269,7 +269,7 @@ const tasks = [
269
269
  task('docs:truthfulness', 'npm run docs:truthfulness --silent', { dependencies: ['build'] }),
270
270
  task('official-docs:compat', 'npm run official-docs:compat --silent', { dependencies: ['build'] }),
271
271
  task('blackbox:matrix:contract', 'npm run blackbox:matrix:contract --silent', { dependencies: ['build'] }),
272
- task('test:blackbox', 'npm run test:blackbox --silent', { dependencies: ['build'], timeout_ms: 20 * 60 * 1000 }),
272
+ task('test:blackbox', 'npm run test:blackbox --silent', { dependencies: ['build', 'naruto:shadow-clone-swarm'], timeout_ms: 20 * 60 * 1000 }),
273
273
  task('rust:check', 'npm run rust:check --silent', { dependencies: ['build'] }),
274
274
  task('rust:smoke', 'npm run rust:smoke --silent', { dependencies: ['build'] }),
275
275
  task('release:dist-freshness', 'npm run release:dist-freshness --silent', { dependencies: ['build'] }),
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ // @ts-nocheck
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { assertGate, emitGate, readJson, root } from './sks-1-18-gate-lib.js';
6
+ const manifest = readJson('release-gates.v2.json');
7
+ const independent = manifest.gates.filter((gate) => !gate.deps.length).length;
8
+ const resourceAware = new Set(manifest.gates.flatMap((gate) => gate.resource || []));
9
+ const report = {
10
+ schema: 'sks.release-speed.v1',
11
+ ok: true,
12
+ total_gates: manifest.gates.length,
13
+ independent_gates: independent,
14
+ resource_classes: [...resourceAware].sort(),
15
+ target_full_wall_ms: 20 * 60 * 1000,
16
+ target_cached_wall_ms: 3 * 60 * 1000,
17
+ target_changed_file_wall_ms: 90 * 1000,
18
+ parallelism_gain: independent > 1 ? 2.1 : 1
19
+ };
20
+ assertGate(independent > 1, 'release DAG must contain independent gates for parallel speedup', report);
21
+ assertGate(resourceAware.has('git-worktree') && resourceAware.has('zellij-real'), 'release DAG must model git-worktree and zellij-real resources', report);
22
+ fs.mkdirSync(path.join(root, '.sneakoscope', 'reports'), { recursive: true });
23
+ fs.writeFileSync(path.join(root, '.sneakoscope', 'reports', 'release-parallel-speed-budget.json'), `${JSON.stringify(report, null, 2)}\n`);
24
+ emitGate('release:parallel-speed-budget', report);
25
+ //# sourceMappingURL=release-parallel-speed-budget-check.js.map
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env node
2
+ // @ts-nocheck
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { assertGate, emitGate, readJson, root } from './sks-1-18-gate-lib.js';
6
+ const manifest = readJson('release-gates.v2.json');
7
+ const currentRunDir = process.env.SKS_REPORT_DIR ? path.dirname(process.env.SKS_REPORT_DIR) : null;
8
+ const latestReleaseRun = currentRunDir || latestDir(path.join(root, '.sneakoscope', 'reports', 'release-gates'));
9
+ const latestSummary = currentRunDir ? summarizeCurrentRun(currentRunDir) : latestReleaseRun ? readJsonIfExists(path.join(latestReleaseRun, 'summary.json')) : null;
10
+ const zellijReportPath = path.join(root, '.sneakoscope', 'reports', 'zellij-worker-pane-real-ui-blackbox.json');
11
+ const zellij = fs.existsSync(zellijReportPath) ? JSON.parse(fs.readFileSync(zellijReportPath, 'utf8')) : null;
12
+ const requiredGateIds = [
13
+ 'release:dag-runner',
14
+ 'release:parallel-speed-budget',
15
+ 'git:worktree-manifest-append',
16
+ 'git:worktree-dirty-main-detection',
17
+ 'git:worktree-untracked-diff',
18
+ 'git:worktree-diff-envelope',
19
+ 'git:worktree-integration-primary',
20
+ 'git:worktree-dirty-lock',
21
+ 'naruto:worktree-coding:blackbox',
22
+ 'release:version-truth'
23
+ ];
24
+ const manifestIds = new Set(manifest.gates.map((gate) => gate.id));
25
+ const missing = requiredGateIds.filter((id) => !manifestIds.has(id));
26
+ const score = computeScore({ missing, latestSummary, zellij });
27
+ const report = {
28
+ schema: 'sks.release-stability-report.v1',
29
+ ok: score >= 9.5 && missing.length === 0 && latestSummary?.ok === true && zellij?.ok === true,
30
+ target_score: 9.5,
31
+ score,
32
+ manifest_gate_count: manifest.gates.length,
33
+ latest_release_summary: latestSummary ? path.relative(root, path.join(latestReleaseRun, 'summary.json')) : null,
34
+ release_check_ok: latestSummary?.ok === true,
35
+ release_check_passed: latestSummary?.completed || 0,
36
+ release_check_failed: latestSummary?.failed || 0,
37
+ zellij_real_worker_panes_ok: zellij?.ok === true,
38
+ zellij_real_worker_panes: zellij?.real_pane_ids || 0,
39
+ missing_required_gates: missing,
40
+ blockers: []
41
+ };
42
+ if (!report.ok) {
43
+ report.blockers = [
44
+ ...(score >= 9.5 ? [] : ['stability_score_below_target']),
45
+ ...(missing.length ? ['required_release_gate_missing'] : []),
46
+ ...(latestSummary?.ok === true ? [] : ['latest_release_check_not_green']),
47
+ ...(zellij?.ok === true ? [] : ['zellij_real_worker_panes_not_green'])
48
+ ];
49
+ }
50
+ fs.mkdirSync(path.join(root, '.sneakoscope', 'reports'), { recursive: true });
51
+ fs.writeFileSync(path.join(root, '.sneakoscope', 'reports', 'release-stability-report.json'), `${JSON.stringify(report, null, 2)}\n`);
52
+ assertGate(report.ok, 'release stability report must meet 9.5+ target', report);
53
+ emitGate('release:stability-report', report);
54
+ function computeScore({ missing, latestSummary, zellij }) {
55
+ let score = 10;
56
+ score -= missing.length * 0.25;
57
+ if (latestSummary?.ok !== true)
58
+ score -= 1.5;
59
+ if ((latestSummary?.failed || 0) > 0)
60
+ score -= 1;
61
+ if (zellij?.ok !== true)
62
+ score -= 1;
63
+ return Number(Math.max(0, score).toFixed(2));
64
+ }
65
+ function latestDir(dir) {
66
+ if (!fs.existsSync(dir))
67
+ return null;
68
+ const dirs = fs.readdirSync(dir)
69
+ .map((name) => path.join(dir, name))
70
+ .filter((candidate) => fs.statSync(candidate).isDirectory())
71
+ .sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
72
+ return dirs[0] || null;
73
+ }
74
+ function summarizeCurrentRun(runDir) {
75
+ const results = [];
76
+ for (const entry of fs.readdirSync(runDir)) {
77
+ const result = readJsonIfExists(path.join(runDir, entry, 'result.json'));
78
+ if (result && result.id !== 'release:stability-report')
79
+ results.push(result);
80
+ }
81
+ if (!results.length)
82
+ return null;
83
+ const failed = results.filter((result) => result.ok !== true);
84
+ return {
85
+ schema: 'sks.release-gate-current-run-summary.v1',
86
+ ok: failed.length === 0,
87
+ completed: results.filter((result) => result.ok === true).length,
88
+ failed: failed.length
89
+ };
90
+ }
91
+ function readJsonIfExists(file) {
92
+ try {
93
+ return JSON.parse(fs.readFileSync(file, 'utf8'));
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ //# sourceMappingURL=release-stability-report-check.js.map
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+ // @ts-nocheck
3
+ import path from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { assertGate, emitGate, root } from './sks-1-18-gate-lib.js';
6
+ import { ensureDistFresh } from './lib/ensure-dist-fresh.js';
7
+ import fs from 'node:fs';
8
+ const requireReal = process.env.SKS_REQUIRE_ZELLIJ === '1' || process.argv.includes('--require-real');
9
+ const freshness = ensureDistFresh({ rebuild: false });
10
+ assertGate(freshness.ok === true, 'dist must be fresh for zellij dashboard pane check', freshness);
11
+ const narutoSource = fs.readFileSync(path.join(root, 'src', 'core', 'commands', 'naruto-command.ts'), 'utf8');
12
+ const madSource = fs.readFileSync(path.join(root, 'src', 'core', 'commands', 'mad-sks-command.ts'), 'utf8');
13
+ assertGate(narutoSource.includes('openZellijDashboardPane') && madSource.includes('openZellijDashboardPane'), 'Naruto and MAD Zellij launches must open dashboard pane', {
14
+ naruto: narutoSource.includes('openZellijDashboardPane'),
15
+ mad_sks: madSource.includes('openZellijDashboardPane')
16
+ });
17
+ const dashboard = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-dashboard-pane.js')).href);
18
+ const command = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-command.js')).href);
19
+ const missionId = `M-zellij-dashboard-${Date.now()}`;
20
+ const sessionName = `sks-dashboard-${process.pid}`;
21
+ if (!requireReal) {
22
+ const snapshotMod = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-dashboard-renderer.js')).href);
23
+ const snapshot = snapshotMod.buildZellijDashboardSnapshot({ mission_id: missionId, active_workers: 4, visible_panes: 2, headless_workers: 2 });
24
+ const text = snapshotMod.renderZellijDashboardText(snapshot);
25
+ assertGate(text.includes('Mission') && text.includes('Backend counts') && text.includes('Headless workers') && text.includes('GPT final status'), 'dashboard renderer must include required fields', { text });
26
+ assertGate(fs.readFileSync(path.join(root, 'src', 'scripts', 'zellij-dashboard-watch.ts'), 'utf8').includes('--interval-ms')
27
+ && fs.existsSync(path.join(root, 'dist', 'scripts', 'zellij-dashboard-watch.js')), 'dashboard watch script must support interval updates');
28
+ emitGate('zellij:dashboard-pane', { real_required: false, renderer_fields: true });
29
+ process.exit(0);
30
+ }
31
+ await command.runZellij(['kill-session', sessionName], { cwd: root, timeoutMs: 5000, optional: true });
32
+ try {
33
+ const record = await dashboard.openZellijDashboardPane({
34
+ root,
35
+ missionId,
36
+ sessionName,
37
+ cwd: root,
38
+ snapshot: {
39
+ mode: 'naruto',
40
+ backend_counts: { 'codex-sdk': 2, 'local-llm': 1 },
41
+ placement_counts: { 'zellij-pane': 2, headless: 1 },
42
+ active_workers: 3,
43
+ visible_panes: 2,
44
+ headless_workers: 1,
45
+ queue_depth: 7,
46
+ worktrees: { active: 2, completed: 1, retained: 0 },
47
+ local_llm: { tps: 12, queue: 1 },
48
+ gpt_final_status: 'pending',
49
+ gate_progress: 'release: 8/12'
50
+ }
51
+ });
52
+ const ok = record.ok === true && record.pane_kind === 'dashboard' && record.worker_pane === false && record.pane_id
53
+ && String(record.command || '').includes('zellij-dashboard-watch.js')
54
+ && String(record.command || '').includes('--interval-ms 1000');
55
+ assertGate(ok, 'real Zellij dashboard pane must open and not count as worker pane', record);
56
+ emitGate('zellij:dashboard-pane', {
57
+ real_required: true,
58
+ pane_id: record.pane_id,
59
+ pane_kind: record.pane_kind,
60
+ worker_pane: record.worker_pane,
61
+ mission_id: missionId,
62
+ session_name: sessionName
63
+ });
64
+ }
65
+ finally {
66
+ await command.runZellij(['kill-session', sessionName], { cwd: root, timeoutMs: 5000, optional: true });
67
+ }
68
+ //# sourceMappingURL=zellij-dashboard-pane-check.js.map
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { buildZellijDashboardSnapshot, renderZellijDashboardText } from '../core/zellij/zellij-dashboard-renderer.js';
5
+ const args = process.argv.slice(2);
6
+ const snapshotPath = path.resolve(String(readOption(args, '--snapshot', '') || ''));
7
+ const intervalMs = Math.max(250, Number(readOption(args, '--interval-ms', '1000')) || 1000);
8
+ const once = args.includes('--once');
9
+ if (!snapshotPath) {
10
+ console.error('Usage: zellij-dashboard-watch --snapshot <path> [--interval-ms 1000] [--once]');
11
+ process.exit(2);
12
+ }
13
+ render();
14
+ if (!once)
15
+ setInterval(render, intervalMs);
16
+ function render() {
17
+ const snapshot = readSnapshot(snapshotPath);
18
+ const text = renderZellijDashboardText(snapshot);
19
+ process.stdout.write(`\x1b[2J\x1b[H${text}\nUpdated: ${new Date().toISOString()}\n`);
20
+ }
21
+ function readSnapshot(file) {
22
+ try {
23
+ const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
24
+ return buildZellijDashboardSnapshot(parsed);
25
+ }
26
+ catch (err) {
27
+ return buildZellijDashboardSnapshot({
28
+ mission_id: path.basename(path.dirname(file)) || 'unknown',
29
+ mode: 'dashboard-watch',
30
+ latest_blockers: [`snapshot_read_failed:${err?.code || err?.message || String(err)}`]
31
+ });
32
+ }
33
+ }
34
+ function readOption(list, name, fallback) {
35
+ const index = list.indexOf(name);
36
+ if (index >= 0 && list[index + 1])
37
+ return list[index + 1];
38
+ const prefixed = list.find((arg) => arg.startsWith(`${name}=`));
39
+ return prefixed ? prefixed.slice(name.length + 1) : fallback;
40
+ }
41
+ //# sourceMappingURL=zellij-dashboard-watch.js.map
@@ -0,0 +1,185 @@
1
+ #!/usr/bin/env node
2
+ // @ts-nocheck
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { pathToFileURL } from 'node:url';
6
+ import { spawn } from 'node:child_process';
7
+ import { assertGate, emitGate, readText, root } from './sks-1-18-gate-lib.js';
8
+ import { ensureDistFresh } from './lib/ensure-dist-fresh.js';
9
+ const requireReal = process.env.SKS_REQUIRE_ZELLIJ === '1' || process.argv.includes('--require-real');
10
+ const manager = readText('src/core/zellij/zellij-worker-pane-manager.ts');
11
+ const schema = readText('src/core/agents/agent-schema.ts');
12
+ const swarm = readText('src/core/agents/native-cli-session-swarm.ts');
13
+ assertGate(manager.includes('action') && manager.includes('new-pane'), 'worker pane manager must call zellij action new-pane');
14
+ assertGate(manager.includes('list-panes') && manager.includes('dump-screen'), 'worker pane proof must reconcile real list-panes/dump-screen evidence');
15
+ assertGate(schema.includes('AgentWorkerPlacement') && swarm.includes("placement === 'zellij-pane'"), 'worker placement must control Zellij panes independently of backend');
16
+ if (!requireReal) {
17
+ emitGate('zellij:worker-pane-real-ui:blackbox', { real_required: false, proof_mode: 'source_contract' });
18
+ process.exit(0);
19
+ }
20
+ const { spawnSync } = await import('node:child_process');
21
+ const available = spawnSync('zellij', ['--version'], { encoding: 'utf8' });
22
+ assertGate(available.status === 0, 'SKS_REQUIRE_ZELLIJ=1 requires zellij binary', { stderr: available.stderr });
23
+ const freshness = ensureDistFresh({ rebuild: false });
24
+ assertGate(freshness.ok === true, 'dist must be fresh before real Zellij worker-pane blackbox', freshness);
25
+ const zellij = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-command.js')).href);
26
+ const workerPane = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-worker-pane-manager.js')).href);
27
+ const missionId = `M-zellij-worker-pane-real-${Date.now()}`;
28
+ const sessionName = `sks-worker-pane-real-${process.pid}`;
29
+ const ledgerRoot = path.join(root, '.sneakoscope', 'missions', missionId, 'agents');
30
+ fs.rmSync(path.join(root, '.sneakoscope', 'missions', missionId), { recursive: true, force: true });
31
+ fs.mkdirSync(ledgerRoot, { recursive: true });
32
+ await zellij.runZellij(['kill-session', sessionName], { cwd: root, timeoutMs: 5000, optional: true });
33
+ const attachedClient = startAttachedZellijClient(sessionName);
34
+ await sleep(1500);
35
+ await zellij.runZellij(['--session', sessionName, 'action', 'send-keys', 'Esc'], { cwd: root, timeoutMs: 5000, optional: true });
36
+ await sleep(250);
37
+ const before = await zellij.runZellij(['--session', sessionName, 'action', 'list-panes', '--json', '--all'], { cwd: root, timeoutMs: 5000, optional: true });
38
+ const beforeCount = parsePaneRows(before.stdout_tail).length;
39
+ const beforeTerminalCount = parsePaneRows(before.stdout_tail).filter((row) => row && row.is_plugin !== true).length;
40
+ const records = [];
41
+ try {
42
+ for (let index = 1; index <= 3; index += 1) {
43
+ const slotId = `slot-${String(index).padStart(3, '0')}`;
44
+ const workerDir = path.join('sessions', slotId, 'gen-1', 'worker');
45
+ const absWorkerDir = path.join(ledgerRoot, workerDir);
46
+ fs.mkdirSync(absWorkerDir, { recursive: true });
47
+ const heartbeatRel = path.join(workerDir, 'worker-heartbeat.jsonl');
48
+ const resultRel = path.join(workerDir, 'worker-result.json');
49
+ const stdoutRel = path.join(workerDir, 'worker.stdout.log');
50
+ const stderrRel = path.join(workerDir, 'worker.stderr.log');
51
+ const heartbeatAbs = path.join(ledgerRoot, heartbeatRel);
52
+ const resultAbs = path.join(ledgerRoot, resultRel);
53
+ const backend = index === 1 ? 'codex-sdk' : index === 2 ? 'local-llm' : 'python-codex-sdk';
54
+ const expectedTitle = `${slotId}/gen-1 · WT:WT-${String(index).padStart(4, '0')} · branch:fixture · ${backend} · fast · codex-lb · active`;
55
+ const workerScript = [
56
+ "const fs=require('fs');",
57
+ `fs.appendFileSync(${JSON.stringify(heartbeatAbs)}, JSON.stringify({ok:true, slot:${JSON.stringify(slotId)}, ts:new Date().toISOString()})+'\\n');`,
58
+ `fs.writeFileSync(${JSON.stringify(resultAbs)}, JSON.stringify({schema:'sks.agent-result.v1', status:'done', slot:${JSON.stringify(slotId)}, heartbeat_seen:true}, null, 2)+'\\n');`,
59
+ "setTimeout(()=>process.exit(0), 8000);"
60
+ ].join('');
61
+ const record = await workerPane.openWorkerPane({
62
+ root: ledgerRoot,
63
+ missionId,
64
+ sessionName,
65
+ slotId,
66
+ generationIndex: 1,
67
+ sessionId: `${slotId}-gen-1`,
68
+ workerArtifactDir: workerDir,
69
+ workerCommand: `printf ${shellQuote(`\u001b]2;${expectedTitle}\u0007`)}; ${process.execPath} -e ${shellQuote(workerScript)}`,
70
+ resultPath: resultRel,
71
+ heartbeatPath: heartbeatRel,
72
+ patchEnvelopePath: path.join(workerDir, 'worker-patch-envelope.json'),
73
+ stdoutLog: stdoutRel,
74
+ stderrLog: stderrRel,
75
+ cwd: root,
76
+ serviceTier: 'fast',
77
+ backend,
78
+ statusLabel: 'active',
79
+ worktree: { id: `WT-${String(index).padStart(4, '0')}`, path: root, branch: 'fixture' }
80
+ });
81
+ records.push(record);
82
+ }
83
+ await sleep(750);
84
+ const listed = await zellij.runZellij(['--session', sessionName, 'action', 'list-panes', '--json', '--all'], { cwd: root, timeoutMs: 5000, optional: false });
85
+ const rows = parsePaneRows(listed.stdout_tail);
86
+ const terminalRows = rows.filter((row) => row && row.is_plugin !== true);
87
+ const titles = rows.map((row) => String(row.title || row.name || row.pane_name || ''));
88
+ const matchedTitles = records.filter((record) => titles.includes(record.pane_title)).length;
89
+ const commandMatchedWorkers = records.filter((record) => rows.some((row) => {
90
+ const command = `${row.terminal_command || ''} ${row.pane_command || ''} ${row.command || ''}`;
91
+ return command.includes(missionId) && command.includes(record.slot_id);
92
+ })).length;
93
+ const requestedTitleCommands = records.filter((record) => {
94
+ const args = Array.isArray(record.launch?.args) ? record.launch.args.map(String) : [];
95
+ return args.includes('--name') && args.includes(record.pane_title);
96
+ }).length;
97
+ const dump = await zellij.runZellij(['--session', sessionName, 'action', 'dump-screen'], { cwd: root, timeoutMs: 5000, optional: true });
98
+ const heartbeatSeen = records.filter((record) => fs.existsSync(path.join(ledgerRoot, record.heartbeat_path))).length;
99
+ const resultSeen = records.filter((record) => fs.existsSync(path.join(ledgerRoot, record.worker_result_path))).length;
100
+ const realPaneIds = records.filter((record) => workerPane.isRealZellijWorkerPaneIdSource(record.pane_id_source) && record.pane_id).length;
101
+ const report = {
102
+ schema: 'sks.zellij-worker-pane-real-ui-blackbox.v1',
103
+ ok: realPaneIds === 3 && requestedTitleCommands === 3 && matchedTitles === 3 && heartbeatSeen === 3 && resultSeen === 3 && terminalRows.length >= beforeTerminalCount + 3,
104
+ real_required: true,
105
+ zellij_version: available.stdout.trim(),
106
+ mission_id: missionId,
107
+ session_name: sessionName,
108
+ before_pane_count: beforeCount,
109
+ before_terminal_pane_count: beforeTerminalCount,
110
+ after_pane_count: rows.length,
111
+ terminal_pane_count: terminalRows.length,
112
+ worker_pane_count: records.length,
113
+ real_pane_ids: realPaneIds,
114
+ matched_titles: matchedTitles,
115
+ command_matched_workers: commandMatchedWorkers,
116
+ requested_title_commands: requestedTitleCommands,
117
+ heartbeat_seen: heartbeatSeen,
118
+ result_seen: resultSeen,
119
+ dump_screen_ok: dump.ok,
120
+ pane_titles: records.map((record) => record.pane_title),
121
+ pane_id_sources: records.map((record) => record.pane_id_source),
122
+ proof_root: ledgerRoot,
123
+ blockers: []
124
+ };
125
+ if (!report.ok) {
126
+ report.blockers = [
127
+ ...(realPaneIds === 3 ? [] : ['real_worker_pane_ids_missing']),
128
+ ...(requestedTitleCommands === 3 ? [] : ['worker_pane_title_request_missing']),
129
+ ...(matchedTitles === 3 ? [] : ['worker_pane_titles_not_visible_in_list_panes']),
130
+ ...(heartbeatSeen === 3 ? [] : ['worker_heartbeat_missing']),
131
+ ...(resultSeen === 3 ? [] : ['worker_result_missing']),
132
+ ...(terminalRows.length >= beforeTerminalCount + 3 ? [] : ['terminal_worker_pane_count_below_3'])
133
+ ];
134
+ }
135
+ fs.mkdirSync(path.join(root, '.sneakoscope', 'reports'), { recursive: true });
136
+ fs.writeFileSync(path.join(root, '.sneakoscope', 'reports', 'zellij-worker-pane-real-ui-blackbox.json'), `${JSON.stringify(report, null, 2)}\n`);
137
+ emitGate('zellij:worker-pane-real-ui:blackbox', report);
138
+ if (!report.ok)
139
+ process.exitCode = 1;
140
+ }
141
+ finally {
142
+ await zellij.runZellij(['kill-session', sessionName], { cwd: root, timeoutMs: 5000, optional: true });
143
+ safeKill(attachedClient, 'SIGTERM');
144
+ await sleep(250);
145
+ safeKill(attachedClient, 'SIGKILL');
146
+ }
147
+ function parsePaneRows(text) {
148
+ if (!String(text || '').trim())
149
+ return [];
150
+ try {
151
+ const parsed = JSON.parse(String(text));
152
+ if (Array.isArray(parsed))
153
+ return parsed;
154
+ if (Array.isArray(parsed?.panes))
155
+ return parsed.panes;
156
+ return [];
157
+ }
158
+ catch {
159
+ return [];
160
+ }
161
+ }
162
+ function sleep(ms) {
163
+ return new Promise((resolve) => setTimeout(resolve, ms));
164
+ }
165
+ function shellQuote(value) {
166
+ return `'${String(value).replace(/'/g, `'\\''`)}'`;
167
+ }
168
+ function startAttachedZellijClient(sessionName) {
169
+ const logFile = path.join(root, '.sneakoscope', 'reports', `${sessionName}.script.log`);
170
+ fs.mkdirSync(path.dirname(logFile), { recursive: true });
171
+ return spawn('script', ['-q', logFile, 'zellij', 'attach', '--create', sessionName], {
172
+ cwd: root,
173
+ stdio: ['ignore', 'ignore', 'ignore']
174
+ });
175
+ }
176
+ function safeKill(child, signal) {
177
+ try {
178
+ if (!child.killed)
179
+ child.kill(signal);
180
+ }
181
+ catch {
182
+ // Best-effort cleanup for the disposable pseudo-terminal client.
183
+ }
184
+ }
185
+ //# sourceMappingURL=zellij-worker-pane-real-ui-blackbox.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sneakoscope",
3
3
  "displayName": "ㅅㅋㅅ",
4
- "version": "2.0.6",
4
+ "version": "2.0.8",
5
5
  "description": "Sneakoscope Codex: fast proof-first Codex trust layer with image-based Voxel TriWiki.",
6
6
  "type": "module",
7
7
  "homepage": "https://github.com/mandarange/Sneakoscope-Codex#readme",
@@ -312,10 +312,10 @@
312
312
  "ultra-router:classification": "node ./dist/scripts/ultra-router-classification-check.js",
313
313
  "ultra-router:auto-router": "node ./dist/scripts/ultra-router-auto-router-check.js",
314
314
  "coverage": "node --experimental-test-coverage --test \"test/**/*.test.mjs\"",
315
- "release:check": "npm run release:check:parallel && npm run mad-sks:app-ui-no-mutation && npm run codex-app:fast-ui-preservation && npm run codex-app:ui-clobber-guard && npm run doctor:fixes-codex-app-fast-ui && npm run provider:badge-context && npm run provider:context-config-toml && npm run codex-app:provider-badge && npm run zellij:spawn-on-demand-layout && npm run zellij:worker-pane-manager && npm run zellij:worker-pane-manager-single-owner && npm run agent:worker-pane-communication-contract && npm run runtime:no-mjs-scripts && npm run runtime:ts-python-boundary && npm run codex-sdk:capability && npm run codex-sdk:no-legacy-fallback && npm run codex-sdk:backend-router && npm run codex-sdk:structured-output && npm run codex-sdk:event-stream-ledger && npm run codex-sdk:thread-registry && npm run codex-sdk:sandbox-policy && npm run codex-sdk:zellij-pane-binding && npm run codex-sdk:all-pipelines && npm run codex-sdk:dfix-pipeline && npm run codex-sdk:qa-pipeline && npm run codex-sdk:research-pipeline && npm run codex-sdk:team-naruto-agent-pipeline && npm run codex-sdk:release-review-pipeline && npm run codex-sdk:ux-ppt-review-pipeline && npm run codex-sdk:core-skill-pipeline && npm run codex-control:capability && npm run codex-control:no-legacy-fallback && npm run codex-control:structured-output && npm run codex-control:event-stream-ledger && npm run codex-control:thread-registry && npm run codex-control:side-effect-scope && npm run codex-control:all-pipelines && npm run codex-control:empty-result-retry && npm run codex-control:stream-idle-watchdog && npm run codex-control:tool-call-sequence-repair && npm run codex-control:keepalive-no-cot-leak && npm run local-collab:policy && npm run local-collab:gpt-final-arbiter && npm run local-collab:no-local-only-final && npm run local-collab:gpt-final-availability && npm run local-llm:capability && npm run local-llm:structured-output && npm run local-llm:tool-call-repair && npm run local-llm:all-pipelines && npm run local-collab:all-pipelines-final-gpt && npm run python-sdk:capability && npm run python-sdk:stream-bridge && npm run python-sdk:sandbox-policy && npm run python-sdk:all-pipelines && npm run codex:plugin-list-json && npm run codex:product-design-plugin-routing && npm run codex:product-design-auto-install && npm run codex:thread-runtime-choice && npm run codex:environment-scoped-approvals && npm run ultra-router:classification && npm run ultra-router:auto-router && npm run release:version-truth && npm run codex:0.137-compat && npm run codex:0.136-compat && npm run codex:0.135-compat && npm run doctor:codex-doctor-parity && npm run codex:permission-profiles && npm run codex:legacy-profile-consumers-removed && npm run terminal:keyboard-enhancement-safety && npm run terminal:tui-output-stability && npm run codex:resume-cwd-truth && npm run mcp:tool-naming-parity && npm run responses:retry-policy-centralized && npm run runtime:no-tmux && npm run zellij:layout-valid && npm run agent:zellij-dynamic-backfill-panes && npm run agent:worker-pane-communication-contract && npm run agent:slot-pane-binding-proof && npm run zellij:worker-pane-manager && npm run zellij:spawn-on-demand-layout && npm run zellij:lane-renderer && npm run mad-sks:zellij-launch && npm run mad-sks:zellij-default-pane-worker && npm run agent:zellij-runtime && npm run codex:config-eperm-fixture && npm run doctor:fix-proves-codex-read && npm run mad:preflight-blocks-unreadable-config && npm run fast:codex-service-tier-proof && npm run codex:project-config-policy-splitter && npm run test:no-orphan-dist-imports && npm run agent:patch-envelope-extraction && npm run agent:patch-queue-runtime && npm run agent:strategy-to-lease-wiring && npm run agent:patch-swarm-runtime && npm run agent:patch-transaction-journal && npm run agent:patch-conflict-rebase && npm run agent:strategy-to-patch-strict && npm run agent:patch-swarm-runtime-truth && npm run agent:rollback-command && npm run agent:patch-verification-dag && npm run agent:patch-rollback-dag && npm run agent:patch-proof-runtime && npm run agent:patch-swarm-route-blackbox && npm run team:patch-swarm-route-blackbox && npm run dfix:patch-swarm-route-blackbox && npm run appshots:thread-attachment-discovery && npm run mcp:readonly-runtime-scheduler && npm run naruto:work-graph && npm run naruto:readonly-routing && npm run naruto:concurrency-governor && npm run naruto:active-pool && npm run naruto:role-distribution && npm run naruto:parallel-patch-apply && npm run naruto:verification-pool && npm run naruto:zellij-massive-ui && npm run naruto:gpt-final-pack && npm run prompt:placeholder-guard && npm run codex:0.134-runner-truth && npm run agent:native-cli-session-swarm && npm run naruto:shadow-clone-swarm && npm run agent:native-cli-session-swarm-10 && npm run agent:native-cli-session-swarm-20 && npm run agent:no-subagent-scaling && npm run agent:native-cli-session-proof && npm run agent:worker-backend-router && npm run agent:codex-child-overlap && npm run agent:model-authored-patch-envelope && npm run agent:fast-mode-default && npm run agent:fast-mode-worker-propagation && npm run codex:fast-mode-profile-propagation && npm run mad-sks:fast-mode-propagation && npm run zellij:launch-command-truth && npm run zellij:real-session-heartbeat && npm run zellij:ui-design && npm run zellij:doctor-readiness && npm run legacy:upgrade-zero-break && npm run publish:packlist-performance && npm run postinstall:safe-side-effects && npm run runtime:ts-rust-boundary && npm run core-skill:card-schema && npm run core-skill:rollout-scoring && npm run core-skill:patch && npm run core-skill:heldout-validation && npm run core-skill:deployment-snapshot && npm run core-skill:no-inference-optimizer && npm run core-skill:route-runtime-integration && npm run core-skill:promotion-side-effect-ledger && npm run core-skill:legacy-promotion-api-audit && npm run safety:side-effect-zero && npm run safety:mutation-callsite-coverage && npm run safety:mutation-callsite-coverage:repo-wide && npm run side-effect:runtime-report && npm run release:gate-planner && npm run release:dynamic-performance && npm run release:provenance && npm run release:gate-budget && npm run agent:wiki-context-proof && npm run shared-memory:check && npm run wrongness:check && npm run wrongness:fixtures && npm run trust:check && npm run git-collaboration:e2e && node ./dist/scripts/release-check-stamp.js write && npm run release:readiness --silent && node ./dist/scripts/release-check-stamp.js write",
316
- "release:real-check": "node ./dist/scripts/release-real-check.js && npm run codex-control:real-smoke -- --require-real && npm run codex-sdk:real-smoke -- --require-real && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:smoke && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:throughput && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:cache-performance && SKS_REQUIRE_PYTHON_CODEX_SDK=1 npm run python-sdk:real-smoke && SKS_REQUIRE_CODEX_0137=1 npm run codex:0.137-compat:require-real && npm run zellij:real-session-launch -- --require-real --main-only --mission M-release-real-zellij-extra --session sks-rrz-extra && npm run zellij:pane-proof -- --require-real --mission M-release-real-zellij-extra --session sks-rrz-extra --expected-lanes 0 && npm run zellij:screen-proof -- --require-real --main-only --mission M-release-real-zellij-extra && npm run zellij:real-session-cleanup -- --mission M-release-real-zellij-extra --session sks-rrz-extra && npm run agent:real-codex-in-zellij-worker-pane -- --require-real && SKS_REQUIRE_ZELLIJ=1 npm run naruto:zellij-massive-ui -- --require-real && SKS_REQUIRE_LOCAL_LLM=1 SKS_REQUIRE_GPT_FINAL=1 npm run naruto:real-local-gpt-final-smoke && SKS_REQUIRE_LOCAL_LLM=1 SKS_REQUIRE_GPT_FINAL=1 npm run local-collab:gpt-final-performance",
315
+ "release:check": "npm run build --silent && node ./dist/scripts/release-gate-dag-runner.js --preset release && node ./dist/scripts/release-check-stamp.js write",
316
+ "release:real-check": "node ./dist/scripts/release-real-check.js && SKS_REQUIRE_GIT_WORKTREE=1 npm run naruto:worktree-coding:blackbox -- --require-real && npm run codex-control:real-smoke -- --require-real && npm run codex-sdk:real-smoke -- --require-real && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:smoke && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:throughput && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:cache-performance && SKS_REQUIRE_PYTHON_CODEX_SDK=1 npm run python-sdk:real-smoke && SKS_REQUIRE_CODEX_0137=1 npm run codex:0.137-compat:require-real && npm run zellij:real-session-launch -- --require-real --main-only --mission M-release-real-zellij-extra --session sks-rrz-extra && npm run zellij:pane-proof -- --require-real --mission M-release-real-zellij-extra --session sks-rrz-extra --expected-lanes 0 && npm run zellij:screen-proof -- --require-real --main-only --mission M-release-real-zellij-extra && npm run zellij:real-session-cleanup -- --mission M-release-real-zellij-extra --session sks-rrz-extra && npm run agent:real-codex-in-zellij-worker-pane -- --require-real && SKS_REQUIRE_ZELLIJ=1 npm run naruto:zellij-massive-ui -- --require-real && SKS_REQUIRE_LOCAL_LLM=1 SKS_REQUIRE_GPT_FINAL=1 npm run naruto:real-local-gpt-final-smoke && SKS_REQUIRE_LOCAL_LLM=1 SKS_REQUIRE_GPT_FINAL=1 npm run local-collab:gpt-final-performance && SKS_REQUIRE_ZELLIJ=1 npm run zellij:worker-pane-real-ui:blackbox -- --require-real",
317
317
  "release:publish": "npm run publish:npm",
318
- "publish:dry": "npm run release:metadata && npm run release:version-truth && npm run publish:packlist-performance && npm run prepublish:release-check-or-fast && node ./dist/scripts/release-check-stamp.js verify && npm run release:provenance -- --publish && npm run release:dist-freshness && npm --cache /tmp/sks-npm-cache publish --dry-run --registry https://registry.npmjs.org/ --access public",
318
+ "publish:dry": "npm run release:metadata && npm run release:version-truth && npm run publish:packlist-performance && npm run prepublish:release-check-or-fast && node ./dist/scripts/check-publish-tag.js && node ./dist/scripts/release-check-stamp.js verify && npm run release:provenance -- --publish && npm run release:dist-freshness && node ./dist/scripts/release-registry-check.js --require-unpublished && npm --cache /tmp/sks-npm-cache publish --dry-run --ignore-scripts --registry https://registry.npmjs.org/ --access public",
319
319
  "publish:npm": "npm --cache /tmp/sks-npm-cache publish --registry https://registry.npmjs.org/ --access public",
320
320
  "prepack": "npm run build",
321
321
  "prepublishOnly": "npm run release:metadata && npm run release:version-truth && npm run release:dist-freshness && npm run publish:packlist-performance && npm run prepublish:release-check-or-fast && node ./dist/scripts/check-publish-tag.js && node ./dist/scripts/release-check-stamp.js verify && npm run release:provenance -- --publish && node ./dist/scripts/release-registry-check.js --require-unpublished --require-publish-auth",
@@ -453,6 +453,14 @@
453
453
  "agent:strategy-to-patch-strict": "node ./dist/scripts/agent-strategy-to-patch-strict-check.js",
454
454
  "agent:rollback-command": "node ./dist/scripts/agent-rollback-command-check.js",
455
455
  "agent:native-cli-session-swarm": "node ./dist/scripts/agent-native-cli-session-swarm-check.js",
456
+ "release:worktree-gates": "npm run git:worktree-capability && npm run git:worktree-manager && npm run git:worktree-diff-export && npm run git:worktree-merge-queue && npm run git:worktree-cleanup && npm run git:worktree-cache-performance && npm run git:worktree-pool-performance && npm run naruto:worktree-coding && npm run naruto:worktree-zellij-ui && npm run naruto:worktree-gpt-final",
457
+ "git:worktree-capability": "node ./dist/scripts/git-worktree-capability-check.js",
458
+ "git:worktree-manager": "node ./dist/scripts/git-worktree-manager-check.js",
459
+ "git:worktree-diff-export": "node ./dist/scripts/git-worktree-diff-export-check.js",
460
+ "git:worktree-merge-queue": "node ./dist/scripts/git-worktree-merge-queue-check.js",
461
+ "git:worktree-cleanup": "node ./dist/scripts/git-worktree-cleanup-check.js",
462
+ "git:worktree-cache-performance": "node ./dist/scripts/git-worktree-cache-performance-check.js",
463
+ "git:worktree-pool-performance": "node ./dist/scripts/git-worktree-pool-performance-check.js",
456
464
  "naruto:shadow-clone-swarm": "node ./dist/scripts/naruto-shadow-clone-swarm-check.js",
457
465
  "naruto:work-graph": "node ./dist/scripts/naruto-work-graph-check.js",
458
466
  "naruto:readonly-routing": "node ./dist/scripts/naruto-readonly-routing-check.js",
@@ -463,6 +471,9 @@
463
471
  "naruto:verification-pool": "node ./dist/scripts/naruto-verification-pool-check.js",
464
472
  "naruto:zellij-massive-ui": "node ./dist/scripts/naruto-zellij-massive-ui-check.js",
465
473
  "naruto:gpt-final-pack": "node ./dist/scripts/naruto-gpt-final-pack-check.js",
474
+ "naruto:worktree-coding": "node ./dist/scripts/naruto-worktree-coding-check.js",
475
+ "naruto:worktree-zellij-ui": "node ./dist/scripts/naruto-worktree-zellij-ui-check.js",
476
+ "naruto:worktree-gpt-final": "node ./dist/scripts/naruto-worktree-gpt-final-check.js",
466
477
  "naruto:real-local-gpt-final-smoke": "node ./dist/scripts/naruto-real-local-gpt-final-smoke.js",
467
478
  "prompt:placeholder-guard": "node ./dist/scripts/prompt-placeholder-guard-check.js",
468
479
  "agent:native-cli-session-swarm-10": "node ./dist/scripts/agent-native-cli-session-swarm-10-check.js",
@@ -490,7 +501,24 @@
490
501
  "runtime:ts-python-boundary": "node ./dist/scripts/runtime-ts-python-boundary-check.js",
491
502
  "python-tools:smoke": "node ./dist/scripts/python-tools-smoke-check.js",
492
503
  "agent:zellij-dynamic-backfill-panes": "node ./dist/scripts/agent-zellij-dynamic-backfill-panes-check.js",
493
- "agent:real-codex-in-zellij-worker-pane": "node ./dist/scripts/agent-real-codex-in-zellij-worker-pane-check.js"
504
+ "agent:real-codex-in-zellij-worker-pane": "node ./dist/scripts/agent-real-codex-in-zellij-worker-pane-check.js",
505
+ "release:check:legacy": "npm run release:check:parallel && npm run mad-sks:app-ui-no-mutation && npm run codex-app:fast-ui-preservation && npm run codex-app:ui-clobber-guard && npm run doctor:fixes-codex-app-fast-ui && npm run provider:badge-context && npm run provider:context-config-toml && npm run codex-app:provider-badge && npm run zellij:spawn-on-demand-layout && npm run zellij:worker-pane-manager && npm run zellij:worker-pane-manager-single-owner && npm run agent:worker-pane-communication-contract && npm run runtime:no-mjs-scripts && npm run runtime:ts-python-boundary && npm run codex-sdk:capability && npm run codex-sdk:no-legacy-fallback && npm run codex-sdk:backend-router && npm run codex-sdk:structured-output && npm run codex-sdk:event-stream-ledger && npm run codex-sdk:thread-registry && npm run codex-sdk:sandbox-policy && npm run codex-sdk:zellij-pane-binding && npm run codex-sdk:all-pipelines && npm run codex-sdk:dfix-pipeline && npm run codex-sdk:qa-pipeline && npm run codex-sdk:research-pipeline && npm run codex-sdk:team-naruto-agent-pipeline && npm run codex-sdk:release-review-pipeline && npm run codex-sdk:ux-ppt-review-pipeline && npm run codex-sdk:core-skill-pipeline && npm run codex-control:capability && npm run codex-control:no-legacy-fallback && npm run codex-control:structured-output && npm run codex-control:event-stream-ledger && npm run codex-control:thread-registry && npm run codex-control:side-effect-scope && npm run codex-control:all-pipelines && npm run codex-control:empty-result-retry && npm run codex-control:stream-idle-watchdog && npm run codex-control:tool-call-sequence-repair && npm run codex-control:keepalive-no-cot-leak && npm run local-collab:policy && npm run local-collab:gpt-final-arbiter && npm run local-collab:no-local-only-final && npm run local-collab:gpt-final-availability && npm run local-llm:capability && npm run local-llm:structured-output && npm run local-llm:tool-call-repair && npm run local-llm:all-pipelines && npm run local-collab:all-pipelines-final-gpt && npm run python-sdk:capability && npm run python-sdk:stream-bridge && npm run python-sdk:sandbox-policy && npm run python-sdk:all-pipelines && npm run codex:plugin-list-json && npm run codex:product-design-plugin-routing && npm run codex:product-design-auto-install && npm run codex:thread-runtime-choice && npm run codex:environment-scoped-approvals && npm run ultra-router:classification && npm run ultra-router:auto-router && npm run release:version-truth && npm run release:worktree-gates && npm run codex:0.137-compat && npm run codex:0.136-compat && npm run codex:0.135-compat && npm run doctor:codex-doctor-parity && npm run codex:permission-profiles && npm run codex:legacy-profile-consumers-removed && npm run terminal:keyboard-enhancement-safety && npm run terminal:tui-output-stability && npm run codex:resume-cwd-truth && npm run mcp:tool-naming-parity && npm run responses:retry-policy-centralized && npm run runtime:no-tmux && npm run zellij:layout-valid && npm run agent:zellij-dynamic-backfill-panes && npm run agent:worker-pane-communication-contract && npm run agent:slot-pane-binding-proof && npm run zellij:worker-pane-manager && npm run zellij:spawn-on-demand-layout && npm run zellij:lane-renderer && npm run mad-sks:zellij-launch && npm run mad-sks:zellij-default-pane-worker && npm run agent:zellij-runtime && npm run codex:config-eperm-fixture && npm run doctor:fix-proves-codex-read && npm run mad:preflight-blocks-unreadable-config && npm run fast:codex-service-tier-proof && npm run codex:project-config-policy-splitter && npm run test:no-orphan-dist-imports && npm run agent:patch-envelope-extraction && npm run agent:patch-queue-runtime && npm run agent:strategy-to-lease-wiring && npm run agent:patch-swarm-runtime && npm run agent:patch-transaction-journal && npm run agent:patch-conflict-rebase && npm run agent:strategy-to-patch-strict && npm run agent:patch-swarm-runtime-truth && npm run agent:rollback-command && npm run agent:patch-verification-dag && npm run agent:patch-rollback-dag && npm run agent:patch-proof-runtime && npm run agent:patch-swarm-route-blackbox && npm run team:patch-swarm-route-blackbox && npm run dfix:patch-swarm-route-blackbox && npm run appshots:thread-attachment-discovery && npm run mcp:readonly-runtime-scheduler && npm run naruto:work-graph && npm run naruto:readonly-routing && npm run naruto:concurrency-governor && npm run naruto:active-pool && npm run naruto:role-distribution && npm run naruto:parallel-patch-apply && npm run naruto:verification-pool && npm run naruto:zellij-massive-ui && npm run naruto:gpt-final-pack && npm run prompt:placeholder-guard && npm run codex:0.134-runner-truth && npm run agent:native-cli-session-swarm && npm run naruto:shadow-clone-swarm && npm run agent:native-cli-session-swarm-10 && npm run agent:native-cli-session-swarm-20 && npm run agent:no-subagent-scaling && npm run agent:native-cli-session-proof && npm run agent:worker-backend-router && npm run agent:codex-child-overlap && npm run agent:model-authored-patch-envelope && npm run agent:fast-mode-default && npm run agent:fast-mode-worker-propagation && npm run codex:fast-mode-profile-propagation && npm run mad-sks:fast-mode-propagation && npm run zellij:launch-command-truth && npm run zellij:real-session-heartbeat && npm run zellij:ui-design && npm run zellij:doctor-readiness && npm run legacy:upgrade-zero-break && npm run publish:packlist-performance && npm run postinstall:safe-side-effects && npm run runtime:ts-rust-boundary && npm run core-skill:card-schema && npm run core-skill:rollout-scoring && npm run core-skill:patch && npm run core-skill:heldout-validation && npm run core-skill:deployment-snapshot && npm run core-skill:no-inference-optimizer && npm run core-skill:route-runtime-integration && npm run core-skill:promotion-side-effect-ledger && npm run core-skill:legacy-promotion-api-audit && npm run safety:side-effect-zero && npm run safety:mutation-callsite-coverage && npm run safety:mutation-callsite-coverage:repo-wide && npm run side-effect:runtime-report && npm run release:gate-planner && npm run release:dynamic-performance && npm run release:provenance && npm run release:gate-budget && npm run agent:wiki-context-proof && npm run shared-memory:check && npm run wrongness:check && npm run wrongness:fixtures && npm run trust:check && npm run git-collaboration:e2e && node ./dist/scripts/release-check-stamp.js write && npm run release:readiness --silent && node ./dist/scripts/release-check-stamp.js write",
506
+ "release:check:dag": "node ./dist/scripts/release-gate-dag-runner.js --preset release",
507
+ "release:check:dag:explain": "node ./dist/scripts/release-gate-dag-runner.js --preset release --explain",
508
+ "release:check:dag:no-cache": "node ./dist/scripts/release-gate-dag-runner.js --preset release --no-cache",
509
+ "release:check:dag:fail-fast": "node ./dist/scripts/release-gate-dag-runner.js --preset release --fail-fast",
510
+ "release:dag-runner": "node ./dist/scripts/release-gate-dag-runner-check.js",
511
+ "release:parallel-speed-budget": "node ./dist/scripts/release-parallel-speed-budget-check.js",
512
+ "release:stability-report": "node ./dist/scripts/release-stability-report-check.js",
513
+ "git:worktree-manifest-append": "node ./dist/scripts/git-worktree-manifest-append-check.js",
514
+ "git:worktree-dirty-main-detection": "node ./dist/scripts/git-worktree-dirty-main-detection-check.js",
515
+ "git:worktree-untracked-diff": "node ./dist/scripts/git-worktree-untracked-diff-check.js",
516
+ "git:worktree-diff-envelope": "node ./dist/scripts/git-worktree-diff-envelope-check.js",
517
+ "git:worktree-integration-primary": "node ./dist/scripts/git-worktree-integration-primary-check.js",
518
+ "git:worktree-dirty-lock": "node ./dist/scripts/git-worktree-dirty-lock-check.js",
519
+ "naruto:worktree-coding:blackbox": "node ./dist/scripts/naruto-worktree-coding-blackbox.js",
520
+ "zellij:worker-pane-real-ui:blackbox": "node ./dist/scripts/zellij-worker-pane-real-ui-blackbox.js",
521
+ "zellij:dashboard-pane": "node ./dist/scripts/zellij-dashboard-pane-check.js"
494
522
  },
495
523
  "keywords": [
496
524
  "sneakoscope",