sneakoscope 10.3.9 → 10.4.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 (226) hide show
  1. package/README.md +6 -6
  2. package/config/skills-hash-ledger.v1.json +2 -1
  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 +1 -2
  6. package/dist/cli/codex-app-command.js +1 -1
  7. package/dist/cli/feature-commands.js +1 -2
  8. package/dist/cli/global-mode-router.js +0 -16
  9. package/dist/commands/codex-native.js +1 -7
  10. package/dist/commands/codex.js +5 -6
  11. package/dist/commands/doctor-console.js +1 -11
  12. package/dist/commands/doctor-helpers.js +2 -20
  13. package/dist/commands/doctor.js +0 -5
  14. package/dist/config/skills-manifest.json +5 -4
  15. package/dist/core/agent-bridge/async-command.js +5 -3
  16. package/dist/core/agents/agent-effort-policy.js +4 -7
  17. package/dist/core/agents/agent-orchestrator.js +0 -1
  18. package/dist/core/agents/agent-roster.js +2 -4
  19. package/dist/core/agents/native-worker-backend-router.js +7 -15
  20. package/dist/core/code-structure.js +0 -1
  21. package/dist/core/codex/codex-cli-update.js +10 -168
  22. package/dist/core/codex/codex-permission-profiles.js +0 -39
  23. package/dist/core/codex-app/codex-agent-role-sync.js +1 -35
  24. package/dist/core/codex-app/codex-app-execution-profile.js +2 -5
  25. package/dist/core/codex-app/codex-model-catalog.js +0 -3
  26. package/dist/core/codex-app/openrouter-provider.js +0 -1
  27. package/dist/core/codex-app.js +10 -46
  28. package/dist/core/codex-compat/codex-compat-report.js +4 -6
  29. package/dist/core/codex-compat/codex-hook-output-builders.js +3 -0
  30. package/dist/core/codex-compat/codex-runtime-contract.js +4 -44
  31. package/dist/core/codex-compat/codex-version-policy.js +29 -67
  32. package/dist/core/codex-compat/codex-version.js +1 -4
  33. package/dist/core/codex-control/codex-current-app-capability.js +7 -66
  34. package/dist/core/codex-control/codex-current-capability.js +32 -140
  35. package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
  36. package/dist/core/codex-exec-output-schema.js +7 -119
  37. package/dist/core/codex-lb/codex-lb-env.js +0 -19
  38. package/dist/core/codex-lb/combined-catalog/builder.js +2 -2
  39. package/dist/core/codex-lb/combined-catalog/latest-generation.js +53 -0
  40. package/dist/core/codex-lb/desktop-controller-v3/live-probes.js +2 -3
  41. package/dist/core/codex-lb/desktop-controller-v3/preflight-probes.js +2 -3
  42. package/dist/core/codex-lb/desktop-controller-v3/probe-route.js +23 -0
  43. package/dist/core/codex-model-guard.js +0 -9
  44. package/dist/core/codex-native/codex-native-feature-broker.js +18 -99
  45. package/dist/core/codex-native/codex-native-feature-matrix.js +2 -12
  46. package/dist/core/codex-native/codex-native-harness-compat.js +1 -4
  47. package/dist/core/codex-native/codex-native-invocation-router.js +2 -10
  48. package/dist/core/codex-native/core-skill-manifest.js +1 -1
  49. package/dist/core/codex-plugins/codex-plugin-json.js +20 -89
  50. package/dist/core/codex-plugins/codex-plugin-repair.js +0 -4
  51. package/dist/core/commands/mad-sks-command.js +2 -10
  52. package/dist/core/commands/naruto-command.js +2 -2
  53. package/dist/core/commands/qa-loop-command.js +1 -1
  54. package/dist/core/doctor/codex-current-app-doctor.js +0 -9
  55. package/dist/core/doctor/doctor-codex-startup-repair.js +9 -5
  56. package/dist/core/doctor/doctor-readiness-matrix.js +0 -6
  57. package/dist/core/doctor/retired-managed-residue-artifacts.js +2 -1
  58. package/dist/core/doctor/retired-managed-residue-runtime.js +27 -0
  59. package/dist/core/doctor/stale-subagent-default.js +30 -0
  60. package/dist/core/harness-conflicts.js +1 -1
  61. package/dist/core/harness-guard.js +123 -22
  62. package/dist/core/hooks-runtime/exclusive-gui-surface-gate.js +155 -0
  63. package/dist/core/hooks-runtime/global-role-pin-refresh.js +25 -0
  64. package/dist/core/hooks-runtime/hook-context.js +3 -1
  65. package/dist/core/hooks-runtime/hook-io.js +3 -3
  66. package/dist/core/hooks-runtime/jev-spawn-routing.js +10 -7
  67. package/dist/core/hooks-runtime/managed-guidance-preflight.js +20 -2
  68. package/dist/core/hooks-runtime/official-subagent-lifecycle.js +24 -10
  69. package/dist/core/hooks-runtime/parent-orchestration-gate.js +14 -27
  70. package/dist/core/hooks-runtime/payload-signals.js +1 -1
  71. package/dist/core/hooks-runtime/shell-tool-name.js +1 -0
  72. package/dist/core/hooks-runtime/spawn-role-pin-heal.js +15 -0
  73. package/dist/core/hooks-runtime/spawn-tool-name.js +7 -0
  74. package/dist/core/hooks-runtime/subagent-context.js +10 -0
  75. package/dist/core/hooks-runtime/subagent-spawn-policy.js +7 -4
  76. package/dist/core/hooks-runtime/subagent-stop-hook.js +2 -0
  77. package/dist/core/hooks-runtime.js +30 -18
  78. package/dist/core/image-ux-review.js +2 -4
  79. package/dist/core/init/skills.js +1 -1
  80. package/dist/core/init.js +2 -1
  81. package/dist/core/loops/loop-concurrency-budget.js +0 -22
  82. package/dist/core/loops/loop-gate-selector.js +1 -1
  83. package/dist/core/loops/loop-worker-runtime.js +3 -9
  84. package/dist/core/mad-sks/sql-plane/operation-store.js +5 -1
  85. package/dist/core/managed-assets/managed-assets-manifest.js +1 -1
  86. package/dist/core/naruto/naruto-loop-mesh.js +1 -5
  87. package/dist/core/naruto/naruto-loop-worker-router.js +0 -7
  88. package/dist/core/pipeline-internals/runtime-core.js +2 -3
  89. package/dist/core/pipeline.js +1 -5
  90. package/dist/core/proof/evidence-collector.js +0 -2
  91. package/dist/core/provider/model-router.js +12 -20
  92. package/dist/core/qa-loop.js +1 -4
  93. package/dist/core/recallpulse/policy.js +3 -3
  94. package/dist/core/recallpulse.js +1 -1
  95. package/dist/core/release/canonical-test-proof.js +0 -1
  96. package/dist/core/release/gate-affected-globs.js +0 -1
  97. package/dist/core/release/release-authorization-snapshot.js +2 -2
  98. package/dist/core/release/release-gate-contract.js +0 -1
  99. package/dist/core/release/release-real-contract.js +0 -1
  100. package/dist/core/release/runtime-script-pack-closure.js +3 -5
  101. package/dist/core/research/mock-result.js +3 -3
  102. package/dist/core/research/research-adversarial-review.js +12 -12
  103. package/dist/core/research/research-claim-synthesizer.js +5 -5
  104. package/dist/core/research/research-falsification-runner.js +5 -5
  105. package/dist/core/research/research-plan-markdown.js +1 -1
  106. package/dist/core/research/research-super-search.js +2 -2
  107. package/dist/core/research/research-synthesis-writer.js +4 -4
  108. package/dist/core/research.js +7 -8
  109. package/dist/core/routes.js +7 -5
  110. package/dist/core/safety/ssot-authority-inventory.js +0 -1
  111. package/dist/core/subagents/agent-catalog.js +3 -0
  112. package/dist/core/subagents/child-thread-activity.js +37 -0
  113. package/dist/core/subagents/exclusive-surface-rule.js +3 -0
  114. package/dist/core/subagents/exclusive-tool-surface.js +19 -0
  115. package/dist/core/subagents/model-policy.js +8 -11
  116. package/dist/core/subagents/model-tiers.js +99 -22
  117. package/dist/core/subagents/naruto-help-contract.js +8 -8
  118. package/dist/core/subagents/naruto-host-credentials.js +3 -3
  119. package/dist/core/subagents/official-subagent-config.js +11 -5
  120. package/dist/core/subagents/official-subagent-prompt.js +3 -1
  121. package/dist/core/subagents/official-subagent-runner.js +5 -10
  122. package/dist/core/subagents/role-model-pins.js +84 -0
  123. package/dist/core/subagents/subagent-evidence.js +5 -3
  124. package/dist/core/subagents/wave-lifecycle.js +10 -28
  125. package/dist/core/triwiki/context-graph/compiler/cache-key.js +0 -1
  126. package/dist/core/triwiki/context-graph/extractors/topology/gates.js +1 -2
  127. package/dist/core/triwiki/triwiki-module-card.js +0 -1
  128. package/dist/core/version-manager.js +0 -6
  129. package/dist/core/version.js +1 -1
  130. package/dist/native/sks-menubar/Sources/SettingsViewController.swift +1 -1
  131. package/dist/scripts/codex-app-handoff-check.js +0 -1
  132. package/dist/scripts/codex-app-handoff-launch-check.js +0 -1
  133. package/dist/scripts/codex-current-app-server-v2-check.js +13 -5
  134. package/dist/scripts/codex-current-binary-identity-check.js +1 -1
  135. package/dist/scripts/codex-current-capability-check.js +4 -9
  136. package/dist/scripts/codex-native-agent-role-content-check.js +2 -2
  137. package/dist/scripts/codex-native-gate-lib.js +15 -101
  138. package/dist/scripts/codex-native-runtime-e2e-fixture.js +2 -14
  139. package/dist/scripts/codex-plugin-app-template-policy-check.js +0 -1
  140. package/dist/scripts/codex-sdk-backend-router-check.js +4 -5
  141. package/dist/scripts/context-graph-check.js +1 -1
  142. package/dist/scripts/docs-truthfulness-check.js +0 -1
  143. package/dist/scripts/mcp-plugin-inventory-check.js +0 -1
  144. package/dist/scripts/packlist-performance-check.js +1 -1
  145. package/dist/scripts/pipeline-codex-native-doctor-mad-routing-real-blackbox.js +0 -2
  146. package/dist/scripts/pipeline-codex-native-image-routing-real-blackbox.js +0 -1
  147. package/dist/scripts/pipeline-codex-native-loop-routing-real-blackbox.js +1 -22
  148. package/dist/scripts/pipeline-codex-native-qa-routing-real-blackbox.js +0 -1
  149. package/dist/scripts/pipeline-codex-native-research-routing-real-blackbox.js +0 -1
  150. package/dist/scripts/release-metadata-check.js +4 -20
  151. package/dist/scripts/release-parallel-speed-budget-check.js +1 -1
  152. package/dist/scripts/release-real-check.js +0 -1
  153. package/dist/scripts/runtime-domain-gate-lib.js +2 -6
  154. package/dist/scripts/typed-routing-gate-lib.js +16 -51
  155. package/package.json +3 -6
  156. package/release-gates.v2.json +2 -39
  157. package/runtime-required-scripts.json +0 -5
  158. package/dist/core/architecture-hardening/contracts/contracts.js +0 -253
  159. package/dist/core/architecture-hardening/state/state-service.js +0 -191
  160. package/dist/core/codex-app/codex-agent-type-probe.js +0 -228
  161. package/dist/core/codex-app/codex-desktop-routing-ownership.js +0 -90
  162. package/dist/core/codex-app/codex-models-cache.js +0 -153
  163. package/dist/core/codex-app/mcp-manager.js +0 -71
  164. package/dist/core/codex-app/multi-provider-router-support.js +0 -25
  165. package/dist/core/codex-app/role-model-catalog-priority.js +0 -61
  166. package/dist/core/codex-compat/codex-capability-matrix.js +0 -208
  167. package/dist/core/codex-compat/codex-hook-output-normalizer.js +0 -45
  168. package/dist/core/codex-control/codex-current-collab-agent-real-probe.js +0 -65
  169. package/dist/core/codex-control/codex-current-core-capability.js +0 -163
  170. package/dist/core/codex-control/codex-current-core-native-exec.js +0 -25
  171. package/dist/core/codex-control/codex-current-core-probe-runner.js +0 -191
  172. package/dist/core/codex-control/codex-current-core-real-probes.js +0 -88
  173. package/dist/core/codex-control/codex-current-doctor-real-probe.js +0 -69
  174. package/dist/core/codex-control/codex-current-feature-capability.js +0 -124
  175. package/dist/core/codex-control/codex-current-feature-probes.js +0 -190
  176. package/dist/core/codex-control/codex-current-image-path-real-probe.js +0 -114
  177. package/dist/core/codex-control/codex-current-plugin-real-probes.js +0 -118
  178. package/dist/core/codex-control/codex-current-rich-schema-real-probe.js +0 -42
  179. package/dist/core/codex-control/codex-current-sandbox-real-probe.js +0 -104
  180. package/dist/core/codex-control/codex-current-usage-parser.js +0 -80
  181. package/dist/core/codex-control/codex-current-web-search-probe.js +0 -90
  182. package/dist/core/codex-control/codex-tool-schema-fixtures.js +0 -56
  183. package/dist/core/codex-lb/probes/cli-image-tool-probe.js +0 -203
  184. package/dist/core/codex-lb-circuit.js +0 -126
  185. package/dist/core/codex-native/codex-native-pattern-analysis.js +0 -66
  186. package/dist/core/codex-native/codex-native-reference-cache.js +0 -95
  187. package/dist/core/codex-native/codex-native-reference-evidence.js +0 -1
  188. package/dist/core/codex-native/codex-native-reference-source.js +0 -146
  189. package/dist/core/codex-native/codex-native-rename-map.js +0 -24
  190. package/dist/core/config/managed-config-merge.js +0 -153
  191. package/dist/core/evidence/v2/evidence-key.js +0 -132
  192. package/dist/core/observability/architecture-hardening/safe-projection.js +0 -65
  193. package/dist/core/pipeline/active-context.js +0 -1
  194. package/dist/core/pipeline/agent-stage-policy.js +0 -1
  195. package/dist/core/pipeline/pipeline-plan-writer.js +0 -1
  196. package/dist/core/pipeline/plan-schema.js +0 -1
  197. package/dist/core/pipeline/prompt-context-answer.js +0 -1
  198. package/dist/core/pipeline/prompt-context-computer-use.js +0 -1
  199. package/dist/core/pipeline/prompt-context-dfix.js +0 -1
  200. package/dist/core/pipeline/prompt-context.js +0 -1
  201. package/dist/core/pipeline/route-prep-db.js +0 -1
  202. package/dist/core/pipeline/route-prep-gx.js +0 -1
  203. package/dist/core/pipeline/route-prep-image-ux.js +0 -1
  204. package/dist/core/pipeline/route-prep-ppt.js +0 -1
  205. package/dist/core/pipeline/route-prep-qa.js +0 -1
  206. package/dist/core/pipeline/route-prep-research.js +0 -1
  207. package/dist/core/pipeline/route-prep.js +0 -1
  208. package/dist/core/pipeline/stage-policy.js +0 -1
  209. package/dist/core/pipeline/stop-gate-context7.js +0 -1
  210. package/dist/core/pipeline/stop-gate-proof.js +0 -1
  211. package/dist/core/pipeline/stop-gate-subagents.js +0 -1
  212. package/dist/core/pipeline/stop-gate.js +0 -1
  213. package/dist/core/pipeline/validation.js +0 -1
  214. package/dist/core/providers/openrouter/openrouter-request-cache.js +0 -73
  215. package/dist/core/providers/openrouter/openrouter-stream.js +0 -201
  216. package/dist/core/routes/model-mode-router.js +0 -33
  217. package/dist/core/runtime/progress-recovery/progress-recovery.js +0 -89
  218. package/dist/core/source-intelligence/codex-history-search.js +0 -70
  219. package/dist/core/stop-gate/stop-gate-writer.js +0 -139
  220. package/dist/core/subagents/terminology.js +0 -20
  221. package/dist/scripts/codex-agent-type-routing-check.js +0 -3
  222. package/dist/scripts/codex-current-core-real-probes-check.js +0 -49
  223. package/dist/scripts/managed-config-merge-check.js +0 -23
  224. package/infra-harness-gates.json +0 -4
  225. package/schemas/codex-release-manifest.schema.json +0 -44
  226. package/schemas/doctor-status-v2.schema.json +0 -42
package/README.md CHANGED
@@ -16,7 +16,7 @@
16
16
  Sneakoscope Codex (`sks`) is an open-source trust layer for Codex CLI and ChatGPT Desktop. It coordinates bounded AI coding agents, records machine-verifiable evidence, preserves project memory, and blocks release claims that are not supported by current tests or artifacts. Search visibility outcomes are measured separately; SKS does not promise rankings or traffic.
17
17
  <!-- END SKS SEARCH VISIBILITY MARKETING -->
18
18
 
19
- Current package: **SKS 10.3.9**. Install the latest stable release from npm.
19
+ Current package: **SKS 10.4.0**. Install the latest stable release from npm.
20
20
 
21
21
  [Quick start](#install-in-one-command) · [Commands](#everyday-commands) · [SKS Center](#sks-center-macos) · [Documentation](#documentation) · [Changelog](CHANGELOG.md)
22
22
 
@@ -59,8 +59,8 @@ for setup boundaries and reported execution evidence.
59
59
 
60
60
  ## Everyday commands
61
61
 
62
- SKS enables experimental Astra context management by default during setup and
63
- repair. Turn it off in **SKS Center → Settings → Astra context management**, or
62
+ SKS enables experimental Codex context management by default during setup and
63
+ repair. Turn it off in **SKS Center → Settings → Context management**, or
64
64
  use `sks codex-app context-management off`. Updates preserve an explicit opt-out.
65
65
  Start a new task after changing the setting. Availability depends on a supported
66
66
  Codex client and eligible ChatGPT sign-in; API-key and custom-provider sessions
@@ -183,11 +183,11 @@ soon as Codex lists it:
183
183
  | Work | Tier | Effort | Today |
184
184
  | --- | --- | --- | --- |
185
185
  | Tiny mechanical tasks | fast | low | `gpt-6-luna` |
186
- | Instructed implementation | balanced | low | `gpt-6-sol` |
187
- | Exploration, large-context reads, and direct tool operation | context | medium | `gpt-6-sol` |
186
+ | Instructed implementation | balanced | low | `gpt-6.1-sol` |
187
+ | Exploration, large-context reads, and direct tool operation | context | medium | `gpt-6.1-sol` |
188
188
  | Planning, review, debugging, and focused judgment | deep | max | `gpt-6-astra` |
189
189
 
190
- With Jev mode on, Jev picks the tier for every spawn, every gated parent edit,
190
+ With Jev mode on, Jev picks the tier for every spawn that names no managed role (a managed role runs the tier pinned in its role file), every gated parent edit,
191
191
  the plan, and the context, so the parent spends no time on those choices. It
192
192
  also picks the pipeline for each prompt; an explicit SKS dollar command always
193
193
  wins. A stored role-model preference on a current model wins in both modes.
@@ -335,6 +335,7 @@
335
335
  {
336
336
  "canonical_name": "sks-naruto",
337
337
  "trusted_sha256": [
338
+ "5ac4c3ea1d4478f12f55df3c3d6c4ab272a40f731de8aa659aee08cb8e517a8b",
338
339
  "c88999663811a50d096b7cbb696fbea5b8f72707bcbf4a232bb07fe3a10cb2a6",
339
340
  "b2eb207b2773ab1995ee6e113ba6f3b64de43389e76aef4a0f06d4845ff86223",
340
341
  "65e19a5d16f486b13541048c239e828f8039bfc6e38bafd7949d9c936fe4b5b2",
@@ -342,7 +343,6 @@
342
343
  "b981bea4183376c6c0204941ad6c2e78782e2cdea4f8d25cc85630c609faaf95",
343
344
  "5df9c9678eb68fd79ceb998ae7a52dd54dc92336ad5169e8a01acca89f76bd60",
344
345
  "a1219f6dbad9c8c185953125ef0b8dccf081aa01efb8e8acaa543c6214ac049c",
345
- "d0d5968e78ac25e1d3e588735de1ddbcf149cfb3165edebca5dec1ed7c7a5c46",
346
346
  "49b5e3dcc1b537b49c2cf09e5b875cb16acb05c622b22798e265e64dacd8ac90"
347
347
  ]
348
348
  },
@@ -407,6 +407,7 @@
407
407
  {
408
408
  "canonical_name": "sks-reasoning-router",
409
409
  "trusted_sha256": [
410
+ "2ec66071b1c021e8c2ddd8f1ecefd16502c8325adab2c3c804a9e8d4123b1a8d",
410
411
  "b0f458caa1c3bd7bb7241a09b80fce5700aeb99b340e84c08a9b2b66bc875ba7",
411
412
  "41e14e8d5b93d743096664869ee68c41c86e911b0bbc165bdcd10e4a45faa4b6",
412
413
  "03d68436e568b3cee2bffc6ca58819019ca406f7b648ef4704e3465c7c83c114",
@@ -259,7 +259,7 @@ dependencies = [
259
259
 
260
260
  [[package]]
261
261
  name = "sks-core"
262
- version = "10.3.9"
262
+ version = "10.4.0"
263
263
  dependencies = [
264
264
  "globset",
265
265
  "grep-matcher",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "sks-core"
3
- version = "10.3.9"
3
+ version = "10.4.0"
4
4
  edition = "2021"
5
5
 
6
6
  [dependencies]
@@ -84,8 +84,7 @@ async function doctorJsonFastInline(input = {}) {
84
84
  arg_warnings: [],
85
85
  node: { ok: true, version: process.version },
86
86
  runtime_readiness: {
87
- hook_evidence_policy: 'unknown-do-not-count',
88
- agent_role_strategy: 'message-role'
87
+ hook_evidence_policy: 'unknown-do-not-count'
89
88
  },
90
89
  codex: { bin: null, version: null, available: null, skipped: true, reason: 'fast_readonly_json' },
91
90
  repair: {
@@ -38,7 +38,7 @@ function remoteControlHelp() {
38
38
  'Usage: sks codex-app remote-control [--status|--check|--dry-run|--json] [-- <codex remote-control args>]',
39
39
  '',
40
40
  'Starts Codex CLI remote-control, the headless remotely controllable app-server entrypoint.',
41
- 'SKS only wraps the first-party command and refuses older Codex CLI versions instead of falling back to app-server internals.'
41
+ 'SKS only wraps the first-party command and refuses to run when the Codex CLI is missing instead of falling back to app-server internals.'
42
42
  ].join('\n');
43
43
  }
44
44
  function stripSeparator(args = []) {
@@ -433,8 +433,7 @@ export function hooksExplainReport() {
433
433
  'directory_rule_policy',
434
434
  'db_safety_policy',
435
435
  'visual_claim_source_policy',
436
- 'proof_required_policy',
437
- 'codex_lb_health_policy'
436
+ 'proof_required_policy'
438
437
  ],
439
438
  sources: [
440
439
  { title: 'OpenAI Codex Hooks', url: 'https://developers.openai.com/codex/hooks' },
@@ -19,13 +19,6 @@ const RETIRED_GLOBAL_EXECUTION_OPTION_NAMES = new Set([
19
19
  '--require-tmux-smoke',
20
20
  '--glm'
21
21
  ]);
22
- export function detectGlobalMode(args = []) {
23
- void args;
24
- return null;
25
- }
26
- export function stripGlobalModeFlags(args) {
27
- return args.filter((arg) => arg !== '--mad' && arg !== '--glm');
28
- }
29
22
  export function findRetiredGlobalExecutionArgumentErrors(args = []) {
30
23
  const errors = [];
31
24
  for (const value of args) {
@@ -37,12 +30,3 @@ export function findRetiredGlobalExecutionArgumentErrors(args = []) {
37
30
  }
38
31
  return [...new Set(errors)];
39
32
  }
40
- export function glmWithoutMadResult() {
41
- return {
42
- ok: false,
43
- status: 'blocked',
44
- mode: 'glm',
45
- reason: 'glm_mad_removed',
46
- hint: 'use sks bridge provider configure|validate|enable, sks bridge catalog sync, and sks bridge route set-default'
47
- };
48
- }
@@ -10,8 +10,6 @@ import { syncCodexSksSkills } from '../core/codex-app/codex-skill-sync.js';
10
10
  import { buildCodexNativeFeatureMatrix } from '../core/codex-native/codex-native-feature-broker.js';
11
11
  import { resolveCodexNativeInvocationPlan } from '../core/codex-native/codex-native-invocation-router.js';
12
12
  import { buildCodexNativeInteropPolicy } from '../core/codex-native/codex-native-interop-policy.js';
13
- import { analyzeCodexNativeReferenceSource } from '../core/codex-native/codex-native-reference-evidence.js';
14
- import { writeCodexNativePatternAnalysis } from '../core/codex-native/codex-native-pattern-analysis.js';
15
13
  import { repairCodexNativeManagedAssets } from '../core/codex-native/codex-native-repair-transaction.js';
16
14
  export async function run(_command, args = []) {
17
15
  const root = await sksRoot();
@@ -34,17 +32,13 @@ export async function run(_command, args = []) {
34
32
  return printCodexNativeResult(args, await resolveCodexAppExecutionProfile({ root }));
35
33
  if (action === 'interop-policy')
36
34
  return printCodexNativeResult(args, await buildCodexNativeInteropPolicy({ root }));
37
- if (action === 'reference-evidence')
38
- return printCodexNativeResult(args, await analyzeCodexNativeReferenceSource({ root, writeReport: true }));
39
- if (action === 'pattern-analysis')
40
- return printCodexNativeResult(args, await writeCodexNativePatternAnalysis(root));
41
35
  if (action === 'route' || action === 'invocation-plan') {
42
36
  const route = readOption(args, '--route', '$Loop');
43
37
  const desiredCapability = readOption(args, '--capability', 'agent-role');
44
38
  const missionId = readOption(args, '--mission', null);
45
39
  return printCodexNativeResult(args, await resolveCodexNativeInvocationPlan({ root, missionId, route, desiredCapability }));
46
40
  }
47
- console.error('Usage: sks codex-native status|feature-broker|harness-compat|skill-sync|agent-role-sync|init-deep|hook-lifecycle|execution-profile|interop-policy|reference-evidence|pattern-analysis|invocation-plan [--json]');
41
+ console.error('Usage: sks codex-native status|feature-broker|harness-compat|skill-sync|agent-role-sync|init-deep|hook-lifecycle|execution-profile|interop-policy|invocation-plan [--json]');
48
42
  process.exitCode = 1;
49
43
  }
50
44
  async function maybeRepairThenReadOnlyMatrix(args = [], root, matrixFn) {
@@ -1,4 +1,4 @@
1
- import { flag, readOption } from '../cli/args.js';
1
+ import { flag } from '../cli/args.js';
2
2
  import { printJson } from '../cli/output.js';
3
3
  import { codexCompatibilityReport, codexDoctorReport } from '../core/codex-compat/codex-compat-report.js';
4
4
  import { codexVersionReport } from '../core/codex-compat/codex-version.js';
@@ -9,11 +9,10 @@ import { codexCliUpdateConsoleLines, inspectCodexCliUpdate, updateCodexCliNow }
9
9
  export async function run(_command, args = []) {
10
10
  const action = args[0] || 'compatibility';
11
11
  if (action === 'compatibility' || action === 'compat') {
12
- const requiredBaseline = readOption(args, '--require', null);
13
- const result = await codexCompatibilityReport({ requiredBaseline, require: requiredBaseline });
12
+ const result = await codexCompatibilityReport();
14
13
  if (flag(args, '--json'))
15
14
  return printJson(result);
16
- console.log(`Codex compatibility: ${result.ok ? result.status : 'blocked'} (${result.required_baseline})`);
15
+ console.log(`Codex compatibility: ${result.ok ? result.status : 'blocked'} (minimum ${result.min_version})`);
17
16
  for (const warning of result.warnings || [])
18
17
  console.log(`- ${warning}`);
19
18
  if (!result.ok)
@@ -60,10 +59,10 @@ export async function run(_command, args = []) {
60
59
  return;
61
60
  }
62
61
  if (action === 'current' || action === CURRENT_CODEX_RUNTIME_CONTRACT.targetTag) {
63
- const result = await detectCodexCurrentCapability({ requireReal: flag(args, '--require-real') });
62
+ const result = await detectCodexCurrentCapability();
64
63
  if (flag(args, '--json'))
65
64
  return printJson(result);
66
- console.log(`Codex ${CURRENT_CODEX_RUNTIME_CONTRACT.requiredCliVersion} compatibility: ${result.ok ? 'ok' : 'blocked'} (${result.probe_mode})`);
65
+ console.log(`Codex ${CURRENT_CODEX_RUNTIME_CONTRACT.minVersion} compatibility: ${result.ok ? 'ok' : 'blocked'} (${result.probe_mode})`);
67
66
  for (const blocker of result.blockers || [])
68
67
  console.log(`- blocker: ${blocker}`);
69
68
  for (const warning of result.warnings || [])
@@ -32,7 +32,6 @@ export function renderDoctorConsoleReport(result, extras) {
32
32
  const codexCurrentAppDoctor = codexCurrentAppSection.doctor || {};
33
33
  const pluginPolicy = codexCurrentAppSection.plugin_app_template_policy;
34
34
  const desktopBridge = result.desktop_bridge || {};
35
- const permissionProfiles = result.codex_permission_profiles || {};
36
35
  const configRepair = repair.codex_config;
37
36
  const migrationJournal = repair.migration_journal;
38
37
  const sksUpdate = repair.sks_update;
@@ -91,7 +90,6 @@ export function renderDoctorConsoleReport(result, extras) {
91
90
  const featureMatrixSkipped = codexNativeFeatureMatrix.skipped === true;
92
91
  line('SKS Runtime Readiness:');
93
92
  line(` Codex Native: ${skippedOr(featureMatrixSkipped, String(runtimeReadiness.codex_native))}`);
94
- line(` Loop Mesh: ${skippedOr(featureMatrixSkipped, String(runtimeReadiness.loop_mesh))}`);
95
93
  line(` QA Visual: ${skippedOr(featureMatrixSkipped, String(runtimeReadiness.qa_visual))}`);
96
94
  line(` Research Sources: ${skippedOr(featureMatrixSkipped, String(runtimeReadiness.research_sources))}`);
97
95
  line(` Image Follow-up: ${skippedOr(featureMatrixSkipped, String(runtimeReadiness.image_followup))}`);
@@ -149,7 +147,6 @@ export function renderDoctorConsoleReport(result, extras) {
149
147
  line(` hook approval: ${skippedOr(harnessSkipped, appFeatures.hook_approval_state_detectable ? 'ok' : 'unknown')}`);
150
148
  line(` skills: ${skippedOr(harnessSkipped, sksIntegrations.dollar_skills_synced ? 'ok' : 'degraded')}`);
151
149
  line(` agent roles: ${skippedOr(harnessSkipped, sksIntegrations.agent_roles_synced ? 'ok' : 'degraded')}`);
152
- line(` native agent_type: ${skippedOr(harnessSkipped, appFeatures.agent_type_supported ? 'ok' : 'fallback message-role')}`);
153
150
  line(` init-deep memory: ${skippedOr(harnessSkipped, sksIntegrations.init_deep_available ? 'available' : 'missing')}`);
154
151
  line(` loop mesh app profile: ${skippedOr(harnessSkipped, sksIntegrations.loop_mesh_app_profile_available ? 'available' : 'missing')}`);
155
152
  line('Codex App UI:');
@@ -218,16 +215,10 @@ export function renderDoctorConsoleReport(result, extras) {
218
215
  const currentAppSkipped = extras.codexCurrentAppCapability?.skipped === true;
219
216
  line('Codex current compatibility:');
220
217
  line(` target: ${CURRENT_CODEX_RUNTIME_CONTRACT.targetTag}`);
218
+ line(` minimum: ${CURRENT_CODEX_RUNTIME_CONTRACT.minVersion}`);
221
219
  line(` runtime: ${codex.version || 'unknown'}`);
222
- line(` multi-agent mode: ${skippedOr(featureMatrixSkipped, codexNativeFeatureMatrix.features?.multi_agent_mode?.ok ? 'verified' : 'unverified')}`);
223
- line(` rollout budget: ${skippedOr(featureMatrixSkipped, codexNativeFeatureMatrix.features?.rollout_budget?.ok ? 'verified' : 'unverified')}`);
224
- line(` indexed search: ${skippedOr(featureMatrixSkipped, codexNativeFeatureMatrix.features?.indexed_web_search?.ok ? 'verified' : 'unverified')}`);
225
- line(` current time: ${skippedOr(featureMatrixSkipped, codexNativeFeatureMatrix.features?.current_time_read?.ok ? 'verified' : 'unverified')}`);
226
220
  line('Current Codex app features:');
227
221
  line(` /app handoff: ${skippedOr(currentAppSkipped, codexCurrentApp.supports_app_handoff ? 'ok' : 'unavailable')}`);
228
- line(` plugin JSON: ${skippedOr(currentAppSkipped, codexCurrentApp.supports_plugin_json ? 'ok' : 'unavailable')}`);
229
- line(` image path exposure: ${skippedOr(currentAppSkipped, codexCurrentApp.supports_image_path_exposure ? 'ok' : 'unavailable')}`);
230
- line(` OAuth MCP pre-refresh: ${skippedOr(currentAppSkipped, codexCurrentApp.supports_oauth_mcp_prerefresh ? 'ok' : 'unavailable')}`);
231
222
  const pluginInventorySkipped = extras.pluginInventory?.skipped === true;
232
223
  const pluginReport = extras.pluginInventory?.report;
233
224
  const plugins = pluginReport?.plugins || [];
@@ -254,7 +245,6 @@ export function renderDoctorConsoleReport(result, extras) {
254
245
  if (!desktopBridge.ok)
255
246
  for (const action of desktopBridge.recovery_actions || [])
256
247
  line(` action: ${action}`);
257
- line(`Permissions: config profile and permission profile are tracked separately (${permissionProfiles.codex_config_profile_field}, ${permissionProfiles.codex_permission_profile_field})`);
258
248
  line('Ready:');
259
249
  line(` cli_ready: ${ready.cli_ready ? 'yes' : 'no'}`);
260
250
  line(` mad_ready: ${ready.mad_ready ? 'yes' : 'no'}`);
@@ -7,9 +7,6 @@ import { restartLaunchAgent } from '../core/codex-app/menubar/launch-agent.js';
7
7
  export function buildRuntimeReadiness(matrix) {
8
8
  const defaults = matrix?.invocation_defaults || {};
9
9
  const hookPolicy = defaults.hook_evidence_policy || 'unknown-do-not-count';
10
- const agentStrategy = defaults.loop_worker_role_strategy || 'message-role';
11
- const multiAgentMode = defaults.multi_agent_mode || 'none';
12
- const rolloutBudget = defaults.rollout_budget_strategy || 'sks-local-only';
13
10
  const researchSource = defaults.research_source_strategy || 'local-files';
14
11
  const codexNative = matrix?.ok === true ? 'ok' : matrix?.codex_cli?.available ? 'degraded' : 'blocked';
15
12
  const repairActions = [];
@@ -26,22 +23,12 @@ export function buildRuntimeReadiness(matrix) {
26
23
  return {
27
24
  schema: 'sks.runtime-readiness-story.v1',
28
25
  codex_native: codexNative,
29
- loop_mesh: agentStrategy === 'agent_type' ? 'ok' : 'fallback',
30
26
  qa_visual: defaults.qa_visual_review_strategy || 'blocked',
31
27
  research_sources: researchSource,
32
28
  image_followup: defaults.image_followup_strategy || 'blocked',
33
29
  hook_evidence_policy: hookPolicy,
34
- agent_role_strategy: agentStrategy,
35
- multi_agent_mode: multiAgentMode,
36
- rollout_budget_strategy: rolloutBudget,
37
- current_time_source: defaults.current_time_source || 'external-clock',
38
- overload_retry_policy: defaults.overload_retry_policy || 'generic',
39
30
  notes: [
40
- ...(hookPolicy !== 'approved-only' ? ['hook-derived evidence will not count'] : []),
41
- ...(agentStrategy !== 'agent_type' ? ['message-role fallback active'] : []),
42
- ...(multiAgentMode === 'proactive' ? ['Proactive multi-agent mode is available for Naruto-style routes'] : []),
43
- ...(rolloutBudget === 'codex-current-shared' ? ['Shared rollout budgeting is available for route proof'] : []),
44
- ...(researchSource === 'indexed-web-search' ? ['Indexed web search is selected for source-intelligence routes'] : [])
31
+ ...(hookPolicy !== 'approved-only' ? ['hook-derived evidence will not count'] : [])
45
32
  ],
46
33
  repair_actions: [...new Set(repairActions)]
47
34
  };
@@ -69,16 +56,11 @@ export function fallbackCodexNativeFeatureMatrix(codex, blockers = [], warnings
69
56
  codex_cli: { available: Boolean(codex?.bin || codex?.available), version: codex?.version || null, bin: codex?.bin || null },
70
57
  features: {},
71
58
  invocation_defaults: {
72
- loop_worker_role_strategy: 'message-role',
73
- multi_agent_mode: 'none',
74
- rollout_budget_strategy: 'sks-local-only',
75
59
  qa_visual_review_strategy: 'route-gated',
76
60
  research_source_strategy: 'local-files',
77
61
  image_followup_strategy: 'artifact-path',
78
62
  hook_evidence_policy: 'unknown-do-not-count',
79
- skill_bridge_strategy: 'cli-only',
80
- current_time_source: 'external-clock',
81
- overload_retry_policy: 'generic'
63
+ skill_bridge_strategy: 'cli-only'
82
64
  },
83
65
  blockers,
84
66
  warnings
@@ -11,7 +11,6 @@ import { desktopBridgeStatusV3 } from '../core/codex-lb/desktop-controller-v3.js
11
11
  import { readDesktopBridgeUnreachableUpstreamEvidence, repairDoctorDesktopBridgeCatalog } from '../core/doctor/desktop-bridge-catalog-repair.js';
12
12
  import { inspectCodexConfigReadability } from '../core/codex/codex-config-readability.js';
13
13
  import { inspectOAuthCallbackPortConflict, oauthCallbackDoctorGuidance } from '../core/codex/oauth-callback-port-diagnostic.js';
14
- import { inventoryCodexPermissionProfiles } from '../core/codex/codex-permission-profiles.js';
15
14
  import { resolveProviderContext } from '../core/provider/provider-context.js';
16
15
  import { writeCodexCurrentAppCapabilityArtifacts } from '../core/codex-control/codex-current-app-capability.js';
17
16
  import { writeCodexPluginInventoryArtifacts, pluginAppTemplatePolicy } from '../core/codex-plugins/codex-plugin-json.js';
@@ -513,7 +512,6 @@ async function runDoctorJsonFastPath(args = [], root) {
513
512
  doctor_fix_postcheck: null,
514
513
  postcheck: null,
515
514
  agent_role_config: { schema: 'sks.agent-role-config-repair.v1', ok: true, apply: false, skipped: true, blockers: [] },
516
- codex_permission_profiles: { skipped: true, reason: 'doctor_json_fast_path_optional_diagnostics_skipped' },
517
515
  command_aliases: { schema: 'sks.command-alias-cleanup.v1', ok: true, skipped: true, reason: 'doctor_json_fast_path_no_write' },
518
516
  sks_temp_sweep: { ok: true, skipped: true, action_count: 0, reason: 'doctor_without_fix', error: null },
519
517
  imagegen: { ok: false, auth_readiness: null, codex_app_builtin_available: false },
@@ -683,7 +681,6 @@ async function runDoctor(args = [], root, doctorFix, deps = {}) {
683
681
  generated_at: new Date().toISOString(),
684
682
  fix: doctorFix,
685
683
  configs: [],
686
- agent_role_files: { sanitized: [], created: [], blockers: [err?.message || String(err)] },
687
684
  actions: [],
688
685
  manual_actions: [],
689
686
  blockers: [err?.message || String(err)],
@@ -1114,7 +1111,6 @@ async function runDoctor(args = [], root, doctorFix, deps = {}) {
1114
1111
  processEnv: process.env
1115
1112
  }, { desktopBridgeStatusImpl: deps.desktopBridgeStatusImpl })
1116
1113
  : desktopBridgeBeforeFix;
1117
- const permissionProfiles = await inventoryCodexPermissionProfiles(root, { writeReport: true });
1118
1114
  const startupRoleRepair = startupConfigRepair?.role_repair;
1119
1115
  const agentRoleConfigRepair = doctorFix && startupRoleRepair
1120
1116
  ? startupRoleRepair
@@ -1559,7 +1555,6 @@ async function runDoctor(args = [], root, doctorFix, deps = {}) {
1559
1555
  } : null,
1560
1556
  agent_role_config: agentRoleConfigRepair,
1561
1557
  official_subagent_config: officialSubagentConfig,
1562
- codex_permission_profiles: permissionProfiles,
1563
1558
  command_aliases: commandAliasCleanup,
1564
1559
  sks_temp_sweep: {
1565
1560
  ok: sksTempSweep.ok !== false,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema": "sks.skills-manifest.v1",
3
- "package_version": "10.3.9",
3
+ "package_version": "10.4.0",
4
4
  "skills": [
5
5
  {
6
6
  "canonical_name": "sks",
@@ -404,15 +404,15 @@
404
404
  {
405
405
  "canonical_name": "sks-naruto",
406
406
  "type": "core",
407
- "content_sha256": "c88999663811a50d096b7cbb696fbea5b8f72707bcbf4a232bb07fe3a10cb2a6",
407
+ "content_sha256": "5ac4c3ea1d4478f12f55df3c3d6c4ab272a40f731de8aa659aee08cb8e517a8b",
408
408
  "hash_history": [
409
+ "c88999663811a50d096b7cbb696fbea5b8f72707bcbf4a232bb07fe3a10cb2a6",
409
410
  "b2eb207b2773ab1995ee6e113ba6f3b64de43389e76aef4a0f06d4845ff86223",
410
411
  "65e19a5d16f486b13541048c239e828f8039bfc6e38bafd7949d9c936fe4b5b2",
411
412
  "da43debf97f0b4a1583d8202a7306aca97ac97865accf9bca8f41d75c84a1cb9",
412
413
  "b981bea4183376c6c0204941ad6c2e78782e2cdea4f8d25cc85630c609faaf95",
413
414
  "5df9c9678eb68fd79ceb998ae7a52dd54dc92336ad5169e8a01acca89f76bd60",
414
415
  "a1219f6dbad9c8c185953125ef0b8dccf081aa01efb8e8acaa543c6214ac049c",
415
- "d0d5968e78ac25e1d3e588735de1ddbcf149cfb3165edebca5dec1ed7c7a5c46",
416
416
  "49b5e3dcc1b537b49c2cf09e5b875cb16acb05c622b22798e265e64dacd8ac90"
417
417
  ],
418
418
  "deprecated_aliases": []
@@ -490,8 +490,9 @@
490
490
  {
491
491
  "canonical_name": "sks-reasoning-router",
492
492
  "type": "official",
493
- "content_sha256": "b0f458caa1c3bd7bb7241a09b80fce5700aeb99b340e84c08a9b2b66bc875ba7",
493
+ "content_sha256": "2ec66071b1c021e8c2ddd8f1ecefd16502c8325adab2c3c804a9e8d4123b1a8d",
494
494
  "hash_history": [
495
+ "b0f458caa1c3bd7bb7241a09b80fce5700aeb99b340e84c08a9b2b66bc875ba7",
495
496
  "41e14e8d5b93d743096664869ee68c41c86e911b0bbc165bdcd10e4a45faa4b6",
496
497
  "03d68436e568b3cee2bffc6ca58819019ca406f7b648ef4704e3465c7c83c114",
497
498
  "647f730520a1c7dc89c2642f5b8502624c65a861ae41aecf1fb137db40fd0611",
@@ -8,6 +8,7 @@ import { desktopBridgeStatusV3 } from '../codex-lb/desktop-controller-v3.js';
8
8
  import { bridgeClientUrl } from '../codex-lb/desktop-controller-v3/shared.js';
9
9
  import { runProcess } from '../fsx.js';
10
10
  import { createResponsesTransport } from './responses-transport.js';
11
+ import { latestModelForTier } from '../subagents/model-tiers.js';
11
12
  const USAGE = 'sks agent-bridge async --prompt "task" [--tools status,stats] [--json]';
12
13
  const MAX_PROMPT_BYTES = 16 * 1024;
13
14
  export function redactAsyncToolOutput(stdout) {
@@ -55,7 +56,7 @@ export function parseAsyncCommandArgs(args) {
55
56
  export async function agentBridgeAsyncCommand(args) {
56
57
  const json = args.includes('--json');
57
58
  if (args.includes('--help')) {
58
- const help = { schema: 'sks.async-tool-run.v1', ok: true, status: 'help', usage: USAGE, model: 'gpt-6-astra', provider: 'codex-lb', tools: 'Explicitly selected R0 remote-readable SKS command contracts only.' };
59
+ const help = { schema: 'sks.async-tool-run.v1', ok: true, status: 'help', usage: USAGE, model: latestModelForTier('deep'), provider: 'codex-lb', tools: 'Explicitly selected R0 remote-readable SKS command contracts only.' };
59
60
  console.log(json ? JSON.stringify(help, null, 2) : USAGE);
60
61
  return help;
61
62
  }
@@ -63,9 +64,10 @@ export async function agentBridgeAsyncCommand(args) {
63
64
  const parsed = parseAsyncCommandArgs(args);
64
65
  const home = homedir();
65
66
  const status = await desktopBridgeStatusV3({ home });
66
- const model = 'codex-lb:gpt-6-astra';
67
+ const deepModel = latestModelForTier('deep');
68
+ const model = `codex-lb:${deepModel}`;
67
69
  const route = status.routing.policy?.model_routes[model];
68
- if (!status.service.running || !status.service.loopback_origin || route?.provider_id !== 'codex-lb' || route.upstream_model !== 'gpt-6-astra') {
70
+ if (!status.service.running || !status.service.loopback_origin || route?.provider_id !== 'codex-lb' || route.upstream_model !== deepModel) {
69
71
  throw new Error('async_astra_bridge_route_unavailable');
70
72
  }
71
73
  const endpoint = await bridgeClientUrl(status.service.loopback_origin, '/backend-api/codex/responses', { home });
@@ -2,9 +2,6 @@ import { codexModelEffortCapability } from '../codex-control/codex-model-capabil
2
2
  import { managedOfficialSubagentRoleByName } from '../managed-assets/managed-assets-manifest.js';
3
3
  import { decideSubagentModel, subagentModelProfile } from '../subagents/model-policy.js';
4
4
  import { MODEL_TIERS, resolveLatestModelTiers } from '../subagents/model-tiers.js';
5
- export function decideAgentEffort(input = {}) {
6
- return decideOfficialSubagentModel(input);
7
- }
8
5
  export function decideOfficialSubagentModel(input = {}) {
9
6
  const persona = input.persona || {};
10
7
  const prompt = String(input.prompt || '');
@@ -46,7 +43,7 @@ export function decideOfficialSubagentModel(input = {}) {
46
43
  downshift_triggers: [
47
44
  'instructed UI, logic, backend, or native implementation selects the balanced tier',
48
45
  'long-context, Browser/Chrome, Computer Use, image-generation, or large search selects the context tier',
49
- 'tiny short-context mechanical search/typing/rename work selects the balanced tier'
46
+ 'tiny short-context mechanical search/typing/rename work selects the fast tier'
50
47
  ]
51
48
  };
52
49
  }
@@ -100,7 +97,7 @@ export function decideOfficialSubagentModel(input = {}) {
100
97
  downshift_triggers: [
101
98
  'instructed UI, logic, backend, or native implementation selects the balanced tier',
102
99
  'long-context, Browser/Chrome, Computer Use, or image-generation execution selects the context tier',
103
- 'tiny short-context mechanical work selects the balanced tier'
100
+ 'tiny short-context mechanical work selects the fast tier'
104
101
  ]
105
102
  };
106
103
  }
@@ -125,7 +122,7 @@ export function buildAgentEffortPolicy(roster = {}) {
125
122
  policy_version: 1,
126
123
  dynamic: true,
127
124
  service_tier: 'fast',
128
- model_catalog_policy: 'official_subagent_four_profile_matrix',
125
+ model_catalog_policy: 'official_subagent_model_tiers',
129
126
  model_constraint: [...new Set(MODEL_TIERS.map((tier) => latest.models[tier]))],
130
127
  model_tiers: MODEL_TIERS.map((tier) => `${tier}:${latest.models[tier]}-${latest.efforts[tier]}`),
131
128
  allowed_efforts: ['low', 'medium', 'high', 'max'],
@@ -134,7 +131,7 @@ export function buildAgentEffortPolicy(roster = {}) {
134
131
  agent_count: roster.agent_count || decisions.length,
135
132
  concurrency: roster.concurrency || decisions.length,
136
133
  decisions,
137
- rule: 'Every child uses the newest model of the tier its work needs: fast for tiny mechanical work, balanced for instructed implementation, context for reads and tool execution, and deep for focused judgment. With Jev mode on, Jev picks the tier for each spawn. The parent keeps its user-selected model, reasoning effort, and service tier; stored role preferences may override role defaults.'
134
+ rule: 'Every child uses the newest model of the tier its work needs: fast for tiny mechanical work, balanced for instructed implementation, context for reads and tool execution, and deep for focused judgment. With Jev mode on, Jev picks the tier for each spawn that names no managed role; a managed role runs the tier pinned in its role file. The parent keeps its user-selected model, reasoning effort, and service tier; stored role preferences may override role defaults.'
138
135
  };
139
136
  }
140
137
  export function reasoningProfileName(effort) {
@@ -93,7 +93,6 @@ export async function runNativeAgentOrchestrator(opts = {}) {
93
93
  concurrency: opts.concurrency,
94
94
  prompt,
95
95
  maxAgentCount,
96
- officialSubagentPolicy,
97
96
  ...(opts.readonly === undefined ? {} : { readonly: opts.readonly })
98
97
  });
99
98
  roster = applyFastModeToRoster(roster, fastModePolicy);
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_AGENT_CONCURRENCY, DEFAULT_AGENT_COUNT, HARD_AGENT_CONCURRENCY, MAX_AGENT_COUNT, agentSessionId } from './agent-schema.js';
2
2
  import { defaultAgentPersonas, validatePersonaUniqueness } from './agent-persona.js';
3
- import { buildAgentEffortPolicy, decideAgentEffort, decideOfficialSubagentModel } from './agent-effort-policy.js';
3
+ import { buildAgentEffortPolicy, decideOfficialSubagentModel } from './agent-effort-policy.js';
4
4
  function resolveMaxAgentCount(value) {
5
5
  const parsed = Number(value);
6
6
  if (!Number.isFinite(parsed) || parsed < 1)
@@ -35,9 +35,7 @@ export function buildAgentRoster(opts = {}) {
35
35
  if (!uniqueness.ok)
36
36
  throw new Error('Invalid agent personas: ' + JSON.stringify(uniqueness));
37
37
  const roster = personas.map((persona, index) => {
38
- const effort = opts.officialSubagentPolicy === true
39
- ? decideOfficialSubagentModel({ persona, prompt: opts.prompt || '', agentId: persona.id, readonly: opts.readonly === true || persona.read_only })
40
- : decideAgentEffort({ persona, prompt: opts.prompt || '', agentId: persona.id, readonly: opts.readonly === true || persona.read_only });
38
+ const effort = decideOfficialSubagentModel({ persona, prompt: opts.prompt || '', agentId: persona.id, readonly: opts.readonly === true || persona.read_only });
41
39
  return {
42
40
  id: persona.id,
43
41
  session_id: agentSessionId(persona.id, index + 1),
@@ -7,8 +7,8 @@ import { normalizeAgentPatchEnvelope } from './agent-patch-schema.js';
7
7
  import { runCodexTask } from '../codex-control/codex-control-plane.js';
8
8
  import { CODEX_AGENT_WORKER_RESULT_SCHEMA_ID, codexAgentWorkerResultSchema } from '../codex-control/schemas/agent-worker-result.schema.js';
9
9
  import { leanEngineeringCompactText, leanPolicyReference } from '../lean-engineering-policy.js';
10
- import { readCodexLbModelCatalog, readLbHealth } from '../codex-lb/codex-lb-env.js';
11
- import { categoryForWorkerRole, isNarutoGpt56Model, modelRouteReason, routeModel } from '../provider/model-router.js';
10
+ import { readCodexLbModelCatalog } from '../codex-lb/codex-lb-env.js';
11
+ import { categoryForWorkerRole, isNarutoTierModel, modelRouteReason, routeModel } from '../provider/model-router.js';
12
12
  import { codexTimeoutClassForRoute } from '../codex-control/codex-reliability-shield.js';
13
13
  import { decideSubagentModel } from '../subagents/model-policy.js';
14
14
  import { latestTierModelSet } from '../subagents/model-tiers.js';
@@ -235,7 +235,6 @@ export async function resolveWorkerModelRouting(input, deps = {}) {
235
235
  if (allowlist.mode === 'openrouter_only') {
236
236
  return resolveOpenRouterOnlyWorkerRouting(input, deps, { allowlist, category, env, taskKindText, riskText });
237
237
  }
238
- const lbHealth = Object.prototype.hasOwnProperty.call(deps, 'lbHealth') ? deps.lbHealth : await readLbHealth().catch(() => null);
239
238
  const lbCatalog = narutoOnly
240
239
  ? Object.prototype.hasOwnProperty.call(deps, 'lbCatalog')
241
240
  ? deps.lbCatalog
@@ -246,7 +245,7 @@ export async function resolveWorkerModelRouting(input, deps = {}) {
246
245
  const explicitTierRaw = String(env.SKS_WORKER_SERVICE_TIER || env.SKS_SERVICE_TIER || '').trim();
247
246
  const explicitReasoning = normalizeModelReasoning(explicitReasoningRaw);
248
247
  const explicitTier = normalizeServiceTier(explicitTierRaw);
249
- const explicitNarutoModelInvalid = narutoOnly && Boolean(explicitModel) && !isNarutoGpt56Model(explicitModel);
248
+ const explicitNarutoModelInvalid = narutoOnly && Boolean(explicitModel) && !isNarutoTierModel(explicitModel);
250
249
  const explicitNarutoReasoningInvalid = narutoOnly && Boolean(explicitReasoningRaw) && !explicitReasoning;
251
250
  const explicitNarutoTierInvalid = narutoOnly && Boolean(explicitTierRaw) && !explicitTier;
252
251
  const currentModels = latestTierModelSet();
@@ -254,7 +253,7 @@ export async function resolveWorkerModelRouting(input, deps = {}) {
254
253
  && currentModels.has(String(input.agent?.routed_model || ''))
255
254
  ? String(input.agent?.routed_model)
256
255
  : '';
257
- const savedAstraEffort = savedPreferenceModel
256
+ const savedPreferenceEffort = savedPreferenceModel
258
257
  ? normalizeModelReasoning(input.agent?.routed_model_reasoning_effort)
259
258
  : null;
260
259
  const jevModel = !explicitModel && input.agent?.routed_model_policy === 'jev_sealed_routing'
@@ -273,18 +272,17 @@ export async function resolveWorkerModelRouting(input, deps = {}) {
273
272
  const taskPolicy = decideSubagentModel({ title: taskKindText, description: riskText, role: input.agent?.role });
274
273
  const routed = narutoOnly
275
274
  ? await routeModel(category, {
276
- lbHealth,
277
275
  narutoOnly: true,
278
276
  taskText: taskKindText,
279
277
  riskText,
280
- reasoningEffort: jevEffort || savedAstraEffort || liveJevEffort,
278
+ reasoningEffort: jevEffort || savedPreferenceEffort || liveJevEffort,
281
279
  availableModels: lbCatalog?.models || [],
282
280
  availableModelEfforts: lbCatalog?.model_efforts || {},
283
281
  ...(selectedModel ? { model: selectedModel } : {})
284
282
  })
285
283
  : {
286
284
  model: (explicitModel && currentModels.has(explicitModel) ? explicitModel : '') || savedPreferenceModel || liveJevModel || taskPolicy.model,
287
- reasoning: explicitReasoning || savedAstraEffort || liveJevEffort || taskPolicy.modelReasoningEffort,
285
+ reasoning: explicitReasoning || savedPreferenceEffort || liveJevEffort || taskPolicy.modelReasoningEffort,
288
286
  serviceTier: explicitTier || input.fastModePolicy.service_tier || 'fast'
289
287
  };
290
288
  const blockers = [
@@ -301,14 +299,9 @@ export async function resolveWorkerModelRouting(input, deps = {}) {
301
299
  category,
302
300
  choice: routed,
303
301
  explicit: Boolean(explicitModel),
304
- lb_health: lbHealth,
305
302
  lb_catalog: lbCatalog,
306
303
  blockers: [...new Set(blockers)],
307
- reason: modelRouteReason(category, routed, {
308
- explicit: Boolean(explicitModel),
309
- quotaLow: lbHealth?.quota_low === true,
310
- degraded: lbHealth?.degraded_models || []
311
- })
304
+ reason: modelRouteReason(category, routed, { explicit: Boolean(explicitModel) })
312
305
  };
313
306
  }
314
307
  async function resolveOpenRouterOnlyWorkerRouting(input, deps, ctx) {
@@ -348,7 +341,6 @@ async function resolveOpenRouterOnlyWorkerRouting(input, deps, ctx) {
348
341
  category,
349
342
  choice: routed,
350
343
  explicit: Boolean(explicitModel),
351
- lb_health: Object.prototype.hasOwnProperty.call(deps, 'lbHealth') ? deps.lbHealth : null,
352
344
  lb_catalog: null,
353
345
  blockers: [...new Set(blockers)],
354
346
  reason: `${category}->${choiceModel || 'blocked'}@${routed.reasoning} (openrouter only list: ${why})`
@@ -582,7 +582,6 @@ function isLeanOwnedTypeSafetyPath(file) {
582
582
  'src/core/agents/native-worker-backend-router.ts',
583
583
  'src/scripts/check-architecture.ts',
584
584
  'src/scripts/check-command-module-budget.ts',
585
- 'src/scripts/check-pipeline-budget.ts',
586
585
  'src/scripts/check-route-modularity.ts',
587
586
  'src/scripts/check-publish-tag.ts',
588
587
  'src/scripts/gpt-final-arbiter-check.ts',