@duckcodeailabs/dql-agent 1.14.0 → 1.14.1

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 (146) hide show
  1. package/dist/agent-run-engine.d.ts +60 -2
  2. package/dist/agent-run-engine.d.ts.map +1 -1
  3. package/dist/agent-run-engine.js +333 -21
  4. package/dist/agent-run-engine.js.map +1 -1
  5. package/dist/agent-run-gates.d.ts.map +1 -1
  6. package/dist/agent-run-gates.js +13 -0
  7. package/dist/agent-run-gates.js.map +1 -1
  8. package/dist/agentic/analyst-loop.d.ts +91 -0
  9. package/dist/agentic/analyst-loop.d.ts.map +1 -0
  10. package/dist/agentic/analyst-loop.js +311 -0
  11. package/dist/agentic/analyst-loop.js.map +1 -0
  12. package/dist/agentic/assumptions.d.ts +62 -0
  13. package/dist/agentic/assumptions.d.ts.map +1 -0
  14. package/dist/agentic/assumptions.js +73 -0
  15. package/dist/agentic/assumptions.js.map +1 -0
  16. package/dist/agentic/business-explanation.d.ts +56 -0
  17. package/dist/agentic/business-explanation.d.ts.map +1 -0
  18. package/dist/agentic/business-explanation.js +130 -0
  19. package/dist/agentic/business-explanation.js.map +1 -0
  20. package/dist/agentic/identifier-ledger.d.ts +74 -0
  21. package/dist/agentic/identifier-ledger.d.ts.map +1 -0
  22. package/dist/agentic/identifier-ledger.js +151 -0
  23. package/dist/agentic/identifier-ledger.js.map +1 -0
  24. package/dist/agentic/ledger-tools.d.ts +68 -0
  25. package/dist/agentic/ledger-tools.d.ts.map +1 -0
  26. package/dist/agentic/ledger-tools.js +198 -0
  27. package/dist/agentic/ledger-tools.js.map +1 -0
  28. package/dist/agentic/orchestrator-policy.d.ts +60 -0
  29. package/dist/agentic/orchestrator-policy.d.ts.map +1 -0
  30. package/dist/agentic/orchestrator-policy.js +73 -0
  31. package/dist/agentic/orchestrator-policy.js.map +1 -0
  32. package/dist/agentic/orchestrator.d.ts +54 -0
  33. package/dist/agentic/orchestrator.d.ts.map +1 -0
  34. package/dist/agentic/orchestrator.js +67 -0
  35. package/dist/agentic/orchestrator.js.map +1 -0
  36. package/dist/agentic/preview-tool.d.ts +36 -0
  37. package/dist/agentic/preview-tool.d.ts.map +1 -0
  38. package/dist/agentic/preview-tool.js +71 -0
  39. package/dist/agentic/preview-tool.js.map +1 -0
  40. package/dist/agentic/rerank.d.ts +50 -0
  41. package/dist/agentic/rerank.d.ts.map +1 -0
  42. package/dist/agentic/rerank.js +140 -0
  43. package/dist/agentic/rerank.js.map +1 -0
  44. package/dist/agentic/research/hypothesis.d.ts +110 -0
  45. package/dist/agentic/research/hypothesis.d.ts.map +1 -0
  46. package/dist/agentic/research/hypothesis.js +125 -0
  47. package/dist/agentic/research/hypothesis.js.map +1 -0
  48. package/dist/agentic/research/synthesis.d.ts +32 -0
  49. package/dist/agentic/research/synthesis.d.ts.map +1 -0
  50. package/dist/agentic/research/synthesis.js +94 -0
  51. package/dist/agentic/research/synthesis.js.map +1 -0
  52. package/dist/agentic/research-agent.d.ts +54 -0
  53. package/dist/agentic/research-agent.d.ts.map +1 -0
  54. package/dist/agentic/research-agent.js +176 -0
  55. package/dist/agentic/research-agent.js.map +1 -0
  56. package/dist/agentic/sql-authorization.d.ts +131 -0
  57. package/dist/agentic/sql-authorization.d.ts.map +1 -0
  58. package/dist/agentic/sql-authorization.js +232 -0
  59. package/dist/agentic/sql-authorization.js.map +1 -0
  60. package/dist/agentic/tool-loop.d.ts +29 -0
  61. package/dist/agentic/tool-loop.d.ts.map +1 -1
  62. package/dist/agentic/tool-loop.js +129 -52
  63. package/dist/agentic/tool-loop.js.map +1 -1
  64. package/dist/agentic/toolset.d.ts.map +1 -1
  65. package/dist/agentic/toolset.js +155 -0
  66. package/dist/agentic/toolset.js.map +1 -1
  67. package/dist/agentic/turn-plan.d.ts +35 -0
  68. package/dist/agentic/turn-plan.d.ts.map +1 -0
  69. package/dist/agentic/turn-plan.js +108 -0
  70. package/dist/agentic/turn-plan.js.map +1 -0
  71. package/dist/agentic/value-probe.d.ts +89 -0
  72. package/dist/agentic/value-probe.d.ts.map +1 -0
  73. package/dist/agentic/value-probe.js +304 -0
  74. package/dist/agentic/value-probe.js.map +1 -0
  75. package/dist/analytical-orchestration.d.ts +80 -0
  76. package/dist/analytical-orchestration.d.ts.map +1 -1
  77. package/dist/analytical-orchestration.js +218 -6
  78. package/dist/analytical-orchestration.js.map +1 -1
  79. package/dist/analytical-request-policy.d.ts +26 -0
  80. package/dist/analytical-request-policy.d.ts.map +1 -0
  81. package/dist/analytical-request-policy.js +82 -0
  82. package/dist/analytical-request-policy.js.map +1 -0
  83. package/dist/analytical-result-facts.d.ts +13 -0
  84. package/dist/analytical-result-facts.d.ts.map +1 -1
  85. package/dist/analytical-result-facts.js +37 -1
  86. package/dist/analytical-result-facts.js.map +1 -1
  87. package/dist/answer-loop.d.ts +57 -16
  88. package/dist/answer-loop.d.ts.map +1 -1
  89. package/dist/answer-loop.js +161 -30
  90. package/dist/answer-loop.js.map +1 -1
  91. package/dist/cascade/budgets.d.ts.map +1 -1
  92. package/dist/cascade/budgets.js +8 -1
  93. package/dist/cascade/budgets.js.map +1 -1
  94. package/dist/cascade/packer.d.ts +88 -0
  95. package/dist/cascade/packer.d.ts.map +1 -0
  96. package/dist/cascade/packer.js +106 -0
  97. package/dist/cascade/packer.js.map +1 -0
  98. package/dist/conversation/result-ops.d.ts +18 -3
  99. package/dist/conversation/result-ops.d.ts.map +1 -1
  100. package/dist/conversation/result-ops.js +77 -5
  101. package/dist/conversation/result-ops.js.map +1 -1
  102. package/dist/conversation/rolling-summary.d.ts.map +1 -1
  103. package/dist/conversation/rolling-summary.js +7 -2
  104. package/dist/conversation/rolling-summary.js.map +1 -1
  105. package/dist/conversation/session-store.d.ts +3 -0
  106. package/dist/conversation/session-store.d.ts.map +1 -1
  107. package/dist/conversation/session-store.js +8 -4
  108. package/dist/conversation/session-store.js.map +1 -1
  109. package/dist/conversation/snapshot.d.ts.map +1 -1
  110. package/dist/conversation/snapshot.js +10 -1
  111. package/dist/conversation/snapshot.js.map +1 -1
  112. package/dist/hints/store.d.ts.map +1 -1
  113. package/dist/hints/store.js +15 -5
  114. package/dist/hints/store.js.map +1 -1
  115. package/dist/index.d.ts +27 -7
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +28 -5
  118. package/dist/index.js.map +1 -1
  119. package/dist/intent-controller.d.ts +8 -0
  120. package/dist/intent-controller.d.ts.map +1 -1
  121. package/dist/intent-controller.js +65 -0
  122. package/dist/intent-controller.js.map +1 -1
  123. package/dist/metadata/block-fit.d.ts +18 -0
  124. package/dist/metadata/block-fit.d.ts.map +1 -1
  125. package/dist/metadata/block-fit.js +41 -1
  126. package/dist/metadata/block-fit.js.map +1 -1
  127. package/dist/metadata/catalog.d.ts +20 -23
  128. package/dist/metadata/catalog.d.ts.map +1 -1
  129. package/dist/metadata/catalog.js +136 -11
  130. package/dist/metadata/catalog.js.map +1 -1
  131. package/dist/metadata/meaning-evidence.d.ts.map +1 -1
  132. package/dist/metadata/meaning-evidence.js +15 -7
  133. package/dist/metadata/meaning-evidence.js.map +1 -1
  134. package/dist/metadata/metric-match.d.ts +32 -0
  135. package/dist/metadata/metric-match.d.ts.map +1 -1
  136. package/dist/metadata/metric-match.js +120 -9
  137. package/dist/metadata/metric-match.js.map +1 -1
  138. package/dist/research-loop.d.ts +33 -2
  139. package/dist/research-loop.d.ts.map +1 -1
  140. package/dist/research-loop.js +44 -4
  141. package/dist/research-loop.js.map +1 -1
  142. package/dist/router.d.ts +28 -16
  143. package/dist/router.d.ts.map +1 -1
  144. package/dist/router.js +250 -17
  145. package/dist/router.js.map +1 -1
  146. package/package.json +4 -4
@@ -48,12 +48,31 @@ export interface ResearchPlan {
48
48
  budget: ResearchBudget;
49
49
  }
50
50
  export interface ResearchBudget {
51
- plannerCalls: 1;
51
+ /**
52
+ * Was the literal `1`, which made replanning unexpressible in the type system:
53
+ * an investigation could never respond to what it observed, because it could
54
+ * never call the planner again. Widened so a finding can redirect the run.
55
+ * The wall clock and the run budget remain the real ceiling.
56
+ */
57
+ plannerCalls: number;
52
58
  sqlExecutions: 6;
53
59
  repairs: 1;
54
60
  narratorCalls: 1;
55
- wallClockMs: 120_000;
61
+ /**
62
+ * Scaled by `DQL_AGENT_DEADLINE_SCALE`, like every other agent deadline. Was
63
+ * the literal `120_000`, which a local model exceeds during planning alone.
64
+ */
65
+ wallClockMs: number;
56
66
  }
67
+ /**
68
+ * The research wall clock, scaled.
69
+ *
70
+ * 120s assumes a hosted model. A local 27B needs ~2 minutes for the planning
71
+ * call alone, so an unscaled budget is exceeded before the first branch runs —
72
+ * the same reason `DQL_AGENT_DEADLINE_SCALE` exists for the Ask path. Scaling
73
+ * here keeps ONE knob rather than adding a second authority.
74
+ */
75
+ export declare function researchWallClockMs(): number;
57
76
  export declare const RESEARCH_BUDGET: ResearchBudget;
58
77
  /**
59
78
  * Plan how to handle a research / follow-up question. Returns the decision plus a
@@ -74,5 +93,17 @@ export declare function planResearch(input: {
74
93
  forceInvestigate?: boolean;
75
94
  /** Authoritative root plan. When present, research never re-matches meaning. */
76
95
  rootPlan?: ResolvedAnalyticalPlan;
96
+ /**
97
+ * Optional. With one, the investigation is planned as competing hypotheses
98
+ * about the question; without one, the deterministic template still runs, so
99
+ * research never depends on a provider being reachable.
100
+ */
101
+ provider?: {
102
+ generate(messages: {
103
+ role: 'system' | 'user' | 'assistant';
104
+ content: string;
105
+ }[], options?: Record<string, unknown>): Promise<string>;
106
+ };
107
+ signal?: AbortSignal;
77
108
  }): Promise<ResearchPlan>;
78
109
  //# sourceMappingURL=research-loop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"research-loop.d.ts","sourceRoot":"","sources":["../src/research-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,yFAAyF;AACzF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,IAAI,EAAE,eAAe,GAAG,cAAc,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,CAAC;QACxG,uEAAuE;QACvE,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,kDAAkD;IAClD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uFAAuF;IACvF,IAAI,EAAE,OAAO,CAAC;IACd,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,CAAC,CAAC;IAChB,aAAa,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,CAAC,CAAC;IACX,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,eAAe,EAAE,cAM7B,CAAC;AA8CF;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC,GAAG,OAAO,CAAC,YAAY,CAAC,CAgMxB"}
1
+ {"version":3,"file":"research-loop.d.ts","sourceRoot":"","sources":["../src/research-loop.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,yFAAyF;AACzF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,IAAI,EAAE,eAAe,GAAG,cAAc,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,CAAC;QACxG,uEAAuE;QACvE,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,kDAAkD;IAClD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uFAAuF;IACvF,IAAI,EAAE,OAAO,CAAC;IACd,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,CAAC,CAAC;IACX,aAAa,EAAE,CAAC,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,eAAO,MAAM,eAAe,EAAE,cAM7B,CAAC;AA8CF;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,EAAE;QACT,QAAQ,CACN,QAAQ,EAAE;YAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,EACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,CAAC;KACpB,CAAC;IACF,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiOxB"}
@@ -1,3 +1,5 @@
1
+ import { deadlineScale } from './agent-run-engine.js';
2
+ import { hypothesesToSteps, planResearchHypotheses } from './agentic/research-agent.js';
1
3
  /**
2
4
  * Research loop (P4) — a grounded, ReAct-style planner for "research / follow-up"
3
5
  * questions, so the agent behaves like a real assistant: it DECIDES whether to
@@ -13,12 +15,23 @@
13
15
  import { decideAgentAction } from './intent-controller.js';
14
16
  import { matchSemanticMetric } from './metadata/metric-match.js';
15
17
  import { authorityIdentitiesForKGNode } from './semantic-identities.js';
18
+ /**
19
+ * The research wall clock, scaled.
20
+ *
21
+ * 120s assumes a hosted model. A local 27B needs ~2 minutes for the planning
22
+ * call alone, so an unscaled budget is exceeded before the first branch runs —
23
+ * the same reason `DQL_AGENT_DEADLINE_SCALE` exists for the Ask path. Scaling
24
+ * here keeps ONE knob rather than adding a second authority.
25
+ */
26
+ export function researchWallClockMs() {
27
+ return Math.round(120_000 * deadlineScale());
28
+ }
16
29
  export const RESEARCH_BUDGET = {
17
- plannerCalls: 1,
30
+ plannerCalls: 2,
18
31
  sqlExecutions: 6,
19
32
  repairs: 1,
20
33
  narratorCalls: 1,
21
- wallClockMs: 120_000,
34
+ get wallClockMs() { return researchWallClockMs(); },
22
35
  };
23
36
  const TIME_DIM_RE = /(_at$|_date$|_time$|_ts$|^date$|^month$|^week$|^day$|ordered_at|created)/i;
24
37
  function humanize(name) {
@@ -219,11 +232,38 @@ export async function planResearch(input) {
219
232
  expectation: `Upstream models/metrics that feed ${label}.`,
220
233
  });
221
234
  }
235
+ // Hypotheses when a provider can produce them, the template otherwise.
236
+ // The template's steps are always a correct INVESTIGATION — baseline, trend,
237
+ // breakdown — but they are the same three regardless of what was asked, so
238
+ // the dossier reads as a report about a metric rather than an answer to a
239
+ // question. Hypotheses replace the steps only; grounding, budget, and the
240
+ // frozen root plan are unchanged, and an empty result keeps the template.
241
+ const hypothesisSteps = input.provider
242
+ ? hypothesesToSteps(await planResearchHypotheses(input.provider, input.question, {
243
+ metrics: input.metrics.map((metric) => metric.name),
244
+ blocks: input.blocks.map((block) => block.name),
245
+ dimensions: Array.from(new Set(input.blocks.flatMap((block) => [...(block.dimensions ?? []), ...(block.allowedFilters ?? [])]))),
246
+ }, {
247
+ ...(input.signal ? { signal: input.signal } : {}),
248
+ // Rides the same multiplier as every other agent deadline. Measured
249
+ // on a local 27B model: a four-hypothesis plan takes 122-149s WARM,
250
+ // so the 20s default guarantees a fallback to the template and the
251
+ // feature never runs at all on local hardware.
252
+ timeoutMs: Math.round(20_000 * deadlineScale()),
253
+ }))
254
+ : [];
255
+ if (process.env.DQL_ORCHESTRATOR_TRACE) {
256
+ console.warn(hypothesisSteps.length > 0
257
+ ? `[dql] research plan: ${hypothesisSteps.length} hypotheses — ${hypothesisSteps.map((step) => step.thought).join(' | ').slice(0, 220)}`
258
+ : `[dql] research plan: deterministic template (${steps.length} steps) — provider=${Boolean(input.provider)} metrics=${input.metrics.length} blocks=${input.blocks.length}`);
259
+ }
222
260
  return {
223
261
  decision: 'investigate',
224
262
  confidence: decision.confidence,
225
- rationale: decision.reason,
226
- steps,
263
+ rationale: hypothesisSteps.length > 0
264
+ ? `${decision.reason} Investigating ${hypothesisSteps.length} competing explanations.`
265
+ : decision.reason,
266
+ steps: hypothesisSteps.length > 0 ? hypothesisSteps : steps,
227
267
  sources: Array.from(sources),
228
268
  done: false,
229
269
  rootPlanId: input.rootPlan?.rootPlanId ?? input.rootPlan?.planId,
@@ -1 +1 @@
1
- {"version":3,"file":"research-loop.js","sourceRoot":"","sources":["../src/research-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"research-loop.js","sourceRoot":"","sources":["../src/research-loop.ts"],"names":[],"mappings":"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"}
package/dist/router.d.ts CHANGED
@@ -1,19 +1,4 @@
1
- /**
2
- * Hybrid router — deterministic-first, LLM-assisted for the ambiguous middle.
3
- *
4
- * The engine already routes deterministically via {@link decideAgentAction}. That
5
- * cascade is fast, offline, and confident for the clear cases (a strong certified
6
- * match, an explicit "build me a dashboard", an obvious greeting). But paraphrased
7
- * or implicit analytical asks land at low confidence and misroute — which is why
8
- * users end up clicking "Dig deeper" by hand.
9
- *
10
- * This router keeps the deterministic decision when it is confident (>= the
11
- * threshold) — so certified fast paths and greetings stay 0-LLM — and only spends
12
- * ONE cheap classification call when the heuristics are unsure. The completion is
13
- * injected (provider-agnostic, like the planner and narrator); any failure falls
14
- * back to the deterministic decision unchanged. Results are cached so a repeated
15
- * question never pays twice.
16
- */
1
+ import { type AnswerAssumption } from './agentic/assumptions.js';
17
2
  import type { AgentRunRequest, AgentRouter } from "./agent-run-engine.js";
18
3
  import type { MetadataAgentIntent } from "./metadata/catalog.js";
19
4
  import { type AgentEvidenceCandidate, type AgentMeaningResolver, type AgentRetrievalEvidence, type MeaningResolution } from "./meaning-resolution.js";
@@ -102,6 +87,33 @@ export declare function collapseRedundantGovernedCandidates(question: string, ca
102
87
  * questions had no real ambiguity behind them.
103
88
  */
104
89
  export declare function bestGovernedInterpretation(question: string, candidates: AgentEvidenceCandidate[]): AgentEvidenceCandidate | undefined;
90
+ /**
91
+ * Pick the measure a bare ranking should assume, or nothing.
92
+ *
93
+ * Returns the CANDIDATE, not a decision, because the assumption is only useful
94
+ * where it can be bound: an `action: 'answer'` with no frozen analytical plan is
95
+ * refused by the plan boundary and reaches the user as `blocked` with no
96
+ * options, which is strictly worse than the clarification it replaced. Measured
97
+ * exactly that way before this was moved to a caller that can bind it.
98
+ */
99
+ export declare function assumableRankingMeasure(question: string, candidates: AgentEvidenceCandidate[]): {
100
+ candidate: AgentEvidenceCandidate;
101
+ assumption: AnswerAssumption;
102
+ } | undefined;
103
+ /**
104
+ * Does this ranking measure fit a question that named no measure?
105
+ *
106
+ * "Top customers" must not be silently answered by `top_beverage_customers`:
107
+ * that candidate carries a scope — beverages — the asker never asked for, and
108
+ * answering with it returns a confidently wrong list under a different question
109
+ * than the one posed. `assumeDominantCandidate` deliberately leaves this check
110
+ * to the caller, because dominance is about ranking and this is about meaning.
111
+ *
112
+ * The rule: every substantive token in the candidate's name must be either
113
+ * something the question already said, or generic measure vocabulary. Any
114
+ * leftover token is an unrequested qualifier, and the turn keeps asking.
115
+ */
116
+ export declare function rankingCandidateFitsBareQuestion(question: string, candidate: AgentEvidenceCandidate): boolean;
105
117
  /**
106
118
  * Build a retrieval-first hybrid router. Narrow conversational/app preflight is
107
119
  * deterministic. Every other turn loads structured evidence before any
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
package/dist/router.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { assumeDominantCandidate } from './agentic/assumptions.js';
1
2
  /**
2
3
  * Hybrid router — deterministic-first, LLM-assisted for the ambiguous middle.
3
4
  *
@@ -578,16 +579,26 @@ function routedClarificationQuestion(resolution, bindings, options) {
578
579
  ?? `Which governed binding should I use before running this query?`;
579
580
  }
580
581
  function continueCascadeAfterIncompleteSelection(base, evidence, candidates, selected) {
582
+ const selectedId = selected.qualifiedId ?? selected.id;
583
+ const message = `The selected governed meaning ${selectedId} does not prove the complete requested metric, dimension, filter, and grain tuple. DQL did not substitute a correlated metric or execute a different artifact.`;
581
584
  return {
582
585
  ...base,
583
- action: 'answer',
584
- confidence: 0.78,
585
- reason: `The user selected ${selected.name}, but that evidence does not prove the complete requested metric, dimension, filter, and grain tuple. The selection is consumed once; continue through the governed semantic/SQL cascade without dropping any requested part.`,
586
+ action: 'block',
587
+ confidence: 1,
588
+ reason: message,
586
589
  source: 'heuristic',
587
590
  category: 'data_lookup',
588
591
  depth: 'quick',
589
592
  retrievalEvidence: retrievalTrace(evidence, candidates),
590
593
  requiresClarification: false,
594
+ terminalOutcome: {
595
+ kind: 'modeling_gap',
596
+ code: 'ANALYTICAL_MODELING_GAP',
597
+ message,
598
+ candidateIds: [selectedId],
599
+ },
600
+ resolvedAnalyticalPlan: undefined,
601
+ meaningResolution: undefined,
591
602
  };
592
603
  }
593
604
  function enforceAnalyticalCompatibility(resolution, evidence, candidates) {
@@ -848,9 +859,10 @@ function rankingMetricChoiceDecision(base, evidence, candidates, selected, quest
848
859
  && candidate.kind === 'semantic_metric'
849
860
  && !isDegenerateRankingMetric(question, evidence, candidate))
850
861
  .slice(0, 3);
851
- const labels = options.length > 0
852
- ? options.map((candidate) => renderCandidateChoice(candidate)).join(' or ')
853
- : 'revenue, order count, or another measure available in the model';
862
+ if (options.length === 0) {
863
+ return unanswerableClarificationFallback(base, retrievalTrace(evidence, candidates), `${selected.name} counts customers and cannot rank them, and no alternative governed measure was retrieved, so DQL continued into the review-required generated lane instead of asking a question with no selectable answer.`);
864
+ }
865
+ const labels = options.map((candidate) => renderCandidateChoice(candidate)).join(' or ');
854
866
  return {
855
867
  ...base,
856
868
  action: 'clarify',
@@ -862,7 +874,7 @@ function rankingMetricChoiceDecision(base, evidence, candidates, selected, quest
862
874
  requiresClarification: true,
863
875
  reason: `${selected.name} counts customers; it cannot distinguish individual customers for a top-customer ranking.`,
864
876
  clarifyingQuestion: `That metric counts unique customers and cannot rank individual customers. Which measure should rank them: ${labels}?`,
865
- clarificationOptions: options.length > 0 ? buildClarificationOptions(options) : undefined,
877
+ clarificationOptions: buildClarificationOptions(options),
866
878
  retrievalEvidence: retrievalTrace(evidence, candidates),
867
879
  resolvedAnalyticalPlan: undefined,
868
880
  meaningResolution: undefined,
@@ -1042,6 +1054,19 @@ mayAssumeInterpretation = true) {
1042
1054
  : candidates.filter((candidate) => !isDegenerateRankingMetric(request.question, evidence, candidate));
1043
1055
  if (questionTypeFromText(request.question) === 'ranking'
1044
1056
  && !hasExplicitRankingMeasure(request.question, evidence)) {
1057
+ // Assume the measure where one is clearly indicated, and BIND it through the
1058
+ // same resolution path an explicit selection takes — an assumption that
1059
+ // cannot freeze a plan is refused downstream and surfaces as `blocked` with
1060
+ // no options, which is worse than the question it replaced.
1061
+ const assumed = mayAssumeInterpretation
1062
+ ? assumableRankingMeasure(request.question, rankingCandidates)
1063
+ : undefined;
1064
+ if (assumed) {
1065
+ return {
1066
+ ...routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, assumed.candidate, candidates), 'heuristic', request.question, planMode),
1067
+ assumptions: [assumed.assumption],
1068
+ };
1069
+ }
1045
1070
  return bareRankingClarification(base, retrievalTrace(evidence, candidates), request.question, evidence, rankingCandidates);
1046
1071
  }
1047
1072
  const exactCompatible = candidates.filter((candidate) => candidate.exactMatch
@@ -1321,9 +1346,60 @@ function deterministicPrePlanClarification(request, base, evidence, candidates)
1321
1346
  .sort((left, right) => right.relevanceScore - left.relevanceScore || left.id.localeCompare(right.id))
1322
1347
  .slice(0, 3);
1323
1348
  if (alternatives.length === 0) {
1324
- if (!asksForRanking || hasExplicitRankingMetric)
1349
+ // Bare rankings need a measure choice, not a dimension gap. Retain the
1350
+ // no-options escape hatch for BCM-like retrieval failures.
1351
+ if (asksForRanking && !hasExplicitRankingMetric) {
1352
+ return bareRankingClarification(base, retrievalEvidence, request.question, evidence, candidates);
1353
+ }
1354
+ // Parsed-intent hints can include inherited/default dimensions that the
1355
+ // user never asked for. Only turn a missing field into a product-facing
1356
+ // modeling gap when its wording is present in this turn; otherwise let
1357
+ // bounded meaning resolution preserve its own ambiguity contract.
1358
+ const normalizedQuestion = normalizeMetricPhrase(request.question);
1359
+ if (!missingDimensions.every((dimension) => normalizedQuestion.includes(dimension)))
1325
1360
  return undefined;
1326
- return bareRankingClarification(base, retrievalEvidence, request.question, evidence, candidates);
1361
+ const requestedLabel = missingDimensions.map((term) => `“${term}”`).join(' and ');
1362
+ const message = `The requested dimension ${requestedLabel} is not modeled in the certified blocks, semantic model, dbt manifest, or runtime schema searched for this question. Add or map ${requestedLabel} before retrying.`;
1363
+ return {
1364
+ ...base,
1365
+ action: 'block',
1366
+ confidence: 1,
1367
+ reason: message,
1368
+ source: 'heuristic',
1369
+ category: 'data_lookup',
1370
+ depth: 'quick',
1371
+ requiresClarification: false,
1372
+ retrievalEvidence,
1373
+ terminalOutcome: {
1374
+ kind: 'modeling_gap',
1375
+ code: 'ANALYTICAL_MODELING_GAP',
1376
+ message,
1377
+ candidateIds: [],
1378
+ },
1379
+ meaningResolution: {
1380
+ interpretedQuestion: request.question,
1381
+ questionType: questionTypeFromText(request.question),
1382
+ selectedConceptIds: [],
1383
+ queryIntent: {
1384
+ ...defaultQueryIntent(evidence),
1385
+ measures: evidence.parsedIntent?.measures ?? [],
1386
+ dimensions: evidence.parsedIntent?.dimensions ?? [],
1387
+ filters: evidence.parsedIntent?.filters ?? [],
1388
+ },
1389
+ rejectedCandidates: [],
1390
+ confidence: 'low',
1391
+ missingInformation: [message],
1392
+ recommendedRoute: 'clarify',
1393
+ compatibilityOutcome: 'modeling_gap',
1394
+ compatibilityFailures: missingDimensions.map((dimension) => ({
1395
+ code: 'MISSING_DIMENSION',
1396
+ field: dimension,
1397
+ message: `${dimension} is not modeled.`,
1398
+ candidateIds: [],
1399
+ })),
1400
+ },
1401
+ resolvedAnalyticalPlan: undefined,
1402
+ };
1327
1403
  }
1328
1404
  const requestedLabel = missingDimensions.map((term) => `“${term}”`).join(' and ');
1329
1405
  const alternativeLabels = alternatives.map(renderCandidateChoice);
@@ -1350,6 +1426,39 @@ function deterministicPrePlanClarification(request, base, evidence, candidates)
1350
1426
  }
1351
1427
  return undefined;
1352
1428
  }
1429
+ /**
1430
+ * A clarification with NO selectable options is unanswerable, and asking it is a
1431
+ * dead end rather than a safety measure.
1432
+ *
1433
+ * Reported from production: "who are the top customers for BCM" returned
1434
+ * "Top by which governed metric?" with zero choices. Answering it in prose
1435
+ * ("...who have top revenue") produced the IDENTICAL question again, because the
1436
+ * reply carries no `selectedEvidenceId` and re-enters the same path with the
1437
+ * same evidence. A question that can only be answered by clicking a button that
1438
+ * was never rendered loops forever.
1439
+ *
1440
+ * When the option list is empty the failure is in RETRIEVAL, not in the user's
1441
+ * phrasing, so continue into the review-required generated lane and let the
1442
+ * answer carry the caveat. `requiresClarification` is cleared deliberately:
1443
+ * leaving it set would make `answerAnywayRoute` treat this as material ambiguity
1444
+ * and re-block the turn.
1445
+ */
1446
+ function unanswerableClarificationFallback(base, retrievalEvidence, reason) {
1447
+ return {
1448
+ ...base,
1449
+ action: 'answer',
1450
+ confidence: Math.min(base.confidence, 0.5),
1451
+ source: 'heuristic',
1452
+ category: 'data_lookup',
1453
+ requiresClarification: false,
1454
+ clarifyingQuestion: undefined,
1455
+ clarificationOptions: undefined,
1456
+ reason,
1457
+ ...(retrievalEvidence ? { retrievalEvidence } : {}),
1458
+ resolvedAnalyticalPlan: undefined,
1459
+ meaningResolution: undefined,
1460
+ };
1461
+ }
1353
1462
  /**
1354
1463
  * "Top by which governed metric?" with NO choices is a dead end: the asker
1355
1464
  * cannot know which measures are both governed and valid at the ranked grain,
@@ -1365,7 +1474,101 @@ function deterministicPrePlanClarification(request, base, evidence, candidates)
1365
1474
  *
1366
1475
  * Acceptance: AGT-030.
1367
1476
  */
1368
- function bareRankingClarification(base, retrievalEvidence, question, evidence, candidates) {
1477
+ /**
1478
+ * Generic measure vocabulary: words that say HOW MUCH, never WHICH SUBSET.
1479
+ * A candidate built only from these adds no scope the asker did not state.
1480
+ */
1481
+ const GENERIC_MEASURE_TOKENS = new Set([
1482
+ 'revenue', 'spend', 'spending', 'sale', 'amount', 'value', 'total', 'sum',
1483
+ 'count', 'number', 'order', 'quantity', 'qty', 'price', 'cost', 'profit',
1484
+ 'margin', 'gross', 'net', 'lifetime', 'avg', 'average', 'mean', 'median', 'score',
1485
+ 'rate', 'ratio', 'percent', 'share', 'volume', 'unit', 'balance', 'pretax', 'ltv',
1486
+ 'top', 'rank', 'ranking', 'by', 'per', 'the', 'of', 'and',
1487
+ ]);
1488
+ /**
1489
+ * Crude, symmetric singularization. Applied to BOTH sides, so the only thing
1490
+ * that matters is that it agrees with itself — `address` becoming `addres` is
1491
+ * harmless when the question's `address` becomes `addres` too. Without it a
1492
+ * candidate named `customers.customer_value` is rejected against the question
1493
+ * "who are the top customers", because the singular `customer` is neither a
1494
+ * question word nor generic measure vocabulary. That is a morphology accident,
1495
+ * not an unrequested scope, and it silently refused good assumptions.
1496
+ */
1497
+ function singularize(token) {
1498
+ if (token.length > 3 && token.endsWith('ies'))
1499
+ return `${token.slice(0, -3)}y`;
1500
+ if (token.length > 3 && (token.endsWith('ses') || token.endsWith('xes') || token.endsWith('zes'))) {
1501
+ return token.slice(0, -2);
1502
+ }
1503
+ if (token.length > 2 && token.endsWith('s') && !token.endsWith('ss'))
1504
+ return token.slice(0, -1);
1505
+ return token;
1506
+ }
1507
+ /**
1508
+ * Pick the measure a bare ranking should assume, or nothing.
1509
+ *
1510
+ * Returns the CANDIDATE, not a decision, because the assumption is only useful
1511
+ * where it can be bound: an `action: 'answer'` with no frozen analytical plan is
1512
+ * refused by the plan boundary and reaches the user as `blocked` with no
1513
+ * options, which is strictly worse than the clarification it replaced. Measured
1514
+ * exactly that way before this was moved to a caller that can bind it.
1515
+ */
1516
+ export function assumableRankingMeasure(question, candidates) {
1517
+ // Only a MEASURE can be assumed. A certified block is a whole authored query,
1518
+ // not a ranking measure, so treating one as the answer to "by which metric?"
1519
+ // silently selects someone else's entire analysis.
1520
+ const assumable = candidates.filter((candidate) => (candidate.kind === 'semantic_metric' || candidate.kind === 'semantic_member')
1521
+ && candidate.compatibility !== 'incompatible'
1522
+ && rankingCandidateFitsBareQuestion(question, candidate));
1523
+ if (assumable.length === 0)
1524
+ return undefined;
1525
+ const assumption = assumeDominantCandidate({
1526
+ about: 'metric',
1527
+ candidates: assumable.map((candidate) => ({
1528
+ id: candidate.qualifiedId ?? candidate.id,
1529
+ label: candidate.name,
1530
+ score: candidate.relevanceScore,
1531
+ })),
1532
+ because: (chosen) => `"${chosen.label ?? chosen.id}" was the highest-ranked governed measure that can rank this entity, and it adds no filter the question did not ask for.`,
1533
+ });
1534
+ if (!assumption)
1535
+ return undefined;
1536
+ const chosen = assumable.find((candidate) => (candidate.qualifiedId ?? candidate.id) === assumption.chose);
1537
+ return chosen ? { candidate: chosen, assumption } : undefined;
1538
+ }
1539
+ /**
1540
+ * Does this ranking measure fit a question that named no measure?
1541
+ *
1542
+ * "Top customers" must not be silently answered by `top_beverage_customers`:
1543
+ * that candidate carries a scope — beverages — the asker never asked for, and
1544
+ * answering with it returns a confidently wrong list under a different question
1545
+ * than the one posed. `assumeDominantCandidate` deliberately leaves this check
1546
+ * to the caller, because dominance is about ranking and this is about meaning.
1547
+ *
1548
+ * The rule: every substantive token in the candidate's name must be either
1549
+ * something the question already said, or generic measure vocabulary. Any
1550
+ * leftover token is an unrequested qualifier, and the turn keeps asking.
1551
+ */
1552
+ export function rankingCandidateFitsBareQuestion(question, candidate) {
1553
+ const questionTokens = new Set(substantiveLexicalTokens(question).map(singularize));
1554
+ // Identities arrive source-qualified (`semantic:metric:orders.revenue`). The
1555
+ // `semantic`/`metric` prefix is plumbing, not vocabulary — tokenizing it would
1556
+ // make every candidate look scoped and refuse every assumption.
1557
+ const identity = (candidate.qualifiedId ?? candidate.id ?? '').split(':').at(-1) ?? '';
1558
+ const nameTokens = substantiveLexicalTokens([candidate.name, identity].join(' '));
1559
+ if (nameTokens.length === 0)
1560
+ return false;
1561
+ return nameTokens.map(singularize).every((token) => questionTokens.has(token) || GENERIC_MEASURE_TOKENS.has(token));
1562
+ }
1563
+ function bareRankingClarification(base, retrievalEvidence, question, evidence, candidates,
1564
+ /**
1565
+ * May this turn settle the measure by assumption rather than by asking?
1566
+ * False wherever the step whose job is to judge ambiguity has positively
1567
+ * reported some — assuming past a finding overrides it rather than filling a
1568
+ * gap, and AGT-017 already establishes that lexical rank alone must not
1569
+ * settle meaning when semantic judgment is unavailable.
1570
+ */
1571
+ mayAssume = true) {
1369
1572
  const rankingChoices = (candidates ?? []).filter((candidate) => {
1370
1573
  if (candidate.compatibility === 'incompatible')
1371
1574
  return false;
@@ -1397,6 +1600,9 @@ function bareRankingClarification(base, retrievalEvidence, question, evidence, c
1397
1600
  return false;
1398
1601
  return true;
1399
1602
  });
1603
+ if (rankingChoices.length === 0) {
1604
+ return unanswerableClarificationFallback(base, retrievalEvidence, 'No retrieved governed measure can rank this entity, so DQL continued into the review-required generated lane instead of asking a question with no selectable answer.');
1605
+ }
1400
1606
  return {
1401
1607
  ...base,
1402
1608
  action: 'clarify',
@@ -1408,9 +1614,7 @@ function bareRankingClarification(base, retrievalEvidence, question, evidence, c
1408
1614
  requiresClarification: true,
1409
1615
  clarifyingQuestion: 'Top by which governed metric?',
1410
1616
  retrievalEvidence,
1411
- ...(rankingChoices.length > 0
1412
- ? { clarificationOptions: buildClarificationOptions(rankingChoices) }
1413
- : {}),
1617
+ clarificationOptions: buildClarificationOptions(rankingChoices),
1414
1618
  resolvedAnalyticalPlan: undefined,
1415
1619
  meaningResolution: undefined,
1416
1620
  };
@@ -1807,9 +2011,20 @@ export function createHybridRouter(options = {}) {
1807
2011
  if (multiMetricPrimary) {
1808
2012
  return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, multiMetricPrimary, candidates), "heuristic", request.question, options.resolvedPlanMode ?? 'authoritative');
1809
2013
  }
1810
- const authoredExample = !shouldUseMeaningCall
1811
- ? authoritativeExactCertifiedExample(candidates)
1812
- : undefined;
2014
+ // THE FAST LANE. Evaluated regardless of `shouldUseMeaningCall`, so an
2015
+ // exact certified hit short-circuits BEFORE the ~10s meaning call
2016
+ // rather than paying for it. Previously this shortcut only applied
2017
+ // when the call was already being skipped, which meant a perfect
2018
+ // certified match — the cheapest, most certain answer DQL can give —
2019
+ // was also one of the slowest.
2020
+ //
2021
+ // The precondition is deliberately the strictest one available:
2022
+ // exactly one certified block, compatible, whose AUTHORED EXAMPLE the
2023
+ // question matches. `meaning-evidence.ts` sets that flag only for an
2024
+ // authored-example fit and explicitly notes it is the one signal that
2025
+ // may grant this shortcut — lexical equality to a block name does not
2026
+ // qualify.
2027
+ const authoredExample = authoritativeExactCertifiedExample(candidates);
1813
2028
  if (authoredExample) {
1814
2029
  return routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, authoredExample, candidates), 'heuristic', request.question, options.resolvedPlanMode ?? 'authoritative');
1815
2030
  }
@@ -1905,11 +2120,29 @@ export function createHybridRouter(options = {}) {
1905
2120
  && !hasExplicitRankingMeasure(request.question, evidence)
1906
2121
  && !resolutionResolvedRanking
1907
2122
  && !explicitRankingSelection) {
2123
+ // Meaning resolution ran here. If it named the ranking
2124
+ // measure as the missing piece, that is its judgment and the
2125
+ // turn asks rather than guessing past it. Otherwise a clearly
2126
+ // indicated measure is assumed and BOUND through the same
2127
+ // resolution path an explicit selection takes — an assumption
2128
+ // that cannot freeze a plan is refused downstream and reaches
2129
+ // the reader as `blocked` with no options.
2130
+ const resolverFlagged = (safeResolution.missingInformation ?? [])
2131
+ .some((item) => /measure|metric/i.test(item));
2132
+ const assumedRanking = resolverFlagged
2133
+ ? undefined
2134
+ : assumableRankingMeasure(request.question, clarificationCandidates);
2135
+ if (assumedRanking) {
2136
+ return {
2137
+ ...routeDecisionForResolution(base, evidence, candidates, directResolution(request, evidence, assumedRanking.candidate, candidates), 'heuristic', request.question),
2138
+ assumptions: [assumedRanking.assumption],
2139
+ };
2140
+ }
1908
2141
  return bareRankingClarification(base, retrievalTrace(evidence, candidates), request.question, evidence,
1909
2142
  // Supplemental clarification cards carry the ranking
1910
2143
  // measures for the requested entity, which the execution
1911
2144
  // candidate set deliberately does not.
1912
- clarificationCandidates);
2145
+ clarificationCandidates, !resolverFlagged);
1913
2146
  }
1914
2147
  const deterministicGap = deterministicPrePlanClarification(request, base, evidence, clarificationCandidates);
1915
2148
  if (deterministicGap && safeResolution.recommendedRoute === 'clarify') {