@warmdrift/kgauto-compiler 2.0.0-alpha.95 → 2.0.0-alpha.97

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/probe.js CHANGED
@@ -905,18 +905,22 @@ var PROFILES_RAW = [
905
905
  maxContextTokens: 1e6,
906
906
  maxOutputTokens: 384e3,
907
907
  maxTools: 16,
908
- parallelToolCalls: false,
908
+ // alpha.96 — CORRECTED from `false`, which was AI-generated at greenfield
909
+ // (2026-04-25) and never re-checked. Measured 2026-08-28 direct to
910
+ // api.deepseek.com, no kgauto in the path, 6 tools offered, 3 trials:
911
+ // 3 parallel tool calls returned, 3/3. L-040's original evidence said
912
+ // "7-8 calls per step" — which was never a claim that only one tool may be
913
+ // offered. See the note in lower.ts:lowerDeepSeek.
914
+ parallelToolCalls: true,
909
915
  structuredOutput: "native",
910
916
  systemPromptMode: "inline",
911
917
  streaming: true,
912
- cliffs: [
913
- {
914
- metric: "tool_count",
915
- threshold: 1,
916
- action: "drop_to_top_relevant",
917
- reason: "Sequential tool calls only \u2014 L-040"
918
- }
919
- ],
918
+ // alpha.96 — the `tool_count@1 -> drop_to_top_relevant` cliff was DELETED.
919
+ // It restated `parallelToolCalls: false` as a threshold and was falsified by
920
+ // the same measurement. It is not kept-and-flagged (the usual lifecycle)
921
+ // because it was never a real failure mode: it was a second enforcement of a
922
+ // wrong belief, and keeping it active would keep amputating tools.
923
+ cliffs: [],
920
924
  costInputPer1m: 0.44,
921
925
  costOutputPer1m: 1.32,
922
926
  lowering: {
@@ -928,7 +932,12 @@ var PROFILES_RAW = [
928
932
  { signal: "rate_limit", action: "escalate", reason: "429 \u2014 escalate" }
929
933
  ],
930
934
  strengths: ["cost", "1m_context", "json_output", "code", "reasoning"],
931
- weaknesses: ["parallel_tools", "large_tool_sets"],
935
+ // alpha.96 — 'parallel_tools' REMOVED: measurably false (2026-08-28, direct
936
+ // to api.deepseek.com, 6 tools, 3 trials, 3 parallel calls, both models).
937
+ // 'large_tool_sets' KEPT and explicitly unverified — the probe offered 6 of
938
+ // a declared maxTools 16, so it says nothing about behaviour at 16. Not
939
+ // falsified is not the same as confirmed.
940
+ weaknesses: ["large_tool_sets"],
932
941
  // alpha.47 — explicit slow override. Tag derivation would say 'medium'
933
942
  // (no 'latency' weakness, no 'speed' strength), but the alpha.46 shadow
934
943
  // probe MEASURED deepseek-v4-flash at 20485ms served (2026-06-03) — ~2.3×
@@ -940,7 +949,11 @@ var PROFILES_RAW = [
940
949
  notes: "Cheap workhorse. 1M context, 384k max output. Cache-hit input $0.0028/M (1/50\xD7 of miss). Aliased as `deepseek-chat` (non-thinking) and `deepseek-reasoner` (thinking) \u2014 see ALIASES. PEAK/OFF-PEAK since 2026-08-16 (page fetched 2026-08-24): peak = weekdays 01:00-04:00 + 06:00-10:00 UTC, off-peak = all other hours at HALF peak. Encoded prices ARE the peak rate (conservative: never understate cost); off-peak traffic costs half what the estimate says. alpha.87 was built + verified 2026-08-14 (prices then live), held at the publish gate 10 days, and published 2026-08-24 \u2014 by which time the 08-16 transition had killed them ($0.14/$0.28 flash, $0.435/$0.87 pro); corrected here (alpha.88). Build-then-hold is the mechanism: re-verify prices at publish when publish is not same-session as build. A single price field cannot represent a two-rate schedule; catalog-sync extractions oscillate between the rates day-to-day (peak read 08-21, off-peak read 08-22) \u2014 time-of-day pricing remains unmodeled, roadmap.",
941
950
  // Master plan §6.2 anchor. Brain-validated tier 1 cross-provider for
942
951
  // classify (169 rows, 0% empty). Tier 0 for summarize-with-no-tools.
943
- // Falls off on hunt (sequential tools L-040) and reasoning depth.
952
+ // alpha.96 the hunt half of this sentence is RETRACTED: "sequential tools
953
+ // — L-040" was falsified 2026-08-28 (direct measurement, 3 parallel tool
954
+ // calls, both models). Do not use this comment to re-lower `hunt`; it is
955
+ // the exact prose that justified the wrong score. The reasoning-depth
956
+ // rationale is untouched and still carries `critique`.
944
957
  archetypePerf: {
945
958
  classify: 7,
946
959
  // brain-validated, 169 rows
@@ -952,8 +965,16 @@ var PROFILES_RAW = [
952
965
  plan: 5,
953
966
  extract: 5,
954
967
  critique: 4,
955
- hunt: 4
956
- // sequential tool calls only — L-040
968
+ // alpha.96 — was 4. Its ONLY written justification was "sequential tool
969
+ // calls only — L-040", which is falsified. A score derived from a false
970
+ // premise cannot be kept, and re-guessing a penalty would just relaunder
971
+ // the same belief. Set to the floor (6) = "no evidence of deficiency",
972
+ // NOT an endorsement. This is a JUDGMENT, not a measurement, and it is
973
+ // the honest direction of the two: the only hunt-shaped evidence we have
974
+ // is positive (a research-agent fixture, 3 of 3 demanded tools correctly
975
+ // selected from a 6-tool menu, 3/3 trials, both models). Replace with a
976
+ // real number from the golden-eval hunt corpus — that is what it is for.
977
+ hunt: 6
957
978
  },
958
979
  // alpha.43 — family-level conventions for the `deepseek-chat` family
959
980
  // (V4-Flash + future non-thinking-mode members). V4-Flash struggles
@@ -978,18 +999,22 @@ var PROFILES_RAW = [
978
999
  maxContextTokens: 1e6,
979
1000
  maxOutputTokens: 384e3,
980
1001
  maxTools: 16,
981
- parallelToolCalls: false,
1002
+ // alpha.96 — CORRECTED from `false`, which was AI-generated at greenfield
1003
+ // (2026-04-25) and never re-checked. Measured 2026-08-28 direct to
1004
+ // api.deepseek.com, no kgauto in the path, 6 tools offered, 3 trials:
1005
+ // 3 parallel tool calls returned, 3/3. L-040's original evidence said
1006
+ // "7-8 calls per step" — which was never a claim that only one tool may be
1007
+ // offered. See the note in lower.ts:lowerDeepSeek.
1008
+ parallelToolCalls: true,
982
1009
  structuredOutput: "native",
983
1010
  systemPromptMode: "inline",
984
1011
  streaming: true,
985
- cliffs: [
986
- {
987
- metric: "tool_count",
988
- threshold: 1,
989
- action: "drop_to_top_relevant",
990
- reason: "Sequential tool calls only \u2014 L-040"
991
- }
992
- ],
1012
+ // alpha.96 — the `tool_count@1 -> drop_to_top_relevant` cliff was DELETED.
1013
+ // It restated `parallelToolCalls: false` as a threshold and was falsified by
1014
+ // the same measurement. It is not kept-and-flagged (the usual lifecycle)
1015
+ // because it was never a real failure mode: it was a second enforcement of a
1016
+ // wrong belief, and keeping it active would keep amputating tools.
1017
+ cliffs: [],
993
1018
  // Verified against the live DeepSeek pricing page 2026-06-22: the 75%-off
994
1019
  // launch "promo" ($0.435/$0.87) did NOT revert on 2026-05-31 — it became the
995
1020
  // standing price (docs show $0.435 in / $0.87 out cache-miss, $0.003625
@@ -1007,7 +1032,12 @@ var PROFILES_RAW = [
1007
1032
  { signal: "rate_limit", action: "escalate", reason: "429 \u2014 escalate" }
1008
1033
  ],
1009
1034
  strengths: ["quality", "reasoning", "1m_context", "json_output", "code", "extended_thinking"],
1010
- weaknesses: ["parallel_tools", "large_tool_sets"],
1035
+ // alpha.96 — 'parallel_tools' REMOVED: measurably false (2026-08-28, direct
1036
+ // to api.deepseek.com, 6 tools, 3 trials, 3 parallel calls, both models).
1037
+ // 'large_tool_sets' KEPT and explicitly unverified — the probe offered 6 of
1038
+ // a declared maxTools 16, so it says nothing about behaviour at 16. Not
1039
+ // falsified is not the same as confirmed.
1040
+ weaknesses: ["large_tool_sets"],
1011
1041
  // alpha.47 — explicit slow override. Measured 47722ms on the alpha.46
1012
1042
  // shadow probe (2026-06-03) — it's an extended-thinking reasoner, slowest
1013
1043
  // of the served set. Tag derivation would say 'medium'; the measurement says
@@ -1026,14 +1056,24 @@ var PROFILES_RAW = [
1026
1056
  summarize: 7,
1027
1057
  extract: 6,
1028
1058
  transform: 6,
1029
- hunt: 4
1030
- // sequential toolssame as V4-Flash
1059
+ // alpha.96 — was 4. Its ONLY written justification was "sequential tool
1060
+ // calls onlyL-040", which is falsified. A score derived from a false
1061
+ // premise cannot be kept, and re-guessing a penalty would just relaunder
1062
+ // the same belief. Set to the floor (6) = "no evidence of deficiency",
1063
+ // NOT an endorsement. This is a JUDGMENT, not a measurement, and it is
1064
+ // the honest direction of the two: the only hunt-shaped evidence we have
1065
+ // is positive (a research-agent fixture, 3 of 3 demanded tools correctly
1066
+ // selected from a 6-tool menu, 3/3 trials, both models). Replace with a
1067
+ // real number from the golden-eval hunt corpus — that is what it is for.
1068
+ hunt: 6
1031
1069
  },
1032
1070
  // alpha.43 — family-level conventions for the `deepseek-reasoner` family
1033
1071
  // (V4-Pro is the family rep; future thinking-mode members inherit).
1034
1072
  //
1035
- // The decisive-archetype suffix is the load-bearing piece: 2026-05-28
1036
- // first real V4-Pro probe on tt-intel/classify (exclusion-finding ID 20)
1073
+ // The decisive-archetype suffix is the load-bearing piece. ⚠️ alpha.96:
1074
+ // its evidence was purged as poison on 2026-05-29 (s51) retained as a
1075
+ // hypothesis, not a finding. Original claim, for the record: 2026-05-28
1076
+ // first real V4-Pro probe on tt-intel/classify
1037
1077
  // showed 8/10 judge rationales citing "candidate hedges and fails to
1038
1078
  // commit to a single classification" or "candidate refuses to pick
1039
1079
  // among the labels." Without the forcing-function suffix, every
@@ -1054,24 +1094,35 @@ var PROFILES_RAW = [
1054
1094
  {
1055
1095
  archetype: "classify",
1056
1096
  promptSuffix: "\n\nOutput exactly one classification label. Do not hedge, do not add preamble, do not explain your reasoning. If uncertain, pick the most likely label and commit to it.",
1057
- reason: "Reasoners (deepseek-reasoner family) hedge on decisive-output archetypes by design. Evidence: 2026-05-28 V4-Pro probe on tt-intel/classify (exclusion-finding ID 20, brain probe_outcomes); 8 of 10 judge rationales cited hedging or refusal-to-commit. Forcing-function suffix converts reasoner output to decisive labels."
1097
+ reason: 'Reasoners (deepseek-reasoner family) hedge on decisive-output archetypes by design. UNEVIDENCED HYPOTHESIS as of alpha.96 \u2014 this reason used to cite a 2026-05-28 V4-Pro probe on tt-intel/classify ("8 of 10 judge rationales cited hedging") and named `brain probe_outcomes` as its source. That source is EMPTY: probed 2026-08-28, zero probe_outcomes rows exist before 2026-06-01 and zero `classify` rows have ever existed. The probe was deleted on 2026-05-29 by the s51 poison purge \u2014 it replayed against truncated `prompt_preview`, which s51 established yields meaningless verdicts. The conclusion outlived the purge of its own evidence and kept shaping prompts for three months. The pointer was wrong too: exclusion-finding ID 20 is a zero-calls `recommend-probe` on classify, confidence low, later declined \u2014 the probe TRIGGER, never its result. KEPT because a promptSuffix is capability-PRESERVING (adds an instruction, removes nothing a raw call had) and is visible in mutations_applied. Re-evidence from the golden-eval corpus or drop it.'
1058
1098
  },
1059
1099
  {
1060
1100
  archetype: "extract",
1061
1101
  promptSuffix: "\n\nOutput exactly the requested structured fields. Do not hedge, do not add preamble, do not explain your reasoning. If a field is unknown, emit the field with a null/empty value and commit to that \u2014 do not refuse to extract.",
1062
- reason: "Reasoners (deepseek-reasoner family) hedge on decisive-output archetypes by design. Evidence: same family failure shape as classify (exclusion-finding ID 20, 2026-05-28). Forcing-function suffix asks for commitment instead of epistemic-humility hedging."
1102
+ reason: 'Reasoners (deepseek-reasoner family) hedge on decisive-output archetypes by design. UNEVIDENCED HYPOTHESIS as of alpha.96 \u2014 the supporting evidence NO LONGER EXISTS. The cited 2026-05-28 V4-Pro classify probe ("8/10 judge rationales") was deleted on 2026-05-29 by the s51 poison purge, because it replayed against truncated `prompt_preview` and s51 established such verdicts are meaningless. Probed: zero probe_outcomes rows exist before 2026-06-01 and zero `classify` rows have EVER existed. The pointer was also wrong \u2014 exclusion-finding ID 20 is a zero-calls `recommend-probe` on classify, confidence low, later declined; it was the trigger for the probe, never its result. KEPT anyway because a promptSuffix is capability-PRESERVING (it adds an instruction and removes nothing a raw call had), so the cost of being wrong is bounded and a consumer can see it in mutations_applied. Re-evidence it from the golden-eval corpus or drop it.'
1063
1103
  },
1064
1104
  {
1065
1105
  archetype: "ask",
1066
1106
  promptSuffix: "\n\nAnswer the question directly. Do not hedge, do not add preamble, do not explain your reasoning unless explicitly asked. If uncertain, give your best answer and commit to it.",
1067
- reason: "Reasoners (deepseek-reasoner family) hedge on decisive-output archetypes by design. Evidence: same family failure shape as classify (exclusion-finding ID 20, 2026-05-28). Forcing-function suffix asks for commitment instead of epistemic-humility hedging."
1068
- },
1069
- {
1070
- archetype: "hunt",
1071
- whenToolCountAtLeast: 3,
1072
- cliffWarning: "Reasoners (deepseek-reasoner family) produce sequential reasoning chains by design; hunt archetypes with 3+ parallel tools lose substantial throughput. Consider gemini-flash family (parallel-strong) instead \u2014 see L-040 / L-041.",
1073
- reason: "L-040 + L-041 architectural reading; 2026-05-28 V4-Pro probe evidence (exclusion-finding ID 20) confirms reasoner-family hunt fit is structurally weak."
1107
+ reason: 'Reasoners (deepseek-reasoner family) hedge on decisive-output archetypes by design. UNEVIDENCED HYPOTHESIS as of alpha.96 \u2014 the supporting evidence NO LONGER EXISTS. The cited 2026-05-28 V4-Pro classify probe ("8/10 judge rationales") was deleted on 2026-05-29 by the s51 poison purge, because it replayed against truncated `prompt_preview` and s51 established such verdicts are meaningless. Probed: zero probe_outcomes rows exist before 2026-06-01 and zero `classify` rows have EVER existed. The pointer was also wrong \u2014 exclusion-finding ID 20 is a zero-calls `recommend-probe` on classify, confidence low, later declined; it was the trigger for the probe, never its result. KEPT anyway because a promptSuffix is capability-PRESERVING (it adds an instruction and removes nothing a raw call had), so the cost of being wrong is bounded and a consumer can see it in mutations_applied. Re-evidence it from the golden-eval corpus or drop it.'
1074
1108
  }
1109
+ // alpha.96 — the `hunt` convention was DELETED, not corrected.
1110
+ // It warned that "hunt archetypes with 3+ parallel tools lose substantial
1111
+ // throughput" and steered callers to gemini-flash. Measured false
1112
+ // 2026-08-28: 6 tools offered, 3 of 3 demanded served in parallel, 3/3
1113
+ // trials, both V4 models, direct to the provider.
1114
+ //
1115
+ // Its cited evidence did not say what it claimed. exclusion-finding ID 20
1116
+ // is `intent_archetype: 'classify'` (not hunt), `verdict:
1117
+ // 'recommend-probe'` (i.e. NOBODY PROBED), `confidence: 'low'`, its
1118
+ // message reads "deepseek-v4-pro has zero calls", it was later
1119
+ // `declined`, and its own `parallel_tool_hint: false` was this profile's
1120
+ // own belief round-tripped back as input. A no-data finding on the wrong
1121
+ // archetype was paraphrased into "probe evidence confirms".
1122
+ //
1123
+ // Deleted rather than re-scoped because a cliffWarning is
1124
+ // capability-REDUCING (it steers traffic away from a model) and nothing
1125
+ // evidenced remains. Re-add only from a measured hunt eval.
1075
1126
  ]
1076
1127
  },
1077
1128
  // ── OpenAI ──
@@ -1970,6 +2021,19 @@ var PROFILES_RAW = [
1970
2021
  id: "glm-5.2",
1971
2022
  verifiedAgainstDocs: "2026-07-18",
1972
2023
  provider: "zai",
2024
+ probedLimits: [
2025
+ {
2026
+ metric: "tool_count",
2027
+ testedAt: 6,
2028
+ demanded: 3,
2029
+ served: [3, 3, 3],
2030
+ outcome: "held",
2031
+ trials: 3,
2032
+ lastProbed: "2026-08-29",
2033
+ route: "openrouter:baidu",
2034
+ claim: "Measured 2026-08-29 via OpenRouter (served-by Baidu): 6 tools offered, 3 of 3 demanded served in parallel, 3/3 trials. Route-scoped \u2014 direct z.ai is unmeasured (no key held)."
2035
+ }
2036
+ ],
1973
2037
  status: "preview",
1974
2038
  maxContextTokens: 1048576,
1975
2039
  maxOutputTokens: 131072,
@@ -1980,7 +2044,8 @@ var PROFILES_RAW = [
1980
2044
  // NOTHING about multiple tool_calls per response. Conservative false so
1981
2045
  // hunt-shaped ranking doesn't over-promise; flip on doc or probe
1982
2046
  // evidence (L-081: undocumented ≠ true).
1983
- parallelToolCalls: false,
2047
+ parallelToolCalls: true,
2048
+ // alpha.96 — see weaknesses note; was an unevidenced blanket false
1984
2049
  structuredOutput: "native",
1985
2050
  systemPromptMode: "inline",
1986
2051
  streaming: true,
@@ -2003,7 +2068,17 @@ var PROFILES_RAW = [
2003
2068
  { signal: "model_not_found", action: "escalate", reason: "Deprecated \u2014 escalate (L-061)" }
2004
2069
  ],
2005
2070
  strengths: ["cost", "1m_context", "code", "tool_use", "json_output", "reasoning"],
2006
- weaknesses: ["parallel_tools"],
2071
+ // alpha.96 — 'parallel_tools' REMOVED. Measured 2026-08-29 via OpenRouter
2072
+ // (served-by Baidu), 6 tools offered, 3 of 3 demanded served in PARALLEL,
2073
+ // 3/3 trials. ROUTE-SCOPED: per the alpha.92 execute-leg contract there is
2074
+ // no cross-route verdict transfer, and direct z.ai is UNMEASURED (we hold
2075
+ // no zai key). But `parallelToolCalls: false` was a blanket claim with no
2076
+ // route qualification and no evidence at all, and it is capability-
2077
+ // REDUCING — it drives requires-adapter/reject. An unsubstantiated reducer
2078
+ // must not reduce. Contradicted on the one route we can reach is enough to
2079
+ // stop enforcing it; it is not enough to claim the opposite, which is why
2080
+ // probedLimits below carries the route.
2081
+ weaknesses: [],
2007
2082
  notes: "GLM-5.2 (Z.ai, 2026-06): agentic-coding flagship. 1,048,576 ctx / 131,072 max out. $1.40/$4.40 per 1M; cached input $0.26/M (automatic caching, no marker; storage limited-time free as of 2026-07-18). Thinking on by default (`thinking.type`), `reasoning_effort` max..none. Parallel tool calls UNDOCUMENTED on the hosted API \u2014 profile says false until doc or probe evidence. status:preview \u2014 no brain evidence yet; earns placement via the machinery.",
2008
2083
  // Starter hypotheses — verify with telemetry/probes; NO brain evidence
2009
2084
  // yet. Anchored on the vendor's agentic-coding positioning at a
@@ -2021,8 +2096,11 @@ var PROFILES_RAW = [
2021
2096
  extract: 6,
2022
2097
  critique: 6,
2023
2098
  classify: 6,
2024
- hunt: 5
2025
- // tools work; parallel unproven discounted
2099
+ // alpha.96 — was 5, discounted for "parallel unproven". Parallel is no
2100
+ // longer unproven on the reachable route (3/3, 2026-08-29). The discount
2101
+ // had no other stated basis, so it is withdrawn to the neutral floor.
2102
+ // Judgment, not measurement — same standard as the DeepSeek correction.
2103
+ hunt: 6
2026
2104
  }
2027
2105
  },
2028
2106
  // ── Moonshot (Kimi) ──
@@ -2149,7 +2227,24 @@ function bestEffortProfile(id) {
2149
2227
  maxContextTokens: 128e3,
2150
2228
  maxOutputTokens: 4096,
2151
2229
  maxTools: donor.maxTools,
2152
- parallelToolCalls: false,
2230
+ // alpha.97 — was `false`. That was the SAME MISTAKE as the three profiles
2231
+ // corrected in alpha.96, in the one place it does the most damage: applied
2232
+ // to models nobody has measured at all.
2233
+ //
2234
+ // `false` here is capability-REDUCING and unsubstantiated by construction —
2235
+ // a synthesized profile exists precisely because we know nothing. It made
2236
+ // `getModelCompatibility(<any unprofiled model>, {archetype:'hunt'})`
2237
+ // return `requires-adapter` (verified: raw score 5 vs floor 6, adapter
2238
+ // offered), so every consumer on `onUnprofiledModel:'best-effort'` was told
2239
+ // to serialize tool calls on a model we had never touched.
2240
+ //
2241
+ // The never-worse-than-raw rule decides it: for an unknown model kgauto
2242
+ // must behave exactly as a direct call would, and a direct call passes
2243
+ // every tool and lets the provider default apply. `true` is not a claim
2244
+ // that the model parallelises — it is the absence of a claim, expressed as
2245
+ // non-interference. The honest long-term fix is a third state (unknown)
2246
+ // rather than a boolean; that is P4 in the rebuild contract.
2247
+ parallelToolCalls: true,
2153
2248
  structuredOutput: "none",
2154
2249
  systemPromptMode: donor.systemPromptMode,
2155
2250
  streaming: donor.streaming,
@@ -2159,7 +2254,7 @@ function bestEffortProfile(id) {
2159
2254
  lowering: donor.lowering,
2160
2255
  recovery: [],
2161
2256
  strengths: [],
2162
- weaknesses: ["best-effort synthesized profile \u2014 no verified capability data"],
2257
+ weaknesses: ["best-effort synthesized profile \u2014 no verified capability data; kgauto does not reduce capability for a model it has never measured (alpha.97)"],
2163
2258
  notes: `Synthesized by onUnprofiledModel:'best-effort' (provider ${provider} inferred from id; wire mechanics borrowed from ${donor.id}). No cliffs, no measured knowledge, cost UNKNOWN (recorded as 0). Replace via registerProfiles() for real guards.`
2164
2259
  };
2165
2260
  CONSUMER_INDEX.set(canonical, synth);
@@ -2308,7 +2403,7 @@ _setProfileBrainHook({
2308
2403
  // src/compatibility.ts
2309
2404
  var ARCHETYPE_FLOOR_DEFAULT = 6;
2310
2405
  function rawArchetypePerf(profile, archetype) {
2311
- return profile.archetypePerf?.[archetype] ?? 5;
2406
+ return profile.archetypePerf?.[archetype] ?? ARCHETYPE_FLOOR_DEFAULT;
2312
2407
  }
2313
2408
  function hasSequentialToolCliffForHunt(profile) {
2314
2409
  if (profile.parallelToolCalls !== false) return false;
@@ -3402,7 +3497,7 @@ function lower(ir, profile, hints = {}) {
3402
3497
  case "openai":
3403
3498
  return lowerOpenAI(ir, profile, hints);
3404
3499
  case "deepseek":
3405
- return lowerDeepSeek(ir, profile);
3500
+ return lowerDeepSeek(ir, profile, hints);
3406
3501
  case "zai":
3407
3502
  return lowerZai(ir, profile, hints);
3408
3503
  case "moonshot":
@@ -3663,7 +3758,7 @@ function toOpenAITools(tools) {
3663
3758
  }
3664
3759
  }));
3665
3760
  }
3666
- function lowerDeepSeek(ir, profile) {
3761
+ function lowerDeepSeek(ir, profile, hints) {
3667
3762
  const ordered = sortSections(ir.sections);
3668
3763
  const systemText = ordered.map((s) => s.text).join("\n\n");
3669
3764
  const messages = systemText ? [{ role: "system", content: systemText }] : [];
@@ -3685,7 +3780,8 @@ function lowerDeepSeek(ir, profile) {
3685
3780
  provider: "deepseek",
3686
3781
  model: profile.id,
3687
3782
  messages,
3688
- tools: ir.tools && ir.tools.length > 0 ? ir.tools.slice(0, 1).map((t) => ({
3783
+ // Every tool the IR carries. Never fewer see the note above.
3784
+ tools: ir.tools && ir.tools.length > 0 ? ir.tools.map((t) => ({
3689
3785
  type: "function",
3690
3786
  function: {
3691
3787
  name: t.name,
package/dist/probe.mjs CHANGED
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  compile
3
- } from "./chunk-IRXC7WEQ.mjs";
4
- import "./chunk-BJD75WCL.mjs";
3
+ } from "./chunk-AFYBZRQV.mjs";
4
+ import "./chunk-77AHSX6Y.mjs";
5
5
  import "./chunk-FEMPY6EC.mjs";
6
6
  import {
7
7
  deriveCliffEvidenceClass,
8
8
  getProfile
9
- } from "./chunk-D3BVYXNA.mjs";
9
+ } from "./chunk-HHIXHL4O.mjs";
10
10
 
11
11
  // src/probe.ts
12
12
  function compileSuppressing(ir, opts) {
@@ -125,7 +125,10 @@ declare function deriveCliffEvidenceClass(rule: CliffRule): CliffEvidence['class
125
125
  * diverges from the family default.
126
126
  *
127
127
  * Trigger that justified the substrate (2026-05-28): V4-Pro probe on
128
- * tt-intel/classify (exclusion-finding ID 20) showed 8/10 judge rationales
128
+ * tt-intel/classify showed 8/10 judge rationales
129
+ * ⚠️ alpha.96: THAT PROBE WAS PURGED 2026-05-29 (s51, prompt_preview
130
+ * truncation). Zero probe rows survive before 2026-06-01. The substrate is
131
+ * kept; the evidence claim below is retracted — treat as hypothesis.
129
132
  * citing "candidate hedges and fails to commit to a single classification."
130
133
  * Without a forcing-function suffix, every reasoner probe on a decisive
131
134
  * archetype verdicts stay-excluded for reasoner-behavior reasons, not
@@ -125,7 +125,10 @@ declare function deriveCliffEvidenceClass(rule: CliffRule): CliffEvidence['class
125
125
  * diverges from the family default.
126
126
  *
127
127
  * Trigger that justified the substrate (2026-05-28): V4-Pro probe on
128
- * tt-intel/classify (exclusion-finding ID 20) showed 8/10 judge rationales
128
+ * tt-intel/classify showed 8/10 judge rationales
129
+ * ⚠️ alpha.96: THAT PROBE WAS PURGED 2026-05-29 (s51, prompt_preview
130
+ * truncation). Zero probe rows survive before 2026-06-01. The substrate is
131
+ * kept; the evidence claim below is retracted — treat as hypothesis.
129
132
  * citing "candidate hedges and fails to commit to a single classification."
130
133
  * Without a forcing-function suffix, every reasoner probe on a decisive
131
134
  * archetype verdicts stay-excluded for reasoner-behavior reasons, not