@dzhechkov/harness-core 0.3.103 → 0.3.104
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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/recall-hook-policy.d.ts +97 -0
- package/dist/recall-hook-policy.d.ts.map +1 -0
- package/dist/recall-hook-policy.js +131 -0
- package/dist/recall-hook-policy.js.map +1 -0
- package/package.json +5 -5
- package/src/index.ts +13 -0
- package/src/recall-hook-policy.ts +167 -0
package/dist/index.d.ts
CHANGED
|
@@ -51,6 +51,8 @@ export { hookDecision, isFenced, isNewLine, ESCAPE_TEACHING } from './claim-chec
|
|
|
51
51
|
export type { HookDecision, HookDecisionOpts } from './claim-check-hook-policy.js';
|
|
52
52
|
export { step8ClaimGate } from './feature-adr-claim-gate.js';
|
|
53
53
|
export type { Step8ClaimCounts, Step8ClaimGate } from './feature-adr-claim-gate.js';
|
|
54
|
+
export { detectQueryLang, relevanceFloorFor, selectHookHits, renderHookContext, hasEnoughSignal, DEFAULT_RECALL_FLOORS, DEFAULT_RECALL_HOOK_LIMIT, DEFAULT_RECALL_HOOK_BUDGET_CHARS, MIN_PROMPT_CHARS, MIN_CONTENT_TOKENS, } from './recall-hook-policy.js';
|
|
55
|
+
export type { QueryLang, RecallFloors, HookCandidate, HookSelection } from './recall-hook-policy.js';
|
|
54
56
|
export { discoverPackages, publishPackages, bumpPatch, compareVersions, findUnpackagedSkills, orderByDependencies, syncReadmeVersion } from './publish.js';
|
|
55
57
|
export { fetchAllDownloads } from './downloads.js';
|
|
56
58
|
export type { PackageDownloads, DownloadsReport } from './downloads.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -32,6 +32,7 @@ export { generatePlugin } from './plugin.js';
|
|
|
32
32
|
export { claimCheck, summarize } from './claim-check.js';
|
|
33
33
|
export { hookDecision, isFenced, isNewLine, ESCAPE_TEACHING } from './claim-check-hook-policy.js';
|
|
34
34
|
export { step8ClaimGate } from './feature-adr-claim-gate.js';
|
|
35
|
+
export { detectQueryLang, relevanceFloorFor, selectHookHits, renderHookContext, hasEnoughSignal, DEFAULT_RECALL_FLOORS, DEFAULT_RECALL_HOOK_LIMIT, DEFAULT_RECALL_HOOK_BUDGET_CHARS, MIN_PROMPT_CHARS, MIN_CONTENT_TOKENS, } from './recall-hook-policy.js';
|
|
35
36
|
export { discoverPackages, publishPackages, bumpPatch, compareVersions, findUnpackagedSkills, orderByDependencies, syncReadmeVersion } from './publish.js';
|
|
36
37
|
export { fetchAllDownloads } from './downloads.js';
|
|
37
38
|
export { discoverInstalled, checkUpgrades } from './upgrade.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure policy for the `dz recall` APPLY leg — the `UserPromptSubmit` hook that grounds a live prompt
|
|
3
|
+
* against the learned-pattern store.
|
|
4
|
+
*
|
|
5
|
+
* ## Why a floor is the whole feature
|
|
6
|
+
*
|
|
7
|
+
* A store nobody reads is a write-only log; an apply-leg with no rank-leg is a noise generator. The
|
|
8
|
+
* sibling failure is live in this repo: agentic-qe's per-prompt hook injects the same five static
|
|
9
|
+
* guidance lines on every turn regardless of topic, and only 10 of its 198 stored patterns ever had
|
|
10
|
+
* `usage_count > 0`. Beating that means one thing above all: **emit nothing when nothing is relevant.**
|
|
11
|
+
*
|
|
12
|
+
* ## Where the numbers come from (MEASURED, not chosen by feel)
|
|
13
|
+
*
|
|
14
|
+
* Calibrated 2026-07-09 on a 32-probe labeled set (16 RU + 16 EN, half relevant / half irrelevant),
|
|
15
|
+
* embedded with `Xenova/paraphrase-multilingual-MiniLM-L12-v2` against the real 103-pattern store.
|
|
16
|
+
* Fixture: `test/fixtures/recall-floor-probes.json`; the dep-gated test re-derives the separation.
|
|
17
|
+
*
|
|
18
|
+
* - **Absolute max-cosine separates perfectly** — a single global floor of `0.353` classified all 32
|
|
19
|
+
* probes correctly. Per language the safe window widens: RU `min(relevant)=0.415`,
|
|
20
|
+
* `max(irrelevant)=0.337`; EN `min(relevant)=0.369`, `max(irrelevant)=0.254`.
|
|
21
|
+
* - **A z-score `(max − mean) / sd` FAILS** (69 % accuracy, negative margin). An off-topic query has a
|
|
22
|
+
* flat, low similarity profile, so its best hit stands out *relative to its own mean* — `"who won the
|
|
23
|
+
* world cup"` scored z = 3.60, higher than half the relevant probes. Distance from your own mean
|
|
24
|
+
* measures flatness, not relevance. This was the elegant idea; the data refuted it.
|
|
25
|
+
* - The language baseline shift is **real but survivable**: an irrelevant Russian query reaches 0.337
|
|
26
|
+
* where an irrelevant English one reaches 0.254. A single floor still works, with a thin 0.032
|
|
27
|
+
* margin; per-language floors triple it. Hence the defaults below.
|
|
28
|
+
*
|
|
29
|
+
* The turns that must stay silent do: `"спасибо"` scores 0.259, `"какой статус?"` 0.318 — both under
|
|
30
|
+
* every floor here.
|
|
31
|
+
*
|
|
32
|
+
* @packageDocumentation
|
|
33
|
+
*/
|
|
34
|
+
/** Script family of a query — the only axis the floor is calibrated on. */
|
|
35
|
+
export type QueryLang = 'ru' | 'en';
|
|
36
|
+
/** Per-language relevance floors on the max cosine similarity, `[0,1]`. */
|
|
37
|
+
export interface RecallFloors {
|
|
38
|
+
readonly ru: number;
|
|
39
|
+
readonly en: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* MEASURED defaults. RU sits higher than EN because a multilingual encoder places any Cyrillic text
|
|
43
|
+
* slightly closer to any Latin text than two unrelated Latin texts are to each other — the baseline,
|
|
44
|
+
* not the signal, is what shifts.
|
|
45
|
+
*/
|
|
46
|
+
export declare const DEFAULT_RECALL_FLOORS: RecallFloors;
|
|
47
|
+
/** Max hits injected into a turn. Three is the ADR default; more is noise, not context. */
|
|
48
|
+
export declare const DEFAULT_RECALL_HOOK_LIMIT = 3;
|
|
49
|
+
/** Rough character budget for the injected block (~4 chars/token; Cyrillic runs denser, so this is conservative). */
|
|
50
|
+
export declare const DEFAULT_RECALL_HOOK_BUDGET_CHARS = 1200;
|
|
51
|
+
/**
|
|
52
|
+
* Which floor applies to this prompt. Cyrillic anywhere ⇒ `'ru'`: a mixed prompt such as
|
|
53
|
+
* `"почему codex барьер даёт ложный grade D"` carries the Russian baseline, so it must be judged by
|
|
54
|
+
* the stricter floor. Never throws — a non-string is `'en'`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function detectQueryLang(text: unknown): QueryLang;
|
|
57
|
+
/** The floor for a prompt, given (possibly partial, possibly garbage) configured overrides. */
|
|
58
|
+
export declare function relevanceFloorFor(text: unknown, floors: Partial<RecallFloors> | undefined): number;
|
|
59
|
+
/** Below this many characters a prompt carries too little signal to judge. */
|
|
60
|
+
export declare const MIN_PROMPT_CHARS = 10;
|
|
61
|
+
/** …and it must contain at least this many content tokens (length ≥ 3). */
|
|
62
|
+
export declare const MIN_CONTENT_TOKENS = 2;
|
|
63
|
+
/**
|
|
64
|
+
* A prompt too short to judge. Found by dogfooding the live hook: `"тест"` and `"json"` cleared the
|
|
65
|
+
* cosine floor (0.43) purely because a one-word technical token is genuinely close to technical
|
|
66
|
+
* lessons — the similarity is real, the relevance is not. A floor cannot fix this; the query simply
|
|
67
|
+
* carries no intent. Never throws.
|
|
68
|
+
*/
|
|
69
|
+
export declare function hasEnoughSignal(text: unknown): boolean;
|
|
70
|
+
/** One ranked candidate from the recall engine. `score` is the relevance in `[0,1]`, NOT the reward. */
|
|
71
|
+
export interface HookCandidate {
|
|
72
|
+
readonly pattern: string;
|
|
73
|
+
readonly score: number;
|
|
74
|
+
readonly domain?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface HookSelection {
|
|
77
|
+
readonly hits: readonly HookCandidate[];
|
|
78
|
+
/** The floor that was applied — reported so the hook's own output can explain its silence. */
|
|
79
|
+
readonly floor: number;
|
|
80
|
+
readonly lang: QueryLang;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Apply the floor, the limit and the character budget. Returns an EMPTY hit list whenever nothing
|
|
84
|
+
* clears the floor — the caller must then print nothing at all and exit 0. Pure, never throws:
|
|
85
|
+
* malformed candidates (missing/NaN score, empty text) are dropped rather than crashing a turn.
|
|
86
|
+
*/
|
|
87
|
+
export declare function selectHookHits(prompt: unknown, candidates: readonly HookCandidate[] | null | undefined, opts?: {
|
|
88
|
+
floors?: Partial<RecallFloors>;
|
|
89
|
+
limit?: number;
|
|
90
|
+
budgetChars?: number;
|
|
91
|
+
}): HookSelection;
|
|
92
|
+
/**
|
|
93
|
+
* Render the `additionalContext` block. Returns `''` when there is nothing to say — the caller emits
|
|
94
|
+
* NOTHING (not an empty JSON envelope) and exits 0, so an off-topic turn costs the reader zero tokens.
|
|
95
|
+
*/
|
|
96
|
+
export declare function renderHookContext(selection: HookSelection): string;
|
|
97
|
+
//# sourceMappingURL=recall-hook-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall-hook-policy.d.ts","sourceRoot":"","sources":["../src/recall-hook-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,2EAA2E;AAC3E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpC,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAAqC,CAAC;AAE1E,2FAA2F;AAC3F,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,qHAAqH;AACrH,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAIrD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAGxD;AAED,+FAA+F;AAC/F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,GAAG,MAAM,CAKlG;AAED,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAMtD;AAED,wGAAwG;AACxG,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI,GAAG,SAAS,EACvD,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAClF,aAAa,CAkCf;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,CAIlE"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure policy for the `dz recall` APPLY leg — the `UserPromptSubmit` hook that grounds a live prompt
|
|
3
|
+
* against the learned-pattern store.
|
|
4
|
+
*
|
|
5
|
+
* ## Why a floor is the whole feature
|
|
6
|
+
*
|
|
7
|
+
* A store nobody reads is a write-only log; an apply-leg with no rank-leg is a noise generator. The
|
|
8
|
+
* sibling failure is live in this repo: agentic-qe's per-prompt hook injects the same five static
|
|
9
|
+
* guidance lines on every turn regardless of topic, and only 10 of its 198 stored patterns ever had
|
|
10
|
+
* `usage_count > 0`. Beating that means one thing above all: **emit nothing when nothing is relevant.**
|
|
11
|
+
*
|
|
12
|
+
* ## Where the numbers come from (MEASURED, not chosen by feel)
|
|
13
|
+
*
|
|
14
|
+
* Calibrated 2026-07-09 on a 32-probe labeled set (16 RU + 16 EN, half relevant / half irrelevant),
|
|
15
|
+
* embedded with `Xenova/paraphrase-multilingual-MiniLM-L12-v2` against the real 103-pattern store.
|
|
16
|
+
* Fixture: `test/fixtures/recall-floor-probes.json`; the dep-gated test re-derives the separation.
|
|
17
|
+
*
|
|
18
|
+
* - **Absolute max-cosine separates perfectly** — a single global floor of `0.353` classified all 32
|
|
19
|
+
* probes correctly. Per language the safe window widens: RU `min(relevant)=0.415`,
|
|
20
|
+
* `max(irrelevant)=0.337`; EN `min(relevant)=0.369`, `max(irrelevant)=0.254`.
|
|
21
|
+
* - **A z-score `(max − mean) / sd` FAILS** (69 % accuracy, negative margin). An off-topic query has a
|
|
22
|
+
* flat, low similarity profile, so its best hit stands out *relative to its own mean* — `"who won the
|
|
23
|
+
* world cup"` scored z = 3.60, higher than half the relevant probes. Distance from your own mean
|
|
24
|
+
* measures flatness, not relevance. This was the elegant idea; the data refuted it.
|
|
25
|
+
* - The language baseline shift is **real but survivable**: an irrelevant Russian query reaches 0.337
|
|
26
|
+
* where an irrelevant English one reaches 0.254. A single floor still works, with a thin 0.032
|
|
27
|
+
* margin; per-language floors triple it. Hence the defaults below.
|
|
28
|
+
*
|
|
29
|
+
* The turns that must stay silent do: `"спасибо"` scores 0.259, `"какой статус?"` 0.318 — both under
|
|
30
|
+
* every floor here.
|
|
31
|
+
*
|
|
32
|
+
* @packageDocumentation
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* MEASURED defaults. RU sits higher than EN because a multilingual encoder places any Cyrillic text
|
|
36
|
+
* slightly closer to any Latin text than two unrelated Latin texts are to each other — the baseline,
|
|
37
|
+
* not the signal, is what shifts.
|
|
38
|
+
*/
|
|
39
|
+
export const DEFAULT_RECALL_FLOORS = { ru: 0.38, en: 0.31 };
|
|
40
|
+
/** Max hits injected into a turn. Three is the ADR default; more is noise, not context. */
|
|
41
|
+
export const DEFAULT_RECALL_HOOK_LIMIT = 3;
|
|
42
|
+
/** Rough character budget for the injected block (~4 chars/token; Cyrillic runs denser, so this is conservative). */
|
|
43
|
+
export const DEFAULT_RECALL_HOOK_BUDGET_CHARS = 1200;
|
|
44
|
+
const CYRILLIC = /[Ѐ-ӿ]/;
|
|
45
|
+
/**
|
|
46
|
+
* Which floor applies to this prompt. Cyrillic anywhere ⇒ `'ru'`: a mixed prompt such as
|
|
47
|
+
* `"почему codex барьер даёт ложный grade D"` carries the Russian baseline, so it must be judged by
|
|
48
|
+
* the stricter floor. Never throws — a non-string is `'en'`.
|
|
49
|
+
*/
|
|
50
|
+
export function detectQueryLang(text) {
|
|
51
|
+
if (typeof text !== 'string')
|
|
52
|
+
return 'en';
|
|
53
|
+
return CYRILLIC.test(text) ? 'ru' : 'en';
|
|
54
|
+
}
|
|
55
|
+
/** The floor for a prompt, given (possibly partial, possibly garbage) configured overrides. */
|
|
56
|
+
export function relevanceFloorFor(text, floors) {
|
|
57
|
+
const lang = detectQueryLang(text);
|
|
58
|
+
const configured = floors?.[lang];
|
|
59
|
+
const valid = typeof configured === 'number' && isFinite(configured) && configured >= 0 && configured <= 1;
|
|
60
|
+
return valid ? configured : DEFAULT_RECALL_FLOORS[lang];
|
|
61
|
+
}
|
|
62
|
+
/** Below this many characters a prompt carries too little signal to judge. */
|
|
63
|
+
export const MIN_PROMPT_CHARS = 10;
|
|
64
|
+
/** …and it must contain at least this many content tokens (length ≥ 3). */
|
|
65
|
+
export const MIN_CONTENT_TOKENS = 2;
|
|
66
|
+
/**
|
|
67
|
+
* A prompt too short to judge. Found by dogfooding the live hook: `"тест"` and `"json"` cleared the
|
|
68
|
+
* cosine floor (0.43) purely because a one-word technical token is genuinely close to technical
|
|
69
|
+
* lessons — the similarity is real, the relevance is not. A floor cannot fix this; the query simply
|
|
70
|
+
* carries no intent. Never throws.
|
|
71
|
+
*/
|
|
72
|
+
export function hasEnoughSignal(text) {
|
|
73
|
+
if (typeof text !== 'string')
|
|
74
|
+
return false;
|
|
75
|
+
const t = text.trim();
|
|
76
|
+
if (t.length < MIN_PROMPT_CHARS)
|
|
77
|
+
return false;
|
|
78
|
+
const tokens = t.split(/[^\p{L}\p{N}]+/u).filter((w) => w.length >= 3);
|
|
79
|
+
return tokens.length >= MIN_CONTENT_TOKENS;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Apply the floor, the limit and the character budget. Returns an EMPTY hit list whenever nothing
|
|
83
|
+
* clears the floor — the caller must then print nothing at all and exit 0. Pure, never throws:
|
|
84
|
+
* malformed candidates (missing/NaN score, empty text) are dropped rather than crashing a turn.
|
|
85
|
+
*/
|
|
86
|
+
export function selectHookHits(prompt, candidates, opts = {}) {
|
|
87
|
+
const lang = detectQueryLang(prompt);
|
|
88
|
+
const floor = relevanceFloorFor(prompt, opts.floors);
|
|
89
|
+
const limit = intOr(opts.limit, DEFAULT_RECALL_HOOK_LIMIT);
|
|
90
|
+
const budget = intOr(opts.budgetChars, DEFAULT_RECALL_HOOK_BUDGET_CHARS);
|
|
91
|
+
// A prompt with no intent gets no injection, whatever its cosine says.
|
|
92
|
+
if (!hasEnoughSignal(prompt))
|
|
93
|
+
return { hits: [], floor, lang };
|
|
94
|
+
const clean = (candidates ?? [])
|
|
95
|
+
.filter((c) => c !== null &&
|
|
96
|
+
typeof c === 'object' &&
|
|
97
|
+
typeof c.pattern === 'string' &&
|
|
98
|
+
c.pattern.trim() !== '' &&
|
|
99
|
+
typeof c.score === 'number' &&
|
|
100
|
+
isFinite(c.score))
|
|
101
|
+
.filter((c) => c.score >= floor)
|
|
102
|
+
.sort((a, b) => b.score - a.score);
|
|
103
|
+
const hits = [];
|
|
104
|
+
let used = 0;
|
|
105
|
+
for (const c of clean) {
|
|
106
|
+
if (hits.length >= limit)
|
|
107
|
+
break;
|
|
108
|
+
const cost = c.pattern.length;
|
|
109
|
+
// Always admit the top hit even if it alone exceeds the budget — a truncated best lesson beats
|
|
110
|
+
// silence. Subsequent hits must fit.
|
|
111
|
+
if (hits.length > 0 && used + cost > budget)
|
|
112
|
+
break;
|
|
113
|
+
hits.push(c);
|
|
114
|
+
used += cost;
|
|
115
|
+
}
|
|
116
|
+
return { hits, floor, lang };
|
|
117
|
+
}
|
|
118
|
+
function intOr(v, fallback) {
|
|
119
|
+
return typeof v === 'number' && isFinite(v) && v > 0 ? Math.floor(v) : fallback;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Render the `additionalContext` block. Returns `''` when there is nothing to say — the caller emits
|
|
123
|
+
* NOTHING (not an empty JSON envelope) and exits 0, so an off-topic turn costs the reader zero tokens.
|
|
124
|
+
*/
|
|
125
|
+
export function renderHookContext(selection) {
|
|
126
|
+
if (selection.hits.length === 0)
|
|
127
|
+
return '';
|
|
128
|
+
const lines = selection.hits.map((h) => ` - [${h.score.toFixed(2)}${h.domain ? ` / ${h.domain}` : ''}] ${h.pattern}`);
|
|
129
|
+
return `Learned lessons that match this prompt (dz recall, relevance ≥ ${selection.floor.toFixed(2)}):\n${lines.join('\n')}`;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=recall-hook-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall-hook-policy.js","sourceRoot":"","sources":["../src/recall-hook-policy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/harness-core",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.104",
|
|
4
4
|
"description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
"@dzhechkov/adapter-opencode": "^0.2.0",
|
|
32
32
|
"yaml": "^2.0.0",
|
|
33
33
|
"@dzhechkov/adapter-agents-md": "0.1.1",
|
|
34
|
-
"@dzhechkov/adapter-copilot": "0.1.1",
|
|
35
|
-
"@dzhechkov/core": "0.2.14",
|
|
36
34
|
"@dzhechkov/adapter-gemini": "0.1.1",
|
|
37
|
-
"@dzhechkov/adapter-cursor": "0.1.1",
|
|
38
35
|
"@dzhechkov/adapter-windsurf": "0.1.1",
|
|
39
|
-
"@dzhechkov/
|
|
36
|
+
"@dzhechkov/core": "0.2.14",
|
|
37
|
+
"@dzhechkov/adapter-copilot": "0.1.1",
|
|
38
|
+
"@dzhechkov/memory": "0.2.9",
|
|
39
|
+
"@dzhechkov/adapter-cursor": "0.1.1"
|
|
40
40
|
},
|
|
41
41
|
"peerDependenciesMeta": {
|
|
42
42
|
"@ruvector/rvf": {
|
package/src/index.ts
CHANGED
|
@@ -125,6 +125,19 @@ export { hookDecision, isFenced, isNewLine, ESCAPE_TEACHING } from './claim-chec
|
|
|
125
125
|
export type { HookDecision, HookDecisionOpts } from './claim-check-hook-policy.js';
|
|
126
126
|
export { step8ClaimGate } from './feature-adr-claim-gate.js';
|
|
127
127
|
export type { Step8ClaimCounts, Step8ClaimGate } from './feature-adr-claim-gate.js';
|
|
128
|
+
export {
|
|
129
|
+
detectQueryLang,
|
|
130
|
+
relevanceFloorFor,
|
|
131
|
+
selectHookHits,
|
|
132
|
+
renderHookContext,
|
|
133
|
+
hasEnoughSignal,
|
|
134
|
+
DEFAULT_RECALL_FLOORS,
|
|
135
|
+
DEFAULT_RECALL_HOOK_LIMIT,
|
|
136
|
+
DEFAULT_RECALL_HOOK_BUDGET_CHARS,
|
|
137
|
+
MIN_PROMPT_CHARS,
|
|
138
|
+
MIN_CONTENT_TOKENS,
|
|
139
|
+
} from './recall-hook-policy.js';
|
|
140
|
+
export type { QueryLang, RecallFloors, HookCandidate, HookSelection } from './recall-hook-policy.js';
|
|
128
141
|
export { discoverPackages, publishPackages, bumpPatch, compareVersions, findUnpackagedSkills, orderByDependencies, syncReadmeVersion } from './publish.js';
|
|
129
142
|
export { fetchAllDownloads } from './downloads.js';
|
|
130
143
|
export type { PackageDownloads, DownloadsReport } from './downloads.js';
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure policy for the `dz recall` APPLY leg — the `UserPromptSubmit` hook that grounds a live prompt
|
|
3
|
+
* against the learned-pattern store.
|
|
4
|
+
*
|
|
5
|
+
* ## Why a floor is the whole feature
|
|
6
|
+
*
|
|
7
|
+
* A store nobody reads is a write-only log; an apply-leg with no rank-leg is a noise generator. The
|
|
8
|
+
* sibling failure is live in this repo: agentic-qe's per-prompt hook injects the same five static
|
|
9
|
+
* guidance lines on every turn regardless of topic, and only 10 of its 198 stored patterns ever had
|
|
10
|
+
* `usage_count > 0`. Beating that means one thing above all: **emit nothing when nothing is relevant.**
|
|
11
|
+
*
|
|
12
|
+
* ## Where the numbers come from (MEASURED, not chosen by feel)
|
|
13
|
+
*
|
|
14
|
+
* Calibrated 2026-07-09 on a 32-probe labeled set (16 RU + 16 EN, half relevant / half irrelevant),
|
|
15
|
+
* embedded with `Xenova/paraphrase-multilingual-MiniLM-L12-v2` against the real 103-pattern store.
|
|
16
|
+
* Fixture: `test/fixtures/recall-floor-probes.json`; the dep-gated test re-derives the separation.
|
|
17
|
+
*
|
|
18
|
+
* - **Absolute max-cosine separates perfectly** — a single global floor of `0.353` classified all 32
|
|
19
|
+
* probes correctly. Per language the safe window widens: RU `min(relevant)=0.415`,
|
|
20
|
+
* `max(irrelevant)=0.337`; EN `min(relevant)=0.369`, `max(irrelevant)=0.254`.
|
|
21
|
+
* - **A z-score `(max − mean) / sd` FAILS** (69 % accuracy, negative margin). An off-topic query has a
|
|
22
|
+
* flat, low similarity profile, so its best hit stands out *relative to its own mean* — `"who won the
|
|
23
|
+
* world cup"` scored z = 3.60, higher than half the relevant probes. Distance from your own mean
|
|
24
|
+
* measures flatness, not relevance. This was the elegant idea; the data refuted it.
|
|
25
|
+
* - The language baseline shift is **real but survivable**: an irrelevant Russian query reaches 0.337
|
|
26
|
+
* where an irrelevant English one reaches 0.254. A single floor still works, with a thin 0.032
|
|
27
|
+
* margin; per-language floors triple it. Hence the defaults below.
|
|
28
|
+
*
|
|
29
|
+
* The turns that must stay silent do: `"спасибо"` scores 0.259, `"какой статус?"` 0.318 — both under
|
|
30
|
+
* every floor here.
|
|
31
|
+
*
|
|
32
|
+
* @packageDocumentation
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/** Script family of a query — the only axis the floor is calibrated on. */
|
|
36
|
+
export type QueryLang = 'ru' | 'en';
|
|
37
|
+
|
|
38
|
+
/** Per-language relevance floors on the max cosine similarity, `[0,1]`. */
|
|
39
|
+
export interface RecallFloors {
|
|
40
|
+
readonly ru: number;
|
|
41
|
+
readonly en: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* MEASURED defaults. RU sits higher than EN because a multilingual encoder places any Cyrillic text
|
|
46
|
+
* slightly closer to any Latin text than two unrelated Latin texts are to each other — the baseline,
|
|
47
|
+
* not the signal, is what shifts.
|
|
48
|
+
*/
|
|
49
|
+
export const DEFAULT_RECALL_FLOORS: RecallFloors = { ru: 0.38, en: 0.31 };
|
|
50
|
+
|
|
51
|
+
/** Max hits injected into a turn. Three is the ADR default; more is noise, not context. */
|
|
52
|
+
export const DEFAULT_RECALL_HOOK_LIMIT = 3;
|
|
53
|
+
|
|
54
|
+
/** Rough character budget for the injected block (~4 chars/token; Cyrillic runs denser, so this is conservative). */
|
|
55
|
+
export const DEFAULT_RECALL_HOOK_BUDGET_CHARS = 1200;
|
|
56
|
+
|
|
57
|
+
const CYRILLIC = /[Ѐ-ӿ]/;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Which floor applies to this prompt. Cyrillic anywhere ⇒ `'ru'`: a mixed prompt such as
|
|
61
|
+
* `"почему codex барьер даёт ложный grade D"` carries the Russian baseline, so it must be judged by
|
|
62
|
+
* the stricter floor. Never throws — a non-string is `'en'`.
|
|
63
|
+
*/
|
|
64
|
+
export function detectQueryLang(text: unknown): QueryLang {
|
|
65
|
+
if (typeof text !== 'string') return 'en';
|
|
66
|
+
return CYRILLIC.test(text) ? 'ru' : 'en';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The floor for a prompt, given (possibly partial, possibly garbage) configured overrides. */
|
|
70
|
+
export function relevanceFloorFor(text: unknown, floors: Partial<RecallFloors> | undefined): number {
|
|
71
|
+
const lang = detectQueryLang(text);
|
|
72
|
+
const configured = floors?.[lang];
|
|
73
|
+
const valid = typeof configured === 'number' && isFinite(configured) && configured >= 0 && configured <= 1;
|
|
74
|
+
return valid ? configured : DEFAULT_RECALL_FLOORS[lang];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Below this many characters a prompt carries too little signal to judge. */
|
|
78
|
+
export const MIN_PROMPT_CHARS = 10;
|
|
79
|
+
/** …and it must contain at least this many content tokens (length ≥ 3). */
|
|
80
|
+
export const MIN_CONTENT_TOKENS = 2;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* A prompt too short to judge. Found by dogfooding the live hook: `"тест"` and `"json"` cleared the
|
|
84
|
+
* cosine floor (0.43) purely because a one-word technical token is genuinely close to technical
|
|
85
|
+
* lessons — the similarity is real, the relevance is not. A floor cannot fix this; the query simply
|
|
86
|
+
* carries no intent. Never throws.
|
|
87
|
+
*/
|
|
88
|
+
export function hasEnoughSignal(text: unknown): boolean {
|
|
89
|
+
if (typeof text !== 'string') return false;
|
|
90
|
+
const t = text.trim();
|
|
91
|
+
if (t.length < MIN_PROMPT_CHARS) return false;
|
|
92
|
+
const tokens = t.split(/[^\p{L}\p{N}]+/u).filter((w) => w.length >= 3);
|
|
93
|
+
return tokens.length >= MIN_CONTENT_TOKENS;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** One ranked candidate from the recall engine. `score` is the relevance in `[0,1]`, NOT the reward. */
|
|
97
|
+
export interface HookCandidate {
|
|
98
|
+
readonly pattern: string;
|
|
99
|
+
readonly score: number;
|
|
100
|
+
readonly domain?: string;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface HookSelection {
|
|
104
|
+
readonly hits: readonly HookCandidate[];
|
|
105
|
+
/** The floor that was applied — reported so the hook's own output can explain its silence. */
|
|
106
|
+
readonly floor: number;
|
|
107
|
+
readonly lang: QueryLang;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Apply the floor, the limit and the character budget. Returns an EMPTY hit list whenever nothing
|
|
112
|
+
* clears the floor — the caller must then print nothing at all and exit 0. Pure, never throws:
|
|
113
|
+
* malformed candidates (missing/NaN score, empty text) are dropped rather than crashing a turn.
|
|
114
|
+
*/
|
|
115
|
+
export function selectHookHits(
|
|
116
|
+
prompt: unknown,
|
|
117
|
+
candidates: readonly HookCandidate[] | null | undefined,
|
|
118
|
+
opts: { floors?: Partial<RecallFloors>; limit?: number; budgetChars?: number } = {},
|
|
119
|
+
): HookSelection {
|
|
120
|
+
const lang = detectQueryLang(prompt);
|
|
121
|
+
const floor = relevanceFloorFor(prompt, opts.floors);
|
|
122
|
+
const limit = intOr(opts.limit, DEFAULT_RECALL_HOOK_LIMIT);
|
|
123
|
+
const budget = intOr(opts.budgetChars, DEFAULT_RECALL_HOOK_BUDGET_CHARS);
|
|
124
|
+
|
|
125
|
+
// A prompt with no intent gets no injection, whatever its cosine says.
|
|
126
|
+
if (!hasEnoughSignal(prompt)) return { hits: [], floor, lang };
|
|
127
|
+
|
|
128
|
+
const clean = (candidates ?? [])
|
|
129
|
+
.filter(
|
|
130
|
+
(c): c is HookCandidate =>
|
|
131
|
+
c !== null &&
|
|
132
|
+
typeof c === 'object' &&
|
|
133
|
+
typeof c.pattern === 'string' &&
|
|
134
|
+
c.pattern.trim() !== '' &&
|
|
135
|
+
typeof c.score === 'number' &&
|
|
136
|
+
isFinite(c.score),
|
|
137
|
+
)
|
|
138
|
+
.filter((c) => c.score >= floor)
|
|
139
|
+
.sort((a, b) => b.score - a.score);
|
|
140
|
+
|
|
141
|
+
const hits: HookCandidate[] = [];
|
|
142
|
+
let used = 0;
|
|
143
|
+
for (const c of clean) {
|
|
144
|
+
if (hits.length >= limit) break;
|
|
145
|
+
const cost = c.pattern.length;
|
|
146
|
+
// Always admit the top hit even if it alone exceeds the budget — a truncated best lesson beats
|
|
147
|
+
// silence. Subsequent hits must fit.
|
|
148
|
+
if (hits.length > 0 && used + cost > budget) break;
|
|
149
|
+
hits.push(c);
|
|
150
|
+
used += cost;
|
|
151
|
+
}
|
|
152
|
+
return { hits, floor, lang };
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function intOr(v: unknown, fallback: number): number {
|
|
156
|
+
return typeof v === 'number' && isFinite(v) && v > 0 ? Math.floor(v) : fallback;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Render the `additionalContext` block. Returns `''` when there is nothing to say — the caller emits
|
|
161
|
+
* NOTHING (not an empty JSON envelope) and exits 0, so an off-topic turn costs the reader zero tokens.
|
|
162
|
+
*/
|
|
163
|
+
export function renderHookContext(selection: HookSelection): string {
|
|
164
|
+
if (selection.hits.length === 0) return '';
|
|
165
|
+
const lines = selection.hits.map((h) => ` - [${h.score.toFixed(2)}${h.domain ? ` / ${h.domain}` : ''}] ${h.pattern}`);
|
|
166
|
+
return `Learned lessons that match this prompt (dz recall, relevance ≥ ${selection.floor.toFixed(2)}):\n${lines.join('\n')}`;
|
|
167
|
+
}
|