@dzhechkov/harness-core 0.3.118 → 0.3.119
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/bto-optimize.d.ts +97 -0
- package/dist/bto-optimize.d.ts.map +1 -0
- package/dist/bto-optimize.js +250 -0
- package/dist/bto-optimize.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/bto-optimize.ts +270 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hold-out validated skill optimization (feature bto-optimize-holdout, ADR-001).
|
|
3
|
+
*
|
|
4
|
+
* Strengthens the EXISTING `/bto-optimize` skill from within with dspy-MIPROv2 rigor (grounded in the shipped
|
|
5
|
+
* `dspy.ts/src/optimize/miprov2.ts`: propose → minibatch-tune → validate on held-out → best). The current BTO
|
|
6
|
+
* loop selects the highest score on the SAME eval it tuned on — which games the LLM judge panel (Goodhart).
|
|
7
|
+
* This engine adds what it lacks: a deterministic tune/holdout split, a hard budget cap, a weakest-dimension
|
|
8
|
+
* objective, and a **no-regress-on-HOLD-OUT** winner selector. All functions are PURE over injected judge
|
|
9
|
+
* scores + text (no LLM, no clock, no random); candidate-prose generation and judging stay skill-side.
|
|
10
|
+
*
|
|
11
|
+
* SAFETY PROPERTIES (ADR-001, load-bearing, each pinned by a test):
|
|
12
|
+
* 1. §2 — `selectWinner` accepts a candidate ONLY on the HOLD-OUT scores (weakest dim improves + no other
|
|
13
|
+
* dim / the aggregate regresses beyond `tolerance`). A candidate that wins on `tune` but regresses on
|
|
14
|
+
* `holdout` is REJECTED — this defeats judge-gaming. `tune` never decides acceptance.
|
|
15
|
+
* 2. §? — `budgetPlan` NEVER returns a plan exceeding `maxJudgeRuns`: it shrinks candidates/rounds to fit
|
|
16
|
+
* and reports what it trimmed, so the loop can never run a surprise-cost number of judge passes.
|
|
17
|
+
* 3. §3 — the engine NEVER writes a file (only renders a diff + returns a decision); `proseScopeOk` rejects
|
|
18
|
+
* a candidate that touches frontmatter or structural headings (augment-not-clobber).
|
|
19
|
+
*/
|
|
20
|
+
export type BtoDimension = 'METHODOLOGY' | 'DEPTH' | 'CORRECTNESS' | 'USABILITY' | 'ROBUSTNESS';
|
|
21
|
+
export declare const BTO_DIMENSIONS: readonly BtoDimension[];
|
|
22
|
+
export type DimScores = Record<BtoDimension, number>;
|
|
23
|
+
export interface ScenarioSplit {
|
|
24
|
+
readonly tune: readonly string[];
|
|
25
|
+
readonly holdout: readonly string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Partition scenario ids into tune/holdout DETERMINISTICALLY (no clock/random): sort by id, then interleave —
|
|
29
|
+
* every k-th id (k = round(1/holdoutRatio)) goes to holdout. Guarantees ≥1 on each side when ≥2 ids exist.
|
|
30
|
+
* Same input → byte-identical split.
|
|
31
|
+
*/
|
|
32
|
+
export declare function splitScenarios(ids: readonly string[], holdoutRatio?: number): ScenarioSplit;
|
|
33
|
+
export interface BudgetInput {
|
|
34
|
+
readonly candidates: number;
|
|
35
|
+
readonly rounds: number;
|
|
36
|
+
readonly tuneCount: number;
|
|
37
|
+
readonly holdoutCount: number;
|
|
38
|
+
}
|
|
39
|
+
export interface BudgetPlan {
|
|
40
|
+
readonly candidates: number;
|
|
41
|
+
readonly rounds: number;
|
|
42
|
+
readonly tuneRuns: number;
|
|
43
|
+
readonly holdoutRuns: number;
|
|
44
|
+
readonly totalRuns: number;
|
|
45
|
+
readonly cap: number;
|
|
46
|
+
readonly withinCap: boolean;
|
|
47
|
+
readonly trimmed?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Documented default cap (configurable — NOT a magic constant): a single L2 judge pass per scenario per
|
|
50
|
+
* candidate is the unit; 24 keeps a 5-candidate × ~4-scenario tune + holdout validation comfortably bounded. */
|
|
51
|
+
export declare const DEFAULT_MAX_JUDGE_RUNS = 24;
|
|
52
|
+
/**
|
|
53
|
+
* Judge-run accounting: tune scoring = candidates × rounds × tuneCount; holdout validation = 1 (top-1) ×
|
|
54
|
+
* holdoutCount. If the total exceeds `maxJudgeRuns`, SHRINK — first `rounds` to 1, then `candidates` — until it
|
|
55
|
+
* fits, and report what was trimmed. Never returns an over-cap plan (safety property 2).
|
|
56
|
+
*/
|
|
57
|
+
export declare function budgetPlan(input: BudgetInput, maxJudgeRuns?: number): BudgetPlan;
|
|
58
|
+
/** Every one of the 5 BTO dimensions must be a valid score for a DimScores to be usable. */
|
|
59
|
+
export declare function validDimScores(s: unknown): s is DimScores;
|
|
60
|
+
export declare function aggregate(s: DimScores): number;
|
|
61
|
+
/** The lowest-scoring dimension (the bottleneck to lift). Deterministic tie-break by BTO_DIMENSIONS order. */
|
|
62
|
+
export declare function weakestDimension(s: DimScores): BtoDimension;
|
|
63
|
+
export interface Candidate {
|
|
64
|
+
readonly id: string;
|
|
65
|
+
readonly prose: string;
|
|
66
|
+
readonly tune: DimScores;
|
|
67
|
+
readonly holdout: DimScores;
|
|
68
|
+
}
|
|
69
|
+
export interface WinnerResult {
|
|
70
|
+
readonly winner: string | null;
|
|
71
|
+
readonly reason: string;
|
|
72
|
+
readonly weakest: BtoDimension;
|
|
73
|
+
readonly deltas?: Record<string, number>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Accept a candidate ONLY on the HOLD-OUT scores (ADR §2): the baseline's weakest dimension must improve by > 0
|
|
77
|
+
* AND no other dimension AND the aggregate may regress by more than `tolerance` (default 0 = strict). Candidates
|
|
78
|
+
* are considered in descending TUNE-aggregate order (the minibatch rank — dspy's search), but acceptance reads
|
|
79
|
+
* only holdout, so a tune-winner that regresses on holdout is rejected. Deterministic; returns the first
|
|
80
|
+
* candidate that passes, or null with a reason.
|
|
81
|
+
*/
|
|
82
|
+
export declare function selectWinner(baseline: {
|
|
83
|
+
readonly holdout: DimScores;
|
|
84
|
+
}, candidates: readonly Candidate[], opts?: {
|
|
85
|
+
tolerance?: number;
|
|
86
|
+
}): WinnerResult;
|
|
87
|
+
/** Only directive PROSE may change (Phase-1): frontmatter + the set of ALL markdown structural markers must be
|
|
88
|
+
* identical. A candidate that alters them (incl. CRLF, tab-ATX, empty-ATX, setext) is rejected (augment-not-clobber). */
|
|
89
|
+
export declare function proseScopeOk(original: string, candidate: string): {
|
|
90
|
+
ok: boolean;
|
|
91
|
+
reason: string;
|
|
92
|
+
};
|
|
93
|
+
/** A minimal deterministic unified-ish line diff for the confirm gate (pure). */
|
|
94
|
+
export declare function renderProseDiff(original: string, candidate: string): string;
|
|
95
|
+
/** Read a scenario-id list: JSON array, or newline/comma-separated. Absent/unreadable → []. */
|
|
96
|
+
export declare function readScenarioIds(path: string): string[];
|
|
97
|
+
//# sourceMappingURL=bto-optimize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bto-optimize.d.ts","sourceRoot":"","sources":["../src/bto-optimize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hold-out validated skill optimization (feature bto-optimize-holdout, ADR-001).
|
|
3
|
+
*
|
|
4
|
+
* Strengthens the EXISTING `/bto-optimize` skill from within with dspy-MIPROv2 rigor (grounded in the shipped
|
|
5
|
+
* `dspy.ts/src/optimize/miprov2.ts`: propose → minibatch-tune → validate on held-out → best). The current BTO
|
|
6
|
+
* loop selects the highest score on the SAME eval it tuned on — which games the LLM judge panel (Goodhart).
|
|
7
|
+
* This engine adds what it lacks: a deterministic tune/holdout split, a hard budget cap, a weakest-dimension
|
|
8
|
+
* objective, and a **no-regress-on-HOLD-OUT** winner selector. All functions are PURE over injected judge
|
|
9
|
+
* scores + text (no LLM, no clock, no random); candidate-prose generation and judging stay skill-side.
|
|
10
|
+
*
|
|
11
|
+
* SAFETY PROPERTIES (ADR-001, load-bearing, each pinned by a test):
|
|
12
|
+
* 1. §2 — `selectWinner` accepts a candidate ONLY on the HOLD-OUT scores (weakest dim improves + no other
|
|
13
|
+
* dim / the aggregate regresses beyond `tolerance`). A candidate that wins on `tune` but regresses on
|
|
14
|
+
* `holdout` is REJECTED — this defeats judge-gaming. `tune` never decides acceptance.
|
|
15
|
+
* 2. §? — `budgetPlan` NEVER returns a plan exceeding `maxJudgeRuns`: it shrinks candidates/rounds to fit
|
|
16
|
+
* and reports what it trimmed, so the loop can never run a surprise-cost number of judge passes.
|
|
17
|
+
* 3. §3 — the engine NEVER writes a file (only renders a diff + returns a decision); `proseScopeOk` rejects
|
|
18
|
+
* a candidate that touches frontmatter or structural headings (augment-not-clobber).
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
21
|
+
export const BTO_DIMENSIONS = Object.freeze(['METHODOLOGY', 'DEPTH', 'CORRECTNESS', 'USABILITY', 'ROBUSTNESS']);
|
|
22
|
+
const byStr = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
23
|
+
/**
|
|
24
|
+
* Partition scenario ids into tune/holdout DETERMINISTICALLY (no clock/random): sort by id, then interleave —
|
|
25
|
+
* every k-th id (k = round(1/holdoutRatio)) goes to holdout. Guarantees ≥1 on each side when ≥2 ids exist.
|
|
26
|
+
* Same input → byte-identical split.
|
|
27
|
+
*/
|
|
28
|
+
export function splitScenarios(ids, holdoutRatio = 0.34) {
|
|
29
|
+
const sorted = [...new Set(ids.map((s) => String(s)))].filter((s) => s !== '').sort(byStr);
|
|
30
|
+
if (sorted.length === 0)
|
|
31
|
+
return { tune: [], holdout: [] };
|
|
32
|
+
if (sorted.length === 1)
|
|
33
|
+
return { tune: sorted, holdout: [] };
|
|
34
|
+
const ratio = holdoutRatio > 0 && holdoutRatio < 1 ? holdoutRatio : 0.34;
|
|
35
|
+
const k = Math.max(2, Math.round(1 / ratio)); // every k-th → holdout
|
|
36
|
+
const tune = [];
|
|
37
|
+
const holdout = [];
|
|
38
|
+
sorted.forEach((id, i) => ((i + 1) % k === 0 ? holdout : tune).push(id));
|
|
39
|
+
// guarantee ≥1 each side
|
|
40
|
+
if (holdout.length === 0)
|
|
41
|
+
holdout.push(tune.pop());
|
|
42
|
+
if (tune.length === 0)
|
|
43
|
+
tune.push(holdout.pop());
|
|
44
|
+
return { tune, holdout };
|
|
45
|
+
}
|
|
46
|
+
/** Documented default cap (configurable — NOT a magic constant): a single L2 judge pass per scenario per
|
|
47
|
+
* candidate is the unit; 24 keeps a 5-candidate × ~4-scenario tune + holdout validation comfortably bounded. */
|
|
48
|
+
export const DEFAULT_MAX_JUDGE_RUNS = 24;
|
|
49
|
+
/**
|
|
50
|
+
* Judge-run accounting: tune scoring = candidates × rounds × tuneCount; holdout validation = 1 (top-1) ×
|
|
51
|
+
* holdoutCount. If the total exceeds `maxJudgeRuns`, SHRINK — first `rounds` to 1, then `candidates` — until it
|
|
52
|
+
* fits, and report what was trimmed. Never returns an over-cap plan (safety property 2).
|
|
53
|
+
*/
|
|
54
|
+
export function budgetPlan(input, maxJudgeRuns = DEFAULT_MAX_JUDGE_RUNS) {
|
|
55
|
+
const cap = Number.isFinite(maxJudgeRuns) && maxJudgeRuns > 0 ? Math.floor(maxJudgeRuns) : DEFAULT_MAX_JUDGE_RUNS;
|
|
56
|
+
const tuneCount = Math.max(0, Math.floor(input.tuneCount));
|
|
57
|
+
const holdoutCount = Math.max(0, Math.floor(input.holdoutCount));
|
|
58
|
+
let candidates = Math.max(1, Math.floor(input.candidates));
|
|
59
|
+
let rounds = Math.max(1, Math.floor(input.rounds));
|
|
60
|
+
const trims = [];
|
|
61
|
+
const total = (c, r) => c * r * tuneCount + holdoutCount;
|
|
62
|
+
if (total(candidates, rounds) > cap && rounds > 1) {
|
|
63
|
+
rounds = 1;
|
|
64
|
+
trims.push('rounds→1');
|
|
65
|
+
}
|
|
66
|
+
while (total(candidates, rounds) > cap && candidates > 1) {
|
|
67
|
+
candidates -= 1;
|
|
68
|
+
}
|
|
69
|
+
if (candidates < Math.max(1, Math.floor(input.candidates)))
|
|
70
|
+
trims.push('candidates→' + candidates);
|
|
71
|
+
const tuneRuns = candidates * rounds * tuneCount;
|
|
72
|
+
const holdoutRuns = holdoutCount; // validate the top-1 candidate on holdout
|
|
73
|
+
const totalRuns = tuneRuns + holdoutRuns;
|
|
74
|
+
const plan = {
|
|
75
|
+
candidates, rounds, tuneRuns, holdoutRuns, totalRuns, cap, withinCap: totalRuns <= cap,
|
|
76
|
+
...(trims.length ? { trimmed: trims.join(', ') } : {}),
|
|
77
|
+
};
|
|
78
|
+
return plan;
|
|
79
|
+
}
|
|
80
|
+
// ── FR-3 / aggregate ────────────────────────────────────────────────────────────────────────────────────
|
|
81
|
+
const dimVal = (s, d) => {
|
|
82
|
+
const v = s[d];
|
|
83
|
+
return typeof v === 'number' && Number.isFinite(v) ? v : 0;
|
|
84
|
+
};
|
|
85
|
+
/** A judge score is a finite number in the rubric range [0, 10]. Anything else (missing, string, NaN,
|
|
86
|
+
* Infinity, negative, >10) is MALFORMED — it must never coerce silently to 0 and fabricate a winner (QE). */
|
|
87
|
+
const isValidScore = (v) => typeof v === 'number' && Number.isFinite(v) && v >= 0 && v <= 10;
|
|
88
|
+
/** Every one of the 5 BTO dimensions must be a valid score for a DimScores to be usable. */
|
|
89
|
+
export function validDimScores(s) {
|
|
90
|
+
if (s === null || typeof s !== 'object')
|
|
91
|
+
return false;
|
|
92
|
+
const r = s;
|
|
93
|
+
return BTO_DIMENSIONS.every((d) => isValidScore(r[d]));
|
|
94
|
+
}
|
|
95
|
+
export function aggregate(s) {
|
|
96
|
+
return BTO_DIMENSIONS.reduce((sum, d) => sum + dimVal(s, d), 0) / BTO_DIMENSIONS.length;
|
|
97
|
+
}
|
|
98
|
+
/** The lowest-scoring dimension (the bottleneck to lift). Deterministic tie-break by BTO_DIMENSIONS order. */
|
|
99
|
+
export function weakestDimension(s) {
|
|
100
|
+
let best = BTO_DIMENSIONS[0];
|
|
101
|
+
for (const d of BTO_DIMENSIONS)
|
|
102
|
+
if (dimVal(s, d) < dimVal(s, best))
|
|
103
|
+
best = d;
|
|
104
|
+
return best;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Accept a candidate ONLY on the HOLD-OUT scores (ADR §2): the baseline's weakest dimension must improve by > 0
|
|
108
|
+
* AND no other dimension AND the aggregate may regress by more than `tolerance` (default 0 = strict). Candidates
|
|
109
|
+
* are considered in descending TUNE-aggregate order (the minibatch rank — dspy's search), but acceptance reads
|
|
110
|
+
* only holdout, so a tune-winner that regresses on holdout is rejected. Deterministic; returns the first
|
|
111
|
+
* candidate that passes, or null with a reason.
|
|
112
|
+
*/
|
|
113
|
+
export function selectWinner(baseline, candidates, opts = {}) {
|
|
114
|
+
// Reject malformed input BEFORE any comparison (QE): coercing missing/junk dims to 0 fabricates a winner.
|
|
115
|
+
if (!baseline || !validDimScores(baseline.holdout)) {
|
|
116
|
+
return { winner: null, reason: 'invalid baseline holdout scores (every dimension must be a number in [0,10])', weakest: BTO_DIMENSIONS[0] };
|
|
117
|
+
}
|
|
118
|
+
// tolerance must itself be a finite non-negative number (Infinity would disable the no-regress guard).
|
|
119
|
+
const tolerance = typeof opts.tolerance === 'number' && Number.isFinite(opts.tolerance) && opts.tolerance >= 0 ? opts.tolerance : 0;
|
|
120
|
+
const weakest = weakestDimension(baseline.holdout);
|
|
121
|
+
// only candidates with VALID holdout scores are eligible; a malformed candidate can never win.
|
|
122
|
+
const eligible = candidates.filter((c) => validDimScores(c.holdout) && validDimScores(c.tune));
|
|
123
|
+
const ranked = [...eligible].sort((a, b) => aggregate(b.tune) - aggregate(a.tune) || byStr(a.id, b.id));
|
|
124
|
+
let lastReason = `no candidate improved the weakest dimension (${weakest}) on the holdout without regression`;
|
|
125
|
+
for (const c of ranked) {
|
|
126
|
+
const weakDelta = dimVal(c.holdout, weakest) - dimVal(baseline.holdout, weakest);
|
|
127
|
+
if (weakDelta <= 0) {
|
|
128
|
+
lastReason = `${c.id}: weakest ${weakest} did not improve on holdout (Δ=${weakDelta.toFixed(2)})`;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// no-regress on every OTHER dimension + the aggregate
|
|
132
|
+
let regressed = null;
|
|
133
|
+
for (const d of BTO_DIMENSIONS) {
|
|
134
|
+
if (d === weakest)
|
|
135
|
+
continue;
|
|
136
|
+
const delta = dimVal(c.holdout, d) - dimVal(baseline.holdout, d);
|
|
137
|
+
if (delta < -tolerance) {
|
|
138
|
+
regressed = `${d} (Δ=${delta.toFixed(2)})`;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const aggDelta = aggregate(c.holdout) - aggregate(baseline.holdout);
|
|
143
|
+
if (!regressed && aggDelta < -tolerance)
|
|
144
|
+
regressed = `aggregate (Δ=${aggDelta.toFixed(2)})`;
|
|
145
|
+
if (regressed) {
|
|
146
|
+
lastReason = `${c.id}: lifted ${weakest} but regressed ${regressed} on holdout`;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
winner: c.id,
|
|
151
|
+
reason: `accepted on holdout: ${weakest} +${weakDelta.toFixed(2)}, aggregate ${aggDelta >= 0 ? '+' : ''}${aggDelta.toFixed(2)}, no regression`,
|
|
152
|
+
weakest,
|
|
153
|
+
deltas: { [weakest]: weakDelta, aggregate: aggDelta },
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return { winner: null, reason: lastReason, weakest };
|
|
157
|
+
}
|
|
158
|
+
// ── FR-7: prose-scope guard + diff ──────────────────────────────────────────────────────────────────────
|
|
159
|
+
// Normalize CRLF/CR → LF first, else a `\r\n` file evades the `\n`-anchored frontmatter/heading regexes (QE bypass).
|
|
160
|
+
const normEol = (t) => t.replace(/\r\n?/g, '\n');
|
|
161
|
+
const frontmatter = (t) => {
|
|
162
|
+
const m = /^---\n([\s\S]*?)\n---/.exec(normEol(t));
|
|
163
|
+
return m ? m[1] : '';
|
|
164
|
+
};
|
|
165
|
+
/** The document BODY (after the frontmatter block) — so the frontmatter's own closing `---` is never misread
|
|
166
|
+
* as a setext underline, and heading detection runs only on prose. */
|
|
167
|
+
const bodyAfterFrontmatter = (t) => {
|
|
168
|
+
const n = normEol(t);
|
|
169
|
+
const m = /^---\n[\s\S]*?\n---\n?/.exec(n);
|
|
170
|
+
return m ? n.slice(m[0].length) : n;
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* ALL structural markers on the BODY, not just space-delimited ATX (QE: `##\tNEW`, bare `##`, and setext
|
|
174
|
+
* `Title\n===` / `Title\n---` evaded the old regex). Fenced code blocks (``` / ~~~) are SKIPPED so a `===`/`---`
|
|
175
|
+
* line INSIDE code is not misread as a heading (QE false-positive). Collect ATX (`#`..`######` + any/no ws)
|
|
176
|
+
* AND setext underlines (a non-empty line immediately followed by `=+`/`-+`).
|
|
177
|
+
*/
|
|
178
|
+
const headings = (t) => {
|
|
179
|
+
const lines = bodyAfterFrontmatter(t).split('\n');
|
|
180
|
+
const out = [];
|
|
181
|
+
let inFence = false;
|
|
182
|
+
for (let i = 0; i < lines.length; i++) {
|
|
183
|
+
const line = lines[i];
|
|
184
|
+
if (/^\s*(```|~~~)/.test(line)) {
|
|
185
|
+
inFence = !inFence;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (inFence)
|
|
189
|
+
continue;
|
|
190
|
+
const atx = /^(#{1,6})(?:\s.*)?$/.exec(line.replace(/\s+$/, ''));
|
|
191
|
+
if (atx) {
|
|
192
|
+
out.push('ATX:' + line.trim());
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const next = lines[i + 1];
|
|
196
|
+
if (line.trim() !== '' && !/^\s*(```|~~~)/.test(next ?? '') && next !== undefined && /^(=+|-+)\s*$/.test(next)) {
|
|
197
|
+
out.push('SETEXT:' + line.trim() + '|' + next.trim());
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return out;
|
|
201
|
+
};
|
|
202
|
+
/** Only directive PROSE may change (Phase-1): frontmatter + the set of ALL markdown structural markers must be
|
|
203
|
+
* identical. A candidate that alters them (incl. CRLF, tab-ATX, empty-ATX, setext) is rejected (augment-not-clobber). */
|
|
204
|
+
export function proseScopeOk(original, candidate) {
|
|
205
|
+
if (frontmatter(original) !== frontmatter(candidate))
|
|
206
|
+
return { ok: false, reason: 'candidate changed the YAML frontmatter (out of scope: prose only)' };
|
|
207
|
+
const ho = headings(original);
|
|
208
|
+
const hc = headings(candidate);
|
|
209
|
+
if (ho.length !== hc.length || ho.some((h, i) => h !== hc[i]))
|
|
210
|
+
return { ok: false, reason: 'candidate changed the section headings/structure (out of scope: prose only)' };
|
|
211
|
+
return { ok: true, reason: 'prose-only change' };
|
|
212
|
+
}
|
|
213
|
+
/** A minimal deterministic unified-ish line diff for the confirm gate (pure). */
|
|
214
|
+
export function renderProseDiff(original, candidate) {
|
|
215
|
+
const a = original.split('\n');
|
|
216
|
+
const b = candidate.split('\n');
|
|
217
|
+
const out = ['--- current', '+++ candidate'];
|
|
218
|
+
const max = Math.max(a.length, b.length);
|
|
219
|
+
for (let i = 0; i < max; i++) {
|
|
220
|
+
const l = a[i];
|
|
221
|
+
const r = b[i];
|
|
222
|
+
if (l === r)
|
|
223
|
+
continue;
|
|
224
|
+
if (l !== undefined)
|
|
225
|
+
out.push('- ' + l);
|
|
226
|
+
if (r !== undefined)
|
|
227
|
+
out.push('+ ' + r);
|
|
228
|
+
}
|
|
229
|
+
return out.length > 2 ? out.join('\n') : '(no textual difference)';
|
|
230
|
+
}
|
|
231
|
+
// ── thin I/O (top-level ESM fs; never throws) ───────────────────────────────────────────────────────────
|
|
232
|
+
/** Read a scenario-id list: JSON array, or newline/comma-separated. Absent/unreadable → []. */
|
|
233
|
+
export function readScenarioIds(path) {
|
|
234
|
+
try {
|
|
235
|
+
if (!existsSync(path))
|
|
236
|
+
return [];
|
|
237
|
+
const raw = readFileSync(path, 'utf8').trim();
|
|
238
|
+
if (raw === '')
|
|
239
|
+
return [];
|
|
240
|
+
if (raw.startsWith('[')) {
|
|
241
|
+
const arr = JSON.parse(raw);
|
|
242
|
+
return Array.isArray(arr) ? arr.map((x) => String(x)).filter((s) => s !== '') : [];
|
|
243
|
+
}
|
|
244
|
+
return raw.split(/[\n,]/).map((s) => s.trim()).filter((s) => s !== '');
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return [];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=bto-optimize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bto-optimize.js","sourceRoot":"","sources":["../src/bto-optimize.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
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
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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/harness-core",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.119",
|
|
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,10 +31,10 @@
|
|
|
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-
|
|
34
|
+
"@dzhechkov/adapter-cursor": "0.1.1",
|
|
35
35
|
"@dzhechkov/adapter-copilot": "0.1.1",
|
|
36
|
+
"@dzhechkov/adapter-gemini": "0.1.1",
|
|
36
37
|
"@dzhechkov/adapter-windsurf": "0.1.1",
|
|
37
|
-
"@dzhechkov/adapter-cursor": "0.1.1",
|
|
38
38
|
"@dzhechkov/core": "0.2.14",
|
|
39
39
|
"@dzhechkov/memory": "0.2.9"
|
|
40
40
|
},
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hold-out validated skill optimization (feature bto-optimize-holdout, ADR-001).
|
|
3
|
+
*
|
|
4
|
+
* Strengthens the EXISTING `/bto-optimize` skill from within with dspy-MIPROv2 rigor (grounded in the shipped
|
|
5
|
+
* `dspy.ts/src/optimize/miprov2.ts`: propose → minibatch-tune → validate on held-out → best). The current BTO
|
|
6
|
+
* loop selects the highest score on the SAME eval it tuned on — which games the LLM judge panel (Goodhart).
|
|
7
|
+
* This engine adds what it lacks: a deterministic tune/holdout split, a hard budget cap, a weakest-dimension
|
|
8
|
+
* objective, and a **no-regress-on-HOLD-OUT** winner selector. All functions are PURE over injected judge
|
|
9
|
+
* scores + text (no LLM, no clock, no random); candidate-prose generation and judging stay skill-side.
|
|
10
|
+
*
|
|
11
|
+
* SAFETY PROPERTIES (ADR-001, load-bearing, each pinned by a test):
|
|
12
|
+
* 1. §2 — `selectWinner` accepts a candidate ONLY on the HOLD-OUT scores (weakest dim improves + no other
|
|
13
|
+
* dim / the aggregate regresses beyond `tolerance`). A candidate that wins on `tune` but regresses on
|
|
14
|
+
* `holdout` is REJECTED — this defeats judge-gaming. `tune` never decides acceptance.
|
|
15
|
+
* 2. §? — `budgetPlan` NEVER returns a plan exceeding `maxJudgeRuns`: it shrinks candidates/rounds to fit
|
|
16
|
+
* and reports what it trimmed, so the loop can never run a surprise-cost number of judge passes.
|
|
17
|
+
* 3. §3 — the engine NEVER writes a file (only renders a diff + returns a decision); `proseScopeOk` rejects
|
|
18
|
+
* a candidate that touches frontmatter or structural headings (augment-not-clobber).
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
22
|
+
|
|
23
|
+
export type BtoDimension = 'METHODOLOGY' | 'DEPTH' | 'CORRECTNESS' | 'USABILITY' | 'ROBUSTNESS';
|
|
24
|
+
export const BTO_DIMENSIONS: readonly BtoDimension[] = Object.freeze(['METHODOLOGY', 'DEPTH', 'CORRECTNESS', 'USABILITY', 'ROBUSTNESS']);
|
|
25
|
+
export type DimScores = Record<BtoDimension, number>;
|
|
26
|
+
|
|
27
|
+
const byStr = (a: string, b: string): number => (a < b ? -1 : a > b ? 1 : 0);
|
|
28
|
+
|
|
29
|
+
// ── FR-1: deterministic tune/holdout split ──────────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
export interface ScenarioSplit {
|
|
32
|
+
readonly tune: readonly string[];
|
|
33
|
+
readonly holdout: readonly string[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Partition scenario ids into tune/holdout DETERMINISTICALLY (no clock/random): sort by id, then interleave —
|
|
38
|
+
* every k-th id (k = round(1/holdoutRatio)) goes to holdout. Guarantees ≥1 on each side when ≥2 ids exist.
|
|
39
|
+
* Same input → byte-identical split.
|
|
40
|
+
*/
|
|
41
|
+
export function splitScenarios(ids: readonly string[], holdoutRatio = 0.34): ScenarioSplit {
|
|
42
|
+
const sorted = [...new Set(ids.map((s) => String(s)))].filter((s) => s !== '').sort(byStr);
|
|
43
|
+
if (sorted.length === 0) return { tune: [], holdout: [] };
|
|
44
|
+
if (sorted.length === 1) return { tune: sorted, holdout: [] };
|
|
45
|
+
const ratio = holdoutRatio > 0 && holdoutRatio < 1 ? holdoutRatio : 0.34;
|
|
46
|
+
const k = Math.max(2, Math.round(1 / ratio)); // every k-th → holdout
|
|
47
|
+
const tune: string[] = [];
|
|
48
|
+
const holdout: string[] = [];
|
|
49
|
+
sorted.forEach((id, i) => ((i + 1) % k === 0 ? holdout : tune).push(id));
|
|
50
|
+
// guarantee ≥1 each side
|
|
51
|
+
if (holdout.length === 0) holdout.push(tune.pop()!);
|
|
52
|
+
if (tune.length === 0) tune.push(holdout.pop()!);
|
|
53
|
+
return { tune, holdout };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ── FR-2: budget plan with a hard cap ───────────────────────────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
export interface BudgetInput {
|
|
59
|
+
readonly candidates: number;
|
|
60
|
+
readonly rounds: number;
|
|
61
|
+
readonly tuneCount: number;
|
|
62
|
+
readonly holdoutCount: number;
|
|
63
|
+
}
|
|
64
|
+
export interface BudgetPlan {
|
|
65
|
+
readonly candidates: number;
|
|
66
|
+
readonly rounds: number;
|
|
67
|
+
readonly tuneRuns: number;
|
|
68
|
+
readonly holdoutRuns: number;
|
|
69
|
+
readonly totalRuns: number;
|
|
70
|
+
readonly cap: number;
|
|
71
|
+
readonly withinCap: boolean;
|
|
72
|
+
readonly trimmed?: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Documented default cap (configurable — NOT a magic constant): a single L2 judge pass per scenario per
|
|
76
|
+
* candidate is the unit; 24 keeps a 5-candidate × ~4-scenario tune + holdout validation comfortably bounded. */
|
|
77
|
+
export const DEFAULT_MAX_JUDGE_RUNS = 24;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Judge-run accounting: tune scoring = candidates × rounds × tuneCount; holdout validation = 1 (top-1) ×
|
|
81
|
+
* holdoutCount. If the total exceeds `maxJudgeRuns`, SHRINK — first `rounds` to 1, then `candidates` — until it
|
|
82
|
+
* fits, and report what was trimmed. Never returns an over-cap plan (safety property 2).
|
|
83
|
+
*/
|
|
84
|
+
export function budgetPlan(input: BudgetInput, maxJudgeRuns: number = DEFAULT_MAX_JUDGE_RUNS): BudgetPlan {
|
|
85
|
+
const cap = Number.isFinite(maxJudgeRuns) && maxJudgeRuns > 0 ? Math.floor(maxJudgeRuns) : DEFAULT_MAX_JUDGE_RUNS;
|
|
86
|
+
const tuneCount = Math.max(0, Math.floor(input.tuneCount));
|
|
87
|
+
const holdoutCount = Math.max(0, Math.floor(input.holdoutCount));
|
|
88
|
+
let candidates = Math.max(1, Math.floor(input.candidates));
|
|
89
|
+
let rounds = Math.max(1, Math.floor(input.rounds));
|
|
90
|
+
const trims: string[] = [];
|
|
91
|
+
const total = (c: number, r: number): number => c * r * tuneCount + holdoutCount;
|
|
92
|
+
if (total(candidates, rounds) > cap && rounds > 1) { rounds = 1; trims.push('rounds→1'); }
|
|
93
|
+
while (total(candidates, rounds) > cap && candidates > 1) { candidates -= 1; }
|
|
94
|
+
if (candidates < Math.max(1, Math.floor(input.candidates))) trims.push('candidates→' + candidates);
|
|
95
|
+
const tuneRuns = candidates * rounds * tuneCount;
|
|
96
|
+
const holdoutRuns = holdoutCount; // validate the top-1 candidate on holdout
|
|
97
|
+
const totalRuns = tuneRuns + holdoutRuns;
|
|
98
|
+
const plan: BudgetPlan = {
|
|
99
|
+
candidates, rounds, tuneRuns, holdoutRuns, totalRuns, cap, withinCap: totalRuns <= cap,
|
|
100
|
+
...(trims.length ? { trimmed: trims.join(', ') } : {}),
|
|
101
|
+
};
|
|
102
|
+
return plan;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ── FR-3 / aggregate ────────────────────────────────────────────────────────────────────────────────────
|
|
106
|
+
|
|
107
|
+
const dimVal = (s: DimScores, d: BtoDimension): number => {
|
|
108
|
+
const v = s[d];
|
|
109
|
+
return typeof v === 'number' && Number.isFinite(v) ? v : 0;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/** A judge score is a finite number in the rubric range [0, 10]. Anything else (missing, string, NaN,
|
|
113
|
+
* Infinity, negative, >10) is MALFORMED — it must never coerce silently to 0 and fabricate a winner (QE). */
|
|
114
|
+
const isValidScore = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v) && v >= 0 && v <= 10;
|
|
115
|
+
/** Every one of the 5 BTO dimensions must be a valid score for a DimScores to be usable. */
|
|
116
|
+
export function validDimScores(s: unknown): s is DimScores {
|
|
117
|
+
if (s === null || typeof s !== 'object') return false;
|
|
118
|
+
const r = s as Record<string, unknown>;
|
|
119
|
+
return BTO_DIMENSIONS.every((d) => isValidScore(r[d]));
|
|
120
|
+
}
|
|
121
|
+
export function aggregate(s: DimScores): number {
|
|
122
|
+
return BTO_DIMENSIONS.reduce((sum, d) => sum + dimVal(s, d), 0) / BTO_DIMENSIONS.length;
|
|
123
|
+
}
|
|
124
|
+
/** The lowest-scoring dimension (the bottleneck to lift). Deterministic tie-break by BTO_DIMENSIONS order. */
|
|
125
|
+
export function weakestDimension(s: DimScores): BtoDimension {
|
|
126
|
+
let best: BtoDimension = BTO_DIMENSIONS[0]!;
|
|
127
|
+
for (const d of BTO_DIMENSIONS) if (dimVal(s, d) < dimVal(s, best)) best = d;
|
|
128
|
+
return best;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ── FR-4: no-regress-on-HOLD-OUT winner selection (load-bearing) ─────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
export interface Candidate {
|
|
134
|
+
readonly id: string;
|
|
135
|
+
readonly prose: string;
|
|
136
|
+
readonly tune: DimScores;
|
|
137
|
+
readonly holdout: DimScores;
|
|
138
|
+
}
|
|
139
|
+
export interface WinnerResult {
|
|
140
|
+
readonly winner: string | null;
|
|
141
|
+
readonly reason: string;
|
|
142
|
+
readonly weakest: BtoDimension;
|
|
143
|
+
readonly deltas?: Record<string, number>;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Accept a candidate ONLY on the HOLD-OUT scores (ADR §2): the baseline's weakest dimension must improve by > 0
|
|
148
|
+
* AND no other dimension AND the aggregate may regress by more than `tolerance` (default 0 = strict). Candidates
|
|
149
|
+
* are considered in descending TUNE-aggregate order (the minibatch rank — dspy's search), but acceptance reads
|
|
150
|
+
* only holdout, so a tune-winner that regresses on holdout is rejected. Deterministic; returns the first
|
|
151
|
+
* candidate that passes, or null with a reason.
|
|
152
|
+
*/
|
|
153
|
+
export function selectWinner(baseline: { readonly holdout: DimScores }, candidates: readonly Candidate[], opts: { tolerance?: number } = {}): WinnerResult {
|
|
154
|
+
// Reject malformed input BEFORE any comparison (QE): coercing missing/junk dims to 0 fabricates a winner.
|
|
155
|
+
if (!baseline || !validDimScores(baseline.holdout)) {
|
|
156
|
+
return { winner: null, reason: 'invalid baseline holdout scores (every dimension must be a number in [0,10])', weakest: BTO_DIMENSIONS[0]! };
|
|
157
|
+
}
|
|
158
|
+
// tolerance must itself be a finite non-negative number (Infinity would disable the no-regress guard).
|
|
159
|
+
const tolerance = typeof opts.tolerance === 'number' && Number.isFinite(opts.tolerance) && opts.tolerance >= 0 ? opts.tolerance : 0;
|
|
160
|
+
const weakest = weakestDimension(baseline.holdout);
|
|
161
|
+
// only candidates with VALID holdout scores are eligible; a malformed candidate can never win.
|
|
162
|
+
const eligible = candidates.filter((c) => validDimScores(c.holdout) && validDimScores(c.tune));
|
|
163
|
+
const ranked = [...eligible].sort((a, b) => aggregate(b.tune) - aggregate(a.tune) || byStr(a.id, b.id));
|
|
164
|
+
let lastReason = `no candidate improved the weakest dimension (${weakest}) on the holdout without regression`;
|
|
165
|
+
for (const c of ranked) {
|
|
166
|
+
const weakDelta = dimVal(c.holdout, weakest) - dimVal(baseline.holdout, weakest);
|
|
167
|
+
if (weakDelta <= 0) { lastReason = `${c.id}: weakest ${weakest} did not improve on holdout (Δ=${weakDelta.toFixed(2)})`; continue; }
|
|
168
|
+
// no-regress on every OTHER dimension + the aggregate
|
|
169
|
+
let regressed: string | null = null;
|
|
170
|
+
for (const d of BTO_DIMENSIONS) {
|
|
171
|
+
if (d === weakest) continue;
|
|
172
|
+
const delta = dimVal(c.holdout, d) - dimVal(baseline.holdout, d);
|
|
173
|
+
if (delta < -tolerance) { regressed = `${d} (Δ=${delta.toFixed(2)})`; break; }
|
|
174
|
+
}
|
|
175
|
+
const aggDelta = aggregate(c.holdout) - aggregate(baseline.holdout);
|
|
176
|
+
if (!regressed && aggDelta < -tolerance) regressed = `aggregate (Δ=${aggDelta.toFixed(2)})`;
|
|
177
|
+
if (regressed) { lastReason = `${c.id}: lifted ${weakest} but regressed ${regressed} on holdout`; continue; }
|
|
178
|
+
return {
|
|
179
|
+
winner: c.id,
|
|
180
|
+
reason: `accepted on holdout: ${weakest} +${weakDelta.toFixed(2)}, aggregate ${aggDelta >= 0 ? '+' : ''}${aggDelta.toFixed(2)}, no regression`,
|
|
181
|
+
weakest,
|
|
182
|
+
deltas: { [weakest]: weakDelta, aggregate: aggDelta },
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return { winner: null, reason: lastReason, weakest };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// ── FR-7: prose-scope guard + diff ──────────────────────────────────────────────────────────────────────
|
|
189
|
+
|
|
190
|
+
// Normalize CRLF/CR → LF first, else a `\r\n` file evades the `\n`-anchored frontmatter/heading regexes (QE bypass).
|
|
191
|
+
const normEol = (t: string): string => t.replace(/\r\n?/g, '\n');
|
|
192
|
+
const frontmatter = (t: string): string => {
|
|
193
|
+
const m = /^---\n([\s\S]*?)\n---/.exec(normEol(t));
|
|
194
|
+
return m ? m[1]! : '';
|
|
195
|
+
};
|
|
196
|
+
/** The document BODY (after the frontmatter block) — so the frontmatter's own closing `---` is never misread
|
|
197
|
+
* as a setext underline, and heading detection runs only on prose. */
|
|
198
|
+
const bodyAfterFrontmatter = (t: string): string => {
|
|
199
|
+
const n = normEol(t);
|
|
200
|
+
const m = /^---\n[\s\S]*?\n---\n?/.exec(n);
|
|
201
|
+
return m ? n.slice(m[0].length) : n;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* ALL structural markers on the BODY, not just space-delimited ATX (QE: `##\tNEW`, bare `##`, and setext
|
|
206
|
+
* `Title\n===` / `Title\n---` evaded the old regex). Fenced code blocks (``` / ~~~) are SKIPPED so a `===`/`---`
|
|
207
|
+
* line INSIDE code is not misread as a heading (QE false-positive). Collect ATX (`#`..`######` + any/no ws)
|
|
208
|
+
* AND setext underlines (a non-empty line immediately followed by `=+`/`-+`).
|
|
209
|
+
*/
|
|
210
|
+
const headings = (t: string): string[] => {
|
|
211
|
+
const lines = bodyAfterFrontmatter(t).split('\n');
|
|
212
|
+
const out: string[] = [];
|
|
213
|
+
let inFence = false;
|
|
214
|
+
for (let i = 0; i < lines.length; i++) {
|
|
215
|
+
const line = lines[i]!;
|
|
216
|
+
if (/^\s*(```|~~~)/.test(line)) { inFence = !inFence; continue; }
|
|
217
|
+
if (inFence) continue;
|
|
218
|
+
const atx = /^(#{1,6})(?:\s.*)?$/.exec(line.replace(/\s+$/, ''));
|
|
219
|
+
if (atx) { out.push('ATX:' + line.trim()); continue; }
|
|
220
|
+
const next = lines[i + 1];
|
|
221
|
+
if (line.trim() !== '' && !/^\s*(```|~~~)/.test(next ?? '') && next !== undefined && /^(=+|-+)\s*$/.test(next)) {
|
|
222
|
+
out.push('SETEXT:' + line.trim() + '|' + next.trim());
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return out;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/** Only directive PROSE may change (Phase-1): frontmatter + the set of ALL markdown structural markers must be
|
|
229
|
+
* identical. A candidate that alters them (incl. CRLF, tab-ATX, empty-ATX, setext) is rejected (augment-not-clobber). */
|
|
230
|
+
export function proseScopeOk(original: string, candidate: string): { ok: boolean; reason: string } {
|
|
231
|
+
if (frontmatter(original) !== frontmatter(candidate)) return { ok: false, reason: 'candidate changed the YAML frontmatter (out of scope: prose only)' };
|
|
232
|
+
const ho = headings(original);
|
|
233
|
+
const hc = headings(candidate);
|
|
234
|
+
if (ho.length !== hc.length || ho.some((h, i) => h !== hc[i])) return { ok: false, reason: 'candidate changed the section headings/structure (out of scope: prose only)' };
|
|
235
|
+
return { ok: true, reason: 'prose-only change' };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** A minimal deterministic unified-ish line diff for the confirm gate (pure). */
|
|
239
|
+
export function renderProseDiff(original: string, candidate: string): string {
|
|
240
|
+
const a = original.split('\n');
|
|
241
|
+
const b = candidate.split('\n');
|
|
242
|
+
const out: string[] = ['--- current', '+++ candidate'];
|
|
243
|
+
const max = Math.max(a.length, b.length);
|
|
244
|
+
for (let i = 0; i < max; i++) {
|
|
245
|
+
const l = a[i];
|
|
246
|
+
const r = b[i];
|
|
247
|
+
if (l === r) continue;
|
|
248
|
+
if (l !== undefined) out.push('- ' + l);
|
|
249
|
+
if (r !== undefined) out.push('+ ' + r);
|
|
250
|
+
}
|
|
251
|
+
return out.length > 2 ? out.join('\n') : '(no textual difference)';
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// ── thin I/O (top-level ESM fs; never throws) ───────────────────────────────────────────────────────────
|
|
255
|
+
|
|
256
|
+
/** Read a scenario-id list: JSON array, or newline/comma-separated. Absent/unreadable → []. */
|
|
257
|
+
export function readScenarioIds(path: string): string[] {
|
|
258
|
+
try {
|
|
259
|
+
if (!existsSync(path)) return [];
|
|
260
|
+
const raw = readFileSync(path, 'utf8').trim();
|
|
261
|
+
if (raw === '') return [];
|
|
262
|
+
if (raw.startsWith('[')) {
|
|
263
|
+
const arr = JSON.parse(raw) as unknown;
|
|
264
|
+
return Array.isArray(arr) ? arr.map((x) => String(x)).filter((s) => s !== '') : [];
|
|
265
|
+
}
|
|
266
|
+
return raw.split(/[\n,]/).map((s) => s.trim()).filter((s) => s !== '');
|
|
267
|
+
} catch {
|
|
268
|
+
return [];
|
|
269
|
+
}
|
|
270
|
+
}
|
package/src/index.ts
CHANGED