@substrate-ai/sdlc 0.20.29 → 0.20.32
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/verification/checks/acceptance-criteria-evidence-check.d.ts +25 -3
- package/dist/verification/checks/acceptance-criteria-evidence-check.d.ts.map +1 -1
- package/dist/verification/checks/acceptance-criteria-evidence-check.js +292 -13
- package/dist/verification/checks/acceptance-criteria-evidence-check.js.map +1 -1
- package/dist/verification/checks/runtime-probe-check.d.ts +7 -0
- package/dist/verification/checks/runtime-probe-check.d.ts.map +1 -1
- package/dist/verification/checks/runtime-probe-check.js +4 -1
- package/dist/verification/checks/runtime-probe-check.js.map +1 -1
- package/dist/verification/checks/trivial-output-check.d.ts.map +1 -1
- package/dist/verification/checks/trivial-output-check.js +40 -1
- package/dist/verification/checks/trivial-output-check.js.map +1 -1
- package/dist/verification/index.d.ts +1 -0
- package/dist/verification/index.d.ts.map +1 -1
- package/dist/verification/index.js +2 -0
- package/dist/verification/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -2,15 +2,23 @@
|
|
|
2
2
|
* AcceptanceCriteriaEvidenceCheck.
|
|
3
3
|
*
|
|
4
4
|
* Tier A verification check that compares a story's declared acceptance
|
|
5
|
-
* criteria against structured dev-story output. The check is
|
|
6
|
-
*
|
|
5
|
+
* criteria against structured dev-story output. The check is deterministic
|
|
6
|
+
* (no LLM calls, no shell commands) but as of Story 61-7 it may inspect
|
|
7
|
+
* `dev_story_signals.files_modified` content and the working tree filesystem
|
|
8
|
+
* to find code-evidence for ACs the dev under-claimed. Repository inspection
|
|
9
|
+
* is bounded to files explicitly listed in files_modified — no crawling.
|
|
7
10
|
*/
|
|
8
11
|
import type { VerificationCheck, VerificationContext, VerificationResult } from '../types.js';
|
|
9
12
|
/**
|
|
10
13
|
* Extract normalized AC ids from story markdown.
|
|
11
14
|
*
|
|
12
15
|
* Supports the BMAD default format (`### AC1:`), explicit references such as
|
|
13
|
-
* `AC: #1`,
|
|
16
|
+
* `AC: #1`, plain numbered criteria inside the Acceptance Criteria section,
|
|
17
|
+
* and (Story 61-4) bullet-format ACs where each bullet line under the
|
|
18
|
+
* Acceptance Criteria section becomes an implicit AC numbered by position
|
|
19
|
+
* (first bullet → AC1, second → AC2, etc.). Bullet-format inference fires
|
|
20
|
+
* only when no numbered or explicit-ref ACs were found, so projects mixing
|
|
21
|
+
* conventions favor the explicit signal.
|
|
14
22
|
*/
|
|
15
23
|
export declare function extractAcceptanceCriteriaIds(storyContent: string): string[];
|
|
16
24
|
export declare class AcceptanceCriteriaEvidenceCheck implements VerificationCheck {
|
|
@@ -18,4 +26,18 @@ export declare class AcceptanceCriteriaEvidenceCheck implements VerificationChec
|
|
|
18
26
|
readonly tier: "A";
|
|
19
27
|
run(context: VerificationContext): Promise<VerificationResult>;
|
|
20
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Build a per-AC text map (id → AC body text). Used by the code-evidence
|
|
31
|
+
* fallback (Story 61-7) when an AC is missing from the dev's claim list —
|
|
32
|
+
* the AC's text drives path-token extraction so we can look for evidence
|
|
33
|
+
* that the work was done despite the under-claim.
|
|
34
|
+
*
|
|
35
|
+
* Resolution order per AC id:
|
|
36
|
+
* 1. Lines in the acceptance section that explicitly mention `AC<N>` or
|
|
37
|
+
* `AC: #<N>` are concatenated.
|
|
38
|
+
* 2. If no explicit mention, fall back to position: the Nth bullet
|
|
39
|
+
* (`- ...`) under the section is AC<N>'s text.
|
|
40
|
+
* 3. If no bullets, the Nth numbered item (`<N>. ...`).
|
|
41
|
+
*/
|
|
42
|
+
export declare function extractAcceptanceCriteriaTexts(storyContent: string): Map<string, string>;
|
|
21
43
|
//# sourceMappingURL=acceptance-criteria-evidence-check.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptance-criteria-evidence-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/acceptance-criteria-evidence-check.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"acceptance-criteria-evidence-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/acceptance-criteria-evidence-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAEV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAqFpB;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAqC3E;AA2BD,qBAAa,+BAAgC,YAAW,iBAAiB;IACvE,QAAQ,CAAC,IAAI,kCAAiC;IAC9C,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAEtB,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsKrE;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAuDxF"}
|
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
* AcceptanceCriteriaEvidenceCheck.
|
|
3
3
|
*
|
|
4
4
|
* Tier A verification check that compares a story's declared acceptance
|
|
5
|
-
* criteria against structured dev-story output. The check is
|
|
6
|
-
*
|
|
5
|
+
* criteria against structured dev-story output. The check is deterministic
|
|
6
|
+
* (no LLM calls, no shell commands) but as of Story 61-7 it may inspect
|
|
7
|
+
* `dev_story_signals.files_modified` content and the working tree filesystem
|
|
8
|
+
* to find code-evidence for ACs the dev under-claimed. Repository inspection
|
|
9
|
+
* is bounded to files explicitly listed in files_modified — no crawling.
|
|
7
10
|
*/
|
|
11
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
8
13
|
import { renderFindings } from '../findings.js';
|
|
9
14
|
const EXPLICIT_AC_REF = /\bAC\s*:?\s*#?\s*(\d+)\b/gi;
|
|
10
15
|
const NUMBERED_CRITERION = /^\s*(?:[-*]\s*)?(?:\[[ xX]\]\s*)?(\d+)[.)]\s+\S/;
|
|
@@ -32,12 +37,52 @@ function addExplicitAcRefs(text, ids) {
|
|
|
32
37
|
}
|
|
33
38
|
function extractAcceptanceSection(storyContent) {
|
|
34
39
|
const lines = storyContent.split(/\r?\n/);
|
|
35
|
-
|
|
40
|
+
// Story 61-4: section detection now also recognizes the bold-paragraph
|
|
41
|
+
// form `**Acceptance Criteria**:` (with optional trailing colon and
|
|
42
|
+
// text on the same line) in addition to the heading form
|
|
43
|
+
// `## Acceptance Criteria`. The bold form is common in per-epic
|
|
44
|
+
// planning files (substrate's own _bmad-output/planning-artifacts/
|
|
45
|
+
// convention) where the AC section is a paragraph under a `### Story
|
|
46
|
+
// X:` heading rather than its own `##` heading.
|
|
47
|
+
//
|
|
48
|
+
// Boundary mode tracks how the section started so the end-detection can
|
|
49
|
+
// use the right rule: heading-started sections end at next `##` or
|
|
50
|
+
// `### Story`; bold-paragraph sections end at next `**Bold**:` paragraph
|
|
51
|
+
// OR next `##`/`### Story`.
|
|
52
|
+
let mode;
|
|
53
|
+
const start = lines.findIndex((line) => {
|
|
54
|
+
const trimmed = line.trim();
|
|
55
|
+
if (/^##\s+Acceptance Criteria\s*$/i.test(trimmed)) {
|
|
56
|
+
mode = 'heading';
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (/^\*\*Acceptance Criteria\*\*:?/i.test(trimmed)) {
|
|
60
|
+
mode = 'bold';
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
});
|
|
36
65
|
if (start === -1)
|
|
37
66
|
return undefined;
|
|
38
67
|
let end = lines.length;
|
|
68
|
+
// Section ends at the next ## heading OR the next ### Story heading
|
|
69
|
+
// (Story 61-4: per-epic files have ### Story siblings as the natural
|
|
70
|
+
// section boundary; without this, AC-section bleeds into the next
|
|
71
|
+
// story's content). Bold-paragraph sections additionally end at the
|
|
72
|
+
// next `**SomethingElse**:` bold-paragraph marker — that's the natural
|
|
73
|
+
// sibling boundary in the per-epic-file convention.
|
|
74
|
+
const BOLD_PARA_BOUNDARY = /^\*\*[A-Za-z][A-Za-z\s]*\*\*:/;
|
|
39
75
|
for (let i = start + 1; i < lines.length; i += 1) {
|
|
40
|
-
|
|
76
|
+
const line = lines[i] ?? '';
|
|
77
|
+
if (/^##\s+\S/.test(line)) {
|
|
78
|
+
end = i;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
if (/^###\s+Story\s+/i.test(line)) {
|
|
82
|
+
end = i;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
if (mode === 'bold' && BOLD_PARA_BOUNDARY.test(line.trim())) {
|
|
41
86
|
end = i;
|
|
42
87
|
break;
|
|
43
88
|
}
|
|
@@ -48,7 +93,12 @@ function extractAcceptanceSection(storyContent) {
|
|
|
48
93
|
* Extract normalized AC ids from story markdown.
|
|
49
94
|
*
|
|
50
95
|
* Supports the BMAD default format (`### AC1:`), explicit references such as
|
|
51
|
-
* `AC: #1`,
|
|
96
|
+
* `AC: #1`, plain numbered criteria inside the Acceptance Criteria section,
|
|
97
|
+
* and (Story 61-4) bullet-format ACs where each bullet line under the
|
|
98
|
+
* Acceptance Criteria section becomes an implicit AC numbered by position
|
|
99
|
+
* (first bullet → AC1, second → AC2, etc.). Bullet-format inference fires
|
|
100
|
+
* only when no numbered or explicit-ref ACs were found, so projects mixing
|
|
101
|
+
* conventions favor the explicit signal.
|
|
52
102
|
*/
|
|
53
103
|
export function extractAcceptanceCriteriaIds(storyContent) {
|
|
54
104
|
const ids = new Set();
|
|
@@ -64,6 +114,25 @@ export function extractAcceptanceCriteriaIds(storyContent) {
|
|
|
64
114
|
ids.add(id);
|
|
65
115
|
}
|
|
66
116
|
}
|
|
117
|
+
// Story 61-4: bullet-format inference. When no explicit AC refs and
|
|
118
|
+
// no numbered criteria were found, count `- ...` bullets in the
|
|
119
|
+
// section as implicit AC1, AC2, AC3 in order. Closes the case
|
|
120
|
+
// surfaced by the 60-12 dispatch where bullet-format ACs in the
|
|
121
|
+
// story file produced a `no numbered acceptance criteria found`
|
|
122
|
+
// warn even though the dev signaled all 9 ACs met.
|
|
123
|
+
if (ids.size === 0) {
|
|
124
|
+
let bulletPosition = 0;
|
|
125
|
+
for (const line of acceptanceSection.split(/\r?\n/)) {
|
|
126
|
+
// Match bullet lines but NOT lines like `**Bold**:` continuations,
|
|
127
|
+
// checkbox lines, or numbered items (already handled above).
|
|
128
|
+
if (/^\s*[-*]\s+\S/.test(line) && !NUMBERED_CRITERION.test(line)) {
|
|
129
|
+
bulletPosition += 1;
|
|
130
|
+
const id = normalizeAcId(String(bulletPosition));
|
|
131
|
+
if (id !== undefined)
|
|
132
|
+
ids.add(id);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
67
136
|
}
|
|
68
137
|
return sortAcIds(ids);
|
|
69
138
|
}
|
|
@@ -175,16 +244,47 @@ export class AcceptanceCriteriaEvidenceCheck {
|
|
|
175
244
|
const claimedIds = new Set(extractClaimedAcceptanceCriteriaIds(devResult.ac_met));
|
|
176
245
|
const missingIds = expectedIds.filter((id) => !claimedIds.has(id));
|
|
177
246
|
if (missingIds.length > 0) {
|
|
178
|
-
// Story
|
|
247
|
+
// Story 61-7: when an AC is missing from the dev's claim list, look for
|
|
248
|
+
// code-evidence in files_modified before failing. This avoids
|
|
249
|
+
// false-positive escalations where the dev under-claimed but the
|
|
250
|
+
// implementation IS done. Surfaced by 60-12 round 4: dev claimed
|
|
251
|
+
// AC1-AC9 of 10 spec bullets; AC10's deliverable
|
|
252
|
+
// (probe-author.test.ts) was demonstrably present.
|
|
253
|
+
//
|
|
254
|
+
// Evidence sources (any one suffices to downgrade error→info):
|
|
255
|
+
// 1. AC text mentions a file path that's in dev_story_signals.files_modified
|
|
256
|
+
// 2. A test file in files_modified mentions the AC by id (e.g., AC10:)
|
|
257
|
+
// 3. AC text mentions a path that exists in the working tree
|
|
258
|
+
const acceptanceTexts = extractAcceptanceCriteriaTexts(storyContent);
|
|
259
|
+
const filesModified = devResult.files_modified ?? [];
|
|
179
260
|
const claimedSummary = formatIds(sortAcIds(claimedIds)) || 'none';
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
261
|
+
// Story 55-2 AC3: one finding per missing AC id so consumers can address them individually
|
|
262
|
+
const findings = missingIds.map((id) => {
|
|
263
|
+
const acText = acceptanceTexts.get(id) ?? '';
|
|
264
|
+
const evidence = findCodeEvidence({
|
|
265
|
+
acId: id,
|
|
266
|
+
acText,
|
|
267
|
+
filesModified,
|
|
268
|
+
workingDir: context.workingDir,
|
|
269
|
+
});
|
|
270
|
+
if (evidence.found) {
|
|
271
|
+
return {
|
|
272
|
+
category: 'ac-missing-evidence-claim',
|
|
273
|
+
severity: 'info',
|
|
274
|
+
message: `dev-story did not claim ${id} but code-evidence was found: ${evidence.reason}` +
|
|
275
|
+
` (expected ${formatIds(expectedIds)}, claimed ${claimedSummary})`,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
category: 'ac-missing-evidence',
|
|
280
|
+
severity: 'error',
|
|
281
|
+
message: `missing dev-story AC evidence for ${id}` +
|
|
282
|
+
` (expected ${formatIds(expectedIds)}, claimed ${claimedSummary})`,
|
|
283
|
+
};
|
|
284
|
+
});
|
|
285
|
+
const hasErrorFinding = findings.some((f) => f.severity === 'error');
|
|
186
286
|
return {
|
|
187
|
-
status: 'fail',
|
|
287
|
+
status: hasErrorFinding ? 'fail' : 'warn',
|
|
188
288
|
details: renderFindings(findings),
|
|
189
289
|
duration_ms: Date.now() - start,
|
|
190
290
|
findings,
|
|
@@ -213,4 +313,183 @@ export class AcceptanceCriteriaEvidenceCheck {
|
|
|
213
313
|
};
|
|
214
314
|
}
|
|
215
315
|
}
|
|
316
|
+
// ---------------------------------------------------------------------------
|
|
317
|
+
// Story 61-7: per-AC text extraction + code-evidence detection
|
|
318
|
+
// ---------------------------------------------------------------------------
|
|
319
|
+
/**
|
|
320
|
+
* Build a per-AC text map (id → AC body text). Used by the code-evidence
|
|
321
|
+
* fallback (Story 61-7) when an AC is missing from the dev's claim list —
|
|
322
|
+
* the AC's text drives path-token extraction so we can look for evidence
|
|
323
|
+
* that the work was done despite the under-claim.
|
|
324
|
+
*
|
|
325
|
+
* Resolution order per AC id:
|
|
326
|
+
* 1. Lines in the acceptance section that explicitly mention `AC<N>` or
|
|
327
|
+
* `AC: #<N>` are concatenated.
|
|
328
|
+
* 2. If no explicit mention, fall back to position: the Nth bullet
|
|
329
|
+
* (`- ...`) under the section is AC<N>'s text.
|
|
330
|
+
* 3. If no bullets, the Nth numbered item (`<N>. ...`).
|
|
331
|
+
*/
|
|
332
|
+
export function extractAcceptanceCriteriaTexts(storyContent) {
|
|
333
|
+
const result = new Map();
|
|
334
|
+
const section = extractAcceptanceSection(storyContent);
|
|
335
|
+
if (section === undefined)
|
|
336
|
+
return result;
|
|
337
|
+
const lines = section.split(/\r?\n/);
|
|
338
|
+
// Explicit refs: collect all lines mentioning each AC id
|
|
339
|
+
const explicitByNum = new Map();
|
|
340
|
+
const explicitRefRe = /\bAC\s*:?\s*#?\s*(\d+)\b/gi;
|
|
341
|
+
for (const line of lines) {
|
|
342
|
+
explicitRefRe.lastIndex = 0;
|
|
343
|
+
let m;
|
|
344
|
+
while ((m = explicitRefRe.exec(line)) !== null) {
|
|
345
|
+
const n = Number.parseInt(m[1] ?? '', 10);
|
|
346
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
347
|
+
continue;
|
|
348
|
+
const list = explicitByNum.get(n) ?? [];
|
|
349
|
+
if (!list.includes(line))
|
|
350
|
+
list.push(line);
|
|
351
|
+
explicitByNum.set(n, list);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Position-based bullets and numbered items
|
|
355
|
+
const bulletLines = [];
|
|
356
|
+
const numberedLines = [];
|
|
357
|
+
for (const line of lines) {
|
|
358
|
+
if (/^\s*[-*]\s+\S/.test(line) && !/^\s*(?:[-*]\s*)?(?:\[[ xX]\]\s*)?(\d+)[.)]\s+\S/.test(line)) {
|
|
359
|
+
bulletLines.push(line);
|
|
360
|
+
}
|
|
361
|
+
if (/^\s*(?:[-*]\s*)?(?:\[[ xX]\]\s*)?(\d+)[.)]\s+\S/.test(line)) {
|
|
362
|
+
numberedLines.push(line);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Merge results: explicit refs win, fall through to position-based otherwise
|
|
366
|
+
const allNums = new Set([
|
|
367
|
+
...Array.from(explicitByNum.keys()),
|
|
368
|
+
...Array.from({ length: Math.max(bulletLines.length, numberedLines.length) }, (_, i) => i + 1),
|
|
369
|
+
]);
|
|
370
|
+
for (const n of allNums) {
|
|
371
|
+
const explicit = explicitByNum.get(n);
|
|
372
|
+
if (explicit && explicit.length > 0) {
|
|
373
|
+
result.set(`AC${n}`, explicit.join('\n'));
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
if (n - 1 < bulletLines.length) {
|
|
377
|
+
result.set(`AC${n}`, bulletLines[n - 1] ?? '');
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
if (n - 1 < numberedLines.length) {
|
|
381
|
+
result.set(`AC${n}`, numberedLines[n - 1] ?? '');
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return result;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Recognized source/test extensions for path-token extraction. Mirrors
|
|
388
|
+
* scope-guardrail.ts's RECOGNIZED_EXTENSIONS but lives here to avoid a
|
|
389
|
+
* cross-package import (sdlc cannot depend on src/modules).
|
|
390
|
+
*/
|
|
391
|
+
const PATH_TOKEN_EXTENSIONS = [
|
|
392
|
+
'.ts', '.tsx', '.js', '.jsx',
|
|
393
|
+
'.md', '.json', '.yaml', '.yml',
|
|
394
|
+
'.py', '.go', '.java', '.rb', '.rs',
|
|
395
|
+
'.sh', '.css', '.scss', '.html',
|
|
396
|
+
];
|
|
397
|
+
/**
|
|
398
|
+
* Extract path-like tokens from arbitrary text. A path-like token contains
|
|
399
|
+
* `/`, has a recognized extension, and contains no whitespace.
|
|
400
|
+
*/
|
|
401
|
+
function extractPathTokens(text) {
|
|
402
|
+
if (text === '')
|
|
403
|
+
return [];
|
|
404
|
+
const tokens = new Set();
|
|
405
|
+
// Backtick-wrapped paths
|
|
406
|
+
const backtickRe = /`([^`]+)`/g;
|
|
407
|
+
let m;
|
|
408
|
+
while ((m = backtickRe.exec(text)) !== null) {
|
|
409
|
+
const candidate = (m[1] ?? '').trim();
|
|
410
|
+
if (looksLikePath(candidate))
|
|
411
|
+
tokens.add(candidate);
|
|
412
|
+
}
|
|
413
|
+
// Whitespace-delimited tokens (after stripping backtick content to avoid double-counting)
|
|
414
|
+
const stripped = text.replace(/`[^`]+`/g, ' ');
|
|
415
|
+
for (const raw of stripped.split(/\s+/)) {
|
|
416
|
+
const clean = raw.replace(/[,;:()\[\]{}'"]+$/g, '').replace(/^[,;:()\[\]{}'"]+/g, '');
|
|
417
|
+
if (looksLikePath(clean))
|
|
418
|
+
tokens.add(clean);
|
|
419
|
+
}
|
|
420
|
+
return Array.from(tokens);
|
|
421
|
+
}
|
|
422
|
+
function looksLikePath(candidate) {
|
|
423
|
+
if (candidate === '' || /\s/.test(candidate))
|
|
424
|
+
return false;
|
|
425
|
+
if (!candidate.includes('/'))
|
|
426
|
+
return false;
|
|
427
|
+
return PATH_TOKEN_EXTENSIONS.some((ext) => candidate.endsWith(ext));
|
|
428
|
+
}
|
|
429
|
+
function isTestFilePath(filePath) {
|
|
430
|
+
return (filePath.includes('.test.') ||
|
|
431
|
+
filePath.includes('.spec.') ||
|
|
432
|
+
filePath.includes('__tests__/') ||
|
|
433
|
+
filePath.includes('__tests__\\') ||
|
|
434
|
+
filePath.includes('/__tests__') ||
|
|
435
|
+
filePath.includes('\\__tests__'));
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Find code-evidence that an unclaimed AC was actually implemented.
|
|
439
|
+
*
|
|
440
|
+
* Returns `{ found: true, reason }` when any of the three checks succeeds:
|
|
441
|
+
* 1. AC text mentions a file path that's in `filesModified` (exact or basename match)
|
|
442
|
+
* 2. AC text mentions a path that exists in the working tree
|
|
443
|
+
* 3. A test file in `filesModified` contains the AC id (e.g., `AC10`)
|
|
444
|
+
*
|
|
445
|
+
* Returns `{ found: false }` otherwise.
|
|
446
|
+
*/
|
|
447
|
+
function findCodeEvidence(opts) {
|
|
448
|
+
const { acId, acText, filesModified, workingDir } = opts;
|
|
449
|
+
const tokens = extractPathTokens(acText);
|
|
450
|
+
// Check 1: AC text mentions a path in files_modified (exact match)
|
|
451
|
+
for (const token of tokens) {
|
|
452
|
+
if (filesModified.includes(token)) {
|
|
453
|
+
return { found: true, reason: `AC text references ${token}, which is in files_modified` };
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
// Check 1b: basename match (more lenient — AC mentions `probe-author.test.ts`,
|
|
457
|
+
// files_modified contains `src/.../probe-author.test.ts`)
|
|
458
|
+
for (const token of tokens) {
|
|
459
|
+
const base = path.basename(token);
|
|
460
|
+
const match = filesModified.find((f) => path.basename(f) === base);
|
|
461
|
+
if (match !== undefined) {
|
|
462
|
+
return { found: true, reason: `AC text references ${token}; matching basename ${match} is in files_modified` };
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
// Check 2: AC text mentions a path that exists in the working tree
|
|
466
|
+
for (const token of tokens) {
|
|
467
|
+
try {
|
|
468
|
+
if (existsSync(path.join(workingDir, token))) {
|
|
469
|
+
return { found: true, reason: `AC text references ${token}, which exists in working tree` };
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
// ignore — defensive against unusable workingDir or permission errors
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// Check 3: any test file in files_modified mentions the AC id
|
|
477
|
+
const num = acId.replace(/^AC/i, '');
|
|
478
|
+
if (num !== '') {
|
|
479
|
+
const acMentionRe = new RegExp(`\\bAC\\s*:?\\s*#?\\s*${num}\\b`, 'i');
|
|
480
|
+
const testFiles = filesModified.filter(isTestFilePath);
|
|
481
|
+
for (const testFile of testFiles) {
|
|
482
|
+
try {
|
|
483
|
+
const content = readFileSync(path.join(workingDir, testFile), 'utf-8');
|
|
484
|
+
if (acMentionRe.test(content)) {
|
|
485
|
+
return { found: true, reason: `${testFile} mentions ${acId}` };
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
catch {
|
|
489
|
+
// file unreadable / nonexistent — skip
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
return { found: false };
|
|
494
|
+
}
|
|
216
495
|
//# sourceMappingURL=acceptance-criteria-evidence-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptance-criteria-evidence-check.js","sourceRoot":"","sources":["../../../src/verification/checks/acceptance-criteria-evidence-check.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acceptance-criteria-evidence-check.js","sourceRoot":"","sources":["../../../src/verification/checks/acceptance-criteria-evidence-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,13 @@
|
|
|
24
24
|
*/
|
|
25
25
|
import type { VerificationCheck, VerificationContext, VerificationResult } from '../types.js';
|
|
26
26
|
import { type ProbeResult, type RuntimeProbe } from '../probes/index.js';
|
|
27
|
+
/**
|
|
28
|
+
* Returns true if the source AC text mentions an event-driven mechanism.
|
|
29
|
+
*
|
|
30
|
+
* Exported for use by probe-author-integration.ts (Story 60-13) so the
|
|
31
|
+
* orchestrator can gate probe-author dispatch on the same heuristic.
|
|
32
|
+
*/
|
|
33
|
+
export declare function detectsEventDrivenAC(sourceEpicContent: string): boolean;
|
|
27
34
|
/**
|
|
28
35
|
* Per-sandbox executors, injected via constructor so tests (and future
|
|
29
36
|
* twin integration in Phase 3) can swap implementations without touching
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-probe-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/runtime-probe-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime-probe-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/runtime-probe-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AA2E3B;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAKvE;AAkBD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,CAAA;IACnD;wEACoE;IACpE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;CACjE;AAWD,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,IAAI,oBAAmB;IAChC,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;gBAEtC,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAOhD,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA0JrE"}
|
|
@@ -94,8 +94,11 @@ const TRIGGER_COMMAND_PATTERNS = [
|
|
|
94
94
|
];
|
|
95
95
|
/**
|
|
96
96
|
* Returns true if the source AC text mentions an event-driven mechanism.
|
|
97
|
+
*
|
|
98
|
+
* Exported for use by probe-author-integration.ts (Story 60-13) so the
|
|
99
|
+
* orchestrator can gate probe-author dispatch on the same heuristic.
|
|
97
100
|
*/
|
|
98
|
-
function detectsEventDrivenAC(sourceEpicContent) {
|
|
101
|
+
export function detectsEventDrivenAC(sourceEpicContent) {
|
|
99
102
|
for (const pattern of EVENT_DRIVEN_KEYWORDS) {
|
|
100
103
|
if (pattern.test(sourceEpicContent))
|
|
101
104
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-probe-check.js","sourceRoot":"","sources":["../../../src/verification/checks/runtime-probe-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,oBAAoB,CAAA;AAE3B,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,cAAc,GAAG,2BAA2B,CAAA;AAClD,MAAM,aAAa,GAAG,oBAAoB,CAAA;AAC1C,MAAM,iBAAiB,GAAG,wBAAwB,CAAA;AAClD,MAAM,aAAa,GAAG,oBAAoB,CAAA;AAC1C,MAAM,gBAAgB,GAAG,uBAAuB,CAAA;AAChD;;;;;GAKG;AACH,MAAM,uBAAuB,GAAG,8BAA8B,CAAA;AAC9D;;;;;;;;;;;;;GAaG;AACH,MAAM,wBAAwB,GAAG,0CAA0C,CAAA;AAE3E,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,qBAAqB,GAAG;IAC5B,8FAA8F;IAC9F,gFAAgF;IAChF,kEAAkE;IAClE,6DAA6D;IAC7D,iEAAiE;IACjE,8CAA8C;CAC/C,CAAA;AAED;;;GAGG;AACH,MAAM,wBAAwB,GAAG;IAC/B,yDAAyD;IACzD,eAAe;IACf,2BAA2B;IAC3B,YAAY;IACZ,oDAAoD;IACpD,4CAA4C;IAC5C,yBAAyB,EAAE,4BAA4B;CACxD,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"runtime-probe-check.js","sourceRoot":"","sources":["../../../src/verification/checks/runtime-probe-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trivial-output-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/trivial-output-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAOpB;;;GAGG;AACH,eAAO,MAAM,gCAAgC,MAAM,CAAA;AAMnD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAMD;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAmB,YAAW,iBAAiB;IAC1D,QAAQ,CAAC,IAAI,oBAAmB;IAChC,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,MAAM,CAAC,EAAE,wBAAwB;IAIvC,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"trivial-output-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/trivial-output-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAOpB;;;GAGG;AACH,eAAO,MAAM,gCAAgC,MAAM,CAAA;AAMnD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAMD;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAmB,YAAW,iBAAiB;IAC1D,QAAQ,CAAC,IAAI,oBAAmB;IAChC,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,MAAM,CAAC,EAAE,wBAAwB;IAIvC,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA4FrE"}
|
|
@@ -61,8 +61,47 @@ export class TrivialOutputCheck {
|
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
63
|
const count = context.outputTokenCount;
|
|
64
|
-
// AC1 + AC2: below threshold → fail with actionable message
|
|
64
|
+
// AC1 + AC2: below threshold → fail with actionable message.
|
|
65
|
+
//
|
|
66
|
+
// Story 61-2: when devStoryResult signals SUCCESS and files were
|
|
67
|
+
// modified, the low last-dispatch token count is explained by
|
|
68
|
+
// checkpoint recovery (Story 39-5/39-6) — earlier dispatches
|
|
69
|
+
// already produced the work; the recovery dispatch is bookkeeping.
|
|
70
|
+
// Surfaced live by the 60-12 dogfooding re-dispatch (run 4700c6e8,
|
|
71
|
+
// 2026-04-27): dev produced 7 files of correct code across 4
|
|
72
|
+
// dispatches, the 4th (recovery) returned 0 tokens, and the
|
|
73
|
+
// verdict was VERIFICATION_FAILED despite the implementation being
|
|
74
|
+
// demonstrably correct (17 tests pass, build clean, all 9 ACs met).
|
|
75
|
+
//
|
|
76
|
+
// When devStoryResult signals success + nontrivial files_modified,
|
|
77
|
+
// downgrade fail → warn so the low-token signal stays visible
|
|
78
|
+
// (not silently hidden) but doesn't block dispatches that
|
|
79
|
+
// legitimately checkpoint-recovered.
|
|
65
80
|
if (count < this.threshold) {
|
|
81
|
+
const devResult = context.devStoryResult;
|
|
82
|
+
const recoveredAfterCheckpoint = devResult?.result === 'success' &&
|
|
83
|
+
Array.isArray(devResult.files_modified) &&
|
|
84
|
+
devResult.files_modified.length > 0;
|
|
85
|
+
if (recoveredAfterCheckpoint) {
|
|
86
|
+
const findings = [
|
|
87
|
+
{
|
|
88
|
+
category: 'trivial-output',
|
|
89
|
+
severity: 'warn',
|
|
90
|
+
message: `output token count ${count} is below threshold ${this.threshold} ` +
|
|
91
|
+
`but dev-story signals success with ${devResult.files_modified.length} ` +
|
|
92
|
+
`files modified — likely checkpoint-recovered dispatch (last dispatch ` +
|
|
93
|
+
`was bookkeeping; earlier dispatches did the work). Verdict downgraded ` +
|
|
94
|
+
`to warn so dispatches that legitimately recovered from checkpoint ` +
|
|
95
|
+
`aren't blocked by the trivial-output gate.`,
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
return {
|
|
99
|
+
status: 'warn',
|
|
100
|
+
details: renderFindings(findings),
|
|
101
|
+
duration_ms: Date.now() - start,
|
|
102
|
+
findings,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
66
105
|
const findings = [
|
|
67
106
|
{
|
|
68
107
|
category: 'trivial-output',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trivial-output-check.js","sourceRoot":"","sources":["../../../src/verification/checks/trivial-output-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,GAAG,CAAA;AAenD,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,gBAAgB,CAAA;IACvB,IAAI,GAAG,GAAY,CAAA;IAEX,SAAS,CAAQ;IAElC,YAAY,MAAiC;QAC3C,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,sBAAsB,IAAI,gCAAgC,CAAA;IACrF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAA4B;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAExB,2CAA2C;QAC3C,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,iDAAiD;iBAC3D;aACF,CAAA;YACD,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;gBACjC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC/B,QAAQ;aACT,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAA;QAEtC,4DAA4D;QAC5D,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,OAAO;oBACjB,OAAO,EACL,sBAAsB,KAAK,uBAAuB,IAAI,CAAC,SAAS,EAAE;wBAClE,mCAAmC;iBACtC;aACF,CAAA;YACD,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;gBACjC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC/B,QAAQ;aACT,CAAA;QACH,CAAC;QAED,oCAAoC;QACpC,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,sBAAsB,KAAK,oBAAoB,IAAI,CAAC,SAAS,EAAE;YACxE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC/B,QAAQ,EAAE,EAAE;SACb,CAAA;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"trivial-output-check.js","sourceRoot":"","sources":["../../../src/verification/checks/trivial-output-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export type { VerificationCheck, VerificationContext, VerificationResult, Verifi
|
|
|
9
9
|
export { renderFindings } from './findings.js';
|
|
10
10
|
export { RuntimeProbeCheck } from './checks/runtime-probe-check.js';
|
|
11
11
|
export type { RuntimeProbeExecutors } from './checks/runtime-probe-check.js';
|
|
12
|
+
export { detectsEventDrivenAC } from './checks/runtime-probe-check.js';
|
|
12
13
|
export { DEFAULT_PROBE_TIMEOUT_MS, PROBE_TAIL_BYTES, RuntimeProbeListSchema, RuntimeProbeSandboxSchema, RuntimeProbeSchema, parseRuntimeProbes, executeProbeOnHost, } from './probes/index.js';
|
|
13
14
|
export type { HostExecuteOptions, ProbeResult, RuntimeProbe, RuntimeProbeParseResult, RuntimeProbeSandbox, } from './probes/index.js';
|
|
14
15
|
export { PhantomReviewCheck } from './checks/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAA;AACpG,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAG9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAA;AACpG,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAG9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAE5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAA;AACxF,OAAO,EAAE,+BAA+B,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA"}
|
|
@@ -8,6 +8,8 @@ export { VerificationPipeline, createDefaultVerificationPipeline } from './verif
|
|
|
8
8
|
export { renderFindings } from './findings.js';
|
|
9
9
|
// Epic 55 Phase 2 — Runtime probe support.
|
|
10
10
|
export { RuntimeProbeCheck } from './checks/runtime-probe-check.js';
|
|
11
|
+
// Story 60-13: exported for probe-author-integration gate
|
|
12
|
+
export { detectsEventDrivenAC } from './checks/runtime-probe-check.js';
|
|
11
13
|
export { DEFAULT_PROBE_TIMEOUT_MS, PROBE_TAIL_BYTES, RuntimeProbeListSchema, RuntimeProbeSandboxSchema, RuntimeProbeSchema, parseRuntimeProbes, executeProbeOnHost, } from './probes/index.js';
|
|
12
14
|
// Concrete check implementations (story 51-2+)
|
|
13
15
|
export { PhantomReviewCheck } from './checks/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAA;AAYpG,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,2CAA2C;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAQ1B,+CAA+C;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAA;AACxF,OAAO,EAAE,+BAA+B,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC1F,uCAAuC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAA;AAYpG,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,2CAA2C;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,0DAA0D;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAQ1B,+CAA+C;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAA;AACxF,OAAO,EAAE,+BAA+B,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC1F,uCAAuC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@substrate-ai/sdlc",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.32",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"node": ">=22.0.0"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@substrate-ai/core": "0.20.
|
|
27
|
+
"@substrate-ai/core": "0.20.32",
|
|
28
28
|
"js-yaml": "^4.1.1",
|
|
29
29
|
"zod": "^4.3.6"
|
|
30
30
|
},
|