instar 1.3.871 → 1.3.873

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,582 @@
1
+ /**
2
+ * stallCoverageValidator — the single validator for framework stall-coverage
3
+ * matrices (docs/frameworks/<framework>-stall-coverage.md).
4
+ *
5
+ * Spec: docs/specs/framework-stall-coverage-matrix.md (§2.2, §3.1, §3.2)
6
+ *
7
+ * ONE module, TWO callsites (spec §3.2). This file implements the HERMETIC
8
+ * half only — the CI-ratchet callsite (tests/unit/stall-coverage-ratchet.test.ts):
9
+ * schema, status tokens, canonical-class completeness, symbol existence under
10
+ * the path jail, evidence containment + push-suite collection, ref FORMAT,
11
+ * and the calendar aging ratchet. The NON-hermetic checks (closePath/issueRef
12
+ * LIVENESS against the commitments ledger, guardKey posture cross-check
13
+ * against /guards) belong to the PR-B runtime-gate callsite; the `deps`
14
+ * injection seam below is where those checkers plug in without changing the
15
+ * result shape (issues/warnings arrays absorb new rules additively).
16
+ *
17
+ * Refusal hygiene (spec Frontloaded Decision 16): every issue message
18
+ * references the class id (only when canonical) + the rule name — rejected
19
+ * raw field content is NEVER echoed into messages.
20
+ */
21
+ import { createHash } from 'node:crypto';
22
+ import fs from 'node:fs';
23
+ import path from 'node:path';
24
+ import yaml from 'js-yaml';
25
+ import { STALL_CLASSES, REQUIRED_MATRIX_FRAMEWORKS } from '../data/stall-classes.js';
26
+ import { GUARD_MANIFEST, NOT_A_GUARD } from '../monitoring/guardManifest.js';
27
+ // ─── Constants (spec §3.1 clamps) ────────────────────────────────────────────────
28
+ const MATRIX_FILE_CAP_BYTES = 256 * 1024;
29
+ const TARGET_FILE_CAP_BYTES = 1024 * 1024;
30
+ const ROW_CAP = 64;
31
+ const FREE_TEXT_CAP = 256;
32
+ const MATRIX_SUFFIX = '-stall-coverage.md';
33
+ const STATUS_TOKENS = new Set(['covered', 'covered-dark', 'declared-gap', 'not-applicable']);
34
+ const SYMBOL_RE = /^[A-Za-z0-9_./#-]{1,128}$/;
35
+ const ISSUE_REF_RE = /^[a-z0-9:-]{1,80}$/;
36
+ const CLOSE_PATH_RE = /^[A-Za-z0-9:_-]{1,64}$/;
37
+ const ACCEPTANCE_REF_RE = /^[A-Za-z0-9:_-]{1,64}$/;
38
+ const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
39
+ const FREE_TEXT_FIELDS = ['reason', 'liveness-surface', 'revalidateOn'];
40
+ /** Vitest skip-class modifier tokens — a test no runner executes proves nothing. */
41
+ const SKIP_TOKENS = [
42
+ 'describe.skip',
43
+ 'it.skip',
44
+ 'test.skip',
45
+ 'xit(',
46
+ 'xdescribe(',
47
+ 'it.todo',
48
+ 'test.todo',
49
+ 'it.skipIf',
50
+ 'test.skipIf',
51
+ 'describe.todo',
52
+ ];
53
+ const AGING_WARN_DAYS = 45;
54
+ const AGING_FAIL_DAYS = 60;
55
+ function buildCtx(repoRoot, now, deps) {
56
+ const classIds = deps?.stallClassIds ?? STALL_CLASSES.map((c) => c.id);
57
+ return {
58
+ repoRoot,
59
+ now: now ?? new Date(),
60
+ classIds,
61
+ classIdSet: new Set(classIds),
62
+ guardKeys: deps?.guardManifestKeys ?? new Set(GUARD_MANIFEST.map((e) => e.key)),
63
+ exemptComponents: deps?.notAGuardComponents ?? new Map(NOT_A_GUARD.map((e) => [e.component, e.reason])),
64
+ pushConfigPath: deps?.pushConfigPath ?? 'vitest.push.config.ts',
65
+ fileCache: new Map(),
66
+ };
67
+ }
68
+ // ─── Path jail + capped reads (spec §3.1) ────────────────────────────────────────
69
+ function hasDotDotSegment(rel) {
70
+ return rel.split('/').includes('..');
71
+ }
72
+ /** Resolve `rel` against repoRoot, realpath-jail it inside the repo, and read it
73
+ * under the 1MB cap. Single read per path per validation (cached). */
74
+ function readJailed(ctx, rel) {
75
+ const cached = ctx.fileCache.get(rel);
76
+ if (cached)
77
+ return cached;
78
+ let result;
79
+ try {
80
+ const abs = path.resolve(ctx.repoRoot, rel);
81
+ const real = fs.realpathSync(abs);
82
+ const rootReal = fs.realpathSync(ctx.repoRoot);
83
+ if (real !== rootReal && !real.startsWith(rootReal + path.sep)) {
84
+ result = { error: 'escape' };
85
+ }
86
+ else if (fs.statSync(real).size > TARGET_FILE_CAP_BYTES) {
87
+ result = { error: 'too-large' };
88
+ }
89
+ else {
90
+ result = { text: fs.readFileSync(real, 'utf8') };
91
+ }
92
+ }
93
+ catch {
94
+ result = { error: 'missing' };
95
+ }
96
+ ctx.fileCache.set(rel, result);
97
+ return result;
98
+ }
99
+ // ─── Push-suite effective collected set (static parse, no execution) ─────────────
100
+ /** Minimal glob matcher supporting `**` and `*` — no new dependencies. */
101
+ export function globToRegExp(glob) {
102
+ let out = '^';
103
+ let i = 0;
104
+ while (i < glob.length) {
105
+ const c = glob[i];
106
+ if (c === '*') {
107
+ if (glob[i + 1] === '*') {
108
+ if (glob[i + 2] === '/') {
109
+ out += '(?:[^/]+/)*';
110
+ i += 3;
111
+ }
112
+ else {
113
+ out += '.*';
114
+ i += 2;
115
+ }
116
+ }
117
+ else {
118
+ out += '[^/]*';
119
+ i += 1;
120
+ }
121
+ }
122
+ else {
123
+ out += /[A-Za-z0-9_/]/.test(c) ? c : '\\' + c;
124
+ i += 1;
125
+ }
126
+ }
127
+ return new RegExp(out + '$');
128
+ }
129
+ /** Statically extract the include globs + FLAKY_TESTS entries from the push
130
+ * config TEXT (never executes the config). Null = unparseable (fails closed
131
+ * at the callsite via push-config-unparseable). */
132
+ export function parsePushSuiteSets(text) {
133
+ // Strip line comments so quoted strings inside prose can't pollute the sets.
134
+ const stripped = text
135
+ .split('\n')
136
+ .map((l) => {
137
+ const idx = l.indexOf('//');
138
+ return idx >= 0 ? l.slice(0, idx) : l;
139
+ })
140
+ .join('\n');
141
+ const flakyM = /FLAKY_TESTS\s*=\s*\[([\s\S]*?)\]/.exec(stripped);
142
+ const includeM = /include:\s*\[([\s\S]*?)\]/.exec(stripped);
143
+ if (!flakyM || !includeM)
144
+ return null;
145
+ const strings = (block) => [...block.matchAll(/['"]([^'"]+)['"]/g)].map((m) => m[1]);
146
+ const includes = strings(includeM[1]);
147
+ if (includes.length === 0)
148
+ return null;
149
+ return {
150
+ includes: includes.map(globToRegExp),
151
+ flaky: strings(flakyM[1]).map(globToRegExp),
152
+ };
153
+ }
154
+ function getPushSuite(ctx) {
155
+ if (ctx.pushSuite !== undefined)
156
+ return ctx.pushSuite;
157
+ const read = readJailed(ctx, ctx.pushConfigPath);
158
+ ctx.pushSuite = 'text' in read ? parsePushSuiteSets(read.text) : null;
159
+ return ctx.pushSuite;
160
+ }
161
+ function refuse(sink, rule, classId, where) {
162
+ sink.issues.push({
163
+ ...(classId ? { classId } : {}),
164
+ rule,
165
+ message: `${sink.framework} ${where}: rule '${rule}' violated`,
166
+ });
167
+ }
168
+ function warn(sink, rule, classId, message) {
169
+ sink.warnings.push({ ...(classId ? { classId } : {}), rule, message });
170
+ }
171
+ function isNonEmptyString(v) {
172
+ return typeof v === 'string' && v.trim().length > 0;
173
+ }
174
+ /** Validate one `path/to/file.ts#Export` ref: charset, `..`, format, jail,
175
+ * read cap, and identifier containment. Returns the identifier when fully
176
+ * resolvable, else null (issues already recorded). */
177
+ function checkSymbolRef(ctx, sink, classId, where, ref) {
178
+ if (!SYMBOL_RE.test(ref)) {
179
+ refuse(sink, 'symbol-charset-invalid', classId, where);
180
+ return null;
181
+ }
182
+ const hashIdx = ref.indexOf('#');
183
+ if (hashIdx <= 0 || hashIdx !== ref.lastIndexOf('#') || hashIdx === ref.length - 1) {
184
+ refuse(sink, 'symbol-format-invalid', classId, where);
185
+ return null;
186
+ }
187
+ const filePart = ref.slice(0, hashIdx);
188
+ const identifier = ref.slice(hashIdx + 1);
189
+ if (hasDotDotSegment(filePart)) {
190
+ refuse(sink, 'path-traversal-rejected', classId, where);
191
+ return null;
192
+ }
193
+ const read = readJailed(ctx, filePart);
194
+ if ('error' in read) {
195
+ refuse(sink, read.error === 'escape'
196
+ ? 'path-escapes-repo'
197
+ : read.error === 'too-large'
198
+ ? 'target-file-too-large'
199
+ : 'symbol-unresolvable', classId, where);
200
+ return null;
201
+ }
202
+ if (!read.text.includes(identifier)) {
203
+ refuse(sink, 'symbol-unresolvable', classId, where);
204
+ return null;
205
+ }
206
+ return identifier;
207
+ }
208
+ function checkEvidence(ctx, sink, classId, where, evidence, detectorIdentifier) {
209
+ if (!SYMBOL_RE.test(evidence)) {
210
+ refuse(sink, 'symbol-charset-invalid', classId, where);
211
+ return;
212
+ }
213
+ if (hasDotDotSegment(evidence)) {
214
+ refuse(sink, 'path-traversal-rejected', classId, where);
215
+ return;
216
+ }
217
+ const read = readJailed(ctx, evidence);
218
+ if ('error' in read) {
219
+ refuse(sink, read.error === 'escape'
220
+ ? 'path-escapes-repo'
221
+ : read.error === 'too-large'
222
+ ? 'target-file-too-large'
223
+ : 'evidence-file-missing', classId, where);
224
+ return;
225
+ }
226
+ if (detectorIdentifier && !read.text.includes(detectorIdentifier)) {
227
+ refuse(sink, 'evidence-identifier-missing', classId, where);
228
+ }
229
+ if (!read.text.includes(`stall-class: ${classId}`)) {
230
+ refuse(sink, 'evidence-marker-missing', classId, where);
231
+ }
232
+ for (const token of SKIP_TOKENS) {
233
+ if (read.text.includes(token)) {
234
+ refuse(sink, 'evidence-skip-marked', classId, where);
235
+ break;
236
+ }
237
+ }
238
+ if (evidence.startsWith('tests/')) {
239
+ const suite = getPushSuite(ctx);
240
+ if (!suite) {
241
+ refuse(sink, 'push-config-unparseable', classId, where);
242
+ }
243
+ else if (suite.flaky.some((re) => re.test(evidence))) {
244
+ refuse(sink, 'evidence-excluded-from-push-suite', classId, where);
245
+ }
246
+ else if (!suite.includes.some((re) => re.test(evidence))) {
247
+ refuse(sink, 'evidence-not-collected', classId, where);
248
+ }
249
+ }
250
+ }
251
+ function checkGuardKey(ctx, sink, classId, where, guardKey) {
252
+ if (guardKey.startsWith('exempt:')) {
253
+ const component = guardKey.slice('exempt:'.length);
254
+ const reason = ctx.exemptComponents.get(component);
255
+ if (reason === undefined) {
256
+ refuse(sink, 'guard-key-unknown', classId, where);
257
+ }
258
+ else {
259
+ // Component name + reason come from our own manifest (matched, not rejected).
260
+ warn(sink, 'guard-exempt-vacuous', classId, `${where}: guard posture check is vacuous — manifest-exempt component '${component}' (${reason})`);
261
+ }
262
+ return;
263
+ }
264
+ if (!ctx.guardKeys.has(guardKey)) {
265
+ refuse(sink, 'guard-key-unknown', classId, where);
266
+ }
267
+ }
268
+ function checkSeededAtAndAging(ctx, sink, classId, where, row) {
269
+ const seededAt = row.seededAt;
270
+ if (seededAt === undefined)
271
+ return;
272
+ if (typeof seededAt !== 'string' || !ISO_DATE_RE.test(seededAt)) {
273
+ refuse(sink, 'seeded-at-invalid', classId, where);
274
+ return;
275
+ }
276
+ // Calendar arithmetic in UTC dates (matches the codemod's UTC ISO stamp).
277
+ const nowDate = ctx.now.toISOString().slice(0, 10);
278
+ if (seededAt > nowDate) {
279
+ refuse(sink, 'seeded-at-future-dated', classId, where);
280
+ return;
281
+ }
282
+ const ageDays = (Date.parse(nowDate) - Date.parse(seededAt)) / 86_400_000;
283
+ const reason = typeof row.reason === 'string' ? row.reason : '';
284
+ if (reason.includes('unreviewed')) {
285
+ if (ageDays >= AGING_FAIL_DAYS) {
286
+ refuse(sink, 'unreviewed-aged-out', classId, where);
287
+ }
288
+ else if (ageDays >= AGING_WARN_DAYS) {
289
+ warn(sink, 'unreviewed-aging', classId, `${where}: seeded row still unreviewed at ${Math.floor(ageDays)} days (CI red at ${AGING_FAIL_DAYS})`);
290
+ }
291
+ }
292
+ else {
293
+ // Clearing `unreviewed` requires review, not a label flip (spec §2.1).
294
+ const ref = row.acceptanceRef;
295
+ if (typeof ref !== 'string' || !ACCEPTANCE_REF_RE.test(ref)) {
296
+ refuse(sink, 'unreviewed-cleared-without-acceptance', classId, where);
297
+ }
298
+ }
299
+ }
300
+ function validateRow(ctx, sink, row, index) {
301
+ const anonWhere = `row ${index}`;
302
+ if (!row || typeof row !== 'object' || Array.isArray(row)) {
303
+ refuse(sink, 'row-not-object', undefined, anonWhere);
304
+ return null;
305
+ }
306
+ const r = row;
307
+ const canonical = typeof r.class === 'string' && ctx.classIdSet.has(r.class);
308
+ const classId = canonical ? r.class : undefined;
309
+ const where = classId ? `class '${classId}'` : anonWhere;
310
+ if (!canonical) {
311
+ refuse(sink, 'class-unknown', undefined, anonWhere);
312
+ }
313
+ // Free-text clamps (parsed values; YAML folded scalars are fine).
314
+ for (const field of FREE_TEXT_FIELDS) {
315
+ const v = r[field];
316
+ if (v === undefined)
317
+ continue;
318
+ if (typeof v !== 'string')
319
+ refuse(sink, 'free-text-invalid', classId, where);
320
+ else if (v.length > FREE_TEXT_CAP)
321
+ refuse(sink, 'free-text-too-long', classId, where);
322
+ }
323
+ if (!isNonEmptyString(r['liveness-surface'])) {
324
+ refuse(sink, 'liveness-surface-missing', classId, where);
325
+ }
326
+ checkSeededAtAndAging(ctx, sink, classId, where, r);
327
+ const status = r.status;
328
+ if (typeof status !== 'string' || !STATUS_TOKENS.has(status)) {
329
+ refuse(sink, 'status-token-invalid', classId, where);
330
+ return classId ?? null;
331
+ }
332
+ if (status === 'covered' || status === 'covered-dark') {
333
+ let detectorIdentifier = null;
334
+ if (!isNonEmptyString(r.detector)) {
335
+ refuse(sink, 'detector-missing', classId, where);
336
+ }
337
+ else {
338
+ detectorIdentifier = checkSymbolRef(ctx, sink, classId, where, r.detector);
339
+ }
340
+ if (!isNonEmptyString(r.recovery)) {
341
+ refuse(sink, 'recovery-missing', classId, where);
342
+ }
343
+ else {
344
+ checkSymbolRef(ctx, sink, classId, where, r.recovery);
345
+ }
346
+ if (isNonEmptyString(r.detector) && isNonEmptyString(r.recovery) && r.detector === r.recovery) {
347
+ refuse(sink, 'detector-equals-recovery', classId, where);
348
+ }
349
+ if (!isNonEmptyString(r.guardKey)) {
350
+ refuse(sink, 'guard-key-missing', classId, where);
351
+ }
352
+ else {
353
+ checkGuardKey(ctx, sink, classId, where, r.guardKey);
354
+ }
355
+ if (!isNonEmptyString(r.evidence)) {
356
+ refuse(sink, 'evidence-missing', classId, where);
357
+ }
358
+ else if (classId) {
359
+ checkEvidence(ctx, sink, classId, where, r.evidence, detectorIdentifier);
360
+ }
361
+ if (status === 'covered') {
362
+ if (r.posture !== 'live')
363
+ refuse(sink, 'posture-not-live', classId, where);
364
+ }
365
+ else {
366
+ // covered-dark: the flip-live debt must carry a tracked ref.
367
+ if (!isNonEmptyString(r.closePath))
368
+ refuse(sink, 'closepath-missing', classId, where);
369
+ else if (!CLOSE_PATH_RE.test(r.closePath))
370
+ refuse(sink, 'closepath-charset-invalid', classId, where);
371
+ }
372
+ }
373
+ else if (status === 'declared-gap') {
374
+ if (!isNonEmptyString(r.issueRef))
375
+ refuse(sink, 'issueref-missing', classId, where);
376
+ else if (!ISSUE_REF_RE.test(r.issueRef))
377
+ refuse(sink, 'issueref-charset-invalid', classId, where);
378
+ if (!isNonEmptyString(r.closePath))
379
+ refuse(sink, 'closepath-missing', classId, where);
380
+ else if (!CLOSE_PATH_RE.test(r.closePath))
381
+ refuse(sink, 'closepath-charset-invalid', classId, where);
382
+ else if (r.closePath === 'pending-mint' && !isNonEmptyString(r.seededAt)) {
383
+ // The aging clock can never be escaped by omitting the stamp (spec §2.1).
384
+ refuse(sink, 'pending-mint-without-seededat', classId, where);
385
+ }
386
+ }
387
+ else if (status === 'not-applicable') {
388
+ if (!isNonEmptyString(r.reason))
389
+ refuse(sink, 'reason-missing', classId, where);
390
+ if (!isNonEmptyString(r.revalidateOn))
391
+ refuse(sink, 'revalidateon-missing', classId, where);
392
+ }
393
+ if (r.matchedClasses !== undefined) {
394
+ if (!Array.isArray(r.matchedClasses)) {
395
+ refuse(sink, 'matched-class-unknown', classId, where);
396
+ }
397
+ else {
398
+ for (const m of r.matchedClasses) {
399
+ if (typeof m !== 'string' || !ctx.classIdSet.has(m)) {
400
+ refuse(sink, 'matched-class-unknown', classId, where);
401
+ break;
402
+ }
403
+ }
404
+ }
405
+ }
406
+ return classId ?? null;
407
+ }
408
+ // ─── File validation ─────────────────────────────────────────────────────────────
409
+ export function validateStallMatrixFile(args) {
410
+ const ctx = buildCtx(args.repoRoot, args.now, args.deps);
411
+ const abs = path.isAbsolute(args.filePath)
412
+ ? args.filePath
413
+ : path.resolve(args.repoRoot, args.filePath);
414
+ const basename = path.basename(abs);
415
+ const framework = basename.endsWith(MATRIX_SUFFIX)
416
+ ? basename.slice(0, -MATRIX_SUFFIX.length)
417
+ : basename.replace(/\.md$/, '');
418
+ const sink = { framework, issues: [], warnings: [] };
419
+ const result = {
420
+ framework,
421
+ filePath: args.filePath,
422
+ valid: false,
423
+ issues: sink.issues,
424
+ warnings: sink.warnings,
425
+ rowCount: 0,
426
+ rows: [],
427
+ contentHash: '',
428
+ };
429
+ // Single read — every check below runs against these exact bytes.
430
+ let bytes;
431
+ try {
432
+ bytes = fs.readFileSync(abs);
433
+ }
434
+ catch {
435
+ refuse(sink, 'matrix-file-missing', undefined, 'file');
436
+ return result;
437
+ }
438
+ result.contentHash = createHash('sha256').update(bytes).digest('hex');
439
+ if (!basename.endsWith(MATRIX_SUFFIX)) {
440
+ refuse(sink, 'matrix-filename-invalid', undefined, 'file');
441
+ return result;
442
+ }
443
+ if (bytes.length > MATRIX_FILE_CAP_BYTES) {
444
+ refuse(sink, 'matrix-file-too-large', undefined, 'file');
445
+ return result;
446
+ }
447
+ const text = bytes.toString('utf8');
448
+ const fm = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(text);
449
+ if (!fm) {
450
+ refuse(sink, 'front-matter-missing', undefined, 'file');
451
+ return result;
452
+ }
453
+ let doc;
454
+ try {
455
+ // JSON_SCHEMA: unquoted ISO dates stay strings (never coerced to Date).
456
+ doc = yaml.load(fm[1], { schema: yaml.JSON_SCHEMA });
457
+ }
458
+ catch {
459
+ refuse(sink, 'front-matter-invalid', undefined, 'file');
460
+ return result;
461
+ }
462
+ if (!doc || typeof doc !== 'object' || Array.isArray(doc)) {
463
+ refuse(sink, 'front-matter-invalid', undefined, 'file');
464
+ return result;
465
+ }
466
+ const d = doc;
467
+ if (d.framework !== framework) {
468
+ refuse(sink, 'framework-field-mismatch', undefined, 'file');
469
+ }
470
+ const rows = d['stall-coverage'];
471
+ if (!Array.isArray(rows)) {
472
+ refuse(sink, 'stall-coverage-not-array', undefined, 'file');
473
+ return result;
474
+ }
475
+ result.rowCount = rows.length;
476
+ if (rows.length > ROW_CAP) {
477
+ refuse(sink, 'row-cap-exceeded', undefined, 'file');
478
+ return result;
479
+ }
480
+ // Exactly one row per canonical class (spec §2.1 complete enumeration).
481
+ const counts = new Map();
482
+ for (let i = 0; i < rows.length; i++) {
483
+ const classId = validateRow(ctx, sink, rows[i], i);
484
+ if (classId) {
485
+ counts.set(classId, (counts.get(classId) ?? 0) + 1);
486
+ const status = rows[i].status;
487
+ result.rows.push({
488
+ classId,
489
+ status: typeof status === 'string' ? status : 'invalid',
490
+ mechanicallyVerified: 'presence-only',
491
+ });
492
+ }
493
+ }
494
+ for (const id of ctx.classIds) {
495
+ const n = counts.get(id) ?? 0;
496
+ if (n === 0)
497
+ refuse(sink, 'class-row-missing', id, `class '${id}'`);
498
+ else if (n > 1)
499
+ refuse(sink, 'class-duplicate', id, `class '${id}'`);
500
+ }
501
+ result.valid = sink.issues.length === 0;
502
+ return result;
503
+ }
504
+ // ─── Set validation ──────────────────────────────────────────────────────────────
505
+ export function validateAllStallMatrices(args) {
506
+ const required = args.deps?.requiredFrameworks ?? REQUIRED_MATRIX_FRAMEWORKS;
507
+ const setIssues = [];
508
+ const results = [];
509
+ const seen = new Set();
510
+ for (const fw of required) {
511
+ const rel = path.join('docs/frameworks', `${fw}${MATRIX_SUFFIX}`);
512
+ if (!fs.existsSync(path.resolve(args.repoRoot, rel))) {
513
+ // Deleting a matrix is a red build, not a silent pass (spec §3.2).
514
+ setIssues.push({
515
+ rule: 'matrix-file-missing',
516
+ message: `required stall-coverage matrix missing for framework '${fw}' (${rel})`,
517
+ });
518
+ continue;
519
+ }
520
+ seen.add(fw);
521
+ results.push(validateStallMatrixFile({ repoRoot: args.repoRoot, filePath: rel, now: args.now, deps: args.deps }));
522
+ }
523
+ // Extra matrices on disk (a framework beyond the required set) still validate.
524
+ const dir = path.resolve(args.repoRoot, 'docs/frameworks');
525
+ if (fs.existsSync(dir)) {
526
+ for (const f of fs.readdirSync(dir).sort()) {
527
+ if (!f.endsWith(MATRIX_SUFFIX))
528
+ continue;
529
+ const fw = f.slice(0, -MATRIX_SUFFIX.length);
530
+ if (seen.has(fw))
531
+ continue;
532
+ results.push(validateStallMatrixFile({
533
+ repoRoot: args.repoRoot,
534
+ filePath: path.join('docs/frameworks', f),
535
+ now: args.now,
536
+ deps: args.deps,
537
+ }));
538
+ }
539
+ }
540
+ return {
541
+ valid: setIssues.length === 0 && results.every((r) => r.valid),
542
+ issues: setIssues,
543
+ results,
544
+ };
545
+ }
546
+ // ─── Spec-table agreement (spec §2.1: prose and code cannot drift) ───────────────
547
+ const SPEC_PATH = 'docs/specs/framework-stall-coverage-matrix.md';
548
+ export function validateSpecTableAgreement(args) {
549
+ const issues = [];
550
+ const classIds = args.deps?.stallClassIds ?? STALL_CLASSES.map((c) => c.id);
551
+ let text;
552
+ try {
553
+ text = fs.readFileSync(path.resolve(args.repoRoot, SPEC_PATH), 'utf8');
554
+ }
555
+ catch {
556
+ issues.push({ rule: 'spec-file-missing', message: `cannot read ${SPEC_PATH}` });
557
+ return { valid: false, issues };
558
+ }
559
+ // §2.1 table rows: | `class-id` | Name | … | (the only table with a
560
+ // backticked first cell).
561
+ const tableIds = new Set([...text.matchAll(/^\|\s*`([a-z0-9-]+)`\s*\|/gm)].map((m) => m[1]));
562
+ for (const id of classIds) {
563
+ if (!tableIds.has(id)) {
564
+ issues.push({
565
+ classId: id,
566
+ rule: 'spec-table-missing-class',
567
+ message: `registry class '${id}' is missing from the spec §2.1 table`,
568
+ });
569
+ }
570
+ }
571
+ const registrySet = new Set(classIds);
572
+ for (const id of tableIds) {
573
+ if (!registrySet.has(id)) {
574
+ issues.push({
575
+ rule: 'spec-table-extra-class',
576
+ message: `spec §2.1 table lists class '${id}' which is not in the registry`,
577
+ });
578
+ }
579
+ }
580
+ return { valid: issues.length === 0, issues };
581
+ }
582
+ //# sourceMappingURL=stallCoverageValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stallCoverageValidator.js","sourceRoot":"","sources":["../../src/core/stallCoverageValidator.ts"],"names":[],"mappings":"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"}