sneakoscope 5.7.0 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +1 -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/bin/sks.js +1 -1
  6. package/dist/cli/command-registry.js +1 -2
  7. package/dist/cli/{insane-search-command.js → super-search-command.js} +96 -55
  8. package/dist/cli/xai-command.js +7 -7
  9. package/dist/config/skills-manifest.json +63 -70
  10. package/dist/core/agents/agent-codex-cockpit.js +3 -3
  11. package/dist/core/agents/agent-orchestrator.js +20 -2
  12. package/dist/core/agents/agent-wrongness.js +1 -1
  13. package/dist/core/agents/native-cli-session-swarm.js +14 -1
  14. package/dist/core/agents/parallel-runtime-proof.js +82 -8
  15. package/dist/core/commands/gc-command.js +12 -6
  16. package/dist/core/commands/run-command.js +20 -18
  17. package/dist/core/feature-fixtures.js +15 -8
  18. package/dist/core/fsx.js +1 -1
  19. package/dist/core/init/skills.js +1 -2
  20. package/dist/core/mission.js +41 -15
  21. package/dist/core/release-parallel-full-coverage.js +1 -1
  22. package/dist/core/retention.js +1 -1
  23. package/dist/core/routes/constants.js +2 -2
  24. package/dist/core/routes.js +150 -52
  25. package/dist/core/source-intelligence/source-intelligence-policy.js +5 -5
  26. package/dist/core/source-intelligence/source-intelligence-proof.js +8 -8
  27. package/dist/core/source-intelligence/source-intelligence-runner.js +16 -16
  28. package/dist/core/strategy/strategy-gate.js +2 -1
  29. package/dist/core/super-search/runtime-helpers.js +289 -0
  30. package/dist/core/super-search/runtime.js +259 -0
  31. package/dist/core/super-search/source-records.js +96 -0
  32. package/dist/core/super-search/types.js +3 -0
  33. package/dist/core/trust-kernel/trust-report.js +3 -3
  34. package/dist/core/verification/real-evidence-policy.js +55 -0
  35. package/dist/core/version.js +1 -1
  36. package/dist/scripts/agent-visual-consistency-check.js +1 -1
  37. package/dist/scripts/check-architecture.js +0 -1
  38. package/dist/scripts/mutation-callsite-coverage-check.js +7 -0
  39. package/dist/scripts/release-metadata-1-19-check.js +2 -2
  40. package/dist/scripts/release-parallel-check.js +2 -2
  41. package/dist/scripts/release-parallel-full-coverage-check.js +1 -1
  42. package/dist/scripts/sks-1-18-gate-lib.js +2 -2
  43. package/dist/scripts/source-intelligence-all-modes-check.js +2 -2
  44. package/dist/scripts/source-intelligence-policy-check.js +1 -1
  45. package/dist/scripts/super-search-name-guard-check.js +98 -0
  46. package/dist/scripts/{ultra-search-provider-interface-check.js → super-search-provider-interface-check.js} +9 -9
  47. package/dist/scripts/trust-fixture-check.js +19 -6
  48. package/package.json +9 -3
  49. package/schemas/agents/parallel-runtime-proof.schema.json +17 -1
  50. package/dist/core/ultra-search/runtime.js +0 -502
  51. package/dist/core/ultra-search/types.js +0 -3
  52. package/dist/scripts/release-readiness-report.js +0 -1262
  53. /package/dist/core/{ultra-search → super-search}/index.js +0 -0
@@ -1,7 +1,7 @@
1
1
  import path from 'node:path';
2
2
  import { appendJsonlBounded, ensureDir, nowIso, readJson, readText, writeJsonAtomic } from '../fsx.js';
3
3
  export const PARALLEL_RUNTIME_EVENT_SCHEMA = 'sks.parallel-runtime-event.v1';
4
- export const PARALLEL_RUNTIME_PROOF_SCHEMA = 'sks.parallel-runtime-proof.v1';
4
+ export const PARALLEL_RUNTIME_PROOF_SCHEMA = 'sks.parallel-runtime-proof.v2';
5
5
  export function parallelRuntimeEventPath(root, missionId) {
6
6
  return path.join(inferAgentsDir(root, missionId), 'parallel-runtime.events.jsonl');
7
7
  }
@@ -100,7 +100,7 @@ export async function buildParallelRuntimeProof(root, missionId, opts = {}) {
100
100
  ? workerDurations.reduce((sum, value) => sum + value, 0)
101
101
  : requestedWorkers * positiveInt(opts.expectedWorkerRuntimeMs, 4000);
102
102
  const visiblePanes = nonNegativeInt(opts.visiblePanes, sorted.filter((event) => event.placement === 'zellij-pane').length ? new Set(sorted.filter((event) => event.placement === 'zellij-pane').map((event) => event.slot_id || event.session_id || '')).size : 0);
103
- const observedHeadlessWorkers = sorted.filter((event) => event.placement === 'headless' && (event.event_type === 'worker_launch_invoked' || event.event_type === 'worker_process_spawned')).length;
103
+ const observedHeadlessWorkers = sorted.filter((event) => (event.placement === 'headless' || event.placement === 'headless_by_design_viewport_ui') && (event.event_type === 'worker_launch_invoked' || event.event_type === 'worker_process_spawned')).length;
104
104
  const headlessWorkers = Math.max(observedHeadlessWorkers, Math.max(0, targetActiveSlots - visiblePanes));
105
105
  const minActiveWorkers = opts.minActiveWorkers === undefined
106
106
  ? Math.min(targetActiveSlots, requestedWorkers)
@@ -112,6 +112,7 @@ export async function buildParallelRuntimeProof(root, missionId, opts = {}) {
112
112
  const firstBatchLimit = positiveInt(opts.firstBatchLaunchSpanLimitMs, requestedWorkers >= 16 ? 2500 : 30000);
113
113
  const schedulerState = await readJson(path.join(root, 'agent-scheduler-state.json'), null).catch(() => null);
114
114
  const coalescedOverlapWindows = coalesceOverlapWindows(overlapWindows);
115
+ const workerEvidence = buildWorkerRuntimeEvidence(sorted, firstMs, lastMs);
115
116
  const utilizationProofConsistency = buildUtilizationProofConsistency(schedulerState, {
116
117
  proofMaxActive: maxWorkers,
117
118
  proofWallMs: wallMs,
@@ -130,15 +131,27 @@ export async function buildParallelRuntimeProof(root, missionId, opts = {}) {
130
131
  blockers.push('speedup_ratio_below_target');
131
132
  if (firstBatchLaunchSpanMs > firstBatchLimit)
132
133
  blockers.push('first_batch_launch_span_above_limit');
134
+ if (minActiveWorkers > 1 && workerEvidence.unique_worker_ids.length < Math.min(minActiveWorkers, 2))
135
+ blockers.push('worker_id_diversity_below_target');
136
+ if (minActiveWorkers > 1 && workerEvidence.overlap_windows.length === 0)
137
+ blockers.push('worker_timestamp_overlap_missing');
138
+ if (opts.requireChangedFiles === true && workerEvidence.changed_file_count < positiveInt(opts.minChangedFiles, Math.min(2, requestedWorkers)))
139
+ blockers.push('parallel_write_changed_files_below_target');
140
+ const passed = blockers.length === 0;
133
141
  return {
134
142
  schema: PARALLEL_RUNTIME_PROOF_SCHEMA,
135
143
  mission_id: missionId,
136
144
  generated_at: nowIso(),
145
+ ok: passed,
137
146
  proof_mode: proofMode,
147
+ production_runtime: proofMode === 'production',
148
+ mock_only: proofMode !== 'production',
138
149
  require_worker_pids: requireWorkerPids,
139
150
  allow_missing_pids: allowMissingPids,
140
151
  requested_workers: requestedWorkers,
141
152
  target_active_slots: targetActiveSlots,
153
+ observed_worker_count: workerEvidence.unique_worker_ids.length,
154
+ unique_worker_ids: workerEvidence.unique_worker_ids,
142
155
  max_observed_active_workers: maxWorkers,
143
156
  max_observed_worker_processes: Math.max(maxProcesses, workerPids.size ? maxProcesses : maxWorkers),
144
157
  unique_worker_pids: workerPids.size,
@@ -149,11 +162,13 @@ export async function buildParallelRuntimeProof(root, missionId, opts = {}) {
149
162
  wall_ms: wallMs,
150
163
  sequential_estimate_ms: sequentialEstimateMs,
151
164
  speedup_ratio: speedupRatio,
152
- overlap_windows: coalescedOverlapWindows,
165
+ overlap_windows: [...coalescedOverlapWindows, ...workerEvidence.overlap_windows],
166
+ changed_file_count: workerEvidence.changed_file_count,
167
+ changed_files_by_worker: workerEvidence.changed_files_by_worker,
153
168
  visible_panes: visiblePanes,
154
169
  headless_workers: headlessWorkers,
155
170
  utilization_proof_consistency: utilizationProofConsistency,
156
- passed: blockers.length === 0,
171
+ passed,
157
172
  blockers
158
173
  };
159
174
  }
@@ -200,7 +215,7 @@ function normalizeParallelRuntimeEvent(missionId, event) {
200
215
  }
201
216
  function normalizePlacement(value) {
202
217
  const text = String(value || 'unknown');
203
- if (text === 'zellij-pane' || text === 'process' || text === 'headless')
218
+ if (text === 'zellij-pane' || text === 'process' || text === 'headless' || text === 'headless_by_design_viewport_ui')
204
219
  return text;
205
220
  return 'unknown';
206
221
  }
@@ -253,14 +268,73 @@ function buildUtilizationProofConsistency(state, input) {
253
268
  };
254
269
  }
255
270
  function activeSlotTimeMsFromWindows(windows) {
256
- return windows.reduce((sum, window) => sum + Math.max(0, window.end_ms - window.start_ms) * Math.max(0, window.active_workers), 0);
271
+ return windows.reduce((sum, window) => sum + Math.max(0, Number(window.end_ms || 0) - Number(window.start_ms || 0)) * Math.max(0, Number(window.active_workers || 0)), 0);
257
272
  }
258
273
  function coalesceOverlapWindows(windows) {
259
274
  return windows
260
- .filter((window) => window.end_ms > window.start_ms)
261
- .filter((window) => window.active_workers > 0 || window.active_model_calls > 0)
275
+ .filter((window) => Number(window.end_ms || 0) > Number(window.start_ms || 0))
276
+ .filter((window) => Number(window.active_workers || 0) > 0 || Number(window.active_model_calls || 0) > 0)
262
277
  .slice(0, 2000);
263
278
  }
279
+ function buildWorkerRuntimeEvidence(events, firstMs, lastMs) {
280
+ const intervals = new Map();
281
+ for (const event of events) {
282
+ const workerId = workerRuntimeId(event);
283
+ if (!workerId)
284
+ continue;
285
+ if (event.event_type === 'worker_launch_invoked' || event.event_type === 'worker_process_spawned') {
286
+ const current = intervals.get(workerId);
287
+ if (current)
288
+ current.start = Math.min(current.start, event.ms);
289
+ else
290
+ intervals.set(workerId, { start: event.ms, end: event.ms, changedFiles: new Set() });
291
+ }
292
+ if (event.event_type === 'worker_completed' || event.event_type === 'worker_failed') {
293
+ const current = intervals.get(workerId) || { start: event.ms, end: event.ms, changedFiles: new Set() };
294
+ current.end = event.ms;
295
+ for (const file of eventChangedFiles(event))
296
+ current.changedFiles.add(file);
297
+ intervals.set(workerId, current);
298
+ }
299
+ }
300
+ const uniqueWorkerIds = [...intervals.keys()].sort();
301
+ const changedFilesByWorker = Object.fromEntries(uniqueWorkerIds.map((id) => [id, [...(intervals.get(id)?.changedFiles || new Set())].sort()]));
302
+ const changedFileCount = new Set(Object.values(changedFilesByWorker).flat()).size;
303
+ const overlapWindows = [];
304
+ for (let i = 0; i < uniqueWorkerIds.length; i++) {
305
+ for (let j = i + 1; j < uniqueWorkerIds.length; j++) {
306
+ const a = uniqueWorkerIds[i];
307
+ const b = uniqueWorkerIds[j];
308
+ const left = intervals.get(a);
309
+ const right = intervals.get(b);
310
+ const overlapMs = Math.max(0, Math.min(left.end, right.end) - Math.max(left.start, right.start));
311
+ if (overlapMs > 0 && Math.max(left.start, right.start) < Math.min(left.end, right.end)) {
312
+ overlapWindows.push({
313
+ worker_a: a,
314
+ worker_b: b,
315
+ overlap_ms: overlapMs,
316
+ start_ms: Math.max(left.start, right.start) - firstMs,
317
+ end_ms: Math.min(left.end, right.end) - firstMs,
318
+ active_workers: 2,
319
+ active_model_calls: 0
320
+ });
321
+ }
322
+ }
323
+ }
324
+ return {
325
+ unique_worker_ids: uniqueWorkerIds,
326
+ changed_files_by_worker: changedFilesByWorker,
327
+ changed_file_count: changedFileCount,
328
+ overlap_windows: overlapWindows.slice(0, 2000)
329
+ };
330
+ }
331
+ function workerRuntimeId(event) {
332
+ return event.slot_id || event.session_id || (event.pid == null ? null : `pid:${event.pid}`);
333
+ }
334
+ function eventChangedFiles(event) {
335
+ const fromMeta = Array.isArray(event.meta?.changed_files) ? event.meta.changed_files : [];
336
+ return fromMeta.map((file) => String(file || '').replace(/\\/g, '/').replace(/^\.\/+/, '')).filter(Boolean);
337
+ }
264
338
  function inferAgentsDir(root, missionId) {
265
339
  const resolved = path.resolve(root);
266
340
  if (path.basename(resolved) === 'agents' && path.basename(path.dirname(resolved)) === missionId)
@@ -1,5 +1,5 @@
1
1
  import { dirSize, formatBytes, packageRoot, projectRoot, sksRoot } from '../fsx.js';
2
- import { enforceRetention, storageReport } from '../retention.js';
2
+ import { enforceRetention, lightweightStorageReport, storageReport } from '../retention.js';
3
3
  import { flag } from './command-utils.js';
4
4
  import { projectTriwikiToAgentsMd } from '../triwiki/agents-md-projector.js';
5
5
  import { compileMistakeRules } from '../verification/mistake-rule-compiler.js';
@@ -45,13 +45,19 @@ function readOption(args = [], name, fallback = null) {
45
45
  }
46
46
  export async function statsCommand(args = []) {
47
47
  const root = await sksRoot();
48
- const report = await storageReport(root);
49
- const pkgBytes = await dirSize(packageRoot()).catch(() => 0);
50
- const out = { package: { bytes: pkgBytes, human: formatBytes(pkgBytes) }, storage: report };
48
+ const full = flag(args, '--full');
49
+ const report = full ? await storageReport(root) : await lightweightStorageReport(root);
50
+ const pkgBytes = full ? await dirSize(packageRoot()).catch(() => 0) : null;
51
+ const out = {
52
+ package: full
53
+ ? { bytes: pkgBytes, human: formatBytes(pkgBytes), full_size: true }
54
+ : { bytes: null, human: null, full_size: false, note: 'Run `sks stats --full --json` for recursive package sizing.' },
55
+ storage: report
56
+ };
51
57
  if (flag(args, '--json'))
52
58
  return console.log(JSON.stringify(out, null, 2));
53
59
  console.log('ㅅㅋㅅ Stats');
54
- console.log(`Package: ${out.package.human}`);
55
- console.log(`State: ${report.total_human || '0 B'}`);
60
+ console.log(`Package: ${out.package.human || 'not scanned (use --full)'}`);
61
+ console.log(`State: ${report.total_human || 'not scanned (use --full)'}`);
56
62
  }
57
63
  //# sourceMappingURL=gc-command.js.map
@@ -378,8 +378,8 @@ function runNextAction(route, id, args) {
378
378
  function safeRouteExecutionArgs(route, prompt, { auto = false } = {}) {
379
379
  if (route.command === '$DB')
380
380
  return ['db', 'check', '--sql', 'SELECT 1', '--json'];
381
- if (route.command === '$Insane-Search')
382
- return ultraSearchExecutionArgs(prompt);
381
+ if (route.command === '$Super-Search')
382
+ return superSearchExecutionArgs(prompt);
383
383
  if (route.command === '$SEO-GEO-OPTIMIZER')
384
384
  return ['seo-geo-optimizer', searchVisibilityActionFromPrompt(prompt), '--mode', searchVisibilityModeFromPrompt(prompt), '--target', searchVisibilityTargetFromPrompt(prompt), '--offline', '--json'];
385
385
  if (route.command === '$Wiki')
@@ -394,32 +394,34 @@ function safeRouteExecutionArgs(route, prompt, { auto = false } = {}) {
394
394
  return ['commit-and-push', '--json'];
395
395
  return ['team', prompt, '--mock', '--json', ...(auto ? ['--no-open-zellij'] : [])];
396
396
  }
397
- function ultraSearchExecutionArgs(prompt = '') {
398
- const stripped = stripUltraSearchPrompt(prompt);
397
+ function superSearchExecutionArgs(prompt = '') {
398
+ const stripped = stripSuperSearchPrompt(prompt);
399
399
  const lower = stripped.toLowerCase();
400
400
  if (!stripped || /^(?:doctor|check|status)\b/.test(lower))
401
- return ['insane-search', 'doctor', '--json'];
401
+ return ['super-search', 'doctor', '--json'];
402
402
  if (/^(?:x|x-search|x_search)\b/.test(lower)) {
403
403
  const query = stripped.replace(/^(?:x|x-search|x_search)\b[:\s-]*/i, '').trim() || 'source intelligence fixture';
404
- return ['insane-search', 'x', query, '--json'];
404
+ return ['super-search', 'x', query, '--json'];
405
405
  }
406
406
  const url = stripped.match(/\bhttps?:\/\/\S+/)?.[0];
407
- if (/^(?:fetch|url)\b/.test(lower) || url)
408
- return ['insane-search', 'fetch', url || stripped.replace(/^(?:fetch|url)\b[:\s-]*/i, '').trim() || 'https://example.com', '--json'];
407
+ if (/^(?:fetch|url)\b/.test(lower) || url) {
408
+ const fetchTarget = url || stripped.replace(/^(?:fetch|url)\b[:\s-]*/i, '').trim();
409
+ return fetchTarget ? ['super-search', 'fetch', fetchTarget, '--json'] : ['super-search', 'fetch', '--json'];
410
+ }
409
411
  const query = stripped.replace(/^run\b[:\s-]*/i, '').trim() || 'source intelligence fixture';
410
- return ['insane-search', 'run', query, '--mode', 'balanced', '--json'];
412
+ return ['super-search', 'run', query, '--mode', 'balanced', '--json'];
411
413
  }
412
- function stripUltraSearchPrompt(prompt = '') {
414
+ function stripSuperSearchPrompt(prompt = '') {
413
415
  return String(prompt || '')
414
416
  .trim()
415
- .replace(/^\[\$Insane-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
416
- .replace(/^\[\$InsaneSearch\]\([^)]+\)(?:\s|:)?\s*/i, '')
417
- .replace(/^\[\$Ultra-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
418
- .replace(/^\[\$UltraSearch\]\([^)]+\)(?:\s|:)?\s*/i, '')
419
- .replace(/^\$Insane-Search(?:\s|:)?\s*/i, '')
420
- .replace(/^\$InsaneSearch(?:\s|:)?\s*/i, '')
421
- .replace(/^\$Ultra-Search(?:\s|:)?\s*/i, '')
422
- .replace(/^\$UltraSearch(?:\s|:)?\s*/i, '')
417
+ .replace(/^\[\$Super-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
418
+ .replace(/^\[\$Super-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
419
+ .replace(/^\[\$Super-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
420
+ .replace(/^\[\$Super-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
421
+ .replace(/^\$Super-Search(?:\s|:)?\s*/i, '')
422
+ .replace(/^\$Super-Search(?:\s|:)?\s*/i, '')
423
+ .replace(/^\$Super-Search(?:\s|:)?\s*/i, '')
424
+ .replace(/^\$Super-Search(?:\s|:)?\s*/i, '')
423
425
  .trim();
424
426
  }
425
427
  function searchVisibilityActionFromPrompt(prompt = '') {
@@ -12,7 +12,9 @@ const FIXTURES = Object.freeze({
12
12
  'cli-help': fixture('execute', 'sks help', [], 'pass'),
13
13
  'cli-version': fixture('execute', 'sks --version', [], 'pass'),
14
14
  'cli-root': fixture('execute', 'sks root --json', [], 'pass'),
15
- 'cli-doctor': fixture('real_optional', 'sks doctor --json', [], 'pass'),
15
+ 'cli-doctor': fixture('execute', 'sks doctor --json', [], 'pass', {
16
+ reason: 'doctor without --fix is a read-only runtime readiness command, so the release fixture can execute it directly instead of counting it as optional integration evidence.'
17
+ }),
16
18
  'doctor:imagegen-repair': fixture('execute_and_validate_artifacts', 'sks doctor --json', [{ path: '.sneakoscope/reports/feature-fixtures/doctor-imagegen-repair.json', schema: 'sks.doctor-imagegen-repair.v1', optional: true }], 'pass', {
17
19
  quality: 'runtime_verified',
18
20
  validates_json_fields: ['imagegen_repair', 'repair.imagegen']
@@ -90,7 +92,7 @@ const FIXTURES = Object.freeze({
90
92
  'cli-codex-native': fixture('execute', 'sks codex-native status --json', [], 'pass'),
91
93
  'cli-zellij': fixture('execute', 'npm run zellij:capability --silent', [], 'pass'),
92
94
  'cli-tmux': fixture('not_available', null, [], 'not_required', {
93
- quality: 'missing',
95
+ quality: 'static_contract',
94
96
  reason: 'tmux runtime was removed from SKS (see tmuxCommand in basic-cli.ts and `sks tmux` deprecation notice); the prior fixture command string was not a real invocable command ("removed runtime migration notice: sks tmux --json"), so it is reclassified as not_available instead of being mislabeled mock.',
95
97
  root_mode: 'source_checkout_required'
96
98
  }),
@@ -104,8 +106,7 @@ const FIXTURES = Object.freeze({
104
106
  reason: 'Same underlying simpleGitCommitCommand() as cli-commit plus a real `git push`; genuinely destructive (commits and pushes to the remote) with no real --dry-run support. Left as documented mock rather than execute a real commit+push or invent an unsupported --dry-run mode.'
105
107
  }),
106
108
  'cli-context7': fixture('real_optional', 'sks context7 check --json', [], 'pass'),
107
- 'cli-insane-search': fixture('execute', 'sks insane-search doctor --json', [], 'pass'),
108
- 'cli-ultra-search': fixture('execute', 'sks ultra-search doctor --json', [], 'pass'),
109
+ 'cli-super-search': fixture('execute', 'sks super-search doctor --json', [], 'pass'),
109
110
  'cli-xai': fixture('real_optional', 'sks xai check --json', [], 'pass'),
110
111
  'cli-task': fixture('execute', 'sks task instant --plan --json', [], 'pass'),
111
112
  'cli-release': fixture('execute', 'sks release affected --json', [], 'blocked', { reason: '18차: the phantom requiredSections schema mismatch (five_lane_review/integration_evidence/session_cleanup, from commit d4526f84 with no producer ever wired up) has been fixed -- missing_sections is now honestly empty. The release-gate DAG still legitimately fails/blocks on other real gates (e.g. release:readiness) independent of this fix, so the command still exits non-zero and this fixture stays honestly blocked rather than claiming full green.' }),
@@ -142,9 +143,11 @@ const FIXTURES = Object.freeze({
142
143
  'route-plan': fixture('execute', 'sks plan "fixture" --json', [], 'pass'),
143
144
  'route-review': fixture('execute', 'sks review --diff HEAD --json', [], 'pass'),
144
145
  'route-shadowclone': fixture('static', '$ShadowClone alias of $Naruto shadow-clone swarm route', [], 'pass', {
146
+ quality: 'wiring_only',
145
147
  reason: 'Pure alias of $Naruto; no independent behavior to verify beyond route-naruto\'s own execute_and_validate_artifacts fixture.'
146
148
  }),
147
149
  'route-kagebunshin': fixture('static', '$Kagebunshin alias of $Naruto shadow-clone swarm route', [], 'pass', {
150
+ quality: 'wiring_only',
148
151
  reason: 'Pure alias of $Naruto; no independent behavior to verify beyond route-naruto\'s own execute_and_validate_artifacts fixture.'
149
152
  }),
150
153
  'route-qa-loop': fixture('execute_and_validate_artifacts', 'sks qa-loop run latest --mock --json', ['completion-proof.json', 'qa-gate.json'], 'blocked', { timeout_ms: 180000, reason: 'qaLoopRun() resolves "latest" via the same globally-unscoped findLatestMission used everywhere else and qa-loop is a two-step prepare-then-run workflow gated between steps by an active-route-not-closed check a single fixture command cannot express.' }),
@@ -157,15 +160,13 @@ const FIXTURES = Object.freeze({
157
160
  }),
158
161
  'route-dfix': fixture('execute_and_validate_artifacts', 'sks dfix fixture --json', ['completion-proof.json', 'dfix-gate.json', 'dfix-verification.json'], 'pass'),
159
162
  'route-answer': fixture('static', '$Answer answer-only route policy', [], 'pass', {
163
+ quality: 'wiring_only',
160
164
  reason: 'Policy-only route (answer-only conversational mode with no writes); nothing executable to run beyond static contract text.'
161
165
  }),
162
166
  'route-goal': fixture('mock', '$Goal bridge route', ['goal-workflow.json', 'completion-proof.json'], 'pass', {
163
167
  reason: 'sks goal create "<prompt>" --json never calls maybeFinalizeRoute, so it does not write completion-proof.json even on success; live-testing it also surfaced a real defect (loop-worker-runtime.ts omitted an explicit `agents` value, so buildAgentRoster() fell back to DEFAULT_AGENT_COUNT=5 while maxAgentCount was capped to the loop\'s smaller worker budget, throwing "Agent count 5 exceeds max N" for any ordinary fixture prompt) which has been fixed in this change, but goal-workflow.json/completion-proof.json parity still requires either wiring maybeFinalizeRoute into goalCreate or relaxing this fixture\'s expected_artifacts, both out of scope here; left as documented mock.'
164
168
  }),
165
- 'route-insane-search': fixture('execute', 'sks run "$Insane-Search source intelligence fixture" --execute --json', [], 'pass'),
166
- 'route-insanesearch': fixture('execute', 'sks run "$InsaneSearch source intelligence fixture" --execute --json', [], 'pass'),
167
- 'route-ultra-search': fixture('execute', 'sks run "$Ultra-Search source intelligence fixture" --execute --json', [], 'pass'),
168
- 'route-ultrasearch': fixture('execute', 'sks run "$UltraSearch source intelligence fixture" --execute --json', [], 'pass'),
169
+ 'route-super-search': fixture('execute', 'sks run "$Super-Search doctor" --execute --json', [], 'pass'),
169
170
  'route-seo-geo-optimizer': fixture('execute_and_validate_artifacts', 'sks seo-geo-optimizer fixture --mode geo --json', ['search-visibility/site-inventory.json', 'search-visibility/geo-findings.json', 'search-visibility/verification-report.json', 'geo-gate.json', 'completion-proof.json'], 'pass'),
170
171
  'route-autoresearch': fixture('mock', '$AutoResearch fixture route', ['research-gate.json', 'completion-proof.json'], 'pass', {
171
172
  reason: 'Producing research-gate.json + completion-proof.json requires the two-step `research prepare` then `research run latest --mock --autoresearch --json` sequence (same as route-research\'s safe-args setup step), which a single spawned command cannot express; the $AutoResearch pipeline-dispatch route (`sks run "$AutoResearch ..."`) instead writes autoresearch-gate.json, a different contract. Left as documented mock pending multi-step fixture setup support.'
@@ -184,23 +185,29 @@ const FIXTURES = Object.freeze({
184
185
  'route-wiki': fixture('execute_and_validate_artifacts', 'sks wiki image-ingest test/fixtures/images/one-by-one.png --json', [{ path: 'completion-proof.json', schema: 'sks.completion-proof.v1' }, { path: 'image-voxel-ledger.json', schema: 'sks.image-voxel-ledger.v1' }], 'pass'),
185
186
  'route-gx': fixture('execute_and_validate_artifacts', 'sks gx validate fixture --mock --json', ['completion-proof.json', { path: 'image-voxel-ledger.json', schema: 'sks.image-voxel-ledger.v1' }, 'gx-validation.json'], 'blocked', { reason: 'gxValidateFixture() intentionally exits non-zero (execution_class: mock_fixture) for an honest mock/blocked result; it does write all three declared artifacts.' }),
186
187
  'route-sks': fixture('static', '$SKS control-surface route', ['completion-proof.json'], 'pass', {
188
+ quality: 'wiring_only',
187
189
  reason: 'Pure control-surface alias route with no independent behavior beyond the underlying CLI command fixtures it dispatches to.'
188
190
  }),
189
191
  'route-fast-mode': fixture('execute', 'sks fast-mode status --json', [], 'pass'),
190
192
  'route-fast-on': fixture('static', '$Fast-On covered by hermetic fast-mode blackbox toggle test', [], 'pass', {
193
+ quality: 'wiring_only',
191
194
  reason: 'Toggle-only dollar-command alias; behavior is covered by the hermetic fast-mode blackbox toggle test suite, not a standalone CLI invocation.'
192
195
  }),
193
196
  'route-fast-off': fixture('static', '$Fast-Off covered by hermetic fast-mode blackbox toggle test', [], 'pass', {
197
+ quality: 'wiring_only',
194
198
  reason: 'Toggle-only dollar-command alias; behavior is covered by the hermetic fast-mode blackbox toggle test suite, not a standalone CLI invocation.'
195
199
  }),
196
200
  'route-local-model': fixture('execute', 'sks with-local-llm status --json', [], 'pass'),
197
201
  'route-with-local-llm-on': fixture('static', '$with-local-llm-on covered by hermetic local-model dollar-command blackbox toggle test', [], 'pass', {
202
+ quality: 'wiring_only',
198
203
  reason: 'Toggle-only dollar-command alias; behavior is covered by the hermetic local-model dollar-command blackbox toggle test suite, not a standalone CLI invocation.'
199
204
  }),
200
205
  'route-with-local-llm-off': fixture('static', '$with-local-llm-off covered by hermetic local-model dollar-command blackbox toggle test', [], 'pass', {
206
+ quality: 'wiring_only',
201
207
  reason: 'Toggle-only dollar-command alias; behavior is covered by the hermetic local-model dollar-command blackbox toggle test suite, not a standalone CLI invocation.'
202
208
  }),
203
209
  'route-help': fixture('static', '$Help lightweight route', [], 'pass', {
210
+ quality: 'wiring_only',
204
211
  reason: 'Pure alias of the cli-help command; no independent behavior to verify beyond cli-help\'s own execute fixture.'
205
212
  }),
206
213
  'route-commit': fixture('mock', '$Commit git route', ['completion-proof.json'], 'pass', {
package/dist/core/fsx.js CHANGED
@@ -5,7 +5,7 @@ import os from 'node:os';
5
5
  import crypto from 'node:crypto';
6
6
  import { spawn } from 'node:child_process';
7
7
  import { fileURLToPath } from 'node:url';
8
- export const PACKAGE_VERSION = '5.7.0';
8
+ export const PACKAGE_VERSION = '5.8.0';
9
9
  export const DEFAULT_PROCESS_TAIL_BYTES = 256 * 1024;
10
10
  export const DEFAULT_PROCESS_TIMEOUT_MS = 30 * 60 * 1000;
11
11
  export function nowIso() {
@@ -66,8 +66,7 @@ async function installOfficialSkills(root) {
66
66
  'reasoning-router': `---\nname: reasoning-router\ndescription: Temporary SKS reasoning-effort routing for every command and pipeline route.\n---\n\nmedium: simple copy/color/discovery/setup/mechanical edits. high: logic, safety, architecture, DB, orchestration, refactor, multi-file work. xhigh: research, AutoResearch, falsification, benchmarks, SEO/GEO, open-ended discovery, and From-Chat-IMG image work-order analysis. Routing is temporary; return to default after the gate. Inspect with sks reasoning and sks pipeline status.\n`,
67
67
  'pipeline-runner': `---\nname: pipeline-runner\ndescription: Execute SKS dollar-command routes as stateful pipelines with mission artifacts, route gates, Context7 evidence, temporary reasoning routing, reflection, and Honest Mode.\n---\n\nEvery $ command is a route. Use current.json, mission artifacts, and pipeline-plan.json as the execution plan: it records the lane, skipped stages, kept stages, verification, lean_decision, and no-unrequested-fallback invariant. Use temporary reasoning, TriWiki before stages, source hydration, Context7 when required, Team cleanup before reflection, reflection for full routes, and completion summary plus Honest Mode before final. Surface guard/scopes, record evidence, refresh/pack/validate TriWiki, and check sks pipeline status/resume/plan. ${leanEngineeringCompactText()} ${speedLanePolicyText()} ${skillDreamPolicyText()}\n`,
68
68
  'context7-docs': `---\nname: context7-docs\ndescription: Enforce Context7 MCP documentation evidence for SKS routes that depend on external libraries, frameworks, APIs, MCPs, package managers, DB SDKs, or generated docs.\n---\n\nWhen required, resolve-library-id, then query-docs for the resolved id. Legacy get-library-docs evidence is accepted. Prefer sks context7 tools/resolve/docs/evidence and finish only after both evidence stages exist. Check setup with sks context7 check.\n`,
69
- 'insane-search': `---\nname: insane-search\ndescription: Dollar-command route for $Insane-Search/$InsaneSearch provider-independent source intelligence.\n---\n\nUse when the user invokes $Insane-Search, $InsaneSearch, legacy $Ultra-Search/$UltraSearch, or asks for InsaneSearch source intelligence, source acquisition, X-search-style collection, URL acquisition, source normalization, claim ledgers, or citation proof. Prefer \`sks insane-search doctor --json\` for readiness and \`sks insane-search run "<query>" --mode balanced --json\` for provider-independent source proof; use \`sks insane-search x "<query>" --json\` for X-search intent and \`sks insane-search fetch "<url>" --json\` for URL acquisition. Context7 is required only when the query depends on current package/API/framework/MCP/generated documentation behavior. xAI/Grok credentials are optional and must not be required for route readiness. Evidence/artifacts remain under \`.sneakoscope/missions/<ultra-* or route mission>/ultra-search/\`: intent.json, axes.json, query-variants.json, provider-plan.json, source-ledger.json, lead-ledger.json, claim-ledger.json, synthesis.md, ultra-search-proof.json, ultra-search-gate.json, and ultra-search-result.json. Do not turn weak discovery into supported claims; finish with an Honest Mode summary of verified sources, blockers, and unverified external coverage.\n`,
70
- 'ultra-search': `---\nname: ultra-search\ndescription: Compatibility alias for $Insane-Search/$InsaneSearch provider-independent source intelligence.\n---\n\nUse when the user invokes legacy $Ultra-Search/$UltraSearch or asks for InsaneSearch source intelligence, source acquisition, X-search-style collection, URL acquisition, source normalization, claim ledgers, or citation proof. Prefer \`sks ultra-search doctor --json\` for readiness and \`sks ultra-search run "<query>" --mode balanced --json\` for provider-independent source proof; use \`sks ultra-search x "<query>" --json\` for X-search intent and \`sks ultra-search fetch "<url>" --json\` for URL acquisition. Context7 is required only when the query depends on current package/API/framework/MCP/generated documentation behavior. xAI/Grok credentials are optional and must not be required for route readiness. Evidence/artifacts live under \`.sneakoscope/missions/<ultra-* or route mission>/ultra-search/\`: intent.json, axes.json, query-variants.json, provider-plan.json, source-ledger.json, lead-ledger.json, claim-ledger.json, synthesis.md, ultra-search-proof.json, ultra-search-gate.json, and ultra-search-result.json. Do not turn weak discovery into supported claims; finish with an Honest Mode summary of verified sources, blockers, and unverified external coverage.\n`,
69
+ 'super-search': `---\nname: super-search\ndescription: Dollar-command route for $Super-Search provider-independent source intelligence.\n---\n\nUse when the user invokes $Super-Search or asks for Super-Search source intelligence, source acquisition, X-search-style collection, URL acquisition, source normalization, claim ledgers, or citation proof. Prefer \`sks super-search doctor --json\` for readiness and \`sks super-search run "<query>" --mode balanced --json\` for provider-independent source proof; use \`sks super-search x "<query>" --json\` for X-search intent and \`sks super-search fetch "<url>" --json\` for URL acquisition. Context7 is required only when the query depends on current package/API/framework/MCP/generated documentation behavior. xAI/Grok credentials are optional and must not be required for route readiness. Evidence/artifacts remain under \`.sneakoscope/missions/<super-search-* or route mission>/super-search/\`: intent.json, axes.json, query-variants.json, provider-plan.json, source-ledger.json, lead-ledger.json, claim-ledger.json, attempt-ledger.json, synthesis.md, super-search-proof.json, super-search-gate.json, and super-search-result.json. Do not turn weak discovery into supported claims; finish with an Honest Mode summary of verified sources, blockers, and unverified external coverage.\n`,
71
70
  'search-visibility-core': `---\nname: search-visibility-core\ndescription: Shared kernel for seo-geo-optimizer audit, plan, explicit apply, rollback, verification, gates, and Completion Proof.\n---\n\nPurpose: keep Search Engine Optimization and Generative Engine Optimization on one typed search-visibility kernel instead of duplicate implementations. Use when $SEO-GEO-OPTIMIZER or \`sks seo-geo-optimizer\` is selected. Workflow: doctor detects package/static/Next evidence; audit writes source-backed inventory and findings; plan compiles safe mutation operations; apply requires explicit \`--apply\`; verify separates source, build, HTTP, browser, production, and measured outcome; rollback only reverses mission-owned operations. Safety: default read-only, never overwrite unmanaged robots.txt, sitemap, llms.txt, metadata, or structured data; do not hard-code customer routes; do not invent prices, reviews, availability, rankings, traffic, or AI citation outcomes. Evidence/artifacts: search-visibility/intake.json, adapter-detection.json, site-inventory.json, route-graph.json, robots-policy.json, structured-data-ledger.json, mutation-plan.json, mutation-journal.jsonl, rollback-manifest.json, verification-report.json, route gate, and completion-proof.json. Failure/recovery: unsupported frameworks stay audit/plan-only; missing production/browser/Search Console evidence remains unverified, not fabricated. CLI entrypoint: \`sks seo-geo-optimizer ... --mode seo|geo\`.\n`,
72
71
  'seo-geo-optimizer': `---\nname: seo-geo-optimizer\ndescription: Unified $SEO-GEO-OPTIMIZER route for Search Engine Optimization and Generative Engine Optimization.\n---\n\nPurpose: use one route name for SEO and GEO work while keeping the internal search-visibility mode explicit. Use when: the user asks for SEO audit/fix/verification, package/npm/GitHub search visibility, canonical, sitemap, robots.txt, hreflang, metadata, structured data, AI answer visibility, LLM citation readiness, answerability, entity/claim provenance, crawler policy, OAI-SearchBot/GPTBot/ChatGPT-User, Claude-SearchBot/ClaudeBot/Claude-User, or optional llms.txt planning. GEO means Generative Engine Optimization, not geolocation, GeoIP, maps, CDN geography, location permission, or regional redirect bugs. Workflow: run \`sks seo-geo-optimizer doctor --mode seo|geo\`, then audit, plan, explicit apply, verify, status, and rollback. Use \`--mode seo\` for technical/package search optimization and \`--mode geo\` for entity facts, claim evidence, answerability, crawler policy, and optional llms.txt. Safety: audit and plan must not mutate source; apply checks base hashes, ownership, scope, protected paths, rollback manifest, and post-verify. AI crawler policy must split search, training, user-directed retrieval, and ads/other; never use one allow_ai toggle and never auto-allow training crawlers. Evidence/artifacts: site-inventory.json, route-graph.json, seo-findings.json or geo-findings.json, entity-facts.json, claim-evidence-ledger.json, answerability-report.json, ai-crawler-policy.json, llms-txt-plan.json, mutation-plan.json, verification-report.json, seo-gate.json or geo-gate.json, completion-proof.json. Failure/recovery: unsupported frameworks stay plan-only; browser/production/Search Console/analytics outcomes are marked unverified when not actually run. Forbidden claims: no ranking, indexing, traffic lift, rich-result, answer inclusion, or AI citation guarantee; no keyword stuffing, doorway pages, fake reviews, fake prices, fake availability, fake shipping, fake awards, hidden AI-only text, or scaled spam. CLI entrypoint: \`sks seo-geo-optimizer doctor|audit|plan|apply|verify|status|rollback|fixture --mode seo|geo\`.\n`,
73
72
  'reflection': `---\nname: reflection\ndescription: Post-route self-review for full SKS routes that records real misses, gaps, and corrective lessons into TriWiki memory.\n---\n\nUse after full route work/tests and before final. DFix, Answer, Help, Wiki, SKS discovery are exempt. Do not invent faults. Write reflection.md; append real lessons to ${REFLECTION_MEMORY_PATH}; refresh/pack, validate context-pack.json, pass reflection-gate.json.\n\n${reflectionInstructionText()}\n`,
@@ -116,21 +116,7 @@ export async function closeRouteState(root, input = {}) {
116
116
  if (input.missionId && current.mission_id && String(current.mission_id) !== String(input.missionId)) {
117
117
  return { ok: false, status: 'mission_mismatch', mission_id: missionId, current_mission_id: current.mission_id };
118
118
  }
119
- const next = {
120
- ...current,
121
- mission_id: missionId || current.mission_id || null,
122
- route_closed: true,
123
- route_closed_at: nowIso(),
124
- route_close_reason: input.reason || 'route_close_command',
125
- implementation_allowed: false,
126
- questions_allowed: true,
127
- mad_sks_active: false,
128
- permission_gate_active: false,
129
- gate_owner_mission_id: null,
130
- phase: current.phase ? `${current.phase}_CLOSED` : 'ROUTE_CLOSED',
131
- updated_at: nowIso(),
132
- ...(sessionKey ? { _session_key: sessionKey } : {})
133
- };
119
+ const next = closedRouteState(current, missionId, input.reason, sessionKey);
134
120
  if (sessionKey) {
135
121
  await ensureDir(stateSessionsDir(root));
136
122
  await writeJsonAtomic(targetFile, next);
@@ -138,6 +124,9 @@ export async function closeRouteState(root, input = {}) {
138
124
  }
139
125
  else {
140
126
  await writeJsonAtomic(stateFile(root), next);
127
+ for (const row of await matchingSessionStates(root, missionId, current._session_key)) {
128
+ await writeJsonAtomic(row.path, closedRouteState(row.state, missionId, input.reason, row.session_key));
129
+ }
141
130
  }
142
131
  if (missionId) {
143
132
  await appendJsonl(path.join(missionDir(root, missionId), 'events.jsonl'), {
@@ -150,6 +139,43 @@ export async function closeRouteState(root, input = {}) {
150
139
  return { ok: true, status: 'closed', mission_id: missionId || null, state_file: targetFile };
151
140
  });
152
141
  }
142
+ function closedRouteState(current, missionId, reason, sessionKey) {
143
+ const phase = String(current.phase || '');
144
+ return {
145
+ ...current,
146
+ mission_id: missionId || current.mission_id || null,
147
+ route_closed: true,
148
+ route_closed_at: nowIso(),
149
+ route_close_reason: reason || 'route_close_command',
150
+ implementation_allowed: false,
151
+ questions_allowed: true,
152
+ mad_sks_active: false,
153
+ permission_gate_active: false,
154
+ gate_owner_mission_id: null,
155
+ phase: phase ? (/_CLOSED$/i.test(phase) ? phase : `${phase}_CLOSED`) : 'ROUTE_CLOSED',
156
+ updated_at: nowIso(),
157
+ ...(sessionKey ? { _session_key: sessionKey } : {})
158
+ };
159
+ }
160
+ async function matchingSessionStates(root, missionId, preferredSessionKey) {
161
+ const dir = stateSessionsDir(root);
162
+ const rows = [];
163
+ if (!(await exists(dir)))
164
+ return rows;
165
+ const fs = await import('node:fs/promises');
166
+ const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
167
+ for (const entry of entries) {
168
+ if (!entry.isFile() || !entry.name.endsWith('.json'))
169
+ continue;
170
+ const file = path.join(dir, entry.name);
171
+ const state = await readJson(file, {}).catch(() => ({}));
172
+ const key = String(state._session_key || entry.name.replace(/\.json$/, ''));
173
+ if (String(state.mission_id || '') === missionId || (preferredSessionKey && key === String(preferredSessionKey))) {
174
+ rows.push({ session_key: key, path: file, state });
175
+ }
176
+ }
177
+ return rows;
178
+ }
153
179
  function withStateLock(root, fn) {
154
180
  return withFileLock({ lockPath: stateLockPath(root), timeoutMs: 20_000, staleMs: 120_000 }, fn);
155
181
  }
@@ -17,7 +17,7 @@ export const RELEASE_1_17_GATE_SNAPSHOT = Object.freeze([
17
17
  'release:readiness'
18
18
  ]);
19
19
  export const RELEASE_1_18_REQUIRED_GATES = Object.freeze([
20
- 'insane-search:provider-interface',
20
+ 'super-search:provider-interface',
21
21
  'source-intelligence:policy',
22
22
  'source-intelligence:all-modes',
23
23
  'codex-web:adapter',
@@ -109,7 +109,7 @@ export async function storageReport(root) {
109
109
  report.total_human = formatBytes(report.total_bytes);
110
110
  return report;
111
111
  }
112
- async function lightweightStorageReport(root) {
112
+ export async function lightweightStorageReport(root) {
113
113
  const sks = path.join(root, '.sneakoscope');
114
114
  const report = {
115
115
  root,
@@ -9,7 +9,7 @@ export const FROM_CHAT_IMG_CHECKLIST_ARTIFACT = 'from-chat-img-checklist.md';
9
9
  export const FROM_CHAT_IMG_TEMP_TRIWIKI_ARTIFACT = 'from-chat-img-temp-triwiki.json';
10
10
  export const FROM_CHAT_IMG_QA_LOOP_ARTIFACT = 'from-chat-img-qa-loop.json';
11
11
  export const FROM_CHAT_IMG_TEMP_TRIWIKI_SESSIONS = 5;
12
- export const USAGE_TOPICS = 'install|setup|bootstrap|root|deps|zellij|tmux|auto-review|team|qa-loop|ppt|image-ux-review|computer-use|goal|fast-mode|review|ui|research|seo-geo-optimizer|db|git|codex|codex-app|codex-native|hooks|features|all-features|dfix|commit|commit-and-push|design|imagegen|dollar|context7|insane-search|ultra-search|xai|pipeline|reasoning|guard|conflicts|versioning|eval|harness|hproof|gx|wiki|memory|wrongness|code-structure|proof-field|skill-dream|rust';
12
+ export const USAGE_TOPICS = 'install|setup|bootstrap|root|deps|zellij|tmux|auto-review|team|qa-loop|ppt|image-ux-review|computer-use|goal|fast-mode|review|ui|research|seo-geo-optimizer|db|git|codex|codex-app|codex-native|hooks|features|all-features|dfix|commit|commit-and-push|design|imagegen|dollar|context7|super-search|xai|pipeline|reasoning|guard|conflicts|versioning|eval|harness|hproof|gx|wiki|memory|wrongness|code-structure|proof-field|skill-dream|rust';
13
13
  export const RECOMMENDED_MCP_SERVERS = [
14
14
  {
15
15
  id: 'context7',
@@ -30,7 +30,7 @@ export const RECOMMENDED_SKILLS = [
30
30
  'pipeline-runner',
31
31
  'solution-scout',
32
32
  'context7-docs',
33
- 'ultra-search',
33
+ 'super-search',
34
34
  'search-visibility-core',
35
35
  'seo-geo-optimizer',
36
36
  'autoresearch-loop',