@nexus-cortex/core 4.130.0 → 4.131.2

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 (184) hide show
  1. package/.env.defaults +172 -2
  2. package/dist/adapters/ChatCompletionsAPIAdapter.d.ts.map +1 -1
  3. package/dist/adapters/ChatCompletionsAPIAdapter.js +5 -1
  4. package/dist/adapters/ChatCompletionsAPIAdapter.js.map +1 -1
  5. package/dist/commands/SlashCommandRegistry.d.ts.map +1 -1
  6. package/dist/commands/SlashCommandRegistry.js +7 -0
  7. package/dist/commands/SlashCommandRegistry.js.map +1 -1
  8. package/dist/config/AnthropicCredentialService.d.ts.map +1 -1
  9. package/dist/config/AnthropicCredentialService.js +2 -1
  10. package/dist/config/AnthropicCredentialService.js.map +1 -1
  11. package/dist/config/RuntimeConfigRegistry.d.ts.map +1 -1
  12. package/dist/config/RuntimeConfigRegistry.js +18 -0
  13. package/dist/config/RuntimeConfigRegistry.js.map +1 -1
  14. package/dist/config/SettingsLoader.d.ts +3 -0
  15. package/dist/config/SettingsLoader.d.ts.map +1 -1
  16. package/dist/config/SettingsLoader.js +42 -0
  17. package/dist/config/SettingsLoader.js.map +1 -1
  18. package/dist/config/SettingsSchema.d.ts +19 -0
  19. package/dist/config/SettingsSchema.d.ts.map +1 -1
  20. package/dist/config/SettingsSchema.js +172 -0
  21. package/dist/config/SettingsSchema.js.map +1 -1
  22. package/dist/config/effectiveConfig.d.ts.map +1 -1
  23. package/dist/config/effectiveConfig.js +20 -2
  24. package/dist/config/effectiveConfig.js.map +1 -1
  25. package/dist/config/index.d.ts +4 -0
  26. package/dist/config/index.d.ts.map +1 -1
  27. package/dist/config/index.js +4 -0
  28. package/dist/config/index.js.map +1 -1
  29. package/dist/config/localBrowser.d.ts +13 -0
  30. package/dist/config/localBrowser.d.ts.map +1 -0
  31. package/dist/config/localBrowser.js +53 -0
  32. package/dist/config/localBrowser.js.map +1 -0
  33. package/dist/config/logRedaction.d.ts +5 -0
  34. package/dist/config/logRedaction.d.ts.map +1 -0
  35. package/dist/config/logRedaction.js +68 -0
  36. package/dist/config/logRedaction.js.map +1 -0
  37. package/dist/config/secretProviders.d.ts +16 -0
  38. package/dist/config/secretProviders.d.ts.map +1 -0
  39. package/dist/config/secretProviders.js +26 -0
  40. package/dist/config/secretProviders.js.map +1 -0
  41. package/dist/config/secretsVault.d.ts +121 -0
  42. package/dist/config/secretsVault.d.ts.map +1 -0
  43. package/dist/config/secretsVault.js +320 -0
  44. package/dist/config/secretsVault.js.map +1 -0
  45. package/dist/config/spaSecretTypes.d.ts +329 -0
  46. package/dist/config/spaSecretTypes.d.ts.map +1 -0
  47. package/dist/config/spaSecretTypes.js +326 -0
  48. package/dist/config/spaSecretTypes.js.map +1 -0
  49. package/dist/index.d.ts +9 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +5 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/mcp/McpClient.d.ts +2 -0
  54. package/dist/mcp/McpClient.d.ts.map +1 -1
  55. package/dist/mcp/McpClient.js +9 -1
  56. package/dist/mcp/McpClient.js.map +1 -1
  57. package/dist/mcp/McpServerRegistry.d.ts +2 -13
  58. package/dist/mcp/McpServerRegistry.d.ts.map +1 -1
  59. package/dist/mcp/McpServerRegistry.js +17 -2
  60. package/dist/mcp/McpServerRegistry.js.map +1 -1
  61. package/dist/mcp/essentialMcpTools.d.ts +11 -0
  62. package/dist/mcp/essentialMcpTools.d.ts.map +1 -0
  63. package/dist/mcp/essentialMcpTools.js +22 -0
  64. package/dist/mcp/essentialMcpTools.js.map +1 -0
  65. package/dist/mcp/mcpSchemaCompat.d.ts +9 -0
  66. package/dist/mcp/mcpSchemaCompat.d.ts.map +1 -0
  67. package/dist/mcp/mcpSchemaCompat.js +32 -0
  68. package/dist/mcp/mcpSchemaCompat.js.map +1 -0
  69. package/dist/middleware/HelperModelMiddleware.d.ts +4 -0
  70. package/dist/middleware/HelperModelMiddleware.d.ts.map +1 -1
  71. package/dist/middleware/HelperModelMiddleware.js +2 -2
  72. package/dist/middleware/HelperModelMiddleware.js.map +1 -1
  73. package/dist/middleware/SystemMessageMiddleware.d.ts.map +1 -1
  74. package/dist/middleware/SystemMessageMiddleware.js +6 -0
  75. package/dist/middleware/SystemMessageMiddleware.js.map +1 -1
  76. package/dist/middleware/permissions/DefaultPolicies.d.ts.map +1 -1
  77. package/dist/middleware/permissions/DefaultPolicies.js +2 -0
  78. package/dist/middleware/permissions/DefaultPolicies.js.map +1 -1
  79. package/dist/orchestrator/APIClient.d.ts.map +1 -1
  80. package/dist/orchestrator/APIClient.js +46 -1
  81. package/dist/orchestrator/APIClient.js.map +1 -1
  82. package/dist/orchestrator/CortexOrchestrator.d.ts +43 -8
  83. package/dist/orchestrator/CortexOrchestrator.d.ts.map +1 -1
  84. package/dist/orchestrator/CortexOrchestrator.js +341 -40
  85. package/dist/orchestrator/CortexOrchestrator.js.map +1 -1
  86. package/dist/orchestrator/HerdrSubAgentRunner.d.ts.map +1 -1
  87. package/dist/orchestrator/HerdrSubAgentRunner.js +2 -1
  88. package/dist/orchestrator/HerdrSubAgentRunner.js.map +1 -1
  89. package/dist/orchestrator/SubAgentProcessManager.d.ts.map +1 -1
  90. package/dist/orchestrator/SubAgentProcessManager.js +2 -0
  91. package/dist/orchestrator/SubAgentProcessManager.js.map +1 -1
  92. package/dist/orchestrator/browserWallNudge.d.ts +93 -0
  93. package/dist/orchestrator/browserWallNudge.d.ts.map +1 -0
  94. package/dist/orchestrator/browserWallNudge.js +227 -0
  95. package/dist/orchestrator/browserWallNudge.js.map +1 -0
  96. package/dist/orchestrator/citationVerification.d.ts.map +1 -1
  97. package/dist/orchestrator/citationVerification.js +16 -0
  98. package/dist/orchestrator/citationVerification.js.map +1 -1
  99. package/dist/orchestrator/cortexProxyFetch.d.ts +8 -0
  100. package/dist/orchestrator/cortexProxyFetch.d.ts.map +1 -1
  101. package/dist/orchestrator/cortexProxyFetch.js +32 -0
  102. package/dist/orchestrator/cortexProxyFetch.js.map +1 -1
  103. package/dist/orchestrator/emptyResponseClassifier.d.ts +1 -1
  104. package/dist/orchestrator/emptyResponseClassifier.d.ts.map +1 -1
  105. package/dist/orchestrator/emptyResponseClassifier.js +8 -2
  106. package/dist/orchestrator/emptyResponseClassifier.js.map +1 -1
  107. package/dist/orchestrator/endTurnGates.d.ts +39 -0
  108. package/dist/orchestrator/endTurnGates.d.ts.map +1 -1
  109. package/dist/orchestrator/endTurnGates.js +159 -3
  110. package/dist/orchestrator/endTurnGates.js.map +1 -1
  111. package/dist/orchestrator/imageTtl.d.ts.map +1 -1
  112. package/dist/orchestrator/imageTtl.js +14 -5
  113. package/dist/orchestrator/imageTtl.js.map +1 -1
  114. package/dist/orchestrator/integrityVerification.d.ts +2 -0
  115. package/dist/orchestrator/integrityVerification.d.ts.map +1 -1
  116. package/dist/orchestrator/integrityVerification.js +2 -2
  117. package/dist/orchestrator/integrityVerification.js.map +1 -1
  118. package/dist/orchestrator/requestDebugLog.d.ts +4 -0
  119. package/dist/orchestrator/requestDebugLog.d.ts.map +1 -0
  120. package/dist/orchestrator/requestDebugLog.js +55 -0
  121. package/dist/orchestrator/requestDebugLog.js.map +1 -0
  122. package/dist/orchestrator/requirementsVerification.d.ts +4 -0
  123. package/dist/orchestrator/requirementsVerification.d.ts.map +1 -1
  124. package/dist/orchestrator/requirementsVerification.js +12 -6
  125. package/dist/orchestrator/requirementsVerification.js.map +1 -1
  126. package/dist/orchestrator/subAgentTimeout.d.ts +3 -0
  127. package/dist/orchestrator/subAgentTimeout.d.ts.map +1 -1
  128. package/dist/orchestrator/subAgentTimeout.js +6 -0
  129. package/dist/orchestrator/subAgentTimeout.js.map +1 -1
  130. package/dist/orchestrator/toolAllowlist.d.ts +29 -0
  131. package/dist/orchestrator/toolAllowlist.d.ts.map +1 -1
  132. package/dist/orchestrator/toolAllowlist.js +45 -0
  133. package/dist/orchestrator/toolAllowlist.js.map +1 -1
  134. package/dist/tools/ToolProfile.d.ts +5 -21
  135. package/dist/tools/ToolProfile.d.ts.map +1 -1
  136. package/dist/tools/ToolProfile.js +17 -2
  137. package/dist/tools/ToolProfile.js.map +1 -1
  138. package/dist/tools/registries/BaseToolRegistry.d.ts.map +1 -1
  139. package/dist/tools/registries/BaseToolRegistry.js +26 -6
  140. package/dist/tools/registries/BaseToolRegistry.js.map +1 -1
  141. package/dist/training/AutoResearchConfirm.d.ts +105 -0
  142. package/dist/training/AutoResearchConfirm.d.ts.map +1 -0
  143. package/dist/training/AutoResearchConfirm.js +111 -0
  144. package/dist/training/AutoResearchConfirm.js.map +1 -0
  145. package/dist/training/AutoResearchGate.d.ts +6 -0
  146. package/dist/training/AutoResearchGate.d.ts.map +1 -1
  147. package/dist/training/AutoResearchGate.js +8 -2
  148. package/dist/training/AutoResearchGate.js.map +1 -1
  149. package/dist/training/AutoResearchGuards.d.ts +86 -0
  150. package/dist/training/AutoResearchGuards.d.ts.map +1 -0
  151. package/dist/training/AutoResearchGuards.js +81 -0
  152. package/dist/training/AutoResearchGuards.js.map +1 -0
  153. package/dist/training/BenchRunner.d.ts +21 -5
  154. package/dist/training/BenchRunner.d.ts.map +1 -1
  155. package/dist/training/BenchRunner.js +126 -54
  156. package/dist/training/BenchRunner.js.map +1 -1
  157. package/dist/training/EvalGuard.d.ts +43 -0
  158. package/dist/training/EvalGuard.d.ts.map +1 -0
  159. package/dist/training/EvalGuard.js +131 -0
  160. package/dist/training/EvalGuard.js.map +1 -0
  161. package/dist/training/ExperimentRunner.d.ts +22 -0
  162. package/dist/training/ExperimentRunner.d.ts.map +1 -1
  163. package/dist/training/ExperimentRunner.js +45 -9
  164. package/dist/training/ExperimentRunner.js.map +1 -1
  165. package/dist/training/endTurnResolver.d.ts +23 -1
  166. package/dist/training/endTurnResolver.d.ts.map +1 -1
  167. package/dist/training/endTurnResolver.js +35 -3
  168. package/dist/training/endTurnResolver.js.map +1 -1
  169. package/dist/training/mentorRole.d.ts.map +1 -1
  170. package/dist/training/mentorRole.js +6 -1
  171. package/dist/training/mentorRole.js.map +1 -1
  172. package/dist/training/scopeCheck.d.ts +41 -0
  173. package/dist/training/scopeCheck.d.ts.map +1 -0
  174. package/dist/training/scopeCheck.js +119 -0
  175. package/dist/training/scopeCheck.js.map +1 -0
  176. package/dist/training/usageAccounting.d.ts +13 -0
  177. package/dist/training/usageAccounting.d.ts.map +1 -1
  178. package/dist/training/usageAccounting.js +11 -0
  179. package/dist/training/usageAccounting.js.map +1 -1
  180. package/dist/utils/repairToolJson.d.ts +19 -0
  181. package/dist/utils/repairToolJson.d.ts.map +1 -0
  182. package/dist/utils/repairToolJson.js +122 -0
  183. package/dist/utils/repairToolJson.js.map +1 -0
  184. package/package.json +5 -4
@@ -0,0 +1,43 @@
1
+ /** Convert a glob to an anchored RegExp over repo-relative POSIX paths.
2
+ * `**` matches across directories (and `dir/**` also matches `dir` itself), `*` and `?`
3
+ * stay inside one path segment. A glob with no slash matches the basename at any depth. */
4
+ export declare function globToRegExp(glob: string): RegExp;
5
+ export declare function matchesAny(path: string, globs: readonly string[]): boolean;
6
+ export interface GuardViolation {
7
+ path: string;
8
+ rule: 'protected' | 'outside-editable';
9
+ }
10
+ export interface GuardPolicy {
11
+ /** globs no candidate may touch (the task-sets' in-repo paths are added by the loop). */
12
+ protect: readonly string[];
13
+ /** when non-empty, every changed path must match one of these. */
14
+ editable?: readonly string[];
15
+ }
16
+ /** Check a candidate's changed paths (repo-relative, POSIX) against the policy. */
17
+ export declare function checkCandidateChanges(changed: readonly string[], policy: GuardPolicy): {
18
+ ok: boolean;
19
+ violations: GuardViolation[];
20
+ };
21
+ /** One-line human summary of the violations (capped). */
22
+ export declare function describeViolations(v: readonly GuardViolation[], max?: number): string;
23
+ /** The repo-relative POSIX path of `absPath` when it lies inside `repoDir`, else undefined. */
24
+ export declare function repoRelative(absPath: string, repoDir: string): string | undefined;
25
+ /** Glob that protects a task-set path (a file, or every file under a directory). */
26
+ export declare function protectGlobFor(relPath: string, isDir: boolean): string;
27
+ /** sha256 over a file, or over a directory's files (sorted relative path + content). */
28
+ export declare function hashPath(p: string): string;
29
+ export interface SealedSet {
30
+ /** where the loop read it from */
31
+ source: string;
32
+ /** the private copy every experiment grades against */
33
+ sealed: string;
34
+ sha256: string;
35
+ isDir: boolean;
36
+ /** repo-relative path when the source lies inside the repo (then it is hidden + protected) */
37
+ inRepo?: string;
38
+ }
39
+ /** Copy a task-set (file or dir) into `sealDir/<label>-<basename>` and fingerprint it. */
40
+ export declare function sealTaskSet(source: string, sealDir: string, label: string, repoDir: string): SealedSet;
41
+ /** Task ids declared in a task-set (file or dir of *.json; array or single object). */
42
+ export declare function taskIdsIn(p: string): Set<string>;
43
+ //# sourceMappingURL=EvalGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvalGuard.d.ts","sourceRoot":"","sources":["../../src/training/EvalGuard.ts"],"names":[],"mappings":"AA0BA;;4FAE4F;AAC5F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBjD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAG1E;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,GAAG,kBAAkB,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,yFAAyF;IACzF,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,cAAc,EAAE,CAAA;CAAE,CAQpI;AAED,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,SAAS,cAAc,EAAE,EAAE,GAAG,SAAI,GAAG,MAAM,CAGhF;AAED,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIjF;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtE;AAED,wFAAwF;AACxF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAa1C;AAED,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAKtG;AAED,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAYhD"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * EvalGuard — keep the Fixer away from the evaluation (autoresearch hardening A1).
3
+ *
4
+ * The statistical gate can only be trusted if the thing being improved cannot reach
5
+ * the thing that grades it. Library home of the three mechanisms, so every entry point
6
+ * can apply them (the CLI `cortex autoresearch loop` applies all three):
7
+ *
8
+ * 1. SEAL — the train/holdout task-sets are copied ONCE, at loop start, into a private
9
+ * temp dir outside the repo, and every experiment grades against those sealed copies.
10
+ * Editing the in-repo task-set (or the main checkout) changes nothing the gate reads.
11
+ * 2. HIDE — a task-set that lives inside the repo is deleted from each candidate worktree
12
+ * before the Fixer runs and restored to the base version before the candidate is
13
+ * committed, so the Fixer neither reads it in the tree nor ships an edit to it.
14
+ * (Best-effort secrecy: the files are still in git history. For a holdout the Fixer
15
+ * must never see, keep it OUTSIDE the repo; the loop warns when it is inside.)
16
+ * 3. REFUSE — before a candidate is benched, its changed paths are checked against the
17
+ * protected globs (verifier scripts, graders, benches: `--protect`) and the optional
18
+ * editable allowlist (`--editable`). A candidate that touches a protected path or
19
+ * strays outside the allowlist is refused unbenched (`skipped: 'eval-guard'`).
20
+ *
21
+ * Pure helpers + small fs helpers; no git here (the caller owns git).
22
+ */
23
+ import { createHash } from 'node:crypto';
24
+ import { cpSync, readdirSync, readFileSync, statSync } from 'node:fs';
25
+ import { basename, isAbsolute, join, relative, sep } from 'node:path';
26
+ /** Convert a glob to an anchored RegExp over repo-relative POSIX paths.
27
+ * `**` matches across directories (and `dir/**` also matches `dir` itself), `*` and `?`
28
+ * stay inside one path segment. A glob with no slash matches the basename at any depth. */
29
+ export function globToRegExp(glob) {
30
+ let g = glob.trim().replace(/\\/g, '/').replace(/^\.\//, '');
31
+ if (!g.includes('/'))
32
+ g = `**/${g}`;
33
+ let re = '';
34
+ for (let i = 0; i < g.length; i++) {
35
+ const c = g[i];
36
+ if (c === '*') {
37
+ if (g[i + 1] === '*') {
38
+ const slashAfter = g[i + 2] === '/';
39
+ re += slashAfter ? '(?:.*/)?' : '.*';
40
+ i += slashAfter ? 2 : 1;
41
+ }
42
+ else {
43
+ re += '[^/]*';
44
+ }
45
+ }
46
+ else if (c === '?') {
47
+ re += '[^/]';
48
+ }
49
+ else {
50
+ re += c.replace(/[.+^${}()|[\]\\]/g, '\\$&');
51
+ }
52
+ }
53
+ // `dir/**` also covers the directory path itself.
54
+ if (re.endsWith('/.*'))
55
+ re = `${re.slice(0, -3)}(?:/.*)?`;
56
+ return new RegExp(`^${re}$`);
57
+ }
58
+ export function matchesAny(path, globs) {
59
+ const p = path.replace(/\\/g, '/').replace(/^\.\//, '');
60
+ return globs.some((g) => globToRegExp(g).test(p));
61
+ }
62
+ /** Check a candidate's changed paths (repo-relative, POSIX) against the policy. */
63
+ export function checkCandidateChanges(changed, policy) {
64
+ const violations = [];
65
+ const editable = policy.editable ?? [];
66
+ for (const path of changed) {
67
+ if (matchesAny(path, policy.protect))
68
+ violations.push({ path, rule: 'protected' });
69
+ else if (editable.length && !matchesAny(path, editable))
70
+ violations.push({ path, rule: 'outside-editable' });
71
+ }
72
+ return { ok: violations.length === 0, violations };
73
+ }
74
+ /** One-line human summary of the violations (capped). */
75
+ export function describeViolations(v, max = 5) {
76
+ const head = v.slice(0, max).map((x) => `${x.path} (${x.rule})`).join(', ');
77
+ return v.length > max ? `${head}, +${v.length - max} more` : head;
78
+ }
79
+ /** The repo-relative POSIX path of `absPath` when it lies inside `repoDir`, else undefined. */
80
+ export function repoRelative(absPath, repoDir) {
81
+ const rel = relative(repoDir, absPath);
82
+ if (!rel || rel.startsWith('..') || isAbsolute(rel))
83
+ return undefined;
84
+ return rel.split(sep).join('/');
85
+ }
86
+ /** Glob that protects a task-set path (a file, or every file under a directory). */
87
+ export function protectGlobFor(relPath, isDir) {
88
+ return isDir ? `${relPath.replace(/\/+$/, '')}/**` : relPath;
89
+ }
90
+ /** sha256 over a file, or over a directory's files (sorted relative path + content). */
91
+ export function hashPath(p) {
92
+ const h = createHash('sha256');
93
+ const walk = (abs, rel) => {
94
+ if (statSync(abs).isDirectory()) {
95
+ for (const name of readdirSync(abs).sort())
96
+ walk(join(abs, name), rel ? `${rel}/${name}` : name);
97
+ }
98
+ else {
99
+ h.update(`${rel}\0`);
100
+ h.update(readFileSync(abs));
101
+ h.update('\0');
102
+ }
103
+ };
104
+ walk(p, '');
105
+ return h.digest('hex');
106
+ }
107
+ /** Copy a task-set (file or dir) into `sealDir/<label>-<basename>` and fingerprint it. */
108
+ export function sealTaskSet(source, sealDir, label, repoDir) {
109
+ const isDir = statSync(source).isDirectory();
110
+ const sealed = join(sealDir, `${label}-${basename(source)}`);
111
+ cpSync(source, sealed, { recursive: true });
112
+ return { source, sealed, sha256: hashPath(sealed), isDir, inRepo: repoRelative(source, repoDir) };
113
+ }
114
+ /** Task ids declared in a task-set (file or dir of *.json; array or single object). */
115
+ export function taskIdsIn(p) {
116
+ const ids = new Set();
117
+ const files = statSync(p).isDirectory()
118
+ ? readdirSync(p).filter((f) => f.endsWith('.json')).map((f) => join(p, f))
119
+ : [p];
120
+ for (const f of files) {
121
+ try {
122
+ const raw = JSON.parse(readFileSync(f, 'utf8'));
123
+ for (const t of Array.isArray(raw) ? raw : [raw])
124
+ if (t && typeof t.id === 'string')
125
+ ids.add(t.id);
126
+ }
127
+ catch { /* unreadable file: the experiment reports it */ }
128
+ }
129
+ return ids;
130
+ }
131
+ //# sourceMappingURL=EvalGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvalGuard.js","sourceRoot":"","sources":["../../src/training/EvalGuard.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,8 @@
23
23
  import { ModelRouterMatrix } from './ModelRouterMatrix.js';
24
24
  import { ExperimentLedger } from './ExperimentLedger.js';
25
25
  import { type TaskSpec, type HarnessRunner, type BenchSummary } from './BenchRunner.js';
26
+ import { type RunPlan } from './AutoResearchConfirm.js';
27
+ import type { FamilyEffect, GuardVerdict } from './AutoResearchGuards.js';
26
28
  import type { ExperimentRecord } from './ExperimentLedger.js';
27
29
  import type { ExperimentVerdict } from './AutoResearchStats.js';
28
30
  export interface ExperimentArms {
@@ -58,6 +60,18 @@ export interface RunExperimentOptions {
58
60
  * Omitted ⇒ falls back to the CORTEX_SUBAGENT_TEMPERATURE / CORTEX_ARM_STRATEGY env stamp. */
59
61
  temperature?: number;
60
62
  strategy?: string;
63
+ /** Run base and candidate INTERLEAVED (per task, per run, seeded random order) so
64
+ * provider drift hits both arms. Default true; false = all base runs, then all
65
+ * candidate runs (the pre-11-03 order). */
66
+ interleave?: boolean;
67
+ /** Seed for the interleaving order (default: derived from gate.seed / the tag). */
68
+ orderSeed?: number;
69
+ /** Run planning: the aggregate effect worth detecting (score points, default 5) and
70
+ * the power wanted (default 0.8). Reported as `runPlan`; never changes the verdict. */
71
+ plan?: {
72
+ targetEffect?: number;
73
+ power?: number;
74
+ };
61
75
  }
62
76
  export interface ExperimentBenchSummaries {
63
77
  base: {
@@ -77,6 +91,14 @@ export interface ExperimentResult {
77
91
  /** keep-on-train ∧ fwerAdjusted ∧ keep-on-holdout. FALSE without holdout. */
78
92
  mergeEligible: boolean;
79
93
  benchSummaries: ExperimentBenchSummaries;
94
+ /** Runs-per-arm planning from the train arms' observed per-task score SDs: the
95
+ * smallest effect these runs can detect, and the runs needed for `plan.targetEffect`. */
96
+ runPlan?: RunPlan;
97
+ /** whether the arms ran interleaved */
98
+ interleaved: boolean;
99
+ /** per-family train effects + STEP guard verdicts (B4; see AutoResearchGuards) */
100
+ families: FamilyEffect[];
101
+ stepGuards: GuardVerdict[];
80
102
  }
81
103
  /**
82
104
  * Bench both arms (train + optional holdout) into the shared matrix, then run the
@@ -1 +1 @@
1
- {"version":3,"file":"ExperimentRunner.d.ts","sourceRoot":"","sources":["../../src/training/ExperimentRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAY,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,UAAU,EAAE,aAAa,CAAC;IAC1B,sDAAsD;IACtD,eAAe,EAAE,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;;mGAG+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;IACtD,SAAS,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;CAC5D;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACzC,6EAA6E;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,wBAAwB,CAAC;CAC1C;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAyE3B"}
1
+ {"version":3,"file":"ExperimentRunner.d.ts","sourceRoot":"","sources":["../../src/training/ExperimentRunner.ts"],"names":[],"mappings":"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"}
@@ -20,8 +20,18 @@
20
20
  * verified). The fixing agent must never have seen the holdout tasks (enforced
21
21
  * upstream).
22
22
  */
23
- import { runBench } from './BenchRunner.js';
23
+ import { runBench, runBenchPaired } from './BenchRunner.js';
24
+ import { planRuns } from './AutoResearchConfirm.js';
24
25
  import { evaluateExperiment, verifyOnHoldout } from './AutoResearchGate.js';
26
+ /** Stable 32-bit hash of a string (FNV-1a) — default interleaving seed from the tag. */
27
+ function hash32(s) {
28
+ let h = 0x811c9dc5;
29
+ for (let i = 0; i < s.length; i++) {
30
+ h ^= s.charCodeAt(i);
31
+ h = Math.imul(h, 0x01000193);
32
+ }
33
+ return h >>> 0;
34
+ }
25
35
  /**
26
36
  * Bench both arms (train + optional holdout) into the shared matrix, then run the
27
37
  * gate + the held-out verification, and compute merge-eligibility. Pure of
@@ -41,19 +51,32 @@ export async function runExperiment(matrix, ledger, arms, opts) {
41
51
  temperature: opts.temperature,
42
52
  strategy: opts.strategy,
43
53
  });
54
+ const interleave = opts.interleave !== false;
55
+ const orderSeed = opts.orderSeed ?? ((opts.gate?.seed ?? 0) ^ hash32(opts.experimentTag));
56
+ /** Bench both arms on one split — interleaved by default, else base then candidate. */
57
+ const benchBoth = async (split, tasks) => {
58
+ if (!interleave) {
59
+ log(`bench base/${split} @ ${opts.baseRef}`);
60
+ const b = await benchOpts(split, opts.baseRef, arms.baseRunner, tasks);
61
+ log(`bench candidate/${split} @ ${opts.candidateRef}`);
62
+ const c = await benchOpts(split, opts.candidateRef, arms.candidateRunner, tasks);
63
+ return [b, c];
64
+ }
65
+ log(`bench base/${split} @ ${opts.baseRef} + candidate/${split} @ ${opts.candidateRef} (interleaved)`);
66
+ const r = await runBenchPaired(tasks, { runner: arms.baseRunner, harnessRef: opts.baseRef }, { runner: arms.candidateRunner, harnessRef: opts.candidateRef }, matrix, {
67
+ experimentTag: opts.experimentTag, runs, split, modelId: opts.modelId,
68
+ benchmarkSource: opts.benchmarkSource, temperature: opts.temperature, strategy: opts.strategy,
69
+ orderSeed: (orderSeed ^ (split === 'holdout' ? 0x9e3779b9 : 0)) >>> 0,
70
+ });
71
+ return [r.base, r.candidate];
72
+ };
44
73
  // 1. Train arms (drive keep/discard).
45
- log(`bench base/train @ ${opts.baseRef}`);
46
- const baseTrain = await benchOpts('train', opts.baseRef, arms.baseRunner, opts.trainTasks);
47
- log(`bench candidate/train @ ${opts.candidateRef}`);
48
- const candTrain = await benchOpts('train', opts.candidateRef, arms.candidateRunner, opts.trainTasks);
74
+ const [baseTrain, candTrain] = await benchBoth('train', opts.trainTasks);
49
75
  // 2. Holdout arms (verify generalization), if a holdout set was provided.
50
76
  let baseHoldout;
51
77
  let candHoldout;
52
78
  if (opts.holdoutTasks && opts.holdoutTasks.length > 0) {
53
- log(`bench base/holdout @ ${opts.baseRef}`);
54
- baseHoldout = await benchOpts('holdout', opts.baseRef, arms.baseRunner, opts.holdoutTasks);
55
- log(`bench candidate/holdout @ ${opts.candidateRef}`);
56
- candHoldout = await benchOpts('holdout', opts.candidateRef, arms.candidateRunner, opts.holdoutTasks);
79
+ [baseHoldout, candHoldout] = await benchBoth('holdout', opts.holdoutTasks);
57
80
  }
58
81
  // 3. Keep/discard gate over the train records.
59
82
  log('gate (train)');
@@ -88,6 +111,19 @@ export async function runExperiment(matrix, ledger, arms, opts) {
88
111
  regressedTasks: gateResult.regressedTasks,
89
112
  holdoutVerdict,
90
113
  mergeEligible,
114
+ interleaved: interleave,
115
+ families: gateResult.families,
116
+ stepGuards: gateResult.stepGuards,
117
+ runPlan: (() => {
118
+ const sd = new Map(baseTrain.tasks.map((t) => [t.taskId, t.scoreSd ?? 0]));
119
+ const planTasks = candTrain.tasks.map((t) => ({ baseSd: sd.get(t.taskId) ?? 0, candSd: t.scoreSd ?? 0 }));
120
+ return planRuns(planTasks, {
121
+ runsPerArm: runs,
122
+ alphaAdjusted: gateResult.verdict.alphaAdjusted,
123
+ targetEffect: opts.plan?.targetEffect,
124
+ power: opts.plan?.power,
125
+ });
126
+ })(),
91
127
  benchSummaries: {
92
128
  base: { train: baseTrain, holdout: baseHoldout },
93
129
  candidate: { train: candTrain, holdout: candHoldout },
@@ -1 +1 @@
1
- {"version":3,"file":"ExperimentRunner.js","sourceRoot":"","sources":["../../src/training/ExperimentRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExperimentRunner.js","sourceRoot":"","sources":["../../src/training/ExperimentRunner.ts"],"names":[],"mappings":"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"}
@@ -162,7 +162,14 @@ export declare const RESOLVER_DECIDE_NOW_CLAUSE = "\n\nNo further investigation
162
162
  * `taskRules` (R211–R214) appends one rubric clause per active CORTEX_RULE_* rule after the R208 scale item. */
163
163
  /** CORTEX_LIFT_PLAN_SCOPE=task: the judge's scope rubric (pairs with liftPlanner SCOPE_DOCTRINE_TASK). */
164
164
  export declare const RESOLVER_SCOPE_TASK_CLAUSE: string;
165
- export declare function resolverSystemPrompt(abstain?: boolean, meetsConfirm?: boolean, investigate?: 'offer' | 'withdraw', verifyScale?: boolean, taskRules?: readonly TaskRule[], scopeTask?: boolean): string;
165
+ /** Web-answer rubric (2026-11-04, CORTEX_RESOLVER_WEB_RULE, default on): appended on WEB turns (web results read, no files changed).
166
+ * The grader-oriented persona hunts literal mismatches; on a web answer that turned right answers wrong — val-T4 Backcountry: the
167
+ * 50%-off "Spire GTX" (judged correct in val-T2) was HELD because "'GTX' alone is explicitly NOT sufficient" (a plan step's literal
168
+ * GORE-TEX rule), and the agent swapped in a worse shoe; val-T3 Target: a veto on the closest stand-in ended with an empty cart. */
169
+ export declare const RESOLVER_WEB_ANSWER_CLAUSE: string;
170
+ /** CORTEX_RESOLVER_WEB_RULE: off|false|0 drops the web-answer rubric (default on). */
171
+ export declare function resolverWebRuleEnabled(env?: NodeJS.ProcessEnv): boolean;
172
+ export declare function resolverSystemPrompt(abstain?: boolean, meetsConfirm?: boolean, investigate?: 'offer' | 'withdraw', verifyScale?: boolean, taskRules?: readonly TaskRule[], scopeTask?: boolean, webAnswer?: boolean): string;
166
173
  export interface EndTurnResolverContext {
167
174
  /** The task statement the junior received. */
168
175
  task: string;
@@ -300,6 +307,21 @@ export declare function groundSpecCheck(check: string, task: string, envReport?:
300
307
  export declare function parseSpecChecks(text: string, max?: number): string[];
301
308
  /** R160: escalation line appended to the GAP fix plan from the second veto on. */
302
309
  export declare function budgetedVetoEscalation(rejectIndex: number, cap: number, remainingMs: number, deadlineMs: number): string;
310
+ /** A MEETS on a WEB turn is evidenced by the web output itself (2026-11-03): the turn read web results (Browse / WebFetch / WebSearch)
311
+ * and changed no files. Off with CORTEX_MEETS_CONFIRM_WEB=hold (the turn is then held like any unevidenced MEETS). */
312
+ export declare function webTurnEvidenced(ev: {
313
+ webContent: unknown[];
314
+ writeInputs: unknown[];
315
+ usedFileEditTool?: boolean;
316
+ }, env?: NodeJS.ProcessEnv): boolean;
317
+ /** R167 on WEB turns (2026-11-03): an accept-with-gap finish on a turn that read web results and changed no files stands — the hold's
318
+ * "~10 min of the wall budget left (40%)" sent web agents back for another browse pass that did not change the answer (val-W BBB: 4 extra
319
+ * delegates after the answer was in hand at 4.8 min). Coding turns keep the hold. CORTEX_FINISH_CONFIRM_WEB=hold restores it. */
320
+ export declare function webFinishStands(ev: {
321
+ webContent: unknown[];
322
+ writeInputs: unknown[];
323
+ usedFileEditTool?: boolean;
324
+ }, env?: NodeJS.ProcessEnv): boolean;
303
325
  /** R167: hold the finish for one informed confirmation? Only after an accept-with-gap / accept-low-confidence verdict —
304
326
  * or (R168) after a MEETS that no passing check backs, when `meets` is passed and meetsConfirm is on. The two share
305
327
  * `confirmsUsed` / `finishConfirmMax`, so a session is never held twice. */
@@ -1 +1 @@
1
- {"version":3,"file":"endTurnResolver.d.ts","sourceRoot":"","sources":["../../src/training/endTurnResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"endTurnResolver.d.ts","sourceRoot":"","sources":["../../src/training/endTurnResolver.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ import { clipIn, FULL_CAPS, HINTS } from './steerInputs.js';
15
15
  import { resolveTaskRules, taskRulesJudgeClause } from './taskRules.js'; // R211–R214
16
16
  /** R188 (2026-09-23): the task text is the spec — 25 of 64 TB4.0 tasks exceed 2000 chars and 14 exceed 2500; every steerer sees the whole text up to this cap. */
17
17
  export const TASK_TEXT_CAP = 8000;
18
- const DEFAULTS = { outputBudgetTokens: 4000, effort: 'max', maxRejects: 2, maxRejectsBudgeted: 6, semantic: true, progressMinCalls: 3, escalateReasoning: true, vetoMode: 'evidence', evidenceCap: 1, budgetFloorS: 0, budgetFloorMode: 'evidence', finishConfirm: true, finishConfirmMinRemaining: 0.3, finishConfirmMax: 1, meetsConfirm: true, meetsConfirmMinRemaining: 0.5, toolRounds: 1, toolRoundBudgetMs: 240_000, toolAutoLoop: false, abstain: false, gapHold: false, gapHoldJev: 'off', gapHoldJevMin: 0.3, specTests: false, specTestsMax: 4, vetoMinRemaining: 0, gapHoldMinIntervalMs: 180_000, gapHoldPlanMaxSimilarity: 0.6, specRepeatMax: 2, specTestsAt: 'finish', specSamples: 3, specVetoFrac: 0.5, specText: 'shown', derivation: 'off', derivationTol: 1e-3, reqLedger: false, reqLedgerMax: 8, reqLedgerHoldMax: 1, reqLedgerJev: true, reqLedgerJevMin: 0.7, reqLedgerFailVeto: false, reqLedgerFailVetoMax: 2, reqLedgerFailVetoMinRemaining: 0.25, reqLedgerFailJev: 'shadow', reqLedgerFailJevMin: 0.7, verifyScale: false, taskRules: [], scopeTask: false };
18
+ const DEFAULTS = { outputBudgetTokens: 4000, effort: 'max', maxRejects: 2, maxRejectsBudgeted: 6, semantic: true, progressMinCalls: 3, escalateReasoning: true, vetoMode: 'evidence', evidenceCap: 1, budgetFloorS: 0, budgetFloorMode: 'evidence', finishConfirm: true, finishConfirmMinRemaining: 0.3, finishConfirmMax: 1, meetsConfirm: false, meetsConfirmMinRemaining: 0.5, toolRounds: 1, toolRoundBudgetMs: 240_000, toolAutoLoop: false, abstain: false, gapHold: false, gapHoldJev: 'off', gapHoldJevMin: 0.3, specTests: false, specTestsMax: 4, vetoMinRemaining: 0, gapHoldMinIntervalMs: 180_000, gapHoldPlanMaxSimilarity: 0.6, specRepeatMax: 2, specTestsAt: 'finish', specSamples: 3, specVetoFrac: 0.5, specText: 'shown', derivation: 'off', derivationTol: 1e-3, reqLedger: false, reqLedgerMax: 8, reqLedgerHoldMax: 1, reqLedgerJev: true, reqLedgerJevMin: 0.7, reqLedgerFailVeto: false, reqLedgerFailVetoMax: 2, reqLedgerFailVetoMinRemaining: 0.25, reqLedgerFailJev: 'shadow', reqLedgerFailJevMin: 0.7, verifyScale: false, taskRules: [], scopeTask: false };
19
19
  export function resolveEndTurnResolverConfig(env = process.env) {
20
20
  const n = parseInt((env.CORTEX_ENDTURN_RESOLVER_BUDGET_TOKENS ?? '').trim(), 10);
21
21
  const e = (env.CORTEX_ENDTURN_RESOLVER_EFFORT ?? '').trim();
@@ -162,10 +162,27 @@ export const RESOLVER_SCOPE_TASK_CLAUSE = '\n\nSCOPE RULE (HB-SCOPE-TASK): judge
162
162
  'data file the task did not point to; or an incidental change (debug output, scratch files, edits unrelated to the task). A fix that ' +
163
163
  'spans several files is not a gap. Never ask the junior to revert or drop a change that is part of the fix; if you doubt a change is ' +
164
164
  "needed, name a CHECK that re-runs the task's own check without it.";
165
- export function resolverSystemPrompt(abstain = false, meetsConfirm = false, investigate, verifyScale = false, taskRules = [], scopeTask = false) {
165
+ /** Web-answer rubric (2026-11-04, CORTEX_RESOLVER_WEB_RULE, default on): appended on WEB turns (web results read, no files changed).
166
+ * The grader-oriented persona hunts literal mismatches; on a web answer that turned right answers wrong — val-T4 Backcountry: the
167
+ * 50%-off "Spire GTX" (judged correct in val-T2) was HELD because "'GTX' alone is explicitly NOT sufficient" (a plan step's literal
168
+ * GORE-TEX rule), and the agent swapped in a worse shoe; val-T3 Target: a veto on the closest stand-in ended with an empty cart. */
169
+ export const RESOLVER_WEB_ANSWER_CLAUSE = '\n\nWEB ANSWER RULE (this is a web task: the work product is an answer read from web pages; no files were changed): judge whether ' +
170
+ 'the answer is right for the task and supported by the page evidence shown. A GAP must name a stated constraint the evidence shows ' +
171
+ 'unmet (price, rating, size, location, date, count, a required filter), an answer the evidence contradicts, or a required fact with ' +
172
+ 'no evidence at all — and say which page or filter would settle it. Do NOT GAP on wording: a site\'s established name or abbreviation ' +
173
+ 'for a required term satisfies it (e.g. GTX = GORE-TEX, "4 & up" = a rating of at least 4, the store\'s own label for a category), ' +
174
+ 'even when a plan step asked for the literal word. When the exact item the task names does not exist on the site and the answer says ' +
175
+ 'so and gives the closest match, that is a finished answer, not a gap. Never ask the junior to swap a candidate that meets every stated ' +
176
+ 'constraint for one that only matches a word more literally.';
177
+ /** CORTEX_RESOLVER_WEB_RULE: off|false|0 drops the web-answer rubric (default on). */
178
+ export function resolverWebRuleEnabled(env = process.env) {
179
+ return !/^(off|false|0)$/i.test(String(env.CORTEX_RESOLVER_WEB_RULE ?? '').trim());
180
+ }
181
+ export function resolverSystemPrompt(abstain = false, meetsConfirm = false, investigate, verifyScale = false, taskRules = [], scopeTask = false, webAnswer = false) {
166
182
  const base0 = meetsConfirm ? RESOLVER_SYSTEM.replace(RESOLVER_MEETS_DEFAULT_LINE, RESOLVER_MEETS_CHECK_LINE) : RESOLVER_SYSTEM;
167
183
  const base = (verifyScale ? base0 + RESOLVER_SCALE_CLAUSE : base0) + taskRulesJudgeClause(taskRules) // R208 / R211–R214 ('' when none)
168
- + (scopeTask ? RESOLVER_SCOPE_TASK_CLAUSE : ''); // CORTEX_LIFT_PLAN_SCOPE=task
184
+ + (scopeTask ? RESOLVER_SCOPE_TASK_CLAUSE : '') // CORTEX_LIFT_PLAN_SCOPE=task
185
+ + (webAnswer ? RESOLVER_WEB_ANSWER_CLAUSE : ''); // CORTEX_RESOLVER_WEB_RULE (web turns only)
169
186
  const withAbstain = abstain ? base + RESOLVER_ABSTAIN_CLAUSE : base;
170
187
  return investigate === 'offer' ? withAbstain + RESOLVER_INVESTIGATE_CLAUSE : investigate === 'withdraw' ? withAbstain + RESOLVER_DECIDE_NOW_CLAUSE : withAbstain;
171
188
  }
@@ -459,6 +476,21 @@ export function budgetedVetoEscalation(rejectIndex, cap, remainingMs, deadlineMs
459
476
  `not for re-describing the work. Work it with tools until the task's own criterion is met, or, if it genuinely cannot be met in ` +
460
477
  `this box, name the hard limit under open_items and finish.`);
461
478
  }
479
+ /** A MEETS on a WEB turn is evidenced by the web output itself (2026-11-03): the turn read web results (Browse / WebFetch / WebSearch)
480
+ * and changed no files. Off with CORTEX_MEETS_CONFIRM_WEB=hold (the turn is then held like any unevidenced MEETS). */
481
+ export function webTurnEvidenced(ev, env = process.env) {
482
+ if (/^hold$/i.test(String(env.CORTEX_MEETS_CONFIRM_WEB ?? '').trim()))
483
+ return false;
484
+ return ev.webContent.length > 0 && ev.writeInputs.length === 0 && !ev.usedFileEditTool;
485
+ }
486
+ /** R167 on WEB turns (2026-11-03): an accept-with-gap finish on a turn that read web results and changed no files stands — the hold's
487
+ * "~10 min of the wall budget left (40%)" sent web agents back for another browse pass that did not change the answer (val-W BBB: 4 extra
488
+ * delegates after the answer was in hand at 4.8 min). Coding turns keep the hold. CORTEX_FINISH_CONFIRM_WEB=hold restores it. */
489
+ export function webFinishStands(ev, env = process.env) {
490
+ if (/^hold$/i.test(String(env.CORTEX_FINISH_CONFIRM_WEB ?? '').trim()))
491
+ return false;
492
+ return webTurnEvidenced(ev, {});
493
+ }
462
494
  /** R167: hold the finish for one informed confirmation? Only after an accept-with-gap / accept-low-confidence verdict —
463
495
  * or (R168) after a MEETS that no passing check backs, when `meets` is passed and meetsConfirm is on. The two share
464
496
  * `confirmsUsed` / `finishConfirmMax`, so a session is never held twice. */