@konneal/engine 0.2.109 → 0.2.111

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-G4KBK5XZ.js";
4
- import "./chunk-G56TYXNN.js";
3
+ } from "./chunk-Y6X5WLCZ.js";
4
+ import "./chunk-32UDKBA2.js";
5
5
  import "./chunk-2R7OVYAO.js";
6
6
  import "./chunk-TH5XGPD5.js";
7
7
  import "./chunk-DJ65EF5G.js";
@@ -243,6 +243,7 @@ function extractChecks(content) {
243
243
  if (b) out.push(b);
244
244
  };
245
245
  push(c.check);
246
+ push(c.expression);
246
247
  push(c.limit?.expression);
247
248
  push(c.acceptance_criteria?.limit && !c.acceptance_criteria.limit.expression?.includes("ocl{") ? null : c.acceptance_criteria?.limit?.expression);
248
249
  const st = c.acceptance_criteria?.limit;
@@ -19,7 +19,7 @@ import {
19
19
  tableRetyped,
20
20
  toolNote,
21
21
  verdictNote
22
- } from "./chunk-G56TYXNN.js";
22
+ } from "./chunk-32UDKBA2.js";
23
23
  import {
24
24
  NO_CONTEXT,
25
25
  STAGE_NAMES,
@@ -1390,8 +1390,8 @@ function routeFor(u, query) {
1390
1390
  if ((u?.sub_queries ?? []).length > 0) features.push("sub-queries");
1391
1391
  if (u?.process_intent) features.push("process-intent");
1392
1392
  if (words > ROUTE_FAST_WORD_CAP) features.push("long-question");
1393
- if (features.length) return { route: "deep", features };
1394
1393
  if (u?.doc_number) features.push("doc-scoped");
1394
+ if (features.length) return { route: "deep", features };
1395
1395
  if (u?.term) features.push("definitional");
1396
1396
  if ((u?.defined_terms ?? []).length > 0) features.push("terminology");
1397
1397
  features.push("short-question");
@@ -4,7 +4,7 @@ import {
4
4
  parseToolCall,
5
5
  runTool,
6
6
  toolNote
7
- } from "./chunk-G56TYXNN.js";
7
+ } from "./chunk-32UDKBA2.js";
8
8
  import "./chunk-TH5XGPD5.js";
9
9
  import "./chunk-4NXH5ZI6.js";
10
10
  import "./chunk-VT7DR6NQ.js";
@@ -4,12 +4,12 @@ import {
4
4
  handleMemories,
5
5
  scoreFaithfulness,
6
6
  scoreJudge
7
- } from "../../chunk-G4KBK5XZ.js";
7
+ } from "../../chunk-Y6X5WLCZ.js";
8
8
  import {
9
9
  TOOLS_REGISTRY,
10
10
  bindModelNode,
11
11
  modelGroundingBlock
12
- } from "../../chunk-G56TYXNN.js";
12
+ } from "../../chunk-32UDKBA2.js";
13
13
  import {
14
14
  handleSearch
15
15
  } from "../../chunk-HAU5INEJ.js";
@@ -994,13 +994,13 @@ async function callToolOnce(env, ctx, _req, tier, key, name, args, t0) {
994
994
  // stream:false forces the JSON lane (anon defaults to SSE)
995
995
  body: JSON.stringify({ ...args, stream: false })
996
996
  });
997
- const { runTool, TOOLS_REGISTRY: TOOLS_REGISTRY2 } = await import("../../tools-WSWEGJVQ.js");
997
+ const { runTool, TOOLS_REGISTRY: TOOLS_REGISTRY2 } = await import("../../tools-GSLHFD37.js");
998
998
  let payload;
999
999
  if (TOOLS_REGISTRY2.some((t) => t.name === name && t.audiences.includes("mcp"))) {
1000
1000
  const r = await runTool({ ...env, DB: env.DB }, { name, args }, "mcp");
1001
1001
  payload = r ? { tool: r.name, query: r.query, result: r.output } : { error: { message: `tool ${name} returned nothing for the given arguments` } };
1002
1002
  } else {
1003
- const res = name === "ask" ? await (await import("../../ask-EAKLN77G.js")).handleAsk(env, ctx, inner, tier, key) : await (await import("../../search-HKGN7F3O.js")).handleSearch(env, ctx, inner, tier, key);
1003
+ const res = name === "ask" ? await (await import("../../ask-6FXTHCMS.js")).handleAsk(env, ctx, inner, tier, key) : await (await import("../../search-HKGN7F3O.js")).handleSearch(env, ctx, inner, tier, key);
1004
1004
  payload = await res.json().catch(() => ({ error: { message: "tool transport failed", status: res.status } }));
1005
1005
  }
1006
1006
  telemetry(env, ctx, tier, `mcp:${name}`, null, !payload?.error, JSON.stringify(payload).length, await sha256Hex(`${name}:${JSON.stringify(args ?? {})}`), void 0, void 0, { durationMs: Date.now() - t0 });
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.109",
30
+ "version": "0.2.111",
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",
@@ -56,14 +56,24 @@ export function routeFor(u: RouteFeatures | null, query: string): {
56
56
  if ((u?.sub_queries ?? []).length > 0) features.push("sub-queries");
57
57
  if (u?.process_intent) features.push("process-intent");
58
58
  if (words > ROUTE_FAST_WORD_CAP) features.push("long-question");
59
+ // a document scope (named in the question OR declared by a context
60
+ // chip — the chip writes the same understanding fields) NARROWS the
61
+ // candidate pool structurally: the dense filter does the scoping, and
62
+ // the sealed/narrowed pool needs every lane feeding it (the
63
+ // multi-query variants are its redundancy). The 2026-10-08 gate
64
+ // caught this class: ctx-entity-r60, chip-declared and routed fast,
65
+ // refused intermittently — a starved sealed pool (the 2026-09-08
66
+ // diagnosis's shape). Scoped questions ride deep until the grid
67
+ // prices the lanes against a sealed pool.
68
+ if (u?.doc_number) features.push("doc-scoped");
59
69
  if (features.length) return { route: "deep", features };
60
70
 
61
- // FAST — everything else: a question within the word cap rides the
62
- // fast registry. The conservative direction is structural here: the
63
- // long, the complex, the multi-perspective and the process-shaped all
64
- // routed deep above; under-routing costs accuracy, over-routing costs
65
- // only latency, and the grid prices both.
66
- if (u?.doc_number) features.push("doc-scoped");
71
+ // FAST — everything else: an UNscoped question within the word cap
72
+ // rides the fast registry. The conservative direction is structural
73
+ // here: the long, the complex, the multi-perspective, the
74
+ // process-shaped and the scoped all routed deep above; under-routing
75
+ // costs accuracy, over-routing costs only latency, and the grid
76
+ // prices both.
67
77
  if (u?.term) features.push("definitional");
68
78
  if ((u?.defined_terms ?? []).length > 0) features.push("terminology");
69
79
  features.push("short-question");
@@ -148,6 +148,11 @@ export function extractChecks(content: unknown): string[] {
148
148
  const out: string[] = [];
149
149
  const push = (e?: string) => { const b = e && oclBody(e); if (b) out.push(b); };
150
150
  push(c.check);
151
+ // the plain oiml-r60 projection carries the OCL under `expression`
152
+ // (the r60-lml projection under `check`) — the dead-load geometry
153
+ // nodes bound for their whole life and evaluated to null because
154
+ // their only check sat under the key nobody read
155
+ push(c.expression);
151
156
  push(c.limit?.expression);
152
157
  push(c.acceptance_criteria?.limit && !c.acceptance_criteria.limit.expression?.includes("ocl{") ? null : c.acceptance_criteria?.limit?.expression);
153
158
  // structured threshold limits compile to a comparison expression