sneakoscope 7.1.0 → 7.3.0

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 (534) hide show
  1. package/README.md +9 -1
  2. package/config/architecture-budgets.v1.json +1 -8
  3. package/crates/sks-core/Cargo.lock +225 -1
  4. package/crates/sks-core/Cargo.toml +8 -1
  5. package/crates/sks-core/src/main.rs +7 -1
  6. package/crates/sks-core/src/search/files.rs +114 -0
  7. package/crates/sks-core/src/search/mod.rs +274 -0
  8. package/crates/sks-core/src/search/text.rs +175 -0
  9. package/dist/bin/sks-dispatch.js +4 -3
  10. package/dist/cli/command-manifest-lite.js +177 -6
  11. package/dist/cli/command-registry.js +42 -8
  12. package/dist/cli/help.js +30 -0
  13. package/dist/cli/install-helpers-codex-lb-config.js +9 -6
  14. package/dist/cli/install-helpers-codex-lb-selftest-chain.js +1 -1
  15. package/dist/cli/install-helpers-install-support.js +1 -1
  16. package/dist/cli/install-helpers.js +19 -9
  17. package/dist/cli/router.js +16 -3
  18. package/dist/commands/codex-app.js +40 -5
  19. package/dist/commands/doctor-profile.js +78 -0
  20. package/dist/commands/doctor.js +29 -69
  21. package/dist/commands/search.js +4 -0
  22. package/dist/config/skills-manifest.json +53 -60
  23. package/dist/core/agent-bridge/agent-manifest.js +22 -26
  24. package/dist/core/agent-bridge/host-capability-policy.js +109 -8
  25. package/dist/core/agent-bridge/host-capability-runtime.js +178 -50
  26. package/dist/core/agent-guidance/directive-registry.js +123 -0
  27. package/dist/core/agents/agent-effort-policy.js +45 -6
  28. package/dist/core/agents/agent-worker-pipeline.js +1 -3
  29. package/dist/core/agents/native-worker-backend-router.js +43 -19
  30. package/dist/core/auto-review.js +1 -3
  31. package/dist/core/code-structure.js +282 -19
  32. package/dist/core/codex/codex-config-guard.js +14 -4
  33. package/dist/core/codex/codex-config-toml.js +1 -3
  34. package/dist/core/codex-app/codex-agent-role-sync.js +1 -3
  35. package/dist/core/codex-app/codex-app-fast-ui-repair.js +14 -1
  36. package/dist/core/codex-app/codex-app-types.js +2 -3
  37. package/dist/core/codex-app/codex-desktop-routing-ownership.js +91 -0
  38. package/dist/core/codex-app/codex-hook-approval-probe.js +1 -3
  39. package/dist/core/codex-app/codex-hook-lifecycle.js +1 -3
  40. package/dist/core/codex-app/codex-init-deep.js +22 -10
  41. package/dist/core/codex-app/codex-model-catalog.js +384 -0
  42. package/dist/core/codex-app/codex-models-cache.js +160 -0
  43. package/dist/core/codex-app/desktop-routing-snapshot.js +233 -0
  44. package/dist/core/codex-app/glm-profile-installer.js +1 -3
  45. package/dist/core/codex-app/mcp-manager.js +1 -3
  46. package/dist/core/codex-app/menubar/constants.js +3 -0
  47. package/dist/core/codex-app/menubar/installer.js +11 -1
  48. package/dist/core/codex-app/multi-provider-router-support.js +202 -0
  49. package/dist/core/codex-app/multi-provider-router.js +379 -0
  50. package/dist/core/codex-app/openrouter-activate.js +189 -26
  51. package/dist/core/codex-app/openrouter-base-instructions.js +1 -0
  52. package/dist/core/codex-app/openrouter-model-catalog.js +217 -0
  53. package/dist/core/codex-app/role-model-catalog-priority.js +61 -0
  54. package/dist/core/codex-app.js +30 -6
  55. package/dist/core/codex-compat/codex-hook-semantic-validator.js +1 -3
  56. package/dist/core/codex-control/codex-app-server-v2-client.js +39 -2
  57. package/dist/core/codex-lb/codex-lb-env.js +1 -3
  58. package/dist/core/codex-lb/codex-lb-tool-catalog.js +6 -1
  59. package/dist/core/codex-native/codex-native-feature-broker.js +2 -6
  60. package/dist/core/codex-native/codex-native-interop-policy.js +1 -3
  61. package/dist/core/codex-native/codex-native-reference-cache.js +1 -3
  62. package/dist/core/codex-native/codex-native-reference-source.js +1 -3
  63. package/dist/core/codex-native/codex-native-repair-transaction.js +1 -3
  64. package/dist/core/codex-native/core-skill-manifest.js +3 -2
  65. package/dist/core/codex-native/native-capability-repair-matrix.js +1 -3
  66. package/dist/core/codex-plugins/codex-plugin-repair.js +1 -3
  67. package/dist/core/codex-runtime/codex-desktop-config-policy.js +4 -4
  68. package/dist/core/commands/agent-bridge-command.js +24 -3
  69. package/dist/core/commands/image-ux-review-command.js +5 -11
  70. package/dist/core/commands/menubar-command.js +1 -1
  71. package/dist/core/commands/naruto-command.js +40 -13
  72. package/dist/core/commands/pipeline-command.js +5 -2
  73. package/dist/core/commands/release-command.js +63 -1
  74. package/dist/core/commands/remote-command.js +18 -0
  75. package/dist/core/commands/search-command.js +151 -0
  76. package/dist/core/commands/telegram-command.js +251 -108
  77. package/dist/core/commands/uninstall-command.js +1 -1
  78. package/dist/core/config/secret-preservation.js +1 -3
  79. package/dist/core/context7-client.js +2 -1
  80. package/dist/core/db-review.js +704 -0
  81. package/dist/core/db-safety.js +17 -23
  82. package/dist/core/doctor/browser-use-repair.js +1 -3
  83. package/dist/core/doctor/codex-startup-config-repair.js +1 -3
  84. package/dist/core/doctor/computer-use-repair.js +1 -3
  85. package/dist/core/doctor/context7-mcp-repair.js +1 -3
  86. package/dist/core/doctor/current-project-guidance.js +1 -3
  87. package/dist/core/doctor/doctor-codex-startup-repair.js +1 -3
  88. package/dist/core/doctor/doctor-dirty-planner.js +2 -2
  89. package/dist/core/doctor/doctor-native-capability-repair.js +1 -3
  90. package/dist/core/doctor/doctor-transaction.js +1 -3
  91. package/dist/core/doctor/imagegen-repair.js +1 -3
  92. package/dist/core/doctor/legacy-global-hook-cleanup.js +1 -3
  93. package/dist/core/doctor/mcp-transport-collision-repair.js +1 -3
  94. package/dist/core/doctor/retired-managed-residue-private.js +1 -3
  95. package/dist/core/doctor/supabase-mcp-repair.js +1 -3
  96. package/dist/core/engineering-sanity-review.js +186 -0
  97. package/dist/core/errors/message.js +3 -0
  98. package/dist/core/evidence/evidence-schema.js +1 -3
  99. package/dist/core/feature-fixtures.js +1 -0
  100. package/dist/core/feature-registry.js +1 -3
  101. package/dist/core/fsx.js +13 -0
  102. package/dist/core/git-hygiene/shared-memory-publish.js +1 -3
  103. package/dist/core/git-hygiene/validators.js +1 -3
  104. package/dist/core/harness-guard.js +21 -3
  105. package/dist/core/hooks-runtime/hook-context.js +2 -2
  106. package/dist/core/image-ux-review/imagegen-adapter.js +52 -56
  107. package/dist/core/image-ux-review/real-callout-extractor.js +6 -1
  108. package/dist/core/image-ux-review.js +3 -5
  109. package/dist/core/imagegen/codex-lb-imagegen-target.js +70 -0
  110. package/dist/core/imagegen/imagegen-capability.js +11 -11
  111. package/dist/core/imagegen/imagegen-evidence.js +32 -0
  112. package/dist/core/init/skills.js +9 -11
  113. package/dist/core/init.js +4 -6
  114. package/dist/core/json/records.js +9 -0
  115. package/dist/core/json-schema-validator.js +1 -3
  116. package/dist/core/lean-engineering-policy.js +54 -0
  117. package/dist/core/loops/loop-continuation-enforcer.js +1 -3
  118. package/dist/core/mad-sks/sql-plane/mcp-executor.js +2 -1
  119. package/dist/core/mad-sks/sql-plane/policy.js +2 -1
  120. package/dist/core/managed-assets/managed-assets-manifest.js +4 -3
  121. package/dist/core/mcp-config/codex-cli-adapter.js +1 -3
  122. package/dist/core/mcp-config/config-reader.js +2 -3
  123. package/dist/core/mcp-config/guarded-patch.js +1 -1
  124. package/dist/core/mcp-config/health-check.js +2 -1
  125. package/dist/core/mcp-config/mutation.js +1 -1
  126. package/dist/core/mcp-config/restore.js +1 -1
  127. package/dist/core/mcp-config/secret-policy.js +1 -3
  128. package/dist/core/migration/migration-transaction-journal.js +3 -3
  129. package/dist/core/naruto/naruto-concurrency-governor.js +2 -2
  130. package/dist/core/perf/import-graph-budget.js +91 -1
  131. package/dist/core/pipeline/pipeline-plan-writer.js +1 -1
  132. package/dist/core/pipeline-internals/runtime-core.js +121 -23
  133. package/dist/core/pipeline-internals/runtime-gates.js +193 -4
  134. package/dist/core/pipeline.js +1 -1
  135. package/dist/core/ppt-review/slide-imagegen-review.js +7 -7
  136. package/dist/core/ppt.js +3 -3
  137. package/dist/core/product-design-app-server.js +2 -1
  138. package/dist/core/proof/fake-real-proof-policy.js +1 -3
  139. package/dist/core/proof/root-cause-policy.js +1 -3
  140. package/dist/core/proof/validation.js +1 -3
  141. package/dist/core/provider/model-router.js +4 -0
  142. package/dist/core/provider/provider-context.js +1 -3
  143. package/dist/core/providers/openrouter/openrouter-account.js +1 -3
  144. package/dist/core/quality/helper-dedup.js +0 -0
  145. package/dist/core/recallpulse.js +1 -1
  146. package/dist/core/release/file-ownership.js +26 -17
  147. package/dist/core/release/macos-menubar-proof.js +59 -1
  148. package/dist/core/release/main-push-guard.js +288 -24
  149. package/dist/core/release/main-push-receipt.js +10 -45
  150. package/dist/core/release/package-size-budget.js +1 -1
  151. package/dist/core/release/release-gate-contract.js +2 -0
  152. package/dist/core/release/release-pack-receipt.js +1 -1
  153. package/dist/core/release/release-proof-io.js +33 -0
  154. package/dist/core/release/release-upgrade-baseline.js +9 -0
  155. package/dist/core/release/runtime-script-pack-closure.js +153 -4
  156. package/dist/core/release/stage-publish.js +194 -0
  157. package/dist/core/remote/index.js +2 -0
  158. package/dist/core/remote/local-worker-client.js +35 -0
  159. package/dist/core/remote/machine-registry.js +18 -13
  160. package/dist/core/remote/owner-proof.js +1 -3
  161. package/dist/core/remote/protocol.js +1 -3
  162. package/dist/core/remote/readiness.js +1 -3
  163. package/dist/core/remote/session-binding.js +153 -0
  164. package/dist/core/remote/session-index.js +1 -3
  165. package/dist/core/remote/types.js +1 -0
  166. package/dist/core/remote/worker.js +228 -14
  167. package/dist/core/responses-stream.js +151 -0
  168. package/dist/core/routes/dollar-manifest-lite.js +1 -1
  169. package/dist/core/routes.js +8 -8
  170. package/dist/core/rust-accelerator.js +12 -2
  171. package/dist/core/safety/ssot-guard.js +1 -3
  172. package/dist/core/search/benchmark.js +358 -0
  173. package/dist/core/search/cache.js +65 -0
  174. package/dist/core/search/context.js +144 -0
  175. package/dist/core/search/doctor.js +74 -0
  176. package/dist/core/search/files.js +192 -0
  177. package/dist/core/search/index.js +5 -0
  178. package/dist/core/search/ipc.js +64 -0
  179. package/dist/core/search/provider.js +142 -0
  180. package/dist/core/search/rust-bridge.js +24 -0
  181. package/dist/core/search/structure.js +230 -0
  182. package/dist/core/search/symbol.js +272 -0
  183. package/dist/core/search/text.js +146 -0
  184. package/dist/core/search/types.js +22 -0
  185. package/dist/core/search/typescript-ls.js +215 -0
  186. package/dist/core/search-visibility/discovery.js +1 -3
  187. package/dist/core/skill-forge.js +1 -1
  188. package/dist/core/stop-gate/gate-evaluator.js +3 -3
  189. package/dist/core/stop-gate/stop-gate-check.js +1 -3
  190. package/dist/core/structured-output-adapter.js +62 -2
  191. package/dist/core/subagents/agent-catalog.js +56 -43
  192. package/dist/core/subagents/model-policy.js +17 -7
  193. package/dist/core/subagents/naruto-proof-projection.js +2 -6
  194. package/dist/core/subagents/official-subagent-config.js +1 -3
  195. package/dist/core/subagents/official-subagent-preparation.js +73 -10
  196. package/dist/core/subagents/official-subagent-prompt.js +85 -18
  197. package/dist/core/subagents/official-subagent-runner.js +10 -5
  198. package/dist/core/subagents/role-model-preferences.js +202 -44
  199. package/dist/core/subagents/subagent-evidence.js +1 -3
  200. package/dist/core/subagents/thread-budget.js +1 -1
  201. package/dist/core/subagents/triwiki-attention.js +1 -5
  202. package/dist/core/telegram/config.js +29 -12
  203. package/dist/core/telegram/hub.js +8 -2
  204. package/dist/core/telegram/index.js +2 -0
  205. package/dist/core/telegram/messages.js +8 -2
  206. package/dist/core/telegram/runtime-projection.js +8 -5
  207. package/dist/core/telegram/runtime.js +19 -9
  208. package/dist/core/telegram/service.js +181 -0
  209. package/dist/core/telegram/setup.js +220 -0
  210. package/dist/core/text/regex.js +3 -0
  211. package/dist/core/text/strings.js +6 -0
  212. package/dist/core/triwiki-wrongness/image-wrongness.js +1 -3
  213. package/dist/core/triwiki-wrongness/wrongness-ledger.js +1 -3
  214. package/dist/core/triwiki-wrongness/wrongness-proof-linker.js +1 -3
  215. package/dist/core/triwiki-wrongness/wrongness-retrieval.js +1 -3
  216. package/dist/core/triwiki-wrongness/wrongness-schema.js +1 -3
  217. package/dist/core/triwiki-wrongness/wrongness-trust-policy.js +1 -3
  218. package/dist/core/trust-kernel/completion-contract.js +1 -3
  219. package/dist/core/trust-kernel/route-contract.js +1 -3
  220. package/dist/core/update/update-migration-state.js +1 -3
  221. package/dist/core/update-check.js +20 -6
  222. package/dist/core/verification/diff-quality.js +3 -4
  223. package/dist/core/verification/impact-scan.js +36 -89
  224. package/dist/core/verification/mistake-rule-compiler.js +17 -4
  225. package/dist/core/version-manager.js +3 -20
  226. package/dist/core/version.js +1 -1
  227. package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +23 -3
  228. package/dist/native/sks-menubar/Sources/ControlKit.swift +102 -0
  229. package/dist/native/sks-menubar/Sources/DiagnosticsViewController.swift +23 -11
  230. package/dist/native/sks-menubar/Sources/MCPServersViewController.swift +7 -3
  231. package/dist/native/sks-menubar/Sources/OperationCoordinator.swift +17 -1
  232. package/dist/native/sks-menubar/Sources/OverviewViewController.swift +22 -15
  233. package/dist/native/sks-menubar/Sources/ProcessClient.swift +15 -5
  234. package/dist/native/sks-menubar/Sources/ProvidersMultiProvider.swift +324 -0
  235. package/dist/native/sks-menubar/Sources/ProvidersOpenRouter.swift +154 -214
  236. package/dist/native/sks-menubar/Sources/ProvidersRoleModels.swift +252 -0
  237. package/dist/native/sks-menubar/Sources/ProvidersViewController.swift +77 -71
  238. package/dist/native/sks-menubar/Sources/RemoteTelegramViewController.swift +167 -51
  239. package/dist/native/sks-menubar/Sources/SettingsViewController.swift +14 -5
  240. package/dist/native/sks-menubar/Sources/SidebarItem.swift +15 -1
  241. package/dist/native/sks-menubar/Sources/StatusItemController.swift +2 -2
  242. package/dist/native/sks-menubar/Sources/UpdatesViewController.swift +16 -12
  243. package/dist/scripts/agent-guidance-dedup-check.js +23 -0
  244. package/dist/scripts/agent-message-bus-reader-check.js +1 -1
  245. package/dist/scripts/all-feature-deep-completion-check.js +1 -1
  246. package/dist/scripts/appshots-thread-attachment-discovery-check.js +1 -1
  247. package/dist/scripts/architecture-guard-check.js +1 -2
  248. package/dist/scripts/certificate-sla-check.js +1 -1
  249. package/dist/scripts/cli-output-consistency-check.js +1 -1
  250. package/dist/scripts/codex-0-134-runner-truth-check.js +1 -1
  251. package/dist/scripts/codex-0138-capability-artifact-check.js +1 -1
  252. package/dist/scripts/codex-0138-capability-check.js +1 -1
  253. package/dist/scripts/codex-0138-doctor-check.js +1 -1
  254. package/dist/scripts/codex-0138-feature-probes-check.js +1 -1
  255. package/dist/scripts/codex-0144-app-server-v2-check.js +1 -1
  256. package/dist/scripts/codex-0144-binary-identity-check.js +1 -1
  257. package/dist/scripts/codex-0144-capability-check.js +1 -1
  258. package/dist/scripts/codex-0144-core-real-probes-check.js +1 -1
  259. package/dist/scripts/codex-0144-manifest-check.js +1 -1
  260. package/dist/scripts/codex-0144-policy-check.js +1 -1
  261. package/dist/scripts/codex-0144-thread-store-check.js +1 -1
  262. package/dist/scripts/codex-agent-role-rich-content-check.js +2 -2
  263. package/dist/scripts/codex-agent-role-sync-check.js +2 -2
  264. package/dist/scripts/codex-agent-type-routing-check.js +2 -2
  265. package/dist/scripts/codex-app-execution-profile-check.js +2 -2
  266. package/dist/scripts/codex-app-handoff-check.js +1 -1
  267. package/dist/scripts/codex-app-handoff-launch-check.js +1 -1
  268. package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +1 -1
  269. package/dist/scripts/codex-lb-fast-ui-preservation-check.js +1 -3
  270. package/dist/scripts/codex-native-feature-broker-blackbox.js +2 -2
  271. package/dist/scripts/codex-native-feature-broker-check.js +2 -2
  272. package/dist/scripts/{sks-3-1-6-directive-check-lib.js → codex-native-gate-lib.js} +5 -5
  273. package/dist/scripts/codex-native-harness-compat-check.js +2 -2
  274. package/dist/scripts/codex-native-hook-lifecycle-proof-check.js +2 -2
  275. package/dist/scripts/codex-plugin-app-template-policy-check.js +1 -1
  276. package/dist/scripts/codex-sdk-backend-router-check.js +1 -1
  277. package/dist/scripts/codex-sdk-capability-check.js +1 -1
  278. package/dist/scripts/context7-evidence-dedupe-check.js +1 -1
  279. package/dist/scripts/core-skill-card-schema-check.js +1 -1
  280. package/dist/scripts/core-skill-deployment-snapshot-check.js +1 -1
  281. package/dist/scripts/core-skill-heldout-validation-check.js +1 -1
  282. package/dist/scripts/core-skill-no-inference-optimizer-check.js +1 -1
  283. package/dist/scripts/core-skill-patch-check.js +1 -1
  284. package/dist/scripts/core-skill-route-runtime-integration-check.js +1 -1
  285. package/dist/scripts/current-command-surface-check.js +1 -1
  286. package/dist/scripts/current-surface-update-e2e-check.js +4 -1
  287. package/dist/scripts/current-upgrade-matrix-check.js +1 -1
  288. package/dist/scripts/dfix-fixture-check.js +1 -1
  289. package/dist/scripts/dfix-patch-handoff-check.js +1 -1
  290. package/dist/scripts/dfix-verification-check.js +1 -1
  291. package/dist/scripts/dfix-verification-recommendation-check.js +1 -1
  292. package/dist/scripts/docs-truthfulness-check.js +16 -3
  293. package/dist/scripts/doctor-codex-app-harness-check.js +2 -2
  294. package/dist/scripts/evidence-flagship-coverage-check.js +1 -1
  295. package/dist/scripts/{sks-1-18-gate-lib.js → gate-lib.js} +1 -1
  296. package/dist/scripts/gate-policy-audit-check.js +4 -1
  297. package/dist/scripts/git-worktree-checkpoint-check.js +1 -1
  298. package/dist/scripts/git-worktree-cross-rebase-check.js +1 -1
  299. package/dist/scripts/git-worktree-diff-envelope-check.js +1 -1
  300. package/dist/scripts/git-worktree-dirty-lock-check.js +1 -1
  301. package/dist/scripts/git-worktree-dirty-main-detection-check.js +1 -1
  302. package/dist/scripts/git-worktree-integration-primary-check.js +1 -1
  303. package/dist/scripts/git-worktree-manifest-append-check.js +1 -1
  304. package/dist/scripts/git-worktree-untracked-diff-check.js +1 -1
  305. package/dist/scripts/harness-benchmark-check.js +1 -1
  306. package/dist/scripts/helper-dedup-check.js +62 -0
  307. package/dist/scripts/hook-latency-budget-check.js +1 -1
  308. package/dist/scripts/image-artifact-path-contract-check.js +1 -1
  309. package/dist/scripts/imagegen-real-smoke-check.js +2 -5
  310. package/dist/scripts/installed-package-smoke-check.js +1 -1
  311. package/dist/scripts/legacy-gate-inventory-check.js +1 -1
  312. package/dist/scripts/legacy-gate-purge-check.js +1 -1
  313. package/dist/scripts/legacy-strong-inventory-check.js +1 -1
  314. package/dist/scripts/lib/codex-sdk-gate-lib.js +1 -1
  315. package/dist/scripts/mad-sks-launch-sql-plane-boundary-check.js +1 -1
  316. package/dist/scripts/mad-sks-sql-plane-capability-check.js +1 -1
  317. package/dist/scripts/mad-sks-sql-plane-lifecycle-hook-decision-check.js +1 -1
  318. package/dist/scripts/mad-sks-sql-plane-result-lifecycle-check.js +1 -1
  319. package/dist/scripts/managed-config-merge-check.js +1 -1
  320. package/dist/scripts/mcp-plugin-inventory-check.js +1 -1
  321. package/dist/scripts/model-call-concurrency-check.js +1 -1
  322. package/dist/scripts/mutation-callsite-coverage-check.js +1 -1
  323. package/dist/scripts/naruto-ssot-gate-aliases-check.js +1 -1
  324. package/dist/scripts/naruto-ssot-pipeline-default-check.js +1 -1
  325. package/dist/scripts/naruto-ssot-route-normalization-check.js +1 -1
  326. package/dist/scripts/naruto-ssot-routing-check.js +1 -1
  327. package/dist/scripts/naruto-worktree-coding-blackbox.js +1 -1
  328. package/dist/scripts/native-capability-repair-matrix-check.js +1 -1
  329. package/dist/scripts/native-image-generation-repair-check.js +1 -1
  330. package/dist/scripts/official-subagent-workflow-check.js +3 -3
  331. package/dist/scripts/package-published-contract-check.js +37 -4
  332. package/dist/scripts/packlist-performance-check.js +17 -1
  333. package/dist/scripts/pipeline-codex-native-doctor-mad-routing-real-blackbox.js +1 -3
  334. package/dist/scripts/ppt-real-export-adapter-check.js +1 -1
  335. package/dist/scripts/ppt-real-imagegen-wiring-check.js +1 -1
  336. package/dist/scripts/ppt-reexport-rereview-check.js +1 -1
  337. package/dist/scripts/prepublish-fast-check.js +1 -1
  338. package/dist/scripts/probe-memoization-check.js +2 -2
  339. package/dist/scripts/prompt-placeholder-guard-check.js +1 -1
  340. package/dist/scripts/qa-loop-app-handoff-capability-check.js +1 -1
  341. package/dist/scripts/qa-loop-app-handoff-check.js +1 -1
  342. package/dist/scripts/qa-loop-app-handoff-cli-check.js +1 -1
  343. package/dist/scripts/qa-loop-app-handoff-confirmation-check.js +1 -1
  344. package/dist/scripts/qa-loop-app-handoff-gate-lifecycle-check.js +1 -1
  345. package/dist/scripts/qa-loop-app-handoff-launch-check.js +1 -1
  346. package/dist/scripts/qa-loop-app-handoff-status-lifecycle-check.js +1 -1
  347. package/dist/scripts/qa-loop-budget-policy-check.js +1 -1
  348. package/dist/scripts/qa-loop-effort-escalation-check.js +1 -1
  349. package/dist/scripts/qa-loop-execution-profile-routing-check.js +2 -2
  350. package/dist/scripts/qa-loop-image-path-exposure-check.js +1 -1
  351. package/dist/scripts/qa-loop-image-path-prompt-injection-check.js +1 -1
  352. package/dist/scripts/{sks-1-12-real-execution-check-lib.js → real-execution-check-lib.js} +1 -1
  353. package/dist/scripts/release-affected-selector-check.js +1 -1
  354. package/dist/scripts/release-aggressive-resource-governor-check.js +1 -1
  355. package/dist/scripts/release-cache-glob-hashing-check.js +1 -1
  356. package/dist/scripts/release-cache-input-classifier-check.js +1 -1
  357. package/dist/scripts/release-cache-neutralization-report-check.js +1 -1
  358. package/dist/scripts/release-cache-version-neutral-fixture-check.js +1 -1
  359. package/dist/scripts/release-dynamic-presets-check.js +2 -2
  360. package/dist/scripts/release-full-parallelism-blackbox.js +1 -1
  361. package/dist/scripts/release-gate-batch-runner-check.js +1 -1
  362. package/dist/scripts/release-gate-budget-check.js +1 -1
  363. package/dist/scripts/release-gate-dag-runner-check.js +1 -1
  364. package/dist/scripts/release-latency-slo-check.js +1 -1
  365. package/dist/scripts/release-metadata-check.js +256 -2
  366. package/dist/scripts/release-parallel-speed-budget-check.js +1 -1
  367. package/dist/scripts/release-proof-truth-check.js +1 -1
  368. package/dist/scripts/release-provenance-check.js +4 -2
  369. package/dist/scripts/release-runtime-truth-matrix-check.js +1 -1
  370. package/dist/scripts/research-blueprint-densifier-check.js +1 -1
  371. package/dist/scripts/research-claim-builder-check.js +1 -1
  372. package/dist/scripts/research-complete-package-fixture-check.js +1 -1
  373. package/dist/scripts/research-execution-profile-routing-check.js +2 -2
  374. package/dist/scripts/research-final-reviewer-blackbox.js +1 -1
  375. package/dist/scripts/{sks-3-1-4-directive-check-lib.js → runtime-domain-gate-lib.js} +2 -2
  376. package/dist/scripts/runtime-proof-summary-check.js +1 -1
  377. package/dist/scripts/runtime-script-pack-closure-check.js +7 -1
  378. package/dist/scripts/scheduler-batch-dispatch-check.js +1 -1
  379. package/dist/scripts/scheduler-parallel-proof-consistency-check.js +1 -1
  380. package/dist/scripts/scheduler-utilization-integral-check.js +1 -1
  381. package/dist/scripts/search-visibility-gate-lib.js +1 -1
  382. package/dist/scripts/secret-preservation-check.js +1 -1
  383. package/dist/scripts/seo-geo-geo-disambiguation-check.js +1 -1
  384. package/dist/scripts/seo-geo-skill-rich-content-check.js +1 -1
  385. package/dist/scripts/side-effect-runtime-report-check.js +1 -1
  386. package/dist/scripts/{sks-3-1-8-check-lib.js → skill-fixture-check-lib.js} +1 -1
  387. package/dist/scripts/skill-name-canonicalizer-check.js +1 -1
  388. package/dist/scripts/skills-manifest-continuity-check.js +1 -1
  389. package/dist/scripts/sks-uninstall-regression-check.js +1 -1
  390. package/dist/scripts/sksd-daemon-check.js +1 -1
  391. package/dist/scripts/super-search-provider-interface-check.js +1 -1
  392. package/dist/scripts/triwiki-cache-key-check.js +1 -1
  393. package/dist/scripts/triwiki-proof-bank-blackbox.js +2 -2
  394. package/dist/scripts/triwiki-proof-bank-check.js +1 -1
  395. package/dist/scripts/triwiki-proof-card-check.js +1 -1
  396. package/dist/scripts/type-surface-codex-app-check.js +2 -2
  397. package/dist/scripts/{sks-3-1-5-directive-check-lib.js → typed-routing-gate-lib.js} +2 -2
  398. package/dist/scripts/ultra-router-auto-router-check.js +1 -1
  399. package/dist/scripts/ux-review-extract-wires-real-extractor-check.js +1 -1
  400. package/dist/scripts/ux-review-patch-diff-recheck-check.js +1 -1
  401. package/dist/scripts/ux-review-run-wires-imagegen-check.js +9 -2
  402. package/package.json +5 -7
  403. package/release-gates.v2.json +66 -11
  404. package/runtime-required-scripts.json +138 -14
  405. package/config/bench-baseline.json +0 -7
  406. package/dist/core/codex-app/sks-menubar.js +0 -1
  407. package/dist/core/release/release-closure-contract.js +0 -30
  408. package/dist/core/release/release-closure-helpers.js +0 -293
  409. package/dist/core/release/release-closure-validation.js +0 -284
  410. package/dist/core/release/release-closure.js +0 -163
  411. package/dist/scripts/build-dist.js +0 -124
  412. package/dist/scripts/build-once-runner-check.js +0 -6
  413. package/dist/scripts/canonical-test-runner.js +0 -234
  414. package/dist/scripts/changelog-check.js +0 -45
  415. package/dist/scripts/check-architecture.js +0 -295
  416. package/dist/scripts/check-cli-entrypoint.js +0 -41
  417. package/dist/scripts/check-command-module-budget.js +0 -77
  418. package/dist/scripts/check-feature-quality.js +0 -51
  419. package/dist/scripts/check-legacy-free.js +0 -64
  420. package/dist/scripts/check-pipeline-budget.js +0 -49
  421. package/dist/scripts/check-pipeline-runtime.js +0 -16
  422. package/dist/scripts/check-publish-tag.js +0 -56
  423. package/dist/scripts/check-route-modularity.js +0 -72
  424. package/dist/scripts/codex-0140-capability-check.js +0 -14
  425. package/dist/scripts/codex-0140-feature-probes-check.js +0 -23
  426. package/dist/scripts/codex-permission-profiles-check.js +0 -34
  427. package/dist/scripts/codex-project-config-policy-splitter-check.js +0 -49
  428. package/dist/scripts/competitor-scorecard-check.js +0 -24
  429. package/dist/scripts/core-skill-no-drift-check.js +0 -23
  430. package/dist/scripts/db-route-materialization-check.js +0 -32
  431. package/dist/scripts/doctor-context7-mcp-repair-blackbox.js +0 -15
  432. package/dist/scripts/doctor-fastpath-check.js +0 -25
  433. package/dist/scripts/doctor-fix-production-blackbox.js +0 -35
  434. package/dist/scripts/doctor-idempotence-check.js +0 -6
  435. package/dist/scripts/doctor-ops-semantics-check.js +0 -83
  436. package/dist/scripts/doctor-startup-config-repair-blackbox.js +0 -18
  437. package/dist/scripts/doctor-supabase-mcp-repair-blackbox.js +0 -13
  438. package/dist/scripts/ensure-bin-executable.js +0 -16
  439. package/dist/scripts/fsx-hotpath-check.js +0 -9
  440. package/dist/scripts/high-risk-contracts-check.js +0 -183
  441. package/dist/scripts/hook-latency-quantum-check.js +0 -120
  442. package/dist/scripts/import-graph-budget-check.js +0 -9
  443. package/dist/scripts/mcp-tool-naming-parity-check.js +0 -14
  444. package/dist/scripts/naruto-codex-e2e-check.js +0 -105
  445. package/dist/scripts/naruto-write-e2e-check.js +0 -31
  446. package/dist/scripts/native-capability-postcheck-check.js +0 -16
  447. package/dist/scripts/ops-diagnostics-bundle-check.js +0 -11
  448. package/dist/scripts/parallel-production-smoke-check.js +0 -20
  449. package/dist/scripts/perf-budget-check.js +0 -12
  450. package/dist/scripts/project-skill-dedupe-blackbox.js +0 -62
  451. package/dist/scripts/release-dag-full-coverage-check.js +0 -98
  452. package/dist/scripts/release-dist-freshness-check.js +0 -6
  453. package/dist/scripts/release-file-ownership-check.js +0 -35
  454. package/dist/scripts/release-gate-script-parity-check.js +0 -148
  455. package/dist/scripts/release-macos-menubar-proof.js +0 -167
  456. package/dist/scripts/release-main-push-guard.js +0 -37
  457. package/dist/scripts/release-main-push-receipt.js +0 -43
  458. package/dist/scripts/release-metadata-1-19-check.js +0 -257
  459. package/dist/scripts/release-version-truth-check.js +0 -138
  460. package/dist/scripts/retention-apply-smoke-check.js +0 -19
  461. package/dist/scripts/retention-budget-check.js +0 -6
  462. package/dist/scripts/retention-dry-run-check.js +0 -8
  463. package/dist/scripts/rollback-recovery-smoke-check.js +0 -70
  464. package/dist/scripts/route-intent-regression-check.js +0 -42
  465. package/dist/scripts/runtime-current-terminal-check.js +0 -108
  466. package/dist/scripts/runtime-dist-parity-check.js +0 -76
  467. package/dist/scripts/runtime-no-src-mjs-check.js +0 -30
  468. package/dist/scripts/runtime-ts-rust-boundary-check.js +0 -58
  469. package/dist/scripts/runtime-ts-source-of-truth-check.js +0 -53
  470. package/dist/scripts/secret-preservation-guard-check.js +0 -36
  471. package/dist/scripts/seo-marketing-truthfulness-check.js +0 -98
  472. package/dist/scripts/seo-metadata-sync-check.js +0 -60
  473. package/dist/scripts/sizecheck.js +0 -148
  474. package/dist/scripts/sks-menubar-install-check.js +0 -333
  475. package/dist/scripts/supabase-secret-preservation-blackbox.js +0 -28
  476. package/dist/scripts/super-search-live-smoke-check.js +0 -115
  477. package/dist/scripts/super-search-local-http-smoke-check.js +0 -16
  478. package/dist/scripts/super-search-offline-contract-check.js +0 -43
  479. package/dist/scripts/update-fastpath-check.js +0 -28
  480. package/dist/scripts/update-preserves-supabase-keys-blackbox.js +0 -26
  481. package/dist/scripts/upgrade-migration-matrix-check.js +0 -351
  482. package/dist/scripts/write-build-manifest.js +0 -70
  483. package/dist/scripts/zellij-capability-check.js +0 -13
  484. package/dist/scripts/zellij-developer-controls-check.js +0 -16
  485. package/dist/scripts/zellij-doctor-readiness-check.js +0 -49
  486. package/dist/scripts/zellij-dynamic-pane-lifecycle-check.js +0 -19
  487. package/dist/scripts/zellij-fake-adapter-check.js +0 -31
  488. package/dist/scripts/zellij-first-slot-down-stack-check.js +0 -20
  489. package/dist/scripts/zellij-first-slot-down-stack-real-check.js +0 -348
  490. package/dist/scripts/zellij-homebrew-policy-check.js +0 -3
  491. package/dist/scripts/zellij-initial-main-only-blackbox.js +0 -21
  492. package/dist/scripts/zellij-lane-renderer-check.js +0 -78
  493. package/dist/scripts/zellij-launch-command-truth-check.js +0 -62
  494. package/dist/scripts/zellij-layout-valid-check.js +0 -120
  495. package/dist/scripts/zellij-pane-creation-lock-metrics-check.js +0 -10
  496. package/dist/scripts/zellij-pane-lock-concurrency-blackbox.js +0 -78
  497. package/dist/scripts/zellij-pane-lock-does-not-block-worker-check.js +0 -12
  498. package/dist/scripts/zellij-pane-lock-open-worker-integration-blackbox.js +0 -134
  499. package/dist/scripts/zellij-qa-app-handoff-status-check.js +0 -7
  500. package/dist/scripts/zellij-right-column-geometry-proof.js +0 -158
  501. package/dist/scripts/zellij-right-column-headless-overflow-check.js +0 -20
  502. package/dist/scripts/zellij-right-column-manager-check.js +0 -24
  503. package/dist/scripts/zellij-self-heal-check.js +0 -3
  504. package/dist/scripts/zellij-self-heal-dry-run-check.js +0 -3
  505. package/dist/scripts/zellij-self-heal-status-contract-check.js +0 -3
  506. package/dist/scripts/zellij-self-heal-typed-blackbox.js +0 -3
  507. package/dist/scripts/zellij-slot-column-anchor-check.js +0 -65
  508. package/dist/scripts/zellij-slot-column-anchor-telemetry-check.js +0 -8
  509. package/dist/scripts/zellij-slot-only-ui-check.js +0 -29
  510. package/dist/scripts/zellij-slot-pane-renderer-check.js +0 -149
  511. package/dist/scripts/zellij-slot-pane-stale-detection-check.js +0 -65
  512. package/dist/scripts/zellij-slot-pane-telemetry-renderer-check.js +0 -11
  513. package/dist/scripts/zellij-slot-renderer-proof-semantics-check.js +0 -58
  514. package/dist/scripts/zellij-slot-telemetry-check.js +0 -38
  515. package/dist/scripts/zellij-slot-telemetry-incremental-check.js +0 -46
  516. package/dist/scripts/zellij-slot-telemetry-live-flush-check.js +0 -55
  517. package/dist/scripts/zellij-slot-telemetry-performance-check.js +0 -32
  518. package/dist/scripts/zellij-slot-telemetry-real-blackbox.js +0 -19
  519. package/dist/scripts/zellij-slot-telemetry-renderer-check.js +0 -11
  520. package/dist/scripts/zellij-slot-telemetry-runtime-check.js +0 -23
  521. package/dist/scripts/zellij-spawn-on-demand-layout-check.js +0 -45
  522. package/dist/scripts/zellij-stacked-capability-routing-check.js +0 -9
  523. package/dist/scripts/zellij-stacked-fallback-integration-blackbox.js +0 -78
  524. package/dist/scripts/zellij-stacked-version-matrix-check.js +0 -29
  525. package/dist/scripts/zellij-stacked-version-parser-check.js +0 -19
  526. package/dist/scripts/zellij-ui-design-check.js +0 -92
  527. package/dist/scripts/zellij-update-missing-self-heal-check.js +0 -3
  528. package/dist/scripts/zellij-update-prompt-matrix-check.js +0 -16
  529. package/dist/scripts/zellij-update-prompt-mode-check.js +0 -18
  530. package/dist/scripts/zellij-update-prompt-safety-check.js +0 -8
  531. package/dist/scripts/zellij-worker-pane-manager-check.js +0 -108
  532. package/dist/scripts/zellij-worker-pane-manager-single-owner-check.js +0 -47
  533. package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +0 -199
  534. /package/dist/scripts/{sks-1-11-gate-lib.js → sks-cli-gate-lib.js} +0 -0
@@ -346,25 +346,6 @@ function hasTableRemovalRisk(cls = {}) {
346
346
  ]);
347
347
  return ['drop_table', 'truncate'].some((reason) => reasons.has(reason));
348
348
  }
349
- async function madSksOverrideState(root, state = {}) {
350
- if (!isMadSksRouteState(state) || !state.mission_id || state.mad_sks_active === false)
351
- return { active: false };
352
- const gateFile = state.mad_sks_gate_file || state.stop_gate || MAD_SKS_GATE_FILE;
353
- const gate = await readJson(path.join(missionDir(root, state.mission_id), gateFile), null);
354
- const owner = gate?.gate_owner?.mission_id || gate?.mission_id || state.gate_owner_mission_id;
355
- if (owner && String(owner) !== String(state.mission_id)) {
356
- return { active: false, reason: 'mad_sks_gate_owner_mismatch', gate_file: gateFile, gate_owner_mission_id: owner };
357
- }
358
- if (gate?.passed === true || gate?.permissions_deactivated === true)
359
- return { active: false, reason: 'mad_sks_gate_already_closed', gate_file: gateFile };
360
- const confirmedUntil = Date.parse(state.mad_sks_table_delete_confirmed_until || '');
361
- return {
362
- active: true,
363
- gateFile,
364
- tableDeleteConfirmed: Number.isFinite(confirmedUntil) && confirmedUntil > Date.now(),
365
- tableDeleteConfirmedUntil: Number.isFinite(confirmedUntil) ? new Date(confirmedUntil).toISOString() : null
366
- };
367
- }
368
349
  export function evaluateDbSafety({ classification, policy = DEFAULT_DB_SAFETY_POLICY, contract = null, duringNoQuestion = false, madSks = null } = {}) {
369
350
  const cls = classification || { level: 'none', reasons: [] };
370
351
  const noQuestion = Boolean(duringNoQuestion);
@@ -427,6 +408,7 @@ export function evaluateDbSafety({ classification, policy = DEFAULT_DB_SAFETY_PO
427
408
  reasons.push('database_write_target_not_local_or_branch');
428
409
  if (policy.block_direct_execute_sql_writes && cls.toolReasons?.includes?.('database_tool'))
429
410
  reasons.push('direct_mcp_execute_sql_writes_blocked');
411
+ reasons.push('database_mutation_requires_manual_sql_or_active_mad_sks_sql_plane');
430
412
  }
431
413
  if (effective.destructive)
432
414
  reasons.push('contract_attempted_to_allow_destructive_but_policy_denies');
@@ -575,8 +557,15 @@ export async function checkDbOperation(root, state, payload, { duringNoQuestion
575
557
  await appendJsonlBounded(path.join(missionDir(root, madSksSqlPlaneMissionId), 'db-safety.jsonl'), { ts: nowIso(), decision });
576
558
  return decision;
577
559
  }
578
- const madSks = await madSksOverrideState(root, state);
579
- const decision = evaluateDbSafety({ classification, policy, contract, duringNoQuestion, madSks });
560
+ const decision = evaluateDbSafety({ classification, policy, contract, duringNoQuestion, madSks: null });
561
+ if (isMadSksRouteState(state) && ['write', 'destructive'].includes(classification.level)) {
562
+ decision.reasons = [...new Set([
563
+ ...(decision.reasons || []),
564
+ 'mad_sks_sql_plane_capability_v2_required'
565
+ ])];
566
+ decision.allowed = false;
567
+ decision.action = 'block';
568
+ }
580
569
  if (decision.action === 'confirm')
581
570
  await writeMadSksTableDeletePending(root, state, decision);
582
571
  if (decision.action !== 'allow' && state?.mission_id) {
@@ -610,7 +599,8 @@ export function dbBlockReason(decision) {
610
599
  return [
611
600
  'Sneakoscope Codex Database Safety Gate blocked this operation.',
612
601
  `Reasons: ${(decision.reasons || []).join(', ') || 'unknown'}.`,
613
- 'Default DB mode is read-only. Destructive SQL-plane operations require an explicit active MAD-SKS SQL-plane capability opened by $MAD-SKS or sks mad-sks sql|apply-migration.',
602
+ 'Default DB mode is read-only. If a migration is required outside MAD-SKS, create one mission-local manual-migration.sql with forward SQL and an inactive rollback section, then ask the user to apply it manually.',
603
+ 'All live database mutations require an explicit active MAD-SKS SQL-plane capability v2 opened by $MAD-SKS or sks mad-sks sql|apply-migration.',
614
604
  'Use read-only/project-scoped Supabase MCP URLs outside MAD-SKS SQL-plane. Supabase project/account/billing/credential control-plane operations remain denied even there.'
615
605
  ].join(' ');
616
606
  }
@@ -699,7 +689,11 @@ async function scanMissionMigrationFiles(root, opts = {}) {
699
689
  for (const e of entries) {
700
690
  const p = path.join(dir, e.name);
701
691
  const rp = rel(root, p);
702
- if (rp.startsWith('.git/') || rp.startsWith('node_modules/') || rp.startsWith('.sneakoscope/'))
692
+ if (e.name.startsWith('.')
693
+ || ['node_modules', 'dist', 'build', 'coverage', 'vendor', 'archive'].includes(e.name)
694
+ || rp.startsWith('.git/')
695
+ || rp.startsWith('node_modules/')
696
+ || rp.startsWith('.sneakoscope/'))
703
697
  continue;
704
698
  if (e.isDirectory())
705
699
  await walk(p, depth + 1);
@@ -4,6 +4,7 @@ import { ensureCodexPlugins } from '../codex-plugins/codex-plugin-repair.js';
4
4
  import { runDoctorCodexStartupRepair } from './doctor-codex-startup-repair.js';
5
5
  import { ensureDir, nowIso, runProcess, which, writeJsonAtomic } from '../fsx.js';
6
6
  import { redactString } from '../secret-redaction.js';
7
+ import { messageOf } from '../errors/message.js';
7
8
  export const DOCTOR_BROWSER_USE_REPAIR_SCHEMA = 'sks.doctor-browser-use-repair.v1';
8
9
  export async function repairBrowserUse(input) {
9
10
  const root = path.resolve(input.root || process.cwd());
@@ -182,6 +183,3 @@ function tail(value, max = 2000) {
182
183
  const text = redactString(String(value || ''));
183
184
  return text.length > max ? text.slice(-max) : text;
184
185
  }
185
- function messageOf(err) {
186
- return err instanceof Error ? err.message : String(err);
187
- }
@@ -3,6 +3,7 @@ import { nowIso, writeJsonAtomic } from '../fsx.js';
3
3
  import { repairAgentRoleConfigs } from '../agents/agent-role-config.js';
4
4
  import { repairAgentConfigFileReferences } from '../codex/agent-config-file-repair.js';
5
5
  import { postcheckCodexStartupConfig } from '../codex/codex-startup-config-postcheck.js';
6
+ import { messageOf } from '../errors/message.js';
6
7
  export async function repairCodexStartupConfig(input) {
7
8
  const root = path.resolve(input.root);
8
9
  const roleRepair = await repairAgentRoleConfigs({
@@ -52,6 +53,3 @@ export async function repairCodexStartupConfig(input) {
52
53
  }
53
54
  return report;
54
55
  }
55
- function messageOf(err) {
56
- return err instanceof Error ? err.message : String(err);
57
- }
@@ -4,6 +4,7 @@ import { ensureCodexPlugins } from '../codex-plugins/codex-plugin-repair.js';
4
4
  import { computerUseStatusReport } from '../computer-use-status.js';
5
5
  import { ensureDir, nowIso, runProcess, which, writeJsonAtomic } from '../fsx.js';
6
6
  import { redactString } from '../secret-redaction.js';
7
+ import { messageOf } from '../errors/message.js';
7
8
  export const DOCTOR_COMPUTER_USE_REPAIR_SCHEMA = 'sks.doctor-computer-use-repair.v1';
8
9
  export async function repairComputerUse(input) {
9
10
  const root = path.resolve(input.root || process.cwd());
@@ -149,6 +150,3 @@ function tail(value, max = 2000) {
149
150
  const text = redactString(String(value || ''));
150
151
  return text.length > max ? text.slice(-max) : text;
151
152
  }
152
- function messageOf(err) {
153
- return err instanceof Error ? err.message : String(err);
154
- }
@@ -4,6 +4,7 @@ import { isUnmanagedProjectCodexConfig, writeCodexConfigGuarded } from '../codex
4
4
  import { CONTEXT7_REMOTE_MCP_URL, mcpServerBlock, mcpServerExplicitlyDisabled, readProjectCodexConfig, replaceOrAppendMcpServerBlock } from '../mcp/mcp-config-preservation.js';
5
5
  import { guardedWriteFile, guardContextForRoute } from '../safety/mutation-guard.js';
6
6
  import { createRequestedScopeContract } from '../safety/requested-scope-contract.js';
7
+ import { messageOf } from '../errors/message.js';
7
8
  export async function repairContext7Mcp(input) {
8
9
  const root = path.resolve(input.root);
9
10
  const config = await readProjectCodexConfig(root);
@@ -105,9 +106,6 @@ export async function repairContext7Mcp(input) {
105
106
  }
106
107
  return report;
107
108
  }
108
- function messageOf(err) {
109
- return err instanceof Error ? err.message : String(err);
110
- }
111
109
  async function probeRemoteContext7() {
112
110
  try {
113
111
  const response = await fetch(CONTEXT7_REMOTE_MCP_URL, { method: 'HEAD' });
@@ -8,6 +8,7 @@ import { isSksGeneratedRetiredProfileText, reconcileRetiredSksConfigText, RETIRE
8
8
  import { validateCodexConfigRoundTrip } from '../codex/codex-config-toml.js';
9
9
  import { inspectConfinedPath, moveConfinedPath, removeManagedPathVerified, uniqueConfinedPath } from '../managed-path-safety.js';
10
10
  import { collectNestedProjectRoots } from './current-project-guidance-nested.js';
11
+ import { escapeRegExp } from '../text/regex.js';
11
12
  export const CURRENT_PROJECT_GUIDANCE_SCHEMA = 'sks.current-project-guidance.v1';
12
13
  const AGENTS_MARKER = 'BEGIN Sneakoscope Codex GX MANAGED BLOCK';
13
14
  const RETIRED_COMMAND_NAMES = ['team', 'mad-db', 'tmux', 'xai', 'swarm', 'agent', 'ralph', 'db', 'ui', 'glm'];
@@ -341,6 +342,3 @@ function uniqueScopes(scopes) {
341
342
  }
342
343
  return [...unique.values()];
343
344
  }
344
- function escapeRegExp(value) {
345
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
346
- }
@@ -3,6 +3,7 @@ import path from 'node:path';
3
3
  import os from 'node:os';
4
4
  import { exists, nowIso, readText, writeJsonAtomic } from '../fsx.js';
5
5
  import { isUnmanagedProjectCodexConfig, writeCodexConfigGuarded } from '../codex/codex-config-guard.js';
6
+ import { escapeRegExp } from '../text/regex.js';
6
7
  export const DOCTOR_CODEX_STARTUP_REPAIR_SCHEMA = 'sks.doctor-codex-startup-repair.v1';
7
8
  export async function runDoctorCodexStartupRepair(input) {
8
9
  const root = path.resolve(input.root || process.cwd());
@@ -370,6 +371,3 @@ function stringValues(text, key) {
370
371
  function escapeToml(value) {
371
372
  return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
372
373
  }
373
- function escapeRegExp(value) {
374
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
375
- }
@@ -4,7 +4,7 @@ import { spawnSync } from 'node:child_process';
4
4
  import { MANAGED_ASSET_VERSION } from '../managed-assets/managed-assets-manifest.js';
5
5
  import { PACKAGE_VERSION, packageRoot, sha256 } from '../fsx.js';
6
6
  import { hashJson } from '../triwiki/triwiki-cache-key.js';
7
- import { SKS_MENUBAR_LABEL, sksMenuBarPaths } from '../codex-app/sks-menubar.js';
7
+ import { SKS_MENUBAR_LABEL, sksMenuBarPaths } from '../codex-app/menubar/index.js';
8
8
  export const DOCTOR_DIRTY_PLAN_SCHEMA = 'sks.doctor-dirty-plan.v2';
9
9
  export function planDoctorDirtyRepair(root, phaseIds) {
10
10
  const phases = phaseIds.map((id) => {
@@ -116,7 +116,7 @@ function phaseInputFiles(id) {
116
116
  if (id.includes('supabase'))
117
117
  return ['src/core/doctor/supabase-mcp-repair.ts', '.codex/config.toml'];
118
118
  if (id.includes('menubar'))
119
- return ['src/core/codex-app/sks-menubar.ts', 'src/commands/doctor.ts', 'package.json'];
119
+ return ['src/core/codex-app/menubar/index.ts', 'src/commands/doctor.ts', 'package.json'];
120
120
  if (id.includes('skill'))
121
121
  return ['.agents/skills', 'src/scripts/skill-registry-ledger-check.ts'];
122
122
  if (id.includes('native'))
@@ -8,6 +8,7 @@ import { withSecretPreservationGuard } from '../config/config-migration-journal.
8
8
  import { ensureProductDesignPluginInstalled } from '../product-design-app-server.js';
9
9
  import { cleanupLegacyGlobalSksHooks } from './legacy-global-hook-cleanup.js';
10
10
  import { redactSecrets } from '../secret-redaction.js';
11
+ import { messageOf } from '../errors/message.js';
11
12
  export async function runDoctorNativeCapabilityRepair(input) {
12
13
  const root = path.resolve(input.root);
13
14
  const fixRequested = input.fix || (input.flags || []).includes('--fix');
@@ -135,9 +136,6 @@ export async function cleanupNativeCapabilityProbeArtifacts(root, opts = { apply
135
136
  preserved_non_probe_files: preserved
136
137
  };
137
138
  }
138
- function messageOf(err) {
139
- return err instanceof Error ? err.message : String(err);
140
- }
141
139
  function skippedNativeCapabilityDiagnostics(root) {
142
140
  return {
143
141
  schema: 'sks.native-capability-repair-matrix.v1',
@@ -2,6 +2,7 @@ import path from 'node:path';
2
2
  import { nowIso, writeJsonAtomic } from '../fsx.js';
3
3
  import { isDoctorPhaseClean, markDoctorPhaseClean } from './doctor-dirty-planner.js';
4
4
  import { ui as cliUi } from '../../cli/cli-theme.js';
5
+ import { messageOf } from '../errors/message.js';
5
6
  export async function runDoctorFixTransaction(input) {
6
7
  const startedAt = nowIso();
7
8
  const phases = [];
@@ -172,6 +173,3 @@ function mergePhase(phase, update) {
172
173
  warnings: [...(phase.warnings || []), ...(update.warnings || [])]
173
174
  };
174
175
  }
175
- function messageOf(err) {
176
- return err instanceof Error ? err.message : String(err);
177
- }
@@ -3,6 +3,7 @@ import { CODEX_APP_IMAGE_GENERATION_DOC_URL } from '../routes.js';
3
3
  import { detectImagegenCapability } from '../imagegen/imagegen-capability.js';
4
4
  import { ensureDir, nowIso, runProcess, which, writeJsonAtomic } from '../fsx.js';
5
5
  import { redactString } from '../secret-redaction.js';
6
+ import { messageOf } from '../errors/message.js';
6
7
  export const DOCTOR_IMAGEGEN_REPAIR_SCHEMA = 'sks.doctor-imagegen-repair.v1';
7
8
  export async function repairCodexImagegen(input) {
8
9
  const root = path.resolve(input.root || process.cwd());
@@ -197,6 +198,3 @@ function tail(value, max = 2000) {
197
198
  const text = redactString(String(value || ''));
198
199
  return text.length > max ? text.slice(-max) : text;
199
200
  }
200
- function messageOf(err) {
201
- return err instanceof Error ? err.message : String(err);
202
- }
@@ -2,6 +2,7 @@ import fs from 'node:fs/promises';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { ensureDir, nowIso, readText, writeJsonAtomic } from '../fsx.js';
5
+ import { messageOf } from '../errors/message.js';
5
6
  export const LEGACY_GLOBAL_HOOK_CLEANUP_SCHEMA = 'sks.legacy-global-hook-cleanup.v1';
6
7
  export async function cleanupLegacyGlobalSksHooks(input) {
7
8
  const root = path.resolve(input.root);
@@ -173,6 +174,3 @@ async function pruneOldBackups(globalPath, keepPath) {
173
174
  if (row.file !== keepPath)
174
175
  await fs.rm(row.file, { force: true }).catch(() => undefined);
175
176
  }
176
- function messageOf(err) {
177
- return err instanceof Error ? err.message : String(err);
178
- }
@@ -4,6 +4,7 @@ import fs from 'node:fs/promises';
4
4
  import { nowIso, writeJsonAtomic } from '../fsx.js';
5
5
  import { isUnmanagedProjectCodexConfig, writeCodexConfigGuarded } from '../codex/codex-config-guard.js';
6
6
  import { mcpServerBlock, mcpServerExplicitlyDisabled, readProjectCodexConfig, tomlTableRange } from '../mcp/mcp-config-preservation.js';
7
+ import { messageOf } from '../errors/message.js';
7
8
  export async function detectAndRepairMcpTransportCollisions(input) {
8
9
  const root = path.resolve(input.root);
9
10
  const apply = input.apply === true;
@@ -134,6 +135,3 @@ function commentOutMcpServerBlock(block, server, projectTransport, globalTranspo
134
135
  .join('\n');
135
136
  return `${note}${commented}\n`;
136
137
  }
137
- function messageOf(err) {
138
- return err instanceof Error ? err.message : String(err);
139
- }
@@ -1,5 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import { inspectConfinedPath, moveConfinedPath, removeEmptyTreeVerified, uniqueConfinedPath, walkConfinedEntries } from '../managed-path-safety.js';
3
+ import { escapeRegExp } from '../text/regex.js';
3
4
  export const REMOVED_PUBLIC_COMMANDS = ['team', 'mad-db', 'tmux', 'xai', 'swarm', 'agent', 'ralph', 'ui', 'glm'];
4
5
  const RETIRED_COMMAND_TOMBSTONES = new Set(REMOVED_PUBLIC_COMMANDS);
5
6
  const RETIRED_MISSION_MODES = new Set([
@@ -69,6 +70,3 @@ export async function walkEntries(boundary, root) {
69
70
  export async function removeEmptyTree(boundary, root) {
70
71
  return removeEmptyTreeVerified(boundary, root);
71
72
  }
72
- function escapeRegExp(value) {
73
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
74
- }
@@ -4,6 +4,7 @@ import fs from 'node:fs/promises';
4
4
  import { nowIso, writeJsonAtomic } from '../fsx.js';
5
5
  import { isUnmanagedProjectCodexConfig, writeCodexConfigGuarded } from '../codex/codex-config-guard.js';
6
6
  import { mcpServerBlock, mcpServerExplicitlyDisabled, readProjectCodexConfig, replaceOrAppendMcpServerBlock, tomlTableRange } from '../mcp/mcp-config-preservation.js';
7
+ import { messageOf } from '../errors/message.js';
7
8
  export async function repairSupabaseMcp(input) {
8
9
  const root = path.resolve(input.root);
9
10
  const config = await readProjectCodexConfig(root);
@@ -136,9 +137,6 @@ export async function repairSupabaseMcp(input) {
136
137
  }
137
138
  return report;
138
139
  }
139
- function messageOf(err) {
140
- return err instanceof Error ? err.message : String(err);
141
- }
142
140
  function setReadOnly(block) {
143
141
  const lines = String(block || '').replace(/\s*$/, '').split(/\r?\n/);
144
142
  const index = lines.findIndex((line) => /^\s*read[_-]?only\s*=/.test(line));
@@ -0,0 +1,186 @@
1
+ import path from 'node:path';
2
+ import { scanCodeStructure } from './code-structure.js';
3
+ import { readJson, readText, sha256 } from './fsx.js';
4
+ import { missionDir } from './mission.js';
5
+ export const ENGINEERING_SANITY_REVIEW_ARTIFACT = 'engineering-sanity-review.json';
6
+ export const ENGINEERING_SANITY_REVIEW_SCHEMA = 'sks.engineering-sanity-review.v1';
7
+ export const ENGINEERING_SANITY_CODE_STRUCTURE_REPORT = 'code-structure-report.json';
8
+ export const ENGINEERING_SANITY_CHECK_IDS = Object.freeze([
9
+ 'solid_boundaries',
10
+ 'n_plus_one_and_repeated_io',
11
+ 'bounded_render_recursion_event_retry_polling',
12
+ 'verification_bypass_absent'
13
+ ]);
14
+ const FINAL_CHECK_STATUSES = new Set(['passed', 'not_applicable']);
15
+ export function createEngineeringSanityReviewSeed(route = null, report = null, reportText = '') {
16
+ const candidates = engineeringCandidates(report);
17
+ return {
18
+ schema: ENGINEERING_SANITY_REVIEW_SCHEMA,
19
+ passed: false,
20
+ route: route || null,
21
+ changed_files: sortedUniqueStrings(report?.changed_scope?.source_files),
22
+ added_hunks_reviewed: false,
23
+ real_callers_traced: false,
24
+ static_scan_role: 'candidate_detection_only_not_completion_proof',
25
+ code_structure_report: ENGINEERING_SANITY_CODE_STRUCTURE_REPORT,
26
+ code_structure_report_sha256: reportText ? `sha256:${sha256(reportText)}` : null,
27
+ changed_scope_sha256: report ? engineeringScopeHash(report) : null,
28
+ reviewed_candidate_ids: [],
29
+ candidate_dispositions: [],
30
+ checks: Object.fromEntries(ENGINEERING_SANITY_CHECK_IDS.map((id) => [id, {
31
+ status: 'pending',
32
+ reason: null,
33
+ evidence: []
34
+ }])),
35
+ candidate_findings: candidates,
36
+ resolved_findings: [],
37
+ unresolved_findings: [],
38
+ blockers: [],
39
+ notes: []
40
+ };
41
+ }
42
+ export function validateEngineeringSanityReview(review = {}) {
43
+ const blockers = [];
44
+ if (review?.schema !== ENGINEERING_SANITY_REVIEW_SCHEMA)
45
+ blockers.push('schema');
46
+ if (review?.passed !== true)
47
+ blockers.push('passed');
48
+ if (review?.added_hunks_reviewed !== true)
49
+ blockers.push('added_hunks_reviewed');
50
+ if (review?.real_callers_traced !== true)
51
+ blockers.push('real_callers_traced');
52
+ if (review?.static_scan_role !== 'candidate_detection_only_not_completion_proof')
53
+ blockers.push('static_scan_role');
54
+ if (!Array.isArray(review?.changed_files))
55
+ blockers.push('changed_files_invalid');
56
+ if (!Array.isArray(review?.candidate_findings))
57
+ blockers.push('candidate_findings_invalid');
58
+ if (!Array.isArray(review?.reviewed_candidate_ids))
59
+ blockers.push('reviewed_candidate_ids_invalid');
60
+ if (!Array.isArray(review?.candidate_dispositions))
61
+ blockers.push('candidate_dispositions_invalid');
62
+ if (!Array.isArray(review?.resolved_findings))
63
+ blockers.push('resolved_findings_invalid');
64
+ if (!Array.isArray(review?.unresolved_findings))
65
+ blockers.push('unresolved_findings_invalid');
66
+ else if (review.unresolved_findings.length > 0)
67
+ blockers.push('unresolved_findings');
68
+ if (!Array.isArray(review?.blockers))
69
+ blockers.push('blockers_invalid');
70
+ else if (review.blockers.length > 0)
71
+ blockers.push('blockers');
72
+ for (const id of ENGINEERING_SANITY_CHECK_IDS) {
73
+ const check = review?.checks?.[id];
74
+ const status = String(check?.status || '');
75
+ if (!FINAL_CHECK_STATUSES.has(status)) {
76
+ blockers.push(`checks:${id}:status`);
77
+ continue;
78
+ }
79
+ if (!Array.isArray(check?.evidence) || check.evidence.length === 0 || check.evidence.some((item) => typeof item !== 'string' || !item.trim())) {
80
+ blockers.push(`checks:${id}:evidence`);
81
+ }
82
+ if (status === 'not_applicable' && (typeof check?.reason !== 'string' || !check.reason.trim())) {
83
+ blockers.push(`checks:${id}:reason`);
84
+ }
85
+ }
86
+ return { ok: blockers.length === 0, blockers: [...new Set(blockers)] };
87
+ }
88
+ export async function validateEngineeringSanityReviewArtifact(root, missionId, review = {}, opts = {}) {
89
+ const basic = validateEngineeringSanityReview(review);
90
+ const blockers = [...basic.blockers];
91
+ if (review?.code_structure_report !== ENGINEERING_SANITY_CODE_STRUCTURE_REPORT)
92
+ blockers.push('code_structure_report');
93
+ const reportFile = path.join(missionDir(root, missionId), ENGINEERING_SANITY_CODE_STRUCTURE_REPORT);
94
+ const persistedText = await readText(reportFile, '');
95
+ const persisted = persistedText ? await readJson(reportFile, null) : null;
96
+ if (persisted?.schema_version !== 1)
97
+ blockers.push(`${ENGINEERING_SANITY_CODE_STRUCTURE_REPORT}:schema_version`);
98
+ if (String(review?.code_structure_report_sha256 || '') !== `sha256:${sha256(persistedText)}`)
99
+ blockers.push('code_structure_report_sha256');
100
+ const declaredBase = scopeBase(opts.base);
101
+ const persistedBase = scopeBase(persisted?.changed_scope?.base);
102
+ if (declaredBase && persistedBase && declaredBase !== persistedBase) {
103
+ blockers.push(`${ENGINEERING_SANITY_CODE_STRUCTURE_REPORT}:changed_scope_base`);
104
+ }
105
+ const base = declaredBase || persistedBase || 'HEAD';
106
+ const fresh = await scanCodeStructure(root, { changedSince: base, includeOk: true });
107
+ const freshScopeHash = engineeringScopeHash(fresh);
108
+ if (review?.changed_scope_sha256 !== freshScopeHash)
109
+ blockers.push('changed_scope_sha256');
110
+ if (engineeringScopeHash(persisted) !== freshScopeHash)
111
+ blockers.push(`${ENGINEERING_SANITY_CODE_STRUCTURE_REPORT}:stale_changed_scope`);
112
+ const freshChangedFiles = sortedUniqueStrings(fresh?.changed_scope?.source_files);
113
+ if (JSON.stringify(sortedUniqueStrings(review?.changed_files)) !== JSON.stringify(freshChangedFiles))
114
+ blockers.push('changed_files');
115
+ const freshCandidates = engineeringCandidates(fresh);
116
+ const freshCandidateIds = freshCandidates.map((candidate) => candidate.id).sort();
117
+ const persistedCandidateIds = engineeringCandidates(persisted).map((candidate) => candidate.id).sort();
118
+ if (JSON.stringify(persistedCandidateIds) !== JSON.stringify(freshCandidateIds))
119
+ blockers.push(`${ENGINEERING_SANITY_CODE_STRUCTURE_REPORT}:stale_candidates`);
120
+ if (JSON.stringify(sortedUniqueStrings(review?.reviewed_candidate_ids)) !== JSON.stringify(freshCandidateIds))
121
+ blockers.push('reviewed_candidate_ids');
122
+ if (JSON.stringify(candidateFindingIds(review?.candidate_findings)) !== JSON.stringify(freshCandidateIds))
123
+ blockers.push('candidate_findings');
124
+ const dispositions = Array.isArray(review?.candidate_dispositions) ? review.candidate_dispositions : [];
125
+ const dispositionIds = sortedUniqueStrings(dispositions.map((row) => row?.candidate_id));
126
+ if (JSON.stringify(dispositionIds) !== JSON.stringify(freshCandidateIds))
127
+ blockers.push('candidate_dispositions');
128
+ const freshCandidatesById = new Map(freshCandidates.map((candidate) => [candidate.id, candidate]));
129
+ for (const row of dispositions) {
130
+ if (!['resolved', 'false_positive'].includes(String(row?.status || '')))
131
+ blockers.push('candidate_dispositions:status');
132
+ if (typeof row?.reason !== 'string' || !row.reason.trim())
133
+ blockers.push('candidate_dispositions:reason');
134
+ if (!Array.isArray(row?.evidence) || row.evidence.length === 0 || row.evidence.some((item) => typeof item !== 'string' || !item.trim()))
135
+ blockers.push('candidate_dispositions:evidence');
136
+ const candidate = freshCandidatesById.get(String(row?.candidate_id || ''));
137
+ if (!candidate || String(row?.source_scope || '') !== String(candidate?.source_scope || ''))
138
+ blockers.push('candidate_dispositions:source_scope');
139
+ if (JSON.stringify(normalizeLineRanges(row?.added_hunk_line_ranges)) !== JSON.stringify(normalizeLineRanges(candidate?.added_hunk_line_ranges))) {
140
+ blockers.push('candidate_dispositions:added_hunk_line_ranges');
141
+ }
142
+ }
143
+ return { ok: blockers.length === 0, blockers: [...new Set(blockers)], report: fresh };
144
+ }
145
+ export function engineeringScopeHash(report = {}) {
146
+ const scope = report?.changed_scope || {};
147
+ return `sha256:${sha256(JSON.stringify({
148
+ mode: scope.mode || null,
149
+ base: scope.base || null,
150
+ changed_files: sortedUniqueStrings(scope.changed_files),
151
+ source_files: sortedUniqueStrings(scope.source_files),
152
+ entries: Array.isArray(scope.entries)
153
+ ? scope.entries
154
+ .map((entry) => ({
155
+ path: String(entry?.path || ''),
156
+ status: String(entry?.status || ''),
157
+ lines_added: Number(entry?.lines_added || 0),
158
+ lines_deleted: Number(entry?.lines_deleted || 0),
159
+ source_sha256: typeof entry?.source_sha256 === 'string' ? entry.source_sha256 : null
160
+ }))
161
+ .sort((left, right) => left.path.localeCompare(right.path))
162
+ : []
163
+ }))}`;
164
+ }
165
+ function scopeBase(value) {
166
+ const text = String(value ?? '').trim();
167
+ return text || '';
168
+ }
169
+ function engineeringCandidates(report = {}) {
170
+ const tags = new Set(['solid', 'n-plus-one', 'unbounded-loop', 'verification-bypass', 'db-pool', 'transaction']);
171
+ return (Array.isArray(report?.semantic_review?.findings) ? report.semantic_review.findings : [])
172
+ .filter((finding) => tags.has(String(finding?.tag || '')) && typeof finding?.id === 'string' && finding.id)
173
+ .sort((left, right) => left.id.localeCompare(right.id));
174
+ }
175
+ function candidateFindingIds(value) {
176
+ return sortedUniqueStrings(Array.isArray(value) ? value.map((row) => row?.id || row?.candidate_id) : []);
177
+ }
178
+ function sortedUniqueStrings(value) {
179
+ return [...new Set(Array.isArray(value) ? value.map((item) => String(item || '').trim()).filter(Boolean) : [])].sort();
180
+ }
181
+ function normalizeLineRanges(value) {
182
+ return (Array.isArray(value) ? value : [])
183
+ .map((row) => ({ start: Number(row?.start || 0), end: Number(row?.end || 0) }))
184
+ .filter((row) => Number.isInteger(row.start) && Number.isInteger(row.end) && row.start > 0 && row.end >= row.start)
185
+ .sort((left, right) => left.start - right.start || left.end - right.end);
186
+ }
@@ -0,0 +1,3 @@
1
+ export function messageOf(error) {
2
+ return error instanceof Error ? error.message : String(error);
3
+ }
@@ -1,4 +1,5 @@
1
1
  import { nowIso, randomId } from '../fsx.js';
2
+ import { asRecordOrEmpty as asRecord } from '../json/records.js';
2
3
  export const EVIDENCE_SCHEMA = 'sks.evidence.v1';
3
4
  export const EVIDENCE_INDEX_SCHEMA = 'sks.evidence-index.v1';
4
5
  export const PROJECT_EVIDENCE_INDEX_SCHEMA = 'sks.project-evidence-index.v1';
@@ -46,9 +47,6 @@ export const EVIDENCE_TRUST = Object.freeze([
46
47
  'low',
47
48
  'blocked'
48
49
  ]);
49
- function asRecord(value) {
50
- return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
51
- }
52
50
  function stringOrNull(value) {
53
51
  return typeof value === 'string' ? value : null;
54
52
  }
@@ -100,6 +100,7 @@ const FIXTURES = Object.freeze({
100
100
  }),
101
101
  'cli-context7': fixture('real_optional', 'sks context7 check --json', [], 'pass'),
102
102
  'cli-super-search': fixture('execute', 'sks super-search doctor --json', [], 'pass'),
103
+ 'cli-search': fixture('execute', 'sks search status --json', [], 'pass'),
103
104
  'cli-task': fixture('execute', 'sks task instant --plan --json', [], 'pass'),
104
105
  'cli-release': fixture('execute', 'sks release affected --json', [], 'blocked', { reason: '18차: the phantom requiredSections schema mismatch (five_lane_review/integration_evidence/session_cleanup, from commit d4526f84 with no producer ever wired up) has been fixed -- missing_sections is now honestly empty. The release-gate DAG still legitimately fails/blocks on other real gates (e.g. release:readiness) independent of this fix, so the command still exits non-zero and this fixture stays honestly blocked rather than claiming full green.' }),
105
106
  'cli-triwiki': fixture('execute', 'sks triwiki index --json', [], 'pass'),
@@ -8,6 +8,7 @@ import { COMMAND_CATALOG, DOLLAR_COMMAND_ALIASES, DOLLAR_COMMANDS, LEGACY_DOLLAR
8
8
  import { FEATURE_QUALITY_LEVELS, fixtureForFeature, fixtureSummary, validateFeatureFixtures } from './feature-fixtures.js';
9
9
  import { runFeatureFixture, writeFeatureFixtureReports } from './feature-fixture-runner.js';
10
10
  import { PACKAGE_VERSION, exists, nowIso, packageRoot, readJson, readText, runProcess, writeJsonAtomic, writeTextAtomic } from './fsx.js';
11
+ import { uniqueStrings } from './text/strings.js';
11
12
  export const FEATURE_REGISTRY_SCHEMA = 'sks.feature-registry.v1';
12
13
  export const FEATURE_INVENTORY_SCHEMA = 'sks.feature-inventory.v1';
13
14
  export const ALL_FEATURES_SELFTEST_SCHEMA = 'sks.all-features-selftest.v1';
@@ -815,9 +816,6 @@ function dedupeFeatureCommandSurface(feature) {
815
816
  source_refs: sourceRefs
816
817
  };
817
818
  }
818
- function uniqueStrings(values) {
819
- return [...new Set(values.map((value) => String(value || '').trim()).filter(Boolean))];
820
- }
821
819
  function namespaceFeatureDollarReferences(value) {
822
820
  if (typeof value === 'string')
823
821
  return prefixKnownSksDollarReferences(value, FEATURE_DOLLAR_REFERENCE_NAMES);
package/dist/core/fsx.js CHANGED
@@ -85,7 +85,20 @@ export async function readText(p, fallback) {
85
85
  throw err;
86
86
  }
87
87
  }
88
+ export function assertTestHomeWriteAllowed(p) {
89
+ if (process.env.SKS_TEST_FORBID_REAL_HOME !== '1')
90
+ return;
91
+ const realHome = process.env.SKS_TEST_REAL_HOME;
92
+ if (!realHome)
93
+ return;
94
+ const forbidden = path.join(path.resolve(realHome), '.codex');
95
+ const target = path.resolve(p);
96
+ if (target === forbidden || target.startsWith(`${forbidden}${path.sep}`)) {
97
+ throw new Error(`sks_test_forbid_real_home_write: refusing to write ${target} while SKS_TEST_FORBID_REAL_HOME=1`);
98
+ }
99
+ }
88
100
  export async function writeTextAtomic(p, text, opts = {}) {
101
+ assertTestHomeWriteAllowed(p);
89
102
  await ensureDir(path.dirname(p));
90
103
  try {
91
104
  if ((await fsp.readFile(p, 'utf8')) === text) {
@@ -8,6 +8,7 @@ import { listSharedFiles } from './git-status.js';
8
8
  import { ensureGitPolicy, ensureSharedMemoryDirs, readGitPolicy } from './git-policy.js';
9
9
  import { isMockPositiveSharedClaim, redactSharedRecord, sharedRecordHasSecret } from './shared-memory-security.js';
10
10
  import { validateGitPolicy, validateSharedMemoryManifest, validateSharedRecordFile } from './validators.js';
11
+ import { asRecordOrEmpty as asRecord } from '../json/records.js';
11
12
  export async function publishSharedMemory(root, opts = {}) {
12
13
  const target = opts.target || 'all';
13
14
  const policy = await ensureGitPolicy(root, { write: true });
@@ -365,6 +366,3 @@ async function latestMissionId(root) {
365
366
  }
366
367
  return entries.filter((name) => name.startsWith('M-')).sort().at(-1) || null;
367
368
  }
368
- function asRecord(value) {
369
- return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
370
- }
@@ -1,6 +1,7 @@
1
1
  import fsp from 'node:fs/promises';
2
2
  import { GIT_POLICY_SCHEMA, SHARED_MEMORY_MANIFEST_SCHEMA } from './git-policy.js';
3
3
  import { isMockPositiveSharedClaim, sharedRecordHasSecret } from './shared-memory-security.js';
4
+ import { asRecordOrEmpty as asRecord } from '../json/records.js';
4
5
  export function validateGitPolicy(policy) {
5
6
  const issues = [];
6
7
  const row = asRecord(policy);
@@ -56,6 +57,3 @@ export async function validateSharedRecordFile(file, policy) {
56
57
  return { ok: false, checked: 1, issues: [`invalid_json:${err instanceof Error ? err.message : String(err)}`] };
57
58
  }
58
59
  }
59
- function asRecord(value) {
60
- return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
61
- }