@mmnto/totem 1.82.0 → 1.84.0

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.
@@ -0,0 +1,308 @@
1
+ // ─── ADR-112 §6/§9 — the authored-controls EMISSION builder (slice C2b) ──────
2
+ //
3
+ // An authored rule earns its §6 controls structurally, not by hand: a TRAIN-side
4
+ // positive fixture becomes a positive control ONLY when its preimage-differential
5
+ // HOLDS (fires on the defect preimage, silent on the fixed postimage — §4); a
6
+ // declared near-miss becomes a negative control DECLARATIVELY (a one-leg silence
7
+ // assertion the §6 scorer resolves at slice D). This module turns a set of
8
+ // compiled AUTHORED rules + the frozen split into those three emission lists.
9
+ //
10
+ // It is deliberately INERT (like the C1 preimage-differential primitive): it
11
+ // wires nothing into a cert run, mints no §5 verdict, and reads no git. The §4
12
+ // differential is injected (default = the real evaluator) so the producer stays
13
+ // pure + fully testable; slice D consumes the emission lists + joins the loci
14
+ // back (Tenet-20) to the run vocabulary.
15
+ //
16
+ // Two strategy-ratified asymmetries (strategy#777) are load-bearing here:
17
+ // - POSITIVE controls are GATED on the §4 differential and keyed on the fixture
18
+ // LOCUS (`filePath`, `matchedSpan`) — the two-loci-one-PR disambiguator that
19
+ // prevents a wrong-exemplar miscert when one PR contributes two fixtures (Q1
20
+ // ruling (a)). `contentHash` is span-content-only (NOT locus-unique: two distinct
21
+ // loci with byte-identical span content collide), so it is deliberately NOT
22
+ // carried on the emitted control — the locus is. The shipped positive emission is
23
+ // `{ pr, targetRuleId, filePath, matchedSpan }`, no `contentHash`.
24
+ // - NEGATIVE controls are DECLARATIVE — no differential, no silence gate, no
25
+ // train-side check: a synthetic near-miss carries no `pr` and no corpus
26
+ // position, so its (filePath, matchedSpan) locus is the disambiguator (Q2).
27
+ //
28
+ // The producer-kind contract (train-side positives, differential gate) is READ
29
+ // from `getRulePolicy('authored')` — the §9 single-home — and fail-loud-asserted,
30
+ // never hard-coded, so a policy/producer divergence surfaces here, not at slice D.
31
+ import { z } from 'zod';
32
+ import { isAuthoredProvenance, provenanceKind, } from '../compiler-schema.js';
33
+ import { evaluatePreimageDifferential, } from './preimage-differential.js';
34
+ import { getRulePolicy } from './rule-policy.js';
35
+ /** Non-blank string field (trim-then-min — the house convention, cf. cert-corpus-seed.ts). */
36
+ const nonBlank = (msg) => z.string().trim().min(1, msg);
37
+ /**
38
+ * Encode a §6 emission join-key from its parts. `JSON.stringify` (NOT a `\0`-joined
39
+ * template) so the key is delimiter-injection-proof: distinct part-tuples ALWAYS map
40
+ * to distinct keys regardless of part content (greptile P2 — an embedded delimiter
41
+ * could otherwise collide two distinct loci on a load-bearing D-join key). Single-home
42
+ * so positive + negative key encoding can never drift apart (Tenet-21).
43
+ */
44
+ const controlKey = (...parts) => JSON.stringify(parts);
45
+ // ─── Named constants (the §9 producer contract this builder asserts) ─────────
46
+ /** §6: an authored positive control is TRAIN-side (the rule is authored against the train slice). */
47
+ const EXPECTED_POSITIVE_CONTROL_SIDE = 'train';
48
+ /** §4: an authored positive control is admitted only through the preimage-differential gate. */
49
+ const EXPECTED_POSITIVE_CONTROL_GATE = 'preimage-differential';
50
+ /** The one differential outcome that EMITS a positive control (exact equality, never a negation). */
51
+ const EMITTING_OUTCOME = 'differential-holds';
52
+ // ─── Emission schemas (the .strict() boundary; types inferred) ───────────────
53
+ /**
54
+ * The 3-way disposition of a positive fixture that did NOT emit a control
55
+ * (strategy#777): `illegitimate` (the matcher is fix-shaped / over-matching /
56
+ * vacuous — never a legitimate control), `undecidable` (the differential could
57
+ * not be established — routes to operator adjudication), `deferred` (a typed
58
+ * non-pass whose source is not yet supported, e.g. the commit-pair fallback).
59
+ */
60
+ const AuthoredNonEmissionClassSchema = z.enum(['illegitimate', 'undecidable', 'deferred']);
61
+ /**
62
+ * The §4 differential vocabulary, mirrored as a Zod enum so `nonEmissions[].outcome`
63
+ * validates at the `.strict()` boundary. The inverse class map below is a `Record`
64
+ * over the NON-emitting outcomes, so a 7th primitive outcome (or a rename) fails
65
+ * THIS build rather than silently emitting an unclassed control.
66
+ */
67
+ const PreimageDifferentialOutcomeSchema = z.enum([
68
+ 'differential-holds',
69
+ 'fix-shaped',
70
+ 'over-match',
71
+ 'vacuous-silent',
72
+ 'needs-adjudication',
73
+ 'unsupported-source',
74
+ ]);
75
+ /**
76
+ * A legitimate, differential-gated positive control, keyed on the fixture LOCUS
77
+ * (strategy#777 §6, `aa2a501`/`614dfdf`) — symmetric with the negative control and
78
+ * aligned to §8 `firingLabelId(ruleId, pr, filePath, matchedLine)`. `contentHash` is
79
+ * span-content-only, so it is NOT locus-unique (two distinct loci in one PR with
80
+ * byte-identical span content collide) and is deliberately NOT carried here — the
81
+ * locus is the disambiguator. `contentHash` stays a fixture FIELD (ADR §3), unchanged.
82
+ */
83
+ export const AuthoredPositiveControlSchema = z
84
+ .object({
85
+ /** The in-corpus PR the fixture anchors to (train-side; §5). */
86
+ pr: z.number().int().positive(),
87
+ /** The authored rule's stable id — its `lessonHash` (the C2a `firingLabelId ← ruleId` unification). */
88
+ targetRuleId: nonBlank(),
89
+ /** Defect locus file — half of the (filePath, matchedSpan) per-fixture disambiguator. */
90
+ filePath: nonBlank(),
91
+ /** Line-range or AST-node path — the defect locus, not just the file (admits two-loci-one-PR). */
92
+ matchedSpan: nonBlank(),
93
+ })
94
+ .strict();
95
+ /** A declared, silence-only negative control (no differential, no `pr` — strategy#777 Q2). */
96
+ export const AuthoredNegativeControlSchema = z
97
+ .object({
98
+ /** The authored rule's stable id (its `lessonHash`). */
99
+ targetRuleId: nonBlank(),
100
+ /** Near-miss locus file — half of the (filePath, matchedSpan) disambiguator. */
101
+ filePath: nonBlank(),
102
+ /** Line-range or AST-node path — the near-miss locus, not just the file. */
103
+ matchedSpan: nonBlank(),
104
+ })
105
+ .strict();
106
+ // ─── Classification (strategy#777 classOf; doubles as the build-time exhaustiveness guard) ─
107
+ /**
108
+ * Maps every NON-emitting differential outcome to its emission class. A `Record`
109
+ * over `Exclude<…, 'differential-holds'>`, so it is exhaustive by construction: a
110
+ * new primitive outcome breaks this build (missing key) instead of slipping through
111
+ * unclassed. `fix-shaped | over-match | vacuous-silent` are all illegitimate (the
112
+ * matcher is not a legitimate control); `needs-adjudication` is undecidable;
113
+ * `unsupported-source` is deferred.
114
+ */
115
+ const NON_EMISSION_CLASS_BY_OUTCOME = {
116
+ 'fix-shaped': 'illegitimate',
117
+ 'over-match': 'illegitimate',
118
+ 'vacuous-silent': 'illegitimate',
119
+ 'needs-adjudication': 'undecidable',
120
+ 'unsupported-source': 'deferred',
121
+ };
122
+ /** A positive fixture that did NOT clear the §4 gate — kept (never silently dropped) with its differential outcome + class. */
123
+ export const AuthoredNonEmissionSchema = z
124
+ .object({
125
+ /** The authored rule's stable id (its `lessonHash`). */
126
+ targetRuleId: nonBlank(),
127
+ /** The train-side PR the non-emitting fixture anchored to. */
128
+ pr: z.number().int().positive(),
129
+ /** The source differential outcome (exact, never derived from a negation). */
130
+ outcome: PreimageDifferentialOutcomeSchema,
131
+ /** The 3-way class derived from `outcome` (strategy#777 classOf). */
132
+ class: AuthoredNonEmissionClassSchema,
133
+ /** First-line differential reason — present for `needs-adjudication` / `unsupported-source`. */
134
+ reason: z.string().optional(),
135
+ })
136
+ .strict()
137
+ // Exported-boundary guard: a non-emission is structurally impossible for the EMITTING
138
+ // outcome, and `class` is DERIVED from `outcome` (classOf, strategy#777) — so the schema
139
+ // must reject `differential-holds` and any mismatched (outcome, class) pair, not just any
140
+ // enum members. superRefine (parse-time, non-mutating) per #2263 — an OUTER refine on the
141
+ // object, never a branch `.refine` on a union (which throws at construction in Zod 3.25).
142
+ .superRefine((v, ctx) => {
143
+ if (v.outcome === EMITTING_OUTCOME) {
144
+ ctx.addIssue({
145
+ code: z.ZodIssueCode.custom,
146
+ path: ['outcome'],
147
+ message: `a non-emission cannot carry the emitting outcome '${EMITTING_OUTCOME}'`,
148
+ });
149
+ return;
150
+ }
151
+ const expectedClass = NON_EMISSION_CLASS_BY_OUTCOME[v.outcome];
152
+ if (v.class !== expectedClass) {
153
+ ctx.addIssue({
154
+ code: z.ZodIssueCode.custom,
155
+ path: ['class'],
156
+ message: `class '${v.class}' contradicts outcome '${v.outcome}' (classOf expects '${expectedClass}')`,
157
+ });
158
+ }
159
+ });
160
+ /** The three emission lists this builder produces (the §6 controls surface, inert-until-D). */
161
+ export const AuthoredControlsSchema = z
162
+ .object({
163
+ positive: z.array(AuthoredPositiveControlSchema),
164
+ negative: z.array(AuthoredNegativeControlSchema),
165
+ nonEmissions: z.array(AuthoredNonEmissionSchema),
166
+ })
167
+ .strict();
168
+ /**
169
+ * Read a rule's AUTHORED provenance from the SIDECAR map, fail-loud if it is missing
170
+ * or mined. The id the controls join on is the rule's `lessonHash` — for an authored
171
+ * rule that IS its persisted, minted `ruleId` (the C2a `firingLabelId ← ruleId`
172
+ * unification), NOT a content hash. We gate on `isAuthoredProvenance` so a mined rule
173
+ * (whose `lessonHash` is a content hash) can never be read as a control target.
174
+ *
175
+ * D1 fold #1 (codex): the source of truth is `provenanceByRule`, NEVER `rule.legitimacy`.
176
+ * At the real assembly seam a compiled rule carries no `legitimacy` — it is stamped only
177
+ * POST-scoring (survivors-only). `legitimacy` also carries control booleans intentionally
178
+ * absent pre-verdict, so reading it here would be doubly wrong. Provenance lives in the
179
+ * `c.provenance` sidecar the seam folds into this map.
180
+ */
181
+ function readAuthoredProvenance(rule, provenanceByRule) {
182
+ const provenance = provenanceByRule.get(rule.lessonHash);
183
+ if (provenance === undefined) {
184
+ throw new Error(`[Totem Error] deriveAuthoredControls: rule '${rule.lessonHash}' has no provenance in ` +
185
+ `provenanceByRule — deriveAuthoredControls requires the sidecar provenance for every rule (ADR-112 §3)`);
186
+ }
187
+ if (!isAuthoredProvenance(provenance)) {
188
+ throw new Error(`[Totem Error] deriveAuthoredControls: rule '${rule.lessonHash}' is not authored ` +
189
+ `(provenance.kind='${provenanceKind(provenance)}') — only authored rules carry §6 controls`);
190
+ }
191
+ return provenance;
192
+ }
193
+ // ─── Public API ─────────────────────────────────────
194
+ /**
195
+ * Build the §6 authored controls (positive + negative + the kept non-emissions)
196
+ * for a set of compiled AUTHORED rules, gating positives on the §4 preimage-
197
+ * differential. Inert: emits nothing into a cert run.
198
+ *
199
+ * Provenance contract (D1 fold #1): the caller MUST supply `provenanceByRule`
200
+ * (`lessonHash → provenance`); this function reads provenance ONLY from that sidecar
201
+ * map and NEVER from `rule.legitimacy` (absent at the cert-assembly seam — stamped
202
+ * post-scoring, survivors-only). Fail-loud (Tenet-4): a rule missing from the map, a
203
+ * non-authored (mined) provenance entry, a held-out positive fixture (§5 leakage), a
204
+ * producer/policy mismatch, or a duplicate locus key all THROW — never a silent skip.
205
+ *
206
+ * Determinism (Tenet-15): the output arrays are byte-identical across re-runs for
207
+ * identical inputs. Positives/non-emissions follow input order (rule order ×
208
+ * declared `positiveFixtures` order); negatives follow rule order × declared
209
+ * `negativeFixtures` order. The differential runs under `Promise.all`, which
210
+ * preserves the positional task order regardless of settle timing — never a
211
+ * push-on-settle / Set/Map iteration.
212
+ */
213
+ export async function deriveAuthoredControls(params) {
214
+ const { rules, split, provenanceByRule } = params;
215
+ const evaluate = params.deps?.evaluate ?? evaluatePreimageDifferential;
216
+ // §9 single-home: READ the authored policy (do NOT hard-code "train"), then
217
+ // fail-loud-assert the producer contract this builder is wired for. A policy
218
+ // that diverges from train-side / differential-gated is a producer mismatch that
219
+ // must surface HERE, never silently mis-emit at slice D.
220
+ const policy = getRulePolicy('authored');
221
+ if (policy.positiveControlSide !== EXPECTED_POSITIVE_CONTROL_SIDE) {
222
+ throw new Error(`[Totem Error] deriveAuthoredControls: authored policy.positiveControlSide is ` +
223
+ `'${policy.positiveControlSide}', expected '${EXPECTED_POSITIVE_CONTROL_SIDE}' (ADR-112 §6 producer mismatch)`);
224
+ }
225
+ if (policy.positiveControlGate !== EXPECTED_POSITIVE_CONTROL_GATE) {
226
+ throw new Error(`[Totem Error] deriveAuthoredControls: authored policy.positiveControlGate is ` +
227
+ `'${policy.positiveControlGate}', expected '${EXPECTED_POSITIVE_CONTROL_GATE}' (ADR-112 §4 producer mismatch)`);
228
+ }
229
+ const trainSet = new Set(split.trainPrs);
230
+ // ── First pass: collect positional positive tasks + the declarative negatives.
231
+ const positiveTasks = [];
232
+ const negative = [];
233
+ // The §6 controls are an ANSWER KEY — each emitted control must be a unique join
234
+ // target for slice D. Two fixtures emitting the same key would resolve ambiguously
235
+ // (the minimal #777 shape drops the locus/source that would tell them apart), so a
236
+ // duplicate is a fail-loud contract fault, never a silent double-entry.
237
+ const negativeKeys = new Set();
238
+ for (const rule of rules) {
239
+ const provenance = readAuthoredProvenance(rule, provenanceByRule);
240
+ const targetRuleId = rule.lessonHash;
241
+ // POSITIVE: build a positional task per declared fixture (input order). A
242
+ // held-out fixture.pr is a §5 leakage violation — fail loud, NEVER a silent
243
+ // skip (a silent skip would let a leaked exemplar weaken the train/test bar).
244
+ for (const fixture of provenance.positiveFixtures) {
245
+ if (!trainSet.has(fixture.pr)) {
246
+ throw new Error(`[Totem Error] deriveAuthoredControls: positive fixture pr #${fixture.pr} (rule '${targetRuleId}') ` +
247
+ `is not in the train slice — a held-out positive fixture is an ADR-112 §5 leakage violation`);
248
+ }
249
+ positiveTasks.push({ rule, targetRuleId, fixture });
250
+ }
251
+ // NEGATIVE: DECLARATIVE (strategy#777 Q2) — no differential, no silence gate,
252
+ // no trainSet check. A synthetic near-miss carries no `pr` and no corpus
253
+ // position; the (filePath, matchedSpan) locus is the disambiguator. We do NOT
254
+ // inline `nearMissSource` — it is resolved at D (Tenet-20 join-back).
255
+ for (const nf of provenance.negativeFixtures ?? []) {
256
+ const negativeKey = controlKey(targetRuleId, nf.filePath, nf.matchedSpan);
257
+ if (negativeKeys.has(negativeKey)) {
258
+ throw new Error(`[Totem Error] deriveAuthoredControls: duplicate negative control (rule '${targetRuleId}', ` +
259
+ `filePath '${nf.filePath}', matchedSpan '${nf.matchedSpan}') — two near-misses emit an ` +
260
+ `indistinguishable §6 silence-control key; differentiate the loci or drop one`);
261
+ }
262
+ negativeKeys.add(negativeKey);
263
+ negative.push({ targetRuleId, filePath: nf.filePath, matchedSpan: nf.matchedSpan });
264
+ }
265
+ }
266
+ // ── Evaluate the §4 differential for every positive task. `Promise.all` resolves
267
+ // in the original task order regardless of which evaluation settles first, so the
268
+ // emitted order is the stable declared order (a push-on-settle impl would not be).
269
+ const evaluated = await Promise.all(positiveTasks.map(async (task) => ({ task, result: await evaluate(task.rule, task.fixture) })));
270
+ // ── Second pass: split into emitted positives vs kept non-emissions.
271
+ const positive = [];
272
+ const positiveKeys = new Set();
273
+ const nonEmissions = [];
274
+ for (const { task, result } of evaluated) {
275
+ if (result.outcome === EMITTING_OUTCOME) {
276
+ // The fixture LOCUS (filePath, matchedSpan) is the per-entry disambiguator
277
+ // (strategy#777 §6) — unique by construction, so two DISTINCT loci sharing one PR
278
+ // (even byte-identical span content) emit two distinct controls. Only a TRUE
279
+ // duplicate (same pr + filePath + matchedSpan) is an answer-key clash: fail loud.
280
+ const positiveKey = controlKey(task.targetRuleId, task.fixture.pr, task.fixture.filePath, task.fixture.matchedSpan);
281
+ if (positiveKeys.has(positiveKey)) {
282
+ throw new Error(`[Totem Error] deriveAuthoredControls: duplicate positive control (rule '${task.targetRuleId}', ` +
283
+ `pr #${task.fixture.pr}, filePath '${task.fixture.filePath}', matchedSpan '${task.fixture.matchedSpan}') — ` +
284
+ `two fixtures emit an indistinguishable §6 answer-key entry; differentiate the loci or drop one`);
285
+ }
286
+ positiveKeys.add(positiveKey);
287
+ positive.push({
288
+ pr: task.fixture.pr,
289
+ targetRuleId: task.targetRuleId,
290
+ filePath: task.fixture.filePath,
291
+ matchedSpan: task.fixture.matchedSpan,
292
+ });
293
+ }
294
+ else {
295
+ nonEmissions.push({
296
+ targetRuleId: task.targetRuleId,
297
+ pr: task.fixture.pr,
298
+ outcome: result.outcome,
299
+ class: NON_EMISSION_CLASS_BY_OUTCOME[result.outcome],
300
+ // Omit `reason` when absent (house convention, cf. buildWindtunnelLock) —
301
+ // keeps the emitted JSON clean + byte-identical across re-runs.
302
+ ...(result.reason !== undefined ? { reason: result.reason } : {}),
303
+ });
304
+ }
305
+ }
306
+ return { positive, negative, nonEmissions };
307
+ }
308
+ //# sourceMappingURL=authored-controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-controls.js","sourceRoot":"","sources":["../../src/spine/authored-controls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=authored-controls.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-controls.test.d.ts","sourceRoot":"","sources":["../../src/spine/authored-controls.test.ts"],"names":[],"mappings":""}