@konneal/engine 0.2.23 → 0.2.25

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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  handleAsk
3
- } from "./chunk-GZZWHWGM.js";
4
- import "./chunk-HXWDVAVN.js";
3
+ } from "./chunk-BWSH7VBG.js";
4
+ import "./chunk-6MHR5JI4.js";
5
5
  import "./chunk-FYGJDJPN.js";
6
6
  import "./chunk-RZ3UZVRR.js";
7
7
  import "./chunk-IOZAZA7Y.js";
@@ -23275,7 +23275,7 @@ async function retrieve(env, query, opts = {}) {
23275
23275
  let rq = opts.queryOverride?.trim() || u?.standalone_query?.trim() || folded;
23276
23276
  if (u?.process_intent) rq += processExpansion();
23277
23277
  const vectorP = rq === folded && opts.optimisticVec ? Promise.resolve(opts.optimisticVec) : rq === folded && opts.warmEmbed ? opts.warmEmbed.then((w) => w ?? embed(portModelRunner(env), MODELS.embed, rq)) : embed(portModelRunner(env), MODELS.embed, rq);
23278
- const lexicalP = lexicalPrefilter(env, rq).catch(() => []);
23278
+ const lexicalP = lexicalPrefilter(env, opts.lexicalBoost ? `${rq} ${opts.lexicalBoost}` : rq).catch(() => []);
23279
23279
  const [vector, lexicalHits0] = await Promise.all([vectorP, lexicalP]);
23280
23280
  const lexicalHits = opts.sealScope || opts.standardKeys ? lexicalHits0.filter(
23281
23281
  (h) => (!opts.sealScope || h.metadata.doc_number === opts.sealScope.doc_number && (!opts.sealScope.edition || h.metadata.edition === opts.sealScope.edition)) && standardKeyAllowed(h.metadata, opts.standardKeys)
@@ -27,7 +27,7 @@ import {
27
27
  syntheticUnderstanding,
28
28
  telemetry,
29
29
  understandQuery
30
- } from "./chunk-HXWDVAVN.js";
30
+ } from "./chunk-6MHR5JI4.js";
31
31
  import {
32
32
  corsHeaders,
33
33
  err,
@@ -827,7 +827,7 @@ function evaluateConditionSets(nodes, query) {
827
827
  verdict: "pass",
828
828
  matched: matched.map((m) => m.node_id),
829
829
  checks: matched[0].checks,
830
- note: `VERDICT: PASS \u2014 the stated combination (${kinds.join(", ")}) matches severity set(s) ${matched.map((m) => m.node_id).join(", ")}. Present this verdict and cite the set's clause.`
830
+ note: `VERDICT: PASS \u2014 the stated combination (${kinds.join(", ")}) matches a severity set (${matched[0].checks.map((c) => c.band).join("; ")}). Present this verdict and cite the set's clause. The machine set identifier rides the verdict block as data \u2014 never write it in your prose.`
831
831
  };
832
832
  }
833
833
  const nearest = scored[0];
@@ -836,7 +836,7 @@ function evaluateConditionSets(nodes, query) {
836
836
  matched: [],
837
837
  nearest: { node_id: nearest.node_id, distance: Number(nearest.distance.toFixed(2)), bands: nearest.checks.map((c) => c.band) },
838
838
  checks: nearest.checks,
839
- note: `VERDICT: FAIL \u2014 no severity set admits the stated combination. The nearest set is ${nearest.node_id} (bands: ${nearest.checks.map((c) => c.band).join("; ")}). Say the combination is outside the menu and name the nearest set; never soften it.`
839
+ note: `VERDICT: FAIL \u2014 no severity set admits the stated combination. The nearest set (bands: ${nearest.checks.map((c) => c.band).join("; ")}) is the closest match. Say the combination is outside the menu and describe the nearest set's bands; never soften it. The machine set identifier rides the verdict block as data \u2014 never write it in your prose.`
840
840
  };
841
841
  }
842
842
 
@@ -985,7 +985,7 @@ function evaluateAggregation(nodes, query) {
985
985
  const rawTitle = String(content.name ?? content.definition ?? node.node_id.replace("/table/", ""));
986
986
  const cut = rawTitle.indexOf(" (");
987
987
  const tableTitle = cut > 0 ? rawTitle.slice(0, cut) : rawTitle.slice(0, 120);
988
- const cite = (what) => `COMPUTED (${operation}) \u2014 ${what}, read from the typed table "${tableTitle}" (${node.node_id}). Present this result and cite the table's clause; the value is machine-computed from the table payload, do not recompute or round it differently.`;
988
+ const cite = (what) => `COMPUTED (${operation}) \u2014 ${what}, read from the typed table "${tableTitle}". Present this result and cite the table's clause; the value is machine-computed from the table payload, do not recompute or round it differently. The machine table identifier rides the verdict block as data \u2014 never write it in your prose.`;
989
989
  if (operation === "count") {
990
990
  const cc2 = classColumn(cols);
991
991
  if (cc2 && /\bclasses?\b/.test(qLower) && tokens(cc2.name).some((t) => t.length >= 3 && qLower.includes(t))) {
@@ -2013,10 +2013,12 @@ ${summary}` }] : [],
2013
2013
  } : null;
2014
2014
  if (aggregationVerdict) console.log("aggregation engine:", aggregationVerdict.operation, aggregationVerdict.table, "\u2192", aggregationVerdict.value);
2015
2015
  let boundaryNote = null;
2016
+ let boundaryBoost;
2016
2017
  if (P().sources?.licensed?.length) {
2017
2018
  const match = matchLicensedTopic(q.query, P().sources.licensed);
2018
2019
  if (match && !(standardKeys?.has(match.entry.key) ?? false)) {
2019
2020
  const docNum = match.entry.doc_number ?? "";
2021
+ boundaryBoost = docNum || void 0;
2020
2022
  let citing = [];
2021
2023
  if (docNum) {
2022
2024
  const rows = await env.DB.prepare(
@@ -2062,7 +2064,8 @@ Answer account questions from these records ONLY: name the record when you use i
2062
2064
  optimisticHits,
2063
2065
  optimisticVec,
2064
2066
  datasetScope: narrowed ? corpora : null,
2065
- standardKeys
2067
+ standardKeys,
2068
+ lexicalBoost: boundaryBoost
2066
2069
  });
2067
2070
  stageTiming["retrieve-core"] = Date.now() - tR;
2068
2071
  console.log("stage: retrieve", Date.now() - tR, "ms");
@@ -2086,7 +2089,7 @@ Answer account questions from these records ONLY: name the record when you use i
2086
2089
  if (grade === "weak" && understanding?.docidentifier) {
2087
2090
  const broaden = `${understanding.standalone_query || q.query} ${understanding.docidentifier}`.trim();
2088
2091
  const tc = Date.now();
2089
- const second = await retrieve(env, q.query, { prev, understanding, queryOverride: broaden, federate, datasetScope: narrowed ? corpora : null, standardKeys, sealScope: declaredScoped ? docScope : null });
2092
+ const second = await retrieve(env, q.query, { prev, understanding, queryOverride: broaden, federate, datasetScope: narrowed ? corpora : null, standardKeys, sealScope: declaredScoped ? docScope : null, lexicalBoost: boundaryBoost });
2090
2093
  const grade2 = await gradeRetrieval(env.AI, roleModel(env, "grader"), q.query, second.hits.map((h) => h.text));
2091
2094
  stageTiming.corrective = Date.now() - tc;
2092
2095
  if (grade2 === "good") retrieved = second;
@@ -7,7 +7,7 @@ import {
7
7
  sessionFrom,
8
8
  telemetry,
9
9
  understandQuery
10
- } from "./chunk-HXWDVAVN.js";
10
+ } from "./chunk-6MHR5JI4.js";
11
11
  import {
12
12
  corsHeaders,
13
13
  err,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  handleSearch
3
- } from "./chunk-PZLYPUYJ.js";
4
- import "./chunk-HXWDVAVN.js";
3
+ } from "./chunk-WQ2PYIWK.js";
4
+ import "./chunk-6MHR5JI4.js";
5
5
  import "./chunk-FYGJDJPN.js";
6
6
  import "./chunk-RZ3UZVRR.js";
7
7
  import "./chunk-IOZAZA7Y.js";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  handleSearch
3
- } from "../../chunk-PZLYPUYJ.js";
3
+ } from "../../chunk-WQ2PYIWK.js";
4
4
  import {
5
5
  checkQuoteAnchors,
6
6
  handleAsk,
7
7
  handleMemories,
8
8
  scoreJudge,
9
9
  standardForDocNumber
10
- } from "../../chunk-GZZWHWGM.js";
10
+ } from "../../chunk-BWSH7VBG.js";
11
11
  import {
12
12
  buildMessages,
13
13
  citations,
@@ -29,7 +29,7 @@ import {
29
29
  sessionFrom,
30
30
  telemetry,
31
31
  understandQuery
32
- } from "../../chunk-HXWDVAVN.js";
32
+ } from "../../chunk-6MHR5JI4.js";
33
33
  import {
34
34
  authenticate,
35
35
  corsHeaders,
@@ -979,7 +979,7 @@ async function handleMcp(env, ctx, req, tier, key) {
979
979
  // stream:false forces the JSON lane (anon defaults to SSE)
980
980
  body: JSON.stringify({ ...args, stream: false })
981
981
  });
982
- const res = name === "ask" ? await (await import("../../ask-U3DLB37U.js")).handleAsk(env, ctx, inner, tier, key) : await (await import("../../search-OJ776DMH.js")).handleSearch(env, ctx, inner, tier, key);
982
+ const res = name === "ask" ? await (await import("../../ask-YE2L3Q5H.js")).handleAsk(env, ctx, inner, tier, key) : await (await import("../../search-I26YUVSP.js")).handleSearch(env, ctx, inner, tier, key);
983
983
  return res.json().catch(() => ({ error: { message: "tool transport failed", status: res.status } }));
984
984
  });
985
985
  if (out.ok && "accepted" in out) return new Response(null, { status: 202 });
package/package.json CHANGED
@@ -27,7 +27,7 @@
27
27
  "playwright": "^1.62.1",
28
28
  "yaml": "^2.9.1"
29
29
  },
30
- "version": "0.2.23",
30
+ "version": "0.2.25",
31
31
  "description": "The Konneal engine: the publisher-agnostic build pipeline and API plane for standards intelligence (retrieval, answer contract, verdicts, evaluation).",
32
32
  "license": "BSD-3-Clause",
33
33
  "type": "module",
@@ -222,7 +222,7 @@ export function evaluateAggregation(
222
222
  const tableTitle = cut > 0 ? rawTitle.slice(0, cut) : rawTitle.slice(0, 120);
223
223
 
224
224
  const cite = (what: string) =>
225
- `COMPUTED (${operation}) — ${what}, read from the typed table "${tableTitle}" (${node.node_id}). Present this result and cite the table's clause; the value is machine-computed from the table payload, do not recompute or round it differently.`;
225
+ `COMPUTED (${operation}) — ${what}, read from the typed table "${tableTitle}". Present this result and cite the table's clause; the value is machine-computed from the table payload, do not recompute or round it differently. The machine table identifier rides the verdict block as data — never write it in your prose.`;
226
226
 
227
227
  if (operation === "count") {
228
228
  const cc = classColumn(cols);
@@ -853,10 +853,16 @@ async function handleAsk(
853
853
  // reference the licensed document, and the note instructs the model
854
854
  // to attribute, never to recite the licensed parameters.
855
855
  let boundaryNote: string | null = null;
856
+ // the boost rides RETRIEVAL (the lexical lane below): chunks whose
857
+ // prose references the licensed document — the referencing
858
+ // publication's own clause — surface for a question the document's
859
+ // vocabulary alone would miss
860
+ let boundaryBoost: string | undefined;
856
861
  if (P().sources?.licensed?.length) {
857
862
  const match = matchLicensedTopic(q.query, P().sources.licensed);
858
863
  if (match && !(standardKeys?.has(match.entry.key) ?? false)) {
859
864
  const docNum = match.entry.doc_number ?? "";
865
+ boundaryBoost = docNum || undefined;
860
866
  let citing: string[] = [];
861
867
  if (docNum) {
862
868
  const rows = await env.DB.prepare(
@@ -923,7 +929,7 @@ async function handleAsk(
923
929
  // publications there).
924
930
  retrieved = await retrieve(env, q.query, { prev, understanding, federate, warmEmbed, graphDocNumbers,
925
931
  sealScope: declaredScoped ? docScope : null, optimisticHits, optimisticVec,
926
- datasetScope: narrowed ? corpora : null, standardKeys });
932
+ datasetScope: narrowed ? corpora : null, standardKeys, lexicalBoost: boundaryBoost });
927
933
  stageTiming["retrieve-core"] = Date.now() - tR;
928
934
  console.log("stage: retrieve", Date.now() - tR, "ms");
929
935
  // ── TTFT surgery: the two post-retrieval LLM calls run IN PARALLEL —
@@ -957,7 +963,7 @@ async function handleAsk(
957
963
  if (grade === "weak" && understanding?.docidentifier) {
958
964
  const broaden = `${understanding.standalone_query || q.query} ${understanding.docidentifier}`.trim();
959
965
  const tc = Date.now();
960
- const second = await retrieve(env, q.query, { prev, understanding, queryOverride: broaden, federate, datasetScope: narrowed ? corpora : null, standardKeys, sealScope: declaredScoped ? docScope : null });
966
+ const second = await retrieve(env, q.query, { prev, understanding, queryOverride: broaden, federate, datasetScope: narrowed ? corpora : null, standardKeys, sealScope: declaredScoped ? docScope : null, lexicalBoost: boundaryBoost });
961
967
  const grade2 = await gradeRetrieval(env.AI, roleModel(env, "grader"), q.query, second.hits.map((h: Hit) => h.text));
962
968
  stageTiming.corrective = Date.now() - tc;
963
969
  if (grade2 === "good") retrieved = second; // corrective retry must be strictly better
@@ -118,7 +118,7 @@ export function evaluateConditionSets(
118
118
  verdict: "pass",
119
119
  matched: matched.map((m) => m.node_id),
120
120
  checks: matched[0]!.checks,
121
- note: `VERDICT: PASS — the stated combination (${kinds.join(", ")}) matches severity set(s) ${matched.map((m) => m.node_id).join(", ")}. Present this verdict and cite the set's clause.`,
121
+ note: `VERDICT: PASS — the stated combination (${kinds.join(", ")}) matches a severity set (${matched[0]!.checks.map((c) => c.band).join("; ")}). Present this verdict and cite the set's clause. The machine set identifier rides the verdict block as data — never write it in your prose.`,
122
122
  };
123
123
  }
124
124
  const nearest = scored[0]!;
@@ -127,6 +127,6 @@ export function evaluateConditionSets(
127
127
  matched: [],
128
128
  nearest: { node_id: nearest.node_id, distance: Number(nearest.distance.toFixed(2)), bands: nearest.checks.map((c) => c.band) },
129
129
  checks: nearest.checks,
130
- note: `VERDICT: FAIL — no severity set admits the stated combination. The nearest set is ${nearest.node_id} (bands: ${nearest.checks.map((c) => c.band).join("; ")}). Say the combination is outside the menu and name the nearest set; never soften it.`,
130
+ note: `VERDICT: FAIL — no severity set admits the stated combination. The nearest set (bands: ${nearest.checks.map((c) => c.band).join("; ")}) is the closest match. Say the combination is outside the menu and describe the nearest set's bands; never soften it. The machine set identifier rides the verdict block as data — never write it in your prose.`,
131
131
  };
132
132
  }
@@ -120,7 +120,7 @@ export async function retrieve(
120
120
  : rq === folded && opts.warmEmbed
121
121
  ? opts.warmEmbed.then((w) => w ?? embed(portModelRunner(env), MODELS.embed, rq))
122
122
  : embed(portModelRunner(env), MODELS.embed, rq);
123
- const lexicalP = lexicalPrefilter(env, rq).catch(() => [] as Hit[]);
123
+ const lexicalP = lexicalPrefilter(env, opts.lexicalBoost ? `${rq} ${opts.lexicalBoost}` : rq).catch(() => [] as Hit[]);
124
124
  const [vector, lexicalHits0] = await Promise.all([vectorP, lexicalP]);
125
125
  // The declared context's seal binds the lexical lane at the SOURCE: the
126
126
  // RRF fusion mixes the full-corpus lexical ranking straight into the
@@ -12,6 +12,11 @@ export interface RetrieveOptions {
12
12
  prev?: string;
13
13
  understanding?: QueryUnderstanding | null;
14
14
  queryOverride?: string;
15
+ /** Extra terms appended to the LEXICAL lane's query only (never the
16
+ * dense vector): the licensed-boundary boost — chunks whose prose
17
+ * references the licensed document surface for a question the
18
+ * document's own vocabulary would otherwise miss. */
19
+ lexicalBoost?: string;
15
20
  federate?: (query: string) => Promise<Hit[]>;
16
21
  warmEmbed?: Promise<number[] | null>;
17
22
  graphDocNumbers?: string[];