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.
- package/README.md +22 -12
- package/config/skills-hash-ledger.v1.json +7 -1
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/config/skills-manifest.json +13 -7
- package/dist/core/agents/agent-effort-policy.js +15 -13
- package/dist/core/agents/native-worker-backend-router.js +13 -8
- package/dist/core/codex-hooks/codex-hook-managed-install.js +56 -2
- package/dist/core/codex-lb/desktop-bridge-migration/retired-runtime-cleanup.js +1 -0
- package/dist/core/codex-native/core-skill-manifest.js +4 -4
- package/dist/core/decisions/cli.js +9 -2
- package/dist/core/decisions/config.js +7 -0
- package/dist/core/decisions/integration.js +54 -12
- package/dist/core/decisions/policy.js +27 -4
- package/dist/core/decisions/questions.js +39 -9
- package/dist/core/decisions/routing.js +15 -10
- package/dist/core/decisions/types.js +11 -25
- package/dist/core/doctor/current-project-guidance.js +38 -1
- package/dist/core/doctor/skill-legacy-surface.js +2 -1
- package/dist/core/hooks-runtime/hook-context.js +1 -1
- package/dist/core/hooks-runtime/jev-spawn-routing.js +21 -2
- package/dist/core/hooks-runtime/managed-guidance-preflight.js +30 -0
- package/dist/core/hooks-runtime/official-subagent-lifecycle.js +3 -3
- package/dist/core/hooks-runtime/parent-orchestration-gate.js +372 -0
- package/dist/core/hooks-runtime/subagent-context.js +13 -3
- package/dist/core/hooks-runtime/subagent-spawn-policy.js +5 -10
- package/dist/core/hooks-runtime.js +46 -8
- package/dist/core/init/skills/inventory.js +5 -1
- package/dist/core/init/skills.js +4 -4
- package/dist/core/init.js +39 -7
- package/dist/core/managed-assets/managed-assets-manifest.js +17 -17
- package/dist/core/pipeline-internals/runtime-core.js +2 -2
- package/dist/core/provider/model-router.js +8 -5
- package/dist/core/recallpulse/policy.js +2 -2
- package/dist/core/recallpulse.js +3 -3
- package/dist/core/release/gate-affected-globs.js +0 -1
- package/dist/core/research/mock-result.js +2 -2
- package/dist/core/research/research-adversarial-review.js +7 -7
- package/dist/core/research/research-claim-synthesizer.js +3 -3
- package/dist/core/research/research-falsification-runner.js +3 -3
- package/dist/core/research/research-super-search.js +5 -2
- package/dist/core/research/research-synthesis-writer.js +2 -2
- package/dist/core/research.js +5 -5
- package/dist/core/routes/dollar-manifest-lite.js +1 -1
- package/dist/core/routes.js +10 -10
- package/dist/core/runtime/task-profile.js +9 -5
- package/dist/core/subagents/model-policy.js +27 -45
- package/dist/core/subagents/model-tiers.js +153 -0
- package/dist/core/subagents/naruto-command-args.js +3 -3
- package/dist/core/subagents/naruto-help-contract.js +18 -13
- package/dist/core/subagents/naruto-host-credentials.js +8 -13
- package/dist/core/subagents/official-subagent-config.js +11 -7
- package/dist/core/subagents/official-subagent-preparation.js +12 -8
- package/dist/core/subagents/official-subagent-prompt.js +33 -33
- package/dist/core/subagents/official-subagent-runner.js +3 -3
- package/dist/core/subagents/role-model-preferences.js +26 -21
- package/dist/core/update/managed-permission-repair.js +462 -0
- package/dist/core/update/update-migration-state/retired-local-decision.js +32 -2
- package/dist/core/update/update-migration-state/simple-stages.js +42 -5
- package/dist/core/update/update-migration-state.js +63 -1
- package/dist/core/update-check.js +35 -8
- package/dist/core/version.js +1 -1
- package/dist/scripts/codex-native-agent-role-content-check.js +10 -5
- package/dist/scripts/codex-native-gate-lib.js +3 -1
- package/dist/scripts/current-surface-update-e2e-check.js +1 -0
- package/dist/scripts/mutation-callsite-coverage-check.js +2 -2
- package/dist/scripts/release-affected-selector-check.js +1 -2
- package/dist/scripts/typed-routing-gate-lib.js +3 -1
- package/package.json +1 -1
- package/release-gates.v2.json +2 -6
|
@@ -17,6 +17,7 @@ import { runSessionStateSplitStage } from './update-migration-state/session-stat
|
|
|
17
17
|
import { runRetiredLocalDecisionStage } from './update-migration-state/retired-local-decision.js';
|
|
18
18
|
import { runHookTrustRefreshStage, runOtherHarnessCleanupStage } from './update-migration-state/simple-stages.js';
|
|
19
19
|
import { compareSemVer } from './semver.js';
|
|
20
|
+
import { repairManagedPermissions } from './managed-permission-repair.js';
|
|
20
21
|
export const UPDATE_MIGRATION_SCHEMA = 'sks.project-migration-receipt.v2';
|
|
21
22
|
export const INSTALLATION_EPOCH_SCHEMA = 'sks.installation-epoch.v1';
|
|
22
23
|
export function installationEpochPath() {
|
|
@@ -95,8 +96,11 @@ export async function clearPendingUpdateMigration() {
|
|
|
95
96
|
export async function writeProjectUpdateMigrationReceipt(input) {
|
|
96
97
|
const receiptPath = projectUpdateMigrationReceiptPath(input.root);
|
|
97
98
|
const epoch = await ensureInstallationEpoch(input.source);
|
|
99
|
+
const fromVersion = input.fromVersion || null;
|
|
100
|
+
const permissionStage = await runManagedPermissionRepairStage(input.root, fromVersion);
|
|
98
101
|
const retentionCleanup = await runUpdateRetentionCleanup(input.root, input.source);
|
|
99
|
-
const
|
|
102
|
+
const stageRuns = await retryStagesAfterPermissionRepair(input.root, fromVersion, await runUpdateMigrationStages(input.root, { fromVersion }));
|
|
103
|
+
const migrationStageRuns = [permissionStage, ...stageRuns];
|
|
100
104
|
const migrationStages = migrationStageRuns.map(summarizeMigrationStage);
|
|
101
105
|
const stageBlockers = migrationStageRuns.flatMap((stage) => stage.blockers.map((blocker) => `${stage.id}:${blocker}`));
|
|
102
106
|
const stageWarnings = migrationStageRuns.flatMap((stage) => stage.warnings.map((warning) => `${stage.id}:${warning}`));
|
|
@@ -144,8 +148,64 @@ export async function writeProjectUpdateMigrationReceipt(input) {
|
|
|
144
148
|
warnings: optionalWarnings
|
|
145
149
|
};
|
|
146
150
|
await writeReceiptRotated(receiptPath, receipt, { keep: 5 });
|
|
151
|
+
if (process.getuid?.() === 0) {
|
|
152
|
+
await repairManagedPermissions({ root: input.root, env: process.env, explicit: true, reportPath: null }).catch(() => null);
|
|
153
|
+
}
|
|
147
154
|
return receipt;
|
|
148
155
|
}
|
|
156
|
+
export const MANAGED_PERMISSION_REPAIR_STAGE_ID = 'managed-permission-repair';
|
|
157
|
+
function migrationRunIsExplicit(env) {
|
|
158
|
+
return env.SKS_UPDATE_DEFER_MENUBAR_RESTART === '1' || env.SKS_UPDATE_MIGRATION_GATE_DISABLED !== '1';
|
|
159
|
+
}
|
|
160
|
+
async function runManagedPermissionRepairStage(root, fromVersion) {
|
|
161
|
+
const base = {
|
|
162
|
+
schema: 'sks.update-migration-stage.v2',
|
|
163
|
+
id: MANAGED_PERMISSION_REPAIR_STAGE_ID,
|
|
164
|
+
min_from_version: '0.0.0',
|
|
165
|
+
from_version: fromVersion
|
|
166
|
+
};
|
|
167
|
+
try {
|
|
168
|
+
const report = await repairManagedPermissions({ root, env: process.env, explicit: migrationRunIsExplicit(process.env) });
|
|
169
|
+
const elevation = report.elevation;
|
|
170
|
+
return {
|
|
171
|
+
...base,
|
|
172
|
+
ok: true,
|
|
173
|
+
status: 'ok',
|
|
174
|
+
actions: [
|
|
175
|
+
...(report.user_fixed ? [`fixed_user_permissions:${report.user_fixed}`] : []),
|
|
176
|
+
...(elevation.needed ? [`elevation:${elevation.channel}:${elevation.ok === true ? 'granted' : elevation.declined ? 'declined' : 'not_granted'}`] : [])
|
|
177
|
+
],
|
|
178
|
+
blockers: [],
|
|
179
|
+
warnings: report.warnings,
|
|
180
|
+
detail: {
|
|
181
|
+
issues_found: report.issues_found,
|
|
182
|
+
user_fixed: report.user_fixed,
|
|
183
|
+
elevation,
|
|
184
|
+
remaining: report.remaining,
|
|
185
|
+
operator_actions: report.operator_actions
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
return { ...base, ok: true, status: 'ok', actions: [], blockers: [], warnings: [`managed_permission_repair_failed:${err?.message || String(err)}`] };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function retryStagesAfterPermissionRepair(root, fromVersion, runs) {
|
|
194
|
+
const failed = runs.filter((run) => !run.ok);
|
|
195
|
+
if (!failed.length)
|
|
196
|
+
return runs;
|
|
197
|
+
const report = await repairManagedPermissions({
|
|
198
|
+
root,
|
|
199
|
+
env: process.env,
|
|
200
|
+
explicit: migrationRunIsExplicit(process.env),
|
|
201
|
+
reportPath: path.join(root, '.sneakoscope', 'reports', 'managed-permission-repair-retry.json')
|
|
202
|
+
}).catch(() => null);
|
|
203
|
+
if (!report || (report.user_fixed === 0 && report.elevation.ok !== true))
|
|
204
|
+
return runs;
|
|
205
|
+
const rerun = await runUpdateMigrationStages(root, { fromVersion, only: new Set(failed.map((run) => run.id)) });
|
|
206
|
+
const byId = new Map(rerun.map((run) => [run.id, { ...run, warnings: [...run.warnings, 'rerun_after_permission_repair'] }]));
|
|
207
|
+
return runs.map((run) => byId.get(run.id) || run);
|
|
208
|
+
}
|
|
149
209
|
function summarizeMigrationStage(stage) {
|
|
150
210
|
return {
|
|
151
211
|
id: stage.id,
|
|
@@ -283,6 +343,8 @@ export async function runUpdateMigrationStages(root, opts = {}) {
|
|
|
283
343
|
const fromVersion = opts.fromVersion || null;
|
|
284
344
|
const runs = [];
|
|
285
345
|
for (const stage of UPDATE_MIGRATION_STAGES) {
|
|
346
|
+
if (opts.only && !opts.only.has(stage.id))
|
|
347
|
+
continue;
|
|
286
348
|
if (!legacyStageApplies(fromVersion, stage.min_from_version)) {
|
|
287
349
|
runs.push({
|
|
288
350
|
schema: 'sks.update-migration-stage.v2',
|
|
@@ -12,6 +12,7 @@ import { compareSemVer, extractSemVer, parseSemVer } from './update/semver.js';
|
|
|
12
12
|
import { countUpdates, emptyUpdateStatus, resolveSksUpdateStatus, UpdateStatusRefreshError } from './update/update-status.js';
|
|
13
13
|
import { acquireUpdateOperationLock, authorizeUpdateRollback, buildUpdateNowCommand, buildUpdateRollbackCommand, canonicalUpdateRegistry, UpdateOperationRecorder, updateOperationLastInstallPath, updateReceiptHasConfirmedGlobalInstall } from './update/update-operation.js';
|
|
14
14
|
import { runTemporaryInstallSmoke } from './update/temporary-install-smoke.js';
|
|
15
|
+
import { npmGlobalInstallTargets, repairManagedPermissions } from './update/managed-permission-repair.js';
|
|
15
16
|
import { updateStageFailureDiagnostics } from './update/update-stage-diagnostics.js';
|
|
16
17
|
import { executableOnInjectedPath, inspectInstalledCliResolution } from './update/installed-cli-resolution.js';
|
|
17
18
|
import { ui as cliUi, withHeartbeat } from '../cli/cli-theme.js';
|
|
@@ -400,6 +401,7 @@ async function runSksUpdateNowInternal(options, rollbackAuthorization) {
|
|
|
400
401
|
const stages = [];
|
|
401
402
|
let temporaryInstallSmoke = null;
|
|
402
403
|
await options.beforeOperationLock?.();
|
|
404
|
+
await repairManagedPermissions({ root: projectReceiptRoot, env, explicit: true, interactive: true }).catch(() => null);
|
|
403
405
|
const operationLock = await acquireUpdateOperationLock(env);
|
|
404
406
|
if (!operationLock.ok) {
|
|
405
407
|
stages.push({
|
|
@@ -887,18 +889,43 @@ async function runSksUpdateNowInternal(options, rollbackAuthorization) {
|
|
|
887
889
|
command,
|
|
888
890
|
target_version: installVersion
|
|
889
891
|
});
|
|
890
|
-
const
|
|
892
|
+
const runGlobalInstall = () => updateHeartbeat(machineOutput, `npm install -g ${packageName}`, guardedPackageInstall(guardContextForRoute(mutationLedgerRoot, installContract, command || `npm global install ${packageName}`), `${packageName}@${installVersion}`, installOptions), 60_000).catch((err) => ({
|
|
893
|
+
code: 1,
|
|
894
|
+
stdout: '',
|
|
895
|
+
stderr: err instanceof Error ? err.message : String(err),
|
|
896
|
+
timedOut: false
|
|
897
|
+
}));
|
|
898
|
+
let install = alreadyCurrent
|
|
891
899
|
? { code: 0, stdout: '', stderr: '', timedOut: false }
|
|
892
900
|
: env.SKS_UPDATE_FAKE_INSTALL === '1'
|
|
893
901
|
? { code: 0, stdout: 'fake install ok', stderr: '', timedOut: false }
|
|
894
|
-
: await
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
902
|
+
: await runGlobalInstall();
|
|
903
|
+
let installPermissionRepair = null;
|
|
904
|
+
if (install.code !== 0 && !alreadyCurrent && globalRoot && /\b(EACCES|EPERM)\b/.test(`${install.stderr}\n${install.stdout}`)) {
|
|
905
|
+
const targets = await npmGlobalInstallTargets(globalRoot, packageName).catch(() => []);
|
|
906
|
+
const repair = targets.length
|
|
907
|
+
? await repairManagedPermissions({
|
|
908
|
+
root: projectReceiptRoot,
|
|
909
|
+
env,
|
|
910
|
+
explicit: true,
|
|
911
|
+
interactive: true,
|
|
912
|
+
targets,
|
|
913
|
+
reason: 'SKS update needs administrator permission to let npm replace the installed SKS package.',
|
|
914
|
+
reportPath: null
|
|
915
|
+
}).catch(() => null)
|
|
916
|
+
: null;
|
|
917
|
+
const repaired = Boolean(repair && (repair.user_fixed > 0 || repair.elevation.ok === true));
|
|
918
|
+
installPermissionRepair = { channel: repair?.elevation.channel || 'unavailable', granted: repair?.elevation.ok ?? null, retried: repaired };
|
|
919
|
+
if (repaired)
|
|
920
|
+
install = await runGlobalInstall();
|
|
921
|
+
}
|
|
900
922
|
const installOk = install.code === 0;
|
|
901
|
-
stage('global_install', installOk, alreadyCurrent ? 'skipped_current' : installOk ? env.SKS_UPDATE_FAKE_INSTALL === '1' ? 'fake_installed' : 'installed' : 'failed', {
|
|
923
|
+
stage('global_install', installOk, alreadyCurrent ? 'skipped_current' : installOk ? env.SKS_UPDATE_FAKE_INSTALL === '1' ? 'fake_installed' : 'installed' : 'failed', {
|
|
924
|
+
command,
|
|
925
|
+
code: install.code,
|
|
926
|
+
timed_out: install.timedOut === true,
|
|
927
|
+
...(installPermissionRepair ? { permission_repair: installPermissionRepair } : {})
|
|
928
|
+
});
|
|
902
929
|
let newBinary = null;
|
|
903
930
|
let newVersion = null;
|
|
904
931
|
let installedCliResolution = null;
|
package/dist/core/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PACKAGE_VERSION = '10.3.
|
|
1
|
+
export const PACKAGE_VERSION = '10.3.4';
|
|
@@ -5,6 +5,11 @@ import os from 'node:os';
|
|
|
5
5
|
import { parse } from 'smol-toml';
|
|
6
6
|
import { syncCodexAgentRoles } from '../core/codex-app/codex-agent-role-sync.js';
|
|
7
7
|
import { MANAGED_OFFICIAL_SUBAGENT_ROLES } from '../core/managed-assets/managed-assets-manifest.js';
|
|
8
|
+
import { latestModelForTier } from '../core/subagents/model-tiers.js';
|
|
9
|
+
const fast = latestModelForTier('fast');
|
|
10
|
+
const balanced = latestModelForTier('balanced');
|
|
11
|
+
const context = latestModelForTier('context');
|
|
12
|
+
const deep = latestModelForTier('deep');
|
|
8
13
|
const root = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'sks-agent-role-content-'));
|
|
9
14
|
const codexHome = path.join(root, 'codex-home');
|
|
10
15
|
const report = await syncCodexAgentRoles({ root, codexHome, apply: true, agentTypeSupported: true });
|
|
@@ -12,16 +17,16 @@ const expert = await fs.promises.readFile(path.join(root, '.codex', 'agents', 'e
|
|
|
12
17
|
const worker = await fs.promises.readFile(path.join(root, '.codex', 'agents', 'worker.toml'), 'utf8');
|
|
13
18
|
const implementation = await fs.promises.readFile(path.join(root, '.codex', 'agents', 'implementation-specialist.toml'), 'utf8');
|
|
14
19
|
const browser = await fs.promises.readFile(path.join(root, '.codex', 'agents', 'browser-use-operator.toml'), 'utf8');
|
|
15
|
-
assertGate(expert.includes(
|
|
16
|
-
assertGate(worker.includes(
|
|
17
|
-
assertGate(implementation.includes(
|
|
18
|
-
assertGate(browser.includes(
|
|
20
|
+
assertGate(expert.includes(`model = "${deep}"`) && expert.includes('model_reasoning_effort = "max"'), 'expert role must use the deep tier at max');
|
|
21
|
+
assertGate(worker.includes(`model = "${fast}"`) && worker.includes('model_reasoning_effort = "low"'), 'worker role must use the fast tier at low');
|
|
22
|
+
assertGate(implementation.includes(`model = "${balanced}"`) && implementation.includes('model_reasoning_effort = "low"'), 'implementation role must use the balanced tier at low');
|
|
23
|
+
assertGate(browser.includes(`model = "${context}"`) && browser.includes('model_reasoning_effort = "medium"'), 'browser role must use the context tier at medium');
|
|
19
24
|
assertGate(expert.includes('Do not spawn another subagent.') && worker.includes('Do not redesign the task, expand scope, or spawn another subagent.'), 'official roles must prohibit nested delegation');
|
|
20
25
|
assertGate(MANAGED_OFFICIAL_SUBAGENT_ROLES.length === 25, 'official role catalog must contain all 25 roles');
|
|
21
26
|
for (const role of MANAGED_OFFICIAL_SUBAGENT_ROLES) {
|
|
22
27
|
const text = await fs.promises.readFile(path.join(root, '.codex', 'agents', role.filename), 'utf8');
|
|
23
28
|
const doc = parse(text);
|
|
24
|
-
assertGate(doc.model
|
|
29
|
+
assertGate([fast, balanced, context, deep].includes(String(doc.model)), `official role managed model is not a current tier model:${role.codex_name}`);
|
|
25
30
|
assertGate(doc.name === role.codex_name && doc.model === role.model && doc.model_reasoning_effort === role.model_reasoning_effort, `official role policy mismatch:${role.codex_name}`);
|
|
26
31
|
assertGate(Object.hasOwn(doc, 'sandbox_mode') === (role.sandbox === 'read-only'), `official role sandbox inheritance mismatch:${role.codex_name}`);
|
|
27
32
|
assertGate(doc.sandbox_mode === role.sandbox, `official role sandbox value mismatch:${role.codex_name}`);
|
|
@@ -281,7 +281,9 @@ async function agentRoleContent(id) {
|
|
|
281
281
|
const codexHome = path.join(tmp, 'codex-home');
|
|
282
282
|
const report = await mod.syncCodexAgentRoles({ root: tmp, codexHome, apply: true });
|
|
283
283
|
const role = fs.readFileSync(path.join(tmp, '.codex', 'agents', 'worker.toml'), 'utf8');
|
|
284
|
-
|
|
284
|
+
const tiers = await importDist('core/subagents/model-tiers.js');
|
|
285
|
+
const fastModel = String(tiers.latestModelForTier('fast'));
|
|
286
|
+
assertGate(role.includes(`model = "${fastModel}"`) && role.includes('Work only on the exact slice assigned by the parent agent.'), 'official worker role content incomplete', { role, report, fastModel });
|
|
285
287
|
assertGate(!fs.existsSync(path.join(codexHome, 'agents')), 'agent role content gate must not create global directive roles', report);
|
|
286
288
|
}
|
|
287
289
|
finally {
|
|
@@ -8,6 +8,7 @@ import { PACKAGE_VERSION, packageRoot, readJson, writeReceiptRotated } from '../
|
|
|
8
8
|
import { runSksUpdateNow } from '../core/update-check.js';
|
|
9
9
|
import { ensureCurrentMigrationBeforeCommand, projectUpdateMigrationReceiptPath, runPackageLocalDoctor } from '../core/update/update-migration-state.js';
|
|
10
10
|
const REQUIRED_MIGRATION_STAGES = [
|
|
11
|
+
'managed-permission-repair',
|
|
11
12
|
'other-harness-cleanup',
|
|
12
13
|
'retired-local-decision',
|
|
13
14
|
'current-public-surface-reconcile',
|
|
@@ -215,9 +215,9 @@ function risksForCall(call) {
|
|
|
215
215
|
&& /\b(?:install|i|add|uninstall|remove|publish)\b/.test(call.normalized_call)) {
|
|
216
216
|
risks.push({ kind: 'package_install', token: 'runProcess(npm/brew)' });
|
|
217
217
|
}
|
|
218
|
-
if (/^['"]xattr['"]$/.test(firstArgument.trim()))
|
|
218
|
+
if (/^['"](?:\/usr\/bin\/)?xattr['"]$/.test(firstArgument.trim()))
|
|
219
219
|
risks.push({ kind: 'xattr', token: 'xattr' });
|
|
220
|
-
if (/^['"]chflags['"]$/.test(firstArgument.trim()))
|
|
220
|
+
if (/^['"](?:\/usr\/bin\/)?chflags['"]$/.test(firstArgument.trim()))
|
|
221
221
|
risks.push({ kind: 'chflags', token: 'chflags' });
|
|
222
222
|
}
|
|
223
223
|
if (callee && ['spawn', 'spawnSync', 'child_process.spawn', 'child_process.spawnSync'].includes(callee)
|
|
@@ -85,8 +85,7 @@ for (const changedFile of [
|
|
|
85
85
|
'src/core/routes.ts',
|
|
86
86
|
'src/core/subagents/naruto-help-contract.ts',
|
|
87
87
|
'src/core/commands/naruto-command.ts',
|
|
88
|
-
'src/bin/fast-inline.ts'
|
|
89
|
-
'test/blackbox/official-subagent-workflow-packed.test.mjs'
|
|
88
|
+
'src/bin/fast-inline.ts'
|
|
90
89
|
]) {
|
|
91
90
|
const selectedForPolicy = selectorMod.selectAffectedReleaseGates(root, manifest, gates, {
|
|
92
91
|
changedFiles: [changedFile],
|
|
@@ -230,7 +230,9 @@ async function richContentGate(id) {
|
|
|
230
230
|
const codexHome = path.join(rootDir, 'codex-home');
|
|
231
231
|
const report = await mod.syncCodexAgentRoles({ root: rootDir, codexHome, apply: true });
|
|
232
232
|
const role = fs.readFileSync(path.join(rootDir, '.codex', 'agents', 'expert.toml'), 'utf8');
|
|
233
|
-
|
|
233
|
+
const tiers = await importDist('core/subagents/model-tiers.js');
|
|
234
|
+
const deep = tiers.latestModelForTier('deep');
|
|
235
|
+
assertGate(role.includes(`model = "${deep}"`) && role.includes('Do not spawn another subagent.'), 'official expert role must use the latest deep-tier model and no-nesting instructions', { role, report });
|
|
234
236
|
assertGate(!fs.existsSync(path.join(codexHome, 'agents')), 'rich-content sync must not create global directive roles', report);
|
|
235
237
|
emitGate(id, { roles: report.created.length });
|
|
236
238
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sneakoscope",
|
|
3
3
|
"displayName": "ㅅㅋㅅ",
|
|
4
|
-
"version": "10.3.
|
|
4
|
+
"version": "10.3.4",
|
|
5
5
|
"description": "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.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"homepage": "https://github.com/mandarange/Sneakoscope-Codex#readme",
|
package/release-gates.v2.json
CHANGED
|
@@ -2203,8 +2203,7 @@
|
|
|
2203
2203
|
"src/core/proof/**",
|
|
2204
2204
|
"src/core/trust-kernel/**",
|
|
2205
2205
|
"src/scripts/proof-root-cause-policy-check.ts",
|
|
2206
|
-
"test/unit/route-completion-contract.test.mjs"
|
|
2207
|
-
"test/integration/route-proof-adapters.test.mjs"
|
|
2206
|
+
"test/unit/route-completion-contract.test.mjs"
|
|
2208
2207
|
]
|
|
2209
2208
|
},
|
|
2210
2209
|
"isolation": {
|
|
@@ -3240,7 +3239,6 @@
|
|
|
3240
3239
|
"src/cli/__tests__/router-active-naruto.test.ts",
|
|
3241
3240
|
"src/bin/fast-inline.ts",
|
|
3242
3241
|
"src/bin/sks-dispatch.ts",
|
|
3243
|
-
"test/blackbox/official-subagent-workflow-packed.test.mjs",
|
|
3244
3242
|
"src/core/release/release-gate-affected-selector.ts",
|
|
3245
3243
|
"src/core/release/__tests__/release-gate-affected-selector.test.ts"
|
|
3246
3244
|
]
|
|
@@ -4556,9 +4554,7 @@
|
|
|
4556
4554
|
"src/scripts/all-feature-deep-completion-check.ts",
|
|
4557
4555
|
"docs/feature-inventory.md",
|
|
4558
4556
|
"test/unit/feature-registry.test.mjs",
|
|
4559
|
-
"test/unit/all-feature-deep-completion.test.mjs"
|
|
4560
|
-
"test/integration/all-feature-deep-completion.test.mjs",
|
|
4561
|
-
"test/blackbox/all-feature-deep-completion-packed.test.mjs"
|
|
4557
|
+
"test/unit/all-feature-deep-completion.test.mjs"
|
|
4562
4558
|
]
|
|
4563
4559
|
},
|
|
4564
4560
|
"isolation": {
|