sneakoscope 4.8.7 → 5.1.2

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 (288) hide show
  1. package/README.md +51 -726
  2. package/bench/tasks/t01-off-by-one/repo/package.json +9 -0
  3. package/bench/tasks/t01-off-by-one/repo/src/pagination.js +5 -0
  4. package/bench/tasks/t01-off-by-one/repo/test.js +5 -0
  5. package/bench/tasks/t01-off-by-one/task.json +13 -0
  6. package/bench/tasks/t02-signature-cochange/repo/package.json +9 -0
  7. package/bench/tasks/t02-signature-cochange/repo/src/admin.js +5 -0
  8. package/bench/tasks/t02-signature-cochange/repo/src/audit.js +5 -0
  9. package/bench/tasks/t02-signature-cochange/repo/src/labels.js +3 -0
  10. package/bench/tasks/t02-signature-cochange/repo/src/profile.js +5 -0
  11. package/bench/tasks/t02-signature-cochange/repo/test.js +9 -0
  12. package/bench/tasks/t02-signature-cochange/task.json +12 -0
  13. package/bench/tasks/t03-type-puzzle/repo/package.json +9 -0
  14. package/bench/tasks/t03-type-puzzle/repo/src/config.js +4 -0
  15. package/bench/tasks/t03-type-puzzle/repo/test.js +6 -0
  16. package/bench/tasks/t03-type-puzzle/task.json +13 -0
  17. package/bench/tasks/t04-refactor-preserve/repo/package.json +9 -0
  18. package/bench/tasks/t04-refactor-preserve/repo/src/cart.js +8 -0
  19. package/bench/tasks/t04-refactor-preserve/repo/test.js +4 -0
  20. package/bench/tasks/t04-refactor-preserve/task.json +12 -0
  21. package/bench/tasks/t05-performance/repo/package.json +9 -0
  22. package/bench/tasks/t05-performance/repo/src/pairs.js +9 -0
  23. package/bench/tasks/t05-performance/repo/test.js +11 -0
  24. package/bench/tasks/t05-performance/task.json +12 -0
  25. package/bench/tasks/t06-mistake-rule/repo/package.json +9 -0
  26. package/bench/tasks/t06-mistake-rule/repo/src/loader.js +6 -0
  27. package/bench/tasks/t06-mistake-rule/repo/test.js +7 -0
  28. package/bench/tasks/t06-mistake-rule/task.json +12 -0
  29. package/config/bench-baseline.json +7 -0
  30. package/crates/sks-core/Cargo.lock +1 -1
  31. package/crates/sks-core/Cargo.toml +1 -1
  32. package/crates/sks-core/src/main.rs +1 -1
  33. package/dist/bin/install.js +35 -0
  34. package/dist/bin/sks.js +1 -1
  35. package/dist/cli/cli-theme.js +51 -0
  36. package/dist/cli/command-registry.js +15 -4
  37. package/dist/cli/help-fast.js +18 -8
  38. package/dist/cli/insane-search-command.js +36 -8
  39. package/dist/cli/install-helpers.js +32 -0
  40. package/dist/commands/codex-lb.js +2 -0
  41. package/dist/commands/doctor.js +62 -6
  42. package/dist/commands/proof.js +6 -3
  43. package/dist/config/skills-manifest.json +82 -54
  44. package/dist/core/agents/agent-conflict-graph.js +5 -0
  45. package/dist/core/agents/agent-lease.js +5 -0
  46. package/dist/core/agents/agent-ledger-schemas.js +1 -0
  47. package/dist/core/agents/agent-orchestrator.js +268 -62
  48. package/dist/core/agents/agent-output-validator.js +14 -3
  49. package/dist/core/agents/agent-patch-queue-store.js +95 -2
  50. package/dist/core/agents/agent-patch-queue.js +6 -3
  51. package/dist/core/agents/agent-patch-schema.js +13 -0
  52. package/dist/core/agents/agent-proof-evidence.js +6 -1
  53. package/dist/core/agents/agent-runner-fake.js +40 -0
  54. package/dist/core/agents/agent-worker-pipeline.js +36 -2
  55. package/dist/core/agents/codex-exec-worker-adapter.js +2 -0
  56. package/dist/core/agents/native-worker-backend-router.js +58 -1
  57. package/dist/core/codex-app/sks-menubar.js +18 -5
  58. package/dist/core/codex-app.js +1 -0
  59. package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
  60. package/dist/core/codex-control/codex-sdk-env-policy.js +1 -1
  61. package/dist/core/codex-control/schemas/agent-worker-result.schema.js +12 -3
  62. package/dist/core/codex-hooks/codex-hook-managed-install.js +5 -0
  63. package/dist/core/codex-hooks/codex-hook-state-writer.js +70 -11
  64. package/dist/core/codex-hooks/codex-hook-trust-doctor.js +2 -2
  65. package/dist/core/codex-lb/codex-lb-env.js +20 -1
  66. package/dist/core/commands/basic-cli.js +21 -2
  67. package/dist/core/commands/check-command.js +37 -5
  68. package/dist/core/commands/computer-use-command.js +62 -7
  69. package/dist/core/commands/db-command.js +31 -5
  70. package/dist/core/commands/fast-mode-command.js +3 -0
  71. package/dist/core/commands/gate-result-contract.js +43 -0
  72. package/dist/core/commands/gates-command.js +6 -1
  73. package/dist/core/commands/gc-command.js +29 -2
  74. package/dist/core/commands/goal-command.js +9 -2
  75. package/dist/core/commands/gx-command.js +79 -7
  76. package/dist/core/commands/image-ux-review-command.js +188 -13
  77. package/dist/core/commands/mad-db-command.js +85 -176
  78. package/dist/core/commands/mad-sks-command.js +230 -29
  79. package/dist/core/commands/menubar-command.js +22 -1
  80. package/dist/core/commands/naruto-command.js +64 -10
  81. package/dist/core/commands/plan-command.js +76 -0
  82. package/dist/core/commands/ppt-command.js +159 -24
  83. package/dist/core/commands/qa-loop-command.js +6 -2
  84. package/dist/core/commands/release-command.js +55 -2
  85. package/dist/core/commands/research-command.js +1 -1
  86. package/dist/core/commands/review-command.js +217 -0
  87. package/dist/core/commands/route-success-helpers.js +59 -0
  88. package/dist/core/commands/run-command.js +19 -7
  89. package/dist/core/commands/seo-command.js +49 -1
  90. package/dist/core/commands/ui-command.js +161 -0
  91. package/dist/core/commands/uninstall-command.js +15 -1
  92. package/dist/core/db-safety.js +2 -2
  93. package/dist/core/doctor/doctor-transaction.js +8 -0
  94. package/dist/core/doctor/doctor-zellij-repair.js +1 -0
  95. package/dist/core/doctor/imagegen-repair.js +161 -0
  96. package/dist/core/feature-fixture-runner.js +2 -2
  97. package/dist/core/feature-fixtures.js +58 -37
  98. package/dist/core/feature-registry.js +102 -2
  99. package/dist/core/fsx.js +39 -6
  100. package/dist/core/image-ux-review/imagegen-adapter.js +48 -11
  101. package/dist/core/image-ux-review.js +16 -0
  102. package/dist/core/imagegen/imagegen-capability.js +11 -5
  103. package/dist/core/imagegen/require-imagegen.js +57 -0
  104. package/dist/core/init/skills.js +10 -5
  105. package/dist/core/mad-db/mad-db-coordinator.js +94 -18
  106. package/dist/core/mad-db/mad-db-policy.js +12 -10
  107. package/dist/core/mad-sks/executors/executor-base.js +8 -2
  108. package/dist/core/mad-sks/executors/index.js +4 -0
  109. package/dist/core/mad-sks/executors/sql-plane-executor.js +194 -0
  110. package/dist/core/naruto/naruto-active-pool.js +15 -4
  111. package/dist/core/naruto/naruto-real-worker-child.js +10 -0
  112. package/dist/core/naruto/naruto-role-policy.js +3 -0
  113. package/dist/core/naruto/naruto-task-hints.js +10 -0
  114. package/dist/core/naruto/naruto-work-graph.js +8 -2
  115. package/dist/core/naruto/naruto-work-item.js +6 -0
  116. package/dist/core/naruto/solution-tournament.js +101 -0
  117. package/dist/core/permission-gates.js +30 -0
  118. package/dist/core/pipeline-internals/runtime-core.js +11 -3
  119. package/dist/core/pipeline-internals/runtime-gates.js +27 -0
  120. package/dist/core/ppt-review/index.js +6 -1
  121. package/dist/core/ppt-review/slide-imagegen-review.js +75 -10
  122. package/dist/core/ppt.js +70 -2
  123. package/dist/core/proof/auto-finalize.js +70 -11
  124. package/dist/core/proof/proof-schema.js +2 -0
  125. package/dist/core/proof/route-adapter.js +5 -1
  126. package/dist/core/proof/route-finalizer.js +8 -5
  127. package/dist/core/proof/selftest-proof-fixtures.js +18 -5
  128. package/dist/core/proof/validation.js +2 -0
  129. package/dist/core/provider/model-router.js +53 -0
  130. package/dist/core/release/release-gate-node.js +3 -0
  131. package/dist/core/release/release-gate-resource-governor.js +1 -0
  132. package/dist/core/routes/constants.js +1 -1
  133. package/dist/core/routes.js +65 -18
  134. package/dist/core/safety/mutation-guard.js +5 -1
  135. package/dist/core/stop-gate/gate-evaluator.js +102 -0
  136. package/dist/core/stop-gate/stop-gate-check.js +16 -1
  137. package/dist/core/stop-gate/stop-gate-writer.js +4 -0
  138. package/dist/core/triwiki/agents-md-projector.js +184 -0
  139. package/dist/core/triwiki-wrongness/wrongness-schema.js +3 -1
  140. package/dist/core/trust-kernel/trust-kernel-schema.js +1 -0
  141. package/dist/core/trust-kernel/trust-report.js +1 -1
  142. package/dist/core/trust-kernel/trust-status.js +2 -0
  143. package/dist/core/ui/dashboard-html.js +111 -0
  144. package/dist/core/update/update-migration-state.js +366 -15
  145. package/dist/core/update-check.js +178 -81
  146. package/dist/core/verification/diff-quality.js +100 -0
  147. package/dist/core/verification/impact-scan.js +164 -0
  148. package/dist/core/verification/machine-feedback.js +146 -0
  149. package/dist/core/verification/mistake-rule-compiler.js +195 -0
  150. package/dist/core/version.js +1 -1
  151. package/dist/core/zellij/zellij-self-heal.js +9 -6
  152. package/dist/scripts/check-feature-quality.js +2 -2
  153. package/dist/scripts/cli-output-consistency-check.js +57 -0
  154. package/dist/scripts/coding-bench-check.js +136 -0
  155. package/dist/scripts/doctor-imagegen-repair-check.js +62 -0
  156. package/dist/scripts/ensure-bin-executable.js +11 -3
  157. package/dist/scripts/harness-benchmark-check.js +104 -0
  158. package/dist/scripts/legacy-update-e2e-check.js +228 -0
  159. package/dist/scripts/mad-db-command-check.js +11 -8
  160. package/dist/scripts/mad-db-route-identity-check.js +8 -6
  161. package/dist/scripts/mad-db-safety-conflict-matrix-check.js +31 -8
  162. package/dist/scripts/mad-db-skill-policy-snapshot-check.js +4 -5
  163. package/dist/scripts/ppt-real-imagegen-wiring-check.js +5 -1
  164. package/dist/scripts/proof-root-cause-policy-check.js +2 -0
  165. package/dist/scripts/release-dag-full-coverage-check.js +13 -4
  166. package/dist/scripts/release-gate-dag-runner.js +14 -0
  167. package/dist/scripts/release-gate-existence-audit.js +2 -1
  168. package/dist/scripts/release-gate-planner.js +2 -1
  169. package/dist/scripts/release-gate-script-parity-check.js +1 -1
  170. package/dist/scripts/release-metadata-1-19-check.js +2 -1
  171. package/dist/scripts/seo-geo-feature-fixture-quality-check.js +1 -1
  172. package/dist/scripts/sks-1-11-gate-lib.js +8 -6
  173. package/dist/scripts/ux-review-real-loop-fixture-check.js +9 -4
  174. package/dist/scripts/ux-review-run-wires-imagegen-check.js +4 -0
  175. package/docs/assets/sneakoscope-architecture-pipeline.jpg +0 -0
  176. package/docs/demo.tape +28 -0
  177. package/package.json +67 -3
  178. package/schemas/codex/completion-proof.schema.json +3 -2
  179. package/schemas/release/release-gate-node.schema.json +2 -1
  180. package/dist/scripts/agent-backfill-route-blackbox.js +0 -5
  181. package/dist/scripts/agent-dynamic-pool-route-blackbox.js +0 -5
  182. package/dist/scripts/agent-parallel-write-blackbox.js +0 -56
  183. package/dist/scripts/agent-patch-swarm-route-blackbox.js +0 -10
  184. package/dist/scripts/agent-route-blackbox-lib.js +0 -132
  185. package/dist/scripts/blackbox-command-import-smoke.js +0 -143
  186. package/dist/scripts/blackbox-global-shim.js +0 -77
  187. package/dist/scripts/blackbox-matrix.js +0 -70
  188. package/dist/scripts/blackbox-npx-one-shot.js +0 -69
  189. package/dist/scripts/blackbox-pack-install.js +0 -174
  190. package/dist/scripts/brand-neutrality-zero-leakage-blackbox.js +0 -4
  191. package/dist/scripts/build-once-runner-blackbox.js +0 -34
  192. package/dist/scripts/codex-0140-integration-blackbox.js +0 -13
  193. package/dist/scripts/codex-agent-type-blackbox.js +0 -4
  194. package/dist/scripts/codex-app-harness-blackbox.js +0 -4
  195. package/dist/scripts/codex-app-skill-agent-blackbox.js +0 -4
  196. package/dist/scripts/codex-hook-approval-blackbox.js +0 -4
  197. package/dist/scripts/codex-init-deep-directory-local-blackbox.js +0 -4
  198. package/dist/scripts/codex-native-feature-broker-blackbox.js +0 -4
  199. package/dist/scripts/codex-native-pattern-analysis-blackbox.js +0 -4
  200. package/dist/scripts/codex-native-read-repair-split-blackbox.js +0 -55
  201. package/dist/scripts/codex-native-reference-cache-blackbox.js +0 -41
  202. package/dist/scripts/core-skill-integrity-blackbox.js +0 -32
  203. package/dist/scripts/dfix-fast-blackbox-check.js +0 -37
  204. package/dist/scripts/dfix-parallel-write-blackbox.js +0 -48
  205. package/dist/scripts/dfix-patch-swarm-route-blackbox.js +0 -10
  206. package/dist/scripts/doctor-context7-mcp-repair-blackbox.js +0 -16
  207. package/dist/scripts/doctor-dirty-repair-blackbox.js +0 -22
  208. package/dist/scripts/doctor-dirty-semantic-blackbox.js +0 -8
  209. package/dist/scripts/doctor-fix-production-blackbox.js +0 -26
  210. package/dist/scripts/doctor-native-capability-repair-blackbox.js +0 -39
  211. package/dist/scripts/doctor-startup-config-repair-blackbox.js +0 -13
  212. package/dist/scripts/doctor-supabase-mcp-repair-blackbox.js +0 -14
  213. package/dist/scripts/doctor-transaction-engine-blackbox.js +0 -28
  214. package/dist/scripts/doctor-zellij-fix-blackbox.js +0 -4
  215. package/dist/scripts/doctor-zellij-no-homebrew-blackbox.js +0 -4
  216. package/dist/scripts/doctor-zellij-upgrade-blackbox.js +0 -4
  217. package/dist/scripts/gate-pack-runner-blackbox.js +0 -27
  218. package/dist/scripts/gate-pack-v2-blackbox.js +0 -18
  219. package/dist/scripts/geo-cli-blackbox-check.js +0 -18
  220. package/dist/scripts/loop-collision-blackbox.js +0 -3
  221. package/dist/scripts/loop-concurrency-oversubscription-blackbox.js +0 -3
  222. package/dist/scripts/loop-fixture-production-misuse-blackbox.js +0 -3
  223. package/dist/scripts/loop-kill-interrupt-real-blackbox.js +0 -3
  224. package/dist/scripts/loop-merge-strategy-blackbox.js +0 -3
  225. package/dist/scripts/loop-mesh-production-e2e-blackbox.js +0 -3
  226. package/dist/scripts/loop-side-effect-blackbox.js +0 -3
  227. package/dist/scripts/mad-db-operation-lifecycle-blackbox.js +0 -29
  228. package/dist/scripts/mad-sks-actual-executor-blackbox.js +0 -5
  229. package/dist/scripts/mad-zellij-headless-fallback-blackbox.js +0 -4
  230. package/dist/scripts/mad-zellij-self-heal-blackbox.js +0 -4
  231. package/dist/scripts/naruto-loop-mesh-blackbox.js +0 -3
  232. package/dist/scripts/naruto-real-parallelism-blackbox.js +0 -307
  233. package/dist/scripts/naruto-worktree-coding-blackbox.js +0 -29
  234. package/dist/scripts/parallel-runtime-real-blackbox.js +0 -44
  235. package/dist/scripts/pipeline-codex-native-doctor-mad-routing-real-blackbox.js +0 -77
  236. package/dist/scripts/pipeline-codex-native-e2e-blackbox.js +0 -13
  237. package/dist/scripts/pipeline-codex-native-image-routing-real-blackbox.js +0 -50
  238. package/dist/scripts/pipeline-codex-native-loop-routing-real-blackbox.js +0 -74
  239. package/dist/scripts/pipeline-codex-native-qa-routing-real-blackbox.js +0 -51
  240. package/dist/scripts/pipeline-codex-native-research-routing-real-blackbox.js +0 -45
  241. package/dist/scripts/pipeline-execution-profile-routing-blackbox.js +0 -4
  242. package/dist/scripts/postinstall-global-doctor-blackbox.js +0 -12
  243. package/dist/scripts/ppt-full-e2e-blackbox-check.js +0 -109
  244. package/dist/scripts/ppt-imagegen-blackbox-check.js +0 -46
  245. package/dist/scripts/project-skill-dedupe-blackbox.js +0 -36
  246. package/dist/scripts/qa-backfill-route-blackbox.js +0 -5
  247. package/dist/scripts/qa-patch-swarm-route-blackbox.js +0 -10
  248. package/dist/scripts/release-full-parallelism-blackbox.js +0 -41
  249. package/dist/scripts/release-triwiki-first-runner-blackbox.js +0 -48
  250. package/dist/scripts/release-wiring-3110-blackbox.js +0 -27
  251. package/dist/scripts/release-wiring-3112-blackbox.js +0 -17
  252. package/dist/scripts/release-wiring-3113-blackbox.js +0 -17
  253. package/dist/scripts/research-backfill-route-blackbox.js +0 -5
  254. package/dist/scripts/research-final-reviewer-blackbox.js +0 -70
  255. package/dist/scripts/research-stage-cycle-runtime-blackbox.js +0 -40
  256. package/dist/scripts/research-synthesis-writer-blackbox.js +0 -24
  257. package/dist/scripts/route-blackbox-realism-check.js +0 -21
  258. package/dist/scripts/scheduler-resource-claim-blackbox.js +0 -24
  259. package/dist/scripts/seo-cli-blackbox-check.js +0 -18
  260. package/dist/scripts/sks-3110-all-feature-regression-blackbox.js +0 -116
  261. package/dist/scripts/sks-3112-all-feature-regression-blackbox.js +0 -29
  262. package/dist/scripts/sks-3113-all-feature-regression-blackbox.js +0 -17
  263. package/dist/scripts/sks-400-all-feature-regression-blackbox.js +0 -21
  264. package/dist/scripts/sks-400-extreme-parallel-blackbox.js +0 -8
  265. package/dist/scripts/sks-400-five-minute-blackbox.js +0 -9
  266. package/dist/scripts/sks-400-legacy-purge-blackbox.js +0 -8
  267. package/dist/scripts/sks-401-all-feature-regression-blackbox.js +0 -46
  268. package/dist/scripts/sks-401-five-minute-actual-blackbox.js +0 -23
  269. package/dist/scripts/sks-402-all-feature-regression-blackbox.js +0 -9
  270. package/dist/scripts/sks-402-five-minute-real-blackbox.js +0 -22
  271. package/dist/scripts/sksd-warm-cache-blackbox.js +0 -12
  272. package/dist/scripts/supabase-secret-preservation-blackbox.js +0 -29
  273. package/dist/scripts/team-backfill-route-blackbox.js +0 -5
  274. package/dist/scripts/team-parallel-write-blackbox.js +0 -55
  275. package/dist/scripts/team-patch-swarm-route-blackbox.js +0 -10
  276. package/dist/scripts/triwiki-affected-graph-blackbox.js +0 -28
  277. package/dist/scripts/triwiki-proof-bank-blackbox.js +0 -30
  278. package/dist/scripts/triwiki-proof-bank-lock-blackbox.js +0 -7
  279. package/dist/scripts/update-preserves-supabase-keys-blackbox.js +0 -27
  280. package/dist/scripts/ux-patch-swarm-route-blackbox.js +0 -10
  281. package/dist/scripts/ux-review-imagegen-blackbox-check.js +0 -67
  282. package/dist/scripts/zellij-initial-main-only-blackbox.js +0 -28
  283. package/dist/scripts/zellij-pane-lock-concurrency-blackbox.js +0 -80
  284. package/dist/scripts/zellij-pane-lock-open-worker-integration-blackbox.js +0 -137
  285. package/dist/scripts/zellij-self-heal-typed-blackbox.js +0 -4
  286. package/dist/scripts/zellij-slot-telemetry-real-blackbox.js +0 -20
  287. package/dist/scripts/zellij-stacked-fallback-integration-blackbox.js +0 -81
  288. package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +0 -202
@@ -22,6 +22,7 @@ import { buildCodexLbSetupPlan, codexLbPersistenceSummary, installCodexLbShellPr
22
22
  import { extractTomlTable, writeCodexConfigGuarded } from '../core/codex/codex-config-guard.js';
23
23
  import { cleanupCodexConfigBackups, validateCodexConfigRoundTrip } from '../core/codex/codex-config-toml.js';
24
24
  import { runPostinstallGlobalDoctorAndMarkPending } from '../core/update/update-migration-state.js';
25
+ import { repairCodexImagegen } from '../core/doctor/imagegen-repair.js';
25
26
  const CODEX_LB_PROVIDER_NAME = 'openai';
26
27
  const CODEX_LB_PROVIDER_ENV_KEY = 'CODEX_LB_API_KEY';
27
28
  const CODEX_LB_CANONICAL_FAST_SERVICE_TIER = 'priority';
@@ -90,6 +91,15 @@ export async function postinstall({ bootstrap, args = [] }) {
90
91
  console.log(`Codex App Fast mode: skipped (${fastModeRepair.reason}).`);
91
92
  else if (fastModeRepair.status === 'failed')
92
93
  console.log(`Codex App Fast mode: auto repair failed. Run \`sks setup\`. ${fastModeRepair.error || ''}`.trim());
94
+ const imagegenRepair = await ensureCodexImagegenDuringInstall();
95
+ if (imagegenRepair.status === 'ready')
96
+ console.log('Codex App Image Gen: ready ($imagegen/gpt-image-2 detected).');
97
+ else if (imagegenRepair.status === 'recovered')
98
+ console.log('Codex App Image Gen: recovered and re-detected.');
99
+ else if (imagegenRepair.status === 'blocked')
100
+ console.log(`Codex App Image Gen: blocked; run \`sks doctor --fix\`. ${(imagegenRepair.blockers || []).join(', ')}`.trim());
101
+ else if (imagegenRepair.status === 'skipped')
102
+ console.log(`Codex App Image Gen: skipped (${imagegenRepair.reason}).`);
93
103
  const postinstallDoctor = await runPostinstallGlobalDoctorAndMarkPending().catch((err) => ({
94
104
  ok: false,
95
105
  doctor: null,
@@ -2469,6 +2479,28 @@ async function ensureGlobalGetdesignSkillDuringInstall() {
2469
2479
  return { status: 'present', command: skillsBin };
2470
2480
  return { status: 'failed', command: skillsBin, error: out.trim() || 'skills add failed' };
2471
2481
  }
2482
+ export async function ensureCodexImagegenDuringInstall(opts = {}) {
2483
+ if (process.env.SKS_POSTINSTALL_SKIP_IMAGEGEN_REPAIR === '1' || opts.skip === true) {
2484
+ return { status: 'skipped', reason: 'SKS_POSTINSTALL_SKIP_IMAGEGEN_REPAIR' };
2485
+ }
2486
+ const report = await repairCodexImagegen({
2487
+ root: opts.root || process.cwd(),
2488
+ apply: opts.apply !== false,
2489
+ codexBin: opts.codexBin || null,
2490
+ autoInstallCodex: opts.autoInstallCodex === true || process.env.SKS_IMAGEGEN_AUTO_INSTALL_CODEX === '1'
2491
+ }).catch((err) => ({
2492
+ recovered: false,
2493
+ blockers: [err?.message || String(err)],
2494
+ before: null,
2495
+ after: null
2496
+ }));
2497
+ if (report.before?.core_ready === true || (report.after?.core_ready === true && report.attempted === false)) {
2498
+ return { status: 'ready', report };
2499
+ }
2500
+ if (report.recovered === true)
2501
+ return { status: 'recovered', report };
2502
+ return { status: 'blocked', blockers: report.blockers || ['codex_imagegen_unavailable'], report };
2503
+ }
2472
2504
  export async function ensureRelatedCliTools(args = []) {
2473
2505
  const skip = args.includes('--skip-cli-tools') || process.env.SKS_SKIP_CLI_TOOLS === '1';
2474
2506
  const codex = await ensureCodexCliTool({ skip, args });
@@ -73,6 +73,8 @@ export async function run(command, args = []) {
73
73
  codex_lb: status,
74
74
  chain,
75
75
  evidence,
76
+ degraded_models: Array.isArray(chain.degraded_models) ? chain.degraded_models : [],
77
+ quota_low: Boolean(chain.quota_low),
76
78
  blockers: [
77
79
  ...(providerReady ? [] : ['codex_lb_provider_contract_drift']),
78
80
  ...(chain.ok
@@ -3,6 +3,7 @@ import path from 'node:path';
3
3
  import { projectRoot, exists, formatBytes } from '../core/fsx.js';
4
4
  import { flag } from '../cli/args.js';
5
5
  import { printJson } from '../cli/output.js';
6
+ import { ui as cliUi } from '../cli/cli-theme.js';
6
7
  import { getCodexInfo } from '../core/codex-adapter.js';
7
8
  import { rustInfo } from '../core/rust-accelerator.js';
8
9
  import { codexAppIntegrationStatus } from '../core/codex-app.js';
@@ -44,9 +45,16 @@ import { writeProjectUpdateMigrationReceipt } from '../core/update/update-migrat
44
45
  import { installSksMenuBar } from '../core/codex-app/sks-menubar.js';
45
46
  import { sweepSksTempDirs } from '../core/retention.js';
46
47
  import { reconcileSkills } from '../core/init/skills.js';
48
+ import { codexHookTrustDoctor } from '../core/codex-hooks/codex-hook-trust-doctor.js';
49
+ import { detectImagegenCapability } from '../core/imagegen/imagegen-capability.js';
50
+ import { repairCodexImagegen } from '../core/doctor/imagegen-repair.js';
47
51
  export async function run(_command, args = []) {
48
52
  const root = await projectRoot();
49
53
  const doctorFix = flag(args, '--fix');
54
+ if (!flag(args, '--json')) {
55
+ cliUi.banner('doctor');
56
+ cliUi.step(doctorFix ? 'repairing and validating' : 'validating');
57
+ }
50
58
  if (doctorFix)
51
59
  return withSecretPreservationGuard(root, 'doctor-fix', () => runDoctor(args, root, doctorFix));
52
60
  return runDoctor(args, root, doctorFix);
@@ -302,7 +310,8 @@ async function runDoctor(args = [], root, doctorFix) {
302
310
  const sksMenuBar = await installSksMenuBar({
303
311
  root,
304
312
  apply: doctorFix,
305
- launch: doctorFix
313
+ launch: doctorFix,
314
+ quiet: machineOnly || flag(args, '--json')
306
315
  }).catch((err) => ({
307
316
  schema: 'sks.codex-app-sks-menubar.v1',
308
317
  ok: false,
@@ -415,10 +424,22 @@ async function runDoctor(args = [], root, doctorFix) {
415
424
  raw_secret_values_recorded: false
416
425
  }))
417
426
  : null;
427
+ const hookTrustRepair = doctorFix && doctorPhaseIds.includes('hook_trust_repair')
428
+ ? await codexHookTrustDoctor(root, { fix: true, managed: true, actual: true }).catch((err) => ({
429
+ schema: 'sks.codex-hook-trust-doctor.v2',
430
+ ok: false,
431
+ actual: true,
432
+ blockers: [`hook_trust_repair_failed:${err?.message || String(err)}`],
433
+ warnings: [],
434
+ repair_actions: ['sks codex trust-doctor --fix --managed --actual']
435
+ }))
436
+ : null;
418
437
  const doctorFixTransaction = doctorFix
419
438
  ? await runDoctorFixTransaction({
420
439
  root,
421
440
  dirtyPlan: doctorDirtyPlan,
441
+ json: flag(args, '--json'),
442
+ machineOnly,
422
443
  phases: [
423
444
  {
424
445
  id: 'setup',
@@ -488,6 +509,17 @@ async function runDoctor(args = [], root, doctorFix) {
488
509
  rollback_evidence: 'optional_supabase_no_ready_mutation_required'
489
510
  })
490
511
  },
512
+ {
513
+ id: 'hook_trust_repair',
514
+ run: async () => ({
515
+ id: 'hook_trust_repair',
516
+ ok: hookTrustRepair?.ok !== false,
517
+ repaired: doctorFix,
518
+ blockers: hookTrustRepair?.blockers || [],
519
+ warnings: hookTrustRepair?.warnings || [],
520
+ rollback_evidence: hookTrustRepair?.fixed?.managed_hook_file || 'codex_hook_trust_repair_idempotent'
521
+ })
522
+ },
491
523
  {
492
524
  id: 'sks_menubar',
493
525
  required_for_ready: false,
@@ -572,10 +604,29 @@ async function runDoctor(args = [], root, doctorFix) {
572
604
  const globalSksInstallCleanup = flag(args, '--fix') && !flag(args, '--local-only')
573
605
  ? await 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'] }))
574
606
  : null;
575
- const { detectImagegenCapability } = await import('../core/imagegen/imagegen-capability.js');
576
- const imagegen = deepDiagnostics
577
- ? await detectImagegenCapability({ codexBin: codexBin || undefined }).catch((err) => ({ ok: false, error: err.message, auth_readiness: null }))
578
- : { ok: false, skipped: true, auth_readiness: null, warnings: ['imagegen_optional_diagnostic_skipped'] };
607
+ const imagegen = await detectImagegenCapability({ codexBin: codexBin || undefined }).catch((err) => ({ ok: false, error: err.message, auth_readiness: null, core_ready: false, blockers: ['imagegen_detection_exception'] }));
608
+ const imagegenRepair = imagegen.core_ready === true
609
+ ? {
610
+ schema: 'sks.doctor-imagegen-repair.v1',
611
+ ok: true,
612
+ attempted: false,
613
+ apply: doctorFix,
614
+ recovered: true,
615
+ before: imagegen,
616
+ after: imagegen,
617
+ steps: [],
618
+ blockers: [],
619
+ manual_actions: []
620
+ }
621
+ : await repairCodexImagegen({ root, apply: doctorFix, codexBin: codexBin || null }).catch((err) => ({
622
+ schema: 'sks.doctor-imagegen-repair.v1',
623
+ ok: false,
624
+ attempted: true,
625
+ apply: doctorFix,
626
+ recovered: false,
627
+ blockers: [err?.message || String(err)],
628
+ manual_actions: ['Run `sks doctor --fix --json` after enabling Codex App image_generation.']
629
+ }));
579
630
  const codex0138Capability = deepDiagnostics
580
631
  ? await writeCodex0138CapabilityArtifacts(root, { codexBin: codexBin || null }).catch((err) => ({ error: err?.message || String(err), report: null }))
581
632
  : { skipped: true, report: null };
@@ -768,6 +819,7 @@ async function runDoctor(args = [], root, doctorFix) {
768
819
  auth_readiness: imagegen.auth_readiness || null,
769
820
  codex_app_builtin_available: imagegen.codex_app?.available === true
770
821
  },
822
+ imagegen_repair: imagegenRepair,
771
823
  codex_0138: {
772
824
  capability: codex0138Capability.report || null,
773
825
  doctor: codex0138Doctor,
@@ -782,7 +834,7 @@ async function runDoctor(args = [], root, doctorFix) {
782
834
  sneakoscope: { ok: await exists(`${root}/.sneakoscope`) },
783
835
  package: { bytes: pkgBytes, human: formatBytes(pkgBytes) },
784
836
  skills: skillsReconcile,
785
- repair: { sks_update: sksUpdate, setup: setupRepair, codex_config: configRepair, migration_journal: migrationJournal, global_sks_installs: globalSksInstallCleanup, agent_role_config: agentRoleConfigRepair, zellij: zellijRepair, context7: context7Repair, codex_startup: codexStartupRepair, startup_config: startupConfigRepair, context7_mcp: context7McpRepair, supabase_mcp: supabaseMcpRepair, sks_menubar: sksMenuBar, doctor_transaction: doctorFixTransaction, doctor_dirty_plan: doctorDirtyPlan, doctor_postcheck: doctorFixPostcheck, codex_native: codexNativeRepair, doctor_native_capability: doctorNativeCapabilityRepair, command_aliases: commandAliasCleanup, skills: skillsReconcile, sks_temp_sweep: sksTempSweep }
837
+ repair: { sks_update: sksUpdate, setup: setupRepair, codex_config: configRepair, migration_journal: migrationJournal, global_sks_installs: globalSksInstallCleanup, agent_role_config: agentRoleConfigRepair, zellij: zellijRepair, context7: context7Repair, codex_startup: codexStartupRepair, startup_config: startupConfigRepair, context7_mcp: context7McpRepair, supabase_mcp: supabaseMcpRepair, imagegen: imagegenRepair, hook_trust: hookTrustRepair, sks_menubar: sksMenuBar, doctor_transaction: doctorFixTransaction, doctor_dirty_plan: doctorDirtyPlan, doctor_postcheck: doctorFixPostcheck, codex_native: codexNativeRepair, doctor_native_capability: doctorNativeCapabilityRepair, command_aliases: commandAliasCleanup, skills: skillsReconcile, sks_temp_sweep: sksTempSweep }
786
838
  };
787
839
  if (reportFile)
788
840
  await writeJsonReportFile(reportFile, result);
@@ -928,6 +980,9 @@ async function runDoctor(args = [], root, doctorFix) {
928
980
  console.log(` - ${action}`);
929
981
  }
930
982
  }
983
+ console.log(`Image Gen repair: ${imagegenRepair.recovered ? 'ok' : imagegenRepair.attempted ? 'blocked' : 'not-needed'}`);
984
+ for (const action of imagegenRepair.manual_actions || [])
985
+ console.log(` - ${action}`);
931
986
  const codex0138 = codex0138Capability.report || {};
932
987
  console.log('Codex current compatibility:');
933
988
  console.log(` target: rust-v0.142.0`);
@@ -1115,6 +1170,7 @@ function doctorPhaseIdsForProfile(profile) {
1115
1170
  'startup_config_repair',
1116
1171
  'context7_repair',
1117
1172
  'context7_mcp_repair',
1173
+ 'hook_trust_repair',
1118
1174
  'command_alias_cleanup'
1119
1175
  ];
1120
1176
  if (profile === 'migration')
@@ -99,6 +99,7 @@ export async function run(_command, args = []) {
99
99
  const result = await writeRouteCompletionProof(root, {
100
100
  missionId,
101
101
  route: '$SKS',
102
+ executionClass: 'real',
102
103
  status: 'verified_partial',
103
104
  evidence,
104
105
  summary: {
@@ -119,8 +120,9 @@ export async function run(_command, args = []) {
119
120
  if (action === 'smoke') {
120
121
  const evidence = await collectProofEvidence(root);
121
122
  const result = await writeCompletionProof(root, {
123
+ execution_class: 'mock_fixture',
122
124
  route: '$SKS',
123
- status: 'verified_partial',
125
+ status: 'mock_only',
124
126
  summary: {
125
127
  files_changed: evidence.files?.length || 0,
126
128
  commands_run: 1,
@@ -130,8 +132,9 @@ export async function run(_command, args = []) {
130
132
  },
131
133
  evidence,
132
134
  claims: [{ id: 'proof-smoke', status: 'supported', evidence: '.sneakoscope/proof/latest.json' }],
133
- unverified: ['Smoke proof is fixture evidence, not a real route completion.']
134
- }, { command: { cmd: 'sks proof smoke', status: 'verified_partial' } });
135
+ unverified: ['Smoke proof is fixture evidence, not a real route completion.'],
136
+ blockers: ['proof_smoke_fixture_cannot_claim_real_completion']
137
+ }, { command: { cmd: 'sks proof smoke', status: 'mock_only' } });
135
138
  if (flag(args, '--json'))
136
139
  return printJson(result);
137
140
  console.log(`Completion proof written: ${result.files.latest_json}`);