@substrate-ai/sdlc 0.20.28 → 0.20.31
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 +6 -1
- package/dist/verification/checks/acceptance-criteria-evidence-check.d.ts.map +1 -1
- package/dist/verification/checks/acceptance-criteria-evidence-check.js +67 -3
- package/dist/verification/checks/acceptance-criteria-evidence-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/package.json +2 -2
|
@@ -10,7 +10,12 @@ import type { VerificationCheck, VerificationContext, VerificationResult } from
|
|
|
10
10
|
* Extract normalized AC ids from story markdown.
|
|
11
11
|
*
|
|
12
12
|
* Supports the BMAD default format (`### AC1:`), explicit references such as
|
|
13
|
-
* `AC: #1`,
|
|
13
|
+
* `AC: #1`, plain numbered criteria inside the Acceptance Criteria section,
|
|
14
|
+
* and (Story 61-4) bullet-format ACs where each bullet line under the
|
|
15
|
+
* Acceptance Criteria section becomes an implicit AC numbered by position
|
|
16
|
+
* (first bullet → AC1, second → AC2, etc.). Bullet-format inference fires
|
|
17
|
+
* only when no numbered or explicit-ref ACs were found, so projects mixing
|
|
18
|
+
* conventions favor the explicit signal.
|
|
14
19
|
*/
|
|
15
20
|
export declare function extractAcceptanceCriteriaIds(storyContent: string): string[];
|
|
16
21
|
export declare class AcceptanceCriteriaEvidenceCheck implements VerificationCheck {
|
|
@@ -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;;;;;;GAMG;AAEH,OAAO,KAAK,EAEV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"acceptance-criteria-evidence-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/acceptance-criteria-evidence-check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,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;CAkIrE"}
|
|
@@ -32,12 +32,52 @@ function addExplicitAcRefs(text, ids) {
|
|
|
32
32
|
}
|
|
33
33
|
function extractAcceptanceSection(storyContent) {
|
|
34
34
|
const lines = storyContent.split(/\r?\n/);
|
|
35
|
-
|
|
35
|
+
// Story 61-4: section detection now also recognizes the bold-paragraph
|
|
36
|
+
// form `**Acceptance Criteria**:` (with optional trailing colon and
|
|
37
|
+
// text on the same line) in addition to the heading form
|
|
38
|
+
// `## Acceptance Criteria`. The bold form is common in per-epic
|
|
39
|
+
// planning files (substrate's own _bmad-output/planning-artifacts/
|
|
40
|
+
// convention) where the AC section is a paragraph under a `### Story
|
|
41
|
+
// X:` heading rather than its own `##` heading.
|
|
42
|
+
//
|
|
43
|
+
// Boundary mode tracks how the section started so the end-detection can
|
|
44
|
+
// use the right rule: heading-started sections end at next `##` or
|
|
45
|
+
// `### Story`; bold-paragraph sections end at next `**Bold**:` paragraph
|
|
46
|
+
// OR next `##`/`### Story`.
|
|
47
|
+
let mode;
|
|
48
|
+
const start = lines.findIndex((line) => {
|
|
49
|
+
const trimmed = line.trim();
|
|
50
|
+
if (/^##\s+Acceptance Criteria\s*$/i.test(trimmed)) {
|
|
51
|
+
mode = 'heading';
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (/^\*\*Acceptance Criteria\*\*:?/i.test(trimmed)) {
|
|
55
|
+
mode = 'bold';
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
});
|
|
36
60
|
if (start === -1)
|
|
37
61
|
return undefined;
|
|
38
62
|
let end = lines.length;
|
|
63
|
+
// Section ends at the next ## heading OR the next ### Story heading
|
|
64
|
+
// (Story 61-4: per-epic files have ### Story siblings as the natural
|
|
65
|
+
// section boundary; without this, AC-section bleeds into the next
|
|
66
|
+
// story's content). Bold-paragraph sections additionally end at the
|
|
67
|
+
// next `**SomethingElse**:` bold-paragraph marker — that's the natural
|
|
68
|
+
// sibling boundary in the per-epic-file convention.
|
|
69
|
+
const BOLD_PARA_BOUNDARY = /^\*\*[A-Za-z][A-Za-z\s]*\*\*:/;
|
|
39
70
|
for (let i = start + 1; i < lines.length; i += 1) {
|
|
40
|
-
|
|
71
|
+
const line = lines[i] ?? '';
|
|
72
|
+
if (/^##\s+\S/.test(line)) {
|
|
73
|
+
end = i;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
if (/^###\s+Story\s+/i.test(line)) {
|
|
77
|
+
end = i;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
if (mode === 'bold' && BOLD_PARA_BOUNDARY.test(line.trim())) {
|
|
41
81
|
end = i;
|
|
42
82
|
break;
|
|
43
83
|
}
|
|
@@ -48,7 +88,12 @@ function extractAcceptanceSection(storyContent) {
|
|
|
48
88
|
* Extract normalized AC ids from story markdown.
|
|
49
89
|
*
|
|
50
90
|
* Supports the BMAD default format (`### AC1:`), explicit references such as
|
|
51
|
-
* `AC: #1`,
|
|
91
|
+
* `AC: #1`, plain numbered criteria inside the Acceptance Criteria section,
|
|
92
|
+
* and (Story 61-4) bullet-format ACs where each bullet line under the
|
|
93
|
+
* Acceptance Criteria section becomes an implicit AC numbered by position
|
|
94
|
+
* (first bullet → AC1, second → AC2, etc.). Bullet-format inference fires
|
|
95
|
+
* only when no numbered or explicit-ref ACs were found, so projects mixing
|
|
96
|
+
* conventions favor the explicit signal.
|
|
52
97
|
*/
|
|
53
98
|
export function extractAcceptanceCriteriaIds(storyContent) {
|
|
54
99
|
const ids = new Set();
|
|
@@ -64,6 +109,25 @@ export function extractAcceptanceCriteriaIds(storyContent) {
|
|
|
64
109
|
ids.add(id);
|
|
65
110
|
}
|
|
66
111
|
}
|
|
112
|
+
// Story 61-4: bullet-format inference. When no explicit AC refs and
|
|
113
|
+
// no numbered criteria were found, count `- ...` bullets in the
|
|
114
|
+
// section as implicit AC1, AC2, AC3 in order. Closes the case
|
|
115
|
+
// surfaced by the 60-12 dispatch where bullet-format ACs in the
|
|
116
|
+
// story file produced a `no numbered acceptance criteria found`
|
|
117
|
+
// warn even though the dev signaled all 9 ACs met.
|
|
118
|
+
if (ids.size === 0) {
|
|
119
|
+
let bulletPosition = 0;
|
|
120
|
+
for (const line of acceptanceSection.split(/\r?\n/)) {
|
|
121
|
+
// Match bullet lines but NOT lines like `**Bold**:` continuations,
|
|
122
|
+
// checkbox lines, or numbered items (already handled above).
|
|
123
|
+
if (/^\s*[-*]\s+\S/.test(line) && !NUMBERED_CRITERION.test(line)) {
|
|
124
|
+
bulletPosition += 1;
|
|
125
|
+
const id = normalizeAcId(String(bulletPosition));
|
|
126
|
+
if (id !== undefined)
|
|
127
|
+
ids.add(id);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
67
131
|
}
|
|
68
132
|
return sortAcIds(ids);
|
|
69
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptance-criteria-evidence-check.js","sourceRoot":"","sources":["../../../src/verification/checks/acceptance-criteria-evidence-check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,MAAM,eAAe,GAAG,4BAA4B,CAAA;AACpD,MAAM,kBAAkB,GAAG,iDAAiD,CAAA;AAE5E,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IAC7D,OAAO,KAAK,MAAM,EAAE,CAAA;AACtB,CAAC;AAED,SAAS,SAAS,CAAC,GAAqB;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACvD,OAAO,IAAI,GAAG,IAAI,CAAA;IACpB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,GAAgB;IACvD,eAAe,CAAC,SAAS,GAAG,CAAC,CAAA;IAC7B,IAAI,KAA6B,CAAA;IACjC,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACxC,IAAI,EAAE,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,YAAoB;IACpD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"acceptance-criteria-evidence-check.js","sourceRoot":"","sources":["../../../src/verification/checks/acceptance-criteria-evidence-check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,MAAM,eAAe,GAAG,4BAA4B,CAAA;AACpD,MAAM,kBAAkB,GAAG,iDAAiD,CAAA;AAE5E,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IAC7D,OAAO,KAAK,MAAM,EAAE,CAAA;AACtB,CAAC;AAED,SAAS,SAAS,CAAC,GAAqB;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACvD,OAAO,IAAI,GAAG,IAAI,CAAA;IACpB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,GAAgB;IACvD,eAAe,CAAC,SAAS,GAAG,CAAC,CAAA;IAC7B,IAAI,KAA6B,CAAA;IACjC,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACxC,IAAI,EAAE,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,YAAoB;IACpD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACzC,uEAAuE;IACvE,oEAAoE;IACpE,yDAAyD;IACzD,gEAAgE;IAChE,mEAAmE;IACnE,qEAAqE;IACrE,gDAAgD;IAChD,EAAE;IACF,wEAAwE;IACxE,mEAAmE;IACnE,yEAAyE;IACzE,4BAA4B;IAC5B,IAAI,IAAoC,CAAA;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,IAAI,GAAG,SAAS,CAAA;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,IAAI,GAAG,MAAM,CAAA;YACb,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;IACF,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAElC,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA;IACtB,oEAAoE;IACpE,qEAAqE;IACrE,kEAAkE;IAClE,oEAAoE;IACpE,uEAAuE;IACvE,oDAAoD;IACpD,MAAM,kBAAkB,GAAG,+BAA+B,CAAA;IAC1D,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,GAAG,GAAG,CAAC,CAAA;YACP,MAAK;QACP,CAAC;QACD,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,GAAG,GAAG,CAAC,CAAA;YACP,MAAK;QACP,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5D,GAAG,GAAG,CAAC,CAAA;YACP,MAAK;QACP,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC/C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,4BAA4B,CAAC,YAAoB;IAC/D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7B,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAA;IAChE,MAAM,UAAU,GAAG,iBAAiB,IAAI,YAAY,CAAA;IAEpD,iBAAiB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IAElC,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;YAC5C,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBAClC,IAAI,EAAE,KAAK,SAAS;oBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,gEAAgE;QAChE,8DAA8D;QAC9D,gEAAgE;QAChE,gEAAgE;QAChE,mDAAmD;QACnD,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,cAAc,GAAG,CAAC,CAAA;YACtB,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,mEAAmE;gBACnE,6DAA6D;gBAC7D,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjE,cAAc,IAAI,CAAC,CAAA;oBACnB,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;oBAChD,IAAI,EAAE,KAAK,SAAS;wBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,CAAA;AACvB,CAAC;AAED,SAAS,mCAAmC,CAAC,MAA4B;IACvE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAE7B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QACnD,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,EAAE,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;YACvC,IAAI,EAAE,KAAK,SAAS;gBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,CAAA;AACvB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA+B;IAC3D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,GAAa;IAC9B,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvB,CAAC;AAED,MAAM,OAAO,+BAA+B;IACjC,IAAI,GAAG,8BAA8B,CAAA;IACrC,IAAI,GAAG,GAAY,CAAA;IAE5B,KAAK,CAAC,GAAG,CAAC,OAA4B;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,CAAA;QAEjD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,oBAAoB;oBAC9B,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,wDAAwD;iBAClE;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,WAAW,GAAG,4BAA4B,CAAC,YAAY,CAAC,CAAA;QAC9D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,oBAAoB;oBAC9B,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,gDAAgD;iBAC1D;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,SAAS,GAAG,OAAO,CAAC,cAAc,CAAA;QACxC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,oBAAoB;oBAC9B,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,oCAAoC,SAAS,CAAC,WAAW,CAAC,EAAE;iBACtE;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,UAAU,GAAG,SAAS,CAAC,WAAW,IAAI,EAAE,CAAA;QAC9C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,sEAAsE;YACtE,MAAM,QAAQ,GAA0B,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACnE,QAAQ,EAAE,qBAAqB;gBAC/B,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,kCAAkC,OAAO,EAAE;aACrD,CAAC,CAAC,CAAA;YACH,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,WAAW,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACzD,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,iBAAiB;oBAC3B,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,kCAAkC;iBAC5C;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,UAAU,GAAG,IAAI,GAAG,CAAC,mCAAmC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QACjF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAClE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,2FAA2F;YAC3F,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,MAAM,CAAA;YACjE,MAAM,QAAQ,GAA0B,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC9D,QAAQ,EAAE,qBAAqB;gBAC/B,QAAQ,EAAE,OAAO;gBACjB,OAAO,EACL,qCAAqC,EAAE,EAAE;oBACzC,cAAc,SAAS,CAAC,WAAW,CAAC,aAAa,cAAc,GAAG;aACrE,CAAC,CAAC,CAAA;YACH,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,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,yBAAyB;oBACnC,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,sBAAsB,SAAS,CAAC,WAAW,CAAC,kCAAkC;iBACxF;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,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,oDAAoD,SAAS,CAAC,WAAW,CAAC,WAAW,WAAW,EAAE;YAC3G,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC/B,QAAQ,EAAE,EAAE;SACb,CAAA;IACH,CAAC;CACF"}
|
|
@@ -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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@substrate-ai/sdlc",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.31",
|
|
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.31",
|
|
28
28
|
"js-yaml": "^4.1.1",
|
|
29
29
|
"zod": "^4.3.6"
|
|
30
30
|
},
|