nexus-agents 9.0.2 → 9.1.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 (25) hide show
  1. package/dist/{chunk-3OBOVCFZ.js → chunk-AI4DWDDD.js} +2 -2
  2. package/dist/{chunk-3OBOVCFZ.js.map → chunk-AI4DWDDD.js.map} +1 -1
  3. package/dist/{chunk-FSM6ZCVF.js → chunk-BQPQIOEB.js} +2 -2
  4. package/dist/{chunk-L25VW7RC.js → chunk-IHSX3WQN.js} +3 -3
  5. package/dist/{chunk-SFILA57C.js → chunk-JHLMYOPG.js} +11 -9
  6. package/dist/{chunk-SFILA57C.js.map → chunk-JHLMYOPG.js.map} +1 -1
  7. package/dist/{chunk-EF5FB4QM.js → chunk-RJDZOOPA.js} +2 -2
  8. package/dist/{chunk-GZHDEMLN.js → chunk-V5CYHQ7H.js} +170 -88
  9. package/dist/chunk-V5CYHQ7H.js.map +1 -0
  10. package/dist/cli.d.ts +1 -1
  11. package/dist/cli.js +7 -7
  12. package/dist/{consensus-vote-THWFSBC7.js → consensus-vote-4NUYMBIC.js} +4 -4
  13. package/dist/{consensus-vote-types-D2RbRYve.d.ts → consensus-vote-types-B001FCSw.d.ts} +10 -1
  14. package/dist/{improvement-review-FQRJMLHU.js → improvement-review-J2DWPLWX.js} +4 -4
  15. package/dist/index.d.ts +5 -3
  16. package/dist/index.js +6 -6
  17. package/dist/{setup-data-dir-XCHPJFBD.js → setup-data-dir-CSNTWHYS.js} +3 -3
  18. package/package.json +1 -1
  19. package/dist/chunk-GZHDEMLN.js.map +0 -1
  20. /package/dist/{chunk-FSM6ZCVF.js.map → chunk-BQPQIOEB.js.map} +0 -0
  21. /package/dist/{chunk-L25VW7RC.js.map → chunk-IHSX3WQN.js.map} +0 -0
  22. /package/dist/{chunk-EF5FB4QM.js.map → chunk-RJDZOOPA.js.map} +0 -0
  23. /package/dist/{consensus-vote-THWFSBC7.js.map → consensus-vote-4NUYMBIC.js.map} +0 -0
  24. /package/dist/{improvement-review-FQRJMLHU.js.map → improvement-review-J2DWPLWX.js.map} +0 -0
  25. /package/dist/{setup-data-dir-XCHPJFBD.js.map → setup-data-dir-CSNTWHYS.js.map} +0 -0
@@ -5,7 +5,7 @@ import {
5
5
  getCurrentRequestContext,
6
6
  runWithRequestContext,
7
7
  serverCallerInfo
8
- } from "./chunk-FSM6ZCVF.js";
8
+ } from "./chunk-BQPQIOEB.js";
9
9
  import {
10
10
  DEFAULT_EXECUTION_MODE
11
11
  } from "./chunk-ECJ52NSK.js";
@@ -2343,4 +2343,4 @@ export {
2343
2343
  DEFAULT_CONSENSUS_CONFIG,
2344
2344
  ConsensusMetricsSchema
2345
2345
  };
2346
- //# sourceMappingURL=chunk-EF5FB4QM.js.map
2346
+ //# sourceMappingURL=chunk-RJDZOOPA.js.map
@@ -21,7 +21,7 @@ import {
21
21
  toolSuccess,
22
22
  withProgressHeartbeat,
23
23
  wrapToolWithTimeout
24
- } from "./chunk-EF5FB4QM.js";
24
+ } from "./chunk-RJDZOOPA.js";
25
25
  import {
26
26
  getToolMemory
27
27
  } from "./chunk-WNVJQ5SC.js";
@@ -30,7 +30,7 @@ import {
30
30
  } from "./chunk-EZNIYU5T.js";
31
31
  import {
32
32
  VERSION
33
- } from "./chunk-FSM6ZCVF.js";
33
+ } from "./chunk-BQPQIOEB.js";
34
34
  import {
35
35
  isGatewayModelAdapter
36
36
  } from "./chunk-T5IBXFFY.js";
@@ -95,6 +95,7 @@ import {
95
95
  getPipelineEventBus,
96
96
  getRandomProvider,
97
97
  getTimeProvider,
98
+ hasGatewaySlotCatalog,
98
99
  isAuthFailureText,
99
100
  isCallerAbortError,
100
101
  isCliName,
@@ -112,6 +113,7 @@ import {
112
113
  readVoteRecords,
113
114
  recordUsageEvent,
114
115
  registerPersistentOutcomeStoreFactory,
116
+ resolveGatewayDefault,
115
117
  resolveInsideRoot,
116
118
  resolveModelIdentitySync,
117
119
  resolveVoteRecordsPath,
@@ -185,85 +187,6 @@ function getDefaultErrorPolicy(strategy) {
185
187
  return "reduce_denominator";
186
188
  }
187
189
 
188
- // src/cli/voter-model-overrides.ts
189
- function voterModelOverrideEnvKey(role) {
190
- return `NEXUS_VOTER_MODEL_${role.toUpperCase()}`;
191
- }
192
- function resolveVoterModelOverrides(roles, gatewayAdapters, logger12) {
193
- const overrides = /* @__PURE__ */ new Map();
194
- if (gatewayAdapters.length === 0) return overrides;
195
- const byId = /* @__PURE__ */ new Map();
196
- for (const adapter of gatewayAdapters) byId.set(adapter.modelId, adapter);
197
- for (const role of roles) {
198
- const envKey = voterModelOverrideEnvKey(role);
199
- const raw = process.env[envKey];
200
- if (raw === void 0 || raw.trim() === "") continue;
201
- const requested = raw.trim();
202
- const adapter = byId.get(requested) ?? gatewayAdapters.find((a) => a.modelId.toLowerCase() === requested.toLowerCase());
203
- if (adapter === void 0) {
204
- logger12.warn(
205
- `Voter model override ${envKey}="${requested}" is not a discovered gateway model \u2014 falling back to round-robin for role "${role}".`,
206
- { role, requested, available: [...byId.keys()] }
207
- );
208
- continue;
209
- }
210
- overrides.set(role, adapter);
211
- }
212
- if (overrides.size > 0) {
213
- logger12.info("Applied per-role voter model overrides (#4055)", {
214
- overrides: Object.fromEntries([...overrides].map(([r, a]) => [r, a.modelId]))
215
- });
216
- }
217
- return overrides;
218
- }
219
-
220
- // src/cli/voter-cli-access.ts
221
- var VOTER_ACCESS_MODE = "read-only-analysis";
222
- function clisServingVoterSeats(clis, declarationsFor = (cli) => createCliAdapter({ cli })) {
223
- const serving = [];
224
- const refused = [];
225
- for (const cli of clis) {
226
- const enforces = adapterEnforces(declarationsFor(cli), { accessMode: VOTER_ACCESS_MODE });
227
- (enforces ? serving : refused).push(cli);
228
- }
229
- return { serving, refused };
230
- }
231
-
232
- // src/cli/voter-fallback.ts
233
- function bareCliName(id) {
234
- return id.startsWith("cli-") ? id.slice("cli-".length) : id;
235
- }
236
- function classifyFallbackReason(message) {
237
- if (isDurableCapacityText(message)) return "capacity";
238
- if (isRateLimitText(message)) return "rate-limit";
239
- if (classifyExtractedError(message, "unknown").code === "NOT_AUTHENTICATED") return "auth";
240
- if (UNVERIFIABLE_STDERR_RE.test(message)) return "sandbox";
241
- if (isTimeoutText(message)) return "timeout";
242
- return "unknown";
243
- }
244
- function detectedModel(adapter) {
245
- const id = adapter.modelId;
246
- return typeof id === "string" && id !== "" && id !== UNRESOLVED_MODEL_ID ? id : void 0;
247
- }
248
- function assignedCliOf(key) {
249
- return typeof key === "string" && key !== "" ? bareCliName(key) : void 0;
250
- }
251
- function crossCliFallback(assigned, assignedKey, error) {
252
- const fromModel = detectedModel(assigned);
253
- return {
254
- fromCli: assignedCliOf(assignedKey) ?? "unknown",
255
- ...fromModel !== void 0 ? { fromModel } : {},
256
- reason: classifyFallbackReason(error)
257
- };
258
- }
259
- function inFamilyFallback(cli, fromModel) {
260
- return { fromCli: bareCliName(cli), fromModel, reason: "capacity" };
261
- }
262
- function withAssignedCli(result, assignedKey) {
263
- const assignedCli = assignedCliOf(assignedKey);
264
- return assignedCli === void 0 ? result : { ...result, assignedCli };
265
- }
266
-
267
190
  // src/cli/voter-attempt-events.ts
268
191
  import { randomUUID } from "node:crypto";
269
192
  function resolveAttemptCollector(context) {
@@ -382,6 +305,134 @@ function preserveVoterAttemptTelemetry(from, onto) {
382
305
  return initial === void 0 ? onto : withVoterAttemptTelemetry(onto, () => from.attemptTelemetry ?? initial);
383
306
  }
384
307
 
308
+ // src/cli/voter-model-overrides.ts
309
+ function voterModelOverrideEnvKey(role) {
310
+ return `NEXUS_VOTER_MODEL_${role.toUpperCase()}`;
311
+ }
312
+ function resolveVoterModelOverrides(roles, gatewayAdapters, logger12) {
313
+ const overrides = /* @__PURE__ */ new Map();
314
+ if (gatewayAdapters.length === 0) return overrides;
315
+ const byId = /* @__PURE__ */ new Map();
316
+ for (const adapter of gatewayAdapters) byId.set(adapter.modelId, adapter);
317
+ for (const role of roles) {
318
+ const envKey = voterModelOverrideEnvKey(role);
319
+ const raw = process.env[envKey];
320
+ if (raw === void 0 || raw.trim() === "") continue;
321
+ const requested = raw.trim();
322
+ const adapter = byId.get(requested) ?? gatewayAdapters.find((a) => a.modelId.toLowerCase() === requested.toLowerCase());
323
+ if (adapter === void 0) {
324
+ logger12.warn(
325
+ `Voter model override ${envKey}="${requested}" is not a discovered gateway model \u2014 falling back to round-robin for role "${role}".`,
326
+ { role, requested, available: [...byId.keys()] }
327
+ );
328
+ continue;
329
+ }
330
+ overrides.set(role, adapter);
331
+ }
332
+ if (overrides.size > 0) {
333
+ logger12.info("Applied per-role voter model overrides (#4055)", {
334
+ overrides: Object.fromEntries([...overrides].map(([r, a]) => [r, a.modelId]))
335
+ });
336
+ }
337
+ return overrides;
338
+ }
339
+ function ignoredRolePinReason(requested, options) {
340
+ const gateway = options.gatewayAdapters ?? [];
341
+ if (gateway.length === 0) {
342
+ return hasGatewaySlotCatalog() ? "gateway model dealing is inactive for this panel" : "no gateway active";
343
+ }
344
+ if (options.adapter !== void 0) return "an explicit adapter overrides gateway dealing";
345
+ if (options.roleAdapters !== void 0) return "the roster was assigned before this call";
346
+ if (gateway.length === 1) return "single-model gateway: role pins have no effect";
347
+ if (!gateway.some((a) => a.modelId.toLowerCase() === requested.toLowerCase())) {
348
+ return "not in the gateway catalog; the seat was dealt instead";
349
+ }
350
+ return void 0;
351
+ }
352
+ function ignoredCustomPin(gateway) {
353
+ const requested = process.env["NEXUS_CUSTOM_MODEL"]?.trim();
354
+ if (requested === void 0 || requested === "") return void 0;
355
+ if (gateway.length > 0) {
356
+ if (gateway.some((a) => a.modelId === requested)) return void 0;
357
+ } else {
358
+ const resolved = resolveGatewayDefault();
359
+ if (resolved.kind === "inactive" || resolved.kind === "resolved" && resolved.via === "override") {
360
+ return void 0;
361
+ }
362
+ }
363
+ return `NEXUS_CUSTOM_MODEL="${requested}" ignored: not in the gateway catalog`;
364
+ }
365
+ function captureModelPinWarnings(options) {
366
+ const ignored = /* @__PURE__ */ new Map();
367
+ const custom = ignoredCustomPin(options.gatewayAdapters ?? []);
368
+ for (const role of options.roles) {
369
+ const key = voterModelOverrideEnvKey(role);
370
+ const requested = process.env[key]?.trim();
371
+ let roleWarning;
372
+ if (requested !== void 0 && requested !== "") {
373
+ const reason = ignoredRolePinReason(requested, options);
374
+ if (reason !== void 0) roleWarning = `${key}="${requested}" ignored: ${reason}`;
375
+ }
376
+ const warning = [roleWarning, custom].filter((w) => w !== void 0).join("; ");
377
+ if (warning !== "") ignored.set(role, warning);
378
+ }
379
+ return (vote) => {
380
+ const warning = ignored.get(vote.role);
381
+ if (warning === void 0) return vote;
382
+ return preserveVoterAttemptTelemetry(vote, {
383
+ ...vote,
384
+ modelPinWarning: `${warning}; role "${vote.role}" assigned model "${vote.pinnedModel ?? "unresolved"}".`
385
+ });
386
+ };
387
+ }
388
+
389
+ // src/cli/voter-cli-access.ts
390
+ var VOTER_ACCESS_MODE = "read-only-analysis";
391
+ function clisServingVoterSeats(clis, declarationsFor = (cli) => createCliAdapter({ cli })) {
392
+ const serving = [];
393
+ const refused = [];
394
+ for (const cli of clis) {
395
+ const enforces = adapterEnforces(declarationsFor(cli), { accessMode: VOTER_ACCESS_MODE });
396
+ (enforces ? serving : refused).push(cli);
397
+ }
398
+ return { serving, refused };
399
+ }
400
+
401
+ // src/cli/voter-fallback.ts
402
+ function bareCliName(id) {
403
+ return id.startsWith("cli-") ? id.slice("cli-".length) : id;
404
+ }
405
+ function classifyFallbackReason(message) {
406
+ if (isDurableCapacityText(message)) return "capacity";
407
+ if (isRateLimitText(message)) return "rate-limit";
408
+ if (classifyExtractedError(message, "unknown").code === "NOT_AUTHENTICATED") return "auth";
409
+ if (UNVERIFIABLE_STDERR_RE.test(message)) return "sandbox";
410
+ if (isTimeoutText(message)) return "timeout";
411
+ return "unknown";
412
+ }
413
+ function detectedModel(adapter) {
414
+ const id = adapter.modelId;
415
+ return typeof id === "string" && id !== "" && id !== UNRESOLVED_MODEL_ID ? id : void 0;
416
+ }
417
+ function assignedCliOf(key) {
418
+ return typeof key === "string" && key !== "" ? bareCliName(key) : void 0;
419
+ }
420
+ function crossCliFallback(assigned, assignedKey, error) {
421
+ const fromModel = detectedModel(assigned);
422
+ return {
423
+ fromCli: assignedCliOf(assignedKey) ?? "unknown",
424
+ ...fromModel !== void 0 ? { fromModel } : {},
425
+ reason: classifyFallbackReason(error)
426
+ };
427
+ }
428
+ function inFamilyFallback(cli, fromModel) {
429
+ return { fromCli: bareCliName(cli), fromModel, reason: "capacity" };
430
+ }
431
+ function withAssignedCli(result, assignedKey) {
432
+ const assignedCli = assignedCliOf(assignedKey);
433
+ return assignedCli === void 0 ? result : { ...result, assignedCli };
434
+ }
435
+
385
436
  // src/cli/voter-cancel.ts
386
437
  var SEAT_CANCELLED_MESSAGE = "cancelled while this voter was in flight";
387
438
  function isCancelled(signal) {
@@ -2305,6 +2356,7 @@ async function collectRealVotes(options) {
2305
2356
  if ("simulated" in adapterResult)
2306
2357
  return createSimulatedVotes(roles, proposal, "No adapter available");
2307
2358
  const roleAdapters = await assignPanelSeats(adapterResult.adapter, options, logger12);
2359
+ const discloseModelPins = captureModelPinWarnings(options);
2308
2360
  warnIfCodexConcurrencyExceeded(roleAdapters, logger12);
2309
2361
  const workspace = resolvePanelWorkspace(options.workspace);
2310
2362
  const { nonRetryableRoles, onError } = createVoterRetryState();
@@ -2335,7 +2387,7 @@ async function collectRealVotes(options) {
2335
2387
  options.erroredRoleBackoffMs ?? DEFAULT_ERRORED_ROLE_BACKOFF_MS
2336
2388
  );
2337
2389
  reportVoteIndependence(results, logger12);
2338
- return results;
2390
+ return results.map(discloseModelPins);
2339
2391
  }
2340
2392
 
2341
2393
  // src/cli/vote-artifact.ts
@@ -5948,6 +6000,15 @@ function panelDiversityOf(votes) {
5948
6000
  fallbacks: seatFallbacks(votes).length
5949
6001
  };
5950
6002
  }
6003
+ function assignedPanelDiversityOf(votes) {
6004
+ const models = votes.map((v) => v.pinnedModel).filter((m) => m !== void 0 && m !== "" && m !== UNRESOLVED_MODEL_ID);
6005
+ if (models.length === 0) return {};
6006
+ const families = models.map(vendorFamilyOf).filter((family) => family !== "unknown");
6007
+ return {
6008
+ assignedDistinctModels: countDistinctModels(models),
6009
+ assignedDistinctFamilies: new Set(families).size
6010
+ };
6011
+ }
5951
6012
  var MIN_PANEL_FOR_DIVERSITY_WARNING = 3;
5952
6013
  function singleModelPanelWarning(votes) {
5953
6014
  if (votes.length < MIN_PANEL_FOR_DIVERSITY_WARNING) return void 0;
@@ -6170,7 +6231,8 @@ function toAgentVoteSummary(result) {
6170
6231
  // #6246: and for what a recovered seat was retried from.
6171
6232
  ...result.retriedFrom !== void 0 ? { retriedFrom: result.retriedFrom } : {},
6172
6233
  // #6606: the per-seat model was only in `costSummary.perVoter`.
6173
- ...modelUsedOf(result)
6234
+ ...modelUsedOf(result),
6235
+ ...assignedModelOf(result)
6174
6236
  };
6175
6237
  }
6176
6238
  var MODEL_USED_MAX_CHARS = 100;
@@ -6181,6 +6243,13 @@ function modelUsedOf(result) {
6181
6243
  modelUsed: model.length <= MODEL_USED_MAX_CHARS ? model : `${model.slice(0, MODEL_USED_MAX_CHARS - 1)}\u2026`
6182
6244
  };
6183
6245
  }
6246
+ function assignedModelOf(result) {
6247
+ const model = result.pinnedModel;
6248
+ if (model === void 0 || model === "" || model === UNRESOLVED_MODEL_ID) return {};
6249
+ return {
6250
+ assignedModel: model.length <= MODEL_USED_MAX_CHARS ? model : `${model.slice(0, MODEL_USED_MAX_CHARS - 1)}\u2026`
6251
+ };
6252
+ }
6184
6253
  function panelDegradationWarning(errorCount, total) {
6185
6254
  if (errorCount <= 0 || errorCount >= total) return void 0;
6186
6255
  return `Panel degraded: ${String(errorCount)} of ${String(total)} voters errored; decision rests on ${String(total - errorCount)} voter(s).`;
@@ -6189,9 +6258,11 @@ function appendPanelWarning(response, text) {
6189
6258
  if (text === void 0) return;
6190
6259
  response.panelWarning = response.panelWarning === void 0 ? text : `${response.panelWarning} ${text}`;
6191
6260
  }
6192
- function unverifiableSeatsWarning(unverifiableCount, total) {
6261
+ function unverifiableSeatsWarning(unverifiableCount, total, artifactPath) {
6193
6262
  if (unverifiableCount <= 0) return void 0;
6194
- return `${String(unverifiableCount)} of ${String(total)} seat(s) could not read the artifact and are recorded as unverifiable (counted as abstain in voteCounts; any decision they returned was discarded).`;
6263
+ const warning = `${String(unverifiableCount)} of ${String(total)} seat(s) could not read the artifact and are recorded as unverifiable (counted as abstain in voteCounts; any decision they returned was discarded).`;
6264
+ if (artifactPath !== void 0) return warning;
6265
+ return `${warning} No artifactPath was supplied: voters only see the proposal text; pass artifactPath (or inline the artifact) so they can inspect it.`;
6195
6266
  }
6196
6267
  var degradedPanelCount = 0;
6197
6268
  function applyAbsoluteQuorumTelemetry(response, input, decision, degradeReason) {
@@ -6246,6 +6317,7 @@ function buildResponse(input, result, costSummary, voteRecord) {
6246
6317
  ...disclosedWorkspace(result),
6247
6318
  // #6115: always present — a panel nobody answered is explicit zeros.
6248
6319
  panelDiversity: panelDiversityOf(result.votes),
6320
+ ...assignedPanelDiversityOf(result.votes),
6249
6321
  // #3991: surface the authentic-vote-record persistence outcome so a skipped
6250
6322
  // or failed persist is visible to the MCP caller (was WARN-only).
6251
6323
  voteRecordPersisted: voteRecord?.persisted ?? false
@@ -6284,9 +6356,14 @@ function applyOptionalResponseFields(response, input, result, errorCount, costSu
6284
6356
  if (panelWarning !== void 0) {
6285
6357
  response.panelWarning = panelWarning;
6286
6358
  }
6359
+ for (const vote of result.votes) appendPanelWarning(response, vote.modelPinWarning);
6287
6360
  appendPanelWarning(
6288
6361
  response,
6289
- unverifiableSeatsWarning(response.voteCounts.unverifiable, result.votes.length)
6362
+ unverifiableSeatsWarning(
6363
+ response.voteCounts.unverifiable,
6364
+ result.votes.length,
6365
+ input.artifactPath
6366
+ )
6290
6367
  );
6291
6368
  appendPanelWarning(response, singleModelPanelWarning(result.votes));
6292
6369
  appendPanelWarning(response, singleFamilyPanelWarning(result.votes));
@@ -9344,6 +9421,7 @@ var CONSENSUS_VOTE_OUTPUT_SCHEMA = {
9344
9421
  reason: z15.enum(["rate-limit", "capacity", "auth", "timeout", "sandbox", "unknown"])
9345
9422
  }).optional(),
9346
9423
  modelUsed: z15.string().max(100).optional(),
9424
+ assignedModel: z15.string().max(100).optional(),
9347
9425
  rejectionCategories: z15.array(
9348
9426
  z15.enum([
9349
9427
  "YAGNI",
@@ -9412,6 +9490,10 @@ var CONSENSUS_VOTE_OUTPUT_SCHEMA = {
9412
9490
  unresolvedSeats: z15.number().int().nonnegative().optional(),
9413
9491
  fallbacks: z15.number().int().nonnegative()
9414
9492
  }).optional(),
9493
+ // Assigned roster includes errored and abstaining seats. Absent when no
9494
+ // assignment resolved, including a zero-seat roster.
9495
+ assignedDistinctModels: z15.number().int().nonnegative().optional(),
9496
+ assignedDistinctFamilies: z15.number().int().nonnegative().optional(),
9415
9497
  // #3855: per-decision cost rollup. Same omission as panelWarning (#4032) — it
9416
9498
  // is present on the response whenever cost recording succeeds (common in `api`
9417
9499
  // billing mode). Shared schema lives with the type (single source of truth).
@@ -9434,7 +9516,7 @@ var CONSENSUS_VOTE_OUTPUT_SCHEMA = {
9434
9516
  }).optional()
9435
9517
  };
9436
9518
  var CONSENSUS_VOTE_TOOL_SCHEMA = ConsensusVoteInputSchema.shape;
9437
- var CONSENSUS_VOTE_DESCRIPTION = "Execute multi-model consensus voting on a proposal. Uses 7 roles by default (architect, security, devex, ai_ml, pm, catfish, scope_steward) or 3 with quickMode (architect, security, scope_steward), voting with configurable strategies. higher_order does NOT decide the verdict by correlation-aware aggregation (#4701): approve/reject is a simple tally of the panel, so correlated voters each carry full independent weight. The Bayesian correlation analysis is computed and feeds contrarian escalation only. Choose it for the escalation behaviour, not for a weighted verdict. Supports async dispatch (dispatch: 'async') \u2014 returns a jobId to poll via get_job_result. Pass ratifies=<subject> to bind an authority-ladder ratification vote into its authentic record, and ratifiesPr={pr, headSha} to bind a governor-path PR ratification to the head the panel saw (#5130); the result carries voteRecordId for the caller-commits append. If your proposal asks voters to choose among named alternatives, you MUST pass them in `options` (#4472) \u2014 the threshold is then measured over WHICH option won, and the record carries the per-option tally plus selection coverage. WITHOUT `options` the tally is approve/reject/abstain only, so every voter who engages returns `approve` and a 6-1 split on which option persists as 7-0, 100% (#4452).";
9519
+ var CONSENSUS_VOTE_DESCRIPTION = "Execute multi-model consensus voting on a proposal. Uses 7 roles by default (architect, security, devex, ai_ml, pm, catfish, scope_steward) or 3 with quickMode (architect, security, scope_steward), voting with configurable strategies. higher_order does NOT decide the verdict by correlation-aware aggregation (#4701): approve/reject is a simple tally of the panel, so correlated voters each carry full independent weight. The Bayesian correlation analysis is computed and feeds contrarian escalation only. Choose it for the escalation behaviour, not for a weighted verdict. Supports async dispatch (dispatch: 'async') \u2014 returns a jobId to poll via get_job_result. Pass ratifies=<subject> to bind an authority-ladder ratification vote into its authentic record, and ratifiesPr={pr, headSha} to bind a governor-path PR ratification to the head the panel saw (#5130); the result carries voteRecordId for the caller-commits append. If your proposal asks voters to choose among named alternatives, you MUST pass them in `options` (#4472) \u2014 the threshold is then measured over WHICH option won, and the record carries the per-option tally plus selection coverage. WITHOUT `options` the tally is approve/reject/abstain only, so every voter who engages returns `approve` and a 6-1 split on which option persists as 7-0, 100% (#4452). The response separates responding panelDiversity from optional assignedDistinctModels and assignedDistinctFamilies, and votes[].assignedModel shows each resolved assignment, including errored or abstaining seats. Assignment counts are omitted when unmeasured. panelWarning names ignored model pins and includes an artifactPath hint when unverifiable seats had no supplied artifact.";
9438
9520
  function registerConsensusVoteTool(server, deps) {
9439
9521
  const logger12 = deps.logger ?? createLogger({ tool: "consensus_vote" });
9440
9522
  const notifier = deps.notifier ?? createMcpNotifier(server);
@@ -9577,4 +9659,4 @@ export {
9577
9659
  CONSENSUS_VOTE_TOOL_SCHEMA,
9578
9660
  registerConsensusVoteTool
9579
9661
  };
9580
- //# sourceMappingURL=chunk-GZHDEMLN.js.map
9662
+ //# sourceMappingURL=chunk-V5CYHQ7H.js.map