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
@@ -4,6 +4,7 @@ import { managedProxyEnvForChild } from '../codex/managed-proxy-env.js';
4
4
  import { agentWorkerEnv, validateAgentWorkerResult } from './agent-worker-pipeline.js';
5
5
  import { fastModeEnv, resolveFastModePolicy } from './fast-mode-policy.js';
6
6
  import { buildCodexExecArgs } from '../codex/codex-cli-syntax-builder.js';
7
+ import { codexLbRecoveryBlockedProcessResult, withCodexLbCliLaunchRecovery } from '../codex-control/codex-lb-launch-recovery.js';
7
8
  export function buildCodexExecAgentArgs(agent, prompt, opts = {}) {
8
9
  const resultFile = opts.resultFile || defaultCodexResultFile(agent, opts);
9
10
  const sandbox = opts.workspaceWrite ? 'workspace-write' : 'read-only';
@@ -44,6 +45,7 @@ export async function runCodexExecAgent(agent, slice, opts = {}) {
44
45
  const command = buildCodexExecAgentArgs(agent, opts.prompt || slice?.description || '', opts);
45
46
  const proxyEnv = managedProxyEnvForChild({ ...process.env, ...(opts.env || {}) });
46
47
  const report = await writeCodexProcessReport(opts.agentRoot || opts.cwd || process.cwd(), agent, {
48
+ project_hash: opts.projectHash || agent.project_hash || agent.root_hash || null,
47
49
  command: [opts.codexBin || 'codex', ...command.args],
48
50
  profile: opts.profile || null,
49
51
  result_file: command.resultFile,
@@ -71,9 +73,21 @@ export async function runCodexExecAgent(agent, slice, opts = {}) {
71
73
  const stderrFile = path.join(logRoot, 'codex-exec.stderr.log');
72
74
  const allowedCommandsFile = path.join(opts.agentRoot || opts.cwd || process.cwd(), 'agent-allowed-commands.json');
73
75
  const workerEnv = agentWorkerEnv(agent, allowedCommandsFile);
74
- const proxyEnv = managedProxyEnvForChild({ ...process.env, ...(opts.env || {}) });
75
- const result = await runProcess(opts.codexBin || 'codex', command.args, { cwd: opts.cwd || process.cwd(), env: { ...(opts.env || {}), ...proxyEnv, ...fastModeEnv(fastPolicy), ...workerEnv }, timeoutMs: opts.timeoutMs || 30 * 60 * 1000, maxOutputBytes: 256 * 1024, stdoutFile, stderrFile });
76
+ const effectiveEnv = { ...process.env, ...(opts.env || {}) };
77
+ const proxyEnv = managedProxyEnvForChild(effectiveEnv);
78
+ const execute = opts.runProcessImpl || runProcess;
79
+ const guarded = await withCodexLbCliLaunchRecovery({
80
+ root: opts.cwd || process.cwd(),
81
+ env: effectiveEnv,
82
+ cliArgs: command.args.slice(0, -1),
83
+ ...(typeof opts.recoveryFetch === 'function' ? { fetchImpl: opts.recoveryFetch } : {}),
84
+ ...(opts.recoveryTimeoutMs === undefined ? {} : { timeoutMs: opts.recoveryTimeoutMs })
85
+ }, () => execute(opts.codexBin || 'codex', command.args, { cwd: opts.cwd || process.cwd(), env: { ...(opts.env || {}), ...proxyEnv, ...fastModeEnv(fastPolicy), ...workerEnv }, timeoutMs: opts.timeoutMs || 30 * 60 * 1000, maxOutputBytes: 256 * 1024, stdoutFile, stderrFile }));
86
+ const result = guarded.launched
87
+ ? guarded.value
88
+ : codexLbRecoveryBlockedProcessResult(guarded.toolOutputRecovery);
76
89
  const report = await writeCodexProcessReport(opts.agentRoot || opts.cwd || process.cwd(), agent, {
90
+ project_hash: opts.projectHash || agent.project_hash || agent.root_hash || null,
77
91
  command: [opts.codexBin || 'codex', ...command.args],
78
92
  profile: opts.profile || null,
79
93
  result_file: command.resultFile,
@@ -97,6 +111,7 @@ export async function runCodexExecAgent(agent, slice, opts = {}) {
97
111
  stderr_bytes: result.stderrBytes,
98
112
  truncated: result.truncated,
99
113
  timed_out: result.timedOut,
114
+ codex_lb_tool_output_recovery: guarded.toolOutputRecovery,
100
115
  dry_run: false
101
116
  });
102
117
  if (result.code === 0) {
@@ -121,7 +136,7 @@ export async function runCodexExecAgent(agent, slice, opts = {}) {
121
136
  return { ...validated, status: 'blocked', blockers: [...validated.blockers, 'codex_exec_result_schema_invalid'] };
122
137
  }
123
138
  }
124
- return validateAgentWorkerResult({ mission_id: opts.missionId || opts.mission_id || '', agent_id: agent.id, session_id: agent.session_id, persona_id: agent.persona_id || agent.id, task_slice_id: slice?.id || '', status: result.code === 0 ? 'done' : 'failed', backend: 'codex-exec', summary: result.stdout.slice(-1000) || result.stderr.slice(-1000), artifacts: [command.resultFile, report], blockers: result.code === 0 ? ['codex_exec_output_last_message_missing_or_invalid'] : ['codex_exec_exit_' + result.code], confidence: 'verified_partial', unverified: result.code === 0 ? ['codex-exec stdout fallback; resultFile JSON missing or invalid'] : [], writes: [], source_intelligence_refs: agent.source_intelligence_refs || null, goal_mode_ref: agent.goal_mode_ref || null, verification: { status: result.code === 0 ? 'partial' : 'failed', checks: ['codex-exec-exit-code', 'codex-exec-process-report', 'codex-exec-output-last-message'] } });
139
+ return validateAgentWorkerResult({ mission_id: opts.missionId || opts.mission_id || '', agent_id: agent.id, session_id: agent.session_id, persona_id: agent.persona_id || agent.id, task_slice_id: slice?.id || '', status: result.code === 0 ? 'done' : 'failed', backend: 'codex-exec', summary: result.stdout.slice(-1000) || result.stderr.slice(-1000), artifacts: [command.resultFile, report], blockers: result.code === 0 ? ['codex_exec_output_last_message_missing_or_invalid'] : [...(guarded.launched ? [] : guarded.toolOutputRecovery.blockers), 'codex_exec_exit_' + result.code], confidence: 'verified_partial', unverified: result.code === 0 ? ['codex-exec stdout fallback; resultFile JSON missing or invalid'] : [], writes: [], source_intelligence_refs: agent.source_intelligence_refs || null, goal_mode_ref: agent.goal_mode_ref || null, codex_child_report: { tool_output_recovery: guarded.toolOutputRecovery }, verification: { status: result.code === 0 ? 'partial' : 'failed', checks: ['codex-exec-exit-code', 'codex-exec-process-report', 'codex-exec-output-last-message'] } });
125
140
  }
126
141
  function workerNoMcpDefault(agent, opts = {}, sandbox = 'read-only') {
127
142
  if (opts.noMcp !== undefined)
@@ -48,6 +48,7 @@ export async function runProcessAgent(agent, slice, opts = {}) {
48
48
  }
49
49
  const result = await runProcess(opts.command[0], opts.command.slice(1), { cwd: opts.cwd || process.cwd(), env: { ...(opts.env || {}), ...fastModeEnv(fastPolicy) }, timeoutMs: opts.timeoutMs || 30000, maxOutputBytes: 128 * 1024 });
50
50
  const report = await writeAgentProcessReport(opts.agentRoot || opts.cwd || process.cwd(), agent, 'process', {
51
+ project_hash: opts.projectHash || agent.project_hash || agent.root_hash || null,
51
52
  command: opts.command,
52
53
  service_tier: fastPolicy.service_tier,
53
54
  fast_mode: fastPolicy.fast_mode,
@@ -1,3 +1,4 @@
1
+ export { DEFAULT_NARUTO_MAX_THREADS, DEFAULT_NARUTO_REQUESTED_SUBAGENTS, HARD_NARUTO_MAX_THREADS } from '../subagents/thread-budget.js';
1
2
  export const AGENT_KERNEL_SCHEMA = 'sks.native-agent-kernel.v1';
2
3
  export const AGENT_RESULT_SCHEMA = 'sks.agent-result.v1';
3
4
  export const AGENT_LEDGER_EVENT_SCHEMA = 'sks.agent-ledger-event.v1';
@@ -9,9 +10,9 @@ export const AGENT_COUNT = DEFAULT_AGENT_COUNT;
9
10
  export const AGENT_INTAKE_STAGE_ID = 'native_agent_intake';
10
11
  export const MAX_AGENT_COUNT = 20;
11
12
  export const DEFAULT_AGENT_CONCURRENCY = 4;
12
- // Naruto may queue a large roster, but active workers are governed separately and
13
- // remain bounded by live CPU, memory, load, and I/O pressure.
13
+ /** @deprecated Legacy process-swarm queue ceiling; never an official thread cap. */
14
14
  export const MAX_NARUTO_AGENT_COUNT = 100;
15
+ /** @deprecated Legacy clone default; official workflows use one safe default child unless --agents is explicit. */
15
16
  export const DEFAULT_NARUTO_CLONES = 8;
16
17
  export const AGENT_BACKENDS = ['fake', 'process', 'codex-sdk', 'zellij', 'ollama', 'local-llm'];
17
18
  export function normalizeAgentBackend(input) {
@@ -18,17 +18,15 @@ export function resolveFastModePolicy(input = {}) {
18
18
  ? 'standard'
19
19
  : preference?.mode === 'standard'
20
20
  ? 'standard'
21
- : explicitFast || explicitTier === 'fast' || preference?.mode === 'fast'
22
- ? 'fast'
23
- : 'standard';
21
+ : 'fast';
24
22
  return {
25
23
  schema: FAST_MODE_POLICY_SCHEMA,
26
24
  generated_at: nowIso(),
27
25
  fast_mode: serviceTier === 'fast',
28
26
  service_tier: serviceTier,
29
27
  codex_desktop_service_tier: codexDesktopServiceTier(serviceTier),
30
- default_fast_mode: false,
31
- disabled_by: explicitNoFast ? 'no-fast' : explicitTier === 'standard' ? 'service-tier-standard' : preference?.mode === 'standard' ? 'preference-standard' : serviceTier === 'standard' ? 'default-standard' : 'none',
28
+ default_fast_mode: true,
29
+ disabled_by: explicitNoFast ? 'no-fast' : explicitTier === 'standard' ? 'service-tier-standard' : preference?.mode === 'standard' ? 'preference-standard' : 'none',
32
30
  explicit_fast: explicitFast,
33
31
  explicit_no_fast: explicitNoFast,
34
32
  explicit_service_tier: explicitTier,
@@ -435,7 +435,7 @@ class NativeCliSessionSwarmRecorder {
435
435
  headless_by_design_viewport_ui: process.env.SKS_ZELLIJ_LEGACY_WORKER_PANES === '1' ? 0 : this.input.targetActiveSlots
436
436
  },
437
437
  active_workers: this.input.targetActiveSlots,
438
- visible_panes: Number(process.env.SKS_ZELLIJ_VIEWPORTS || 4),
438
+ visible_panes: Number(process.env.SKS_ZELLIJ_VIEWPORTS || 1),
439
439
  headless_workers: process.env.SKS_ZELLIJ_LEGACY_WORKER_PANES === '1' ? Math.max(0, this.input.targetActiveSlots - this.zellijVisiblePaneCap(input.ctx.opts)) : this.input.targetActiveSlots,
440
440
  queue_depth: Math.max(0, this.input.requestedAgents - this.input.targetActiveSlots),
441
441
  local_llm: { tps: 0, queue: 0 },
@@ -12,6 +12,7 @@ import { CODEX_AGENT_WORKER_RESULT_SCHEMA_ID, codexAgentWorkerResultSchema } fro
12
12
  import { leanEngineeringCompactText, leanPolicyReference } from '../lean-engineering-policy.js';
13
13
  import { readCodexLbModelCatalog, readLbHealth } from '../codex-lb/codex-lb-env.js';
14
14
  import { categoryForWorkerRole, isNarutoGpt56Model, modelRouteReason, routeModel } from '../provider/model-router.js';
15
+ import { codexTimeoutClassForRoute } from '../codex-control/codex-reliability-shield.js';
15
16
  export const NATIVE_WORKER_BACKEND_ROUTER_SCHEMA = 'sks.native-worker-backend-router.v1';
16
17
  export async function runNativeWorkerBackendRouter(input) {
17
18
  const root = path.resolve(input.agentRoot);
@@ -147,7 +148,7 @@ export async function runNativeWorkerBackendRouter(input) {
147
148
  zellijPaneId: await readZellijPaneId(root, input.workerDirRel),
148
149
  reliabilityPolicy: {
149
150
  maxEmptyResultRetries: 1,
150
- timeoutClass: 'standard'
151
+ timeoutClass: codexTimeoutClassForRoute(input.intake.route, 'standard')
151
152
  }
152
153
  });
153
154
  outputLastMessagePath = sdkTask.workerResultPath;
@@ -1,9 +1,50 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- const IGNORE = new Set(['.git', 'node_modules', 'dist', 'target', '.sneakoscope', '.codex', '.agents', '.next', '.turbo']);
3
+ const IGNORE = new Set([
4
+ '.agents', '.cache', '.claude', '.codex', '.git', '.git-worktrees', '.hg', '.mypy_cache', '.next', '.npm', '.nuxt',
5
+ '.nyc_output', '.parcel-cache', '.pnpm-store', '.pytest_cache', '.ruff_cache', '.sneakoscope', '.svelte-kit', '.svn',
6
+ '.tmp', '.turbo', '.venv', '.worktrees', '.yarn', '__pycache__', 'build', 'coverage', 'dist', 'logs', 'node_modules',
7
+ 'out', 'target', 'temp', 'tmp', 'venv'
8
+ ]);
9
+ const PRIORITY_DIRS = ['src', 'test', 'docs', 'schemas', 'scripts', 'crates', 'bin'];
10
+ const REPRESENTATIVE_DIRS = ['src', 'test', 'docs'];
11
+ const CORE_FILES = ['package.json', 'package-lock.json', 'README.md', 'CHANGELOG.md', 'LICENSE', 'tsconfig.json', 'release-gates.v2.json', 'runtime-required-scripts.json', 'AGENTS.md'];
4
12
  export async function collectRepoInventory(root, opts = {}) {
5
13
  const files = [];
6
- await walk(root, root, files, opts.maxFiles || Number(process.env.SKS_AGENT_REPO_INVENTORY_MAX_FILES || 10000));
14
+ const seen = new Set();
15
+ const requestedMax = Number(opts.maxFiles ?? process.env.SKS_AGENT_REPO_INVENTORY_MAX_FILES ?? 10000);
16
+ const maxFiles = Number.isFinite(requestedMax) ? Math.max(1, Math.floor(requestedMax)) : 10000;
17
+ const add = (file) => {
18
+ if (files.length >= maxFiles || seen.has(file))
19
+ return;
20
+ seen.add(file);
21
+ files.push(file);
22
+ };
23
+ // Seed representative source/test/docs entries before any large tree can
24
+ // exhaust the cap, then expand the priority roots in a stable order.
25
+ for (const name of REPRESENTATIVE_DIRS) {
26
+ const representative = await firstFile(root, path.join(root, name));
27
+ if (representative)
28
+ add(representative);
29
+ }
30
+ for (const name of CORE_FILES) {
31
+ const full = path.join(root, name);
32
+ if ((await fs.stat(full).catch(() => null))?.isFile())
33
+ add(name);
34
+ }
35
+ for (const name of PRIORITY_DIRS)
36
+ await walk(root, path.join(root, name), files, seen, maxFiles);
37
+ for (const entry of await sortedEntries(root)) {
38
+ if (files.length >= maxFiles)
39
+ break;
40
+ if (IGNORE.has(entry.name) || PRIORITY_DIRS.includes(entry.name) || CORE_FILES.includes(entry.name))
41
+ continue;
42
+ const full = path.join(root, entry.name);
43
+ if (entry.isDirectory())
44
+ await walk(root, full, files, seen, maxFiles);
45
+ else if (entry.isFile())
46
+ add(entry.name);
47
+ }
7
48
  const classify = (re) => files.filter((file) => re.test(file));
8
49
  return {
9
50
  schema: 'sks.agent-repo-inventory.v1',
@@ -19,11 +60,10 @@ export async function collectRepoInventory(root, opts = {}) {
19
60
  files
20
61
  };
21
62
  }
22
- async function walk(root, dir, out, maxFiles) {
63
+ async function walk(root, dir, out, seen, maxFiles) {
23
64
  if (out.length >= maxFiles)
24
65
  return;
25
- const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
26
- for (const entry of entries) {
66
+ for (const entry of await sortedEntries(dir)) {
27
67
  if (out.length >= maxFiles)
28
68
  return;
29
69
  if (IGNORE.has(entry.name))
@@ -31,9 +71,30 @@ async function walk(root, dir, out, maxFiles) {
31
71
  const full = path.join(dir, entry.name);
32
72
  const rel = path.relative(root, full).replace(/\\/g, '/');
33
73
  if (entry.isDirectory())
34
- await walk(root, full, out, maxFiles);
35
- else if (entry.isFile())
74
+ await walk(root, full, out, seen, maxFiles);
75
+ else if (entry.isFile() && !seen.has(rel)) {
76
+ seen.add(rel);
36
77
  out.push(rel);
78
+ }
37
79
  }
38
80
  }
81
+ async function firstFile(root, dir) {
82
+ for (const entry of await sortedEntries(dir)) {
83
+ if (IGNORE.has(entry.name))
84
+ continue;
85
+ const full = path.join(dir, entry.name);
86
+ if (entry.isFile())
87
+ return path.relative(root, full).replace(/\\/g, '/');
88
+ if (entry.isDirectory()) {
89
+ const nested = await firstFile(root, full);
90
+ if (nested)
91
+ return nested;
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+ async function sortedEntries(dir) {
97
+ return (await fs.readdir(dir, { withFileTypes: true }).catch(() => []))
98
+ .sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
99
+ }
39
100
  //# sourceMappingURL=repo-inventory.js.map
@@ -36,9 +36,9 @@ export function buildZellijRightLaneCockpit(input = {}) {
36
36
  visible_lane_count: Math.min(lanes.length, maxVisible),
37
37
  page_count: pageCount,
38
38
  actual_pane_ids: lanes.map((lane) => lane.pane_id).filter(Boolean),
39
- attach_command: input.sessionName ? `zellij attach ${input.sessionName}` : 'sks team open-zellij latest',
39
+ attach_command: input.sessionName ? `zellij attach ${input.sessionName}` : 'sks zellij status',
40
40
  keyboard_hint: 'Use the Zellij pane controls to move between lanes; detach with the configured Zellij detach binding.',
41
- cleanup_command_hint: 'sks team cleanup-zellij latest',
41
+ cleanup_command_hint: 'Use native Zellij session controls; legacy Team mutation commands are removed.',
42
42
  ok: lanes.length > 0
43
43
  };
44
44
  const laneManifest = {
@@ -194,10 +194,11 @@ async function collectChangedScope(root, opts) {
194
194
  async function listSourceFiles(root, dir = root, out = []) {
195
195
  const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);
196
196
  for (const entry of entries) {
197
- if (entry.name.startsWith('.') && !['.agents'].includes(entry.name)) {
198
- if (SKIP_DIRS.has(entry.name))
199
- continue;
200
- }
197
+ // Hidden runtime/worktree directories can contain complete repository copies.
198
+ // Only .agents is a source-bearing project directory; all other hidden trees
199
+ // are state, caches, or external workspaces and must stay outside this scan.
200
+ if (entry.name.startsWith('.') && entry.name !== '.agents')
201
+ continue;
201
202
  const full = path.join(dir, entry.name);
202
203
  if (entry.isDirectory()) {
203
204
  if (!SKIP_DIRS.has(entry.name))
@@ -1,227 +1,128 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- import { ensureDir, nowIso, writeJsonAtomic, writeTextAtomic } from '../fsx.js';
4
- import { managedAgentRoleConfigForFile, managedAgentRoleConfigForRole } from '../agents/agent-role-config.js';
5
- import { isUnmanagedProjectCodexConfig, writeCodexConfigGuarded } from './codex-config-guard.js';
3
+ import { nowIso, readJson, writeJsonAtomic } from '../fsx.js';
4
+ import { backupInvalidToml, inspectOfficialSubagentToml, mergeOfficialSubagentConfig, officialSubagentConfigOwnershipProof, officialSubagentConfigWarnings, readInheritedOfficialSubagentConfigText } from '../subagents/official-subagent-config.js';
5
+ import { writeCodexConfigGuarded } from './codex-config-guard.js';
6
+ /**
7
+ * Compatibility entrypoint retained for doctor callers. It repairs the
8
+ * official project [agents] settings and removes only exact legacy SKS child
9
+ * tables after ownership has been proven. User-authored child tables remain.
10
+ */
6
11
  export async function repairAgentConfigFileReferences(input) {
7
12
  const root = path.resolve(input.root);
8
13
  const configPath = path.join(root, '.codex', 'config.toml');
9
14
  const configExists = await fs.stat(configPath).then((stat) => stat.isFile()).catch(() => false);
10
- const original = configExists ? await fs.readFile(configPath, 'utf8').catch(() => '') : minimalManagedConfigToml();
11
- if (input.apply && configExists && isUnmanagedProjectCodexConfig(root, configPath, original)) {
12
- const report = {
15
+ const original = configExists ? await fs.readFile(configPath, 'utf8').catch(() => '') : '';
16
+ const manifest = await readJson(path.join(root, '.sneakoscope', 'manifest.json'), null);
17
+ const migrationReceipt = await readJson(path.join(root, '.sneakoscope', 'update', 'migration-receipt.json'), null);
18
+ const ownershipProof = officialSubagentConfigOwnershipProof({
19
+ text: original,
20
+ manifest,
21
+ migrationReceipt
22
+ });
23
+ const originalValidation = inspectOfficialSubagentToml(original);
24
+ if (configExists && !originalValidation.ok) {
25
+ const backupPath = input.apply
26
+ ? await backupInvalidToml(configPath, original, 'doctor-project-config-invalid')
27
+ : null;
28
+ return writeReport(input.reportPath, root, {
13
29
  schema: 'sks.agent-config-file-repair.v1',
14
30
  generated_at: nowIso(),
15
31
  ok: false,
16
- apply: true,
32
+ apply: input.apply === true,
17
33
  config_path: configPath,
34
+ backup_path: backupPath,
18
35
  repaired_paths: [],
19
36
  created_files: [],
20
37
  removed_unsupported_fields: [],
21
38
  skipped_unmanaged_paths: [],
22
39
  manual_required: true,
23
- blockers: ['user_owned_file_without_sks_marker']
24
- };
25
- if (input.reportPath !== null)
26
- await writeJsonAtomic(input.reportPath || path.join(root, '.sneakoscope', 'reports', 'agent-config-file-repair.json'), report).catch(() => undefined);
27
- return report;
28
- }
29
- const createdFiles = [];
30
- const repairedPaths = [];
31
- const removedUnsupportedFields = [];
32
- const skippedUnmanagedPaths = [];
33
- const edits = [];
34
- let text = original;
35
- for (const block of tomlBlocks(original)) {
36
- const managed = managedBlockTarget(root, block);
37
- const currentConfigFile = stringValue(block.text, 'config_file');
38
- if (!managed) {
39
- if (currentConfigFile && !path.isAbsolute(currentConfigFile))
40
- skippedUnmanagedPaths.push(currentConfigFile);
41
- continue;
42
- }
43
- const target = path.join(root, '.codex', 'agents', managed.file);
44
- let replacement = removeKey(block.text, 'message_role_prefix', removedUnsupportedFields);
45
- replacement = replaceOrInsertKey(replacement, 'config_file', `"${escapeToml(target)}"`);
46
- if (replacement !== block.text) {
47
- edits.push({ start: block.start, end: block.end, replacement });
48
- repairedPaths.push(target);
49
- }
50
- if (input.apply) {
51
- const exists = await fs.stat(target).then((stat) => stat.isFile()).catch(() => false);
52
- if (!exists) {
53
- await ensureDir(path.dirname(target));
54
- await writeTextAtomic(target, managed.content);
55
- createdFiles.push(target);
56
- }
57
- }
40
+ blockers: [
41
+ 'project_official_subagent_config_toml_parse_failed',
42
+ ...(!ownershipProof.owned ? ['user_owned_file_without_sks_marker'] : [])
43
+ ],
44
+ warnings: [],
45
+ ownership_proof: ownershipProof
46
+ });
58
47
  }
59
- if (edits.length)
60
- text = applyEdits(original, edits);
61
- if (input.apply && !configExists) {
62
- await ensureDir(path.dirname(configPath));
63
- await writeCodexConfigGuarded({
64
- root,
65
- configPath,
66
- before: '',
67
- cause: 'agent-config-file-repair',
68
- mutate: () => text.replace(/\n{3,}/g, '\n\n').replace(/\s*$/, '\n')
48
+ if (input.apply && configExists && !ownershipProof.owned) {
49
+ return writeReport(input.reportPath, root, {
50
+ schema: 'sks.agent-config-file-repair.v1',
51
+ generated_at: nowIso(),
52
+ ok: false,
53
+ apply: true,
54
+ config_path: configPath,
55
+ backup_path: null,
56
+ repaired_paths: [],
57
+ created_files: [],
58
+ removed_unsupported_fields: [],
59
+ skipped_unmanaged_paths: [],
60
+ manual_required: true,
61
+ blockers: ['user_owned_file_without_sks_marker'],
62
+ warnings: [],
63
+ ownership_proof: ownershipProof
69
64
  });
70
- createdFiles.push(configPath);
71
65
  }
72
- else if (input.apply && text !== original) {
73
- await writeCodexConfigGuarded({
66
+ const inheritedText = await readInheritedOfficialSubagentConfigText(configPath, {
67
+ ...(input.home ? { home: input.home } : {}),
68
+ ...(input.codexHome ? { codexHome: input.codexHome } : {})
69
+ });
70
+ const merged = mergeOfficialSubagentConfig(original, {
71
+ sksOwned: ownershipProof.owned,
72
+ inheritedText
73
+ });
74
+ const validation = inspectOfficialSubagentToml(merged);
75
+ const warnings = officialSubagentConfigWarnings(merged, inheritedText);
76
+ const blockers = [];
77
+ let changed = merged !== original;
78
+ let writeSucceeded = input.apply !== true;
79
+ let backupPath = null;
80
+ if (input.apply) {
81
+ const guarded = await writeCodexConfigGuarded({
74
82
  root,
75
83
  configPath,
76
84
  before: original,
77
- cause: 'agent-config-file-repair',
78
- mutate: () => text.replace(/\n{3,}/g, '\n\n').replace(/\s*$/, '\n')
85
+ cause: 'official-subagent-config-repair',
86
+ ownershipVerified: ownershipProof.owned,
87
+ mutate: () => merged
79
88
  });
89
+ writeSucceeded = guarded.ok;
90
+ changed = guarded.ok && guarded.changed;
91
+ backupPath = guarded.backup_path;
92
+ if (!guarded.ok)
93
+ blockers.push(`config_write_guard:${guarded.status}`);
94
+ }
95
+ else if (!validation.ok) {
96
+ blockers.push('project_official_subagent_config_toml_parse_failed');
80
97
  }
81
- const effectiveText = input.apply ? await fs.readFile(configPath, 'utf8').catch(() => text) : text;
82
- const missing = await missingAgentConfigFiles(effectiveText);
83
- const unsupportedManagedFields = managedAgentBlocks(effectiveText)
84
- .flatMap((block) => block.text.split(/\r?\n/).filter((line) => /^\s*message_role_prefix\s*=/.test(line)));
85
98
  const report = {
86
99
  schema: 'sks.agent-config-file-repair.v1',
87
100
  generated_at: nowIso(),
88
- ok: missing.length === 0 && !/^\s*message_role_prefix\s*=/m.test(text),
101
+ ok: blockers.length === 0,
89
102
  apply: input.apply === true,
90
103
  config_path: configPath,
91
- repaired_paths: repairedPaths,
92
- created_files: createdFiles,
93
- removed_unsupported_fields: removedUnsupportedFields,
94
- skipped_unmanaged_paths: skippedUnmanagedPaths,
95
- manual_required: skippedUnmanagedPaths.length > 0,
96
- blockers: [
97
- ...missing.map((file) => `missing_agent_config_file:${file}`),
98
- ...unsupportedManagedFields.map(() => 'unsupported_message_role_prefix_field')
99
- ]
104
+ backup_path: backupPath,
105
+ repaired_paths: changed && writeSucceeded ? [configPath] : [],
106
+ created_files: input.apply === true && !configExists && changed && writeSucceeded ? [configPath] : [],
107
+ removed_unsupported_fields: [],
108
+ skipped_unmanaged_paths: [],
109
+ manual_required: blockers.length > 0,
110
+ blockers,
111
+ warnings,
112
+ ownership_proof: ownershipProof
100
113
  };
101
- report.ok = report.blockers.length === 0;
102
- if (input.reportPath !== null)
103
- await writeJsonAtomic(input.reportPath || path.join(root, '.sneakoscope', 'reports', 'agent-config-file-repair.json'), report).catch(() => undefined);
104
- return report;
114
+ return writeReport(input.reportPath, root, report);
105
115
  }
106
- export async function missingAgentConfigFiles(text) {
107
- const rows = managedAgentBlocks(text)
108
- .map((block) => stringValue(block.text, 'config_file'))
109
- .filter((file) => Boolean(file));
110
- const missing = [];
111
- for (const file of rows) {
112
- if (!path.isAbsolute(file)) {
113
- missing.push(file);
114
- continue;
115
- }
116
- const ok = await fs.stat(file).then((stat) => stat.isFile()).catch(() => false);
117
- if (!ok)
118
- missing.push(file);
119
- }
120
- return missing;
116
+ // Retained for compatibility with the startup postcheck API. Official custom
117
+ // agents are discovered from .codex/agents and do not require config_file
118
+ // references; legacy references are intentionally ignored and preserved.
119
+ export async function missingAgentConfigFiles(_text) {
120
+ return [];
121
121
  }
122
- function tomlBlocks(text) {
123
- const source = String(text || '');
124
- const matches = [...source.matchAll(/(^|\n)\s*\[([^\]]+)\]\s*(?:#.*)?(?:\n|$)/g)];
125
- return matches.map((match, index) => {
126
- const start = Number(match.index || 0) + (match[1] ? 1 : 0);
127
- const next = matches[index + 1];
128
- const end = next ? Number(next.index || 0) + (next[1] ? 1 : 0) : source.length;
129
- return {
130
- header: String(match[2] || '').trim(),
131
- start,
132
- end,
133
- text: source.slice(start, end)
134
- };
135
- });
136
- }
137
- function managedAgentBlocks(text) {
138
- return tomlBlocks(text).filter((block) => Boolean(managedBlockTarget(process.cwd(), block)));
139
- }
140
- function managedBlockTarget(root, block) {
141
- if (!block.header.startsWith('agents.'))
142
- return null;
143
- const role = block.header.slice('agents.'.length);
144
- const byRole = managedAgentRoleConfigForRole(role);
145
- if (byRole)
146
- return byRole;
147
- const configFile = stringValue(block.text, 'config_file');
148
- if (configFile) {
149
- const content = managedAgentRoleConfigForFile(configFile);
150
- if (content)
151
- return { file: path.basename(configFile), content };
122
+ async function writeReport(reportPath, root, report) {
123
+ if (reportPath !== null) {
124
+ await writeJsonAtomic(reportPath || path.join(root, '.sneakoscope', 'reports', 'agent-config-file-repair.json'), report).catch(() => undefined);
152
125
  }
153
- if (/SKS managed|sks_/i.test(block.text)) {
154
- const fallback = managedAgentRoleConfigForRole(role);
155
- if (fallback)
156
- return fallback;
157
- }
158
- void root;
159
- return null;
160
- }
161
- function stringValue(text, key) {
162
- const match = text.match(new RegExp(`^\\s*${escapeRegExp(key)}\\s*=\\s*"([^"]*)"`, 'm'));
163
- return match && typeof match[1] === 'string' ? match[1] : null;
164
- }
165
- function removeKey(text, key, removed) {
166
- return text.split(/\r?\n/).filter((line) => {
167
- const match = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`).test(line);
168
- if (match)
169
- removed.push(line.trim());
170
- return !match;
171
- }).join('\n');
172
- }
173
- function replaceOrInsertKey(text, key, encodedValue) {
174
- const lines = text.replace(/\s*$/, '').split('\n');
175
- const re = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
176
- const index = lines.findIndex((line) => re.test(line));
177
- if (index >= 0)
178
- lines[index] = `${key} = ${encodedValue}`;
179
- else
180
- lines.push(`${key} = ${encodedValue}`);
181
- return `${lines.join('\n')}\n`;
182
- }
183
- function applyEdits(text, edits) {
184
- return [...edits]
185
- .sort((a, b) => b.start - a.start)
186
- .reduce((current, edit) => `${current.slice(0, edit.start)}${edit.replacement}${current.slice(edit.end)}`, text);
187
- }
188
- function escapeToml(value) {
189
- return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
190
- }
191
- function escapeRegExp(value) {
192
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
193
- }
194
- function minimalManagedConfigToml() {
195
- return [
196
- 'service_tier = "fast"',
197
- '',
198
- '[features]',
199
- 'hooks = true',
200
- 'multi_agent = true',
201
- 'fast_mode = true',
202
- 'apps = true',
203
- '',
204
- '[mcp_servers.context7]',
205
- 'url = "https://mcp.context7.com/mcp"',
206
- '',
207
- agentConfigBlock('native_agent', 'SKS native agent with bounded write capability.', './agents/native-agent-intake.toml', ['Analysis', 'Mapper']),
208
- '',
209
- agentConfigBlock('team_consensus', 'SKS planning/debate agent with bounded write capability.', './agents/team-consensus.toml', ['Consensus', 'Atlas']),
210
- '',
211
- agentConfigBlock('implementation_worker', 'SKS bounded implementation worker.', './agents/implementation-worker.toml', ['Builder', 'Mason']),
212
- '',
213
- agentConfigBlock('db_safety_reviewer', 'DB safety reviewer with bounded write capability.', './agents/db-safety-reviewer.toml', ['Sentinel', 'Ledger']),
214
- '',
215
- agentConfigBlock('qa_reviewer', 'QA reviewer with bounded write capability.', './agents/qa-reviewer.toml', ['Verifier', 'Reviewer']),
216
- ''
217
- ].join('\n');
218
- }
219
- function agentConfigBlock(table, description, configFile, nicknames = []) {
220
- return [
221
- `[agents.${table}]`,
222
- `description = "${description}"`,
223
- `config_file = "${configFile}"`,
224
- `nickname_candidates = [${nicknames.map((name) => `"${name}"`).join(', ')}]`
225
- ].join('\n');
126
+ return report;
226
127
  }
227
128
  //# sourceMappingURL=agent-config-file-repair.js.map