sneakoscope 6.0.3 → 6.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 (378) hide show
  1. package/README.md +29 -12
  2. package/config/codex-releases/{rust-v0.142.0.json → rust-v0.144.1.json} +6 -6
  3. package/crates/sks-core/Cargo.lock +1 -1
  4. package/crates/sks-core/Cargo.toml +1 -1
  5. package/dist/bin/fast-inline.js +18 -14
  6. package/dist/bin/sks-dispatch.js +2 -4
  7. package/dist/cli/args.js +2 -0
  8. package/dist/cli/command-manifest-lite.js +2 -3
  9. package/dist/cli/command-registry.js +3 -4
  10. package/dist/cli/help-fast.js +1 -1
  11. package/dist/cli/install-helpers.js +348 -763
  12. package/dist/cli/install-tool-helpers.js +287 -0
  13. package/dist/cli/router.js +91 -6
  14. package/dist/commands/codex-lb.js +188 -53
  15. package/dist/commands/codex.js +44 -5
  16. package/dist/commands/doctor.js +302 -46
  17. package/dist/commands/tmux.js +5 -1
  18. package/dist/commands/versioning.js +7 -0
  19. package/dist/commands/zellij-monitor-pane.js +2 -0
  20. package/dist/commands/zellij-viewport-pane.js +3 -1
  21. package/dist/commands/zellij.js +1 -1
  22. package/dist/config/skills-manifest.json +59 -59
  23. package/dist/core/agent-bridge/agent-manifest.js +48 -0
  24. package/dist/core/agents/agent-central-ledger.js +9 -0
  25. package/dist/core/agents/agent-cleanup-executor.js +334 -41
  26. package/dist/core/agents/agent-cleanup.js +20 -1
  27. package/dist/core/agents/agent-command-surface.js +3 -1
  28. package/dist/core/agents/agent-effort-policy.js +30 -38
  29. package/dist/core/agents/agent-janitor.js +9 -10
  30. package/dist/core/agents/agent-namespace-safety.js +56 -0
  31. package/dist/core/agents/agent-orchestrator.js +25 -3
  32. package/dist/core/agents/agent-output-validator.js +1 -1
  33. package/dist/core/agents/agent-plan.js +100 -21
  34. package/dist/core/agents/agent-role-config.js +43 -49
  35. package/dist/core/agents/agent-runner-codex-exec.js +18 -3
  36. package/dist/core/agents/agent-runner-process.js +1 -0
  37. package/dist/core/agents/agent-schema.js +3 -2
  38. package/dist/core/agents/fast-mode-policy.js +3 -5
  39. package/dist/core/agents/native-cli-session-swarm.js +1 -1
  40. package/dist/core/agents/native-worker-backend-router.js +2 -1
  41. package/dist/core/agents/work-partition/repo-inventory.js +68 -7
  42. package/dist/core/agents/zellij-right-lane-cockpit.js +2 -2
  43. package/dist/core/code-structure.js +5 -4
  44. package/dist/core/codex/agent-config-file-repair.js +94 -193
  45. package/dist/core/codex/codex-cli-update.js +723 -0
  46. package/dist/core/codex/codex-config-guard.js +38 -11
  47. package/dist/core/codex/codex-project-config-policy.js +3 -6
  48. package/dist/core/codex/codex-startup-config-postcheck.js +52 -42
  49. package/dist/core/codex-adapter.js +35 -22
  50. package/dist/core/codex-app/codex-agent-role-sync.js +13 -54
  51. package/dist/core/codex-app/codex-app-fast-ui-repair.js +51 -20
  52. package/dist/core/codex-app/codex-app-launcher.js +48 -17
  53. package/dist/core/codex-app/codex-app-restart.js +23 -2
  54. package/dist/core/codex-app/codex-app-ui-state-snapshot.js +11 -3
  55. package/dist/core/codex-app/sks-menubar.js +136 -5
  56. package/dist/core/codex-app.js +35 -14
  57. package/dist/core/codex-compat/codex-hook-warning-detector.js +10 -1
  58. package/dist/core/codex-compat/codex-release-manifest.js +6 -6
  59. package/dist/core/codex-control/codex-0139-doctor-real-probe.js +7 -1
  60. package/dist/core/codex-control/codex-0139-image-path-real-probe.js +29 -12
  61. package/dist/core/codex-control/codex-0139-probe-runner.js +103 -28
  62. package/dist/core/codex-control/codex-0139-real-probe-summary.js +7 -3
  63. package/dist/core/codex-control/codex-0139-real-probes.js +21 -6
  64. package/dist/core/codex-control/codex-0139-sandbox-real-probe.js +39 -13
  65. package/dist/core/codex-control/codex-0139-web-search-probe.js +28 -14
  66. package/dist/core/codex-control/{codex-0142-capability.js → codex-0144-capability.js} +22 -22
  67. package/dist/core/codex-control/codex-0144-collab-agent-real-probe.js +63 -0
  68. package/dist/core/codex-control/codex-lb-launch-recovery.js +278 -0
  69. package/dist/core/codex-control/codex-multi-agent-event-normalizer.js +5 -1
  70. package/dist/core/codex-control/codex-reliability-shield.js +93 -30
  71. package/dist/core/codex-control/codex-sdk-adapter.js +96 -13
  72. package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
  73. package/dist/core/codex-control/codex-sdk-sandbox-policy.js +6 -3
  74. package/dist/core/codex-control/codex-task-runner.js +62 -9
  75. package/dist/core/codex-control/python-codex-sdk-adapter.js +30 -3
  76. package/dist/core/codex-exec-output-schema.js +35 -6
  77. package/dist/core/codex-lb/codex-lb-env.js +30 -1
  78. package/dist/core/codex-lb/codex-lb-tool-catalog.js +478 -0
  79. package/dist/core/codex-lb/codex-lb-tool-output-recovery.js +291 -0
  80. package/dist/core/codex-native/codex-native-feature-broker.js +31 -38
  81. package/dist/core/codex-native/codex-native-feature-matrix.js +2 -2
  82. package/dist/core/codex-native/codex-native-repair-transaction.js +1 -1
  83. package/dist/core/codex-native/core-skill-manifest.js +8 -4
  84. package/dist/core/codex-native/native-capability-postcheck.js +16 -8
  85. package/dist/core/codex-native/native-capability-repair-matrix.js +76 -27
  86. package/dist/core/codex-plugins/codex-plugin-json.js +67 -21
  87. package/dist/core/codex-plugins/codex-plugin-repair.js +118 -0
  88. package/dist/core/codex-runtime/codex-desktop-config-policy.js +305 -0
  89. package/dist/core/commands/agent-bridge-command.js +23 -2
  90. package/dist/core/commands/agent-command.js +38 -5
  91. package/dist/core/commands/basic-cli.js +77 -30
  92. package/dist/core/commands/command-utils.js +1 -1
  93. package/dist/core/commands/gc-command.js +27 -4
  94. package/dist/core/commands/image-ux-review-command.js +55 -24
  95. package/dist/core/commands/mad-sks-command.js +182 -137
  96. package/dist/core/commands/naruto-command.js +643 -1153
  97. package/dist/core/commands/pipeline-command.js +1 -0
  98. package/dist/core/commands/research-command.js +293 -231
  99. package/dist/core/commands/run-command.js +100 -23
  100. package/dist/core/commands/team-command.js +2 -3
  101. package/dist/core/commands/team-legacy-observe-command.js +94 -359
  102. package/dist/core/commands/wiki-command.js +179 -83
  103. package/dist/core/computer-use-live-evidence.js +166 -3
  104. package/dist/core/computer-use-status.js +5 -2
  105. package/dist/core/daemon/sksd-hook-daemon-entrypoint.js +2 -2
  106. package/dist/core/daemon/sksd-hook-daemon.js +171 -28
  107. package/dist/core/daemon/sksd-hook-dispatch.js +2 -2
  108. package/dist/core/db-safety.js +2 -2
  109. package/dist/core/decision-lattice.js +6 -6
  110. package/dist/core/dfix/verification-selector.js +6 -4
  111. package/dist/core/doctor/browser-use-repair.js +54 -13
  112. package/dist/core/doctor/codex-0139-doctor.js +3 -2
  113. package/dist/core/doctor/codex-startup-config-repair.js +8 -3
  114. package/dist/core/doctor/computer-use-repair.js +28 -39
  115. package/dist/core/doctor/doctor-codex-startup-repair.js +24 -149
  116. package/dist/core/doctor/doctor-context7-repair.js +1 -1
  117. package/dist/core/doctor/doctor-dirty-planner.js +1 -1
  118. package/dist/core/doctor/doctor-native-capability-repair.js +74 -3
  119. package/dist/core/doctor/imagegen-repair.js +47 -12
  120. package/dist/core/doctor/legacy-global-hook-cleanup.js +179 -0
  121. package/dist/core/feature-fixture-executor.js +71 -7
  122. package/dist/core/feature-fixture-runner.js +53 -12
  123. package/dist/core/feature-fixtures.js +47 -14
  124. package/dist/core/feature-registry.js +53 -58
  125. package/dist/core/fsx.js +54 -6
  126. package/dist/core/harness-conflicts.js +19 -10
  127. package/dist/core/hooks-runtime/code-pack-freshness-preflight.js +5 -4
  128. package/dist/core/hooks-runtime/hook-invocation-dedupe.js +147 -0
  129. package/dist/core/hooks-runtime/hook-io.js +14 -4
  130. package/dist/core/hooks-runtime/light-turn.js +70 -0
  131. package/dist/core/hooks-runtime/payload-signals.js +270 -0
  132. package/dist/core/hooks-runtime/team-digest.js +0 -1
  133. package/dist/core/hooks-runtime/tool-output-quarantine.js +93 -0
  134. package/dist/core/hooks-runtime.js +418 -250
  135. package/dist/core/image/image-artifact-path-contract.js +8 -6
  136. package/dist/core/image/image-artifact-registry.js +5 -1
  137. package/dist/core/image-ux-review/imagegen-adapter.js +5 -2
  138. package/dist/core/imagegen/imagegen-capability.js +10 -13
  139. package/dist/core/imagegen/require-imagegen.js +37 -11
  140. package/dist/core/init/skills.js +16 -30
  141. package/dist/core/init.js +144 -36
  142. package/dist/core/managed-assets/managed-assets-manifest.js +417 -14
  143. package/dist/core/mission.js +24 -1
  144. package/dist/core/naruto/naruto-work-graph.js +70 -4
  145. package/dist/core/ops/reporting.js +3 -0
  146. package/dist/core/pipeline-internals/runtime-core.js +578 -180
  147. package/dist/core/pipeline-internals/runtime-gates.js +191 -49
  148. package/dist/core/ppt/style-tokens.js +1 -1
  149. package/dist/core/ppt-review/index.js +1 -1
  150. package/dist/core/ppt-review/slide-exporter.js +23 -17
  151. package/dist/core/ppt-review/slide-imagegen-review.js +1 -1
  152. package/dist/core/ppt-review/slide-issue-extraction.js +4 -2
  153. package/dist/core/preflight/parallel-preflight-engine.js +50 -1
  154. package/dist/core/product-design-plugin.js +2 -2
  155. package/dist/core/proof/route-finalizer.js +1 -1
  156. package/dist/core/proof/route-proof-gate.js +7 -2
  157. package/dist/core/proof-field.js +3 -3
  158. package/dist/core/provider/model-router.js +38 -32
  159. package/dist/core/recallpulse/policy.js +12 -28
  160. package/dist/core/recallpulse.js +11 -6
  161. package/dist/core/release/gate-manifest.js +18 -12
  162. package/dist/core/release/gate-pack-manifest.js +1 -1
  163. package/dist/core/release/npm-pack-proof.js +247 -0
  164. package/dist/core/release/package-dist-snapshot.js +151 -0
  165. package/dist/core/release/package-size-budget.js +5 -0
  166. package/dist/core/release/release-authorization-snapshot.js +115 -0
  167. package/dist/core/release/release-gate-affected-selector.js +15 -3
  168. package/dist/core/release/release-gate-cache-v2.js +30 -0
  169. package/dist/core/release/release-gate-contract.js +161 -0
  170. package/dist/core/release/release-gate-dag.js +44 -3
  171. package/dist/core/release/release-gate-hermetic-env.js +28 -17
  172. package/dist/core/release/release-real-contract.js +496 -0
  173. package/dist/core/release-parallel-full-coverage.js +31 -143
  174. package/dist/core/research/claim-evidence-matrix.js +41 -6
  175. package/dist/core/research/experiment-plan.js +14 -10
  176. package/dist/core/research/falsification.js +9 -2
  177. package/dist/core/research/implementation-blueprint-densifier.js +82 -60
  178. package/dist/core/research/implementation-blueprint.js +32 -26
  179. package/dist/core/research/mock-result.js +122 -11
  180. package/dist/core/research/replication-pack.js +15 -8
  181. package/dist/core/research/research-adversarial-review.js +1068 -0
  182. package/dist/core/research/research-claim-builder.js +69 -17
  183. package/dist/core/research/research-claim-synthesizer.js +343 -0
  184. package/dist/core/research/research-cycle-runner.js +53 -3
  185. package/dist/core/research/research-falsification-runner.js +176 -0
  186. package/dist/core/research/research-final-reviewer.js +44 -125
  187. package/dist/core/research/research-realistic-report.js +14 -6
  188. package/dist/core/research/research-review-artifact-digest.js +66 -0
  189. package/dist/core/research/research-source-evidence.js +144 -0
  190. package/dist/core/research/research-source-layer-catalog.js +68 -0
  191. package/dist/core/research/research-source-ledger-merge.js +250 -12
  192. package/dist/core/research/research-source-shards.js +26 -70
  193. package/dist/core/research/research-stage-runner.js +237 -247
  194. package/dist/core/research/research-super-search.js +184 -0
  195. package/dist/core/research/research-synthesis-prompt.js +20 -1
  196. package/dist/core/research/research-synthesis-writer.js +86 -5
  197. package/dist/core/research/research-work-graph.js +25 -18
  198. package/dist/core/research/source-quality-report.js +21 -0
  199. package/dist/core/research.js +429 -280
  200. package/dist/core/retention/retention-budget.js +25 -6
  201. package/dist/core/retention.js +980 -101
  202. package/dist/core/routes/constants.js +1 -1
  203. package/dist/core/routes/dollar-manifest-lite.js +11 -11
  204. package/dist/core/routes/evidence.js +4 -4
  205. package/dist/core/routes/ppt-policy.js +1 -1
  206. package/dist/core/routes.js +92 -64
  207. package/dist/core/runtime/task-profile.js +66 -0
  208. package/dist/core/runtime/verification-budget.js +12 -0
  209. package/dist/core/secret-redaction.js +4 -0
  210. package/dist/core/security/high-risk-contracts.js +6 -6
  211. package/dist/core/stop-gate/stop-gate-check.js +49 -12
  212. package/dist/core/subagents/agent-catalog.js +215 -0
  213. package/dist/core/subagents/model-policy.js +118 -0
  214. package/dist/core/subagents/naruto-help-contract.js +40 -0
  215. package/dist/core/subagents/official-subagent-config.js +488 -0
  216. package/dist/core/subagents/official-subagent-preparation.js +251 -0
  217. package/dist/core/subagents/official-subagent-prompt.js +137 -0
  218. package/dist/core/subagents/official-subagent-runner.js +129 -0
  219. package/dist/core/subagents/subagent-evidence.js +663 -0
  220. package/dist/core/subagents/terminology.js +16 -0
  221. package/dist/core/subagents/thread-budget.js +21 -0
  222. package/dist/core/subagents/triwiki-attention.js +65 -0
  223. package/dist/core/super-search/runtime-helpers.js +173 -19
  224. package/dist/core/super-search/runtime.js +140 -15
  225. package/dist/core/super-search/source-records.js +49 -8
  226. package/dist/core/team-review-policy.js +15 -0
  227. package/dist/core/triwiki/code-pack.js +8 -2
  228. package/dist/core/triwiki/triwiki-cache-key.js +108 -29
  229. package/dist/core/triwiki/triwiki-module-card.js +1 -1
  230. package/dist/core/triwiki-attention.js +13 -6
  231. package/dist/core/triwiki-provenance.js +274 -0
  232. package/dist/core/triwiki-runtime.js +21 -7
  233. package/dist/core/triwiki-wrongness/wrongness-ledger.js +187 -61
  234. package/dist/core/triwiki-wrongness/wrongness-retrieval.js +11 -2
  235. package/dist/core/triwiki-wrongness/wrongness-trust-policy.js +2 -0
  236. package/dist/core/update-check.js +23 -15
  237. package/dist/core/version-manager.js +51 -1
  238. package/dist/core/version.js +1 -1
  239. package/dist/core/wiki-coordinate.js +128 -12
  240. package/dist/core/work-order-ledger.js +208 -10
  241. package/dist/core/zellij/zellij-command.js +12 -1
  242. package/dist/core/zellij/zellij-dashboard-pane.js +3 -3
  243. package/dist/core/zellij/zellij-fake-adapter.js +3 -1
  244. package/dist/core/zellij/zellij-launcher.js +51 -21
  245. package/dist/core/zellij/zellij-layout-builder.js +14 -5
  246. package/dist/core/zellij/zellij-official-subagent-activity.js +477 -0
  247. package/dist/core/zellij/zellij-official-subagent-telemetry.js +264 -0
  248. package/dist/core/zellij/zellij-pane-proof.js +32 -6
  249. package/dist/core/zellij/zellij-slot-pane-renderer.js +17 -5
  250. package/dist/core/zellij/zellij-slot-telemetry.js +15 -3
  251. package/dist/core/zellij/zellij-ui-mode.js +1 -1
  252. package/dist/core/zellij/zellij-viewport-binder.js +3 -0
  253. package/dist/core/zellij/zellij-worker-pane-manager.js +5 -3
  254. package/dist/scripts/agent-fast-mode-default-check.js +48 -29
  255. package/dist/scripts/agent-role-config-repair-check.js +34 -15
  256. package/dist/scripts/agent-wiki-context-proof-check.js +16 -2
  257. package/dist/scripts/all-feature-deep-completion-check.js +14 -4
  258. package/dist/scripts/architecture-guard-check.js +8 -1
  259. package/dist/scripts/build-dist.js +17 -5
  260. package/dist/scripts/canonical-test-runner.js +188 -0
  261. package/dist/scripts/check-command-module-budget.js +38 -16
  262. package/dist/scripts/check-legacy-free.js +1 -1
  263. package/dist/scripts/check-route-modularity.js +0 -1
  264. package/dist/scripts/check-ts-contracts.js +1 -1
  265. package/dist/scripts/codex-0139-interrupt-agent-check.js +5 -1
  266. package/dist/scripts/{codex-0142-app-server-v2-check.js → codex-0144-app-server-v2-check.js} +11 -10
  267. package/dist/scripts/{codex-0142-binary-identity-check.js → codex-0144-binary-identity-check.js} +4 -4
  268. package/dist/scripts/codex-0144-capability-check.js +21 -0
  269. package/dist/scripts/{codex-0139-real-probes-check.js → codex-0144-core-real-probes-check.js} +19 -5
  270. package/dist/scripts/{codex-0142-doctor-wiring-check.js → codex-0144-doctor-wiring-check.js} +6 -6
  271. package/dist/scripts/{codex-0142-manifest-check.js → codex-0144-manifest-check.js} +11 -3
  272. package/dist/scripts/{codex-0142-policy-check.js → codex-0144-policy-check.js} +2 -2
  273. package/dist/scripts/{codex-0142-thread-store-check.js → codex-0144-thread-store-check.js} +3 -3
  274. package/dist/scripts/codex-app-provider-model-ui-check.js +53 -19
  275. package/dist/scripts/codex-app-ui-preservation-check.js +35 -4
  276. package/dist/scripts/codex-control-all-pipelines-check.js +7 -3
  277. package/dist/scripts/codex-control-side-effect-scope-check.js +2 -2
  278. package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +27 -0
  279. package/dist/scripts/codex-effort-auto-discovery-check.js +1 -1
  280. package/dist/scripts/codex-lb-fast-mode-truth-check.js +1 -0
  281. package/dist/scripts/{codex-lb-gpt55-fast-profile-check.js → codex-lb-gpt56-fast-profile-check.js} +56 -5
  282. package/dist/scripts/codex-model-metadata-check.js +1 -1
  283. package/dist/scripts/codex-native-agent-role-content-check.js +15 -7
  284. package/dist/scripts/codex-native-repair-transaction-check.js +3 -1
  285. package/dist/scripts/codex-sdk-all-pipelines-check.js +7 -4
  286. package/dist/scripts/codex-sdk-research-pipeline-check.js +30 -8
  287. package/dist/scripts/codex-sdk-sandbox-policy-check.js +5 -1
  288. package/dist/scripts/codex-sdk-version-compat-check.js +2 -1
  289. package/dist/scripts/db-route-materialization-check.js +33 -0
  290. package/dist/scripts/dfix-fixture-check.js +1 -1
  291. package/dist/scripts/docs-truthfulness-check.js +4 -2
  292. package/dist/scripts/doctor-codex-startup-repair-check.js +47 -25
  293. package/dist/scripts/doctor-context7-repair-check.js +2 -1
  294. package/dist/scripts/doctor-fix-production-blackbox.js +12 -2
  295. package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +34 -7
  296. package/dist/scripts/doctor-imagegen-repair-check.js +14 -4
  297. package/dist/scripts/doctor-startup-config-repair-blackbox.js +9 -3
  298. package/dist/scripts/doctor-startup-config-repair-check.js +13 -3
  299. package/dist/scripts/install-update-preserves-config-check.js +7 -2
  300. package/dist/scripts/legacy-gate-inventory-check.js +7 -5
  301. package/dist/scripts/legacy-strong-inventory-check.js +7 -5
  302. package/dist/scripts/legacy-upgrade-matrix-check.js +4 -4
  303. package/dist/scripts/lib/native-cli-session-swarm-check-lib.js +173 -13
  304. package/dist/scripts/mad-sks-app-ui-no-mutation-check.js +165 -6
  305. package/dist/scripts/managed-role-manifest-parity-check.js +5 -4
  306. package/dist/scripts/mutation-callsite-coverage-check.js +0 -11
  307. package/dist/scripts/naruto-codex-e2e-check.js +14 -7
  308. package/dist/scripts/naruto-shadow-clone-swarm-check.js +4 -201
  309. package/dist/scripts/npm-publish-performance-check.js +20 -12
  310. package/dist/scripts/official-subagent-workflow-check.js +145 -0
  311. package/dist/scripts/package-published-contract-check.js +6 -20
  312. package/dist/scripts/packlist-performance-check.js +17 -3
  313. package/dist/scripts/parallel-verification-engine-check.js +2 -2
  314. package/dist/scripts/postinstall-safe-side-effects-check.js +8 -3
  315. package/dist/scripts/ppt-no-mock-as-real-check.js +3 -1
  316. package/dist/scripts/prepublish-release-check-or-fast.js +23 -86
  317. package/dist/scripts/product-design-plugin-routing-check.js +1 -1
  318. package/dist/scripts/release-affected-selector-check.js +74 -1
  319. package/dist/scripts/release-check-stamp.js +324 -239
  320. package/dist/scripts/release-dag-full-coverage-check.js +7 -15
  321. package/dist/scripts/release-dynamic-presets-check.js +10 -1
  322. package/dist/scripts/release-gate-dag-runner-check.js +3 -3
  323. package/dist/scripts/release-gate-dag-runner.js +35 -11
  324. package/dist/scripts/release-gate-existence-audit.js +1 -2
  325. package/dist/scripts/release-gate-script-parity-check.js +1 -1
  326. package/dist/scripts/release-parallel-full-coverage-check.js +12 -6
  327. package/dist/scripts/release-parallel-speed-budget-check.js +18 -2
  328. package/dist/scripts/release-real-check.js +390 -157
  329. package/dist/scripts/release-registry-check.js +61 -16
  330. package/dist/scripts/release-runtime-truth-matrix-check.js +22 -0
  331. package/dist/scripts/research-blueprint-densifier-check.js +2 -2
  332. package/dist/scripts/research-real-cycle-no-legacy-final-md-check.js +11 -7
  333. package/dist/scripts/route-proof-artifact-structure-check.js +1 -0
  334. package/dist/scripts/search-visibility-gate-lib.js +1 -1
  335. package/dist/scripts/seo-geo-route-identity-check.js +30 -4
  336. package/dist/scripts/sizecheck.js +4 -4
  337. package/dist/scripts/sks-1-11-gate-lib.js +53 -6
  338. package/dist/scripts/sks-3-1-4-directive-check-lib.js +8 -2
  339. package/dist/scripts/sks-3-1-5-directive-check-lib.js +3 -2
  340. package/dist/scripts/sks-3-1-6-directive-check-lib.js +5 -3
  341. package/dist/scripts/sks-menubar-install-check.js +8 -0
  342. package/dist/scripts/sks-uninstall-regression-check.js +1 -1
  343. package/dist/scripts/sksd-daemon-check.js +16 -6
  344. package/dist/scripts/trust-fixture-check.js +32 -10
  345. package/dist/scripts/write-build-manifest.js +2 -1
  346. package/dist/scripts/wrongness-fixture-check.js +1 -1
  347. package/dist/scripts/zellij-layout-valid-check.js +36 -11
  348. package/dist/scripts/zellij-pane-proof-check.js +33 -2
  349. package/dist/scripts/zellij-real-session-cleanup-check.js +122 -2
  350. package/dist/scripts/zellij-real-session-launch-check.js +76 -5
  351. package/dist/scripts/zellij-slot-pane-renderer-check.js +4 -4
  352. package/dist/scripts/zellij-spawn-on-demand-layout-check.js +3 -3
  353. package/docs/demo.tape +1 -1
  354. package/infra-harness-gates.json +1486 -0
  355. package/package.json +32 -19
  356. package/release-gates.v2.json +4060 -0
  357. package/runtime-required-scripts.json +9 -0
  358. package/schemas/codex/{app-server-0.142 → app-server-0.144}/codex_app_server_protocol.v2.schemas.json +1146 -781
  359. package/schemas/codex/codex-0139-real-probe-result.schema.json +39 -5
  360. package/schemas/codex/ppt-slide-issue-ledger.schema.json +2 -1
  361. package/dist/commands/db.js +0 -6
  362. package/dist/core/codex-control/codex-0139-multi-agent-real-probe.js +0 -107
  363. package/dist/core/commands/db-command.js +0 -146
  364. package/dist/core/research/prompt.js +0 -15
  365. package/dist/scripts/agent-native-release-gate.js +0 -274
  366. package/dist/scripts/codex-0142-capability-check.js +0 -21
  367. package/dist/scripts/codex-control-tool-call-sequence-repair-check.js +0 -14
  368. package/dist/scripts/command-performance-scorecard-check.js +0 -204
  369. package/dist/scripts/config-managed-merge-callsite-coverage-check.js +0 -212
  370. package/dist/scripts/dollar-performance-scorecard-check.js +0 -257
  371. package/dist/scripts/gate-timing-check.js +0 -16
  372. package/dist/scripts/ops-maturity-scorecard-check.js +0 -12
  373. package/dist/scripts/performance-baseline-check.js +0 -12
  374. package/dist/scripts/performance-improvement-report-check.js +0 -58
  375. package/dist/scripts/release-parallel-check.js +0 -389
  376. package/dist/scripts/release-runner-efficiency-check.js +0 -15
  377. package/dist/scripts/retention-long-run-smoke-check.js +0 -299
  378. package/docs/assets/sneakoscope-architecture-pipeline.jpg +0 -0
@@ -0,0 +1,305 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { DEFAULT_CODEX_APP_PLUGINS } from '../routes.js';
4
+ import { ensureDir, PACKAGE_VERSION, readText, writeTextAtomic } from '../fsx.js';
5
+ import { removeLegacyTopLevelCodexModeLocks, writeCodexConfigGuarded } from '../codex/codex-config-guard.js';
6
+ import { cleanupCodexConfigBackups, validateCodexConfigRoundTrip } from '../codex/codex-config-toml.js';
7
+ export async function ensureGlobalCodexFastModeDuringInstall(opts = {}) {
8
+ if (process.env.SKS_SKIP_CODEX_FAST_MODE_REPAIR === '1')
9
+ return { status: 'skipped', reason: 'SKS_SKIP_CODEX_FAST_MODE_REPAIR=1' };
10
+ const home = opts.home || process.env.HOME || os.homedir();
11
+ const configPath = opts.configPath || path.join(home, '.codex', 'config.toml');
12
+ try {
13
+ await ensureDir(path.dirname(configPath));
14
+ const current = await readText(configPath, '');
15
+ if (current.trim()) {
16
+ const currentSmoke = codexConfigParseSmoke(current);
17
+ if (!currentSmoke.ok) {
18
+ const backupPath = await backupCodexConfig(configPath, current, 'unparseable');
19
+ return { status: 'unparseable_config_preserved', config_path: configPath, backup_path: backupPath, parse_smoke: currentSmoke };
20
+ }
21
+ }
22
+ const next = normalizeCodexFastModeUiConfig(current, {
23
+ forceFastMode: opts.forceFastMode === true,
24
+ forceFastModeOff: opts.forceFastModeOff === true
25
+ });
26
+ if (next === ensureTrailingNewline(current)) {
27
+ const guarded = await safeWriteCodexConfigToml(configPath, current, next, 'codex-fast-mode-install-present', {
28
+ preserveFastUiKeys: opts.forceFastModeOff !== true
29
+ });
30
+ return {
31
+ status: guarded.status,
32
+ config_path: configPath,
33
+ backup_path: guarded.backup_path,
34
+ parse_smoke: guarded.ok ? undefined : guarded
35
+ };
36
+ }
37
+ const safeWrite = await safeWriteCodexConfigToml(configPath, current, next, 'codex-fast-mode-install', {
38
+ preserveFastUiKeys: opts.forceFastModeOff !== true
39
+ });
40
+ return {
41
+ status: safeWrite.status === 'written' ? 'updated' : safeWrite.status,
42
+ config_path: configPath,
43
+ backup_path: safeWrite.backup_path,
44
+ parse_smoke: safeWrite.ok ? undefined : safeWrite
45
+ };
46
+ }
47
+ catch (err) {
48
+ return { status: 'failed', config_path: configPath, error: err.message };
49
+ }
50
+ }
51
+ export function normalizeCodexFastModeUiConfig(text = '', opts = {}) {
52
+ return normalizeCodexFastModeUiConfigOnce(normalizeCodexFastModeUiConfigOnce(text, opts), opts);
53
+ }
54
+ function normalizeCodexFastModeUiConfigOnce(text = '', opts = {}) {
55
+ let next = String(text || '');
56
+ next = removeLegacyTopLevelCodexModeLocks(next);
57
+ next = removeTopLevelTomlKeyIfValue(next, 'default_profile', 'sks-fast-high');
58
+ next = removeTomlTable(next, 'user.fast_mode');
59
+ next = removeTomlTable(next, 'profiles.sks-fast-high');
60
+ next = removeTomlTableKey(next, 'notice', 'fast_default_opt_out');
61
+ for (const legacyFlag of ['codex_hooks', 'remote_control', 'fast_mode_ui', 'codex_git_commit']) {
62
+ next = removeTomlTableKey(next, 'features', legacyFlag, 'true');
63
+ }
64
+ if (opts.forceFastMode === true) {
65
+ next = upsertTopLevelTomlString(next, 'service_tier', 'fast');
66
+ }
67
+ else if (opts.forceFastModeOff === true) {
68
+ next = removeTopLevelTomlKey(next, 'service_tier');
69
+ }
70
+ next = upsertTopLevelTomlBooleanIfAbsent(next, 'suppress_unstable_features_warning', true);
71
+ for (const featureLine of [
72
+ 'hooks = true',
73
+ 'multi_agent = true',
74
+ 'fast_mode = true',
75
+ 'apps = true',
76
+ 'computer_use = true',
77
+ 'browser_use = true',
78
+ 'browser_use_external = true',
79
+ 'image_generation = true',
80
+ 'in_app_browser = true',
81
+ 'guardian_approval = true',
82
+ 'tool_suggest = true',
83
+ 'plugins = true'
84
+ ]) {
85
+ next = upsertTomlTableKeyIfAbsent(next, 'features', featureLine);
86
+ }
87
+ // Global postinstall must not impose a project concurrency policy. Existing
88
+ // user [agents] values are preserved verbatim; project setup owns defaults.
89
+ next = removeTomlTable(next, 'features.multi_agent_v2');
90
+ if (process.env.SKS_MANAGE_CODEX_APP_PLUGINS === '1') {
91
+ for (const [name, marketplace] of DEFAULT_CODEX_APP_PLUGINS) {
92
+ const table = `plugins."${name}@${marketplace}"`;
93
+ if (!hasTomlTable(next, table))
94
+ next = upsertTomlTable(next, table, `[${table}]\nenabled = true`);
95
+ }
96
+ }
97
+ return ensureTrailingNewline(next);
98
+ }
99
+ function removeTopLevelTomlKey(text = '', key = '') {
100
+ const lines = String(text || '').split('\n');
101
+ const firstTable = lines.findIndex((line) => /^\s*\[.+\]\s*$/.test(line));
102
+ const end = firstTable === -1 ? lines.length : firstTable;
103
+ const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
104
+ return lines.filter((line, index) => index >= end || !keyPattern.test(line)).join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
105
+ }
106
+ function removeTomlTable(text, table) {
107
+ const lines = String(text || '').trimEnd().split('\n');
108
+ const header = `[${table}]`;
109
+ const start = lines.findIndex((line) => line.trim() === header);
110
+ if (start === -1)
111
+ return String(text || '');
112
+ let end = lines.length;
113
+ for (let i = start + 1; i < lines.length; i += 1) {
114
+ if (/^\s*\[.+\]\s*$/.test(lines[i] || '')) {
115
+ end = i;
116
+ break;
117
+ }
118
+ }
119
+ return lines.filter((_, index) => index < start || index >= end).join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
120
+ }
121
+ export function removeTopLevelTomlKeyIfValue(text = '', key = '', value = '') {
122
+ const lines = String(text || '').split('\n');
123
+ const firstTable = lines.findIndex((line) => /^\s*\[.+\]\s*$/.test(line));
124
+ const end = firstTable === -1 ? lines.length : firstTable;
125
+ const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=\\s*"${escapeRegExp(value)}"\\s*(?:#.*)?$`);
126
+ return lines.filter((line, index) => index >= end || !keyPattern.test(line)).join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
127
+ }
128
+ function removeTomlTableKey(text, table, key, expectedValue = null) {
129
+ const lines = String(text || '').trimEnd().split('\n');
130
+ if (lines.length === 1 && lines[0] === '')
131
+ return '';
132
+ const start = lines.findIndex((line) => line.trim() === `[${table}]`);
133
+ if (start === -1)
134
+ return String(text || '');
135
+ let end = lines.length;
136
+ for (let i = start + 1; i < lines.length; i += 1) {
137
+ if (/^\s*\[.+\]\s*$/.test(lines[i] || '')) {
138
+ end = i;
139
+ break;
140
+ }
141
+ }
142
+ const valuePattern = expectedValue === null ? '' : `\\s*${escapeRegExp(String(expectedValue))}\\s*(?:#.*)?$`;
143
+ const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=${valuePattern}`);
144
+ return lines.filter((line, index) => index <= start || index >= end || !keyPattern.test(line)).join('\n').replace(/\n{3,}/g, '\n\n');
145
+ }
146
+ function upsertTomlTableKey(text, table, line) {
147
+ const key = String(line).split('=')[0]?.trim() ?? '';
148
+ const lines = String(text || '').trimEnd().split('\n');
149
+ if (lines.length === 1 && lines[0] === '')
150
+ lines.length = 0;
151
+ const start = lines.findIndex((entry) => entry.trim() === `[${table}]`);
152
+ if (start === -1)
153
+ return [...lines, ...(lines.length ? [''] : []), `[${table}]`, line].join('\n').replace(/\n{3,}/g, '\n\n');
154
+ let end = lines.length;
155
+ for (let i = start + 1; i < lines.length; i += 1) {
156
+ if (/^\s*\[.+\]\s*$/.test(lines[i] || '')) {
157
+ end = i;
158
+ break;
159
+ }
160
+ }
161
+ const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
162
+ for (let i = start + 1; i < end; i += 1) {
163
+ if (keyPattern.test(lines[i] || '')) {
164
+ lines[i] = line;
165
+ return lines.join('\n').replace(/\n{3,}/g, '\n\n');
166
+ }
167
+ }
168
+ lines.splice(end, 0, line);
169
+ return lines.join('\n').replace(/\n{3,}/g, '\n\n');
170
+ }
171
+ function hasTomlTableKey(text, table, key) {
172
+ const lines = String(text || '').split('\n');
173
+ const start = lines.findIndex((line) => line.trim() === `[${table}]`);
174
+ if (start === -1)
175
+ return false;
176
+ const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
177
+ for (let i = start + 1; i < lines.length; i += 1) {
178
+ if (/^\s*\[.+\]\s*$/.test(lines[i] || ''))
179
+ break;
180
+ if (keyPattern.test(lines[i] || ''))
181
+ return true;
182
+ }
183
+ return false;
184
+ }
185
+ function upsertTomlTableKeyIfAbsent(text, table, line) {
186
+ const key = String(line).split('=')[0]?.trim() ?? '';
187
+ return hasTomlTableKey(text, table, key) ? String(text || '') : upsertTomlTableKey(text, table, line);
188
+ }
189
+ function upsertTopLevelTomlBooleanIfAbsent(text, key, value) {
190
+ return hasTopLevelTomlKey(text, key) ? String(text || '') : upsertTopLevelTomlBoolean(text, key, value);
191
+ }
192
+ export function ensureTrailingNewline(text = '') {
193
+ const value = String(text || '').trimEnd();
194
+ return value ? `${value}\n` : '';
195
+ }
196
+ export function upsertTopLevelTomlString(text, key, value) {
197
+ const line = `${key} = "${value}"`;
198
+ const lines = String(text || '').split('\n');
199
+ const firstTable = lines.findIndex((entry) => /^\s*\[.+\]\s*$/.test(entry));
200
+ const end = firstTable === -1 ? lines.length : firstTable;
201
+ const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
202
+ for (let i = 0; i < end; i += 1) {
203
+ if (keyPattern.test(lines[i] || '')) {
204
+ lines[i] = line;
205
+ return lines.join('\n').replace(/\n{3,}/g, '\n\n');
206
+ }
207
+ }
208
+ lines.splice(end, 0, line);
209
+ return lines.join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
210
+ }
211
+ function hasTopLevelTomlKey(text, key) {
212
+ const lines = String(text || '').split('\n');
213
+ const firstTable = lines.findIndex((entry) => /^\s*\[.+\]\s*$/.test(entry));
214
+ const end = firstTable === -1 ? lines.length : firstTable;
215
+ const pattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
216
+ return lines.slice(0, end).some((line) => pattern.test(line));
217
+ }
218
+ function codexConfigParseSmoke(text = '') {
219
+ const value = String(text || '');
220
+ const unterminatedTriple = (value.match(/"""|'''/g) || []).length % 2 !== 0;
221
+ const invalidHeader = value.split('\n').find((line) => /^\s*\[/.test(line) && !/^\s*\[\[?[^\]]+\]\]?\s*(?:#.*)?$/.test(line)) || null;
222
+ return { ok: !unterminatedTriple && !invalidHeader, unterminated_multiline_string: unterminatedTriple, invalid_table_header: invalidHeader };
223
+ }
224
+ async function backupCodexConfig(configPath, text, tag) {
225
+ try {
226
+ const backupPath = `${configPath}.sks-${tag}-${PACKAGE_VERSION}-${Date.now().toString(36)}.bak`;
227
+ await writeTextAtomic(backupPath, text, { mode: 0o600 });
228
+ await cleanupCodexConfigBackups(configPath, { keepPerTag: 3, maxAgeMs: 30 * 24 * 60 * 60 * 1000 }).catch(() => undefined);
229
+ return backupPath;
230
+ }
231
+ catch {
232
+ return null;
233
+ }
234
+ }
235
+ export async function safeWriteCodexConfigToml(configPath, current, next, tag = 'codex-lb', opts = {}) {
236
+ return writeCodexConfigGuarded({
237
+ configPath,
238
+ before: String(current || ''),
239
+ cause: tag,
240
+ removeTopLevelModeLocks: true,
241
+ ...(opts.preserveFastUiKeys === undefined ? {} : { preserveFastUiKeys: opts.preserveFastUiKeys }),
242
+ mutate: () => String(next || '')
243
+ });
244
+ }
245
+ export function codexFastModeDesktopStatus(text = '') {
246
+ const validation = validateCodexConfigRoundTrip(String(text || ''));
247
+ const globalOn = validation.ok && validation.service_tier === 'fast';
248
+ return {
249
+ schema: 'sks.codex-fast-mode-desktop-status.v2',
250
+ ok: validation.ok,
251
+ on: Boolean(globalOn),
252
+ service_tier: validation.service_tier ?? null,
253
+ model: validation.model ?? null,
254
+ legacy_keys: validation.legacy_keys,
255
+ validation: {
256
+ ok: validation.ok,
257
+ blockers: validation.blockers,
258
+ parse_error: validation.parse_error || null,
259
+ service_tier: validation.service_tier ?? null,
260
+ model: validation.model ?? null,
261
+ model_reasoning_effort: validation.model_reasoning_effort ?? null,
262
+ legacy_keys: validation.legacy_keys
263
+ }
264
+ };
265
+ }
266
+ function upsertTopLevelTomlBoolean(text, key, value) {
267
+ const line = `${key} = ${value ? 'true' : 'false'}`;
268
+ const lines = String(text || '').split('\n');
269
+ const firstTable = lines.findIndex((entry) => /^\s*\[.+\]\s*$/.test(entry));
270
+ const end = firstTable === -1 ? lines.length : firstTable;
271
+ const pattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
272
+ for (let i = 0; i < end; i += 1) {
273
+ if (pattern.test(lines[i] || '')) {
274
+ lines[i] = line;
275
+ return lines.join('\n').replace(/\n{3,}/g, '\n\n');
276
+ }
277
+ }
278
+ lines.splice(end, 0, line);
279
+ return lines.join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
280
+ }
281
+ function hasTomlTable(text, table) {
282
+ return String(text || '').split('\n').some((line) => String(line).trim() === `[${table}]`);
283
+ }
284
+ export function upsertTomlTable(text, table, block) {
285
+ let lines = String(text || '').trimEnd().split('\n');
286
+ if (lines.length === 1 && lines[0] === '')
287
+ lines = [];
288
+ const start = lines.findIndex((entry) => entry.trim() === `[${table}]`);
289
+ const blockLines = String(block || '').trim().split('\n');
290
+ if (start === -1)
291
+ return [...lines, ...(lines.length ? [''] : []), ...blockLines].join('\n').replace(/\n{3,}/g, '\n\n');
292
+ let end = lines.length;
293
+ for (let i = start + 1; i < lines.length; i += 1) {
294
+ if (/^\s*\[.+\]\s*$/.test(lines[i] || '')) {
295
+ end = i;
296
+ break;
297
+ }
298
+ }
299
+ lines.splice(start, end - start, ...blockLines);
300
+ return lines.join('\n').replace(/\n{3,}/g, '\n\n');
301
+ }
302
+ function escapeRegExp(value) {
303
+ return String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
304
+ }
305
+ //# sourceMappingURL=codex-desktop-config-policy.js.map
@@ -1,7 +1,7 @@
1
1
  import path from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { ensureDir, exists, nowIso, projectRoot, runProcess, writeJsonAtomic } from '../fsx.js';
4
- import { buildAgentManifest } from '../agent-bridge/agent-manifest.js';
4
+ import { buildAgentManifest, validateAgentManifest } from '../agent-bridge/agent-manifest.js';
5
5
  import { flag } from './command-utils.js';
6
6
  async function resolveSksEntrypoint() {
7
7
  // Mirrors src/core/agent-bridge/mcp-server.ts's own bin resolution: prefer the
@@ -14,7 +14,10 @@ async function runNonInteractiveSmoke(entrypoint) {
14
14
  const result = await runProcess(process.execPath, [entrypoint, 'status', '--json'], {
15
15
  env: { SKS_AGENT_MODE: '1' },
16
16
  timeoutMs: 15_000,
17
- maxOutputBytes: 32 * 1024
17
+ // Status is intentionally bounded but can exceed 32 KiB when several
18
+ // session summaries are present. Truncating otherwise-valid JSON makes the
19
+ // bridge report a false non-interactive failure.
20
+ maxOutputBytes: 512 * 1024
18
21
  }).catch((err) => ({ code: 1, stdout: '', stderr: err instanceof Error ? err.message : String(err) }));
19
22
  let stdoutIsCleanJson = false;
20
23
  try {
@@ -56,7 +59,24 @@ export async function agentBridgeCommand(subcommand, args = []) {
56
59
  }
57
60
  const root = await projectRoot();
58
61
  const manifest = buildAgentManifest();
62
+ const manifestValidation = validateAgentManifest(manifest);
59
63
  const manifestPath = path.join(root, '.sneakoscope', 'agent-bridge', 'manifest.json');
64
+ if (!manifestValidation.ok) {
65
+ const result = {
66
+ schema: 'sks.agent-bridge-setup.v1',
67
+ generated_at: nowIso(),
68
+ ok: false,
69
+ status: 'manifest_validation_failed',
70
+ manifest_path: manifestPath,
71
+ manifest_validation: manifestValidation
72
+ };
73
+ process.exitCode = 1;
74
+ if (flag(args, '--json'))
75
+ console.log(JSON.stringify(result, null, 2));
76
+ else
77
+ console.error(`Agent bridge manifest validation failed: ${manifestValidation.issues.join(', ')}`);
78
+ return result;
79
+ }
60
80
  await ensureDir(path.dirname(manifestPath));
61
81
  await writeJsonAtomic(manifestPath, manifest);
62
82
  const entrypoint = await resolveSksEntrypoint();
@@ -67,6 +87,7 @@ export async function agentBridgeCommand(subcommand, args = []) {
67
87
  ok: smoke.ok,
68
88
  manifest_path: manifestPath,
69
89
  tool_count: manifest.tools.length,
90
+ manifest_validation: manifestValidation,
70
91
  registration_snippets: registrationSnippets(),
71
92
  non_interactive_smoke: smoke
72
93
  };
@@ -12,6 +12,8 @@ import { runNativeCliWorkerFromArgs } from '../agents/native-cli-worker.js';
12
12
  const AGENT_ACTION_SCHEMA = 'sks.agent-command-result.v1';
13
13
  export async function agentCommand(commandOrArgs = 'agent', maybeArgs = []) {
14
14
  const args = Array.isArray(commandOrArgs) ? commandOrArgs : maybeArgs;
15
+ if (args.includes('--help') || args.includes('-h') || args[0] === 'help')
16
+ return agentHelp(args.includes('--json'));
15
17
  const parsed = parseAgentCommandArgs('agent', args);
16
18
  if (parsed.action === 'worker')
17
19
  return runNativeCliWorkerFromArgs(args.slice(args[0] === 'worker' ? 1 : 0));
@@ -21,7 +23,40 @@ export async function agentCommand(commandOrArgs = 'agent', maybeArgs = []) {
21
23
  return agentPlan(parsed);
22
24
  return agentMissionAction(parsed);
23
25
  }
26
+ function agentHelp(json = false) {
27
+ const result = {
28
+ schema: 'sks.agent-help.v1',
29
+ ok: true,
30
+ action: 'help',
31
+ read_only: true,
32
+ usage: 'sks agent run <prompt> [--mission <id>] [--agents <n>] [--concurrency <n>] [--readonly] [--json]',
33
+ actions: ['run', 'plan', 'status', 'watch', 'dashboard', 'cockpit', 'lane', 'board', 'ledger', 'collect', 'consensus', 'close', 'cleanup', 'proof', 'explain', 'rollback-patches']
34
+ };
35
+ if (json)
36
+ console.log(JSON.stringify(result, null, 2));
37
+ else {
38
+ console.log(result.usage);
39
+ console.log('Actions: ' + result.actions.join(', '));
40
+ }
41
+ return result;
42
+ }
24
43
  async function agentRun(parsed) {
44
+ if (normalizeRouteName(parsed.route) === 'release-review' && parsed.legacyNativeRuntime !== true) {
45
+ const result = {
46
+ schema: AGENT_ACTION_SCHEMA,
47
+ ok: false,
48
+ status: 'blocked',
49
+ route: '$Release-Review',
50
+ blocker: 'release_review_official_subagents_required',
51
+ blockers: ['release_review_official_subagents_required'],
52
+ next_command: `sks naruto run "$Release-Review ${String(parsed.prompt || 'release audit').replace(/"/g, '\\"')}" --agents ${Math.max(1, Number(parsed.agents || 1))} --read-only --json`,
53
+ legacy_escape_hatch: 'Pass --legacy-native-runtime only for an explicitly approved legacy compatibility run.'
54
+ };
55
+ process.exitCode = 2;
56
+ return emit(parsed, result, () => {
57
+ console.error('Release Review is owned by the Codex official subagent workflow. Use the suggested sks naruto command.');
58
+ });
59
+ }
25
60
  const result = await runNativeAgentOrchestrator({ ...parsed, routeCommand: 'sks agent run', routeBlackboxKind: 'actual_agent_command' });
26
61
  if (normalizeRouteName(parsed.route) === 'release-review' && result.mission_id) {
27
62
  await writeReleaseReviewNativeAgentPlan(parsed, result);
@@ -37,11 +72,9 @@ function normalizeRouteName(route = '') {
37
72
  return String(route || '').replace(/^\$/, '').trim().toLowerCase();
38
73
  }
39
74
  /**
40
- * $Release-Review runs through the generic native agent orchestrator (sks agent run
41
- * --route "$Release-Review"), which does not itself know it is a release-review run.
42
- * Write the route-specific release-review-native-agent-plan.json summary artifact here
43
- * so `route-release-review`'s fixture contract (plan file + agent proof evidence +
44
- * agent effort policy) is genuinely satisfied by this command rather than only partially.
75
+ * Legacy compatibility fixtures may explicitly opt into the historical native
76
+ * Release-Review runner with --legacy-native-runtime. Public $Release-Review
77
+ * execution is owned by the official Codex subagent workflow.
45
78
  */
46
79
  async function writeReleaseReviewNativeAgentPlan(parsed, result) {
47
80
  const root = await sksRoot();
@@ -5,7 +5,7 @@ import { COMMAND_MANIFEST_LITE } from '../../cli/command-manifest-lite.js';
5
5
  import { flag } from '../../cli/args.js';
6
6
  import { printJson, sksTextLogo } from '../../cli/output.js';
7
7
  import { ui as cliUi } from '../../cli/cli-theme.js';
8
- import { PACKAGE_VERSION, ensureDir, exists, nowIso, projectRoot, readJson, sksRoot, tmpdir, writeJsonAtomic } from '../fsx.js';
8
+ import { PACKAGE_VERSION, ensureDir, exists, nowIso, projectRoot, readJson, rmrf, sksRoot, tmpdir, writeJsonAtomic } from '../fsx.js';
9
9
  import { DOLLAR_COMMAND_ALIASES, DOLLAR_COMMANDS, USAGE_TOPICS, routePrompt, routeReasoning, reasoningInstruction } from '../routes.js';
10
10
  import { DOLLAR_COMMAND_ALIASES_LITE, DOLLAR_COMMANDS_LITE } from '../routes/dollar-manifest-lite.js';
11
11
  import { initProject, normalizeInstallScope, sksCommandPrefix } from '../init.js';
@@ -17,6 +17,7 @@ import { createMission } from '../mission.js';
17
17
  import { formatSksUpdateCheckText, runSksUpdateCheck, runSksUpdateNow } from '../update-check.js';
18
18
  import { persistSksUpdateNoticeFromVersions } from '../update/update-notice.js';
19
19
  import { withSecretPreservationGuard } from '../config/config-migration-journal.js';
20
+ const REMOVED_USAGE_TOPICS = new Set(['db']);
20
21
  export async function helpCommand(args = []) {
21
22
  const topic = args[0];
22
23
  if (topic)
@@ -100,7 +101,9 @@ export function usageCommand(args = []) {
100
101
  console.log(row.description);
101
102
  return;
102
103
  }
103
- const route = DOLLAR_COMMANDS.find((entry) => entry.command.toLowerCase() === `$${topic}`.toLowerCase());
104
+ const route = REMOVED_USAGE_TOPICS.has(String(topic).toLowerCase())
105
+ ? null
106
+ : DOLLAR_COMMANDS.find((entry) => entry.command.toLowerCase() === `$${topic}`.toLowerCase());
104
107
  if (route) {
105
108
  console.log(`${route.command}\n`);
106
109
  console.log(`${route.route}: ${route.description}`);
@@ -205,6 +208,27 @@ export async function setupCommand(args = []) {
205
208
  if (flag(args, '--help') || flag(args, '-h'))
206
209
  return usageCommand(['setup']);
207
210
  const root = await projectRoot();
211
+ const { formatHarnessConflictReport, scanHarnessConflicts } = await import('../harness-conflicts.js');
212
+ const conflictScan = await scanHarnessConflicts(root);
213
+ if (conflictScan.hard_block) {
214
+ const blocked = {
215
+ schema: 'sks.setup.v1',
216
+ ok: false,
217
+ status: 'blocked_harness_conflict',
218
+ root,
219
+ blockers: conflictScan.hard.map((item) => `${item.name || 'harness'}:${item.path}`),
220
+ conflicts: conflictScan.conflicts,
221
+ cleanup_prompt_command: 'sks conflicts prompt'
222
+ };
223
+ process.exitCode = 1;
224
+ if (flag(args, '--json')) {
225
+ printJson(blocked);
226
+ return blocked;
227
+ }
228
+ console.error(formatHarnessConflictReport(conflictScan, { includePrompt: false }));
229
+ console.error('Run `sks conflicts prompt` and obtain explicit human approval before cleanup.');
230
+ return blocked;
231
+ }
208
232
  const installScope = installScopeFromArgs(args);
209
233
  let res = null;
210
234
  let cliTools = null;
@@ -218,24 +242,41 @@ export async function setupCommand(args = []) {
218
242
  const { ensureRelatedCliTools } = await import('../../cli/install-helpers.js');
219
243
  cliTools = await ensureRelatedCliTools(args);
220
244
  });
245
+ const blockers = [
246
+ ...(res.codex_config_install?.manual_blockers || []),
247
+ ...(res.agent_install?.manual_blockers || [])
248
+ ];
249
+ const warnings = res.codex_config_install?.warnings || [];
221
250
  const result = {
222
251
  schema: 'sks.setup.v1',
223
- ok: true,
252
+ ok: blockers.length === 0 && res.codex_config_install?.ok !== false && res.agent_install?.ok !== false,
253
+ status: blockers.length ? 'manual_blocked' : 'completed',
224
254
  root,
225
255
  install_scope: installScope,
226
256
  command_prefix: sksCommandPrefix(installScope, { globalCommand: 'sks' }),
227
257
  created: res.created || [],
228
258
  local_only: flag(args, '--local-only'),
229
- cli_tools: cliTools
259
+ cli_tools: cliTools,
260
+ blockers,
261
+ warnings
230
262
  };
231
- if (flag(args, '--json'))
232
- return printJson(result);
233
- console.log(`Setup complete: ${root}`);
263
+ if (!result.ok)
264
+ process.exitCode = 1;
265
+ if (flag(args, '--json')) {
266
+ printJson(result);
267
+ return result;
268
+ }
269
+ console.log(`${result.ok ? 'Setup complete' : 'Setup blocked'}: ${root}`);
234
270
  console.log(`Install scope: ${installScope}`);
235
271
  console.log(`Codex CLI: ${cliTools.codex.status}${cliTools.codex.version ? ` ${cliTools.codex.version}` : ''}`);
236
272
  console.log(`Zellij: ${cliTools.zellij.ok ? 'ok' : cliTools.zellij.repair.status}${cliTools.zellij.version ? ` ${cliTools.zellij.version}` : ''}`);
237
273
  for (const file of result.created)
238
274
  console.log(`- ${file}`);
275
+ for (const warning of warnings)
276
+ console.log(`Warning: ${warning}`);
277
+ for (const blocker of blockers)
278
+ console.error(`Blocker: ${blocker}`);
279
+ return result;
239
280
  }
240
281
  export async function bootstrapCommand(args = []) {
241
282
  if (flag(args, '--help') || flag(args, '-h'))
@@ -317,29 +358,35 @@ export async function selftestCommand(args = []) {
317
358
  const root = await projectRoot();
318
359
  const tmp = tmpdir('sks-selftest-');
319
360
  await ensureDir(tmp);
320
- const registry = await buildFeatureRegistry({ root });
321
- const coverage = validateFeatureRegistry(registry);
322
- if (!coverage.ok)
323
- throw new Error(`selftest: feature registry blocked: ${coverage.blockers.join(', ')}`);
324
- const mission = await createMission(tmp, { mode: 'team', prompt: 'selftest route proof fixture' });
325
- await writeSelftestRouteProof(tmp, { missionId: mission.id, kind: 'team_gate' });
326
- const proof = await readJson(path.join(tmp, '.sneakoscope', 'missions', mission.id, 'completion-proof.json'), null);
327
- if (!proof?.mission_id)
328
- throw new Error('selftest: completion proof fixture missing');
329
- const hookExplain = hooksExplainReport();
330
- if (!hookExplain.events.includes('Stop'))
331
- throw new Error('selftest: hook explain missing Stop');
332
- const result = {
333
- schema: 'sks.selftest.v1',
334
- ok: true,
335
- version: PACKAGE_VERSION,
336
- generated_at: nowIso(),
337
- checks: ['feature_registry', 'route_completion_proof_fixture', 'hooks_policy_surface'],
338
- tmp_root: tmp
339
- };
340
- if (flag(args, '--json'))
341
- return printJson(result);
342
- console.log('SKS selftest passed');
361
+ try {
362
+ const registry = await buildFeatureRegistry({ root });
363
+ const coverage = validateFeatureRegistry(registry);
364
+ if (!coverage.ok)
365
+ throw new Error(`selftest: feature registry blocked: ${coverage.blockers.join(', ')}`);
366
+ const mission = await createMission(tmp, { mode: 'team', prompt: 'selftest route proof fixture' });
367
+ await writeSelftestRouteProof(tmp, { missionId: mission.id, kind: 'team_gate' });
368
+ const proof = await readJson(path.join(tmp, '.sneakoscope', 'missions', mission.id, 'completion-proof.json'), null);
369
+ if (!proof?.mission_id)
370
+ throw new Error('selftest: completion proof fixture missing');
371
+ const hookExplain = hooksExplainReport();
372
+ if (!hookExplain.events.includes('Stop'))
373
+ throw new Error('selftest: hook explain missing Stop');
374
+ const result = {
375
+ schema: 'sks.selftest.v1',
376
+ ok: true,
377
+ version: PACKAGE_VERSION,
378
+ generated_at: nowIso(),
379
+ checks: ['feature_registry', 'route_completion_proof_fixture', 'hooks_policy_surface'],
380
+ tmp_root: tmp,
381
+ tmp_cleaned: true
382
+ };
383
+ if (flag(args, '--json'))
384
+ return printJson(result);
385
+ console.log('SKS selftest passed');
386
+ }
387
+ finally {
388
+ await rmrf(tmp);
389
+ }
343
390
  }
344
391
  /**
345
392
  * `sks selftest --real`: actually spawns every feature fixture whose kind is
@@ -53,7 +53,7 @@ export function positionalArgs(args = []) {
53
53
  '--lines', '--intent', '--changed', '--route', '--skills', '--prompt-signature',
54
54
  '--mission-id', '--source', '--image-id', '--bbox', '--label', '--evidence',
55
55
  '--claim-id', '--type', '--before', '--after', '--anchors', '--verification',
56
- '--status', '--agents', '--target-active-slots', '--work-items', '--minimum-work-items',
56
+ '--status', '--agents', '--clones', '--max-threads', '--target-active-slots', '--work-items', '--minimum-work-items',
57
57
  '--max-queue-expansion', '--engine', '--kind', '--severity', '--claim',
58
58
  '--prior-status', '--artifact', '--reason', '--root-cause', '--corrective-action',
59
59
  '--required-evidence', '--patch-status', '--avoid', '--applies-to', '--files',
@@ -25,10 +25,12 @@ export async function memoryCommand(sub, args = []) {
25
25
  return gcCommand(args || []);
26
26
  }
27
27
  export async function gcCommand(args = []) {
28
- const root = await sksRoot();
29
28
  const action = String(args[0] || '').toLowerCase();
29
+ if (action === 'help' || args.includes('--help') || args.includes('-h'))
30
+ return gcHelp(flag(args, '--json'));
31
+ const root = await sksRoot();
30
32
  if (action === 'plan') {
31
- const res = await enforceRetention(root, { dryRun: true, pruneReportLogs: true, policy: { max_tmp_age_hours: 0 } });
33
+ const res = await enforceRetention(root, { dryRun: true, pruneReportLogs: true });
32
34
  if (flag(args, '--json'))
33
35
  return console.log(JSON.stringify(res.plan, null, 2));
34
36
  console.log('ㅅㅋㅅ GC plan');
@@ -47,7 +49,6 @@ export async function gcCommand(args = []) {
47
49
  }
48
50
  const res = await applyRetentionPlan(root, {
49
51
  pruneReportLogs: true,
50
- policy: { max_tmp_age_hours: 0 },
51
52
  planHash: readOption(args, '--plan-hash', null)
52
53
  });
53
54
  if (flag(args, '--json'))
@@ -70,7 +71,7 @@ export async function gcCommand(args = []) {
70
71
  console.log(`Latest plan: ${res.latest_plan?.plan_hash || 'none'}`);
71
72
  return res;
72
73
  }
73
- const res = await enforceRetention(root, { dryRun: flag(args, '--dry-run'), pruneReportLogs: true, policy: { max_tmp_age_hours: 0 } });
74
+ const res = await enforceRetention(root, { dryRun: flag(args, '--dry-run'), pruneReportLogs: true });
74
75
  if (flag(args, '--json'))
75
76
  return console.log(JSON.stringify(res, null, 2));
76
77
  console.log(flag(args, '--dry-run') ? 'ㅅㅋㅅ GC dry run' : 'ㅅㅋㅅ GC completed');
@@ -80,6 +81,28 @@ export async function gcCommand(args = []) {
80
81
  for (const a of res.actions.slice(0, 20))
81
82
  console.log(`- ${a.action} ${a.path || a.mission || ''} ${a.bytes ? formatBytes(a.bytes) : ''}`);
82
83
  }
84
+ function gcHelp(json = false) {
85
+ const help = {
86
+ schema: 'sks.gc-help.v1',
87
+ ok: true,
88
+ usage: 'sks gc [plan|apply|status] [--dry-run] [--json]',
89
+ commands: {
90
+ plan: 'Create a hashed dry-run plan using the configured retention policy.',
91
+ apply: 'Apply a reviewed plan with --yes and optional --plan-hash.',
92
+ status: 'Show the latest mission index, plan, cleanup, and storage status.'
93
+ }
94
+ };
95
+ if (json)
96
+ console.log(JSON.stringify(help, null, 2));
97
+ else {
98
+ console.log(`Usage: ${help.usage}`);
99
+ console.log(' sks gc --dry-run');
100
+ console.log(' sks gc plan [--json]');
101
+ console.log(' sks gc apply --yes [--plan-hash <hash>] [--json]');
102
+ console.log(' sks gc status [--json]');
103
+ }
104
+ return help;
105
+ }
83
106
  function readOption(args = [], name, fallback = null) {
84
107
  const index = args.indexOf(name);
85
108
  if (index >= 0 && args[index + 1] && !String(args[index + 1]).startsWith('--'))