sneakoscope 8.2.0 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +46 -110
  2. package/crates/sks-core/Cargo.lock +1 -1
  3. package/crates/sks-core/Cargo.toml +1 -1
  4. package/dist/cli/command-manifest-lite.js +0 -2
  5. package/dist/cli/command-registry.js +0 -2
  6. package/dist/commands/codex.js +3 -3
  7. package/dist/commands/doctor.js +5 -157
  8. package/dist/config/skills-manifest.json +1 -1
  9. package/dist/core/codex/codex-cli-syntax-builder.js +0 -8
  10. package/dist/core/codex-app/codex-models-cache.js +2 -1
  11. package/dist/core/codex-app/menubar/constants.js +0 -7
  12. package/dist/core/codex-compat/codex-capability-matrix.js +7 -7
  13. package/dist/core/codex-compat/codex-compat-report.js +8 -12
  14. package/dist/core/codex-compat/codex-runtime-contract.js +62 -0
  15. package/dist/core/codex-compat/codex-version-policy.js +7 -7
  16. package/dist/core/codex-control/codex-current-app-capability.js +3 -3
  17. package/dist/core/codex-control/codex-current-capability.js +67 -94
  18. package/dist/core/codex-control/codex-current-core-capability.js +3 -3
  19. package/dist/core/codex-control/codex-current-core-probe-runner.js +4 -4
  20. package/dist/core/codex-control/codex-current-core-real-probes.js +2 -2
  21. package/dist/core/codex-control/codex-current-feature-capability.js +4 -4
  22. package/dist/core/codex-control/codex-current-image-path-real-probe.js +1 -1
  23. package/dist/core/codex-control/codex-current-web-search-probe.js +1 -1
  24. package/dist/core/codex-control/codex-sdk-capability.js +2 -2
  25. package/dist/core/commands/remote-command.js +2 -2
  26. package/dist/core/context7-client.js +5 -2
  27. package/dist/core/doctor/codex-current-core-probe-doctor.js +2 -2
  28. package/dist/core/doctor/doctor-dirty-planner.js +1 -1
  29. package/dist/core/doctor/doctor-readiness-matrix.js +0 -7
  30. package/dist/core/feature-fixtures.js +0 -4
  31. package/dist/core/feature-registry.js +0 -1
  32. package/dist/core/image-ux-review.js +3 -3
  33. package/dist/core/install/installed-package-smoke.js +2 -3
  34. package/dist/core/mad-sks/sql-plane/mcp-executor.js +4 -3
  35. package/dist/core/mcp/modern-protocol.js +36 -0
  36. package/dist/core/mcp-config/health-check.js +45 -30
  37. package/dist/core/perf/release-latency-slo.js +1 -2
  38. package/dist/core/proof/runtime-truth-matrix.js +1 -1
  39. package/dist/core/release/canonical-test-proof.js +1 -2
  40. package/dist/core/release/gate-manifest.js +5 -2
  41. package/dist/core/release/physical-release-gates.js +0 -26
  42. package/dist/core/release/release-gate-affected-selector.js +2 -1
  43. package/dist/core/release/release-gate-contract.js +3 -1
  44. package/dist/core/release/release-pack-receipt.js +0 -1
  45. package/dist/core/release/stage-publish.js +1 -1
  46. package/dist/core/version-manager.js +4 -0
  47. package/dist/core/version.js +1 -1
  48. package/dist/native/sks-menubar/Sources/AppDelegate.swift +1 -12
  49. package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +2 -6
  50. package/dist/native/sks-menubar/Sources/RemoteCodingViewController.swift +28 -471
  51. package/dist/native/sks-menubar/Sources/SecureProcessEnvelope.swift +1 -43
  52. package/dist/scripts/codex-current-app-server-v2-check.js +9 -8
  53. package/dist/scripts/codex-current-binary-identity-check.js +2 -2
  54. package/dist/scripts/codex-current-capability-check.js +9 -7
  55. package/dist/scripts/codex-current-dependency-check.js +21 -0
  56. package/dist/scripts/docs-truthfulness-check.js +4 -19
  57. package/dist/scripts/fast-codex-service-tier-proof-check.js +0 -1
  58. package/dist/scripts/install-surface-ssot-check.js +2 -2
  59. package/dist/scripts/latest-version-guidance-check.js +1 -1
  60. package/dist/scripts/packlist-performance-check.js +0 -1
  61. package/dist/scripts/release-metadata-check.js +4 -1
  62. package/dist/scripts/release-version-truth-check.js +149 -0
  63. package/dist/vendor/openai-codex/latest/hooks/permission-request.command.input.schema.json +6 -0
  64. package/dist/vendor/openai-codex/latest/hooks/permission-request.command.output.schema.json +2 -16
  65. package/dist/vendor/openai-codex/latest/hooks/post-compact.command.input.schema.json +6 -0
  66. package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.input.schema.json +6 -0
  67. package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.output.schema.json +2 -16
  68. package/dist/vendor/openai-codex/latest/hooks/pre-compact.command.input.schema.json +6 -0
  69. package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.input.schema.json +6 -0
  70. package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.output.schema.json +2 -16
  71. package/dist/vendor/openai-codex/latest/hooks/session-start.command.output.schema.json +2 -16
  72. package/dist/vendor/openai-codex/latest/hooks/snapshot-metadata.json +7 -5
  73. package/dist/vendor/openai-codex/latest/hooks/subagent-start.command.output.schema.json +4 -18
  74. package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.input.schema.json +6 -0
  75. package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.output.schema.json +2 -16
  76. package/package.json +4 -7
  77. package/release-gates.v2.json +49 -19
  78. package/config/codex-releases/rust-v0.146.0.json +0 -45
  79. package/dist/core/agents/agent-runner-codex-exec.js +0 -177
  80. package/dist/core/codex-compat/codex-release-manifest.js +0 -72
  81. package/dist/core/commands/telegram-command.js +0 -447
  82. package/dist/core/telegram/access.js +0 -58
  83. package/dist/core/telegram/client.js +0 -157
  84. package/dist/core/telegram/confirmation.js +0 -37
  85. package/dist/core/telegram/doctor.js +0 -154
  86. package/dist/core/telegram/index.js +0 -9
  87. package/dist/core/telegram/keychain.js +0 -317
  88. package/dist/core/telegram/liveness.js +0 -124
  89. package/dist/core/telegram/poller.js +0 -90
  90. package/dist/core/telegram/redaction.js +0 -15
  91. package/dist/core/telegram/state-lock.js +0 -416
  92. package/dist/core/telegram/types.js +0 -1
  93. package/dist/native/sks-menubar/Sources/TelegramPrivateFileStore.swift +0 -498
  94. package/dist/native/sks-menubar/Sources/TelegramPrivateFileSupport.swift +0 -236
  95. package/dist/native/sks-menubar/Sources/TelegramProcessGateway.swift +0 -454
  96. package/dist/native/sks-menubar/Sources/TelegramRuntimeSupport.swift +0 -56
  97. package/dist/native/sks-menubar/Sources/TelegramStateLock.swift +0 -448
  98. package/dist/native/sks-menubar/Sources/TelegramSupport.swift +0 -243
  99. package/dist/native/sks-menubar/Sources/TelegramTransport.swift +0 -499
  100. package/dist/scripts/codex-current-manifest-check.js +0 -29
  101. package/schemas/codex/app-server-0.146/codex_app_server_protocol.v2.schemas.json +0 -19858
@@ -4,14 +4,16 @@ import { CODEX_CURRENT_FEATURE_KEYS, detectCodexCurrentCapability, writeCodexCur
4
4
  const requireReal = process.argv.includes('--require-real') || process.env.SKS_REQUIRE_CODEX_CURRENT === '1';
5
5
  if (!requireReal)
6
6
  process.env.SKS_CODEX_CURRENT_FAKE = '1';
7
- const cap = await detectCodexCurrentCapability({ requireReal });
8
- assertGate(cap.ok === true, 'Current Codex 0.146.0 capability probe must pass', cap);
9
- assertGate(Object.keys(cap.feature_states).length === CODEX_CURRENT_FEATURE_KEYS.length, 'Current Codex 0.146.0 feature count mismatch', cap);
10
- assertGate(Object.values(cap.feature_states).every((state) => String(state.certainty) !== 'assumed_by_version'), 'Current Codex 0.146.0 capability must not use assumed_by_version evidence', cap);
7
+ const artifact = requireReal
8
+ ? await writeCodexCurrentCapabilityArtifacts(process.cwd(), { requireReal: true })
9
+ : null;
10
+ const cap = artifact?.report || await detectCodexCurrentCapability({ requireReal });
11
+ assertGate(cap.ok === true, 'Current package-derived Codex capability probe must pass', cap);
12
+ assertGate(Object.keys(cap.feature_states).length === CODEX_CURRENT_FEATURE_KEYS.length, 'Current Codex feature count mismatch', cap);
13
+ assertGate(Object.values(cap.feature_states).every((state) => String(state.certainty) !== 'assumed_by_version'), 'Current Codex capability must not use assumed_by_version evidence', cap);
11
14
  if (requireReal) {
12
- assertGate(cap.probe_mode === 'real-schema', 'Current Codex 0.146.0 require-real must use generated schema evidence', cap);
13
- assertGate(cap.release_authorizing === true, 'Current Codex 0.146.0 require-real must be release-authorizing', cap);
14
- await writeCodexCurrentCapabilityArtifacts(process.cwd(), { requireReal: true });
15
+ assertGate(cap.probe_mode === 'real-schema', 'Current Codex require-real must use generated schema evidence', cap);
16
+ assertGate(cap.release_authorizing === true, 'Current Codex require-real must be release-authorizing', cap);
15
17
  }
16
18
  emitGate('codex:current:capability', {
17
19
  features: CODEX_CURRENT_FEATURE_KEYS.length,
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import { assertGate, emitGate, readJson } from './gate-lib.js';
3
+ import { CURRENT_CODEX_RUNTIME_CONTRACT, codexSdkDependencyVersion } from '../core/codex-compat/codex-runtime-contract.js';
4
+ const pkg = readJson('package.json');
5
+ const lock = readJson('package-lock.json');
6
+ const expected = codexSdkDependencyVersion();
7
+ const lockSdk = lock.packages?.['node_modules/@openai/codex-sdk']?.version;
8
+ const lockCli = lock.packages?.['node_modules/@openai/codex']?.version;
9
+ const lockRootVersion = lock.packages?.['']?.version || lock.version;
10
+ const packageFiles = Array.isArray(pkg.files) ? pkg.files.map(String) : [];
11
+ assertGate(pkg.dependencies?.['@openai/codex-sdk'] === expected, 'package.json must pin @openai/codex-sdk to one exact semver', { expected });
12
+ assertGate(lockSdk === expected, 'package-lock must resolve @openai/codex-sdk to the package.json pin', { expected, lockSdk });
13
+ assertGate(lockCli === expected, 'package-lock must resolve @openai/codex to the SDK dependency version', { expected, lockCli });
14
+ assertGate(pkg.version === lockRootVersion, 'package version must match package-lock root version', { version: pkg.version, lockRootVersion });
15
+ assertGate(!packageFiles.some((entry) => entry.startsWith('config/codex-releases/')), 'package must not ship a second version-specific Codex release manifest', { packageFiles });
16
+ assertGate(!packageFiles.some((entry) => entry.startsWith('schemas/codex/app-server-')), 'package must generate the current App Server schema from the resolved runtime instead of shipping a versioned snapshot', { packageFiles });
17
+ emitGate('codex:current:dependency-graph', {
18
+ dependency_source: CURRENT_CODEX_RUNTIME_CONTRACT.dependencySource,
19
+ sdk_version: expected,
20
+ target_tag: CURRENT_CODEX_RUNTIME_CONTRACT.targetTag
21
+ });
@@ -19,13 +19,13 @@ const files = [
19
19
  'docs/release-readiness.md'
20
20
  ];
21
21
  const required = {
22
- 'README.md': ['CHANGELOG.md', 'docs/release-readiness.md', 'gpt-image-2', 'Telegram Bot API', '`sks telegram pair`'],
22
+ 'README.md': ['CHANGELOG.md', 'docs/release-readiness.md', 'gpt-image-2', 'https://paseo.sh/', 'paseo run --provider codex'],
23
23
  'CHANGELOG.md': ['1.14.0', 'DFix Extreme Speed Kernel', 'hook trust doctor', 'warning-zero'],
24
24
  'docs/computer-use-evidence.md': ['sks.computer-use-live-evidence.v1', 'probe_only', 'live_capture_blocked', 'local-only', 'Codex Chrome Extension'],
25
25
  'docs/codex-lb.md': ['durable_env_file', 'durable_keychain', 'shell_profile', 'process_only_ephemeral', 'base URL only'],
26
- 'docs/codex-cli-compat.md': ['rust-v0.146.0', 'minimumSupportedVersion', '0.146.0', 'SubagentStart', 'sks_zero_warning_disallowed', 'strict subset'],
27
- 'docs/codex-app.md': ['rust-v0.146.0', 'App Server v2', 'Codex Chrome Extension', 'gpt-image-2'],
28
- 'docs/official-docs-compat.md': ['official-docs-compat-report.js', 'rust-v0.146.0', 'gpt-image-2', 'input_fidelity', 'additionalProperties:false'],
26
+ 'docs/codex-cli-compat.md': ['package.json', 'runtime-generated', 'SubagentStart', 'sks_zero_warning_disallowed', 'strict subset'],
27
+ 'docs/codex-app.md': ['package.json', 'App Server v2', 'Codex Chrome Extension', 'gpt-image-2'],
28
+ 'docs/official-docs-compat.md': ['official-docs-compat-report.js', 'runtime-generated', 'gpt-image-2', 'input_fidelity', 'additionalProperties:false'],
29
29
  'docs/hooks-pat.md': ['SubagentStop', 'strict subset', 'zero-warning'],
30
30
  'docs/goal-to-loop-migration.md': ['only persisted goal owner', 'creates no SKS mission', '--legacy-goal-runtime', 'fail with an instruction'],
31
31
  'docs/known-gaps.md': ['No P0', 'P1'],
@@ -91,21 +91,6 @@ for (const file of files) {
91
91
  forbidden: forbiddenMatches
92
92
  });
93
93
  }
94
- const readmeText = fs.readFileSync(path.join(root, 'README.md'), 'utf8');
95
- const telegramOnboardingSteps = [
96
- 'sks telegram setup --token-stdin',
97
- 'sks menubar restart',
98
- 'sks telegram pair --json',
99
- '/sks status {}'
100
- ];
101
- const telegramOnboardingIndexes = telegramOnboardingSteps.map((step) => readmeText.indexOf(step));
102
- const telegramOnboardingOrdered = telegramOnboardingIndexes.every((index, position) => index >= 0 && (position === 0 || index > telegramOnboardingIndexes[position - 1]));
103
- results.push({
104
- file: 'README.md#telegram-onboarding-order',
105
- ok: telegramOnboardingOrdered,
106
- missing: telegramOnboardingOrdered ? [] : telegramOnboardingSteps,
107
- forbidden: []
108
- });
109
94
  for (const file of currentDollarSurfaceFiles) {
110
95
  const full = path.join(root, file);
111
96
  const text = fs.existsSync(full) ? fs.readFileSync(full, 'utf8') : '';
@@ -28,7 +28,6 @@ fs.writeFileSync(path.join(reportDir, 'worker-process-report.json'), `${JSON.str
28
28
  const proof = await fastMode.writeFastModePropagationProof(temp, { policy: fastMode.resolveFastModePolicy({ fastMode: true }) });
29
29
  const ok = args.includes('-c')
30
30
  && args.includes('service_tier=fast')
31
- && !args.includes('--full-auto')
32
31
  && !args.includes('--dangerously-bypass-approvals-and-sandbox')
33
32
  && proof.ok === true;
34
33
  console.log(JSON.stringify({ schema: 'sks.fast-codex-service-tier-proof-check.v1', ok, args, proof }, null, 2));
@@ -24,7 +24,7 @@ if (pluginVersion && packageVersion && pluginVersion !== packageVersion) {
24
24
  blockers.push(`marketplace_plugin_version_mismatch:${pluginVersion}!=${packageVersion}`);
25
25
  }
26
26
  else if (!pluginVersion) {
27
- notes.push('marketplace_plugin_version_absent');
27
+ blockers.push('marketplace_plugin_version_absent');
28
28
  }
29
29
  else {
30
30
  notes.push(`marketplace_plugin_version_matches:${pluginVersion}`);
@@ -78,7 +78,7 @@ else {
78
78
  const report = {
79
79
  schema: 'sks.install-surface-ssot-check.v1',
80
80
  ok: blockers.length === 0,
81
- install_ssot: 'npm:sneakoscope@latest',
81
+ install_ssot: 'package.json#version',
82
82
  package_version: packageVersion || null,
83
83
  plugin_version: pluginVersion || null,
84
84
  path_sks_version: pathVersion || null,
@@ -5,7 +5,7 @@ import { assertGate, emitGate, importDist, root } from './gate-lib.js';
5
5
  const { scanLatestVersionGuidance, latestVersionGuidanceReport } = await importDist('core/policy/latest-version-guidance.js');
6
6
  const DOC_EXEMPT_RE = /(?:^|\/)(?:CHANGELOG|RECALLPULSE_[^/]*|known-gaps|release-proof-truth)\.md$|compat|codex-0|migration|legacy-upgrade|sks-4-migration|-tasks\.md$/i;
7
7
  const SOURCE_EXEMPT = new Set([
8
- 'src/core/codex-compat/codex-release-manifest.ts',
8
+ 'src/core/codex-compat/codex-runtime-contract.ts',
9
9
  'src/core/release/npm-stage-tarball-verifier-support.ts'
10
10
  ]);
11
11
  const SOURCE_EXEMPT_DIR_RE = /^src\/(?:scripts|vendor|generated)\//;
@@ -62,7 +62,6 @@ const packProof = writeNpmPackProof(root, info, packMs);
62
62
  const runtimeManifest = JSON.parse(fs.readFileSync(path.join(root, 'runtime-required-scripts.json'), 'utf8'));
63
63
  const runtimeScriptClosure = analyzeRuntimeScriptPackClosure(root);
64
64
  const customerPayloadForbidden = [
65
- 'dist/core/telegram/controller.js',
66
65
  'dist/core/agents/agent-cleanup-executor.js',
67
66
  'dist/core/release/npm-stage-tarball-verifier.js',
68
67
  'dist/core/release/npm-stage-tarball-verifier-support.js'
@@ -43,6 +43,7 @@ const requiredPackageScripts = [
43
43
  'typecheck',
44
44
  'release:check',
45
45
  'release:metadata',
46
+ 'release:version-truth',
46
47
  'release:check:affected',
47
48
  'release:check:fast',
48
49
  'release:check:confidence',
@@ -61,7 +62,7 @@ const requiredPackageScripts = [
61
62
  ];
62
63
  const requiredReleaseGates = [
63
64
  'architecture:guard',
64
- 'codex:current:manifest',
65
+ 'codex:current:dependency-graph',
65
66
  'codex:current:binary-identity',
66
67
  'codex:current:policy',
67
68
  'codex:current:app-server-v2',
@@ -70,6 +71,7 @@ const requiredReleaseGates = [
70
71
  'commands:current-surface-only',
71
72
  'config:managed-merge',
72
73
  'docs:truthfulness',
74
+ 'install-surface:ssot',
73
75
  'latest-version:guidance',
74
76
  'migration:current-surface-e2e',
75
77
  'migration:upgrade-safety',
@@ -83,6 +85,7 @@ const requiredReleaseGates = [
83
85
  'release:latency-slo',
84
86
  'release:proof-truth',
85
87
  'release:provenance',
88
+ 'release:version-truth',
86
89
  'policy:gate-audit',
87
90
  'safety:mutation-callsite-coverage',
88
91
  'schema:check',
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+ import { assertGate, emitGate, root } from './gate-lib.js';
6
+ const pkg = readJson('package.json');
7
+ const expected = String(pkg.version || '');
8
+ const mismatches = [];
9
+ const warnings = [];
10
+ let checked = 0;
11
+ checkJson('package.json', 'version', pkg.version);
12
+ const lock = readJson('package-lock.json');
13
+ checkJson('package-lock.json', 'version', lock.version);
14
+ checkJson('package-lock.json', 'packages[""].version', lock.packages?.['']?.version);
15
+ const plugin = readJson('plugins/sks/.codex-plugin/plugin.json');
16
+ checkJson('plugins/sks/.codex-plugin/plugin.json', 'version', plugin.version);
17
+ checkRegex('src/core/version.ts', /PACKAGE_VERSION\s*=\s*['"]([^'"]+)['"]/, 'PACKAGE_VERSION');
18
+ checkReExportOrRegex('src/core/fsx.ts', /PACKAGE_VERSION\s*}\s*from\s*['"]\.\/version(?:\.js)?['"]/, /PACKAGE_VERSION\s*=\s*['"]([^'"]+)['"]/, 'PACKAGE_VERSION');
19
+ checkReExportOrRegex('src/bin/sks.ts', /PACKAGE_VERSION\s*}\s*from\s*['"]\.\.\/core\/version(?:\.js)?['"]/, /FAST_PACKAGE_VERSION\s*=\s*['"]([^'"]+)['"]/, 'FAST_PACKAGE_VERSION');
20
+ checkRegex('crates/sks-core/Cargo.toml', /^version\s*=\s*"([^"]+)"/m, 'package.version');
21
+ checkCargoLock('crates/sks-core/Cargo.lock', 'sks-core');
22
+ const dist = readJson('dist/build-manifest.json', null);
23
+ checkJson('dist/build-manifest.json', 'package_version', dist?.package_version);
24
+ checkJson('dist/build-manifest.json', 'version', dist?.version);
25
+ checkChangelog();
26
+ checkReadme();
27
+ checkReleaseMetadataScript();
28
+ checkCargoMetadata();
29
+ const ok = mismatches.length === 0;
30
+ const report = {
31
+ schema: 'sks.release-version-truth.v1',
32
+ ok,
33
+ expected,
34
+ checked,
35
+ mismatches,
36
+ warnings,
37
+ generated_at: new Date().toISOString()
38
+ };
39
+ const out = path.join(root, '.sneakoscope', 'reports', 'release-version-truth.json');
40
+ fs.mkdirSync(path.dirname(out), { recursive: true });
41
+ fs.writeFileSync(out, `${JSON.stringify(report, null, 2)}\n`);
42
+ assertGate(ok, 'release version truth mismatch', { expected, mismatches });
43
+ emitGate('release:version-truth', { version: expected, checked, warnings: warnings.length });
44
+ function checkJson(file, field, actual) {
45
+ checked += 1;
46
+ if (actual !== expected)
47
+ mismatch(file, field, actual);
48
+ }
49
+ function checkRegex(file, re, field) {
50
+ checked += 1;
51
+ const text = readText(file);
52
+ const match = text.match(re);
53
+ if (!match)
54
+ mismatch(file, field, null);
55
+ else if (match[1] !== expected)
56
+ mismatch(file, field, match[1]);
57
+ }
58
+ function checkReExportOrRegex(file, reExportRe, literalRe, field) {
59
+ const text = readText(file);
60
+ if (reExportRe.test(text)) {
61
+ checked += 1;
62
+ return;
63
+ }
64
+ checkRegex(file, literalRe, field);
65
+ }
66
+ function checkCargoLock(file, name) {
67
+ checked += 1;
68
+ const text = readText(file);
69
+ const block = text.split(/\n\[\[package\]\]\n/).find((part) => new RegExp(`name\\s*=\\s*"${escapeRe(name)}"`).test(part));
70
+ const match = block?.match(/version\s*=\s*"([^"]+)"/);
71
+ if (!match)
72
+ mismatch(file, `${name}.version`, null);
73
+ else if (match[1] !== expected)
74
+ mismatch(file, `${name}.version`, match[1]);
75
+ }
76
+ function checkChangelog() {
77
+ checked += 1;
78
+ const text = readText('CHANGELOG.md');
79
+ const latest = latestVersionedChangelogSection(text);
80
+ if (latest !== expected)
81
+ mismatch('CHANGELOG.md', 'latest release section', latest);
82
+ }
83
+ function checkReadme() {
84
+ checked += 1;
85
+ const text = readText('README.md');
86
+ const displayed = text.match(/\*\*SKS ([0-9]+\.[0-9]+\.[0-9]+)\*\*/)?.[1] || null;
87
+ if (!displayed)
88
+ mismatch('README.md', 'displayed current version', null);
89
+ else if (displayed !== expected)
90
+ mismatch('README.md', 'displayed current version', displayed);
91
+ }
92
+ function checkReleaseMetadataScript() {
93
+ checked += 1;
94
+ const script = String(pkg.scripts?.['release:metadata'] || '');
95
+ if (!script.includes('dist/scripts/release-metadata-check.js')) {
96
+ mismatch('package.json', 'scripts.release:metadata', script || null, 'node ./dist/scripts/release-metadata-check.js');
97
+ }
98
+ }
99
+ function checkCargoMetadata() {
100
+ checked += 1;
101
+ const res = spawnSync('cargo', ['metadata', '--no-deps', '--manifest-path', path.join(root, 'crates/sks-core/Cargo.toml'), '--format-version', '1'], {
102
+ cwd: root,
103
+ encoding: 'utf8',
104
+ timeout: 30000
105
+ });
106
+ if (res.status !== 0) {
107
+ warnings.push({ file: 'crates/sks-core/Cargo.toml', message: 'cargo metadata unavailable', stderr_tail: tail(res.stderr) });
108
+ return;
109
+ }
110
+ try {
111
+ const metadata = JSON.parse(res.stdout);
112
+ const crate = metadata.packages?.find((row) => row.name === 'sks-core');
113
+ if (crate?.version !== expected)
114
+ mismatch('cargo metadata', 'sks-core.version', crate?.version || null);
115
+ }
116
+ catch (err) {
117
+ warnings.push({ file: 'cargo metadata', message: `unparseable:${err instanceof Error ? err.message : String(err)}` });
118
+ }
119
+ }
120
+ function mismatch(file, field, actual, wanted = expected) {
121
+ mismatches.push({ file, field, expected: wanted, actual: actual ?? null });
122
+ }
123
+ function readJson(rel, fallback) {
124
+ try {
125
+ return JSON.parse(readText(rel));
126
+ }
127
+ catch (err) {
128
+ if (arguments.length > 1)
129
+ return fallback;
130
+ throw err;
131
+ }
132
+ }
133
+ function readText(rel) {
134
+ return fs.readFileSync(path.join(root, rel), 'utf8');
135
+ }
136
+ function escapeRe(value) {
137
+ return String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
138
+ }
139
+ function latestVersionedChangelogSection(text) {
140
+ for (const match of text.matchAll(/^## \[([^\]]+)\]/gm)) {
141
+ if (/^[0-9]+\.[0-9]+\.[0-9]+$/.test(match[1]))
142
+ return match[1];
143
+ }
144
+ return null;
145
+ }
146
+ function tail(value, limit = 1000) {
147
+ const text = String(value || '');
148
+ return text.length > limit ? text.slice(-limit) : text;
149
+ }
@@ -10,6 +10,12 @@
10
10
  }
11
11
  },
12
12
  "properties": {
13
+ "agent_id": {
14
+ "type": "string"
15
+ },
16
+ "agent_type": {
17
+ "type": "string"
18
+ },
13
19
  "cwd": {
14
20
  "type": "string"
15
21
  },
@@ -2,21 +2,6 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "additionalProperties": false,
4
4
  "definitions": {
5
- "HookEventNameWire": {
6
- "enum": [
7
- "PreToolUse",
8
- "PermissionRequest",
9
- "PostToolUse",
10
- "PreCompact",
11
- "PostCompact",
12
- "SessionStart",
13
- "UserPromptSubmit",
14
- "SubagentStart",
15
- "SubagentStop",
16
- "Stop"
17
- ],
18
- "type": "string"
19
- },
20
5
  "PermissionRequestBehaviorWire": {
21
6
  "enum": [
22
7
  "allow",
@@ -65,7 +50,8 @@
65
50
  "default": null
66
51
  },
67
52
  "hookEventName": {
68
- "$ref": "#/definitions/HookEventNameWire"
53
+ "const": "PermissionRequest",
54
+ "type": "string"
69
55
  }
70
56
  },
71
57
  "required": [
@@ -10,6 +10,12 @@
10
10
  }
11
11
  },
12
12
  "properties": {
13
+ "agent_id": {
14
+ "type": "string"
15
+ },
16
+ "agent_type": {
17
+ "type": "string"
18
+ },
13
19
  "cwd": {
14
20
  "type": "string"
15
21
  },
@@ -10,6 +10,12 @@
10
10
  }
11
11
  },
12
12
  "properties": {
13
+ "agent_id": {
14
+ "type": "string"
15
+ },
16
+ "agent_type": {
17
+ "type": "string"
18
+ },
13
19
  "cwd": {
14
20
  "type": "string"
15
21
  },
@@ -8,21 +8,6 @@
8
8
  ],
9
9
  "type": "string"
10
10
  },
11
- "HookEventNameWire": {
12
- "enum": [
13
- "PreToolUse",
14
- "PermissionRequest",
15
- "PostToolUse",
16
- "PreCompact",
17
- "PostCompact",
18
- "SessionStart",
19
- "UserPromptSubmit",
20
- "SubagentStart",
21
- "SubagentStop",
22
- "Stop"
23
- ],
24
- "type": "string"
25
- },
26
11
  "PostToolUseHookSpecificOutputWire": {
27
12
  "additionalProperties": false,
28
13
  "properties": {
@@ -31,7 +16,8 @@
31
16
  "type": "string"
32
17
  },
33
18
  "hookEventName": {
34
- "$ref": "#/definitions/HookEventNameWire"
19
+ "const": "PostToolUse",
20
+ "type": "string"
35
21
  },
36
22
  "updatedMCPToolOutput": {
37
23
  "default": null
@@ -10,6 +10,12 @@
10
10
  }
11
11
  },
12
12
  "properties": {
13
+ "agent_id": {
14
+ "type": "string"
15
+ },
16
+ "agent_type": {
17
+ "type": "string"
18
+ },
13
19
  "cwd": {
14
20
  "type": "string"
15
21
  },
@@ -10,6 +10,12 @@
10
10
  }
11
11
  },
12
12
  "properties": {
13
+ "agent_id": {
14
+ "type": "string"
15
+ },
16
+ "agent_type": {
17
+ "type": "string"
18
+ },
13
19
  "cwd": {
14
20
  "type": "string"
15
21
  },
@@ -2,21 +2,6 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "additionalProperties": false,
4
4
  "definitions": {
5
- "HookEventNameWire": {
6
- "enum": [
7
- "PreToolUse",
8
- "PermissionRequest",
9
- "PostToolUse",
10
- "PreCompact",
11
- "PostCompact",
12
- "SessionStart",
13
- "UserPromptSubmit",
14
- "SubagentStart",
15
- "SubagentStop",
16
- "Stop"
17
- ],
18
- "type": "string"
19
- },
20
5
  "PreToolUseDecisionWire": {
21
6
  "enum": [
22
7
  "approve",
@@ -32,7 +17,8 @@
32
17
  "type": "string"
33
18
  },
34
19
  "hookEventName": {
35
- "$ref": "#/definitions/HookEventNameWire"
20
+ "const": "PreToolUse",
21
+ "type": "string"
36
22
  },
37
23
  "permissionDecision": {
38
24
  "allOf": [
@@ -2,21 +2,6 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "additionalProperties": false,
4
4
  "definitions": {
5
- "HookEventNameWire": {
6
- "enum": [
7
- "PreToolUse",
8
- "PermissionRequest",
9
- "PostToolUse",
10
- "PreCompact",
11
- "PostCompact",
12
- "SessionStart",
13
- "UserPromptSubmit",
14
- "SubagentStart",
15
- "SubagentStop",
16
- "Stop"
17
- ],
18
- "type": "string"
19
- },
20
5
  "SessionStartHookSpecificOutputWire": {
21
6
  "additionalProperties": false,
22
7
  "properties": {
@@ -25,7 +10,8 @@
25
10
  "type": "string"
26
11
  },
27
12
  "hookEventName": {
28
- "$ref": "#/definitions/HookEventNameWire"
13
+ "const": "SessionStart",
14
+ "type": "string"
29
15
  }
30
16
  },
31
17
  "required": [
@@ -3,9 +3,10 @@
3
3
  "upstream": "openai/codex",
4
4
  "upstream_url": "https://github.com/openai/codex",
5
5
  "tag": "latest",
6
- "commit": "791b69dd53703e928cbbda4ca41cfc795b7397b0",
7
- "codex_version": "main-2026-05-21",
8
- "captured_at": "2026-05-21T11:46:38Z",
6
+ "source_tag": "rust-v0.147.0",
7
+ "commit": "be6e8eac029b183056b7e4402879f15d2c85f61b",
8
+ "codex_version": "0.147.0",
9
+ "captured_at": "2026-08-07T05:18:28Z",
9
10
  "schema_files_count": 20,
10
11
  "events": [
11
12
  "PreToolUse",
@@ -21,7 +22,8 @@
21
22
  ],
22
23
  "source_path": "codex-rs/hooks/schema/generated",
23
24
  "notes": [
24
- "Captured from upstream OpenAI Codex HEAD using vendored generated hook schema fixtures.",
25
- "SubagentStart and SubagentStop are release-blocking events for SKS 1.14.1 hook compatibility."
25
+ "Captured from the current package-tracked upstream OpenAI Codex release using generated hook schema fixtures.",
26
+ "The latest directory is version-neutral; source_tag and commit preserve capture provenance.",
27
+ "SubagentStart and SubagentStop are release-blocking events for SKS hook compatibility."
26
28
  ]
27
29
  }
@@ -2,22 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "additionalProperties": false,
4
4
  "definitions": {
5
- "HookEventNameWire": {
6
- "enum": [
7
- "PreToolUse",
8
- "PermissionRequest",
9
- "PostToolUse",
10
- "PreCompact",
11
- "PostCompact",
12
- "SessionStart",
13
- "UserPromptSubmit",
14
- "SubagentStart",
15
- "SubagentStop",
16
- "Stop"
17
- ],
18
- "type": "string"
19
- },
20
- "SessionStartHookSpecificOutputWire": {
5
+ "SubagentStartHookSpecificOutputWire": {
21
6
  "additionalProperties": false,
22
7
  "properties": {
23
8
  "additionalContext": {
@@ -25,7 +10,8 @@
25
10
  "type": "string"
26
11
  },
27
12
  "hookEventName": {
28
- "$ref": "#/definitions/HookEventNameWire"
13
+ "const": "SubagentStart",
14
+ "type": "string"
29
15
  }
30
16
  },
31
17
  "required": [
@@ -42,7 +28,7 @@
42
28
  "hookSpecificOutput": {
43
29
  "allOf": [
44
30
  {
45
- "$ref": "#/definitions/SessionStartHookSpecificOutputWire"
31
+ "$ref": "#/definitions/SubagentStartHookSpecificOutputWire"
46
32
  }
47
33
  ],
48
34
  "default": null
@@ -10,6 +10,12 @@
10
10
  }
11
11
  },
12
12
  "properties": {
13
+ "agent_id": {
14
+ "type": "string"
15
+ },
16
+ "agent_type": {
17
+ "type": "string"
18
+ },
13
19
  "cwd": {
14
20
  "type": "string"
15
21
  },
@@ -8,21 +8,6 @@
8
8
  ],
9
9
  "type": "string"
10
10
  },
11
- "HookEventNameWire": {
12
- "enum": [
13
- "PreToolUse",
14
- "PermissionRequest",
15
- "PostToolUse",
16
- "PreCompact",
17
- "PostCompact",
18
- "SessionStart",
19
- "UserPromptSubmit",
20
- "SubagentStart",
21
- "SubagentStop",
22
- "Stop"
23
- ],
24
- "type": "string"
25
- },
26
11
  "UserPromptSubmitHookSpecificOutputWire": {
27
12
  "additionalProperties": false,
28
13
  "properties": {
@@ -31,7 +16,8 @@
31
16
  "type": "string"
32
17
  },
33
18
  "hookEventName": {
34
- "$ref": "#/definitions/HookEventNameWire"
19
+ "const": "UserPromptSubmit",
20
+ "type": "string"
35
21
  }
36
22
  },
37
23
  "required": [