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
@@ -1,203 +1,6 @@
1
1
  #!/usr/bin/env node
2
- // @ts-nocheck
3
- // $Naruto Shadow Clone Swarm gate.
4
- // Proves Naruto can queue a 100-clone roster while active work stays bounded by
5
- // the desktop-safe resource governor.
6
- import { spawnSync } from 'node:child_process';
7
- import fs from 'node:fs';
8
- import os from 'node:os';
9
- import path from 'node:path';
10
- import { assertGate, emitGate, importDist, root, exists } from './sks-1-18-gate-lib.js';
11
- const schema = await importDist('core/agents/agent-schema.js');
12
- const roster = await importDist('core/agents/agent-roster.js');
13
- const scheduler = await importDist('core/agents/agent-scheduler.js');
14
- const effortPolicy = await importDist('core/agents/agent-effort-policy.js');
15
- // 1) Naruto ceiling exists and is 100; standard ceiling untouched at 20.
16
- assertGate(schema.MAX_NARUTO_AGENT_COUNT === 100, 'MAX_NARUTO_AGENT_COUNT must be 100', { value: schema.MAX_NARUTO_AGENT_COUNT });
17
- assertGate(schema.MAX_AGENT_COUNT === 20, 'MAX_AGENT_COUNT must remain 20 (standard ceiling)', { value: schema.MAX_AGENT_COUNT });
18
- // 2) Roster size can reach 100, but every scheduler caller stays desktop-safe.
19
- const narutoSlots = scheduler.normalizeTargetActiveSlots(100, schema.MAX_NARUTO_AGENT_COUNT);
20
- const defaultSlots = scheduler.normalizeTargetActiveSlots(100);
21
- assertGate(narutoSlots === 4, 'normalizeTargetActiveSlots(100, naruto-max) must retain the desktop-safe cap', { narutoSlots });
22
- assertGate(defaultSlots === 4, 'normalizeTargetActiveSlots(100) must stay desktop-safe', { defaultSlots });
23
- // 3) A 100-clone roster builds 100 unique clones (no unique-persona ceiling).
24
- const fullRoster = roster.buildNarutoCloneRoster({ clones: 100, maxAgentCount: schema.MAX_NARUTO_AGENT_COUNT });
25
- const uniqueIds = new Set(fullRoster.roster.map((row) => row.id)).size;
26
- assertGate(fullRoster.agent_count === 100, 'clone roster must have 100 clones', { agent_count: fullRoster.agent_count });
27
- assertGate(uniqueIds === 100, 'clone roster ids must be unique', { uniqueIds });
28
- assertGate(fullRoster.max_agents === 100, 'clone roster max_agents must be 100', { max_agents: fullRoster.max_agents });
29
- // 4) Over-cap is clamped, not crashed.
30
- const overCap = roster.buildNarutoCloneRoster({ clones: 500, maxAgentCount: schema.MAX_NARUTO_AGENT_COUNT });
31
- assertGate(overCap.agent_count === 100, 'clones above the ceiling clamp to 100', { agent_count: overCap.agent_count });
32
- // 4b) Naruto-only GPT-5.6 family policy. The old low/medium cap is gone.
33
- const effortRoster = roster.buildNarutoCloneRoster({ clones: 24, prompt: 'review and summarize the current findings', maxAgentCount: schema.MAX_NARUTO_AGENT_COUNT });
34
- const efforts = new Set(effortRoster.roster.map((row) => row.reasoning_effort));
35
- const modelTiers = new Set(effortRoster.roster.map((row) => row.model_tier));
36
- const modelEfforts = new Set(effortRoster.roster.map((row) => row.model_reasoning_effort));
37
- const tiers = new Set(effortRoster.roster.map((row) => row.service_tier));
38
- const fastFlags = new Set(effortRoster.roster.map((row) => row.fast_mode));
39
- assertGate([...efforts].every((effort) => effort === 'xhigh' || effort === 'max'), 'Naruto clone efforts must use only xhigh/max', { efforts: [...efforts] });
40
- assertGate([...effortRoster.roster].every((row) => ['gpt-5.6-luna', 'gpt-5.6-terra', 'gpt-5.6-sol'].includes(row.model)), 'Naruto workers must use only the GPT-5.6 trio', { models: [...new Set(effortRoster.roster.map((row) => row.model))] });
41
- assertGate([...modelTiers].every((tier) => /gpt-5\.6-(?:luna|terra|sol)-(?:xhigh|max)/.test(tier)), 'Naruto model tiers must record exact GPT-5.6 model and effort', { modelTiers: [...modelTiers] });
42
- assertGate([...modelEfforts].every((effort) => effort === 'xhigh' || effort === 'max'), 'Naruto model reasoning must use xhigh/max', { modelEfforts: [...modelEfforts] });
43
- assertGate([...tiers].length === 1 && tiers.has('fast'), 'every naruto clone must be fast service tier', { tiers: [...tiers] });
44
- assertGate([...fastFlags].length === 1 && fastFlags.has(true), 'every naruto clone must have fast_mode=true', { fastFlags: [...fastFlags] });
45
- // 4c) Deterministic work-kind matrix.
46
- const coding = effortPolicy.decideNarutoCloneEffort({ persona: { role: 'implementer', naruto_role: 'implementer' }, prompt: 'implement a normal coding feature' });
47
- const criticalCoding = effortPolicy.decideNarutoCloneEffort({ persona: { role: 'implementer', naruto_role: 'implementer' }, prompt: 'implement a critical security migration' });
48
- const refactor = effortPolicy.decideNarutoCloneEffort({ persona: { role: 'integrator', naruto_role: 'integrator' }, prompt: 'refactor the architecture and integration plan' });
49
- const e2e = effortPolicy.decideNarutoCloneEffort({ persona: { role: 'browser e2e verifier', naruto_role: 'verifier' }, prompt: 'run browser e2e tests' });
50
- const forensicGui = effortPolicy.decideNarutoCloneEffort({ persona: { role: 'Computer Use GUI verifier', naruto_role: 'verifier' }, prompt: 'forensic cross-app failure verification' });
51
- assertGate(coding.model === 'gpt-5.6-terra' && coding.model_reasoning_effort === 'xhigh', 'ordinary coding must use Terra xhigh', { coding });
52
- assertGate(criticalCoding.model === 'gpt-5.6-terra' && criticalCoding.model_reasoning_effort === 'max', 'critical coding must use Terra max', { criticalCoding });
53
- assertGate(refactor.model === 'gpt-5.6-sol' && refactor.model_reasoning_effort === 'max', 'refactor/architecture/integration must use Sol max', { refactor });
54
- assertGate(e2e.model === 'gpt-5.6-luna' && e2e.model_reasoning_effort === 'xhigh', 'browser E2E must use Luna xhigh', { e2e });
55
- assertGate(forensicGui.model === 'gpt-5.6-luna' && forensicGui.model_reasoning_effort === 'max', 'forensic Computer Use GUI verification must use Luna max', { forensicGui });
56
- // 5) System-safe concurrency: never spawn the whole count at once; throttle to host capacity.
57
- const fakeSafe = roster.systemSafeNarutoConcurrency({ backend: 'fake' });
58
- const heavySafe = roster.systemSafeNarutoConcurrency({ backend: 'codex-sdk' });
59
- const lowFreeButCapable = roster.systemSafeNarutoConcurrency({
60
- backend: 'codex-sdk',
61
- cores: 10,
62
- freeBytes: 512 * 1024 * 1024,
63
- totalBytes: 16 * 1024 * 1024 * 1024
64
- });
65
- assertGate(fakeSafe.cap >= 1 && fakeSafe.cap <= 4, 'fake-backend active concurrency cap must stay in [1, 4]', { fakeSafe });
66
- assertGate(heavySafe.cap >= 1 && heavySafe.cap <= 4, 'heavy-backend active concurrency cap must stay in [1, 4]', { heavySafe });
67
- assertGate(heavySafe.cap <= fakeSafe.cap, 'heavy backend must throttle no looser than the light backend', { heavySafe, fakeSafe });
68
- assertGate(heavySafe.cores >= 1, 'must detect at least one core', { cores: heavySafe.cores });
69
- assertGate(lowFreeButCapable.cap === 1, 'low free memory must collapse active Codex concurrency to one worker', { lowFreeButCapable });
70
- const bigMemoryHost = roster.systemSafeNarutoConcurrency({ backend: 'codex-sdk', cores: 4, freeBytes: 48 * 1024 * 1024 * 1024, totalBytes: 64 * 1024 * 1024 * 1024 });
71
- assertGate(bigMemoryHost.cap >= 1 && bigMemoryHost.cap <= 4, 'large memory must not bypass the interactive CPU cap', { bigMemoryHost });
72
- // 6) A small end-to-end run proves the same queue/drain path. The direct roster
73
- // assertions above cover the 100-clone ceiling without making this release
74
- // gate create dozens of unnecessary worker processes.
75
- const proofClones = 6;
76
- const proofConcurrency = 4;
77
- const cli = path.join(root, 'dist', 'bin', 'sks.js');
78
- const isolatedWorktreeRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'sks-naruto-shadow-wt-'));
79
- const childEnv = { ...process.env, SKS_WORKTREE_ROOT: isolatedWorktreeRoot, SKS_DISABLE_GIT_WORKTREE: '1' };
80
- assertGate(exists('dist/bin/sks.js'), 'dist/bin/sks.js missing (build first)');
81
- const helpRun = spawnSync(process.execPath, [cli, 'naruto', '--help', '--json'], { cwd: root, env: childEnv, encoding: 'utf8', timeout: 30000, maxBuffer: 1024 * 1024 });
82
- const helpParsed = parseJson(helpRun.stdout);
83
- assertGate(helpRun.status === 0 && helpParsed?.action === 'help', 'sks naruto --help must emit help instead of launching a run', { status: helpRun.status, stdout: tail(helpRun.stdout), stderr: tail(helpRun.stderr) });
84
- const run = spawnSync(process.execPath, [
85
- cli, 'naruto', 'run', 'shadow clone swarm gate proof',
86
- '--clones', String(proofClones),
87
- '--backend', 'fake',
88
- '--work-items', String(proofClones),
89
- '--concurrency', String(proofConcurrency),
90
- '--json',
91
- '--no-open-zellij'
92
- ], { cwd: root, env: childEnv, encoding: 'utf8', timeout: 780000, maxBuffer: 8 * 1024 * 1024 });
93
- const parsed = parseJson(run.stdout);
94
- assertGate(parsed !== null, 'sks naruto run must emit JSON', { stdout: tail(run.stdout), stderr: tail(run.stderr) });
95
- let state = {};
96
- withMissionRouteClose(parsed, childEnv, () => {
97
- assertGate(run.status === 0, 'sks naruto run must exit 0', { status: run.status, stderr: tail(run.stderr) });
98
- assertGate(parsed.ok === true, 'naruto run must be ok', { ok: parsed.ok });
99
- assertGate(parsed.mode === 'NARUTO' && parsed.jutsu === 'kage_bunshin_no_jutsu', 'naruto run must report NARUTO mode', { mode: parsed.mode, jutsu: parsed.jutsu });
100
- assertGate(parsed.clones === proofClones, 'clone fan-out must use the requested queued count', { clones: parsed.clones });
101
- assertGate(parsed.max_clones === 100, 'naruto run must advertise the 100 ceiling', { max_clones: parsed.max_clones });
102
- assertGate(parsed.proof === 'passed', 'naruto run proof must pass', { proof: parsed.proof });
103
- // Throttle invariant: active concurrency never exceeds the requested count nor the host cap.
104
- assertGate(parsed.target_active_slots >= 1 && parsed.target_active_slots <= proofClones, 'active slots must be in [1, clones]', { target_active_slots: parsed.target_active_slots });
105
- assertGate(parsed.target_active_slots <= fakeSafe.cap, 'active slots must be throttled to the system-safe cap', { target_active_slots: parsed.target_active_slots, cap: fakeSafe.cap });
106
- assertGate(parsed.target_active_slots <= proofConcurrency && parsed.target_active_slots <= 4, 'release proof must keep Naruto live slots desktop-safe while queued fan-out remains larger', { target_active_slots: parsed.target_active_slots, proofConcurrency });
107
- // Task 9.1: fan-out (clones) and live concurrency (target_active_slots) are reported
108
- // distinctly, and concurrency_capped truthfully reflects "N clones, running M at a time".
109
- assertGate(typeof parsed.concurrency_capped === 'boolean', 'naruto run must report concurrency_capped', { concurrency_capped: parsed.concurrency_capped });
110
- assertGate(parsed.concurrency_capped === (parsed.clones > parsed.target_active_slots), 'concurrency_capped must reflect clones > live slots', { clones: parsed.clones, target_active_slots: parsed.target_active_slots, concurrency_capped: parsed.concurrency_capped });
111
- assertGate(parsed.system && Number(parsed.system.safe_concurrency) >= 1, 'naruto run must report system safe_concurrency (host-derived cap)', { system: parsed.system });
112
- assertGate(parsed.work_graph?.write_allowed_count > 0 && parsed.work_graph?.mixed_work_kinds?.length > 1, 'naruto run must report a mixed work graph with write-capable items', { work_graph: parsed.work_graph });
113
- assertGate(Number(parsed.work_graph?.parallel_write_wave_count || 0) > 0, 'naruto run must expose at least one parallel write-capable wave with non-overlapping leases', { work_graph: parsed.work_graph });
114
- assertGate(parsed.role_distribution?.verifier_only === false, 'naruto run proof/status must distinguish active worker roles beyond verifier-only', { role_distribution: parsed.role_distribution });
115
- assertGate(Number(parsed.role_distribution?.implementation_like_ratio || 0) >= 0.4, 'naruto run must include implementation-like role distribution', { role_distribution: parsed.role_distribution });
116
- assertGate(parsed.local_worker?.auto_select_eligible === false, 'normal Naruto must never auto-select a local/Ollama backend', { local_worker: parsed.local_worker });
117
- const commandGraphPath = path.join(root, '.sneakoscope', 'missions', parsed.mission_id, 'agents', 'naruto-work-graph.json');
118
- const commandGraph = JSON.parse(fs.readFileSync(commandGraphPath, 'utf8'));
119
- const writePaths = commandGraph.work_items.filter((row) => row.write_allowed).flatMap((row) => row.write_paths);
120
- assertGate(new Set(writePaths).size > 1, 'naruto command default patch-envelope leases must be per work item, not one shared write path', { sample: writePaths.slice(0, 8), unique: new Set(writePaths).size });
121
- assertGate(commandGraph.active_waves.some((wave) => wave.write_paths.length > 1), 'naruto command graph must contain a parallel write wave when route-local patch envelopes do not overlap', { waves: commandGraph.active_waves.slice(0, 3) });
122
- state = parsed.run?.scheduler?.state || parsed.run?.scheduler || {};
123
- assertGate(Number(state.completed_count) === Number(parsed.work_graph?.total_work_items || 0) && Number(state.completed_count) >= proofClones, 'all clone work items must complete despite throttling', { completed_count: state.completed_count, total_work_items: parsed.work_graph?.total_work_items, proofClones });
124
- assertGate(parsed.target_active_slots <= 4, 'explicit --concurrency cannot bypass the desktop-safe cap', { target_active_slots: parsed.target_active_slots });
125
- });
126
- // 7) A small request is never inflated; live pressure may still reduce it.
127
- const small = spawnSync(process.execPath, [cli, 'naruto', 'run', 'tiny', '--clones', '2', '--backend', 'fake', '--work-items', '2', '--json', '--no-open-zellij'], { cwd: root, env: childEnv, encoding: 'utf8', timeout: 600000, maxBuffer: 4 * 1024 * 1024 });
128
- const smallParsed = parseJson(small.stdout);
129
- withMissionRouteClose(smallParsed, childEnv, () => {
130
- assertGate(small.status === 0 && smallParsed?.target_active_slots >= 1 && smallParsed?.target_active_slots <= 2, 'a 2-clone run must stay within [1, 2] active workers', {
131
- status: small.status,
132
- target_active_slots: smallParsed?.target_active_slots,
133
- stdout: tail(small.stdout),
134
- stderr: tail(small.stderr)
135
- });
136
- });
137
- // 8) Naruto clones always run fast. Per-route --no-fast / standard-tier requests
138
- // are intentionally not honored for shadow clones.
139
- const standardOptOut = spawnSync(process.execPath, [cli, 'naruto', 'run', 'fast opt-out ignored', '--clones', '2', '--backend', 'fake', '--work-items', '2', '--no-fast', '--service-tier', 'standard', '--json', '--no-open-zellij'], { cwd: root, env: childEnv, encoding: 'utf8', timeout: 600000, maxBuffer: 4 * 1024 * 1024 });
140
- const standardOptOutParsed = parseJson(standardOptOut.stdout);
141
- withMissionRouteClose(standardOptOutParsed, childEnv, () => {
142
- assertGate(standardOptOut.status === 0 && standardOptOutParsed?.fast_mode_policy?.fast_mode === true && standardOptOutParsed?.fast_mode_policy?.service_tier === 'fast', 'naruto --no-fast / --service-tier standard must still run clones in fast mode', {
143
- status: standardOptOut.status,
144
- fast_mode_policy: standardOptOutParsed?.fast_mode_policy,
145
- stderr: tail(standardOptOut.stderr)
146
- });
147
- });
148
- emitGate('naruto:shadow-clone-swarm', {
149
- max_naruto_agent_count: schema.MAX_NARUTO_AGENT_COUNT,
150
- standard_ceiling: schema.MAX_AGENT_COUNT,
151
- default_clamp: defaultSlots,
152
- naruto_slots_at_100: narutoSlots,
153
- proof_clones: proofClones,
154
- proof_concurrency: proofConcurrency,
155
- target_active_slots: parsed.target_active_slots,
156
- fake_safe_cap: fakeSafe.cap,
157
- heavy_safe_cap: heavySafe.cap,
158
- low_free_capable_cap: lowFreeButCapable.cap,
159
- cores: heavySafe.cores,
160
- completed_count: state.completed_count,
161
- standard_opt_out_service_tier: standardOptOutParsed?.fast_mode_policy?.service_tier,
162
- mission_id: parsed.mission_id,
163
- isolated_worktree_root: isolatedWorktreeRoot
164
- });
165
- function parseJson(text) {
166
- try {
167
- return JSON.parse(text);
168
- }
169
- catch {
170
- return null;
171
- }
172
- }
173
- function tail(value, limit = 2000) {
174
- const text = String(value || '');
175
- return text.length <= limit ? text : text.slice(-limit);
176
- }
177
- function closeMission(missionId, env) {
178
- assertGate(Boolean(missionId), 'naruto proof mission id missing before route close', { missionId });
179
- const closed = spawnSync(process.execPath, [cli, 'route', 'close', '--mission', String(missionId), '--json'], {
180
- cwd: root,
181
- env,
182
- encoding: 'utf8',
183
- timeout: 30000,
184
- maxBuffer: 1024 * 1024
185
- });
186
- const parsedClose = parseJson(closed.stdout);
187
- assertGate(closed.status === 0 && parsedClose?.ok === true, 'naruto proof mission route close must succeed', {
188
- missionId,
189
- status: closed.status,
190
- stdout: tail(closed.stdout),
191
- stderr: tail(closed.stderr)
192
- });
193
- }
194
- function withMissionRouteClose(parsedResult, env, verify) {
195
- try {
196
- return verify();
197
- }
198
- finally {
199
- if (parsedResult?.mission_id)
200
- closeMission(parsedResult.mission_id, env);
201
- }
202
- }
2
+ // Compatibility entrypoint retained for the historical packed blackbox name.
3
+ // The 6.1.1 Naruto contract is the Codex official subagent workflow.
4
+ await import('./official-subagent-workflow-check.js');
5
+ export {};
203
6
  //# sourceMappingURL=naruto-shadow-clone-swarm-check.js.map
@@ -4,13 +4,14 @@ import fs from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import { spawnSync } from 'node:child_process';
6
6
  import { DEFAULT_MAX_PACK_BYTES } from '../core/release/package-size-budget.js';
7
+ import { readCurrentNpmPackProof, writeNpmPackProof } from '../core/release/npm-pack-proof.js';
7
8
  import { assertGate, emitGate, root } from './sks-1-18-gate-lib.js';
8
9
  const MAX_FILES = Number(process.env.SKS_MAX_PACK_FILES || 2100);
9
10
  const MAX_PACKED = Number(process.env.SKS_MAX_PACK_BYTES || DEFAULT_MAX_PACK_BYTES);
10
11
  const BUDGET_MS = Number(process.env.SKS_PACK_BUDGET_MS || 30000);
11
12
  function runNpmPack() {
12
13
  const npmCli = process.env.npm_execpath; // set when invoked via `npm run`
13
- const argv = ['pack', '--dry-run', '--json', '--ignore-scripts'];
14
+ const argv = ['pack', '--dry-run', '--ignore-scripts', '--json'];
14
15
  const res = npmCli
15
16
  ? spawnSync(process.execPath, [npmCli, ...argv], { cwd: root, encoding: 'utf8', maxBuffer: 32 * 1024 * 1024 })
16
17
  : spawnSync('npm', argv, { cwd: root, encoding: 'utf8', maxBuffer: 32 * 1024 * 1024 });
@@ -21,17 +22,23 @@ function writeReport(report) {
21
22
  fs.mkdirSync(path.dirname(out), { recursive: true });
22
23
  fs.writeFileSync(out, `${JSON.stringify(report, null, 2)}\n`);
23
24
  }
24
- const t0 = Date.now();
25
- const res = runNpmPack();
26
- const packMs = Date.now() - t0;
27
- let info;
28
- if (res.status === 0) {
29
- try {
30
- const parsed = JSON.parse(res.stdout);
31
- info = Array.isArray(parsed) ? parsed[0] : parsed;
32
- }
33
- catch {
34
- info = undefined;
25
+ const existingProof = readCurrentNpmPackProof(root);
26
+ let packMs = existingProof.ok && existingProof.proof ? existingProof.proof.pack_ms : 0;
27
+ let info = existingProof.ok && existingProof.proof ? existingProof.proof.info : undefined;
28
+ if (!info) {
29
+ const t0 = Date.now();
30
+ const res = runNpmPack();
31
+ packMs = Date.now() - t0;
32
+ if (res.status === 0) {
33
+ try {
34
+ const parsed = JSON.parse(res.stdout);
35
+ info = Array.isArray(parsed) ? parsed[0] : parsed;
36
+ if (info)
37
+ writeNpmPackProof(root, info, packMs);
38
+ }
39
+ catch {
40
+ info = undefined;
41
+ }
35
42
  }
36
43
  }
37
44
  if (!info) {
@@ -45,6 +52,7 @@ const report = {
45
52
  schema: 'sks.npm-publish-performance.v1',
46
53
  ok: info.entryCount <= MAX_FILES && info.size <= MAX_PACKED,
47
54
  pack_ms: packMs,
55
+ reused_pack_proof: existingProof.ok,
48
56
  slowest_phase: 'pack',
49
57
  file_count: info.entryCount,
50
58
  packed_bytes: info.size,
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { assertGate, emitGate, root } from './sks-1-18-gate-lib.js';
6
+ import { buildOfficialSubagentPrompt } from '../core/subagents/official-subagent-prompt.js';
7
+ import { SUBAGENT_PARENT_SUMMARY_FILENAME, persistOrReuseTrustworthySubagentParentSummary, writeSubagentEvidence } from '../core/subagents/subagent-evidence.js';
8
+ import { resolveSubagentThreadBudget } from '../core/subagents/thread-budget.js';
9
+ import { runOfficialSubagentWorkflow } from '../core/subagents/official-subagent-runner.js';
10
+ const counts = [4, 8, 12, 20, 100].map((requested) => resolveSubagentThreadBudget({
11
+ requested,
12
+ configuredMaxThreads: requested === 20 ? 12 : undefined
13
+ }));
14
+ const implicitCount = resolveSubagentThreadBudget();
15
+ assertGate(implicitCount.requestedSubagents === 1, 'implicit Naruto must default to one safe child', implicitCount);
16
+ assertGate(counts[0]?.requestedSubagents === 4, 'requested 4 must remain 4', counts);
17
+ assertGate(counts[1]?.requestedSubagents === 8, 'requested 8 must remain 8', counts);
18
+ assertGate(counts[2]?.requestedSubagents === 12, 'requested 12 must remain 12', counts);
19
+ assertGate(counts[3]?.requestedSubagents === 20 && counts[3]?.firstWave === 12 && counts[3]?.waveCount === 2, 'requested 20/maxThreads 12 must plan two waves without a 4/5 cap', counts);
20
+ assertGate(counts[4]?.requestedSubagents === 32, 'requested 100 must use the official hard safety cap 32', counts);
21
+ const prompt = buildOfficialSubagentPrompt({
22
+ goal: 'Review independent packages and report one parent summary.',
23
+ slices: [],
24
+ requestedSubagents: 12,
25
+ maxThreads: 12,
26
+ decompositionStatus: 'parent_required'
27
+ });
28
+ assertGate(/worker/i.test(prompt) && /expert/i.test(prompt), 'official delegation prompt must include worker and expert policy', { prompt });
29
+ assertGate(/wait|await/i.test(prompt) && /all/i.test(prompt), 'official delegation prompt must require waiting for every requested subagent', { prompt });
30
+ assertGate(/max.depth|max_depth|depth\s*1/i.test(prompt), 'official delegation prompt must keep max depth at 1', { prompt });
31
+ const fixture = fs.mkdtempSync(path.join(os.tmpdir(), 'sks-official-subagent-gate-'));
32
+ try {
33
+ const events = [
34
+ { event: 'SubagentStart', agent: 'worker', thread_id: 'a1' },
35
+ { event: 'SubagentStart', agent: 'worker', thread_id: 'a2' },
36
+ { event: 'SubagentStart', agent: 'expert', thread_id: 'a3' },
37
+ { event: 'SubagentStop', agent: 'worker', thread_id: 'a1' },
38
+ { event: 'SubagentStop', agent: 'worker', thread_id: 'a2' },
39
+ { event: 'SubagentStop', agent: 'expert', thread_id: 'a3' }
40
+ ];
41
+ const structuredParentSummary = {
42
+ schema: 'sks.subagent-parent-summary.v1',
43
+ status: 'completed',
44
+ summary: 'All three official subagents completed and the parent integrated their findings.',
45
+ thread_outcomes: ['a1', 'a2', 'a3'].map((thread_id) => ({ thread_id, status: 'completed', summary: `${thread_id} complete` })),
46
+ changed_files: [],
47
+ verification: [],
48
+ blockers: []
49
+ };
50
+ const persistedParentSummary = await persistOrReuseTrustworthySubagentParentSummary(fixture, structuredParentSummary);
51
+ const persistedParentSummaryFile = JSON.parse(fs.readFileSync(path.join(fixture, SUBAGENT_PARENT_SUMMARY_FILENAME), 'utf8'));
52
+ assertGate(persistedParentSummaryFile.schema === 'sks.subagent-parent-summary.v1' && persistedParentSummaryFile.thread_outcomes.length === 3, 'structured parent summary must persist under the canonical artifact name', persistedParentSummaryFile);
53
+ const reusedParentSummary = await persistOrReuseTrustworthySubagentParentSummary(fixture, 'prose retry must not replace durable structured evidence');
54
+ assertGate(JSON.stringify(reusedParentSummary) === JSON.stringify(structuredParentSummary), 'untrusted prose must not downgrade a persisted trustworthy parent summary', { reusedParentSummary });
55
+ const explicitFailure = 'The parent integration failed with an error and did not complete.';
56
+ const failedParentSummary = await persistOrReuseTrustworthySubagentParentSummary(fixture, explicitFailure);
57
+ assertGate(failedParentSummary === explicitFailure && !fs.existsSync(path.join(fixture, SUBAGENT_PARENT_SUMMARY_FILENAME)), 'explicit failure prose must invalidate persisted successful parent evidence', { failedParentSummary });
58
+ const contradictedParentSummary = await persistOrReuseTrustworthySubagentParentSummary(fixture, structuredParentSummary, { workflowStatus: 'parent_failed' });
59
+ assertGate(contradictedParentSummary === null && !fs.existsSync(path.join(fixture, SUBAGENT_PARENT_SUMMARY_FILENAME)), 'failed parent workflow must override and invalidate a contradictory completed summary', { contradictedParentSummary });
60
+ const restoredParentSummary = await persistOrReuseTrustworthySubagentParentSummary(fixture, structuredParentSummary);
61
+ const evidence = await writeSubagentEvidence(fixture, {
62
+ requestedSubagents: 3,
63
+ events,
64
+ parentSummary: restoredParentSummary,
65
+ workflowStatus: 'completed',
66
+ preparationOnly: false
67
+ });
68
+ assertGate(evidence.ok === true && evidence.parent_summary_trustworthy === true, 'matched official SubagentStart/SubagentStop events plus a structured parent summary must pass', evidence);
69
+ assertGate(evidence.started_threads === 3 && evidence.completed_threads === 3 && evidence.failed_threads === 0, 'official event counts must be normalized without PID evidence', evidence);
70
+ assertGate(Array.isArray(evidence.event_sources) && evidence.event_sources.includes('SubagentStart') && evidence.event_sources.includes('SubagentStop'), 'official hook event sources must be retained', evidence);
71
+ const proseOnly = await writeSubagentEvidence(fixture, {
72
+ requestedSubagents: 3,
73
+ events,
74
+ parentSummary: 'All subagents stopped successfully.',
75
+ workflowStatus: 'completed',
76
+ preparationOnly: false
77
+ });
78
+ assertGate(proseOnly.ok === false && proseOnly.parent_summary_trustworthy === false && proseOnly.ambiguous_stop_thread_ids.length === 3, 'prose-only parent output must fail closed', proseOnly);
79
+ const ambiguous = await writeSubagentEvidence(fixture, {
80
+ requestedSubagents: 3,
81
+ events,
82
+ parentSummary: { ...structuredParentSummary, status: 'success' },
83
+ workflowStatus: 'completed',
84
+ preparationOnly: false
85
+ });
86
+ assertGate(ambiguous.ok === false && ambiguous.blockers.includes('parent_summary_status_ambiguous'), 'ambiguous parent status must fail closed', ambiguous);
87
+ const blocked = await writeSubagentEvidence(fixture, {
88
+ requestedSubagents: 3,
89
+ events,
90
+ parentSummary: {
91
+ ...structuredParentSummary,
92
+ status: 'blocked',
93
+ summary: 'Integration is blocked on a required result.',
94
+ thread_outcomes: structuredParentSummary.thread_outcomes.map((row) => ({ ...row, status: 'blocked', summary: `${row.thread_id} blocked` })),
95
+ blockers: ['fixture_blocker']
96
+ },
97
+ workflowStatus: 'blocked',
98
+ preparationOnly: false
99
+ });
100
+ assertGate(blocked.ok === false && blocked.parent_summary_status === 'failed', 'blocked parent outcomes must fail closed', blocked);
101
+ const failedResultText = await writeSubagentEvidence(fixture, {
102
+ requestedSubagents: 3,
103
+ events: events.map((row) => row.event === 'SubagentStop' && row.thread_id === 'a2'
104
+ ? { ...row, last_assistant_message: 'The delegated slice failed with an error.' }
105
+ : row),
106
+ parentSummary: structuredParentSummary,
107
+ workflowStatus: 'completed',
108
+ preparationOnly: false
109
+ });
110
+ assertGate(failedResultText.ok === false && failedResultText.failed_thread_ids.includes('a2'), 'unambiguous failed result text must override a contradictory completed claim', failedResultText);
111
+ let nestedLaunch = false;
112
+ const appResult = await runOfficialSubagentWorkflow({
113
+ root,
114
+ prompt,
115
+ requestedSubagents: 3,
116
+ maxThreads: 12,
117
+ appSession: true,
118
+ runProcessImpl: async () => {
119
+ nestedLaunch = true;
120
+ throw new Error('nested launch forbidden');
121
+ }
122
+ });
123
+ assertGate(nestedLaunch === false && appResult.ok === false && appResult.status === 'delegation_context_ready' && appResult.completion_evidence === false, 'in-app preparation must not launch nested codex or count as completion', appResult);
124
+ const facade = fs.readFileSync(path.join(root, 'src', 'core', 'commands', 'naruto-command.ts'), 'utf8');
125
+ const preparationOwner = fs.readFileSync(path.join(root, 'src', 'core', 'subagents', 'official-subagent-preparation.ts'), 'utf8');
126
+ assertGate(!facade.includes('naruto-command-legacy') && !fs.existsSync(path.join(root, 'src', 'core', 'commands', 'naruto-command-legacy.ts')), 'legacy Naruto process swarm command must be removed and unreachable');
127
+ assertGate(!facade.includes("from '../agents/agent-orchestrator.js'") && !facade.includes("from '../agents/native-cli-session-swarm.js'"), 'default Naruto facade must not eager-import the process orchestrator');
128
+ assertGate(facade.includes('prepareOfficialSubagentMission'), 'Naruto facade must delegate preparation to the shared official-subagent owner');
129
+ assertGate(preparationOwner.includes('delegation_prompt: delegationPrompt'), 'canonical subagent plan must persist the official delegation prompt required by the stop gate');
130
+ emitGate('naruto:official-subagent-workflow', {
131
+ requested_counts: counts.map((row) => row.requestedSubagents),
132
+ max_threads: counts.map((row) => row.maxThreads),
133
+ event_evidence: {
134
+ started: evidence.started_threads,
135
+ completed: evidence.completed_threads,
136
+ failed: evidence.failed_threads
137
+ },
138
+ app_nested_launch: nestedLaunch,
139
+ native_process_proof_required: false
140
+ });
141
+ }
142
+ finally {
143
+ fs.rmSync(fixture, { recursive: true, force: true });
144
+ }
145
+ //# sourceMappingURL=official-subagent-workflow-check.js.map
@@ -1,27 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import { spawnSync } from 'node:child_process';
3
- import fs from 'node:fs';
4
- import os from 'node:os';
5
2
  import path from 'node:path';
6
3
  import { assertGate, emitGate, readJson, root } from './sks-1-18-gate-lib.js';
4
+ import { readCurrentNpmPackProof } from '../core/release/npm-pack-proof.js';
7
5
  const pkg = readJson('package.json');
8
6
  const scripts = pkg.scripts || {};
9
- const cacheRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'sks-package-published-contract-'));
10
- const dry = spawnSync('npm', ['pack', '--dry-run', '--json', '--ignore-scripts'], {
11
- cwd: root,
12
- encoding: 'utf8',
13
- env: {
14
- ...process.env,
15
- npm_config_cache: path.join(cacheRoot, 'npm-cache')
16
- },
17
- maxBuffer: 16 * 1024 * 1024
18
- });
19
- assertGate(dry.status === 0, 'npm pack --dry-run must succeed for package contract check', {
20
- status: dry.status,
21
- stderr: dry.stderr
22
- });
23
- const parsed = JSON.parse(dry.stdout || '[]');
24
- const files = new Set((parsed[0]?.files || []).map((row) => String(row.path || '').replace(/\\/g, '/')));
7
+ const packProof = readCurrentNpmPackProof(root);
8
+ assertGate(packProof.ok && packProof.proof, 'current npm pack proof is required for package contract check', { blockers: packProof.blockers });
9
+ const info = packProof.proof.info;
10
+ const files = new Set((info.files || []).map((row) => String(row.path || '').replace(/\\/g, '/')));
25
11
  const missingTargets = [];
26
12
  for (const [name, command] of Object.entries(scripts)) {
27
13
  for (const target of scriptTargets(String(command))) {
@@ -38,7 +24,7 @@ emitGate('package:published-contract', {
38
24
  files: files.size,
39
25
  script_count: Object.keys(scripts).length,
40
26
  missing_targets: 0,
41
- package: path.basename(parsed[0]?.filename || '')
27
+ package: path.basename(info.filename || '')
42
28
  });
43
29
  function scriptTargets(command) {
44
30
  const targets = [];
@@ -4,10 +4,11 @@ import fs from 'node:fs';
4
4
  import os from 'node:os';
5
5
  import path from 'node:path';
6
6
  import { spawnSync } from 'node:child_process';
7
- import { DEFAULT_MAX_PACK_BYTES } from '../core/release/package-size-budget.js';
7
+ import { DEFAULT_MAX_PACK_BYTES, DEFAULT_MAX_UNPACKED_BYTES } from '../core/release/package-size-budget.js';
8
+ import { writeNpmPackProof } from '../core/release/npm-pack-proof.js';
8
9
  import { assertGate, emitGate, root } from './sks-1-18-gate-lib.js';
9
10
  const MAX_FILES = Number(process.env.SKS_MAX_PACK_FILES || 2100);
10
- const MAX_UNPACKED = Number(process.env.SKS_MAX_UNPACKED_BYTES || 10 * 1024 * 1024);
11
+ const MAX_UNPACKED = Number(process.env.SKS_MAX_UNPACKED_BYTES || DEFAULT_MAX_UNPACKED_BYTES);
11
12
  // Raised from 2300 KiB after the 5.4.0 dollar-command hardening pass added
12
13
  // src/core/feature-fixture-executor.ts and expanded several command modules
13
14
  // (route-success-helpers.ts, seo-command.ts, ppt-command.ts, qa-loop-command.ts,
@@ -33,7 +34,7 @@ function runNpmPack() {
33
34
  const npmCli = process.env.npm_execpath; // set when invoked via `npm run`
34
35
  const npmCache = process.env.SKS_RELEASE_NPM_CACHE || path.join(os.tmpdir(), 'sneakoscope-npm-cache');
35
36
  fs.mkdirSync(npmCache, { recursive: true });
36
- const argv = ['pack', '--dry-run', '--json', '--ignore-scripts'];
37
+ const argv = ['pack', '--dry-run', '--ignore-scripts', '--json'];
37
38
  const opts = {
38
39
  cwd: root,
39
40
  encoding: 'utf8',
@@ -49,7 +50,9 @@ function runNpmPack() {
49
50
  : spawnSync('npm', argv, opts);
50
51
  return res;
51
52
  }
53
+ const packStarted = Date.now();
52
54
  const res = runNpmPack();
55
+ const packMs = Date.now() - packStarted;
53
56
  assertGate(res.status === 0, 'npm_pack_failed', { stderr: res.stderr });
54
57
  let info;
55
58
  try {
@@ -60,6 +63,7 @@ catch (err) {
60
63
  assertGate(false, 'npm_pack_unparseable', { error: String(err && err.message ? err.message : err) });
61
64
  }
62
65
  const files = info.files.map((f) => f.path);
66
+ const packProof = writeNpmPackProof(root, info, packMs);
63
67
  const runtimeManifest = JSON.parse(fs.readFileSync(path.join(root, 'runtime-required-scripts.json'), 'utf8'));
64
68
  assertGate(runtimeManifest.schema === 'sks.runtime-required-scripts.v1' && Array.isArray(runtimeManifest.scripts), 'runtime required scripts manifest invalid', runtimeManifest);
65
69
  assertGate(info.entryCount <= MAX_FILES, 'packlist_file_count_over_limit', { entryCount: info.entryCount, max_files: MAX_FILES });
@@ -72,6 +76,9 @@ for (const entry of runtimeManifest.scripts) {
72
76
  assertGate(files.includes('package.json'), 'packlist_missing_runtime_entry', { missing: 'package.json' });
73
77
  assertGate(files.includes('README.md'), 'packlist_missing_runtime_entry', { missing: 'README.md' });
74
78
  assertGate(files.includes('LICENSE'), 'packlist_missing_runtime_entry', { missing: 'LICENSE' });
79
+ for (const manifest of ['release-gates.v2.json', 'infra-harness-gates.json', 'runtime-required-scripts.json']) {
80
+ assertGate(files.includes(manifest), 'packlist_missing_runtime_manifest', { missing: manifest });
81
+ }
75
82
  assertGate(files.some((f) => f.startsWith('schemas/')), 'packlist_missing_runtime_entry', { missing: 'schemas/' });
76
83
  const forbidden = files.filter((f) => f.startsWith('test/') ||
77
84
  f.startsWith('src/') ||
@@ -93,6 +100,10 @@ const report = {
93
100
  entryCount: info.entryCount,
94
101
  size: info.size,
95
102
  unpackedSize: info.unpackedSize,
103
+ pack_ms: packMs,
104
+ pack_proof_id: packProof.proof_id,
105
+ pack_info_sha256: packProof.info_digest,
106
+ pack_file_list_sha256: packProof.file_list_digest,
96
107
  runtime_required_scripts: runtimeManifest.scripts.map((entry) => entry.path),
97
108
  runtime_required_missing: runtimeManifest.scripts.filter((entry) => !files.includes(entry.path)).map((entry) => entry.path),
98
109
  max_files: MAX_FILES,
@@ -112,6 +123,9 @@ const surfaceReport = {
112
123
  max_file_count: SURFACE_MAX_FILES,
113
124
  actual_tarball_bytes: info.size,
114
125
  actual_file_count: info.entryCount,
126
+ pack_proof_id: packProof.proof_id,
127
+ pack_info_sha256: packProof.info_digest,
128
+ pack_file_list_sha256: packProof.file_list_digest,
115
129
  forbidden_globs: [
116
130
  'dist/**/__tests__/**',
117
131
  'dist/**/*.test.js',
@@ -19,9 +19,9 @@ for (const rel of [
19
19
  }
20
20
  await runFixture();
21
21
  const releaseSource = read('src/scripts/release-parallel-check.ts');
22
- for (const token of ['runVerificationDag', 'buildVerificationDag', 'writeParallelVerificationProof']) {
22
+ for (const token of ['release-gate-dag-runner.js', "'--preset', 'release', '--full'", 'spawnSync(process.execPath']) {
23
23
  if (!releaseSource.includes(token))
24
- issues.push(`release_parallel_runner_missing:${token}`);
24
+ issues.push(`release_parallel_redirect_missing:${token}`);
25
25
  }
26
26
  const result = { schema: 'sks.parallel-verification-engine-check.v1', ok: issues.length === 0, issues };
27
27
  console.log(JSON.stringify(result, null, 2));
@@ -7,6 +7,8 @@ import { root, assertGate, emitGate, readText } from './sks-1-18-gate-lib.js';
7
7
  // side-effects by default. This is STATIC source analysis only — we never execute
8
8
  // `postinstall`, because doing so would mutate the global Codex App / shell environment.
9
9
  const helpers = readText('src/cli/install-helpers.ts');
10
+ const desktopConfigPolicy = readText('src/core/codex-runtime/codex-desktop-config-policy.ts');
11
+ const codexConfigGuard = readText('src/core/codex/codex-config-guard.ts');
10
12
  // Heavy CLI tool installs (brew / npm globals) are opt-in only.
11
13
  assertGate(helpers.includes('SKS_POSTINSTALL_AUTO_INSTALL_CLI_TOOLS'), 'postinstall cli tool install must be gated behind SKS_POSTINSTALL_AUTO_INSTALL_CLI_TOOLS');
12
14
  // Killing a third-party app's processes is opt-in only.
@@ -15,9 +17,12 @@ assertGate(helpers.includes('runPostinstallProjectRetentionCleanup') && helpers.
15
17
  // Config writes are gated (unparseable preserved / unsafe rewrite skipped) and backed up.
16
18
  assertGate(helpers.includes('unparseable_config_preserved'), 'postinstall must preserve unparseable config');
17
19
  assertGate(helpers.includes('skipped_unsafe_rewrite'), 'postinstall must skip unsafe config rewrites');
18
- assertGate(helpers.includes('backupCodexConfig'), 'postinstall config writes must back up the existing config');
19
- // User model / service_tier are set-if-absent, never overwritten.
20
- assertGate(helpers.includes('upsertTopLevelTomlStringIfAbsent'), 'postinstall must set user model/service_tier only when absent');
20
+ assertGate(desktopConfigPolicy.includes('backupCodexConfig'), 'postinstall config writes must back up the existing config');
21
+ // Host-owned feature choices are set-if-absent, and model/reasoning keys are
22
+ // changed only when bounded SKS provenance proves SKS created them.
23
+ assertGate(desktopConfigPolicy.includes('upsertTomlTableKeyIfAbsent')
24
+ && desktopConfigPolicy.includes('removeLegacyTopLevelCodexModeLocks')
25
+ && codexConfigGuard.includes('hasSksModeLockProvenance'), 'postinstall must preserve host-owned feature/model choices');
21
26
  // The postinstall() body must be wrapped in try/catch/finally so it never fails `npm install`.
22
27
  const postinstallStart = helpers.indexOf('export async function postinstall');
23
28
  assertGate(postinstallStart !== -1, 'postinstall function not found in install-helpers.ts');
@@ -3,6 +3,8 @@
3
3
  import { assertGate, emitGate, readMissionJson, runPptReview } from './sks-1-11-gate-lib.js';
4
4
  const result = runPptReview('review');
5
5
  const proof = readMissionJson(result.mission_id, 'completion-proof.json');
6
- assertGate(proof.status !== 'verified' && result.proof_evidence.status === 'verified_partial', 'ppt mock fixture was allowed to claim fully real evidence', { proof_status: proof.status, evidence_status: result.proof_evidence.status });
6
+ assertGate(proof.status === 'mock_only'
7
+ && result.proof_evidence.status === 'blocked'
8
+ && (result.proof_evidence.blockers || []).some((blocker) => String(blocker).includes('mock_fixture')), 'ppt mock fixture was allowed to claim fully real evidence', { proof_status: proof.status, evidence_status: result.proof_evidence.status, blockers: result.proof_evidence.blockers || [] });
7
9
  emitGate('ppt:no-mock-as-real', { mission_id: result.mission_id, proof_status: proof.status });
8
10
  //# sourceMappingURL=ppt-no-mock-as-real-check.js.map