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
@@ -3,39 +3,58 @@
3
3
  import fs from 'node:fs';
4
4
  import os from 'node:os';
5
5
  import path from 'node:path';
6
+ import { parse } from 'smol-toml';
6
7
  import { assertGate, emitGate, importDist } from './sks-1-18-gate-lib.js';
7
8
  const mod = await importDist('core/agents/agent-role-config.js');
8
9
  const root = fs.mkdtempSync(path.join(os.tmpdir(), 'sks-role-repair-'));
9
10
  fs.mkdirSync(path.join(root, '.sneakoscope', 'reports'), { recursive: true });
10
11
  const plan = await mod.repairAgentRoleConfigs({ root, apply: false, codexHome: path.join(root, 'codex-home') });
11
12
  const repair = await mod.repairAgentRoleConfigs({ root, apply: true, codexHome: path.join(root, 'codex-home'), reportPath: path.join(root, '.sneakoscope', 'reports', 'agent-role-config-repair.json') });
12
- const analysisScout = path.join(root, '.codex', 'agents', 'analysis-scout.toml');
13
+ const workerFile = path.join(root, '.codex', 'agents', 'worker.toml');
14
+ const expertFile = path.join(root, '.codex', 'agents', 'expert.toml');
13
15
  const staleRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'sks-role-stale-'));
14
16
  fs.mkdirSync(path.join(staleRoot, '.codex', 'agents'), { recursive: true });
15
- fs.writeFileSync(path.join(staleRoot, '.codex', 'agents', 'analysis-scout.toml'), 'model = "gpt-5-codex"\nsandbox_mode = "read-only"\n');
17
+ const staleManagedText = [
18
+ '# SKS-MANAGED-ASSET',
19
+ '# sks_managed_schema = 1',
20
+ '# sks_managed_id = "sks-explorer"',
21
+ '# sks_managed_version = "4.8.1"',
22
+ 'name = "analysis_scout"',
23
+ 'description = "SKS stale managed role"',
24
+ 'sandbox_mode = "workspace-write"',
25
+ 'permission_profile = "sks-workspace-write"',
26
+ 'legacy_sandbox_projection = "workspace-write"',
27
+ 'developer_instructions = """',
28
+ 'SKS stale role',
29
+ '"""',
30
+ ''
31
+ ].join('\n');
32
+ fs.writeFileSync(path.join(staleRoot, '.codex', 'agents', 'analysis-scout.toml'), staleManagedText);
16
33
  const stalePlan = await mod.repairAgentRoleConfigs({ root: staleRoot, apply: false, codexHome: path.join(staleRoot, 'codex-home') });
17
34
  const staleRepair = await mod.repairAgentRoleConfigs({ root: staleRoot, apply: true, codexHome: path.join(staleRoot, 'codex-home') });
18
- const repairedText = fs.readFileSync(path.join(staleRoot, '.codex', 'agents', 'analysis-scout.toml'), 'utf8');
19
- const createdText = fs.readFileSync(analysisScout, 'utf8');
35
+ const preservedText = fs.readFileSync(path.join(staleRoot, '.codex', 'agents', 'analysis-scout.toml'), 'utf8');
36
+ const createdText = fs.readFileSync(workerFile, 'utf8');
37
+ const createdParsed = parse(createdText);
20
38
  const globalRole = path.join(root, 'codex-home', 'agents', 'analysis-scout.toml');
21
39
  fs.mkdirSync(path.dirname(globalRole), { recursive: true });
22
- fs.writeFileSync(globalRole, 'name = "analysis_scout"\ndescription = "SKS stale global role"\nmodel = "gpt-5.5"\nmodel_reasoning_effort = "low"\nsandbox_mode = "workspace-write"\ndeveloper_instructions = """\nSKS role\n"""\n');
40
+ fs.writeFileSync(globalRole, 'name = "analysis_scout"\ndescription = "SKS stale global role"\nmodel = "gpt-5.6-terra"\nmodel_reasoning_effort = "low"\nsandbox_mode = "workspace-write"\ndeveloper_instructions = """\nSKS role\n"""\n');
23
41
  const globalRepair = await mod.repairAgentRoleConfigs({ root, apply: true, codexHome: path.join(root, 'codex-home') });
24
- const globalRepairedText = fs.readFileSync(globalRole, 'utf8');
42
+ const globalPreservedText = fs.readFileSync(globalRole, 'utf8');
25
43
  const report = {
26
44
  schema: 'sks.agent-role-config-repair-check.v1',
27
- plan_ok: plan.ok === true && plan.missing.includes('analysis-scout.toml'),
45
+ plan_ok: plan.ok === true && plan.missing.includes('worker.toml') && plan.missing.includes('expert.toml') && !plan.missing.includes('analysis-scout.toml'),
28
46
  repair_ok: repair.ok === true,
29
- analysis_scout_created: fs.existsSync(analysisScout),
30
- created_inherits_model: !/^(?:model|model_reasoning_effort)\s*=/m.test(createdText),
31
- created_write_capable: createdText.includes('sandbox_mode = "workspace-write"') && !createdText.includes('Do not edit files.'),
32
- stale_detected: stalePlan.stale.includes('analysis-scout.toml'),
33
- stale_repaired: staleRepair.repaired.includes('.codex/agents/analysis-scout.toml') && repairedText.includes('name = "analysis_scout"') && !/^(?:model|model_reasoning_effort)\s*=/m.test(repairedText) && repairedText.includes('sandbox_mode = "workspace-write"'),
34
- global_stale_repaired_with_valid_project_copy: globalRepair.repaired.some((file) => file.endsWith('codex-home/agents/analysis-scout.toml')) && !/^(?:model|model_reasoning_effort)\s*=/m.test(globalRepairedText),
47
+ official_agents_created: fs.existsSync(workerFile) && fs.existsSync(expertFile),
48
+ managed_body_hash_present: createdText.includes('# SKS-MANAGED-OFFICIAL-SUBAGENT') && /sks_managed_body_sha256 = "[a-f0-9]{64}"/.test(createdText),
49
+ generated_toml_parses: createdParsed.name === 'worker' && createdParsed.model === 'gpt-5.6-luna' && createdParsed.model_reasoning_effort === 'max',
50
+ generated_toml_uses_supported_keys: !Object.hasOwn(createdParsed, 'permission_profile') && !Object.hasOwn(createdParsed, 'legacy_sandbox_projection'),
51
+ generated_inherits_parent_sandbox: !Object.hasOwn(createdParsed, 'sandbox_mode'),
52
+ legacy_preserved: !stalePlan.stale.includes('analysis-scout.toml') && !staleRepair.repaired.includes('.codex/agents/analysis-scout.toml') && preservedText === staleManagedText,
53
+ global_legacy_preserved: !globalRepair.repaired.some((file) => file.endsWith('codex-home/agents/analysis-scout.toml')) && globalPreservedText.includes('model = "gpt-5.6-terra"'),
35
54
  warnings_suppressed: repair.warnings_suppressed === true,
36
55
  artifact_written: fs.existsSync(path.join(root, '.sneakoscope', 'reports', 'agent-role-config-repair.json'))
37
56
  };
38
- const ok = report.plan_ok && report.repair_ok && report.analysis_scout_created && report.created_inherits_model && report.created_write_capable && report.stale_detected && report.stale_repaired && report.global_stale_repaired_with_valid_project_copy && report.warnings_suppressed && report.artifact_written;
39
- assertGate(ok, 'doctor --fix must repair missing SKS-owned agent role configs', report);
57
+ const ok = report.plan_ok && report.repair_ok && report.official_agents_created && report.managed_body_hash_present && report.generated_toml_parses && report.generated_toml_uses_supported_keys && report.generated_inherits_parent_sandbox && report.legacy_preserved && report.global_legacy_preserved && report.warnings_suppressed && report.artifact_written;
58
+ assertGate(ok, 'doctor --fix must create only official worker/expert configs and preserve legacy role TOMLs', report);
40
59
  emitGate('agent:role-config-repair', report);
41
60
  //# sourceMappingURL=agent-role-config-repair-check.js.map
@@ -10,6 +10,7 @@ import os from 'node:os';
10
10
  import path from 'node:path';
11
11
  import { assertGate, emitGate, importDist, readText, root } from './sks-1-18-gate-lib.js';
12
12
  const triwiki = await importDist('core/triwiki-runtime.js');
13
+ const coordinates = await importDist('core/wiki-coordinate.js');
13
14
  const { loadTriWikiRuntimeContext, triWikiProofRecord, writeTriWikiContextArtifact } = triwiki;
14
15
  // 1) Absent pack -> graceful fallback (present:false, warning, not consulted).
15
16
  const emptyRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'sks-triwiki-empty-'));
@@ -22,10 +23,23 @@ assertGate(triWikiProofRecord(emptyCtx).triwiki_context_consulted === false, 'ab
22
23
  const packRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'sks-triwiki-pack-'));
23
24
  const packDir = path.join(packRoot, '.sneakoscope', 'wiki');
24
25
  fs.mkdirSync(packDir, { recursive: true });
26
+ const wiki = coordinates.compactWikiCoordinateIndex(coordinates.buildWikiCoordinateIndex({
27
+ mission: { id: 'project-wiki', coord: { rgba: [48, 132, 212, 240] } },
28
+ claims: [
29
+ { id: 'claim-a', text: 'claim a', status: 'supported', freshness: 'fresh', risk: 'low', trust_score: 0.95 },
30
+ { id: 'claim-b', text: 'claim b', status: 'weak', freshness: 'unknown', risk: 'high', trust_score: 0.5 }
31
+ ],
32
+ maxAnchors: 2
33
+ }));
34
+ const anchorById = new Map(wiki.a.map((row) => [row[0], row]));
25
35
  const pack = {
26
36
  mission: 'project-wiki',
27
- attention: { mode: 'aggressive_triwiki_active_recall', use_first: [['claim-a', [48, 132, 212, 240], 'h1']], hydrate_first: [['claim-b', 'risk:high']] },
28
- wiki: { a: [['claim-a'], ['claim-b']] },
37
+ attention: {
38
+ mode: 'aggressive_triwiki_active_recall',
39
+ use_first: [['claim-a', anchorById.get('claim-a')?.[1], anchorById.get('claim-a')?.[7]]],
40
+ hydrate_first: [['claim-b', 'risk:high']]
41
+ },
42
+ wiki,
29
43
  claims: [{ id: 'claim-a' }, { id: 'claim-b' }],
30
44
  trust_summary: { avg: 0.71 }
31
45
  };
@@ -1,19 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  // @ts-nocheck
3
- import { assertGate, emitGate, requireContains, requirePackageScripts, runSksJson } from './sks-1-12-real-execution-check-lib.js';
4
- const requiredScripts = [
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { assertGate, emitGate, requireContains, root, runSksJson } from './sks-1-12-real-execution-check-lib.js';
6
+ const requiredGates = [
5
7
  'ux-review:run-wires-imagegen',
6
8
  'ux-review:extract-wires-real-extractor',
7
9
  'ux-review:patch-diff-recheck',
10
+ 'ux-review:imagegen-blackbox',
8
11
  'ppt:real-export-adapter',
9
12
  'ppt:real-imagegen-wiring',
10
13
  'ppt:reexport-rereview',
14
+ 'ppt:full-e2e-blackbox',
11
15
  'dfix:patch-handoff',
12
16
  'dfix:verification-recommendation',
17
+ 'dfix:fixture',
18
+ 'dfix:verification',
13
19
  'all-features:deep-completion',
14
- 'evidence:flagship-coverage'
20
+ 'evidence:flagship-coverage',
21
+ 'schema:check'
15
22
  ];
16
- requirePackageScripts('all-features:deep-completion', requiredScripts);
23
+ const releaseManifest = JSON.parse(fs.readFileSync(path.join(root, 'release-gates.v2.json'), 'utf8'));
24
+ const releaseGateIds = new Set((releaseManifest.gates || []).map((gate) => String(gate.id || '')));
25
+ const missingGates = requiredGates.filter((id) => !releaseGateIds.has(id));
26
+ assertGate(missingGates.length === 0, 'all-features:deep-completion release gates missing', { missing: missingGates });
17
27
  requireContains('all-features:deep-completion', 'src/core/feature-registry.ts', [
18
28
  'command_registry',
19
29
  'evidence_router',
@@ -21,7 +21,13 @@ function assertScript(name, expected) {
21
21
  issues.push(`package script ${name} must include ${expected}`);
22
22
  }
23
23
  const pkg = readJson('package.json');
24
+ const releaseManifest = readJson('release-gates.v2.json');
25
+ const releaseGateIds = new Set((Array.isArray(releaseManifest?.gates) ? releaseManifest.gates : [])
26
+ .filter((gate) => Array.isArray(gate?.preset) && gate.preset.includes('release'))
27
+ .map((gate) => String(gate.id || '')));
24
28
  assertScript('architecture:guard', 'node ./dist/scripts/architecture-guard-check.js');
29
+ if (!releaseGateIds.has('architecture:guard'))
30
+ issues.push('release-gates.v2.json release preset missing architecture:guard');
25
31
  assertIncludes('src/core/safety/ssot-guard.ts', 'solid_principles');
26
32
  assertIncludes('src/core/safety/ssot-guard.ts', 'single_responsibility');
27
33
  assertIncludes('src/core/safety/ssot-guard.ts', 'open_closed');
@@ -34,7 +40,8 @@ assertIncludes('src/core/pipeline-internals/runtime-core.ts', 'ssotGuardPolicyTe
34
40
  assertIncludes('src/core/pipeline-internals/runtime-gates.ts', 'validateSsotGuardArtifact');
35
41
  assertIncludes('src/core/pipeline-internals/runtime-gates.ts', "'ssot_guard'");
36
42
  assertIncludes('src/core/commands/team-command.ts', 'SSOT_GUARD_ARTIFACT');
37
- assertIncludes('src/scripts/release-parallel-check.ts', "task('architecture:guard'");
43
+ assertIncludes('src/scripts/release-parallel-check.ts', 'release-gate-dag-runner.js');
44
+ assertIncludes('src/scripts/release-parallel-check.ts', "'--preset', 'release', '--full'");
38
45
  assertIncludes('src/core/release/gate-manifest.ts', "'architecture:guard'");
39
46
  assertIncludes('src/core/release/gate-manifest.ts', "'architecture:'");
40
47
  assertIncludes('docs/architecture-ts-rust-boundary.md', '`architecture:guard`');
@@ -4,6 +4,7 @@ import fs from 'node:fs';
4
4
  import fsp from 'node:fs/promises';
5
5
  import path from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
+ import { writeTextAtomic } from '../core/fsx.js';
7
8
  const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
8
9
  const srcRoot = path.join(root, 'src');
9
10
  const distRoot = path.join(root, 'dist');
@@ -54,17 +55,20 @@ async function writeSkillsManifest() {
54
55
  const manifest = await generatePackagedSkillsManifest();
55
56
  const out = path.join(distRoot, 'config', 'skills-manifest.json');
56
57
  await fsp.mkdir(path.dirname(out), { recursive: true });
57
- await fsp.writeFile(out, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
58
+ await writeTextAtomic(out, `${JSON.stringify(manifest, null, 2)}\n`);
58
59
  }
59
60
  async function writeCommonJsBinScope() {
60
61
  const binDir = path.join(distRoot, 'bin');
61
62
  if (!fs.existsSync(binDir))
62
63
  return;
63
- await fsp.writeFile(path.join(binDir, 'package.json'), '{"type":"commonjs"}\n', 'utf8');
64
+ await writeTextAtomic(path.join(binDir, 'package.json'), '{"type":"commonjs"}\n');
64
65
  await rewriteIfPresent(path.join(binDir, 'sks.js'), (text) => stripSourceMap(text)
65
66
  .replace(/^import \{ PACKAGE_VERSION \} from '\.\.\/core\/version\.js';$/m, "const { PACKAGE_VERSION } = require('../core/version.js');")
66
67
  .replace(/\nexport \{\};\n?/, '\n'));
67
- await rewriteIfPresent(path.join(binDir, 'sks-dispatch.js'), (text) => `${stripSourceMap(text).replace(/^export async function runSks/m, 'async function runSks')}\nexports.runSks = runSks;\n`);
68
+ await rewriteIfPresent(path.join(binDir, 'sks-dispatch.js'), (text) => {
69
+ const next = stripGeneratedCommonJsExports(stripSourceMap(text).replace(/^export async function runSks/m, 'async function runSks'), ['runSks']);
70
+ return `${next}\n\nexports.runSks = runSks;\n`;
71
+ });
68
72
  await rewriteIfPresent(path.join(binDir, 'fast-inline.js'), (text) => {
69
73
  const names = [
70
74
  'rootJsonFastInline',
@@ -76,7 +80,8 @@ async function writeCommonJsBinScope() {
76
80
  for (const name of names) {
77
81
  next = next.replace(new RegExp(`^export (async )?function ${name}`, 'm'), '$1function ' + name);
78
82
  }
79
- return `${next}\n${names.map((name) => `exports.${name} = ${name};`).join('\n')}\n`;
83
+ next = stripGeneratedCommonJsExports(next, names);
84
+ return `${next}\n\n${names.map((name) => `exports.${name} = ${name};`).join('\n')}\n`;
80
85
  });
81
86
  await rewriteIfPresent(path.join(binDir, 'install.js'), (text) => stripSourceMap(text).replace(/^import \{ spawnSync \} from 'node:child_process';/m, "const { spawnSync } = require('node:child_process');"));
82
87
  }
@@ -84,11 +89,18 @@ async function rewriteIfPresent(file, rewrite) {
84
89
  if (!fs.existsSync(file))
85
90
  return;
86
91
  const text = await fsp.readFile(file, 'utf8');
87
- await fsp.writeFile(file, rewrite(text), 'utf8');
92
+ await writeTextAtomic(file, rewrite(text));
88
93
  }
89
94
  function stripSourceMap(text) {
90
95
  return text.replace(/\n\/\/# sourceMappingURL=.*\.map\s*$/s, '\n');
91
96
  }
97
+ function stripGeneratedCommonJsExports(text, names) {
98
+ const escaped = names.map((name) => name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
99
+ return text
100
+ .replace(new RegExp(`^exports\\.(${escaped}) = \\1;\\s*$`, 'gm'), '')
101
+ .replace(/\n{3,}/g, '\n\n')
102
+ .trimEnd();
103
+ }
92
104
  async function copyDirIfPresent(from, to) {
93
105
  if (!fs.existsSync(from))
94
106
  return;
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { spawn } from 'node:child_process';
5
+ import { tmpdir } from '../core/fsx.js';
6
+ const root = process.cwd();
7
+ const compiled = discover(path.join(root, 'dist'), (file) => file.endsWith('.test.js') && file.includes(`${path.sep}__tests__${path.sep}`));
8
+ const unit = discover(path.join(root, 'test', 'unit'), (file) => file.endsWith('.test.mjs'));
9
+ const files = [...compiled, ...unit].sort();
10
+ if (!compiled.length || !unit.length) {
11
+ console.error(JSON.stringify({
12
+ schema: 'sks.canonical-test-runner.v1',
13
+ ok: false,
14
+ compiled_tests: compiled.length,
15
+ unit_tests: unit.length,
16
+ blockers: ['canonical_test_surface_missing']
17
+ }));
18
+ process.exit(1);
19
+ }
20
+ const scratch = tmpdir('sks-canonical-test-');
21
+ let cleaned = false;
22
+ let finalized = false;
23
+ const removeScratchSync = () => {
24
+ if (cleaned)
25
+ return null;
26
+ try {
27
+ fs.rmSync(scratch, { recursive: true, force: true, maxRetries: 20, retryDelay: 50 });
28
+ if (!fs.existsSync(scratch)) {
29
+ cleaned = true;
30
+ return null;
31
+ }
32
+ return new Error(`canonical test scratch still exists after cleanup: ${scratch}`);
33
+ }
34
+ catch (error) {
35
+ return error instanceof Error ? error : new Error(String(error));
36
+ }
37
+ };
38
+ const cleanup = async () => {
39
+ if (cleaned)
40
+ return null;
41
+ const deadline = Date.now() + 2_000;
42
+ let lastError = null;
43
+ do {
44
+ lastError = removeScratchSync();
45
+ if (!lastError) {
46
+ // A just-terminated test descendant can recreate its temp directory a
47
+ // moment after the first rm. Require a short no-recreation window.
48
+ await delay(100);
49
+ if (!fs.existsSync(scratch))
50
+ return null;
51
+ cleaned = false;
52
+ lastError = new Error(`canonical test scratch was recreated during cleanup: ${scratch}`);
53
+ }
54
+ await delay(50);
55
+ } while (Date.now() < deadline);
56
+ return lastError ?? new Error(`canonical test scratch cleanup timed out: ${scratch}`);
57
+ };
58
+ process.once('exit', () => {
59
+ const error = removeScratchSync();
60
+ if (error)
61
+ console.error(`canonical test cleanup failed during exit: ${error.message}`);
62
+ });
63
+ const isolatedProcessGroup = process.platform !== 'win32';
64
+ const child = spawn(process.execPath, ['--test', '--test-concurrency=1', ...files, ...process.argv.slice(2)], {
65
+ cwd: root,
66
+ detached: isolatedProcessGroup,
67
+ env: {
68
+ ...process.env,
69
+ TMPDIR: scratch,
70
+ TMP: scratch,
71
+ TEMP: scratch,
72
+ SKS_TMP_DIR: scratch
73
+ },
74
+ stdio: 'inherit'
75
+ });
76
+ child.on('error', (error) => {
77
+ void finalize(1, null, error);
78
+ });
79
+ child.on('close', (code, signal) => {
80
+ void finalize(code ?? 1, signal, null);
81
+ });
82
+ const signals = ['SIGINT', 'SIGTERM', 'SIGHUP'];
83
+ const signalExitCodes = { SIGINT: 130, SIGTERM: 143, SIGHUP: 129 };
84
+ let forwardedSignal = null;
85
+ let signalTimer = null;
86
+ const signalHandlers = new Map();
87
+ for (const signal of signals) {
88
+ const handler = () => {
89
+ if (forwardedSignal)
90
+ return;
91
+ forwardedSignal = signal;
92
+ signalChildTree(signal);
93
+ signalTimer = setTimeout(() => {
94
+ signalChildTree('SIGKILL');
95
+ void finalize(signalExitCodes[signal], signal, null);
96
+ }, 5_000);
97
+ };
98
+ signalHandlers.set(signal, handler);
99
+ process.once(signal, handler);
100
+ }
101
+ function removeSignalHandlers() {
102
+ for (const [signal, handler] of signalHandlers)
103
+ process.removeListener(signal, handler);
104
+ }
105
+ async function finalize(code, signal, spawnError) {
106
+ if (finalized)
107
+ return;
108
+ finalized = true;
109
+ if (signalTimer)
110
+ clearTimeout(signalTimer);
111
+ await settleChildTree();
112
+ const cleanupError = await cleanup();
113
+ removeSignalHandlers();
114
+ if (spawnError)
115
+ console.error(`canonical test runner failed: ${spawnError.message}`);
116
+ if (cleanupError)
117
+ console.error(`canonical test cleanup failed: ${cleanupError.message}`);
118
+ if (forwardedSignal)
119
+ process.kill(process.pid, forwardedSignal);
120
+ else if (signal)
121
+ process.kill(process.pid, signal);
122
+ else
123
+ process.exitCode = spawnError || cleanupError ? 1 : code;
124
+ }
125
+ function signalChildTree(signal) {
126
+ if (!child.pid)
127
+ return;
128
+ if (isolatedProcessGroup) {
129
+ try {
130
+ process.kill(-child.pid, signal);
131
+ return;
132
+ }
133
+ catch { }
134
+ }
135
+ try {
136
+ child.kill(signal);
137
+ }
138
+ catch { }
139
+ }
140
+ function childTreeAlive() {
141
+ if (!isolatedProcessGroup || !child.pid)
142
+ return false;
143
+ try {
144
+ process.kill(-child.pid, 0);
145
+ return true;
146
+ }
147
+ catch {
148
+ return false;
149
+ }
150
+ }
151
+ async function settleChildTree() {
152
+ if (!childTreeAlive())
153
+ return;
154
+ signalChildTree('SIGTERM');
155
+ const termDeadline = Date.now() + 750;
156
+ while (childTreeAlive() && Date.now() < termDeadline)
157
+ await delay(25);
158
+ if (!childTreeAlive())
159
+ return;
160
+ signalChildTree('SIGKILL');
161
+ const killDeadline = Date.now() + 750;
162
+ while (childTreeAlive() && Date.now() < killDeadline)
163
+ await delay(25);
164
+ }
165
+ function delay(ms) {
166
+ return new Promise((resolve) => setTimeout(resolve, ms));
167
+ }
168
+ function discover(dir, accept) {
169
+ const out = [];
170
+ if (!fs.existsSync(dir))
171
+ return out;
172
+ const stack = [dir];
173
+ while (stack.length) {
174
+ const current = stack.pop();
175
+ if (!current)
176
+ continue;
177
+ const entries = fs.readdirSync(current, { withFileTypes: true });
178
+ for (const entry of entries) {
179
+ const file = path.join(current, entry.name);
180
+ if (entry.isDirectory())
181
+ stack.push(file);
182
+ else if (entry.isFile() && accept(file))
183
+ out.push(file);
184
+ }
185
+ }
186
+ return out;
187
+ }
188
+ //# sourceMappingURL=canonical-test-runner.js.map
@@ -5,15 +5,16 @@ import { spawnSync } from 'node:child_process';
5
5
  const root = process.cwd();
6
6
  const dir = path.join(root, 'src', 'core', 'commands');
7
7
  const failures = [];
8
- const changedFiles = changedFileSet();
8
+ const changeStats = changedFileStats();
9
9
  for (const file of fs.readdirSync(dir).filter((name) => name.endsWith('-command.ts'))) {
10
10
  const absolute = path.join(dir, file);
11
11
  const relPath = rel(absolute);
12
12
  const text = fs.readFileSync(absolute, 'utf8');
13
13
  const lines = text.split(/\r?\n/).length;
14
14
  const imports = [...text.matchAll(/^\s*import\s+/gm)].length;
15
- const changed = changedFiles.has(relPath);
16
- const baselineLines = baseLineCount(relPath);
15
+ const change = changeStats.get(relPath);
16
+ const changed = change !== undefined;
17
+ const baselineLines = change?.baselineLines ?? (changed ? null : lines);
17
18
  if (lines > 1800)
18
19
  failures.push(`${file}: line count ${lines} > 1800 hard ceiling`);
19
20
  if (baselineLines === null && lines > 400)
@@ -33,21 +34,42 @@ if (failures.length) {
33
34
  process.exit(1);
34
35
  }
35
36
  console.log('Command module budget check passed');
36
- function changedFileSet() {
37
- const out = new Set();
38
- for (const line of gitLines(['diff', '--name-only', 'HEAD', '--']))
39
- out.add(normalize(line));
40
- for (const line of gitLines(['ls-files', '--others', '--exclude-standard']))
41
- out.add(normalize(line));
37
+ function changedFileStats() {
38
+ const out = new Map();
39
+ const headFiles = new Set(gitLines(['ls-tree', '-r', '--name-only', 'HEAD', '--', 'src/core/commands']));
40
+ // One numstat process gives us enough information to reconstruct the
41
+ // baseline line count for every tracked command module. The old per-file
42
+ // `git show` loop spawned roughly sixty processes and could exceed the
43
+ // 15-second gate timeout when the canonical test runner was saturated.
44
+ // Disable rename collapsing so the current destination remains an exact
45
+ // path. A destination absent from HEAD is conservatively treated as new,
46
+ // matching the old `git show HEAD:<path>` behavior.
47
+ for (const line of gitLines(['diff', '--no-renames', '--numstat', 'HEAD', '--', 'src/core/commands'])) {
48
+ const [addedRaw, deletedRaw, ...pathParts] = line.split('\t');
49
+ const relPath = normalize(pathParts.join('\t'));
50
+ if (!relPath)
51
+ continue;
52
+ if (!headFiles.has(relPath)) {
53
+ out.set(relPath, { baselineLines: null });
54
+ continue;
55
+ }
56
+ const added = Number(addedRaw);
57
+ const deleted = Number(deletedRaw);
58
+ if (!Number.isFinite(added) || !Number.isFinite(deleted)) {
59
+ out.set(relPath, { baselineLines: null });
60
+ continue;
61
+ }
62
+ const absolute = path.join(root, relPath);
63
+ const currentLines = fs.existsSync(absolute)
64
+ ? fs.readFileSync(absolute, 'utf8').split(/\r?\n/).length
65
+ : 0;
66
+ out.set(relPath, { baselineLines: Math.max(0, currentLines - added + deleted) });
67
+ }
68
+ for (const line of gitLines(['ls-files', '--others', '--exclude-standard', '--', 'src/core/commands'])) {
69
+ out.set(normalize(line), { baselineLines: null });
70
+ }
42
71
  return out;
43
72
  }
44
- function baseLineCount(relPath) {
45
- const result = spawnSync('git', ['show', `HEAD:${relPath}`], { cwd: root, encoding: 'utf8', maxBuffer: 8 * 1024 * 1024 });
46
- if (result.status !== 0)
47
- return null;
48
- const text = String(result.stdout || '');
49
- return text ? text.split(/\r?\n/).length : 0;
50
- }
51
73
  function gitLines(args) {
52
74
  const result = spawnSync('git', args, { cwd: root, encoding: 'utf8' });
53
75
  if (result.status !== 0)
@@ -28,7 +28,7 @@ for (const file of await listFiles(path.join(root, 'src'))) {
28
28
  const bin = await read('src/bin/sks.ts');
29
29
  const main = await read('src/cli/main.ts');
30
30
  const router = await read('src/cli/router.ts');
31
- if (!bin.includes('../cli/main.js'))
31
+ if (!bin.includes('./sks-dispatch.js'))
32
32
  issues.push('bin_entrypoint');
33
33
  if (!main.includes('./router.js'))
34
34
  issues.push('main_router');
@@ -21,7 +21,6 @@ for (const relModule of registeredCommandModules()) {
21
21
  const disallowedImports = {
22
22
  'qa-loop-command.ts': ['research-command', 'ppt-command', 'team-command', 'gx-command'],
23
23
  'research-command.ts': ['qa-loop-command', 'ppt-command', 'team-command', 'gx-command'],
24
- 'db-command.ts': ['image-ux-review-command', 'ppt-command', 'computer-use-command'],
25
24
  'wiki-command.ts': ['team-command', 'research-command', 'qa-loop-command', 'ppt-command']
26
25
  };
27
26
  for (const [name, needles] of Object.entries(disallowedImports)) {
@@ -50,7 +50,7 @@ for (const rel of requiredFiles) {
50
50
  const runtimeRegistry = await import(pathToFileURL(path.join(root, 'dist', 'cli', 'command-registry.js')));
51
51
  const runtimeCommands = Object.keys(runtimeRegistry.COMMANDS || {}).sort();
52
52
  const typedText = fs.readFileSync(path.join(root, 'src', 'cli', 'command-registry.ts'), 'utf8');
53
- for (const name of ['help', 'version', 'commands', 'run', 'team', 'agent', 'trust', 'proof', 'db', 'git', 'wiki', 'bench', 'features']) {
53
+ for (const name of ['help', 'version', 'commands', 'run', 'team', 'agent', 'trust', 'proof', 'git', 'wiki', 'bench', 'features']) {
54
54
  if (!runtimeCommands.includes(name))
55
55
  issues.push(`typed_registry_runtime_missing:${name}`);
56
56
  if (!new RegExp(`\\b${name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*:`).test(typedText))
@@ -5,10 +5,14 @@ const mod = await importDist('core/codex-control/codex-multi-agent-event-normali
5
5
  const interrupt = mod.normalizeCodexMultiAgentEventName('interrupt_agent');
6
6
  const close = mod.normalizeCodexMultiAgentEventName('close_agent');
7
7
  const start = mod.normalizeCodexMultiAgentEventName('spawn_agent');
8
+ const currentClose = mod.normalizeCodexMultiAgentEventName('closeAgent');
9
+ const currentStart = mod.normalizeCodexMultiAgentEventName('spawnAgent');
8
10
  assertGate(interrupt.canonical === 'interrupt_agent' && interrupt.stage === 'result', 'interrupt_agent must map to result stage', interrupt);
9
11
  assertGate(close.canonical === 'close_agent' && close.stage === 'result', 'close_agent must remain result stage', close);
10
12
  assertGate(start.canonical === 'start_agent' && start.stage === 'start', 'spawn_agent must map to start stage', start);
13
+ assertGate(currentClose.canonical === 'close_agent' && currentClose.stage === 'result', '0.144.1 closeAgent must map to result stage', currentClose);
14
+ assertGate(currentStart.canonical === 'start_agent' && currentStart.stage === 'start', '0.144.1 spawnAgent must map to start stage', currentStart);
11
15
  const runtimeCore = readText('src/core/pipeline-internals/runtime-core.ts');
12
16
  assertGate(runtimeCore.includes('normalizeCodexMultiAgentEventName'), 'runtime-core subagent evidence must use the 0.139 normalizer');
13
- emitGate('codex:0139-interrupt-agent', { canonical_events: [interrupt.canonical, close.canonical, start.canonical] });
17
+ emitGate('codex:0139-interrupt-agent', { canonical_events: [interrupt.canonical, close.canonical, start.canonical, currentClose.canonical, currentStart.canonical] });
14
18
  //# sourceMappingURL=codex-0139-interrupt-agent-check.js.map
@@ -1,25 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import { assertGate, emitGate, readText } from './sks-1-18-gate-lib.js';
3
3
  import { createCodexAppServerV2Client, currentTimeResponse } from '../core/codex-control/codex-app-server-v2-client.js';
4
- const requireReal = process.argv.includes('--require-real') || process.env.SKS_REQUIRE_CODEX_0142_APP_SERVER === '1';
4
+ import { CURRENT_CODEX_RELEASE_MANIFEST } from '../core/codex-compat/codex-release-manifest.js';
5
+ const requireReal = process.argv.includes('--require-real') || process.env.SKS_REQUIRE_CODEX_0144_APP_SERVER === '1';
5
6
  const clientSource = readText('src/core/codex-control/codex-app-server-v2-client.ts');
6
- const schema = readText('schemas/codex/app-server-0.142/codex_app_server_protocol.v2.schemas.json');
7
+ const schema = readText('schemas/codex/app-server-0.144/codex_app_server_protocol.v2.schemas.json');
7
8
  assertGate(clientSource.includes('resolveCodexRuntime'), 'app-server-v2 client must use the shared Codex runtime resolver');
8
9
  assertGate(clientSource.includes('currentTime/read'), 'app-server-v2 client must implement currentTime/read server request handling');
9
10
  assertGate(clientSource.includes("request('thread/list'"), 'app-server-v2 client must wrap native thread/list');
10
11
  assertGate(clientSource.includes("request('thread/read'"), 'app-server-v2 client must wrap native thread/read');
11
12
  assertGate(clientSource.includes('searchThreads'), 'app-server-v2 client must expose search over native thread list searchTerm');
12
- assertGate(schema.includes('"thread/list"'), 'generated 0.142 schema must contain thread/list');
13
- assertGate(schema.includes('"thread/read"'), 'generated 0.142 schema must contain thread/read');
14
- assertGate(schema.includes('"searchTerm"'), 'generated 0.142 schema must contain ThreadListParams.searchTerm');
15
- assertGate(schema.includes('"ThreadSearchResult"'), 'generated 0.142 schema must contain ThreadSearchResult');
13
+ assertGate(schema.includes('"thread/list"'), 'generated 0.144.1 schema must contain thread/list');
14
+ assertGate(schema.includes('"thread/read"'), 'generated 0.144.1 schema must contain thread/read');
15
+ assertGate(schema.includes('"searchTerm"'), 'generated 0.144.1 schema must contain ThreadListParams.searchTerm');
16
+ assertGate(schema.includes('"ThreadSearchResult"'), 'generated 0.144.1 schema must contain ThreadSearchResult');
16
17
  const deterministic = currentTimeResponse(new Date('2026-06-23T00:00:00.000Z'));
17
18
  assertGate(deterministic.utcIso === '2026-06-23T00:00:00.000Z', 'currentTime/read UTC ISO must be deterministic');
18
19
  assertGate(deterministic.unixTimeSeconds === 1782172800, 'currentTime/read seconds must be Unix UTC seconds');
19
20
  assertGate(deterministic.timezone === 'UTC', 'currentTime/read canonical timezone must be UTC');
20
21
  let realProbe = null;
21
22
  if (requireReal) {
22
- const { client, runtimeIdentity } = await createCodexAppServerV2Client({ requestedBy: 'codex-0142-app-server-v2-check' });
23
+ const { client, runtimeIdentity } = await createCodexAppServerV2Client({ requestedBy: 'codex-0144-app-server-v2-check' });
23
24
  try {
24
25
  await client.initialize();
25
26
  const list = await client.listThreads({ limit: 1, useStateDbOnly: true });
@@ -28,14 +29,14 @@ if (requireReal) {
28
29
  runtime_sha256: runtimeIdentity.sha256,
29
30
  list_returned_object: Boolean(list && typeof list === 'object')
30
31
  };
31
- assertGate(runtimeIdentity.version === '0.142.0', 'app-server-v2 require-real must resolve Codex 0.142.0', realProbe);
32
+ assertGate(runtimeIdentity.version === CURRENT_CODEX_RELEASE_MANIFEST.requiredCliVersion, `app-server-v2 require-real must resolve Codex ${CURRENT_CODEX_RELEASE_MANIFEST.requiredCliVersion}`, realProbe);
32
33
  assertGate(realProbe.list_returned_object === true, 'app-server-v2 require-real thread/list must return an object', realProbe);
33
34
  }
34
35
  finally {
35
36
  await client.close();
36
37
  }
37
38
  }
38
- emitGate('codex:0142:app-server-v2', {
39
+ emitGate('codex:0144:app-server-v2', {
39
40
  current_time_handler: true,
40
41
  thread_list: true,
41
42
  thread_read: true,
@@ -43,4 +44,4 @@ emitGate('codex:0142:app-server-v2', {
43
44
  thread_search_via_list_search_term: true,
44
45
  real_probe: realProbe
45
46
  });
46
- //# sourceMappingURL=codex-0142-app-server-v2-check.js.map
47
+ //# sourceMappingURL=codex-0144-app-server-v2-check.js.map
@@ -3,15 +3,15 @@ import { assertGate, emitGate } from './sks-1-18-gate-lib.js';
3
3
  import { CURRENT_CODEX_RELEASE_MANIFEST } from '../core/codex-compat/codex-release-manifest.js';
4
4
  import { compareSemverLike } from '../core/codex-compat/codex-version-policy.js';
5
5
  import { resolveCodexRuntime } from '../core/codex-runtime/resolve-codex-runtime.js';
6
- const resolved = await resolveCodexRuntime({ requestedBy: 'codex-0142-binary-identity-check' });
6
+ const resolved = await resolveCodexRuntime({ requestedBy: 'codex-0144-binary-identity-check' });
7
7
  assertGate(resolved.ok && resolved.identity !== null, 'Codex runtime identity must resolve', resolved);
8
8
  const identity = resolved.identity;
9
- assertGate(compareSemverLike(identity.version, CURRENT_CODEX_RELEASE_MANIFEST.requiredCliVersion) >= 0, 'Codex runtime must satisfy 0.142.0', identity);
9
+ assertGate(compareSemverLike(identity.version, CURRENT_CODEX_RELEASE_MANIFEST.requiredCliVersion) >= 0, `Codex runtime must satisfy ${CURRENT_CODEX_RELEASE_MANIFEST.requiredCliVersion}`, identity);
10
10
  assertGate(identity.sha256.length === 64, 'Codex runtime identity must include SHA-256', identity);
11
- emitGate('codex:0142:binary-identity', {
11
+ emitGate('codex:0144:binary-identity', {
12
12
  realpath: identity.realpath,
13
13
  version: identity.version,
14
14
  sha256: identity.sha256,
15
15
  source: identity.source
16
16
  });
17
- //# sourceMappingURL=codex-0142-binary-identity-check.js.map
17
+ //# sourceMappingURL=codex-0144-binary-identity-check.js.map