@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.
- package/dist/agent-run-engine.d.ts +60 -2
- package/dist/agent-run-engine.d.ts.map +1 -1
- package/dist/agent-run-engine.js +333 -21
- package/dist/agent-run-engine.js.map +1 -1
- package/dist/agent-run-gates.d.ts.map +1 -1
- package/dist/agent-run-gates.js +13 -0
- package/dist/agent-run-gates.js.map +1 -1
- package/dist/agentic/analyst-loop.d.ts +91 -0
- package/dist/agentic/analyst-loop.d.ts.map +1 -0
- package/dist/agentic/analyst-loop.js +311 -0
- package/dist/agentic/analyst-loop.js.map +1 -0
- package/dist/agentic/assumptions.d.ts +62 -0
- package/dist/agentic/assumptions.d.ts.map +1 -0
- package/dist/agentic/assumptions.js +73 -0
- package/dist/agentic/assumptions.js.map +1 -0
- package/dist/agentic/business-explanation.d.ts +56 -0
- package/dist/agentic/business-explanation.d.ts.map +1 -0
- package/dist/agentic/business-explanation.js +130 -0
- package/dist/agentic/business-explanation.js.map +1 -0
- package/dist/agentic/identifier-ledger.d.ts +74 -0
- package/dist/agentic/identifier-ledger.d.ts.map +1 -0
- package/dist/agentic/identifier-ledger.js +151 -0
- package/dist/agentic/identifier-ledger.js.map +1 -0
- package/dist/agentic/ledger-tools.d.ts +68 -0
- package/dist/agentic/ledger-tools.d.ts.map +1 -0
- package/dist/agentic/ledger-tools.js +198 -0
- package/dist/agentic/ledger-tools.js.map +1 -0
- package/dist/agentic/orchestrator-policy.d.ts +60 -0
- package/dist/agentic/orchestrator-policy.d.ts.map +1 -0
- package/dist/agentic/orchestrator-policy.js +73 -0
- package/dist/agentic/orchestrator-policy.js.map +1 -0
- package/dist/agentic/orchestrator.d.ts +54 -0
- package/dist/agentic/orchestrator.d.ts.map +1 -0
- package/dist/agentic/orchestrator.js +67 -0
- package/dist/agentic/orchestrator.js.map +1 -0
- package/dist/agentic/preview-tool.d.ts +36 -0
- package/dist/agentic/preview-tool.d.ts.map +1 -0
- package/dist/agentic/preview-tool.js +71 -0
- package/dist/agentic/preview-tool.js.map +1 -0
- package/dist/agentic/rerank.d.ts +50 -0
- package/dist/agentic/rerank.d.ts.map +1 -0
- package/dist/agentic/rerank.js +140 -0
- package/dist/agentic/rerank.js.map +1 -0
- package/dist/agentic/research/hypothesis.d.ts +110 -0
- package/dist/agentic/research/hypothesis.d.ts.map +1 -0
- package/dist/agentic/research/hypothesis.js +125 -0
- package/dist/agentic/research/hypothesis.js.map +1 -0
- package/dist/agentic/research/synthesis.d.ts +32 -0
- package/dist/agentic/research/synthesis.d.ts.map +1 -0
- package/dist/agentic/research/synthesis.js +94 -0
- package/dist/agentic/research/synthesis.js.map +1 -0
- package/dist/agentic/research-agent.d.ts +54 -0
- package/dist/agentic/research-agent.d.ts.map +1 -0
- package/dist/agentic/research-agent.js +176 -0
- package/dist/agentic/research-agent.js.map +1 -0
- package/dist/agentic/sql-authorization.d.ts +131 -0
- package/dist/agentic/sql-authorization.d.ts.map +1 -0
- package/dist/agentic/sql-authorization.js +232 -0
- package/dist/agentic/sql-authorization.js.map +1 -0
- package/dist/agentic/tool-loop.d.ts +29 -0
- package/dist/agentic/tool-loop.d.ts.map +1 -1
- package/dist/agentic/tool-loop.js +129 -52
- package/dist/agentic/tool-loop.js.map +1 -1
- package/dist/agentic/toolset.d.ts.map +1 -1
- package/dist/agentic/toolset.js +155 -0
- package/dist/agentic/toolset.js.map +1 -1
- package/dist/agentic/turn-plan.d.ts +35 -0
- package/dist/agentic/turn-plan.d.ts.map +1 -0
- package/dist/agentic/turn-plan.js +108 -0
- package/dist/agentic/turn-plan.js.map +1 -0
- package/dist/agentic/value-probe.d.ts +89 -0
- package/dist/agentic/value-probe.d.ts.map +1 -0
- package/dist/agentic/value-probe.js +304 -0
- package/dist/agentic/value-probe.js.map +1 -0
- package/dist/analytical-orchestration.d.ts +80 -0
- package/dist/analytical-orchestration.d.ts.map +1 -1
- package/dist/analytical-orchestration.js +218 -6
- package/dist/analytical-orchestration.js.map +1 -1
- package/dist/analytical-request-policy.d.ts +26 -0
- package/dist/analytical-request-policy.d.ts.map +1 -0
- package/dist/analytical-request-policy.js +82 -0
- package/dist/analytical-request-policy.js.map +1 -0
- package/dist/analytical-result-facts.d.ts +13 -0
- package/dist/analytical-result-facts.d.ts.map +1 -1
- package/dist/analytical-result-facts.js +37 -1
- package/dist/analytical-result-facts.js.map +1 -1
- package/dist/answer-loop.d.ts +57 -16
- package/dist/answer-loop.d.ts.map +1 -1
- package/dist/answer-loop.js +161 -30
- package/dist/answer-loop.js.map +1 -1
- package/dist/cascade/budgets.d.ts.map +1 -1
- package/dist/cascade/budgets.js +8 -1
- package/dist/cascade/budgets.js.map +1 -1
- package/dist/cascade/packer.d.ts +88 -0
- package/dist/cascade/packer.d.ts.map +1 -0
- package/dist/cascade/packer.js +106 -0
- package/dist/cascade/packer.js.map +1 -0
- package/dist/conversation/result-ops.d.ts +18 -3
- package/dist/conversation/result-ops.d.ts.map +1 -1
- package/dist/conversation/result-ops.js +77 -5
- package/dist/conversation/result-ops.js.map +1 -1
- package/dist/conversation/rolling-summary.d.ts.map +1 -1
- package/dist/conversation/rolling-summary.js +7 -2
- package/dist/conversation/rolling-summary.js.map +1 -1
- package/dist/conversation/session-store.d.ts +3 -0
- package/dist/conversation/session-store.d.ts.map +1 -1
- package/dist/conversation/session-store.js +8 -4
- package/dist/conversation/session-store.js.map +1 -1
- package/dist/conversation/snapshot.d.ts.map +1 -1
- package/dist/conversation/snapshot.js +10 -1
- package/dist/conversation/snapshot.js.map +1 -1
- package/dist/hints/store.d.ts.map +1 -1
- package/dist/hints/store.js +15 -5
- package/dist/hints/store.js.map +1 -1
- package/dist/index.d.ts +27 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -5
- package/dist/index.js.map +1 -1
- package/dist/intent-controller.d.ts +8 -0
- package/dist/intent-controller.d.ts.map +1 -1
- package/dist/intent-controller.js +65 -0
- package/dist/intent-controller.js.map +1 -1
- package/dist/metadata/block-fit.d.ts +18 -0
- package/dist/metadata/block-fit.d.ts.map +1 -1
- package/dist/metadata/block-fit.js +41 -1
- package/dist/metadata/block-fit.js.map +1 -1
- package/dist/metadata/catalog.d.ts +20 -23
- package/dist/metadata/catalog.d.ts.map +1 -1
- package/dist/metadata/catalog.js +136 -11
- package/dist/metadata/catalog.js.map +1 -1
- package/dist/metadata/meaning-evidence.d.ts.map +1 -1
- package/dist/metadata/meaning-evidence.js +15 -7
- package/dist/metadata/meaning-evidence.js.map +1 -1
- package/dist/metadata/metric-match.d.ts +32 -0
- package/dist/metadata/metric-match.d.ts.map +1 -1
- package/dist/metadata/metric-match.js +120 -9
- package/dist/metadata/metric-match.js.map +1 -1
- package/dist/research-loop.d.ts +33 -2
- package/dist/research-loop.d.ts.map +1 -1
- package/dist/research-loop.js +44 -4
- package/dist/research-loop.js.map +1 -1
- package/dist/router.d.ts +28 -16
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +250 -17
- package/dist/router.js.map +1 -1
- package/package.json +4 -4
package/dist/research-loop.d.ts
CHANGED
|
@@ -48,12 +48,31 @@ export interface ResearchPlan {
|
|
|
48
48
|
budget: ResearchBudget;
|
|
49
49
|
}
|
|
50
50
|
export interface ResearchBudget {
|
|
51
|
-
|
|
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
|
-
|
|
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":"
|
|
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"}
|
package/dist/research-loop.js
CHANGED
|
@@ -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:
|
|
30
|
+
plannerCalls: 2,
|
|
18
31
|
sqlExecutions: 6,
|
|
19
32
|
repairs: 1,
|
|
20
33
|
narratorCalls: 1,
|
|
21
|
-
wallClockMs
|
|
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:
|
|
226
|
-
|
|
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
|
package/dist/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA
|
|
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: '
|
|
584
|
-
confidence:
|
|
585
|
-
reason:
|
|
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
|
-
|
|
852
|
-
|
|
853
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
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') {
|