sneakoscope 4.8.6 → 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 (390) 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 +75 -42
  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 +147 -47
  40. package/dist/cli/router.js +58 -2
  41. package/dist/commands/codex-lb.js +6 -4
  42. package/dist/commands/doctor.js +146 -8
  43. package/dist/commands/proof.js +6 -3
  44. package/dist/commands/zellij-monitor-pane.js +25 -0
  45. package/dist/commands/zellij-slot-pane.js +39 -2
  46. package/dist/commands/zellij-viewport-pane.js +56 -0
  47. package/dist/commands/zellij.js +55 -2
  48. package/dist/config/skills-manifest.json +493 -0
  49. package/dist/core/agents/agent-conflict-graph.js +5 -0
  50. package/dist/core/agents/agent-lease.js +5 -0
  51. package/dist/core/agents/agent-ledger-schemas.js +1 -0
  52. package/dist/core/agents/agent-lifecycle.js +86 -35
  53. package/dist/core/agents/agent-orchestrator.js +287 -72
  54. package/dist/core/agents/agent-output-validator.js +14 -3
  55. package/dist/core/agents/agent-patch-queue-store.js +108 -4
  56. package/dist/core/agents/agent-patch-queue.js +10 -3
  57. package/dist/core/agents/agent-patch-schema.js +13 -0
  58. package/dist/core/agents/agent-proof-evidence.js +6 -1
  59. package/dist/core/agents/agent-runner-fake.js +40 -0
  60. package/dist/core/agents/agent-scheduler.js +2 -3
  61. package/dist/core/agents/agent-worker-pipeline.js +36 -2
  62. package/dist/core/agents/codex-exec-worker-adapter.js +2 -0
  63. package/dist/core/agents/native-cli-session-swarm.js +30 -13
  64. package/dist/core/agents/native-cli-worker.js +2 -1
  65. package/dist/core/agents/native-worker-backend-router.js +58 -1
  66. package/dist/core/auto-review.js +25 -4
  67. package/dist/core/codex/agent-config-file-repair.js +15 -2
  68. package/dist/core/codex/codex-config-eperm-repair.js +8 -2
  69. package/dist/core/codex/codex-config-guard.js +289 -0
  70. package/dist/core/codex/codex-config-toml.js +122 -0
  71. package/dist/core/codex/codex-project-config-policy.js +59 -7
  72. package/dist/core/codex-app/sks-menubar.js +780 -122
  73. package/dist/core/codex-app.js +1 -0
  74. package/dist/core/codex-control/codex-fake-sdk-adapter.js +6 -4
  75. package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
  76. package/dist/core/codex-control/codex-sdk-env-policy.js +1 -1
  77. package/dist/core/codex-control/codex-task-runner.js +32 -14
  78. package/dist/core/codex-control/python-codex-sdk-adapter.js +4 -1
  79. package/dist/core/codex-control/schemas/agent-worker-result.schema.js +12 -3
  80. package/dist/core/codex-hooks/codex-hook-managed-install.js +5 -0
  81. package/dist/core/codex-hooks/codex-hook-state-writer.js +70 -11
  82. package/dist/core/codex-hooks/codex-hook-trust-doctor.js +2 -2
  83. package/dist/core/codex-lb/codex-lb-env.js +20 -1
  84. package/dist/core/codex-lb/codex-lb-setup.js +2 -5
  85. package/dist/core/codex-native/skill-registry-ledger.js +24 -5
  86. package/dist/core/commands/basic-cli.js +21 -2
  87. package/dist/core/commands/check-command.js +37 -5
  88. package/dist/core/commands/command-utils.js +22 -2
  89. package/dist/core/commands/computer-use-command.js +62 -7
  90. package/dist/core/commands/db-command.js +31 -5
  91. package/dist/core/commands/fast-mode-command.js +39 -11
  92. package/dist/core/commands/gate-result-contract.js +43 -0
  93. package/dist/core/commands/gates-command.js +6 -1
  94. package/dist/core/commands/gc-command.js +29 -2
  95. package/dist/core/commands/goal-command.js +9 -2
  96. package/dist/core/commands/gx-command.js +79 -7
  97. package/dist/core/commands/image-ux-review-command.js +188 -13
  98. package/dist/core/commands/mad-db-command.js +85 -176
  99. package/dist/core/commands/mad-sks-command.js +248 -34
  100. package/dist/core/commands/menubar-command.js +146 -0
  101. package/dist/core/commands/naruto-command.js +64 -10
  102. package/dist/core/commands/pipeline-command.js +21 -2
  103. package/dist/core/commands/plan-command.js +76 -0
  104. package/dist/core/commands/ppt-command.js +159 -24
  105. package/dist/core/commands/qa-loop-command.js +6 -2
  106. package/dist/core/commands/release-command.js +55 -2
  107. package/dist/core/commands/research-command.js +1 -1
  108. package/dist/core/commands/review-command.js +217 -0
  109. package/dist/core/commands/route-command.js +62 -0
  110. package/dist/core/commands/route-success-helpers.js +59 -0
  111. package/dist/core/commands/run-command.js +19 -7
  112. package/dist/core/commands/seo-command.js +49 -1
  113. package/dist/core/commands/status-command.js +21 -1
  114. package/dist/core/commands/team-legacy-observe-command.js +221 -3
  115. package/dist/core/commands/ui-command.js +161 -0
  116. package/dist/core/commands/uninstall-command.js +312 -0
  117. package/dist/core/db-safety.js +7 -3
  118. package/dist/core/doctor/codex-startup-config-repair.js +14 -3
  119. package/dist/core/doctor/confirm-repair.js +27 -0
  120. package/dist/core/doctor/context7-mcp-repair.js +35 -7
  121. package/dist/core/doctor/doctor-codex-startup-repair.js +10 -3
  122. package/dist/core/doctor/doctor-context7-repair.js +17 -4
  123. package/dist/core/doctor/doctor-dirty-planner.js +27 -9
  124. package/dist/core/doctor/doctor-native-capability-repair.js +12 -2
  125. package/dist/core/doctor/doctor-readiness-matrix.js +27 -2
  126. package/dist/core/doctor/doctor-repair-postcheck.js +4 -0
  127. package/dist/core/doctor/doctor-transaction.js +21 -5
  128. package/dist/core/doctor/doctor-zellij-repair.js +1 -0
  129. package/dist/core/doctor/imagegen-repair.js +161 -0
  130. package/dist/core/doctor/supabase-mcp-repair.js +23 -5
  131. package/dist/core/feature-fixture-runner.js +2 -2
  132. package/dist/core/feature-fixtures.js +65 -37
  133. package/dist/core/feature-registry.js +106 -3
  134. package/dist/core/fsx.js +91 -2
  135. package/dist/core/hooks-runtime/skill-reconcile-preflight.js +43 -0
  136. package/dist/core/hooks-runtime.js +86 -46
  137. package/dist/core/image-ux-review/imagegen-adapter.js +48 -11
  138. package/dist/core/image-ux-review.js +16 -0
  139. package/dist/core/imagegen/imagegen-capability.js +11 -5
  140. package/dist/core/imagegen/require-imagegen.js +57 -0
  141. package/dist/core/init/skills.js +271 -14
  142. package/dist/core/init.js +13 -10
  143. package/dist/core/mad-db/mad-db-coordinator.js +96 -20
  144. package/dist/core/mad-db/mad-db-policy.js +12 -10
  145. package/dist/core/mad-sks/executors/executor-base.js +8 -2
  146. package/dist/core/mad-sks/executors/index.js +4 -0
  147. package/dist/core/mad-sks/executors/sql-plane-executor.js +194 -0
  148. package/dist/core/mission.js +138 -5
  149. package/dist/core/naruto/naruto-active-pool.js +84 -30
  150. package/dist/core/naruto/naruto-backpressure.js +5 -1
  151. package/dist/core/naruto/naruto-real-worker-child.js +10 -0
  152. package/dist/core/naruto/naruto-real-worker-runtime.js +9 -7
  153. package/dist/core/naruto/naruto-role-policy.js +3 -0
  154. package/dist/core/naruto/naruto-task-hints.js +10 -0
  155. package/dist/core/naruto/naruto-work-graph.js +8 -2
  156. package/dist/core/naruto/naruto-work-item.js +6 -0
  157. package/dist/core/naruto/resource-pressure-monitor.js +33 -15
  158. package/dist/core/naruto/solution-tournament.js +101 -0
  159. package/dist/core/permission-gates.js +30 -0
  160. package/dist/core/pipeline-internals/runtime-core.js +72 -222
  161. package/dist/core/pipeline-internals/runtime-gates.js +140 -24
  162. package/dist/core/ppt-review/index.js +6 -1
  163. package/dist/core/ppt-review/slide-imagegen-review.js +75 -10
  164. package/dist/core/ppt.js +70 -2
  165. package/dist/core/proof/auto-finalize.js +70 -11
  166. package/dist/core/proof/proof-schema.js +2 -0
  167. package/dist/core/proof/route-adapter.js +5 -1
  168. package/dist/core/proof/route-finalizer.js +8 -5
  169. package/dist/core/proof/selftest-proof-fixtures.js +18 -5
  170. package/dist/core/proof/validation.js +2 -0
  171. package/dist/core/provider/model-router.js +53 -0
  172. package/dist/core/questions.js +1 -1
  173. package/dist/core/recallpulse.js +1 -1
  174. package/dist/core/release/gate-manifest.js +2 -2
  175. package/dist/core/release/release-gate-affected-selector.js +3 -10
  176. package/dist/core/release/release-gate-batch-runner.js +4 -2
  177. package/dist/core/release/release-gate-cache-v2.js +27 -14
  178. package/dist/core/release/release-gate-dag.js +6 -1
  179. package/dist/core/release/release-gate-hermetic-env.js +10 -0
  180. package/dist/core/release/release-gate-node.js +3 -0
  181. package/dist/core/release/release-gate-resource-governor.js +1 -0
  182. package/dist/core/retention.js +89 -4
  183. package/dist/core/routes/constants.js +1 -1
  184. package/dist/core/routes/diagnostic-allowlist.js +55 -0
  185. package/dist/core/routes.js +83 -33
  186. package/dist/core/safety/mutation-guard.js +5 -1
  187. package/dist/core/skill-forge.js +9 -4
  188. package/dist/core/stop-gate/gate-evaluator.js +102 -0
  189. package/dist/core/stop-gate/stop-gate-check.js +26 -4
  190. package/dist/core/stop-gate/stop-gate-resolver.js +19 -3
  191. package/dist/core/stop-gate/stop-gate-writer.js +20 -1
  192. package/dist/core/team-dag.js +12 -465
  193. package/dist/core/team-dashboard-renderer.js +13 -94
  194. package/dist/core/team-live.js +68 -804
  195. package/dist/core/triwiki/agents-md-projector.js +184 -0
  196. package/dist/core/triwiki-wrongness/wrongness-schema.js +3 -1
  197. package/dist/core/trust-kernel/trust-kernel-schema.js +1 -0
  198. package/dist/core/trust-kernel/trust-report.js +1 -1
  199. package/dist/core/trust-kernel/trust-status.js +2 -0
  200. package/dist/core/ui/dashboard-html.js +111 -0
  201. package/dist/core/update/update-migration-state.js +383 -42
  202. package/dist/core/update-check.js +201 -78
  203. package/dist/core/verification/diff-quality.js +100 -0
  204. package/dist/core/verification/impact-scan.js +164 -0
  205. package/dist/core/verification/machine-feedback.js +146 -0
  206. package/dist/core/verification/mistake-rule-compiler.js +195 -0
  207. package/dist/core/version.js +1 -1
  208. package/dist/core/zellij/zellij-layout-builder.js +44 -16
  209. package/dist/core/zellij/zellij-monitor-renderer.js +53 -0
  210. package/dist/core/zellij/zellij-self-heal.js +27 -32
  211. package/dist/core/zellij/zellij-slot-pane-renderer.js +162 -153
  212. package/dist/core/zellij/zellij-slot-telemetry.js +2 -0
  213. package/dist/core/zellij/zellij-theme.js +67 -0
  214. package/dist/core/zellij/zellij-ui-mode.js +16 -0
  215. package/dist/core/zellij/zellij-viewport-binder.js +59 -0
  216. package/dist/core/zellij/zellij-worker-pane-manager.js +53 -5
  217. package/dist/scripts/agent-patch-swarm-gate-lib.js +2 -2
  218. package/dist/scripts/build-dist.js +8 -0
  219. package/dist/scripts/check-feature-quality.js +2 -2
  220. package/dist/scripts/cli-output-consistency-check.js +57 -0
  221. package/dist/scripts/codex-lb-fast-ui-preservation-check.js +106 -0
  222. package/dist/scripts/codex-lb-gpt55-fast-profile-check.js +105 -0
  223. package/dist/scripts/codex-lb-missing-env-regression.js +2 -3
  224. package/dist/scripts/codex-project-config-policy-merge-regression.js +3 -3
  225. package/dist/scripts/coding-bench-check.js +136 -0
  226. package/dist/scripts/concurrent-session-collision-check.js +67 -0
  227. package/dist/scripts/docs-truthfulness-check.js +1 -1
  228. package/dist/scripts/doctor-imagegen-repair-check.js +62 -0
  229. package/dist/scripts/ensure-bin-executable.js +11 -3
  230. package/dist/scripts/gate-policy-audit-check.js +130 -0
  231. package/dist/scripts/harness-benchmark-check.js +104 -0
  232. package/dist/scripts/hook-latency-budget-check.js +45 -0
  233. package/dist/scripts/legacy-update-e2e-check.js +228 -0
  234. package/dist/scripts/lib/codex-sdk-gate-lib.js +2 -2
  235. package/dist/scripts/lib/real-codex-parallel-gate.js +2 -2
  236. package/dist/scripts/loop-directive-check-lib.js +1 -1
  237. package/dist/scripts/mad-db-command-check.js +11 -8
  238. package/dist/scripts/mad-db-real-supabase-e2e.js +2 -2
  239. package/dist/scripts/mad-db-route-identity-check.js +8 -6
  240. package/dist/scripts/mad-db-safety-conflict-matrix-check.js +31 -8
  241. package/dist/scripts/mad-db-skill-policy-snapshot-check.js +4 -5
  242. package/dist/scripts/mad-sks-zellij-default-pane-worker-check.js +3 -2
  243. package/dist/scripts/mad-sks-zellij-launch-check.js +1 -1
  244. package/dist/scripts/naruto-zellij-dynamic-right-column-check.js +7 -7
  245. package/dist/scripts/parallel-claim-enforcement-check.js +14 -5
  246. package/dist/scripts/ppt-real-imagegen-wiring-check.js +5 -1
  247. package/dist/scripts/project-skill-dedupe-check.js +23 -5
  248. package/dist/scripts/proof-root-cause-policy-check.js +2 -0
  249. package/dist/scripts/release-affected-selector-check.js +2 -2
  250. package/dist/scripts/release-cache-glob-hashing-check.js +1 -0
  251. package/dist/scripts/release-dag-full-coverage-check.js +13 -4
  252. package/dist/scripts/release-gate-dag-runner-check.js +10 -2
  253. package/dist/scripts/release-gate-dag-runner.js +22 -0
  254. package/dist/scripts/release-gate-existence-audit.js +2 -1
  255. package/dist/scripts/release-gate-planner.js +2 -1
  256. package/dist/scripts/release-gate-script-parity-check.js +1 -1
  257. package/dist/scripts/release-metadata-1-19-check.js +2 -1
  258. package/dist/scripts/release-readiness-report.js +38 -7
  259. package/dist/scripts/release-stability-report-check.js +12 -8
  260. package/dist/scripts/search-visibility-gate-lib.js +2 -2
  261. package/dist/scripts/seo-geo-feature-fixture-quality-check.js +1 -1
  262. package/dist/scripts/skills-manifest-continuity-check.js +46 -0
  263. package/dist/scripts/sks-1-11-gate-lib.js +8 -6
  264. package/dist/scripts/sks-menubar-install-check.js +87 -21
  265. package/dist/scripts/sks-uninstall-regression-check.js +54 -0
  266. package/dist/scripts/uninstall-inventory-check.js +3 -0
  267. package/dist/scripts/ux-review-real-loop-fixture-check.js +9 -4
  268. package/dist/scripts/ux-review-run-wires-imagegen-check.js +4 -0
  269. package/dist/scripts/zellij-layout-valid-check.js +18 -11
  270. package/dist/scripts/zellij-right-column-geometry-proof.js +2 -4
  271. package/dist/scripts/zellij-slot-pane-renderer-check.js +9 -9
  272. package/dist/scripts/zellij-slot-pane-stale-detection-check.js +3 -4
  273. package/dist/scripts/zellij-slot-pane-telemetry-renderer-check.js +3 -2
  274. package/dist/scripts/zellij-slot-telemetry-renderer-check.js +4 -2
  275. package/dist/scripts/zellij-spawn-on-demand-layout-check.js +8 -2
  276. package/dist/scripts/zellij-viewport-binder-check.js +9 -0
  277. package/docs/assets/sneakoscope-architecture-pipeline.jpg +0 -0
  278. package/docs/demo.tape +28 -0
  279. package/package.json +70 -3
  280. package/schemas/codex/completion-proof.schema.json +3 -2
  281. package/schemas/release/release-gate-node.schema.json +2 -1
  282. package/dist/scripts/agent-backfill-route-blackbox.js +0 -5
  283. package/dist/scripts/agent-dynamic-pool-route-blackbox.js +0 -5
  284. package/dist/scripts/agent-parallel-write-blackbox.js +0 -56
  285. package/dist/scripts/agent-patch-swarm-route-blackbox.js +0 -10
  286. package/dist/scripts/agent-route-blackbox-lib.js +0 -132
  287. package/dist/scripts/blackbox-command-import-smoke.js +0 -143
  288. package/dist/scripts/blackbox-global-shim.js +0 -77
  289. package/dist/scripts/blackbox-matrix.js +0 -70
  290. package/dist/scripts/blackbox-npx-one-shot.js +0 -69
  291. package/dist/scripts/blackbox-pack-install.js +0 -174
  292. package/dist/scripts/brand-neutrality-zero-leakage-blackbox.js +0 -4
  293. package/dist/scripts/build-once-runner-blackbox.js +0 -34
  294. package/dist/scripts/codex-0140-integration-blackbox.js +0 -13
  295. package/dist/scripts/codex-agent-type-blackbox.js +0 -4
  296. package/dist/scripts/codex-app-harness-blackbox.js +0 -4
  297. package/dist/scripts/codex-app-skill-agent-blackbox.js +0 -4
  298. package/dist/scripts/codex-hook-approval-blackbox.js +0 -4
  299. package/dist/scripts/codex-init-deep-directory-local-blackbox.js +0 -4
  300. package/dist/scripts/codex-native-feature-broker-blackbox.js +0 -4
  301. package/dist/scripts/codex-native-pattern-analysis-blackbox.js +0 -4
  302. package/dist/scripts/codex-native-read-repair-split-blackbox.js +0 -55
  303. package/dist/scripts/codex-native-reference-cache-blackbox.js +0 -41
  304. package/dist/scripts/core-skill-integrity-blackbox.js +0 -33
  305. package/dist/scripts/dfix-fast-blackbox-check.js +0 -37
  306. package/dist/scripts/dfix-parallel-write-blackbox.js +0 -48
  307. package/dist/scripts/dfix-patch-swarm-route-blackbox.js +0 -10
  308. package/dist/scripts/doctor-context7-mcp-repair-blackbox.js +0 -16
  309. package/dist/scripts/doctor-dirty-repair-blackbox.js +0 -22
  310. package/dist/scripts/doctor-dirty-semantic-blackbox.js +0 -8
  311. package/dist/scripts/doctor-fix-production-blackbox.js +0 -26
  312. package/dist/scripts/doctor-native-capability-repair-blackbox.js +0 -39
  313. package/dist/scripts/doctor-startup-config-repair-blackbox.js +0 -13
  314. package/dist/scripts/doctor-supabase-mcp-repair-blackbox.js +0 -14
  315. package/dist/scripts/doctor-transaction-engine-blackbox.js +0 -28
  316. package/dist/scripts/doctor-zellij-fix-blackbox.js +0 -4
  317. package/dist/scripts/doctor-zellij-no-homebrew-blackbox.js +0 -4
  318. package/dist/scripts/doctor-zellij-upgrade-blackbox.js +0 -4
  319. package/dist/scripts/gate-pack-runner-blackbox.js +0 -27
  320. package/dist/scripts/gate-pack-v2-blackbox.js +0 -18
  321. package/dist/scripts/geo-cli-blackbox-check.js +0 -18
  322. package/dist/scripts/loop-collision-blackbox.js +0 -3
  323. package/dist/scripts/loop-concurrency-oversubscription-blackbox.js +0 -3
  324. package/dist/scripts/loop-fixture-production-misuse-blackbox.js +0 -3
  325. package/dist/scripts/loop-kill-interrupt-real-blackbox.js +0 -3
  326. package/dist/scripts/loop-merge-strategy-blackbox.js +0 -3
  327. package/dist/scripts/loop-mesh-production-e2e-blackbox.js +0 -3
  328. package/dist/scripts/loop-side-effect-blackbox.js +0 -3
  329. package/dist/scripts/mad-db-operation-lifecycle-blackbox.js +0 -29
  330. package/dist/scripts/mad-sks-actual-executor-blackbox.js +0 -5
  331. package/dist/scripts/mad-zellij-headless-fallback-blackbox.js +0 -4
  332. package/dist/scripts/mad-zellij-self-heal-blackbox.js +0 -4
  333. package/dist/scripts/naruto-loop-mesh-blackbox.js +0 -3
  334. package/dist/scripts/naruto-real-parallelism-blackbox.js +0 -307
  335. package/dist/scripts/naruto-worktree-coding-blackbox.js +0 -29
  336. package/dist/scripts/parallel-runtime-real-blackbox.js +0 -44
  337. package/dist/scripts/pipeline-codex-native-doctor-mad-routing-real-blackbox.js +0 -77
  338. package/dist/scripts/pipeline-codex-native-e2e-blackbox.js +0 -13
  339. package/dist/scripts/pipeline-codex-native-image-routing-real-blackbox.js +0 -50
  340. package/dist/scripts/pipeline-codex-native-loop-routing-real-blackbox.js +0 -74
  341. package/dist/scripts/pipeline-codex-native-qa-routing-real-blackbox.js +0 -51
  342. package/dist/scripts/pipeline-codex-native-research-routing-real-blackbox.js +0 -45
  343. package/dist/scripts/pipeline-execution-profile-routing-blackbox.js +0 -4
  344. package/dist/scripts/postinstall-global-doctor-blackbox.js +0 -12
  345. package/dist/scripts/ppt-full-e2e-blackbox-check.js +0 -109
  346. package/dist/scripts/ppt-imagegen-blackbox-check.js +0 -46
  347. package/dist/scripts/project-skill-dedupe-blackbox.js +0 -36
  348. package/dist/scripts/qa-backfill-route-blackbox.js +0 -5
  349. package/dist/scripts/qa-patch-swarm-route-blackbox.js +0 -10
  350. package/dist/scripts/release-full-parallelism-blackbox.js +0 -41
  351. package/dist/scripts/release-triwiki-first-runner-blackbox.js +0 -48
  352. package/dist/scripts/release-wiring-3110-blackbox.js +0 -27
  353. package/dist/scripts/release-wiring-3112-blackbox.js +0 -17
  354. package/dist/scripts/release-wiring-3113-blackbox.js +0 -17
  355. package/dist/scripts/research-backfill-route-blackbox.js +0 -5
  356. package/dist/scripts/research-final-reviewer-blackbox.js +0 -70
  357. package/dist/scripts/research-stage-cycle-runtime-blackbox.js +0 -40
  358. package/dist/scripts/research-synthesis-writer-blackbox.js +0 -24
  359. package/dist/scripts/route-blackbox-realism-check.js +0 -21
  360. package/dist/scripts/scheduler-resource-claim-blackbox.js +0 -24
  361. package/dist/scripts/seo-cli-blackbox-check.js +0 -18
  362. package/dist/scripts/sks-3110-all-feature-regression-blackbox.js +0 -116
  363. package/dist/scripts/sks-3112-all-feature-regression-blackbox.js +0 -29
  364. package/dist/scripts/sks-3113-all-feature-regression-blackbox.js +0 -17
  365. package/dist/scripts/sks-400-all-feature-regression-blackbox.js +0 -21
  366. package/dist/scripts/sks-400-extreme-parallel-blackbox.js +0 -8
  367. package/dist/scripts/sks-400-five-minute-blackbox.js +0 -9
  368. package/dist/scripts/sks-400-legacy-purge-blackbox.js +0 -8
  369. package/dist/scripts/sks-401-all-feature-regression-blackbox.js +0 -46
  370. package/dist/scripts/sks-401-five-minute-actual-blackbox.js +0 -23
  371. package/dist/scripts/sks-402-all-feature-regression-blackbox.js +0 -9
  372. package/dist/scripts/sks-402-five-minute-real-blackbox.js +0 -22
  373. package/dist/scripts/sksd-warm-cache-blackbox.js +0 -12
  374. package/dist/scripts/supabase-secret-preservation-blackbox.js +0 -29
  375. package/dist/scripts/team-backfill-route-blackbox.js +0 -5
  376. package/dist/scripts/team-parallel-write-blackbox.js +0 -55
  377. package/dist/scripts/team-patch-swarm-route-blackbox.js +0 -10
  378. package/dist/scripts/triwiki-affected-graph-blackbox.js +0 -28
  379. package/dist/scripts/triwiki-proof-bank-blackbox.js +0 -30
  380. package/dist/scripts/triwiki-proof-bank-lock-blackbox.js +0 -7
  381. package/dist/scripts/update-preserves-supabase-keys-blackbox.js +0 -27
  382. package/dist/scripts/ux-patch-swarm-route-blackbox.js +0 -10
  383. package/dist/scripts/ux-review-imagegen-blackbox-check.js +0 -67
  384. package/dist/scripts/zellij-initial-main-only-blackbox.js +0 -28
  385. package/dist/scripts/zellij-pane-lock-concurrency-blackbox.js +0 -80
  386. package/dist/scripts/zellij-pane-lock-open-worker-integration-blackbox.js +0 -137
  387. package/dist/scripts/zellij-self-heal-typed-blackbox.js +0 -4
  388. package/dist/scripts/zellij-slot-telemetry-real-blackbox.js +0 -20
  389. package/dist/scripts/zellij-stacked-fallback-integration-blackbox.js +0 -81
  390. package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +0 -202
@@ -1,16 +1,30 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
+ import { PACKAGE_VERSION } from '../core/fsx.js';
4
5
  import { installSksMenuBar } from '../core/codex-app/sks-menubar.js';
5
6
  const temp = await fs.mkdtemp(path.join(os.tmpdir(), 'sks-menubar-check-'));
6
7
  const envHomeTemp = await fs.mkdtemp(path.join(os.tmpdir(), 'sks-menubar-env-home-check-'));
8
+ const fakeRoot = path.join(temp, 'project-root');
9
+ await fs.mkdir(fakeRoot, { recursive: true });
7
10
  const launchGuardEnv = { ...process.env, SKS_SKIP_SKS_MENUBAR_LAUNCH: '0' };
11
+ const localEntry = path.join(fakeRoot, 'dist', 'bin', 'sks.js');
12
+ await fs.mkdir(path.dirname(localEntry), { recursive: true });
13
+ await fs.writeFile(localEntry, '#!/usr/bin/env node\n', 'utf8');
8
14
  const result = await installSksMenuBar({
9
15
  apply: true,
10
16
  launch: true,
11
17
  home: temp,
12
- root: temp,
13
- sksEntry: path.join(process.cwd(), 'dist', 'bin', 'sks.js'),
18
+ root: fakeRoot,
19
+ sksEntry: localEntry,
20
+ env: launchGuardEnv
21
+ });
22
+ const secondResult = await installSksMenuBar({
23
+ apply: true,
24
+ launch: true,
25
+ home: temp,
26
+ root: fakeRoot,
27
+ sksEntry: localEntry,
14
28
  env: launchGuardEnv
15
29
  });
16
30
  const envHomeResult = await installSksMenuBar({
@@ -23,25 +37,56 @@ const envHomeResult = await installSksMenuBar({
23
37
  const executableExists = result.executable_path ? await exists(result.executable_path) : false;
24
38
  const launchAgentExists = result.launch_agent_path ? await exists(result.launch_agent_path) : false;
25
39
  const actionScriptExists = result.action_script_path ? await exists(result.action_script_path) : false;
40
+ const buildStampExists = result.build_stamp_path ? await exists(result.build_stamp_path) : false;
26
41
  const generatedSourcePath = result.app_path ? path.join(path.dirname(result.app_path), 'SKSMenuBar.swift') : null;
27
42
  const generatedSource = generatedSourcePath ? await fs.readFile(generatedSourcePath, 'utf8').catch(() => '') : '';
43
+ const actionScript = result.action_script_path ? await fs.readFile(result.action_script_path, 'utf8').catch(() => '') : '';
28
44
  const launchAgentSource = result.launch_agent_path ? await fs.readFile(result.launch_agent_path, 'utf8').catch(() => '') : '';
29
- const hasVisibleLabelSource = generatedSource.includes('NSStatusItem.variableLength')
30
- && generatedSource.includes('button.title = "SKS"')
31
- && generatedSource.includes('button.attributedTitle = NSAttributedString(string: "SKS"')
32
- && generatedSource.includes('NSColor.labelColor')
33
- && generatedSource.includes('button.image = nil');
34
- // The status item must persist its user-arranged position across restarts so a
35
- // once-dragged item does not jump back behind the notch on the next doctor --fix.
45
+ const infoPlistPath = result.app_path ? path.join(result.app_path, 'Contents', 'Info.plist') : null;
46
+ const infoPlist = infoPlistPath ? await fs.readFile(infoPlistPath, 'utf8').catch(() => '') : '';
47
+ const commandRegistry = await fs.readFile(path.join(process.cwd(), 'src', 'cli', 'command-registry.ts'), 'utf8');
48
+ const installHelpers = await fs.readFile(path.join(process.cwd(), 'src', 'cli', 'install-helpers.ts'), 'utf8');
49
+ const hasVisibleStatusSource = generatedSource.includes('NSStatusItem.variableLength')
50
+ && generatedSource.includes('configureStatusButton(button, title: state.title)')
51
+ && generatedSource.includes('SKS ⚠')
52
+ && generatedSource.includes('SKS ↑')
53
+ && generatedSource.includes('Timer.scheduledTimer(withTimeInterval: 30.0');
54
+ const hasBackgroundReadonlyActions = generatedSource.includes('runSksBackground(["codex-lb", "fast-check"]')
55
+ && generatedSource.includes('runSksBackground(["update", "check"]')
56
+ && generatedSource.includes('display notification')
57
+ && !generatedSource.includes('@objc func fastCheck() {\n runSksInTerminal');
58
+ const hasTerminalFailureAlert = generatedSource.includes('output.contains("-1743")')
59
+ && generatedSource.includes('Privacy & Security > Automation');
60
+ const hasTerminalExit = generatedSource.includes('; exit');
36
61
  const hasAutosaveNameSource = generatedSource.includes('statusItem.autosaveName = "com.sneakoscope.sks-menubar"');
37
62
  const hasExplicitVisibleSource = generatedSource.includes('statusItem.isVisible = true');
38
- const terminalCommandLine = generatedSource.split(/\r?\n/)
39
- .find((line) => line.includes('do script') && line.includes('escaped')) || '';
40
- const hasTerminalCommandInterpolation = terminalCommandLine.includes(String.raw `\(escaped)`)
41
- && !terminalCommandLine.includes(String.raw `\"(escaped)\"`);
42
63
  const hasNoUnconditionalKeepAlive = !launchAgentSource.includes('<key>KeepAlive</key>');
64
+ const hasNoLaunchAgentSecrets = !launchAgentSource.includes('EnvironmentVariables')
65
+ && !launchAgentSource.includes('CODEX_LB_API_KEY')
66
+ && !launchAgentSource.includes('OPENROUTER_API_KEY');
43
67
  const hasInteractiveProcessType = launchAgentSource.includes('<key>ProcessType</key>')
44
68
  && launchAgentSource.includes('<string>Interactive</string>');
69
+ const hasPackagePlistVersion = infoPlist.includes(`<string>${PACKAGE_VERSION}</string>`)
70
+ && infoPlist.includes('<key>CFBundleShortVersionString</key>')
71
+ && infoPlist.includes('<key>CFBundleVersion</key>');
72
+ const hasActionFallbacks = actionScript.includes('.nvm/versions/node/*/bin/node(Nn[-1])')
73
+ && actionScript.includes('/bin/zsh -lc')
74
+ && actionScript.includes('command -v sks');
75
+ const hasEntryWarning = result.warnings.includes('sks_entry_project_local_ignored_global_package_used')
76
+ || result.warnings.includes('sks_entry_resolved_under_project_root');
77
+ const hasBuildStamp = buildStampExists
78
+ && result.build_stamp?.package_version === PACKAGE_VERSION
79
+ && result.build_stamp?.codesign_identifier === 'com.sneakoscope.sks-menubar';
80
+ const isIdempotent = secondResult.actions.includes('menubar_up_to_date')
81
+ && secondResult.build_stamp?.action_script_sha256 === result.build_stamp?.action_script_sha256;
82
+ const hasCommandRegistry = commandRegistry.includes('menubar:')
83
+ && commandRegistry.includes('menubarCommand')
84
+ && commandRegistry.includes('dist/core/commands/menubar-command.js');
85
+ const noLaunchctlSecretSetenv = !installHelpers.includes('{ CODEX_LB_API_KEY: apiKey')
86
+ && !installHelpers.includes("['setenv', 'CODEX_LB_API_KEY")
87
+ && !installHelpers.includes("['setenv', 'OPENROUTER_API_KEY");
88
+ const hasLaunchctlUnsetenv = installHelpers.includes('cleanupMacLaunchSecretEnvironment')
89
+ && installHelpers.includes('skipped_secret_variables');
45
90
  const expectedMenuItems = [
46
91
  'Use codex-lb',
47
92
  'Use ChatGPT OAuth',
@@ -59,9 +104,6 @@ const launchSkippedForTempHome = result.launch?.requested === false
59
104
  const launchSkippedForEnvHome = envHomeResult.launch?.requested === false
60
105
  && envHomeResult.launch?.method === 'skipped'
61
106
  && envHomeResult.warnings.includes('launch_skipped_non_user_home');
62
- // Temp-path guard: a temp-rooted install must never request a launch, even if
63
- // some caller forgets SKS_SKIP_SKS_MENUBAR_LAUNCH. Both fixtures live under
64
- // os.tmpdir(), so both results must carry the temp-install skip warning.
65
107
  const launchSkippedForTempInstall = result.launch?.requested === false
66
108
  && result.warnings.includes('launch_skipped_temp_install')
67
109
  && envHomeResult.launch?.requested === false
@@ -71,18 +113,30 @@ const preferredPositionSkippedForTempInstall = !result.actions.includes('seeded
71
113
  const ok = process.platform === 'darwin'
72
114
  ? result.ok === true
73
115
  && result.status === 'installed_launch_skipped'
116
+ && secondResult.ok === true
74
117
  && envHomeResult.ok === true
75
118
  && envHomeResult.status === 'installed_launch_skipped'
76
119
  && executableExists
77
120
  && launchAgentExists
78
121
  && actionScriptExists
79
122
  && hasExpectedItems
80
- && hasVisibleLabelSource
123
+ && hasVisibleStatusSource
124
+ && hasBackgroundReadonlyActions
125
+ && hasTerminalFailureAlert
126
+ && hasTerminalExit
81
127
  && hasAutosaveNameSource
82
128
  && hasExplicitVisibleSource
83
- && hasTerminalCommandInterpolation
84
129
  && hasNoUnconditionalKeepAlive
130
+ && hasNoLaunchAgentSecrets
85
131
  && hasInteractiveProcessType
132
+ && hasPackagePlistVersion
133
+ && hasActionFallbacks
134
+ && hasEntryWarning
135
+ && hasBuildStamp
136
+ && isIdempotent
137
+ && hasCommandRegistry
138
+ && noLaunchctlSecretSetenv
139
+ && hasLaunchctlUnsetenv
86
140
  && launchSkippedForTempHome
87
141
  && launchSkippedForEnvHome
88
142
  && launchSkippedForTempInstall
@@ -94,18 +148,30 @@ const report = {
94
148
  temp,
95
149
  env_home_temp: envHomeTemp,
96
150
  result,
151
+ second_result: secondResult,
97
152
  env_home_result: envHomeResult,
98
153
  executable_exists: executableExists,
99
154
  launch_agent_exists: launchAgentExists,
100
155
  action_script_exists: actionScriptExists,
156
+ build_stamp_exists: buildStampExists,
101
157
  generated_source_path: generatedSourcePath,
102
- terminal_command_line: terminalCommandLine,
103
- has_visible_label_source: hasVisibleLabelSource,
158
+ has_visible_status_source: hasVisibleStatusSource,
159
+ has_background_readonly_actions: hasBackgroundReadonlyActions,
160
+ has_terminal_failure_alert: hasTerminalFailureAlert,
161
+ has_terminal_exit: hasTerminalExit,
104
162
  has_autosave_name_source: hasAutosaveNameSource,
105
163
  has_explicit_visible_source: hasExplicitVisibleSource,
106
- has_terminal_command_interpolation: hasTerminalCommandInterpolation,
107
164
  has_no_unconditional_keepalive: hasNoUnconditionalKeepAlive,
165
+ has_no_launch_agent_secrets: hasNoLaunchAgentSecrets,
108
166
  has_interactive_process_type: hasInteractiveProcessType,
167
+ has_package_plist_version: hasPackagePlistVersion,
168
+ has_action_fallbacks: hasActionFallbacks,
169
+ has_entry_warning: hasEntryWarning,
170
+ has_build_stamp: hasBuildStamp,
171
+ is_idempotent: isIdempotent,
172
+ has_command_registry: hasCommandRegistry,
173
+ no_launchctl_secret_setenv: noLaunchctlSecretSetenv,
174
+ has_launchctl_unsetenv: hasLaunchctlUnsetenv,
109
175
  launch_skipped_for_temp_home: launchSkippedForTempHome,
110
176
  launch_skipped_for_env_home: launchSkippedForEnvHome,
111
177
  launch_skipped_for_temp_install: launchSkippedForTempInstall,
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { assertGate, emitGate, makeTempRoot, writeText } from './sks-3-1-8-check-lib.js';
5
+ import { uninstallCommand } from '../core/commands/uninstall-command.js';
6
+ const home = await makeTempRoot('sks-uninstall-home-');
7
+ const project = await makeTempRoot('sks-uninstall-project-');
8
+ process.env.SKS_UNINSTALL_SKIP_TMP_SWEEP = '1';
9
+ await writeText(path.join(home, '.agents', 'skills', 'answer', 'SKILL.md'), '---\nname: answer\ndescription: SKS fixture\n---\n\nSKS managed official fixture.\n');
10
+ await writeText(path.join(home, '.agents', 'skills', 'user-global', 'SKILL.md'), '---\nname: user-global\ndescription: User global\n---\n\nUser global skill.\n');
11
+ await writeText(path.join(home, '.codex', 'agents', 'lazycodex-executor.toml'), 'name = "lazycodex-executor"\n');
12
+ await writeText(path.join(home, '.codex', 'hooks.json'), JSON.stringify({
13
+ UserPromptSubmit: [{ hooks: [{ type: 'command', command: 'sks hook user-prompt-submit' }] }],
14
+ Stop: [{ hooks: [{ type: 'command', command: 'custom-stop' }] }]
15
+ }, null, 2));
16
+ await writeText(path.join(home, '.codex', 'config.toml'), [
17
+ 'default_profile = "sks-fast-high"',
18
+ 'service_tier = "fast"',
19
+ '[profiles.sks-fast-high]',
20
+ 'model = "gpt-5.5"',
21
+ '[user.fast_mode]',
22
+ 'enabled = true',
23
+ '[mcp_servers.user]',
24
+ 'url = "https://example.test"'
25
+ ].join('\n'));
26
+ await writeText(path.join(home, '.sneakoscope', 'state.json'), '{}\n');
27
+ await writeText(path.join(project, '.agents', 'skills', 'answer', 'SKILL.md'), '---\nname: answer\ndescription: SKS legacy fixture\n---\n\nDollar-command route generated by SKS.\n');
28
+ await writeText(path.join(project, '.agents', 'skills', 'forge-one', 'SKILL.md'), '---\nname: forge-one\ndescription: Forge\n---\n\n<!-- BEGIN SKS FORGE SKILL project=x generator=sks@test created=now -->\n');
29
+ await writeText(path.join(project, '.agents', 'skills', 'user-one', 'SKILL.md'), '---\nname: user-one\ndescription: User\n---\n\nUser content.\n');
30
+ const dry = await uninstallCommand(['--dry-run', '--json', '--home', home]);
31
+ assertGate(dry.dry_run === true, 'dry-run must not mutate', dry);
32
+ assertGate(dry.inventory.some((item) => item.id === 'global-skills' && item.exists === true), 'inventory must include global skills', dry);
33
+ const originalCwd = process.cwd();
34
+ process.chdir(project);
35
+ const applied = await uninstallCommand(['--yes', '--home', home, '--purge-projects', '--keep-data']);
36
+ process.chdir(originalCwd);
37
+ assertGate(applied.ok === true, 'uninstall apply must pass', applied);
38
+ assertGate(!(await exists(path.join(home, '.agents', 'skills', 'answer'))), 'global SKS official skill must be removed');
39
+ assertGate(await exists(path.join(home, '.agents', 'skills', 'user-global', 'SKILL.md')), 'global user-authored skill must be preserved');
40
+ assertGate(await exists(path.join(home, '.sneakoscope')), '--keep-data must preserve ~/.sneakoscope');
41
+ const hooks = JSON.parse(await fs.readFile(path.join(home, '.codex', 'hooks.json'), 'utf8'));
42
+ assertGate(JSON.stringify(hooks).includes('custom-stop') && !JSON.stringify(hooks).includes('sks hook'), 'hooks-json must strip SKS entries and preserve user hooks', hooks);
43
+ const cfg = await fs.readFile(path.join(home, '.codex', 'config.toml'), 'utf8');
44
+ assertGate(cfg.includes('[mcp_servers.user]') && !cfg.includes('sks-fast-high') && !cfg.includes('[user.fast_mode]'), 'config strip must preserve user table and remove SKS-owned fast profile', cfg);
45
+ assertGate(!(await exists(path.join(project, '.agents', 'skills', 'answer'))), 'project official residue must be removed');
46
+ assertGate(await exists(path.join(project, '.agents', 'skills', 'forge-one', 'SKILL.md')), 'forge skill must be preserved');
47
+ assertGate(await exists(path.join(project, '.agents', 'skills', 'user-one', 'SKILL.md')), 'user skill must be preserved');
48
+ const second = await uninstallCommand(['--yes', '--home', home, '--keep-config', '--keep-data']);
49
+ assertGate(second.ok === true, 'uninstall must be idempotent', second);
50
+ emitGate('sks:uninstall-regression', { removed_steps: applied.removed.length, inventory: dry.inventory.length });
51
+ async function exists(file) {
52
+ return fs.stat(file).then(() => true, () => false);
53
+ }
54
+ //# sourceMappingURL=sks-uninstall-regression-check.js.map
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import './sks-uninstall-regression-check.js';
3
+ //# sourceMappingURL=uninstall-inventory-check.js.map
@@ -1,24 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  // @ts-nocheck
3
3
  import assert from 'node:assert/strict';
4
+ import fs from 'node:fs';
5
+ import os from 'node:os';
4
6
  import { spawnSync } from 'node:child_process';
5
7
  import path from 'node:path';
6
- const root = process.cwd();
7
- const result = spawnSync(process.execPath, [path.join(root, 'dist/bin/sks.js'), 'image-ux-review', 'fixture', '--mock', '--json'], {
8
+ const repoRoot = process.cwd();
9
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'sks-ux-review-real-loop-fixture-'));
10
+ const result = spawnSync(process.execPath, [path.join(repoRoot, 'dist/bin/sks.js'), 'image-ux-review', 'fixture', '--mock', '--json'], {
8
11
  cwd: root,
9
12
  encoding: 'utf8',
10
- env: { ...process.env, SKS_SKIP_NPM_FRESHNESS_CHECK: '1', CI: 'true' },
13
+ env: { ...process.env, SKS_SKIP_NPM_FRESHNESS_CHECK: '1', SKS_UPDATE_MIGRATION_GATE_DISABLED: '1', CI: 'true' },
11
14
  timeout: Number(process.env.SKS_UX_REVIEW_REAL_LOOP_FIXTURE_TIMEOUT_MS || 180_000)
12
15
  });
13
- assert.equal(result.status, 0, JSON.stringify({
16
+ assert.ok([0, 1].includes(result.status), JSON.stringify({
14
17
  stderr: result.stderr,
15
18
  stdout: result.stdout,
16
19
  signal: result.signal,
17
20
  error: result.error?.message || null
18
21
  }, null, 2));
19
22
  const json = JSON.parse(result.stdout);
23
+ assert.equal(json.ok, false);
20
24
  assert.equal(json.artifacts.gate.mock_fixture_cannot_claim_real, true);
21
25
  assert.equal(json.artifacts.generated_review_ledger.real_generated_count, 0);
22
26
  assert.equal(json.artifacts.generated_review_ledger.generated_count, 1);
27
+ assert.equal(json.proof.status, 'mock_only');
23
28
  console.log(JSON.stringify({ schema: 'sks.ux-review-real-loop-fixture.v1', ok: true, mission_id: json.mission_id }, null, 2));
24
29
  //# sourceMappingURL=ux-review-real-loop-fixture-check.js.map
@@ -3,7 +3,11 @@
3
3
  import { emitGate, requireContains } from './sks-1-12-real-execution-check-lib.js';
4
4
  requireContains('ux-review:run-wires-imagegen', 'src/core/commands/image-ux-review-command.ts', [
5
5
  'const shouldGenerateCallouts = flag(args, \'--generate-callouts\') || flag(args, \'--fix\')',
6
+ 'requireCodexImagegen',
6
7
  'generateGptImage2CalloutReview',
8
+ 'evidence_class',
9
+ 'output_sha256',
10
+ 'imagegen_response_non_codex_api_fallback_not_full_evidence',
7
11
  'extractRealCallouts',
8
12
  'buildImageUxCalloutExtractionReport'
9
13
  ]);
@@ -11,15 +11,21 @@ if (!freshness.ok)
11
11
  const layoutMod = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-layout-builder.js')).href);
12
12
  const capabilityMod = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-capability.js')).href);
13
13
  const commandMod = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-command.js')).href);
14
- const built = layoutMod.buildZellijLayoutKdl({ missionId: 'M-layout-check', ledgerRoot: path.join(root, '.sneakoscope', 'tmp', 'layout-check'), cwd: root, kind: 'agent', slotCount: 2 });
14
+ process.env.SKS_ZELLIJ_VIEWPORTS = '4';
15
+ const built = layoutMod.buildZellijLayoutKdl({ missionId: 'M-layout-check', ledgerRoot: path.join(root, '.sneakoscope', 'tmp', 'layout-check'), cwd: root, kind: 'mad', slotCount: 2, codexArgs: ['--profile', 'sks-mad-high', '-c', 'service_tier=fast'] });
15
16
  const staticValidation = layoutMod.validateZellijLayoutKdl(built.layout_kdl);
16
- const spawnOnDemandOk = built.initial_worker_panes === 0
17
+ const viewportLayoutOk = built.initial_worker_panes === 0
18
+ && built.viewport_count === 4
19
+ && built.ui_architecture === 'monitor_plus_viewports'
17
20
  && built.lane_runtime_policies.length === 0
18
21
  && built.layout_kdl.includes('pane name="orchestrator"')
22
+ && built.layout_kdl.includes('pane size="35%" name="sks-monitor"')
19
23
  && !built.layout_kdl.includes('zellij-lane')
20
- && !(built.layout_kdl.match(/pane name="slot-/g) || []).length
24
+ && !built.layout_kdl.includes('zellij-slot-pane')
25
+ && (built.layout_kdl.match(/pane name="sks-viewport-/g) || []).length === 4
21
26
  && built.lane_dispatch_policy?.mode === 'jsonl_nonblocking'
22
- && built.lane_dispatch_policy?.fifo_policy === 'disabled_to_avoid_writer_blocking';
27
+ && built.lane_dispatch_policy?.fifo_policy === 'disabled_to_avoid_writer_blocking'
28
+ && built.lane_dispatch_policy?.pane_transport === 'monitor_plus_viewports';
23
29
  const narutoFanoutLayout = layoutMod.buildZellijLayoutKdl({
24
30
  missionId: 'M-layout-naruto-fanout',
25
31
  ledgerRoot: path.join(root, '.sneakoscope', 'tmp', 'layout-naruto-fanout'),
@@ -27,7 +33,7 @@ const narutoFanoutLayout = layoutMod.buildZellijLayoutKdl({
27
33
  kind: 'naruto',
28
34
  slotCount: 24
29
35
  });
30
- const narutoFanoutPaneCount = (narutoFanoutLayout.layout_kdl.match(/pane name="slot-/g) || []).length;
36
+ const narutoFanoutPaneCount = (narutoFanoutLayout.layout_kdl.match(/pane name="sks-viewport-/g) || []).length;
31
37
  const kindsValidated = ['mad', 'agent', 'team', 'naruto'].map((kind) => {
32
38
  const b = layoutMod.buildZellijLayoutKdl({
33
39
  missionId: `M-layout-${kind}`,
@@ -38,8 +44,9 @@ const kindsValidated = ['mad', 'agent', 'team', 'naruto'].map((kind) => {
38
44
  codexArgs: kind === 'mad' ? ['--profile', 'sks-mad-high', '-c', 'service_tier=fast'] : []
39
45
  });
40
46
  const hasCodexPane = kind !== 'mad' || (b.main_pane_kind === 'codex_interactive' && /exec\s+'?codex'?/.test(b.layout_kdl) && b.layout_kdl.includes('sks-mad-high') && b.layout_kdl.includes('--no-alt-screen'));
41
- const noLanePane = !b.layout_kdl.includes('zellij-lane') && !(b.layout_kdl.match(/pane name="slot-/g) || []).length;
42
- return { kind, ok: layoutMod.validateZellijLayoutKdl(b.layout_kdl).ok && hasCodexPane && noLanePane && b.initial_worker_panes === 0, main_pane_kind: b.main_pane_kind, has_codex_pane: hasCodexPane, no_lane_pane: noLanePane };
47
+ const viewportPaneCount = (b.layout_kdl.match(/pane name="sks-viewport-/g) || []).length;
48
+ const noLanePane = !b.layout_kdl.includes('zellij-lane');
49
+ return { kind, ok: layoutMod.validateZellijLayoutKdl(b.layout_kdl).ok && hasCodexPane && noLanePane && viewportPaneCount === 4 && b.initial_worker_panes === 0 && b.viewport_count === 4, main_pane_kind: b.main_pane_kind, has_codex_pane: hasCodexPane, no_lane_pane: noLanePane, viewport_pane_count: viewportPaneCount };
43
50
  });
44
51
  const allKindsOk = kindsValidated.every((k) => k.ok);
45
52
  const invalidValidation = layoutMod.validateZellijLayoutKdl('layout { pane command="zellij-lane" {');
@@ -63,10 +70,10 @@ if (realRun) {
63
70
  realRun.ok = realRun.create_background.ok === true;
64
71
  }
65
72
  const ok = staticValidation.ok
66
- && spawnOnDemandOk
73
+ && viewportLayoutOk
67
74
  && allKindsOk
68
75
  && layoutMod.validateZellijLayoutKdl(narutoFanoutLayout.layout_kdl).ok
69
- && narutoFanoutPaneCount === 0
76
+ && narutoFanoutPaneCount === 4
70
77
  && invalidValidation.ok === false
71
78
  && capability.ok
72
79
  && (requireReal ? realRun?.ok === true : true);
@@ -74,9 +81,9 @@ emit({
74
81
  schema: 'sks.zellij-layout-valid-check.v1',
75
82
  ok,
76
83
  layout: { ...built, layout_kdl: undefined, layout_path: layoutPath },
77
- spawn_on_demand_ok: spawnOnDemandOk,
84
+ viewport_layout_ok: viewportLayoutOk,
78
85
  kinds_validated: kindsValidated,
79
- naruto_fanout_layout: { slot_count: narutoFanoutLayout.slot_count, pane_count: narutoFanoutPaneCount, initial_worker_panes: narutoFanoutLayout.initial_worker_panes },
86
+ naruto_fanout_layout: { viewport_count: narutoFanoutLayout.viewport_count, pane_count: narutoFanoutPaneCount, initial_worker_panes: narutoFanoutLayout.initial_worker_panes },
80
87
  static_validation: staticValidation,
81
88
  invalid_fixture: invalidValidation,
82
89
  capability,
@@ -1,9 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  // @ts-nocheck
3
- import os from 'node:os';
4
3
  import path from 'node:path';
5
4
  import { assertGate, emitGate } from './sks-1-18-gate-lib.js';
6
- import { writeTextAtomic } from '../core/fsx.js';
5
+ import { tmpdir, writeTextAtomic } from '../core/fsx.js';
7
6
  import { checkZellijCapability } from '../core/zellij/zellij-capability.js';
8
7
  import { runZellij } from '../core/zellij/zellij-command.js';
9
8
  const requireReal = process.argv.includes('--require-real') || process.env.SKS_REQUIRE_ZELLIJ === '1';
@@ -153,8 +152,7 @@ function buildRealGeometryLayout(cwd) {
153
152
  ].join('\n');
154
153
  }
155
154
  async function fsTempDir() {
156
- const fs = await import('node:fs/promises');
157
- return fs.mkdtemp(path.join(os.tmpdir(), 'sks-zellij-geometry-'));
155
+ return tmpdir('sks-zellij-geometry-');
158
156
  }
159
157
  function sleep(ms) {
160
158
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -131,21 +131,21 @@ const command = renderer.buildZellijSlotPaneCommand({
131
131
  const report = {
132
132
  schema: 'sks.zellij-slot-pane-renderer-check.v1',
133
133
  line_count: lines.length,
134
- max_compact_lines: 17,
135
- contains_slot: /LIVE SLOT slot-003/.test(text) && /slot: slot-003 \/ gen-2/.test(text),
134
+ max_compact_lines: 14,
135
+ contains_slot: /┌─ slot-003/.test(text) && /slot-003/.test(text),
136
136
  contains_status: /coding/.test(text),
137
- contains_runtime: /runtime: fast on/.test(text) && /model: gpt-5\.5/.test(text) && /provider: codex-lb/.test(text),
138
- contains_files: /src\/core\/foo\.ts/.test(text) && /src\/core\/bar\.ts/.test(text),
139
- contains_live_event: /event: running:/.test(text),
140
- artifact_hydrates_runtime: /runtime: fast on/.test(hydrated) && /model: gpt-5\.5/.test(hydrated) && /reasoning: medium/.test(hydrated) && /auth: codex_lb_key/.test(hydrated),
141
- artifact_hydrates_live_event: /tool apply_patch/.test(hydrated) && /renderer stdout tail/.test(hydrated),
137
+ contains_runtime: /gpt-5\.5·fast/.test(text),
138
+ contains_files: /src\/core\/foo\.ts/.test(text),
139
+ contains_live_event: /renderer updated live pane output/.test(text),
140
+ artifact_hydrates_runtime: /gpt-5\.5·fast/.test(hydrated),
141
+ artifact_hydrates_live_event: /renderer stdout tail/.test(hydrated),
142
142
  artifact_hydrates_planned_file: /zellij-slot-pane-renderer\.ts/.test(hydrated),
143
- mission_stale_hydrates_artifact_fallback: /telemetry stale; worker may still be running/.test(missionHydrated) && (/renderer stdout tail/.test(missionHydrated) || /tool apply_patch/.test(missionHydrated)),
143
+ mission_live_telemetry_wins: /mission telemetry stale fixture/.test(missionHydrated) && /renderer stdout tail/.test(missionHydrated),
144
144
  command_uses_slot_pane: command.includes('zellij-slot-pane') && command.includes('--watch'),
145
145
  snapshot: text,
146
146
  hydrated_snapshot: hydrated,
147
147
  mission_hydrated_snapshot: missionHydrated
148
148
  };
149
- assertGate(lines.length <= 17 && report.contains_slot && report.contains_status && report.contains_runtime && report.contains_files && report.contains_live_event && report.artifact_hydrates_runtime && report.artifact_hydrates_live_event && report.artifact_hydrates_planned_file && report.mission_stale_hydrates_artifact_fallback && report.command_uses_slot_pane, 'compact slot pane renderer must render one live work pane per slot', report);
149
+ assertGate(lines.length <= 14 && report.contains_slot && report.contains_status && report.contains_runtime && report.contains_files && report.contains_live_event && report.artifact_hydrates_runtime && report.artifact_hydrates_live_event && report.artifact_hydrates_planned_file && report.mission_live_telemetry_wins && report.command_uses_slot_pane, 'compact slot pane renderer must render one live work pane per slot', report);
150
150
  emitGate('zellij:compact-slot-renderer', report);
151
151
  //# sourceMappingURL=zellij-slot-pane-renderer-check.js.map
@@ -56,19 +56,18 @@ snapshot.updated_at = new Date(Date.now() - 3500).toISOString();
56
56
  await fs.writeFile(file, `${JSON.stringify(snapshot)}\n`, 'utf8');
57
57
  const freshStatus = await renderZellijSlotPaneStatusFromArtifacts({ artifactDir, artifactRoot: root, missionId, slotId: 'slot-001', generationIndex: 1 });
58
58
  assertGate(freshStatus.telemetry_stale === false, 'slot pane status JSON must treat 3.5s-old telemetry as fresh under new 15s threshold', freshStatus);
59
- // Between 15s and 60s the pane shows the numeric "telemetry stale Ns" warning row.
59
+ // Between 15s and 60s the status JSON marks staleness; the pane keeps showing live telemetry
60
+ // merged with fresh artifact/log detail instead of replacing it with stale-only prose.
60
61
  snapshot.updated_at = new Date(Date.now() - 16000).toISOString();
61
62
  await fs.writeFile(file, `${JSON.stringify(snapshot)}\n`, 'utf8');
62
63
  const staleText = await renderZellijSlotPaneFromArtifacts({ artifactDir, artifactRoot: root, missionId, slotId: 'slot-001', generationIndex: 1 });
63
64
  const staleStatus = await renderZellijSlotPaneStatusFromArtifacts({ artifactDir, artifactRoot: root, missionId, slotId: 'slot-001', generationIndex: 1 });
64
- assertGate(/telemetry stale 1[0-9]\.\d+s/.test(staleText), 'slot pane must show numeric stale telemetry warning above 15s', { staleText, staleStatus });
65
65
  assertGate(staleStatus.telemetry_stale === true && staleStatus.telemetry_age_ms >= 15000, 'slot pane status JSON must expose stale telemetry above 15s', staleStatus);
66
66
  assertGate(staleText.includes('fresh worker stdout fallback') || staleText.includes('apply_patch'), 'stale slot pane must show fresh artifact/log fallback', { staleText });
67
- // Past 60s the pane shows the "worker may still be running" blocker line.
67
+ // Past 60s the status JSON remains stale and the watch loop owns zombie closure.
68
68
  snapshot.updated_at = new Date(Date.now() - 61000).toISOString();
69
69
  await fs.writeFile(file, `${JSON.stringify(snapshot)}\n`, 'utf8');
70
70
  const blockedText = await renderZellijSlotPaneFromArtifacts({ artifactDir, artifactRoot: root, missionId, slotId: 'slot-001', generationIndex: 1 });
71
- assertGate(blockedText.includes('telemetry stale; worker may still be running'), 'slot pane must show >60s stale blocker line', { blockedText });
72
71
  assertGate(blockedText.includes('fresh worker stdout fallback') || blockedText.includes('apply_patch'), 'blocked stale slot pane must keep artifact/log fallback', { blockedText });
73
72
  emitGate('zellij:slot-pane-stale-detection', { stale_age_ms: staleStatus.telemetry_age_ms, artifact_fallback: true });
74
73
  //# sourceMappingURL=zellij-slot-pane-stale-detection-check.js.map
@@ -3,9 +3,10 @@ import { assertGate, emitGate, readText } from './sks-1-18-gate-lib.js';
3
3
  const pane = readText('src/core/zellij/zellij-slot-pane-renderer.ts');
4
4
  const command = readText('src/commands/zellij-slot-pane.ts');
5
5
  assertGate(pane.includes('readZellijSlotTelemetrySnapshot'), 'slot pane renderer must read telemetry snapshots');
6
- assertGate(pane.includes('waiting for telemetry'), 'slot pane renderer must show waiting fallback before telemetry arrives');
7
- assertGate(pane.includes('artifactFallbackRows') && pane.includes('renderZellijSlotPaneFromArtifactDir'), 'slot pane renderer must preserve artifact/log fallback when telemetry is stale');
6
+ assertGate(pane.includes('mergeRenderInputWithLiveTelemetry'), 'slot pane renderer must prefer live telemetry over artifact detail');
7
+ assertGate(pane.includes('renderInputFromArtifactDir') && pane.includes('stdoutTail'), 'slot pane renderer must preserve artifact/log fallback details');
8
8
  assertGate(pane.includes('latest_heartbeat') || pane.includes('heartbeat'), 'slot pane renderer must surface heartbeat/progress state');
9
9
  assertGate(command.includes('artifactRoot') && command.includes('--artifact-root'), 'slot pane command must pass artifact root for telemetry lookup');
10
+ assertGate(command.includes('staleTicks') && command.includes('worker heartbeat lost >5m'), 'slot pane command must close zombie panes instead of freezing');
10
11
  emitGate('zellij:slot-pane-telemetry-renderer', { telemetry_with_artifact_fallback: true });
11
12
  //# sourceMappingURL=zellij-slot-pane-telemetry-renderer-check.js.map
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { assertGate, emitGate, readText } from './sks-1-18-gate-lib.js';
3
3
  const pane = readText('src/core/zellij/zellij-slot-pane-renderer.ts');
4
+ const command = readText('src/commands/zellij-slot-pane.ts');
4
5
  const anchor = readText('src/core/zellij/zellij-slot-column-anchor.ts');
5
- assertGate(pane.includes('readZellijSlotTelemetrySnapshot') && pane.includes('waiting for telemetry'), 'slot pane must render from telemetry snapshot with waiting fallback');
6
- assertGate(pane.includes('artifactFallbackRows') && pane.includes('renderZellijSlotPaneFromArtifactDir'), 'slot pane must merge telemetry with artifact/log fallback instead of stale-only output');
6
+ assertGate(pane.includes('readZellijSlotTelemetrySnapshot') && pane.includes('mergeRenderInputWithLiveTelemetry'), 'slot pane must read telemetry first and merge it with artifact detail');
7
+ assertGate(pane.includes('renderInputFromArtifactDir') && pane.includes('stdoutTail'), 'slot pane must preserve artifact/log fallback while live telemetry wins');
8
+ assertGate(command.includes('staleTicks') && command.includes('worker heartbeat lost >5m'), 'slot pane watch loop must close frozen heartbeat panes');
7
9
  assertGate(anchor.includes('readZellijSlotTelemetrySnapshot') && anchor.includes('SLOTS telemetry stale'), 'slot anchor must render telemetry snapshot and stale state');
8
10
  assertGate(anchor.includes('update-notice.json') && anchor.includes('MAD-DB ACTIVE'), 'anchor must surface update notice and Mad-DB state');
9
11
  emitGate('zellij:slot-telemetry-renderer', { telemetry_with_artifact_fallback: true });
@@ -5,16 +5,21 @@ import { packageRoot } from '../core/fsx.js';
5
5
  import { buildZellijLayoutKdl, validateZellijLayoutKdl, writeZellijLayout } from '../core/zellij/zellij-layout-builder.js';
6
6
  const root = packageRoot();
7
7
  const tmpRoot = path.join(root, '.sneakoscope', 'tmp', 'spawn-on-demand-layout-check');
8
+ process.env.SKS_ZELLIJ_VIEWPORTS = '4';
8
9
  const built = buildZellijLayoutKdl({ missionId: 'M-spawn-on-demand-layout', ledgerRoot: tmpRoot, cwd: root, kind: 'naruto', slotCount: 24 });
9
10
  const validation = validateZellijLayoutKdl(built.layout_kdl);
10
11
  const writeBuilt = await writeZellijLayout(root, { missionId: 'M-spawn-on-demand-layout-write', ledgerRoot: tmpRoot, cwd: root, kind: 'agent', slotCount: 5 });
11
12
  const manifest = JSON.parse(await fs.readFile(path.join(tmpRoot, 'zellij-lane-runtime.json'), 'utf8'));
12
13
  const workerPaneMatches = built.layout_kdl.match(/pane name="slot-/g) || [];
14
+ const viewportPaneMatches = built.layout_kdl.match(/pane name="sks-viewport-/g) || [];
13
15
  const laneCommandMatches = built.layout_kdl.match(/\bzellij-lane\b/g) || [];
14
16
  const ok = validation.ok
15
17
  && built.initial_worker_panes === 0
18
+ && built.viewport_count === 4
19
+ && built.ui_architecture === 'monitor_plus_viewports'
16
20
  && built.lane_runtime_policies.length === 0
17
21
  && workerPaneMatches.length === 0
22
+ && viewportPaneMatches.length === 4
18
23
  && laneCommandMatches.length === 0
19
24
  && manifest.lanes.length === 0
20
25
  && writeBuilt.initial_worker_panes === 0;
@@ -22,15 +27,16 @@ emit({
22
27
  schema: 'sks.zellij-spawn-on-demand-layout-check.v1',
23
28
  ok,
24
29
  initial_worker_panes: built.initial_worker_panes,
25
- slot_count_request: built.slot_count,
30
+ viewport_count: built.viewport_count,
26
31
  lane_runtime_policy_count: built.lane_runtime_policies.length,
27
32
  worker_pane_matches: workerPaneMatches.length,
33
+ viewport_pane_matches: viewportPaneMatches.length,
28
34
  lane_command_matches: laneCommandMatches.length,
29
35
  monitor_pane_enabled: built.monitor_pane_enabled,
30
36
  validation,
31
37
  manifest_lane_count: manifest.lanes.length,
32
38
  layout_path: writeBuilt.layout_path,
33
- blockers: ok ? [] : ['zellij_spawn_on_demand_layout_contract_failed']
39
+ blockers: ok ? [] : ['zellij_dynamic_viewport_layout_contract_failed']
34
40
  });
35
41
  function emit(report) {
36
42
  console.log(JSON.stringify(report, null, 2));
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import '../core/zellij/__tests__/zellij-viewport-binder.test.js';
3
+ console.log(JSON.stringify({
4
+ schema: 'sks.zellij-viewport-binder-check.v1',
5
+ ok: true,
6
+ cases: ['pins', 'hysteresis', 'rebinding', 'idle', 'recent_failed_priority'],
7
+ blockers: []
8
+ }, null, 2));
9
+ //# sourceMappingURL=zellij-viewport-binder-check.js.map
package/docs/demo.tape ADDED
@@ -0,0 +1,28 @@
1
+ Output docs/assets/sks-v5-demo.gif
2
+ Set Shell "zsh"
3
+ Set FontSize 16
4
+ Set Width 1280
5
+ Set Height 720
6
+ Set TypingSpeed 20ms
7
+
8
+ Type "npx sneakoscope install --yes"
9
+ Sleep 500ms
10
+ Enter
11
+ Sleep 1s
12
+ Ctrl+C
13
+
14
+ Type "sks plan \"ship a proof-first review flow\""
15
+ Enter
16
+ Sleep 1s
17
+
18
+ Type "sks review --staged"
19
+ Enter
20
+ Sleep 1s
21
+
22
+ Type "sks ui --once"
23
+ Enter
24
+ Sleep 1s
25
+
26
+ Type "sks naruto run \"demo no-op swarm\" --backend fake --clones 4 --work-items 4 --no-open-zellij --json"
27
+ Enter
28
+ Sleep 2s