nexus-agents 2.133.0 → 2.134.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 (131) hide show
  1. package/dist/{child-mcp-config-R67B2KM6.js → child-mcp-config-TWHH63UK.js} +3 -3
  2. package/dist/{chunk-GYDO2WOR.js → chunk-33MFMXBQ.js} +5 -5
  3. package/dist/{chunk-VZCQRLXT.js → chunk-3EYXPV5F.js} +7 -7
  4. package/dist/{chunk-RLYXX3FQ.js → chunk-6LMZ7HFU.js} +2 -2
  5. package/dist/{chunk-4CLBJ2NA.js → chunk-6UCWR3DS.js} +3 -3
  6. package/dist/{chunk-RJEP2AZW.js → chunk-76R5ES6Z.js} +36 -36
  7. package/dist/{chunk-RJEP2AZW.js.map → chunk-76R5ES6Z.js.map} +1 -1
  8. package/dist/{chunk-HGUO36KW.js → chunk-7GSYICTL.js} +8 -8
  9. package/dist/{chunk-ZVBGZBW5.js → chunk-7TQZR5VU.js} +114 -7
  10. package/dist/chunk-7TQZR5VU.js.map +1 -0
  11. package/dist/{chunk-2CLFX73Y.js → chunk-B26FGLIJ.js} +2 -2
  12. package/dist/{chunk-27DRQWON.js → chunk-BTYYZ6VU.js} +4 -4
  13. package/dist/{chunk-K5WBFAR4.js → chunk-CLRSNWRQ.js} +4 -4
  14. package/dist/{chunk-TGGR6ST5.js → chunk-COJOUIO2.js} +3 -3
  15. package/dist/{chunk-QJIHSQZX.js → chunk-DBDWMHUL.js} +65 -14
  16. package/dist/chunk-DBDWMHUL.js.map +1 -0
  17. package/dist/{chunk-4CVITS5D.js → chunk-DLUFDKPA.js} +9 -9
  18. package/dist/{chunk-PM63X3QG.js → chunk-E64SZTEP.js} +3 -3
  19. package/dist/{chunk-QMCHVYZB.js → chunk-EHLJLIHS.js} +2 -2
  20. package/dist/{chunk-ZTRBMKXK.js → chunk-F74ZGHAP.js} +2 -2
  21. package/dist/{chunk-NZGNOXXW.js → chunk-FPMQ2JAK.js} +2 -2
  22. package/dist/{chunk-4DLHM6LI.js → chunk-FSFF7EFR.js} +2 -2
  23. package/dist/{chunk-J435FU54.js → chunk-FUJ3XR7T.js} +4 -4
  24. package/dist/{chunk-CI5KGCX5.js → chunk-FVSZLVMR.js} +3 -3
  25. package/dist/{chunk-RUSP5PJR.js → chunk-GZ4NF4ZW.js} +5 -1
  26. package/dist/{chunk-RUSP5PJR.js.map → chunk-GZ4NF4ZW.js.map} +1 -1
  27. package/dist/{chunk-DETYVPZO.js → chunk-IWQH6TP7.js} +6 -6
  28. package/dist/{chunk-ZQEQVCIU.js → chunk-MY52DFXC.js} +2 -2
  29. package/dist/{chunk-FKTLAPXJ.js → chunk-OCKZ6F5O.js} +3 -3
  30. package/dist/{chunk-E4IYX7LD.js → chunk-ORQAFTAZ.js} +2 -2
  31. package/dist/{chunk-QLRH6KOT.js → chunk-OU2NQVKD.js} +2 -2
  32. package/dist/{chunk-7BONPRR2.js → chunk-PFBV5FCT.js} +2 -2
  33. package/dist/{chunk-S4U3Z6ZS.js → chunk-QZUT22LP.js} +6 -6
  34. package/dist/{chunk-EFDXX5MC.js → chunk-UDB5NHJI.js} +3 -3
  35. package/dist/{chunk-RAWF4JOT.js → chunk-VI7LELES.js} +7 -7
  36. package/dist/{chunk-ECDJM6UB.js → chunk-WFKVUZ3O.js} +2 -2
  37. package/dist/{chunk-XIFOAZ5B.js → chunk-WYJJUF6N.js} +4 -4
  38. package/dist/{chunk-GET2MTLW.js → chunk-Z6DXZ6AS.js} +2 -2
  39. package/dist/{chunk-WHZD2W6Q.js → chunk-ZMDOGN33.js} +2 -2
  40. package/dist/{cli-circuit-breaker-J6UFONNE.js → cli-circuit-breaker-VXBDCAD7.js} +5 -5
  41. package/dist/cli.js +844 -155
  42. package/dist/cli.js.map +1 -1
  43. package/dist/{composite-router-HQUSCJO4.js → composite-router-E6FXXMMR.js} +3 -3
  44. package/dist/{consensus-vote-MVZ27Y43.js → consensus-vote-R6X5IL57.js} +15 -15
  45. package/dist/{context-retriever-5OVRAWNZ.js → context-retriever-I4NEOUEV.js} +9 -9
  46. package/dist/{doctor-deep-HJ3NQ365.js → doctor-deep-CZXN4YD6.js} +4 -4
  47. package/dist/{expert-bridge-MINXBC73.js → expert-bridge-GMB5IHHF.js} +5 -5
  48. package/dist/factory-WR62MEIJ.js +14 -0
  49. package/dist/factory-ZBQGA373.js +21 -0
  50. package/dist/{improvement-review-ZL3364R2.js → improvement-review-77BKIQGN.js} +5 -5
  51. package/dist/index.d.ts +210 -192
  52. package/dist/index.js +30 -30
  53. package/dist/{init-opencode-L3NT524E.js → init-opencode-4H2VPN23.js} +7 -7
  54. package/dist/issue-triage-NJB6SL4S.js +16 -0
  55. package/dist/{learning-persistence-QFCQ5POD.js → learning-persistence-2KO4CXNL.js} +2 -2
  56. package/dist/{pr-reviewer-helpers-PLKDVWYF.js → pr-reviewer-helpers-F3SHCHNV.js} +5 -5
  57. package/dist/{registry-command-HPKNLYUL.js → registry-command-VFCSMHME.js} +3 -3
  58. package/dist/{repo-security-plan-HSYGGVEJ.js → repo-security-plan-U2ZIFW53.js} +4 -4
  59. package/dist/research-helpers-synthesize-5TLNHT3I.js +14 -0
  60. package/dist/{routing-memory-OGUOL7UF.js → routing-memory-VVLJL3MG.js} +3 -3
  61. package/dist/{session-memory-HQWAXH3C.js → session-memory-GMQYZLJE.js} +4 -4
  62. package/dist/{setup-command-CIXJXFPC.js → setup-command-IMAX6EAO.js} +12 -12
  63. package/dist/setup-config-2ZSJ3HNE.js +10 -0
  64. package/dist/{setup-custom-api-W7EDVKWR.js → setup-custom-api-NJGCRIRO.js} +4 -4
  65. package/dist/{tool-memory-Z2B7CAH7.js → tool-memory-TSYJXGOV.js} +6 -6
  66. package/dist/unified-registry-IMAL3SY6.js +24 -0
  67. package/dist/{weather-report-GX7OIUL2.js → weather-report-OU65NJS3.js} +3 -3
  68. package/package.json +1 -1
  69. package/dist/chunk-QJIHSQZX.js.map +0 -1
  70. package/dist/chunk-ZVBGZBW5.js.map +0 -1
  71. package/dist/factory-KC7BYHAP.js +0 -21
  72. package/dist/factory-ZG2FZYVA.js +0 -14
  73. package/dist/issue-triage-CZPFNGB7.js +0 -16
  74. package/dist/research-helpers-synthesize-IQHDU27S.js +0 -14
  75. package/dist/setup-config-HYX3BRSE.js +0 -10
  76. package/dist/unified-registry-UFNSWKZA.js +0 -24
  77. /package/dist/{child-mcp-config-R67B2KM6.js.map → child-mcp-config-TWHH63UK.js.map} +0 -0
  78. /package/dist/{chunk-GYDO2WOR.js.map → chunk-33MFMXBQ.js.map} +0 -0
  79. /package/dist/{chunk-VZCQRLXT.js.map → chunk-3EYXPV5F.js.map} +0 -0
  80. /package/dist/{chunk-RLYXX3FQ.js.map → chunk-6LMZ7HFU.js.map} +0 -0
  81. /package/dist/{chunk-4CLBJ2NA.js.map → chunk-6UCWR3DS.js.map} +0 -0
  82. /package/dist/{chunk-HGUO36KW.js.map → chunk-7GSYICTL.js.map} +0 -0
  83. /package/dist/{chunk-2CLFX73Y.js.map → chunk-B26FGLIJ.js.map} +0 -0
  84. /package/dist/{chunk-27DRQWON.js.map → chunk-BTYYZ6VU.js.map} +0 -0
  85. /package/dist/{chunk-K5WBFAR4.js.map → chunk-CLRSNWRQ.js.map} +0 -0
  86. /package/dist/{chunk-TGGR6ST5.js.map → chunk-COJOUIO2.js.map} +0 -0
  87. /package/dist/{chunk-4CVITS5D.js.map → chunk-DLUFDKPA.js.map} +0 -0
  88. /package/dist/{chunk-PM63X3QG.js.map → chunk-E64SZTEP.js.map} +0 -0
  89. /package/dist/{chunk-QMCHVYZB.js.map → chunk-EHLJLIHS.js.map} +0 -0
  90. /package/dist/{chunk-ZTRBMKXK.js.map → chunk-F74ZGHAP.js.map} +0 -0
  91. /package/dist/{chunk-NZGNOXXW.js.map → chunk-FPMQ2JAK.js.map} +0 -0
  92. /package/dist/{chunk-4DLHM6LI.js.map → chunk-FSFF7EFR.js.map} +0 -0
  93. /package/dist/{chunk-J435FU54.js.map → chunk-FUJ3XR7T.js.map} +0 -0
  94. /package/dist/{chunk-CI5KGCX5.js.map → chunk-FVSZLVMR.js.map} +0 -0
  95. /package/dist/{chunk-DETYVPZO.js.map → chunk-IWQH6TP7.js.map} +0 -0
  96. /package/dist/{chunk-ZQEQVCIU.js.map → chunk-MY52DFXC.js.map} +0 -0
  97. /package/dist/{chunk-FKTLAPXJ.js.map → chunk-OCKZ6F5O.js.map} +0 -0
  98. /package/dist/{chunk-E4IYX7LD.js.map → chunk-ORQAFTAZ.js.map} +0 -0
  99. /package/dist/{chunk-QLRH6KOT.js.map → chunk-OU2NQVKD.js.map} +0 -0
  100. /package/dist/{chunk-7BONPRR2.js.map → chunk-PFBV5FCT.js.map} +0 -0
  101. /package/dist/{chunk-S4U3Z6ZS.js.map → chunk-QZUT22LP.js.map} +0 -0
  102. /package/dist/{chunk-EFDXX5MC.js.map → chunk-UDB5NHJI.js.map} +0 -0
  103. /package/dist/{chunk-RAWF4JOT.js.map → chunk-VI7LELES.js.map} +0 -0
  104. /package/dist/{chunk-ECDJM6UB.js.map → chunk-WFKVUZ3O.js.map} +0 -0
  105. /package/dist/{chunk-XIFOAZ5B.js.map → chunk-WYJJUF6N.js.map} +0 -0
  106. /package/dist/{chunk-GET2MTLW.js.map → chunk-Z6DXZ6AS.js.map} +0 -0
  107. /package/dist/{chunk-WHZD2W6Q.js.map → chunk-ZMDOGN33.js.map} +0 -0
  108. /package/dist/{cli-circuit-breaker-J6UFONNE.js.map → cli-circuit-breaker-VXBDCAD7.js.map} +0 -0
  109. /package/dist/{composite-router-HQUSCJO4.js.map → composite-router-E6FXXMMR.js.map} +0 -0
  110. /package/dist/{consensus-vote-MVZ27Y43.js.map → consensus-vote-R6X5IL57.js.map} +0 -0
  111. /package/dist/{context-retriever-5OVRAWNZ.js.map → context-retriever-I4NEOUEV.js.map} +0 -0
  112. /package/dist/{doctor-deep-HJ3NQ365.js.map → doctor-deep-CZXN4YD6.js.map} +0 -0
  113. /package/dist/{expert-bridge-MINXBC73.js.map → expert-bridge-GMB5IHHF.js.map} +0 -0
  114. /package/dist/{factory-KC7BYHAP.js.map → factory-WR62MEIJ.js.map} +0 -0
  115. /package/dist/{factory-ZG2FZYVA.js.map → factory-ZBQGA373.js.map} +0 -0
  116. /package/dist/{improvement-review-ZL3364R2.js.map → improvement-review-77BKIQGN.js.map} +0 -0
  117. /package/dist/{init-opencode-L3NT524E.js.map → init-opencode-4H2VPN23.js.map} +0 -0
  118. /package/dist/{issue-triage-CZPFNGB7.js.map → issue-triage-NJB6SL4S.js.map} +0 -0
  119. /package/dist/{learning-persistence-QFCQ5POD.js.map → learning-persistence-2KO4CXNL.js.map} +0 -0
  120. /package/dist/{pr-reviewer-helpers-PLKDVWYF.js.map → pr-reviewer-helpers-F3SHCHNV.js.map} +0 -0
  121. /package/dist/{registry-command-HPKNLYUL.js.map → registry-command-VFCSMHME.js.map} +0 -0
  122. /package/dist/{repo-security-plan-HSYGGVEJ.js.map → repo-security-plan-U2ZIFW53.js.map} +0 -0
  123. /package/dist/{research-helpers-synthesize-IQHDU27S.js.map → research-helpers-synthesize-5TLNHT3I.js.map} +0 -0
  124. /package/dist/{routing-memory-OGUOL7UF.js.map → routing-memory-VVLJL3MG.js.map} +0 -0
  125. /package/dist/{session-memory-HQWAXH3C.js.map → session-memory-GMQYZLJE.js.map} +0 -0
  126. /package/dist/{setup-command-CIXJXFPC.js.map → setup-command-IMAX6EAO.js.map} +0 -0
  127. /package/dist/{setup-config-HYX3BRSE.js.map → setup-config-2ZSJ3HNE.js.map} +0 -0
  128. /package/dist/{setup-custom-api-W7EDVKWR.js.map → setup-custom-api-NJGCRIRO.js.map} +0 -0
  129. /package/dist/{tool-memory-Z2B7CAH7.js.map → tool-memory-TSYJXGOV.js.map} +0 -0
  130. /package/dist/{unified-registry-UFNSWKZA.js.map → unified-registry-IMAL3SY6.js.map} +0 -0
  131. /package/dist/{weather-report-GX7OIUL2.js.map → weather-report-OU65NJS3.js.map} +0 -0
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  createAllAdapters,
9
9
  probeCli
10
- } from "./chunk-VZCQRLXT.js";
10
+ } from "./chunk-3EYXPV5F.js";
11
11
  import {
12
12
  DEFAULTS
13
- } from "./chunk-WHZD2W6Q.js";
13
+ } from "./chunk-ZMDOGN33.js";
14
14
  import {
15
15
  CliNameSchema,
16
16
  DEFAULT_CAPABILITIES,
@@ -26,7 +26,7 @@ import {
26
26
  ok,
27
27
  symbols,
28
28
  writeLine
29
- } from "./chunk-QJIHSQZX.js";
29
+ } from "./chunk-DBDWMHUL.js";
30
30
  import {
31
31
  detectSandbox,
32
32
  getLearningDir,
@@ -37,10 +37,10 @@ import {
37
37
  getRulesFile,
38
38
  isPersistenceEnabled,
39
39
  nexusDataPath
40
- } from "./chunk-RUSP5PJR.js";
40
+ } from "./chunk-GZ4NF4ZW.js";
41
41
 
42
42
  // src/version.ts
43
- var VERSION = true ? "2.133.0" : "dev";
43
+ var VERSION = true ? "2.134.0" : "dev";
44
44
 
45
45
  // src/config/schemas-core.ts
46
46
  import { z } from "zod";
@@ -2130,7 +2130,7 @@ async function runDoctorFix(result) {
2130
2130
  writeLine2("\u2500".repeat(40));
2131
2131
  let fixCount = 0;
2132
2132
  if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
2133
- const { runSetup } = await import("./setup-command-CIXJXFPC.js");
2133
+ const { runSetup } = await import("./setup-command-IMAX6EAO.js");
2134
2134
  const setupResult = runSetup({
2135
2135
  skipMcp: true,
2136
2136
  skipRules: true,
@@ -2144,7 +2144,7 @@ async function runDoctorFix(result) {
2144
2144
  }
2145
2145
  }
2146
2146
  if (!result.configFile.found) {
2147
- const { runConfigInitSync } = await import("./setup-config-HYX3BRSE.js");
2147
+ const { runConfigInitSync } = await import("./setup-config-2ZSJ3HNE.js");
2148
2148
  const configResult = runConfigInitSync(process.cwd(), false, false);
2149
2149
  if (configResult.success && configResult.created) {
2150
2150
  writeLine2(`\u2713 Generated config: ${configResult.path}`);
@@ -2243,4 +2243,4 @@ export {
2243
2243
  startStdioServer,
2244
2244
  closeServer
2245
2245
  };
2246
- //# sourceMappingURL=chunk-HGUO36KW.js.map
2246
+ //# sourceMappingURL=chunk-7GSYICTL.js.map
@@ -7,21 +7,23 @@ import {
7
7
  toolStructuredError,
8
8
  toolSuccessStructured,
9
9
  wrapToolWithTimeout
10
- } from "./chunk-4CLBJ2NA.js";
10
+ } from "./chunk-6UCWR3DS.js";
11
11
  import {
12
12
  JsonlStore,
13
13
  SECURITY_KEYWORDS,
14
14
  createLogger,
15
+ declaredOrthogonalityGroup,
15
16
  formatZodError,
16
17
  getErrorMessage,
17
18
  getOutcomeStore,
18
19
  getPipelineEventBus,
19
- getTimeProvider
20
- } from "./chunk-QJIHSQZX.js";
20
+ getTimeProvider,
21
+ isDeclaredNeverDeprecate
22
+ } from "./chunk-DBDWMHUL.js";
21
23
  import {
22
24
  getNexusDataDir,
23
25
  nexusDataPath
24
- } from "./chunk-RUSP5PJR.js";
26
+ } from "./chunk-GZ4NF4ZW.js";
25
27
 
26
28
  // src/mcp/tools/improvement-review.ts
27
29
  import { execFile as execFile2 } from "child_process";
@@ -742,6 +744,7 @@ var DEFAULT_NEVER_DEPRECATE_PATTERNS = [
742
744
  "quarantine"
743
745
  ];
744
746
  function isNeverDeprecate(tool, config) {
747
+ if (isDeclaredNeverDeprecate(tool)) return true;
745
748
  if (config?.exemptTools?.includes(tool) === true) return true;
746
749
  const lower = tool.toLowerCase();
747
750
  const patterns = [...DEFAULT_NEVER_DEPRECATE_PATTERNS, ...config?.extraPatterns ?? []];
@@ -763,6 +766,11 @@ function verbGroup(verb) {
763
766
  return ORTHOGONAL_VERB_GROUPS.findIndex((g) => g.includes(verb));
764
767
  }
765
768
  function consolidationConfidence(candidate, busiest) {
769
+ const declaredA = declaredOrthogonalityGroup(candidate.tool);
770
+ const declaredB = declaredOrthogonalityGroup(busiest.tool);
771
+ if (declaredA !== void 0 && declaredB !== void 0) {
772
+ return declaredA !== declaredB ? "none" : "low";
773
+ }
766
774
  const a = verbGroup(actionVerb(candidate.tool));
767
775
  const b = verbGroup(actionVerb(busiest.tool));
768
776
  if (a !== -1 && b !== -1 && a !== b) return "none";
@@ -1109,6 +1117,95 @@ function loadToolFitnessSignals(windowLabel, ledger = getToolFitnessLedger()) {
1109
1117
  }
1110
1118
  }
1111
1119
 
1120
+ // src/mcp/tools/improvement-review-perf-regression.ts
1121
+ var DEFAULT_REGRESSION_TOLERANCE_FRACTION = 0.2;
1122
+ function baselineKey(component, operation) {
1123
+ return `${component}::${operation}`;
1124
+ }
1125
+ function round2(n) {
1126
+ return Math.round(n * 100) / 100;
1127
+ }
1128
+ function pctWorse(measured, baseline) {
1129
+ if (baseline === 0) return 0;
1130
+ return round2(Math.abs(measured - baseline) / baseline * 100);
1131
+ }
1132
+ function latencyRegressionSignal(component, operation, measuredP95Ms, baselineP95Ms, tolerance) {
1133
+ const threshold = baselineP95Ms * (1 + tolerance);
1134
+ if (measuredP95Ms <= threshold) return void 0;
1135
+ const deltaPct = pctWorse(measuredP95Ms, baselineP95Ms);
1136
+ return {
1137
+ category: "perf-regression",
1138
+ signalKey: `perf-regression:latency:${component}:${operation}`,
1139
+ severity: "warning",
1140
+ title: `perf-regression: ${component}/${operation} p95 latency ${String(round2(measuredP95Ms))}ms vs baseline ${String(round2(baselineP95Ms))}ms (+${String(deltaPct)}%)`,
1141
+ body: [
1142
+ `Measured p95 latency regressed beyond the configured tolerance against a STATIC baseline.`,
1143
+ "",
1144
+ `- Component: \`${component}\``,
1145
+ `- Operation: \`${operation}\``,
1146
+ `- Measured p95: ${String(round2(measuredP95Ms))} ms`,
1147
+ `- Baseline p95: ${String(round2(baselineP95Ms))} ms (static/configured \u2014 not a rolling window)`,
1148
+ `- Tolerance: ${String(round2(tolerance * 100))}% (regression threshold ${String(round2(threshold))} ms)`,
1149
+ `- Delta: +${String(deltaPct)}% worse than baseline`,
1150
+ "",
1151
+ "Surfaced as a candidate finding for human review. No fitness/governance score is mutated and no remediation is auto-applied."
1152
+ ].join("\n"),
1153
+ evidence: { observedValue: round2(measuredP95Ms), threshold: round2(threshold) }
1154
+ };
1155
+ }
1156
+ function throughputRegressionSignal(component, operation, measuredThroughput, baselineThroughput, tolerance) {
1157
+ const threshold = baselineThroughput * (1 - tolerance);
1158
+ if (measuredThroughput >= threshold) return void 0;
1159
+ const deltaPct = pctWorse(measuredThroughput, baselineThroughput);
1160
+ return {
1161
+ category: "perf-regression",
1162
+ signalKey: `perf-regression:throughput:${component}:${operation}`,
1163
+ severity: "warning",
1164
+ title: `perf-regression: ${component}/${operation} throughput ${String(round2(measuredThroughput))} ops/s vs baseline ${String(round2(baselineThroughput))} ops/s (-${String(deltaPct)}%)`,
1165
+ body: [
1166
+ `Measured throughput regressed beyond the configured tolerance against a STATIC baseline.`,
1167
+ "",
1168
+ `- Component: \`${component}\``,
1169
+ `- Operation: \`${operation}\``,
1170
+ `- Measured throughput: ${String(round2(measuredThroughput))} ops/s`,
1171
+ `- Baseline throughput: ${String(round2(baselineThroughput))} ops/s (static/configured \u2014 not a rolling window)`,
1172
+ `- Tolerance: ${String(round2(tolerance * 100))}% (regression threshold ${String(round2(threshold))} ops/s)`,
1173
+ `- Delta: -${String(deltaPct)}% below baseline`,
1174
+ "",
1175
+ "Surfaced as a candidate finding for human review. No fitness/governance score is mutated and no remediation is auto-applied."
1176
+ ].join("\n"),
1177
+ evidence: { observedValue: round2(measuredThroughput), threshold: round2(threshold) }
1178
+ };
1179
+ }
1180
+ function detectPerfRegressionSignals(result, baselines, tolerance = DEFAULT_REGRESSION_TOLERANCE_FRACTION) {
1181
+ const signals = [];
1182
+ for (const op of result.operations) {
1183
+ const baseline = baselines.get(baselineKey(result.component, op.operation));
1184
+ if (baseline === void 0) continue;
1185
+ if (baseline.baselineP95Ms !== void 0) {
1186
+ const sig = latencyRegressionSignal(
1187
+ result.component,
1188
+ op.operation,
1189
+ op.latency.p95,
1190
+ baseline.baselineP95Ms,
1191
+ tolerance
1192
+ );
1193
+ if (sig !== void 0) signals.push(sig);
1194
+ }
1195
+ if (baseline.baselineThroughput !== void 0) {
1196
+ const sig = throughputRegressionSignal(
1197
+ result.component,
1198
+ op.operation,
1199
+ op.throughput.opsPerSecond,
1200
+ baseline.baselineThroughput,
1201
+ tolerance
1202
+ );
1203
+ if (sig !== void 0) signals.push(sig);
1204
+ }
1205
+ }
1206
+ return signals;
1207
+ }
1208
+
1112
1209
  // src/mcp/tools/improvement-remediation.ts
1113
1210
  var ROLE_BY_CATEGORY = {
1114
1211
  security: "security",
@@ -1119,7 +1216,11 @@ var ROLE_BY_CATEGORY = {
1119
1216
  // #3852: tool-fitness candidates are deprecation/consolidation proposals —
1120
1217
  // a researcher owns the investigation seed (suggest-tier; the dev-pipeline
1121
1218
  // re-plans anyway). NEVER an autonomous removal.
1122
- "tool-fitness": "researcher"
1219
+ "tool-fitness": "researcher",
1220
+ // #3692/#3246: a perf regression vs a static baseline is a performance
1221
+ // investigation seed — a coder owns the diagnosis. Surfaced-only; the
1222
+ // dev-pipeline re-plans, nothing is auto-applied.
1223
+ "perf-regression": "coder"
1123
1224
  };
1124
1225
  function remediationTaskId(signal) {
1125
1226
  return `improvement-${signal.signalKey}`;
@@ -1810,6 +1911,10 @@ function readBufferedVoteRejections(now, lookbackDays) {
1810
1911
  const cutoff = now - lookbackDays * DAY_MS;
1811
1912
  return getPipelineEventBus().query({ type: "signal.vote_rejected" }).filter((e) => e.type === "signal.vote_rejected").filter((e) => e.timestamp >= cutoff);
1812
1913
  }
1914
+ function gatherPerfRegressionSignals(perf) {
1915
+ if (perf === void 0) return [];
1916
+ return detectPerfRegressionSignals(perf.result, perf.baselines, perf.toleranceFraction);
1917
+ }
1813
1918
  async function runImprovementReview(input, deps = {}) {
1814
1919
  const logger = deps.logger ?? createLogger({ component: "improvement_review" });
1815
1920
  const { lookbackDays, fileIssues, minSampleSize, fitnessFloor, selfEvalReportPath } = input;
@@ -1821,13 +1926,15 @@ async function runImprovementReview(input, deps = {}) {
1821
1926
  const selfEvalSignals = selfEvalReportPath !== void 0 ? await loadSelfEvalSignals(selfEvalReportPath, windowLabel, logger) : [];
1822
1927
  const rejectionEvents = readBufferedVoteRejections(now, lookbackDays);
1823
1928
  const toolFitnessSignals = loadToolFitnessSignals(windowLabel);
1929
+ const perfRegressionSignals = gatherPerfRegressionSignals(deps.perfRegression);
1824
1930
  const signals = [
1825
1931
  ...detectCliPerformanceFloor(windowed, minSampleSize, windowLabel),
1826
1932
  ...detectFailureCategoryConcentration(windowed, windowLabel),
1827
1933
  ...detectFitnessSignals(audit, fitnessFloor),
1828
1934
  ...detectConsensusRejectionSignals(rejectionEvents, windowLabel),
1829
1935
  ...selfEvalSignals,
1830
- ...toolFitnessSignals
1936
+ ...toolFitnessSignals,
1937
+ ...perfRegressionSignals
1831
1938
  ];
1832
1939
  signals.sort((a, b) => SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity]);
1833
1940
  emitFitnessDeclinedSignal(audit, fitnessFloor, getPipelineEventBus(), logger);
@@ -1931,4 +2038,4 @@ export {
1931
2038
  runImprovementReview,
1932
2039
  registerImprovementReviewTool
1933
2040
  };
1934
- //# sourceMappingURL=chunk-ZVBGZBW5.js.map
2041
+ //# sourceMappingURL=chunk-7TQZR5VU.js.map