sneakoscope 10.3.2 → 10.3.4

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 (71) hide show
  1. package/README.md +22 -12
  2. package/config/skills-hash-ledger.v1.json +7 -1
  3. package/crates/sks-core/Cargo.lock +1 -1
  4. package/crates/sks-core/Cargo.toml +1 -1
  5. package/dist/commands/doctor.js +2 -2
  6. package/dist/config/skills-manifest.json +13 -7
  7. package/dist/core/agents/agent-effort-policy.js +15 -13
  8. package/dist/core/agents/native-worker-backend-router.js +13 -8
  9. package/dist/core/codex-hooks/codex-hook-managed-install.js +56 -2
  10. package/dist/core/codex-lb/desktop-bridge-migration/retired-runtime-cleanup.js +1 -0
  11. package/dist/core/codex-native/core-skill-manifest.js +4 -4
  12. package/dist/core/decisions/cli.js +9 -2
  13. package/dist/core/decisions/config.js +7 -0
  14. package/dist/core/decisions/integration.js +54 -12
  15. package/dist/core/decisions/policy.js +27 -4
  16. package/dist/core/decisions/questions.js +39 -9
  17. package/dist/core/decisions/routing.js +15 -10
  18. package/dist/core/decisions/types.js +11 -25
  19. package/dist/core/doctor/current-project-guidance.js +38 -1
  20. package/dist/core/doctor/skill-legacy-surface.js +2 -1
  21. package/dist/core/hooks-runtime/hook-context.js +1 -1
  22. package/dist/core/hooks-runtime/jev-spawn-routing.js +21 -2
  23. package/dist/core/hooks-runtime/managed-guidance-preflight.js +30 -0
  24. package/dist/core/hooks-runtime/official-subagent-lifecycle.js +3 -3
  25. package/dist/core/hooks-runtime/parent-orchestration-gate.js +372 -0
  26. package/dist/core/hooks-runtime/subagent-context.js +13 -3
  27. package/dist/core/hooks-runtime/subagent-spawn-policy.js +5 -10
  28. package/dist/core/hooks-runtime.js +46 -8
  29. package/dist/core/init/skills/inventory.js +5 -1
  30. package/dist/core/init/skills.js +4 -4
  31. package/dist/core/init.js +39 -7
  32. package/dist/core/managed-assets/managed-assets-manifest.js +17 -17
  33. package/dist/core/pipeline-internals/runtime-core.js +2 -2
  34. package/dist/core/provider/model-router.js +8 -5
  35. package/dist/core/recallpulse/policy.js +2 -2
  36. package/dist/core/recallpulse.js +3 -3
  37. package/dist/core/release/gate-affected-globs.js +0 -1
  38. package/dist/core/research/mock-result.js +2 -2
  39. package/dist/core/research/research-adversarial-review.js +7 -7
  40. package/dist/core/research/research-claim-synthesizer.js +3 -3
  41. package/dist/core/research/research-falsification-runner.js +3 -3
  42. package/dist/core/research/research-super-search.js +5 -2
  43. package/dist/core/research/research-synthesis-writer.js +2 -2
  44. package/dist/core/research.js +5 -5
  45. package/dist/core/routes/dollar-manifest-lite.js +1 -1
  46. package/dist/core/routes.js +10 -10
  47. package/dist/core/runtime/task-profile.js +9 -5
  48. package/dist/core/subagents/model-policy.js +27 -45
  49. package/dist/core/subagents/model-tiers.js +153 -0
  50. package/dist/core/subagents/naruto-command-args.js +3 -3
  51. package/dist/core/subagents/naruto-help-contract.js +18 -13
  52. package/dist/core/subagents/naruto-host-credentials.js +8 -13
  53. package/dist/core/subagents/official-subagent-config.js +11 -7
  54. package/dist/core/subagents/official-subagent-preparation.js +12 -8
  55. package/dist/core/subagents/official-subagent-prompt.js +33 -33
  56. package/dist/core/subagents/official-subagent-runner.js +3 -3
  57. package/dist/core/subagents/role-model-preferences.js +26 -21
  58. package/dist/core/update/managed-permission-repair.js +462 -0
  59. package/dist/core/update/update-migration-state/retired-local-decision.js +32 -2
  60. package/dist/core/update/update-migration-state/simple-stages.js +42 -5
  61. package/dist/core/update/update-migration-state.js +63 -1
  62. package/dist/core/update-check.js +35 -8
  63. package/dist/core/version.js +1 -1
  64. package/dist/scripts/codex-native-agent-role-content-check.js +10 -5
  65. package/dist/scripts/codex-native-gate-lib.js +3 -1
  66. package/dist/scripts/current-surface-update-e2e-check.js +1 -0
  67. package/dist/scripts/mutation-callsite-coverage-check.js +2 -2
  68. package/dist/scripts/release-affected-selector-check.js +1 -2
  69. package/dist/scripts/typed-routing-gate-lib.js +3 -1
  70. package/package.json +1 -1
  71. package/release-gates.v2.json +2 -6
package/dist/core/init.js CHANGED
@@ -245,6 +245,38 @@ export function mergeManagedHooksJson(existingContent, commandPrefix, projectRoo
245
245
  }
246
246
  return `${JSON.stringify({ ...root, hooks: nextHooks }, null, 2)}\n`;
247
247
  }
248
+ export function pruneRetiredSksHookEvents(existingContent, installedEvents) {
249
+ let root;
250
+ try {
251
+ root = existingContent?.trim() ? JSON.parse(existingContent) : null;
252
+ }
253
+ catch {
254
+ return { text: existingContent, removed: [] };
255
+ }
256
+ if (!root || typeof root !== 'object' || Array.isArray(root))
257
+ return { text: existingContent, removed: [] };
258
+ const hooks = root.hooks && typeof root.hooks === 'object' && !Array.isArray(root.hooks) ? root.hooks : null;
259
+ if (!hooks)
260
+ return { text: existingContent, removed: [] };
261
+ const installed = new Set(installedEvents);
262
+ const removed = [];
263
+ const nextHooks = {};
264
+ for (const [eventName, entries] of Object.entries(hooks)) {
265
+ if (installed.has(eventName) || !Array.isArray(entries)) {
266
+ nextHooks[eventName] = entries;
267
+ continue;
268
+ }
269
+ const mapped = entries.map((entry) => stripSksManagedHookEntry(entry));
270
+ if (mapped.some((entry, index) => entry !== entries[index]))
271
+ removed.push(eventName);
272
+ const preserved = mapped.filter(Boolean);
273
+ if (preserved.length)
274
+ nextHooks[eventName] = preserved;
275
+ }
276
+ if (!removed.length)
277
+ return { text: existingContent, removed };
278
+ return { text: `${JSON.stringify({ ...root, hooks: nextHooks }, null, 2)}\n`, removed };
279
+ }
248
280
  function stripSksManagedHookEntry(entry) {
249
281
  if (!entry || typeof entry !== 'object' || Array.isArray(entry) || !Array.isArray(entry.hooks))
250
282
  return entry;
@@ -274,11 +306,11 @@ const AGENTS_BLOCK = [
274
306
  '## Execution',
275
307
  '',
276
308
  '- Codex native `/goal` is the only persisted goal owner. Goal objectives must state the outcome, scope, constraints, verification, done-when conditions, stop conditions, and non-goals.',
277
- '- General work stays parent-owned. Use `$Naruto` for explicitly requested parallel work or concrete independent slices that benefit from delegation; Answer and tiny DFix work stay lightweight.',
278
- '- The parent owns decomposition, integration, verification, and the final answer. Delegate only independent slices with disjoint write scopes, reuse capacity across root-owned waves, and never nest subagents.',
279
- '- Use gpt-6-astra for every subagent; vary reasoning effort by the slice: Astra Low for tiny mechanical work and instructed ordinary coding execution, Astra Medium for read-heavy context or direct tool operation, and Astra Max for planning, analysis, review, risk, or other focused judgment. Explicit Astra effort preferences, including High, remain supported.',
280
- '- Preserve the user-selected parent model, reasoning effort, and service tier. SKS-launched Naruto defaults to GPT-6 Astra; parent settings and role preferences never override the sealed Astra child profiles.',
281
- '- SKS child spawns must explicitly set model="gpt-6-astra" and the role reasoning effort with `fork_turns="none"` or a positive bounded turn count; carry the complete bounded slice contract in `message`. Never use full-history inheritance for children.',
309
+ '- Answer, Help, Goal, and tiny DFix stay parent-owned. Implementation routes to Naruto (`$sks-naruto`, alias `$sks-work`; standalone `sks naruto run`), which is parent orchestration only: decompose, assign disjoint slices, spawn, integrate, and verify. Do not implement those slices in the parent thread. The SKS PreToolUse hook denies parent-thread source edits until the first child thread starts and while children are still running; .sneakoscope artifacts stay parent-writable, and Jev may release a confirmed orchestration-scaffolding edit.',
310
+ '- The parent owns decomposition, integration, verification, and the final answer. Delegate implementation slices with disjoint write scopes, reuse capacity across root-owned waves, and never nest subagents.',
311
+ '- Every child runs the newest model of the tier its work needs (fast, balanced, context, or deep); no model family is pinned. When Jev mode is on, Jev picks the tier for each new Naruto child spawn and SKS seals it. A user role preference stays authoritative. Do not pick a child model yourself.',
312
+ '- Preserve the user-selected parent model, reasoning effort, and service tier. Parent settings stay on the parent thread. A role preference wins over the Jev seal for that role.',
313
+ '- SKS child spawns must pass the sealed model and reasoning effort with `fork_turns="none"` or a positive bounded turn count; carry the complete bounded slice contract in `message`. Never use full-history inheritance for children. Full-history forks (`fork_turns="all"`, including the omitted default) inherit the parent agent type, model, and reasoning effort and must not be combined with `agent_type`, `model`, or `reasoning_effort`.',
282
314
  '- Route-specific skills own route-specific details. Do not inject unrelated Design, PPT, image, browser, research, DB, or release policy into ordinary work.',
283
315
  '- Do not stop at a plan when implementation was requested. Finish the requested outcome, including verification of the changed path, before stopping for review. Stop early only on a hard blocker or when the stated done-when conditions are met.',
284
316
  '- User instructions outrank skill guidance. Infer routine details, honor authorization already provided, and finish authorized preparation before asking for a decision that changes scope or has irreversible effects.',
@@ -1119,8 +1151,8 @@ export function codexAppQuickReference(scope, commandPrefix) {
1119
1151
  coreEngineeringDirectiveReferenceText(),
1120
1152
  'dollar-commands:',
1121
1153
  ...currentDollarCommands().map((c) => `- \`${sksPrefixedDollarCommand(c.command)}\`: ${c.route}`),
1122
- 'Routing: Answer is read-only, DFix handles tiny edits, and general work stays parent-owned. Use Naruto for explicit parallel work or independent slices that benefit from delegation.',
1123
- 'Subagent context: explicitly set model="gpt-6-astra" and the role reasoning effort with `fork_turns="none"` or a positive bounded turn count. Pass the complete bounded slice contract in `message`; never inherit the parent model or apply a role-model preference.',
1154
+ 'Routing: Answer is read-only, DFix handles tiny edits, and Naruto implementation is parent orchestration with child slices enforced by the PreToolUse gate (spawn before any source edit, and no parent edits beside running children). Answer and tiny DFix stay on the parent.',
1155
+ 'Subagent context: pass the sealed model and reasoning effort with `fork_turns="none"` or a positive bounded turn count. Each child uses the newest model of its tier; Jev mode picks that tier at each new spawn. Pass the complete bounded slice contract in `message`. Never use `fork_turns="all"` together with a custom model.',
1124
1156
  'Goal: Codex native /goal is the only persisted goal owner; no SKS Goal mission, bridge, compatibility loop, or fallback state is allowed.',
1125
1157
  'Context: use bounded TriWiki recall when a claim needs project memory; refresh after material changes; validate before handoff/final; use Context7 or official vendor docs when external contracts or versions matter.',
1126
1158
  'Completion: report the result, actual verification, and remaining gaps once. Reflection and Honest Mode are optional unless explicitly requested or required by the strict profile.',
@@ -23,7 +23,7 @@ export const MANAGED_OFFICIAL_SUBAGENT_ROLES = Object.freeze([
23
23
  filename: 'worker.toml',
24
24
  aliases: ['worker'],
25
25
  codexName: 'worker',
26
- description: 'Astra Low execution subagent only for tiny, short-context, mechanical work with an explicit done condition.',
26
+ description: 'Fast-tier execution subagent only for tiny, short-context, mechanical work with an explicit done condition.',
27
27
  policy: 'luna_max_mechanical',
28
28
  keywords: ['tiny', 'short context', 'single file', 'mechanical', 'repeatable', 'exact rename', 'format only', 'typo', 'simple search', 'typing', '단순 검색', '타이핑'],
29
29
  nicknames: ['Kite', 'Moss', 'Pico', 'Reed', 'Vale', 'Wren'],
@@ -47,14 +47,14 @@ Do not claim success without direct evidence.`
47
47
  filename: 'implementation-specialist.toml',
48
48
  aliases: ['implementation-specialist', 'core-implementer'],
49
49
  codexName: 'implementation_specialist',
50
- description: 'Astra Low implementation specialist for instructed backend, core, API, lifecycle, and cross-file coding with disjoint ownership.',
50
+ description: 'Balanced-tier implementation specialist for instructed backend, core, API, lifecycle, and cross-file coding with disjoint ownership.',
51
51
  policy: 'sol_high_implementation',
52
52
  keywords: ['implementation', 'backend', 'core', 'api', 'lifecycle implementation', 'cross-file coding', 'feature change', '구현', '백엔드', '핵심 로직'],
53
53
  nicknames: ['Builder', 'Forge', 'Mason', 'Rivet'],
54
54
  instructions: `You are the bounded implementation specialist.
55
55
 
56
56
  Own only the disjoint files and acceptance criteria assigned by the parent.
57
- Use this role for instructed backend, core, API, lifecycle, and cross-file coding after the parent defines the implementation scope. Escalate review, debugging, planning, architecture, security, release, and ambiguous work to an Astra Max specialist.
57
+ Use this role for instructed backend, core, API, lifecycle, and cross-file coding after the parent defines the implementation scope. Escalate review, debugging, planning, architecture, security, release, and ambiguous work to a deep-tier specialist.
58
58
  Do not redesign unrelated architecture or integrate sibling work.
59
59
  Make the smallest defensible change, run focused verification, and return files, evidence, and residual risks.`
60
60
  }),
@@ -86,7 +86,7 @@ Return a concise result, evidence, risks, and next action.`
86
86
  filename: 'explorer.toml',
87
87
  aliases: ['explorer', 'code-explorer'],
88
88
  codexName: 'explorer',
89
- description: 'Astra Medium read-only codebase explorer for read-heavy scans, entry points, ownership, dependencies, and distilled evidence.',
89
+ description: 'Context-tier read-only codebase explorer for read-heavy scans, entry points, ownership, dependencies, and distilled evidence.',
90
90
  policy: 'terra_max_context_tools',
91
91
  sandbox: 'read-only',
92
92
  keywords: ['explore', 'map', 'trace', 'inventory', 'locate', 'search', 'read-only', 'large search', 'repository-wide search', '대규모 검색'],
@@ -104,7 +104,7 @@ Return concise findings with exact paths and symbols.`
104
104
  filename: 'long-context-analyst.toml',
105
105
  aliases: ['long-context-analyst', 'large-context-analyst', 'document-analyst'],
106
106
  codexName: 'long_context_analyst',
107
- description: 'Astra Medium read-only analyst for large files, long logs, multi-document context, and distilled evidence handoffs.',
107
+ description: 'Context-tier read-only analyst for large files, long logs, multi-document context, and distilled evidence handoffs.',
108
108
  policy: 'terra_max_context_tools',
109
109
  sandbox: 'read-only',
110
110
  keywords: ['long context', 'large file', 'large codebase', 'multi-document', 'supporting documents', 'extensive logs', 'context compression'],
@@ -112,7 +112,7 @@ Return concise findings with exact paths and symbols.`
112
112
  instructions: `You are the long-context evidence analyst.
113
113
 
114
114
  Read large files, long logs, or multiple supporting documents without turning raw context into unsupported conclusions.
115
- Return a compact, source-addressable summary to the parent and identify which claims still require Astra Max judgment.
115
+ Return a compact, source-addressable summary to the parent and identify which claims still require deep-tier judgment.
116
116
  Use bounded TriWiki anchors first, hydrate only relevant sources, and do not edit files or spawn another subagent.`
117
117
  }),
118
118
  officialSubagentRole({
@@ -153,13 +153,13 @@ Run only the focused checks needed for the slice and report exact commands and o
153
153
  filename: 'ui-implementer.toml',
154
154
  aliases: ['ui-implementer', 'frontend-specialist'],
155
155
  codexName: 'ui_implementer',
156
- description: 'Astra Low UI and terminal-interface implementation specialist for instructed visual behavior, interaction, accessibility, and rendered state changes.',
156
+ description: 'Balanced-tier UI and terminal-interface implementation specialist for instructed visual behavior, interaction, accessibility, and rendered state changes.',
157
157
  policy: 'sol_high_implementation',
158
158
  keywords: ['ui', 'ux', 'frontend', 'visual', 'terminal', 'accessibility'],
159
159
  nicknames: ['Canvas', 'Iris', 'Pixel', 'Turing'],
160
160
  instructions: `You are the UI implementation specialist.
161
161
 
162
- Execute the coding scope defined by the parent; return unresolved design, debugging, or planning decisions to an Astra Max specialist.
162
+ Execute the coding scope defined by the parent; return unresolved design, debugging, or planning decisions to a deep-tier specialist.
163
163
  Trace the rendered user-visible behavior before editing.
164
164
  Make the smallest change that fixes interaction, layout, accessibility, or terminal presentation.
165
165
  Preserve the existing design system and unrelated behavior.
@@ -170,14 +170,14 @@ Verify the rendered result with the appropriate live or deterministic surface an
170
170
  filename: 'native-app-specialist.toml',
171
171
  aliases: ['native-app-specialist', 'macos-specialist', 'desktop-specialist'],
172
172
  codexName: 'native_app_specialist',
173
- description: 'Astra Low native desktop coding specialist for instructed macOS AppKit and Swift menu-bar UI, app lifecycle, accessibility, and OS integration changes.',
173
+ description: 'Balanced-tier native desktop coding specialist for instructed macOS AppKit and Swift menu-bar UI, app lifecycle, accessibility, and OS integration changes.',
174
174
  policy: 'sol_high_implementation',
175
175
  keywords: ['native app', 'macos', 'appkit', 'swift', 'menu bar', 'nsstatusitem', 'nsworkspace', 'tcc', 'desktop app'],
176
176
  nicknames: ['Cocoa', 'Darwin', 'Quartz', 'Swift'],
177
177
  instructions: `You are the native desktop implementation specialist.
178
178
 
179
179
  Own only the assigned native macOS, AppKit, Swift, or menu-bar files.
180
- Execute the coding scope defined by the parent; return unresolved architecture, debugging, or planning decisions to an Astra Max specialist.
180
+ Execute the coding scope defined by the parent; return unresolved architecture, debugging, or planning decisions to a deep-tier specialist.
181
181
  Preserve the project design system, accessibility semantics, app lifecycle, and OS permission boundaries.
182
182
  Do not substitute web UI or placeholder assets for required native behavior.
183
183
  Verify with the narrowest compile, deterministic template, or live native check available and report exact evidence.`
@@ -187,7 +187,7 @@ Verify with the narrowest compile, deterministic template, or live native check
187
187
  filename: 'computer-use-operator.toml',
188
188
  aliases: ['computer-use-operator', 'desktop-operator'],
189
189
  codexName: 'computer_use_operator',
190
- description: 'Astra Medium Computer Use operator for scoped native macOS, desktop-app, and OS-settings interaction or evidence capture.',
190
+ description: 'Context-tier Computer Use operator for scoped native macOS, desktop-app, and OS-settings interaction or evidence capture.',
191
191
  policy: 'terra_max_context_tools',
192
192
  sandbox: 'read-only',
193
193
  keywords: ['computer use', 'desktop interaction', 'macos inspection', 'system settings', 'native app inspection', 'visual evidence'],
@@ -196,7 +196,7 @@ Verify with the narrowest compile, deterministic template, or live native check
196
196
 
197
197
  Use Codex Computer Use only for the explicit native macOS, desktop-app, OS-settings, or non-web visual slice assigned by the parent.
198
198
  Do not target the hosting Codex Desktop app (com.openai.codex). For Codex-linked checks, observe Codex through structured host/process evidence and operate only the external native target.
199
- Do not replace judgment, debugging, planning, or security review; return captured evidence to the appropriate Astra Max specialist.
199
+ Do not replace judgment, debugging, planning, or security review; return captured evidence to the appropriate deep-tier specialist.
200
200
  Honor the parent permission scope, avoid destructive or irreversible UI actions, do not edit source files, and report exactly what was observed or changed.`
201
201
  }),
202
202
  officialSubagentRole({
@@ -204,7 +204,7 @@ Honor the parent permission scope, avoid destructive or irreversible UI actions,
204
204
  filename: 'browser-use-operator.toml',
205
205
  aliases: ['browser-use-operator', 'chrome-operator', 'web-operator'],
206
206
  codexName: 'browser_use_operator',
207
- description: 'Astra Medium Browser/Chrome operator for scoped website, localhost, webapp, and browser-based evidence collection or verification.',
207
+ description: 'Context-tier Browser/Chrome operator for scoped website, localhost, webapp, and browser-based evidence collection or verification.',
208
208
  policy: 'terra_max_context_tools',
209
209
  sandbox: 'read-only',
210
210
  keywords: ['browser use', 'browser', 'chrome', 'website', 'webapp', 'localhost', 'playwright', 'browser evidence'],
@@ -212,7 +212,7 @@ Honor the parent permission scope, avoid destructive or irreversible UI actions,
212
212
  instructions: `You are the scoped Browser/Chrome operator.
213
213
 
214
214
  Use the Codex Chrome Extension path first for websites, localhost, webapps, and browser-based verification, and halt rapidly when the required extension is unavailable.
215
- Do not perform security, UX, debugging, or product judgment; collect precise browser evidence and hand it to the relevant Astra Max specialist.
215
+ Do not perform security, UX, debugging, or product judgment; collect precise browser evidence and hand it to the relevant deep-tier specialist.
216
216
  Honor the parent permission scope, avoid destructive external actions, do not edit source files, and report URLs or sensitive values only in redacted form.`
217
217
  }),
218
218
  officialSubagentRole({
@@ -220,14 +220,14 @@ Honor the parent permission scope, avoid destructive external actions, do not ed
220
220
  filename: 'image-generation-operator.toml',
221
221
  aliases: ['image-generation-operator', 'imagegen-operator', 'image-tool-operator'],
222
222
  codexName: 'image_generation_operator',
223
- description: 'Astra Medium image-generation operator for scoped imagegen and GPT Image execution after the parent seals the visual requirements.',
223
+ description: 'Context-tier image-generation operator for scoped imagegen and GPT Image execution after the parent seals the visual requirements.',
224
224
  policy: 'terra_max_context_tools',
225
225
  keywords: ['image generation', 'imagegen', 'gpt image', IMAGEGEN_MODEL, 'generate image', 'edit image', 'visual asset'],
226
226
  nicknames: ['Aperture', 'Frame', 'Palette', 'Render'],
227
227
  instructions: `You are the scoped image-generation operator.
228
228
 
229
229
  Execute only the sealed image-generation or image-editing instructions supplied by the parent, using the official Codex image generation surface when available.
230
- Do not perform UX review, art-direction judgment, or product strategy; return generated artifact paths and tool evidence to a Astra Max reviewer when judgment is required.
230
+ Do not perform UX review, art-direction judgment, or product strategy; return generated artifact paths and tool evidence to a deep-tier reviewer when judgment is required.
231
231
  Write only assigned generated-asset paths, preserve source images, and never fabricate successful image output.`
232
232
  }),
233
233
  officialSubagentRole({
@@ -404,7 +404,7 @@ Return release blockers, exact evidence, and the minimal verification still requ
404
404
  filename: 'docs-maintainer.toml',
405
405
  aliases: ['docs-maintainer', 'documentation'],
406
406
  codexName: 'docs_maintainer',
407
- description: 'Astra Medium documentation maintainer for multi-source README, changelog, migration, and reference consistency after behavior is known.',
407
+ description: 'Context-tier documentation maintainer for multi-source README, changelog, migration, and reference consistency after behavior is known.',
408
408
  policy: 'terra_max_context_tools',
409
409
  keywords: ['docs', 'documentation', 'readme', 'changelog', 'migration guide', 'reference'],
410
410
  nicknames: ['Ink', 'Page', 'Scribe', 'Slate'],
@@ -1108,7 +1108,7 @@ async function prepareResearch(root, route, task, required, opts = {}) {
1108
1108
  const researchPlan = await writeResearchPlan(dir, task, {});
1109
1109
  const pipelinePlan = await writePipelinePlan(dir, { missionId: id, route, task, required, ambiguity: { required: false, status: 'direct_route' } });
1110
1110
  await setCurrent(root, routeState(id, route, 'RESEARCH_PREPARED', required, { prompt: task, ...pipelinePlanState(pipelinePlan) }), { sessionKey: opts.sessionKey });
1111
- return routeContext(route, id, task, required, `Run sks research run latest as a real long-running source-gathering pass, never an automatic mock fallback; do not modify repository source code. Run layered Super Search first and allow only correlated verified-content rows to support real claims. Then run exactly three independent official research_reviewer threads on GPT-6 Astra Max. Any objection requires a mission-local research_synthesizer revision and a fresh three-thread review cycle; do not launch a custom scheduler or debate pool. Keep subagent-plan.json, subagent-events.jsonl, subagent-parent-summary.json, and subagent-evidence.json current, write research-report.md and ${researchPaperArtifactForPlan(researchPlan)}, and pass the adversarial convergence, Honest Mode, and research-gate.json checks.`, null, root);
1111
+ return routeContext(route, id, task, required, `Run sks research run latest as a real long-running source-gathering pass, never an automatic mock fallback; do not modify repository source code. Run layered Super Search first and allow only correlated verified-content rows to support real claims. Then run exactly three independent official research_reviewer threads on the latest deep-tier model at max effort. Any objection requires a mission-local research_synthesizer revision and a fresh three-thread review cycle; do not launch a custom scheduler or debate pool. Keep subagent-plan.json, subagent-events.jsonl, subagent-parent-summary.json, and subagent-evidence.json current, write research-report.md and ${researchPaperArtifactForPlan(researchPlan)}, and pass the adversarial convergence, Honest Mode, and research-gate.json checks.`, null, root);
1112
1112
  }
1113
1113
  async function prepareAutoResearch(root, route, task, required, opts = {}) {
1114
1114
  const { id, dir } = await createMission(root, { mode: 'autoresearch', prompt: task, sessionKey: opts.sessionKey });
@@ -1489,7 +1489,7 @@ ${intakeLine}
1489
1489
  Pipeline plan: .sneakoscope/missions/${id}/${PIPELINE_PLAN_ARTIFACT}
1490
1490
  Required skills: ${route.requiredSkills.join(', ')}
1491
1491
  Stop gate: ${route.stopGate}
1492
- Official subagents: ${routeRequiresSubagents(route, visibleTask) ? 'required for this explicit Naruto/parallel task; use independent disjoint slices, official agent threads, matched SubagentStart/SubagentStop events, and a parent integration summary.' : 'not required by this task profile; keep the work parent-owned unless a concrete independent decomposition emerges.'}
1492
+ Official subagents: ${routeRequiresSubagents(route, visibleTask) ? 'required; the parent orchestrates only: spawn a child per independent disjoint slice through official agent threads, wait, then integrate with matched SubagentStart/SubagentStop events and a parent integration summary.' : 'not required by this task profile; keep the work parent-owned unless a concrete independent decomposition emerges.'}
1493
1493
  TriWiki: use a coordinate+voxel-overlay context pack when a claim needs project memory; hydrate low-trust claims from source; refresh after new findings or artifact changes; validate before handoffs/final claims. Coordinate-only packs are invalid and must be refreshed before pipeline decisions.
1494
1494
  Final closeout: every pipeline final answer must summarize what was done, what changed for the user/repo, what was verified, and any remaining gaps.
1495
1495
  ${stopFinalizationRitualsEnforced(root) && route.stopGate !== 'none' && reflectionRequiredForRoute(route) ? `Reflection: ${reflectionInstructionText()}` : 'Reflection: not required for this route.'}
@@ -1,4 +1,5 @@
1
- import { ASTRA_SUBAGENT_MODEL, NARUTO_LUNA_MODEL, NARUTO_SOL_MODEL, NARUTO_TERRA_MODEL, decideSubagentModel, subagentModelProfile } from '../subagents/model-policy.js';
1
+ import { decideSubagentModel, subagentModelProfile } from '../subagents/model-policy.js';
2
+ import { latestTierModelSet } from '../subagents/model-tiers.js';
2
3
  const CATEGORY_POLICY = {
3
4
  quick: { reasoning: 'low', serviceTier: 'fast' },
4
5
  standard: { reasoning: 'medium', serviceTier: 'fast' },
@@ -10,7 +11,9 @@ const CATEGORY_POLICY = {
10
11
  refactor: { reasoning: 'max', serviceTier: 'fast' },
11
12
  strategy: { reasoning: 'max', serviceTier: 'fast' }
12
13
  };
13
- export const NARUTO_MODELS = [NARUTO_LUNA_MODEL, NARUTO_SOL_MODEL, NARUTO_TERRA_MODEL, ASTRA_SUBAGENT_MODEL];
14
+ export function narutoModels() {
15
+ return [...latestTierModelSet()];
16
+ }
14
17
  const E2E_WORK_RE = /(e2e|end[-\s]?to[-\s]?end|test_execution|browser|chrome|computer[-\s]?use|computer\s+use|cross[-\s]?app|playwright|selenium|puppeteer|브라우저|컴퓨터\s*유즈)/i;
15
18
  export async function routeModel(category, opts = {}) {
16
19
  if (opts.narutoOnly) {
@@ -47,9 +50,9 @@ export function routeNarutoGpt56Model(input = {}) {
47
50
  || category === 'ultrabrain'
48
51
  || explicitHighRisk
49
52
  });
50
- const preferred = explicit || ASTRA_SUBAGENT_MODEL;
53
+ const preferred = explicit || automatic.model;
51
54
  const available = input.availableModels == null
52
- ? [...NARUTO_MODELS]
55
+ ? narutoModels()
53
56
  : input.availableModels.map(normalizeNarutoGpt56Model).filter((model) => Boolean(model));
54
57
  const degraded = new Set((input.degradedModels || []).map((model) => String(model).toLowerCase()));
55
58
  const usable = available.filter((model) => !degraded.has(model));
@@ -65,7 +68,7 @@ export function isNarutoGpt56Model(value) {
65
68
  }
66
69
  export function normalizeNarutoGpt56Model(value) {
67
70
  const model = String(value || '').trim().toLowerCase();
68
- return NARUTO_MODELS.includes(model) ? model : null;
71
+ return narutoModels().includes(model) ? model : null;
69
72
  }
70
73
  export function childInheritsActiveMainModel(_value) {
71
74
  return false;
@@ -1,4 +1,4 @@
1
- import { ASTRA_SUBAGENT_MODEL, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
1
+ import { thinkingSubagentModel, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
2
2
  export const RECALLPULSE_DECISION_ARTIFACT = 'recallpulse-decision.json';
3
3
  export const RECALLPULSE_HISTORY_ARTIFACT = 'recallpulse-history.jsonl';
4
4
  export const MISSION_STATUS_LEDGER_ARTIFACT = 'mission-status-ledger.json';
@@ -201,7 +201,7 @@ export const RESEARCH_REVIEWER_CONTRACT = Object.freeze([
201
201
  ...agent,
202
202
  persona_boundary: 'Apply only the assigned review dimension and report evidence-bound findings.',
203
203
  custom_agent: 'research_reviewer',
204
- model: ASTRA_SUBAGENT_MODEL,
204
+ model: thinkingSubagentModel(),
205
205
  reasoning_effort: SUBAGENT_EFFORT,
206
206
  service_tier: 'fast'
207
207
  })));
@@ -200,7 +200,7 @@ export async function evaluateRecallPulseFixtures(root, opts = {}) {
200
200
  fixture('repeated-stop-hook-blocker', true, 'Duplicate suppression keys collapse repeated blocker text into one durable status row.'),
201
201
  fixture('hook-only-status-visibility', true, 'mission-status-ledger.json preserves recoverable user-visible status.'),
202
202
  fixture('research-persona-missing', true, 'Research validation blocks missing agent display_name/persona/persona_boundary.'),
203
- fixture('research-model-policy-not-sol-max', true, 'Research validation blocks reviewer rows that are not bound to the research_reviewer GPT-6 Astra Max policy.'),
203
+ fixture('research-model-policy-not-sol-max', true, 'Research validation blocks reviewer rows that are not bound to the research_reviewer latest deep-tier max policy.'),
204
204
  fixture('research-review-evidence-missing', true, 'Research validation blocks reviewer outcomes without source evidence, falsifiers, or probes.'),
205
205
  fixture('research-impersonation', true, 'Research validation blocks persona-boundary violations.'),
206
206
  fixture('oversized-l1', true, 'L1 token and item limits reject oversized active recall.'),
@@ -369,7 +369,7 @@ export async function buildRecallPulseGovernanceReport(root, opts = {}) {
369
369
  ],
370
370
  migration_paths: {
371
371
  existing_missions: 'Run sks recallpulse run <mission-id> and sks recallpulse governance <mission-id> to add report-only artifacts.',
372
- existing_research_artifacts: 'Research gates require agent display_name/persona/persona_boundary fields and the research_reviewer GPT-6 Astra Max binding; old ledgers must be migrated before claiming pass.',
372
+ existing_research_artifacts: 'Research gates require agent display_name/persona/persona_boundary fields and the research_reviewer latest deep-tier max binding; old ledgers must be migrated before claiming pass.',
373
373
  generated_skills: 'Do not edit generated installed skills directly; rerun init/bootstrap from engine source when generated text needs refreshing.'
374
374
  },
375
375
  release_gate: 'RecallPulse remains report-only unless packcheck, selftest, sizecheck, registry metadata check, TriWiki validate, and RecallPulse fixture eval pass.'
@@ -882,7 +882,7 @@ function preservedRoutePersonality(routeId = '', routeName = '') {
882
882
  ImageUXReview: ("Image UX Review keeps " + IMAGEGEN_MODEL + " annotated raster review identity"),
883
883
  ComputerUse: 'Computer Use keeps maximum-speed native Mac/non-web visual lane identity',
884
884
  Goal: 'Goal uses Codex native /goal only and creates no SKS-owned persistence, artifact, loop, or fallback state',
885
- Research: 'Research keeps Super Search evidence, three independent Astra Max review dimensions, bounded revision, paper, and falsification identity',
885
+ Research: 'Research keeps Super Search evidence, three independent deep-tier review dimensions, bounded revision, paper, and falsification identity',
886
886
  AutoResearch: 'AutoResearch keeps iterative experiment loop identity',
887
887
  DB: 'DB keeps conservative read-first destructive-operation safety identity',
888
888
  MadSKS: 'MAD-SKS keeps explicit scoped high-risk authorization identity',
@@ -31,7 +31,6 @@ export function affectedGlobsFor(id) {
31
31
  'src/core/routes/design-policy.ts',
32
32
  'src/scripts/installed-package-smoke-check.ts',
33
33
  'src/scripts/postinstall-safe-side-effects-check.ts',
34
- 'test/blackbox/postinstall-safe-side-effects-packed.test.mjs',
35
34
  'test/unit/postinstall-command.test.mjs',
36
35
  'test/unit/publish-workflow-safety.test.mjs'
37
36
  ];
@@ -1,5 +1,5 @@
1
1
  import path from 'node:path';
2
- import { ASTRA_SUBAGENT_MODEL, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
2
+ import { thinkingSubagentModel, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
3
3
  import { nowIso, writeJsonAtomic, writeTextAtomic } from '../fsx.js';
4
4
  import { CLAIM_EVIDENCE_MATRIX_ARTIFACT, buildClaimEvidenceMatrixFromLedgers, writeClaimEvidenceMatrix } from './claim-evidence-matrix.js';
5
5
  import { DEFAULT_RESEARCH_QUALITY_CONTRACT, writeResearchQualityContract } from './research-quality-contract.js';
@@ -174,7 +174,7 @@ export async function writeMockResearchResult(dir, plan) {
174
174
  mandate: agent.mandate,
175
175
  model_policy: {
176
176
  custom_agent: RESEARCH_REVIEWER_CUSTOM_AGENT,
177
- model: ASTRA_SUBAGENT_MODEL,
177
+ model: thinkingSubagentModel(),
178
178
  reasoning_effort: SUBAGENT_EFFORT,
179
179
  enforcement_source: 'mock_fixture'
180
180
  },
@@ -6,7 +6,7 @@ import { buildOfficialSubagentPrompt } from '../subagents/official-subagent-prom
6
6
  import { codexAppSessionKey, detectCodexAppSession, runOfficialSubagentWorkflow } from '../subagents/official-subagent-runner.js';
7
7
  import { readOfficialSubagentConfig } from '../subagents/official-subagent-config.js';
8
8
  import { SUBAGENT_EVENT_LOG_FILENAME, SUBAGENT_EVIDENCE_FILENAME, SUBAGENT_PARENT_SUMMARY_FILENAME, bindTrustworthySubagentParentSummaryToRun, normalizeSubagentParentSummary, persistOrReuseTrustworthySubagentParentSummary, readSubagentEvents, writeSubagentEvidence } from '../subagents/subagent-evidence.js';
9
- import { THINKING_SUBAGENT_MODEL, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
9
+ import { thinkingSubagentModel, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
10
10
  import { RESEARCH_AGENT_COUNCIL, RESEARCH_REVIEWER_CONFIG_ARTIFACT, RESEARCH_REVIEWER_CUSTOM_AGENT, researchAgentAgentName, researchPaperArtifactForPlan } from '../research.js';
11
11
  import { normalizeResearchSynthesisOutput } from './research-synthesis-writer.js';
12
12
  import { buildResearchReviewArtifactDigest, validateResearchReviewArtifactDigest } from './research-review-artifact-digest.js';
@@ -301,7 +301,7 @@ export function buildResearchAdversarialPlan(plan, maxCycles = 3, maxThreads = R
301
301
  persona: agent.persona,
302
302
  persona_boundary: agent.persona_boundary,
303
303
  custom_agent: RESEARCH_REVIEWER_CUSTOM_AGENT,
304
- model_policy: `${THINKING_SUBAGENT_MODEL} ${SUBAGENT_EFFORT}`,
304
+ model_policy: `${thinkingSubagentModel()} ${SUBAGENT_EFFORT}`,
305
305
  model_policy_source: modelPolicyEvidence?.source || RESEARCH_REVIEWER_CONFIG_ARTIFACT,
306
306
  model_policy_sha256: modelPolicyEvidence?.sha256 || null
307
307
  })),
@@ -533,7 +533,7 @@ async function finalizeResearchAdversarialArtifacts(input, plan, reviewCycles, r
533
533
  publication_acceptance_guaranteed: false,
534
534
  reviewer_model_policy: {
535
535
  custom_agent: RESEARCH_REVIEWER_CUSTOM_AGENT,
536
- model: THINKING_SUBAGENT_MODEL,
536
+ model: thinkingSubagentModel(),
537
537
  reasoning_effort: SUBAGENT_EFFORT,
538
538
  enforcement_source: plan?.model_policy_evidence?.source || RESEARCH_REVIEWER_CONFIG_ARTIFACT,
539
539
  config_sha256: plan?.model_policy_evidence?.sha256 || null,
@@ -581,7 +581,7 @@ async function writeCompatibilityCouncilArtifacts(dir, plan, finalReview, gate)
581
581
  mandate: agent.mandate,
582
582
  model_policy: {
583
583
  custom_agent: RESEARCH_REVIEWER_CUSTOM_AGENT,
584
- model: THINKING_SUBAGENT_MODEL,
584
+ model: thinkingSubagentModel(),
585
585
  reasoning_effort: SUBAGENT_EFFORT,
586
586
  enforcement_source: gate?.reviewer_model_policy?.enforcement_source || RESEARCH_REVIEWER_CONFIG_ARTIFACT,
587
587
  config_sha256: gate?.reviewer_model_policy?.config_sha256 || null
@@ -951,7 +951,7 @@ async function prepareResearchSubagentRun(input, opts) {
951
951
  })),
952
952
  model_policy: {
953
953
  custom_agent: plan.phase === 'review' ? RESEARCH_REVIEWER_CUSTOM_AGENT : 'research_synthesizer',
954
- model: THINKING_SUBAGENT_MODEL,
954
+ model: thinkingSubagentModel(),
955
955
  reasoning_effort: SUBAGENT_EFFORT,
956
956
  config: plan.phase === 'review' ? RESEARCH_REVIEWER_CONFIG_ARTIFACT : '.codex/agents/research-synthesizer.toml'
957
957
  }
@@ -997,7 +997,7 @@ async function verifyResearchReviewerRoleConfig(root) {
997
997
  const blockers = [
998
998
  ...(text.trim() ? [] : ['research_reviewer_agent_config_missing']),
999
999
  ...(name === RESEARCH_REVIEWER_CUSTOM_AGENT ? [] : [`research_reviewer_name_mismatch:${name || 'missing'}`]),
1000
- ...(model === THINKING_SUBAGENT_MODEL ? [] : [`research_reviewer_model_mismatch:${model || 'missing'}`]),
1000
+ ...(model === thinkingSubagentModel() ? [] : [`research_reviewer_model_mismatch:${model || 'missing'}`]),
1001
1001
  ...(effort === SUBAGENT_EFFORT ? [] : [`research_reviewer_effort_mismatch:${effort || 'missing'}`]),
1002
1002
  ...(sandbox === 'read-only' ? [] : [`research_reviewer_sandbox_mismatch:${sandbox || 'missing'}`])
1003
1003
  ];
@@ -1019,7 +1019,7 @@ function mockResearchModelPolicyEvidence() {
1019
1019
  ok: true,
1020
1020
  source: 'mock_fixture:research_reviewer',
1021
1021
  name: RESEARCH_REVIEWER_CUSTOM_AGENT,
1022
- model: THINKING_SUBAGENT_MODEL,
1022
+ model: thinkingSubagentModel(),
1023
1023
  reasoning_effort: SUBAGENT_EFFORT,
1024
1024
  sandbox_mode: 'read-only',
1025
1025
  sha256: null,
@@ -2,7 +2,7 @@ import path from 'node:path';
2
2
  import { readJson } from '../fsx.js';
3
3
  import { uniqueValues as unique } from '../text/strings.js';
4
4
  import { runCodexTask } from '../codex-control/codex-task-runner.js';
5
- import { THINKING_SUBAGENT_MODEL, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
5
+ import { thinkingSubagentModel, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
6
6
  import { normalizeClaimEvidenceMatrix, validateClaimEvidenceMatrix } from './claim-evidence-matrix.js';
7
7
  export async function synthesizeResearchClaimEvidenceMatrix(input) {
8
8
  const result = await runCodexTask({
@@ -33,7 +33,7 @@ export async function synthesizeResearchClaimEvidenceMatrix(input) {
33
33
  hardTimeoutMs: input.timeoutMs,
34
34
  ...(input.deadlineMs === undefined ? {} : { deadlineEpochMs: input.deadlineMs })
35
35
  },
36
- model: THINKING_SUBAGENT_MODEL,
36
+ model: thinkingSubagentModel(),
37
37
  reasoningEffort: SUBAGENT_EFFORT,
38
38
  modelReasoningEffort: SUBAGENT_EFFORT,
39
39
  serviceTier: 'fast'
@@ -178,7 +178,7 @@ function buildResearchClaimSynthesisPrompt(input) {
178
178
  const contract = input.plan?.quality_contract || {};
179
179
  return [
180
180
  'Build a semantic claim-evidence matrix for this Research mission.',
181
- `This is a judgment-heavy task: use ${THINKING_SUBAGENT_MODEL} with ${SUBAGENT_EFFORT} reasoning.`,
181
+ `This is a judgment-heavy task: use ${thinkingSubagentModel()} with ${SUBAGENT_EFFORT} reasoning.`,
182
182
  'Return exactly one JSON object matching sks.claim-evidence-matrix.v1.',
183
183
  'Never reuse or merge discovery claim IDs merely because their strings match.',
184
184
  'Group sources only when their hydrated notes/content actually support the same written claim.',
@@ -2,7 +2,7 @@ import path from 'node:path';
2
2
  import { nowIso, readJson } from '../fsx.js';
3
3
  import { uniqueValues as unique } from '../text/strings.js';
4
4
  import { runCodexTask } from '../codex-control/codex-task-runner.js';
5
- import { THINKING_SUBAGENT_MODEL, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
5
+ import { thinkingSubagentModel, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
6
6
  export async function runResearchFalsification(input) {
7
7
  const result = await runCodexTask({
8
8
  route: '$Research',
@@ -32,7 +32,7 @@ export async function runResearchFalsification(input) {
32
32
  hardTimeoutMs: input.timeoutMs,
33
33
  ...(input.deadlineMs === undefined ? {} : { deadlineEpochMs: input.deadlineMs })
34
34
  },
35
- model: THINKING_SUBAGENT_MODEL,
35
+ model: thinkingSubagentModel(),
36
36
  reasoningEffort: SUBAGENT_EFFORT,
37
37
  modelReasoningEffort: SUBAGENT_EFFORT,
38
38
  serviceTier: 'fast'
@@ -107,7 +107,7 @@ export function normalizeResearchFalsification(value, claimMatrix, sourceLedger)
107
107
  function buildResearchFalsificationPrompt(input) {
108
108
  return [
109
109
  'Attempt to falsify the key claims in this Research mission before manuscript synthesis.',
110
- `This is a judgment-heavy task: use ${THINKING_SUBAGENT_MODEL} with ${SUBAGENT_EFFORT} reasoning.`,
110
+ `This is a judgment-heavy task: use ${thinkingSubagentModel()} with ${SUBAGENT_EFFORT} reasoning.`,
111
111
  'Return exactly one JSON object matching sks.falsification-ledger.v1.',
112
112
  'Do not mark a claim as surviving by default. Compare the written claim with actual source notes/content and counterevidence.',
113
113
  'Use only known claim IDs and source IDs. A generic attack with no source-linked reasoning is invalid.',
@@ -2,10 +2,13 @@ import path from 'node:path';
2
2
  import { readJson, sha256 } from '../fsx.js';
3
3
  import { runCodexTask } from '../codex-control/codex-task-runner.js';
4
4
  import { runSuperSearch } from '../super-search/index.js';
5
- import { TERRA_SUBAGENT_EFFORT, TERRA_SUBAGENT_MODEL } from '../subagents/model-policy.js';
5
+ import { TERRA_SUBAGENT_EFFORT } from '../subagents/model-policy.js';
6
+ import { latestModelForTier } from '../subagents/model-tiers.js';
6
7
  import {} from './research-source-shards.js';
7
8
  export const RESEARCH_SOURCE_ACQUISITION_MODEL_POLICY = Object.freeze({
8
- model: TERRA_SUBAGENT_MODEL,
9
+ get model() {
10
+ return latestModelForTier('context');
11
+ },
9
12
  model_reasoning_effort: TERRA_SUBAGENT_EFFORT
10
13
  });
11
14
  export async function runResearchSuperSearchShard(input) {
@@ -2,7 +2,7 @@ import path from 'node:path';
2
2
  import { readJson, writeJsonAtomic, writeTextAtomic, nowIso } from '../fsx.js';
3
3
  import { runCodexTask } from '../codex-control/codex-task-runner.js';
4
4
  import { researchPaperArtifactForPlan } from '../research.js';
5
- import { THINKING_SUBAGENT_MODEL, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
5
+ import { thinkingSubagentModel, SUBAGENT_EFFORT } from '../subagents/model-policy.js';
6
6
  import { analyzeResearchReportQuality, countWords } from './research-report-quality.js';
7
7
  import { analyzeResearchRepetition } from './research-repetition-detector.js';
8
8
  import { buildRealisticResearchPaper, buildRealisticResearchReport } from './research-realistic-report.js';
@@ -78,7 +78,7 @@ export async function runResearchCodexSynthesisWriter(input) {
78
78
  hardTimeoutMs: input.timeoutMs || 120000,
79
79
  ...(input.deadlineMs === undefined ? {} : { deadlineEpochMs: input.deadlineMs })
80
80
  },
81
- model: THINKING_SUBAGENT_MODEL,
81
+ model: thinkingSubagentModel(),
82
82
  reasoningEffort: SUBAGENT_EFFORT,
83
83
  modelReasoningEffort: SUBAGENT_EFFORT,
84
84
  serviceTier: 'fast'
@@ -1,5 +1,5 @@
1
1
  import path from 'node:path';
2
- import { ASTRA_SUBAGENT_MODEL, SUBAGENT_EFFORT } from './subagents/model-policy.js';
2
+ import { thinkingSubagentModel, SUBAGENT_EFFORT } from './subagents/model-policy.js';
3
3
  import { appendJsonlBounded, nowIso, readJson, readText, writeJsonAtomic, writeTextAtomic, exists } from './fsx.js';
4
4
  import { OUTCOME_RUBRIC } from './proof-field.js';
5
5
  import { RESEARCH_REVIEWER_CONTRACT } from './recallpulse.js';
@@ -100,7 +100,7 @@ export function researchNativeAgentPlan(prompt = '', opts = {}) {
100
100
  role: persona.role,
101
101
  mandate: persona.mandate,
102
102
  custom_agent: RESEARCH_REVIEWER_CUSTOM_AGENT,
103
- model: ASTRA_SUBAGENT_MODEL,
103
+ model: thinkingSubagentModel(),
104
104
  reasoning_effort: SUBAGENT_EFFORT,
105
105
  read_only: true
106
106
  }));
@@ -202,10 +202,10 @@ export function createResearchPlan(prompt, opts = {}) {
202
202
  policy: 'Assign distinct evidence, method, and falsification review dimensions.',
203
203
  effort_policy: {
204
204
  custom_agent: RESEARCH_REVIEWER_CUSTOM_AGENT,
205
- required_model: ASTRA_SUBAGENT_MODEL,
205
+ required_model: thinkingSubagentModel(),
206
206
  required_effort: SUBAGENT_EFFORT,
207
207
  applies_to: 'every_official_adversarial_reviewer',
208
- rule: 'Every adversarial reviewer uses the verified research_reviewer custom agent configuration with GPT-6 Astra Max. Long-context and source-tool acquisition uses Astra Medium; synthesis, falsification, and review use Astra Max.'
208
+ rule: 'Every adversarial reviewer uses the verified research_reviewer custom agent configuration on the latest deep-tier model at max effort. Long-context and source-tool acquisition uses the context tier; synthesis, falsification, and review use the deep tier.'
209
209
  },
210
210
  debate_policy: {
211
211
  mode: 'independent_adversarial_reviews_with_bounded_revision',
@@ -473,7 +473,7 @@ export function defaultAgentLedger(plan = null) {
473
473
  mandate: agent.mandate,
474
474
  model_policy: {
475
475
  custom_agent: RESEARCH_REVIEWER_CUSTOM_AGENT,
476
- model: ASTRA_SUBAGENT_MODEL,
476
+ model: thinkingSubagentModel(),
477
477
  reasoning_effort: SUBAGENT_EFFORT,
478
478
  enforcement_source: RESEARCH_REVIEWER_CONFIG_ARTIFACT
479
479
  },
@@ -1,6 +1,6 @@
1
1
  import { IMAGEGEN_MODEL } from '../imagegen/imagegen-model-policy.js';
2
2
  import { normalizeDollarSkillName, prefixKnownSksDollarReferences, sksPrefixedDollarCommand } from './dollar-prefix.js';
3
- const NARUTO_DESCRIPTION = '$Naruto runs explicit parallel work through Codex official subagents. The selected parent owns decomposition, integration, and verification; standalone launches default to GPT-6 Astra. Delegate independent slices with disjoint writes, use Astra for every child and vary only effort by task, and honor explicit counts and measured host limits. max_threads is a cap, never a target.';
3
+ const NARUTO_DESCRIPTION = '$Naruto runs implementation work through Codex official subagents. The parent orchestrates: it owns decomposition, integration, and verification, spawns a child per disjoint slice, and does not implement slices itself; standalone launches default to the latest deep-tier model. Each child runs the newest model of its tier, Jev mode picks the tier on spawn, and explicit counts and measured host limits are honored. max_threads is a cap, never a target.';
4
4
  const COMPUTER_USE_DESCRIPTION = 'Maximum-speed Codex Computer Use lane for native macOS, desktop-app, OS-settings, and non-web visual tasks only. Browser, localhost, website, webapp, and web-based app verification must route through Codex Chrome Extension readiness first.';
5
5
  const DOLLAR_COMMANDS_LITE_BASE = [
6
6
  { command: '$DFix', route: 'fast direct fix', description: 'Tiny simple direct edits such as copy, labels, typos, wording, spacing, colors, or clearly scoped one-line changes. Bypasses the general SKS pipeline and runs an ultralight, no-record task-list path.' },