sneakoscope 6.1.0 → 6.2.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 (246) hide show
  1. package/README.md +35 -11
  2. package/crates/sks-core/Cargo.lock +1 -1
  3. package/crates/sks-core/Cargo.toml +1 -1
  4. package/dist/bin/fast-inline.js +18 -9
  5. package/dist/bin/sks-dispatch.js +2 -2
  6. package/dist/cli/args.js +2 -0
  7. package/dist/cli/command-manifest-lite.js +2 -3
  8. package/dist/cli/command-registry.js +3 -4
  9. package/dist/cli/help-fast.js +1 -1
  10. package/dist/cli/install-helpers.js +116 -306
  11. package/dist/cli/install-tool-helpers.js +287 -0
  12. package/dist/cli/router.js +40 -4
  13. package/dist/commands/codex-lb.js +51 -20
  14. package/dist/commands/codex.js +39 -1
  15. package/dist/commands/doctor.js +242 -20
  16. package/dist/commands/tmux.js +5 -1
  17. package/dist/commands/zellij-monitor-pane.js +2 -0
  18. package/dist/commands/zellij-viewport-pane.js +3 -1
  19. package/dist/commands/zellij.js +1 -1
  20. package/dist/config/skills-manifest.json +59 -59
  21. package/dist/core/agent-bridge/agent-manifest.js +48 -0
  22. package/dist/core/agents/agent-command-surface.js +2 -1
  23. package/dist/core/agents/agent-effort-policy.js +38 -35
  24. package/dist/core/agents/agent-plan.js +100 -21
  25. package/dist/core/agents/agent-role-config.js +43 -46
  26. package/dist/core/agents/agent-runner-codex-exec.js +16 -3
  27. package/dist/core/agents/agent-schema.js +3 -2
  28. package/dist/core/agents/native-cli-session-swarm.js +1 -1
  29. package/dist/core/agents/zellij-right-lane-cockpit.js +2 -2
  30. package/dist/core/codex/agent-config-file-repair.js +94 -193
  31. package/dist/core/codex/codex-cli-update.js +723 -0
  32. package/dist/core/codex/codex-config-guard.js +185 -9
  33. package/dist/core/codex/codex-config-readability.js +21 -8
  34. package/dist/core/codex/codex-config-toml.js +14 -11
  35. package/dist/core/codex/codex-project-config-policy.js +3 -6
  36. package/dist/core/codex/codex-startup-config-postcheck.js +52 -42
  37. package/dist/core/codex-adapter.js +35 -22
  38. package/dist/core/codex-app/codex-agent-role-sync.js +13 -54
  39. package/dist/core/codex-app/codex-app-launcher.js +48 -17
  40. package/dist/core/codex-app/codex-app-restart.js +23 -2
  41. package/dist/core/codex-app/mcp-manager.js +679 -0
  42. package/dist/core/codex-app/sks-menubar.js +533 -8
  43. package/dist/core/codex-control/codex-0139-image-path-real-probe.js +15 -4
  44. package/dist/core/codex-control/codex-0139-web-search-probe.js +17 -6
  45. package/dist/core/codex-control/codex-lb-launch-recovery.js +293 -0
  46. package/dist/core/codex-control/codex-reliability-shield.js +89 -29
  47. package/dist/core/codex-control/codex-sdk-adapter.js +44 -8
  48. package/dist/core/codex-control/codex-task-runner.js +62 -9
  49. package/dist/core/codex-control/python-codex-sdk-adapter.js +30 -3
  50. package/dist/core/codex-exec-output-schema.js +35 -6
  51. package/dist/core/codex-lb/codex-lb-env.js +1 -1
  52. package/dist/core/codex-lb/codex-lb-tool-output-recovery.js +291 -0
  53. package/dist/core/codex-native/codex-native-feature-broker.js +9 -16
  54. package/dist/core/codex-native/codex-native-repair-transaction.js +1 -1
  55. package/dist/core/codex-native/core-skill-manifest.js +8 -4
  56. package/dist/core/codex-runtime/codex-desktop-config-policy.js +2 -3
  57. package/dist/core/commands/agent-bridge-command.js +23 -2
  58. package/dist/core/commands/agent-command.js +19 -5
  59. package/dist/core/commands/basic-cli.js +47 -6
  60. package/dist/core/commands/command-utils.js +1 -1
  61. package/dist/core/commands/mad-sks-command.js +76 -10
  62. package/dist/core/commands/menubar-command.js +94 -0
  63. package/dist/core/commands/naruto-command.js +645 -1156
  64. package/dist/core/commands/research-command.js +293 -231
  65. package/dist/core/commands/run-command.js +100 -23
  66. package/dist/core/commands/team-command.js +2 -3
  67. package/dist/core/commands/team-legacy-observe-command.js +94 -359
  68. package/dist/core/commands/wiki-command.js +11 -5
  69. package/dist/core/db-safety.js +2 -2
  70. package/dist/core/decision-lattice.js +6 -6
  71. package/dist/core/doctor/codex-startup-config-repair.js +8 -3
  72. package/dist/core/doctor/doctor-codex-startup-repair.js +6 -141
  73. package/dist/core/feature-fixture-executor.js +71 -7
  74. package/dist/core/feature-fixture-runner.js +53 -12
  75. package/dist/core/feature-fixtures.js +47 -14
  76. package/dist/core/feature-registry.js +28 -27
  77. package/dist/core/fsx.js +1 -0
  78. package/dist/core/harness-conflicts.js +18 -9
  79. package/dist/core/hooks-runtime/code-pack-freshness-preflight.js +14 -8
  80. package/dist/core/hooks-runtime/hook-io.js +8 -4
  81. package/dist/core/hooks-runtime/light-turn.js +70 -0
  82. package/dist/core/hooks-runtime/naruto-decision-gate.js +184 -0
  83. package/dist/core/hooks-runtime/payload-signals.js +270 -0
  84. package/dist/core/hooks-runtime/stop-repeat-guard.js +89 -0
  85. package/dist/core/hooks-runtime/team-digest.js +0 -1
  86. package/dist/core/hooks-runtime/tool-output-quarantine.js +93 -0
  87. package/dist/core/hooks-runtime.js +438 -354
  88. package/dist/core/init/skills.js +16 -30
  89. package/dist/core/init.js +144 -36
  90. package/dist/core/managed-assets/managed-assets-manifest.js +566 -10
  91. package/dist/core/mission.js +24 -1
  92. package/dist/core/pipeline-internals/runtime-core.js +570 -177
  93. package/dist/core/pipeline-internals/runtime-gates.js +174 -48
  94. package/dist/core/preflight/parallel-preflight-engine.js +66 -4
  95. package/dist/core/proof/route-adapter.js +1 -1
  96. package/dist/core/proof/route-proof-gate.js +7 -2
  97. package/dist/core/proof/selftest-proof-fixtures.js +3 -5
  98. package/dist/core/proof-field.js +1 -1
  99. package/dist/core/provider/model-router.js +42 -31
  100. package/dist/core/recallpulse/policy.js +12 -28
  101. package/dist/core/recallpulse.js +11 -6
  102. package/dist/core/release/npm-pack-proof.js +247 -0
  103. package/dist/core/release/package-dist-snapshot.js +151 -0
  104. package/dist/core/release/package-size-budget.js +4 -1
  105. package/dist/core/release/release-authorization-snapshot.js +115 -0
  106. package/dist/core/release/release-gate-affected-selector.js +14 -2
  107. package/dist/core/release/release-gate-cache-v2.js +30 -0
  108. package/dist/core/release/release-gate-contract.js +161 -0
  109. package/dist/core/release/release-gate-dag.js +1 -0
  110. package/dist/core/release/release-real-contract.js +90 -10
  111. package/dist/core/release-parallel-full-coverage.js +31 -143
  112. package/dist/core/research/claim-evidence-matrix.js +41 -6
  113. package/dist/core/research/experiment-plan.js +14 -10
  114. package/dist/core/research/falsification.js +9 -2
  115. package/dist/core/research/implementation-blueprint-densifier.js +82 -60
  116. package/dist/core/research/implementation-blueprint.js +32 -26
  117. package/dist/core/research/mock-result.js +122 -11
  118. package/dist/core/research/replication-pack.js +15 -8
  119. package/dist/core/research/research-adversarial-review.js +1068 -0
  120. package/dist/core/research/research-claim-builder.js +69 -17
  121. package/dist/core/research/research-claim-synthesizer.js +343 -0
  122. package/dist/core/research/research-cycle-runner.js +53 -3
  123. package/dist/core/research/research-falsification-runner.js +176 -0
  124. package/dist/core/research/research-final-reviewer.js +44 -125
  125. package/dist/core/research/research-plan-markdown.js +123 -0
  126. package/dist/core/research/research-realistic-report.js +14 -6
  127. package/dist/core/research/research-review-artifact-digest.js +66 -0
  128. package/dist/core/research/research-source-evidence.js +144 -0
  129. package/dist/core/research/research-source-layer-catalog.js +68 -0
  130. package/dist/core/research/research-source-ledger-merge.js +250 -12
  131. package/dist/core/research/research-source-shards.js +26 -70
  132. package/dist/core/research/research-stage-runner.js +237 -247
  133. package/dist/core/research/research-super-search.js +188 -0
  134. package/dist/core/research/research-synthesis-prompt.js +20 -1
  135. package/dist/core/research/research-synthesis-writer.js +86 -5
  136. package/dist/core/research/research-work-graph.js +25 -18
  137. package/dist/core/research/source-quality-report.js +21 -0
  138. package/dist/core/research.js +424 -390
  139. package/dist/core/retention.js +70 -2
  140. package/dist/core/routes/constants.js +1 -1
  141. package/dist/core/routes/dollar-manifest-lite.js +11 -11
  142. package/dist/core/routes.js +149 -69
  143. package/dist/core/runtime/task-profile.js +66 -0
  144. package/dist/core/runtime/verification-budget.js +12 -0
  145. package/dist/core/security/high-risk-contracts.js +6 -6
  146. package/dist/core/stop-gate/stop-gate-check.js +49 -12
  147. package/dist/core/subagents/agent-catalog.js +287 -0
  148. package/dist/core/subagents/model-policy.js +259 -0
  149. package/dist/core/subagents/naruto-help-contract.js +47 -0
  150. package/dist/core/subagents/official-subagent-config.js +488 -0
  151. package/dist/core/subagents/official-subagent-preparation.js +297 -0
  152. package/dist/core/subagents/official-subagent-prompt.js +159 -0
  153. package/dist/core/subagents/official-subagent-runner.js +129 -0
  154. package/dist/core/subagents/subagent-evidence.js +663 -0
  155. package/dist/core/subagents/terminology.js +16 -0
  156. package/dist/core/subagents/thread-budget.js +21 -0
  157. package/dist/core/subagents/triwiki-attention.js +168 -0
  158. package/dist/core/super-search/runtime-helpers.js +173 -19
  159. package/dist/core/super-search/runtime.js +140 -15
  160. package/dist/core/super-search/source-records.js +49 -8
  161. package/dist/core/team-review-policy.js +15 -0
  162. package/dist/core/triwiki/code-pack-head-freshness.js +291 -0
  163. package/dist/core/triwiki/triwiki-module-card.js +1 -1
  164. package/dist/core/triwiki-wrongness/wrongness-ledger.js +9 -2
  165. package/dist/core/version-manager.js +51 -1
  166. package/dist/core/version.js +1 -1
  167. package/dist/core/work-order-ledger.js +40 -1
  168. package/dist/core/zellij/zellij-fake-adapter.js +3 -1
  169. package/dist/core/zellij/zellij-launcher.js +49 -10
  170. package/dist/core/zellij/zellij-layout-builder.js +14 -5
  171. package/dist/core/zellij/zellij-official-subagent-activity.js +477 -0
  172. package/dist/core/zellij/zellij-official-subagent-telemetry.js +264 -0
  173. package/dist/core/zellij/zellij-pane-proof.js +9 -1
  174. package/dist/core/zellij/zellij-slot-pane-renderer.js +17 -5
  175. package/dist/core/zellij/zellij-slot-telemetry.js +15 -3
  176. package/dist/core/zellij/zellij-ui-mode.js +1 -1
  177. package/dist/core/zellij/zellij-update.js +14 -1
  178. package/dist/core/zellij/zellij-viewport-binder.js +3 -0
  179. package/dist/scripts/agent-role-config-repair-check.js +14 -16
  180. package/dist/scripts/architecture-guard-check.js +8 -1
  181. package/dist/scripts/canonical-test-runner.js +7 -1
  182. package/dist/scripts/check-route-modularity.js +0 -1
  183. package/dist/scripts/check-ts-contracts.js +1 -1
  184. package/dist/scripts/codex-control-all-pipelines-check.js +7 -3
  185. package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +27 -0
  186. package/dist/scripts/codex-lb-fast-mode-truth-check.js +11 -1
  187. package/dist/scripts/codex-lb-fast-ui-preservation-check.js +9 -2
  188. package/dist/scripts/codex-lb-gpt56-fast-profile-check.js +13 -2
  189. package/dist/scripts/codex-native-agent-role-content-check.js +27 -7
  190. package/dist/scripts/codex-native-repair-transaction-check.js +3 -1
  191. package/dist/scripts/codex-sdk-all-pipelines-check.js +7 -4
  192. package/dist/scripts/codex-sdk-backend-router-check.js +2 -0
  193. package/dist/scripts/codex-sdk-research-pipeline-check.js +30 -8
  194. package/dist/scripts/db-route-materialization-check.js +33 -0
  195. package/dist/scripts/docs-truthfulness-check.js +3 -1
  196. package/dist/scripts/doctor-codex-startup-repair-check.js +12 -15
  197. package/dist/scripts/doctor-fix-production-blackbox.js +12 -2
  198. package/dist/scripts/doctor-startup-config-repair-blackbox.js +8 -2
  199. package/dist/scripts/doctor-startup-config-repair-check.js +12 -2
  200. package/dist/scripts/install-update-preserves-config-check.js +6 -1
  201. package/dist/scripts/lib/codex-sdk-gate-lib.js +4 -0
  202. package/dist/scripts/mad-sks-app-ui-no-mutation-check.js +0 -1
  203. package/dist/scripts/managed-role-manifest-parity-check.js +5 -4
  204. package/dist/scripts/naruto-codex-e2e-check.js +14 -7
  205. package/dist/scripts/naruto-shadow-clone-swarm-check.js +4 -201
  206. package/dist/scripts/npm-publish-performance-check.js +20 -12
  207. package/dist/scripts/official-subagent-workflow-check.js +145 -0
  208. package/dist/scripts/package-published-contract-check.js +6 -29
  209. package/dist/scripts/packlist-performance-check.js +18 -21
  210. package/dist/scripts/parallel-verification-engine-check.js +2 -2
  211. package/dist/scripts/prepublish-release-check-or-fast.js +23 -86
  212. package/dist/scripts/python-codex-sdk-all-pipelines-check.js +8 -0
  213. package/dist/scripts/release-affected-selector-check.js +74 -1
  214. package/dist/scripts/release-check-stamp.js +153 -248
  215. package/dist/scripts/release-dag-full-coverage-check.js +7 -15
  216. package/dist/scripts/release-dynamic-presets-check.js +2 -1
  217. package/dist/scripts/release-gate-dag-runner-check.js +0 -1
  218. package/dist/scripts/release-gate-dag-runner.js +12 -1
  219. package/dist/scripts/release-gate-existence-audit.js +1 -2
  220. package/dist/scripts/release-parallel-full-coverage-check.js +12 -6
  221. package/dist/scripts/release-parallel-speed-budget-check.js +18 -2
  222. package/dist/scripts/release-real-check.js +26 -4
  223. package/dist/scripts/release-registry-check.js +61 -16
  224. package/dist/scripts/research-blueprint-densifier-check.js +2 -2
  225. package/dist/scripts/research-real-cycle-no-legacy-final-md-check.js +11 -7
  226. package/dist/scripts/sizecheck.js +2 -2
  227. package/dist/scripts/sks-3-1-4-directive-check-lib.js +8 -2
  228. package/dist/scripts/sks-3-1-5-directive-check-lib.js +3 -2
  229. package/dist/scripts/sks-3-1-6-directive-check-lib.js +5 -3
  230. package/dist/scripts/sks-menubar-install-check.js +14 -1
  231. package/dist/scripts/super-search-provider-interface-check.js +31 -18
  232. package/dist/scripts/trust-fixture-check.js +32 -10
  233. package/dist/scripts/wrongness-fixture-check.js +1 -1
  234. package/dist/scripts/zellij-layout-valid-check.js +5 -5
  235. package/dist/scripts/zellij-spawn-on-demand-layout-check.js +3 -3
  236. package/docs/demo.tape +1 -1
  237. package/infra-harness-gates.json +1486 -0
  238. package/package.json +15 -10
  239. package/release-gates.v2.json +4060 -0
  240. package/runtime-required-scripts.json +9 -0
  241. package/dist/commands/db.js +0 -6
  242. package/dist/core/commands/db-command.js +0 -146
  243. package/dist/core/research/prompt.js +0 -15
  244. package/dist/scripts/codex-0139-feature-probes-check.js +0 -30
  245. package/dist/scripts/codex-0139-marketplace-source-check.js +0 -13
  246. package/dist/scripts/codex-control-tool-call-sequence-repair-check.js +0 -14
@@ -8,6 +8,8 @@ import { getCodexInfo } from '../core/codex-adapter.js';
8
8
  import { rustInfo } from '../core/rust-accelerator.js';
9
9
  import { codexAppIntegrationStatus } from '../core/codex-app.js';
10
10
  import { codexLbMetrics, readCodexLbCircuit } from '../core/codex-lb-circuit.js';
11
+ import { codexLbStatus } from '../cli/install-helpers.js';
12
+ import { codexLbToolOutputRecoveryOverrideAcknowledged } from '../core/codex-lb/codex-lb-tool-output-recovery.js';
11
13
  import { normalizeInstallScope } from '../core/init.js';
12
14
  import { inspectCodexConfigReadability } from '../core/codex/codex-config-readability.js';
13
15
  import { checkZellijCapability } from '../core/zellij/zellij-capability.js';
@@ -26,9 +28,35 @@ import { inspectSksMenuBarStatus, installSksMenuBar } from '../core/codex-app/sk
26
28
  import { sweepSksTempDirs } from '../core/retention.js';
27
29
  import { detectImagegenCapability } from '../core/imagegen/imagegen-capability.js';
28
30
  import { CURRENT_CODEX_RELEASE_MANIFEST } from '../core/codex-compat/codex-release-manifest.js';
29
- export async function run(_command, args = []) {
31
+ import { formatHarnessConflictReport, scanHarnessConflicts } from '../core/harness-conflicts.js';
32
+ export async function run(_command, args = [], deps = {}) {
30
33
  const root = await projectRoot();
31
34
  const doctorFix = flag(args, '--fix');
35
+ const globalOnly = doctorFix && flag(args, '--global-only');
36
+ if (doctorFix) {
37
+ const conflictScan = await scanHarnessConflicts(root);
38
+ if (conflictScan.hard_block) {
39
+ const blocked = {
40
+ schema: 'sks.doctor-status.v3',
41
+ ok: false,
42
+ status: 'blocked_harness_conflict',
43
+ diagnostic_depth: 'fix',
44
+ root,
45
+ blockers: conflictScan.hard.map((item) => `${item.name || 'harness'}:${item.path}`),
46
+ conflicts: conflictScan.conflicts,
47
+ cleanup_prompt_command: 'sks conflicts prompt',
48
+ no_fix_writes_performed: true
49
+ };
50
+ process.exitCode = 1;
51
+ if (flag(args, '--json')) {
52
+ printJson(blocked);
53
+ return blocked;
54
+ }
55
+ console.error(formatHarnessConflictReport(conflictScan, { includePrompt: false }));
56
+ console.error('Run `sks conflicts prompt` and obtain explicit human approval before cleanup.');
57
+ return blocked;
58
+ }
59
+ }
32
60
  const doctorProfile = doctorProfileFromArgs(args, doctorFix);
33
61
  if (!flag(args, '--json')) {
34
62
  cliUi.banner('doctor');
@@ -36,10 +64,153 @@ export async function run(_command, args = []) {
36
64
  }
37
65
  if (!doctorFix && flag(args, '--json') && doctorProfile === 'fast')
38
66
  return runDoctorJsonFastPath(args, root);
39
- if (doctorFix)
40
- return withSecretPreservationGuard(root, 'doctor-fix', () => runDoctor(args, root, doctorFix));
67
+ if (doctorFix) {
68
+ const guardRoot = globalOnly
69
+ ? path.resolve(deps.home || process.env.HOME || os.homedir())
70
+ : root;
71
+ return withSecretPreservationGuard(guardRoot, 'doctor-fix', async () => (globalOnly
72
+ ? runDoctorGlobalOnlyFix(args, root, deps)
73
+ : runDoctor(args, root, doctorFix)));
74
+ }
41
75
  return runDoctor(args, root, doctorFix);
42
76
  }
77
+ export async function executeDoctorGlobalOnlyFix(args = [], root, deps = {}) {
78
+ const startedAtMs = Date.now();
79
+ const home = path.resolve(deps.home || process.env.HOME || os.homedir());
80
+ const reconcileSkillsImpl = deps.reconcileSkillsImpl
81
+ || (await import('../core/init/skills.js')).reconcileSkills;
82
+ const ensureGlobalFastModeImpl = deps.ensureGlobalCodexFastModeDuringInstallImpl
83
+ || (await import('../cli/install-helpers.js')).ensureGlobalCodexFastModeDuringInstall;
84
+ const installMenuBarImpl = deps.installSksMenuBarImpl || installSksMenuBar;
85
+ const codexLbStatusImpl = deps.codexLbStatusImpl || codexLbStatus;
86
+ const providerStatus = await codexLbStatusImpl({
87
+ probeToolOutputRecovery: true,
88
+ allowUnverifiedToolOutputRecovery: codexLbToolOutputRecoveryOverrideAcknowledged({ args })
89
+ }).catch((err) => ({
90
+ selected: null,
91
+ provider_ready: false,
92
+ recovery_probe_failed: true,
93
+ tool_output_recovery: {
94
+ ok: false,
95
+ status: 'probe_failed',
96
+ blockers: ['codex_lb_tool_output_recovery_status_probe_failed'],
97
+ operator_actions: []
98
+ },
99
+ error: err?.message || String(err)
100
+ }));
101
+ const globalSkills = await reconcileSkillsImpl({
102
+ targetDir: path.join(home, '.agents', 'skills'),
103
+ scope: 'global',
104
+ fix: true
105
+ }).catch((err) => ({
106
+ schema: 'sks.skill-reconcile.v1',
107
+ scope: 'global',
108
+ target_dir: path.join(home, '.agents', 'skills'),
109
+ fix: true,
110
+ error: err?.message || String(err),
111
+ core_skill_integrity: { ok: false, installed_count: 0, restored_count: 0 }
112
+ }));
113
+ const globalFastMode = await ensureGlobalFastModeImpl().catch((err) => ({
114
+ status: 'failed',
115
+ error: err?.message || String(err)
116
+ }));
117
+ const menuBar = await installMenuBarImpl({
118
+ home,
119
+ root: home,
120
+ apply: true,
121
+ launch: true,
122
+ quiet: flag(args, '--json') || flag(args, '--machine-only')
123
+ }).catch((err) => ({
124
+ schema: 'sks.codex-app-sks-menubar.v1',
125
+ ok: false,
126
+ status: 'blocked',
127
+ blockers: [err?.message || String(err)],
128
+ warnings: []
129
+ }));
130
+ const recoveryReady = codexLbRecoveryStatusReady(providerStatus, true);
131
+ const globalSkillsReady = !globalSkills?.error
132
+ && globalSkills?.core_skill_integrity?.ok !== false;
133
+ const globalFastModeReady = globalFastMode?.status !== 'failed'
134
+ && globalFastMode?.ok !== false;
135
+ const menuBarReady = menuBar?.ok !== false;
136
+ const blockers = [...new Set([
137
+ ...(!globalSkillsReady ? [`global_skills_reconcile_failed:${globalSkills?.error || 'core_skill_integrity'}`] : []),
138
+ ...(!globalFastModeReady ? [`global_fast_mode_repair_failed:${globalFastMode?.error || globalFastMode?.status || 'unknown'}`] : []),
139
+ ...(!menuBarReady ? (menuBar?.blockers || ['sks_menubar_repair_failed']) : []),
140
+ ...(!recoveryReady ? (providerStatus?.tool_output_recovery?.blockers || ['codex_lb_tool_output_recovery_unverified']) : [])
141
+ ].map(String).filter(Boolean))];
142
+ const ok = blockers.length === 0;
143
+ return {
144
+ schema: 'sks.doctor-status.v3',
145
+ elapsed_ms: Date.now() - startedAtMs,
146
+ ok,
147
+ status: ok ? 'global_fix_ok' : 'blocked',
148
+ diagnostic_depth: 'global-only',
149
+ global_only: true,
150
+ install_scope: 'global',
151
+ root,
152
+ home,
153
+ project_root_alias_detected: path.resolve(root) === home,
154
+ no_project_writes_performed: true,
155
+ project_phases_skipped: [
156
+ 'project_skills_reconcile',
157
+ 'project_codex_config_repair',
158
+ 'project_context7_mcp_repair',
159
+ 'project_supabase_mcp_repair',
160
+ 'project_hook_trust_repair',
161
+ 'project_command_alias_cleanup',
162
+ 'project_migration_receipt'
163
+ ],
164
+ skills: { global: globalSkills, project: { skipped: true, reason: 'global_only_doctor' } },
165
+ codex_app_fast_mode: globalFastMode,
166
+ sks_menubar: menuBar,
167
+ codex_lb: {
168
+ provider_status: providerStatus,
169
+ tool_output_recovery: providerStatus?.tool_output_recovery || null,
170
+ recovery_ok: recoveryReady
171
+ },
172
+ blockers,
173
+ next_actions: [
174
+ ...(recoveryReady ? [] : (providerStatus?.tool_output_recovery?.operator_actions || [])),
175
+ 'Run `sks doctor --fix --json` from a specific project directory when project-scoped repair is required.'
176
+ ]
177
+ };
178
+ }
179
+ async function runDoctorGlobalOnlyFix(args = [], root, deps = {}) {
180
+ const result = await executeDoctorGlobalOnlyFix(args, root, deps);
181
+ const reportFile = readOption(args, '--report-file', null);
182
+ if (reportFile)
183
+ await writeJsonReportFile(reportFile, result);
184
+ if (flag(args, '--machine-only') && !flag(args, '--json')) {
185
+ if (!result.ok)
186
+ process.exitCode = 1;
187
+ return result;
188
+ }
189
+ if (flag(args, '--json')) {
190
+ printJson(result);
191
+ }
192
+ else {
193
+ console.log(`SKS Doctor global repair: ${result.ok ? 'ok' : 'blocked'}`);
194
+ console.log(`Global skills: ${result.skills.global?.error ? 'blocked' : 'reconciled'}`);
195
+ console.log(`SKS menu bar: ${result.sks_menubar?.status || (result.sks_menubar?.ok ? 'ok' : 'blocked')}`);
196
+ for (const blocker of result.blockers)
197
+ console.log(`- blocker: ${blocker}`);
198
+ for (const action of result.next_actions)
199
+ console.log(`- ${action}`);
200
+ }
201
+ if (!result.ok)
202
+ process.exitCode = 1;
203
+ return result;
204
+ }
205
+ function codexLbRecoveryStatusReady(status, probeRequired = false) {
206
+ if (status == null)
207
+ return !probeRequired;
208
+ if (status.recovery_probe_failed === true || status.error)
209
+ return false;
210
+ if (status.selected === false)
211
+ return true;
212
+ return status.selected === true && status.tool_output_recovery?.ok === true;
213
+ }
43
214
  async function runDoctorJsonFastPath(args = [], root) {
44
215
  const startedAtMs = Date.now();
45
216
  const codexBin = readOption(args, '--codex-bin', process.env.SKS_DOCTOR_CODEX_BIN || '');
@@ -359,7 +530,31 @@ async function runDoctor(args = [], root, doctorFix) {
359
530
  const codexApp = deepDiagnostics
360
531
  ? await codexAppIntegrationStatus({ codex }).catch((err) => ({ ok: false, error: err.message }))
361
532
  : { ok: false, skipped: true, warnings: ['codex_app_optional_diagnostic_skipped'] };
362
- const codexLb = codexLbMetrics(await readCodexLbCircuit(root).catch(() => ({})));
533
+ const codexLbCircuit = codexLbMetrics(await readCodexLbCircuit(root).catch(() => ({})));
534
+ const codexLbProviderStatus = deepDiagnostics || doctorFix
535
+ ? await codexLbStatus({
536
+ probeToolOutputRecovery: true,
537
+ allowUnverifiedToolOutputRecovery: codexLbToolOutputRecoveryOverrideAcknowledged({ args })
538
+ }).catch((err) => ({
539
+ selected: null,
540
+ provider_ready: false,
541
+ recovery_probe_failed: true,
542
+ tool_output_recovery: {
543
+ ok: false,
544
+ status: 'probe_failed',
545
+ blockers: ['codex_lb_tool_output_recovery_status_probe_failed'],
546
+ operator_actions: []
547
+ },
548
+ error: err?.message || String(err)
549
+ }))
550
+ : null;
551
+ const codexLbRecoveryReady = codexLbRecoveryStatusReady(codexLbProviderStatus, deepDiagnostics || doctorFix);
552
+ const codexLb = {
553
+ ...codexLbCircuit,
554
+ provider_status: codexLbProviderStatus,
555
+ tool_output_recovery: codexLbProviderStatus?.tool_output_recovery || null,
556
+ recovery_ok: codexLbRecoveryReady
557
+ };
363
558
  const providerContext = deepDiagnostics
364
559
  ? await resolveProviderContext({ root, route: '$Doctor', serviceTier: process.env.SKS_SERVICE_TIER || 'fast' }).catch((err) => ({
365
560
  schema: 'sks.provider-context.v1',
@@ -755,19 +950,30 @@ async function runDoctor(args = [], root, doctorFix) {
755
950
  const zellij = await checkZellijCapability({ root, require: process.env.SKS_REQUIRE_ZELLIJ === '1' });
756
951
  const localModel = await readLocalModelConfig().catch(() => null);
757
952
  const permissionProfiles = await inventoryCodexPermissionProfiles(root, { writeReport: true });
758
- const agentRoleConfigRepair = await repairAgentRoleConfigs({
759
- root,
760
- apply: doctorFix,
761
- reportPath: `${root}/.sneakoscope/reports/agent-role-config-repair.json`
762
- }).catch((err) => ({
763
- schema: 'sks.agent-role-config-repair.v1',
764
- ok: false,
765
- apply: doctorFix,
766
- missing: [],
767
- existing: [],
768
- created: [],
769
- warnings_suppressed: false,
770
- blockers: [err?.message || String(err)]
953
+ const startupRoleRepair = startupConfigRepair?.role_repair;
954
+ const agentRoleConfigRepair = doctorFix && startupRoleRepair
955
+ ? startupRoleRepair
956
+ : await repairAgentRoleConfigs({
957
+ root,
958
+ apply: false,
959
+ reportPath: `${root}/.sneakoscope/reports/agent-role-config-repair.json`
960
+ }).catch((err) => ({
961
+ schema: 'sks.agent-role-config-repair.v1',
962
+ ok: false,
963
+ apply: false,
964
+ missing: [],
965
+ existing: [],
966
+ created: [],
967
+ warnings_suppressed: false,
968
+ blockers: [err?.message || String(err)]
969
+ }));
970
+ const officialSubagentConfig = await (await import('../core/subagents/official-subagent-config.js'))
971
+ .readOfficialSubagentConfig(root)
972
+ .catch((err) => ({
973
+ maxThreads: null,
974
+ maxDepth: null,
975
+ blockers: [`official_subagent_config_read_failed:${err?.message || String(err)}`],
976
+ warnings: []
771
977
  }));
772
978
  const globalSksInstallCleanup = flag(args, '--fix') && !flag(args, '--local-only')
773
979
  ? await (await import('../core/doctor/global-sks-install-cleanup.js')).cleanDuplicateGlobalSksInstalls({ root, fix: true }).catch((err) => ({ schema: 'sks.global-sks-install-cleanup.v1', ok: false, fix: true, error: err?.message || String(err), blockers: ['global_sks_install_cleanup_exception'] }))
@@ -1056,7 +1262,13 @@ async function runDoctor(args = [], root, doctorFix) {
1056
1262
  }
1057
1263
  const zellijReadiness = buildZellijReadiness(root, zellij, ready);
1058
1264
  const runtimeReadiness = buildRuntimeReadiness(zellijReadiness, codexNativeFeatureMatrix);
1059
- const resultOk = ready.ready && (!sksUpdate || sksUpdate.ok !== false) && commandAliasCleanup.ok !== false && codexStartupRepair.ok !== false;
1265
+ const resultOk = ready.ready
1266
+ && (!sksUpdate || sksUpdate.ok !== false)
1267
+ && commandAliasCleanup.ok !== false
1268
+ && codexStartupRepair.ok !== false
1269
+ && agentRoleConfigRepair.ok !== false
1270
+ && (officialSubagentConfig.blockers || []).length === 0
1271
+ && codexLbRecoveryReady;
1060
1272
  const result = {
1061
1273
  schema: 'sks.doctor-status.v3',
1062
1274
  elapsed_ms: Date.now() - startedAtMs,
@@ -1064,7 +1276,7 @@ async function runDoctor(args = [], root, doctorFix) {
1064
1276
  status: resultOk ? (doctorFix ? 'fix_ok' : deepDiagnostics ? 'full_ok' : 'fast_ok') : 'blocked',
1065
1277
  diagnostic_depth: deepDiagnostics ? 'full' : doctorFix ? 'fix' : 'fast',
1066
1278
  deep_diagnostics_skipped: !deepDiagnostics,
1067
- deep_ok: deepDiagnostics ? Boolean(ready.ready) : null,
1279
+ deep_ok: deepDiagnostics ? resultOk : null,
1068
1280
  not_counted_as_full_doctor: !deepDiagnostics,
1069
1281
  root,
1070
1282
  arg_warnings: argWarnings,
@@ -1099,6 +1311,7 @@ async function runDoctor(args = [], root, doctorFix) {
1099
1311
  } : null,
1100
1312
  local_model: localModel,
1101
1313
  agent_role_config: agentRoleConfigRepair,
1314
+ official_subagent_config: officialSubagentConfig,
1102
1315
  zellij_readiness: zellijReadiness,
1103
1316
  codex_permission_profiles: permissionProfiles,
1104
1317
  command_aliases: commandAliasCleanup,
@@ -1151,6 +1364,8 @@ async function runDoctor(args = [], root, doctorFix) {
1151
1364
  console.log('SKS Doctor');
1152
1365
  for (const warning of argWarnings)
1153
1366
  console.log(`Argument warning: ${warning}`);
1367
+ for (const warning of officialSubagentConfig.warnings || [])
1368
+ console.log(`Official subagent warning: ${warning}`);
1154
1369
  console.log(`Root: ${root}`);
1155
1370
  console.log(`Node: ${result.node.ok ? 'ok' : 'fail'} ${result.node.version}`);
1156
1371
  console.log(`Codex: ${codex.bin ? 'ok' : 'missing'} ${codex.version || ''}`);
@@ -1328,6 +1543,13 @@ async function runDoctor(args = [], root, doctorFix) {
1328
1543
  if (codex0138Doctor?.fixed?.length)
1329
1544
  console.log(` doctor --fix repaired: ${codex0138Doctor.fixed.join(', ')}`);
1330
1545
  console.log(`codex-lb: ${codexLb.ok ? 'ok' : `warning ${codexLb.circuit?.state || 'unknown'}`}`);
1546
+ if (codexLb.tool_output_recovery) {
1547
+ const recovery = codexLb.tool_output_recovery;
1548
+ console.log(` interrupted tool-output recovery: ${recovery.ok ? 'ready' : 'blocked'} (${recovery.observed_version || recovery.status}; minimum ${recovery.minimum_version})`);
1549
+ if (!recovery.ok)
1550
+ for (const action of recovery.operator_actions || [])
1551
+ console.log(` action: ${action}`);
1552
+ }
1331
1553
  if (localModel) {
1332
1554
  console.log('Local LLM:');
1333
1555
  console.log(` enabled: ${localModel.enabled ? 'yes' : 'no'}`);
@@ -1481,7 +1703,7 @@ function unknownDoctorFlags(args = []) {
1481
1703
  const knownBoolean = new Set([
1482
1704
  '--fix', '--yes', '-y', '--machine-only', '--actual-codex', '--require-actual-codex',
1483
1705
  '--full', '--capabilities', '--repair-codex-app-ui', '--repair-zellij', '--install-homebrew',
1484
- '--repair-native-capabilities', '--repair-codex-native', '--local-only', '--project', '--global',
1706
+ '--repair-native-capabilities', '--repair-codex-native', '--local-only', '--global-only', '--project', '--global',
1485
1707
  '--dry-run', '--json'
1486
1708
  ]);
1487
1709
  const knownValue = new Set(['--profile', '--report-file', '--codex-bin', '--install-scope']);
@@ -6,7 +6,11 @@ export async function run(_command, args = []) {
6
6
  runtime: 'tmux',
7
7
  status: 'removed_runtime',
8
8
  replacement: 'zellij',
9
- operator_actions: ['Use `sks --mad`, `sks team open-zellij`, or `npm run zellij:capability`.']
9
+ operator_actions: [
10
+ 'Use `sks --mad` for the supported SKS Zellij launcher.',
11
+ 'Use `sks zellij status` or `npm run zellij:capability` for runtime diagnostics.',
12
+ 'Use `sks naruto status|subagents|proof` for official subagent missions.'
13
+ ]
10
14
  };
11
15
  if (json)
12
16
  console.log(JSON.stringify(result, null, 2));
@@ -1,12 +1,14 @@
1
1
  import { readZellijSlotTelemetrySnapshot } from '../core/zellij/zellij-slot-telemetry.js';
2
2
  import { renderZellijMonitor } from '../core/zellij/zellij-monitor-renderer.js';
3
3
  import { projectRoot } from '../core/fsx.js';
4
+ import { refreshOfficialSubagentZellijActivity } from '../core/zellij/zellij-official-subagent-activity.js';
4
5
  export async function run(_cmd = 'zellij-monitor-pane', args = []) {
5
6
  const mission = readOption(args, '--mission', 'latest') || 'latest';
6
7
  const root = await projectRoot();
7
8
  const intervalMs = Math.max(500, Number(readOption(args, '--interval-ms', String(process.env.SKS_ZELLIJ_REFRESH_MS || '1000')) || 1000));
8
9
  const once = !flag(args, '--watch');
9
10
  for (;;) {
11
+ await refreshOfficialSubagentZellijActivity({ root, missionId: mission }).catch(() => null);
10
12
  const snapshot = await readZellijSlotTelemetrySnapshot(root, mission).catch(() => null);
11
13
  const text = renderZellijMonitor({ snapshot, missionId: mission, root });
12
14
  process.stdout.write(`\x1b[H${text}\n\x1b[0J`);
@@ -4,13 +4,14 @@ import { projectRoot, readJson } from '../core/fsx.js';
4
4
  import { readZellijSlotTelemetrySnapshot } from '../core/zellij/zellij-slot-telemetry.js';
5
5
  import { bindViewports } from '../core/zellij/zellij-viewport-binder.js';
6
6
  import { renderZellijSlotPaneFromArtifacts } from '../core/zellij/zellij-slot-pane-renderer.js';
7
+ import { refreshOfficialSubagentZellijActivity } from '../core/zellij/zellij-official-subagent-activity.js';
7
8
  import { ANSI_CODES, paint, resolveZellijTheme } from '../core/zellij/zellij-theme.js';
8
9
  let previousBindings = [];
9
10
  export async function run(_cmd = 'zellij-viewport-pane', args = []) {
10
11
  const mission = String(readOption(args, '--mission', 'latest') || 'latest');
11
12
  const index = Math.max(1, Number(readOption(args, '--index', '1')) || 1);
12
13
  const of = Math.max(index, Number(readOption(args, '--of', '4')) || 4);
13
- const intervalMs = Math.max(500, Number(process.env.SKS_ZELLIJ_REFRESH_MS || 1000));
14
+ const intervalMs = Math.max(500, Number(readOption(args, '--interval-ms', String(process.env.SKS_ZELLIJ_REFRESH_MS || '1000')) || 1000));
14
15
  const root = await projectRoot();
15
16
  previousBindings = Array.from({ length: of }, () => null);
16
17
  const once = !flag(args, '--watch');
@@ -24,6 +25,7 @@ export async function run(_cmd = 'zellij-viewport-pane', args = []) {
24
25
  }
25
26
  async function renderViewportFrame(root, mission, index, of) {
26
27
  const theme = resolveZellijTheme();
28
+ await refreshOfficialSubagentZellijActivity({ root, missionId: mission }).catch(() => null);
27
29
  const snapshot = await readZellijSlotTelemetrySnapshot(root, mission).catch(() => null);
28
30
  const missionId = snapshot?.mission_id || mission;
29
31
  const pins = await readJson(pinsPath(root, missionId), { pins: [] });
@@ -53,7 +53,7 @@ async function zellijStatus(root, args, json) {
53
53
  ok: ready || !requireReal,
54
54
  status,
55
55
  version: capability.version || null,
56
- required_for: ['sks --mad', 'sks team open-zellij', 'interactive lane UI'],
56
+ required_for: ['sks --mad', 'interactive MAD lane UI', 'standalone Zellij diagnostics'],
57
57
  blockers: capability.blockers || [],
58
58
  warnings: capability.warnings || [],
59
59
  install_hint: ready ? null : installHint(),