@substrate-ai/sdlc 0.20.2 → 0.20.4
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/run-model/index.d.ts +2 -2
- package/dist/run-model/index.d.ts.map +1 -1
- package/dist/run-model/index.js +2 -1
- package/dist/run-model/index.js.map +1 -1
- package/dist/run-model/per-story-state.d.ts +16 -2
- package/dist/run-model/per-story-state.d.ts.map +1 -1
- package/dist/run-model/schemas.d.ts +16 -2
- package/dist/run-model/schemas.d.ts.map +1 -1
- package/dist/run-model/verification-result.d.ts +53 -3
- package/dist/run-model/verification-result.d.ts.map +1 -1
- package/dist/run-model/verification-result.js +28 -0
- package/dist/run-model/verification-result.js.map +1 -1
- package/dist/verification/checks/acceptance-criteria-evidence-check.d.ts.map +1 -1
- package/dist/verification/checks/acceptance-criteria-evidence-check.js +65 -8
- package/dist/verification/checks/acceptance-criteria-evidence-check.js.map +1 -1
- package/dist/verification/checks/build-check.d.ts.map +1 -1
- package/dist/verification/checks/build-check.js +64 -8
- package/dist/verification/checks/build-check.js.map +1 -1
- package/dist/verification/checks/phantom-review-check.d.ts.map +1 -1
- package/dist/verification/checks/phantom-review-check.js +21 -2
- package/dist/verification/checks/phantom-review-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 +21 -3
- package/dist/verification/checks/trivial-output-check.js.map +1 -1
- package/dist/verification/findings.d.ts +61 -0
- package/dist/verification/findings.d.ts.map +1 -0
- package/dist/verification/findings.js +39 -0
- package/dist/verification/findings.js.map +1 -0
- package/dist/verification/index.d.ts +2 -1
- package/dist/verification/index.d.ts.map +1 -1
- package/dist/verification/index.js +1 -0
- package/dist/verification/index.js.map +1 -1
- package/dist/verification/types.d.ts +10 -1
- package/dist/verification/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -14,8 +14,8 @@ export { CliFlagsSchema } from './cli-flags.js';
|
|
|
14
14
|
export type { CliFlags } from './cli-flags.js';
|
|
15
15
|
export { PerStoryStatusSchema, PerStoryStateSchema } from './per-story-state.js';
|
|
16
16
|
export type { PerStoryStatus, PerStoryState } from './per-story-state.js';
|
|
17
|
-
export { StoredVerificationCheckResultSchema, StoredVerificationSummarySchema } from './verification-result.js';
|
|
18
|
-
export type { StoredVerificationCheckResult, StoredVerificationSummary } from './verification-result.js';
|
|
17
|
+
export { StoredVerificationFindingSchema, StoredVerificationCheckResultSchema, StoredVerificationSummarySchema, } from './verification-result.js';
|
|
18
|
+
export type { StoredVerificationFinding, StoredVerificationCheckResult, StoredVerificationSummary, } from './verification-result.js';
|
|
19
19
|
export { SupervisorLock } from './supervisor-lock.js';
|
|
20
20
|
export type { SupervisorLockOptions } from './supervisor-lock.js';
|
|
21
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/run-model/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,QAAQ,GACT,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAG9C,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAChF,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/run-model/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,QAAQ,GACT,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAG9C,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAChF,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIzE,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACV,yBAAyB,EACzB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/run-model/index.js
CHANGED
|
@@ -13,7 +13,8 @@ export { CliFlagsSchema } from './cli-flags.js';
|
|
|
13
13
|
// Story 52-4: Per-story lifecycle state schema and types
|
|
14
14
|
export { PerStoryStatusSchema, PerStoryStateSchema } from './per-story-state.js';
|
|
15
15
|
// Story 52-7: Stored verification result schemas and types
|
|
16
|
-
|
|
16
|
+
// Story 55-3: StoredVerificationFinding schema (part of findings persistence)
|
|
17
|
+
export { StoredVerificationFindingSchema, StoredVerificationCheckResultSchema, StoredVerificationSummarySchema, } from './verification-result.js';
|
|
17
18
|
// Story 52-2: Supervisor locking and ownership
|
|
18
19
|
export { SupervisorLock } from './supervisor-lock.js';
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/run-model/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAErB,wFAAwF;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAG7D,0CAA0C;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAG/C,yDAAyD;AACzD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAGhF,2DAA2D;AAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/run-model/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAErB,wFAAwF;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAG7D,0CAA0C;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAG/C,yDAAyD;AACzD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAGhF,2DAA2D;AAC3D,8EAA8E;AAC9E,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,0BAA0B,CAAA;AAOjC,+CAA+C;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -39,17 +39,31 @@ export declare const PerStoryStateSchema: z.ZodObject<{
|
|
|
39
39
|
checks: z.ZodArray<z.ZodObject<{
|
|
40
40
|
checkName: z.ZodString;
|
|
41
41
|
status: z.ZodEnum<{
|
|
42
|
+
warn: "warn";
|
|
42
43
|
pass: "pass";
|
|
43
44
|
fail: "fail";
|
|
44
|
-
warn: "warn";
|
|
45
45
|
}>;
|
|
46
46
|
details: z.ZodString;
|
|
47
47
|
duration_ms: z.ZodNumber;
|
|
48
|
+
findings: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
49
|
+
category: z.ZodString;
|
|
50
|
+
severity: z.ZodEnum<{
|
|
51
|
+
error: "error";
|
|
52
|
+
warn: "warn";
|
|
53
|
+
info: "info";
|
|
54
|
+
}>;
|
|
55
|
+
message: z.ZodString;
|
|
56
|
+
command: z.ZodOptional<z.ZodString>;
|
|
57
|
+
exitCode: z.ZodOptional<z.ZodNumber>;
|
|
58
|
+
stdoutTail: z.ZodOptional<z.ZodString>;
|
|
59
|
+
stderrTail: z.ZodOptional<z.ZodString>;
|
|
60
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
61
|
+
}, z.core.$strip>>>;
|
|
48
62
|
}, z.core.$strip>>;
|
|
49
63
|
status: z.ZodEnum<{
|
|
64
|
+
warn: "warn";
|
|
50
65
|
pass: "pass";
|
|
51
66
|
fail: "fail";
|
|
52
|
-
warn: "warn";
|
|
53
67
|
}>;
|
|
54
68
|
duration_ms: z.ZodNumber;
|
|
55
69
|
}, z.core.$strip>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"per-story-state.d.ts","sourceRoot":"","sources":["../../src/run-model/per-story-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAOvB;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,iTAY/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAMjE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB
|
|
1
|
+
{"version":3,"file":"per-story-state.d.ts","sourceRoot":"","sources":["../../src/run-model/per-story-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAOvB;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,iTAY/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAMjE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmB9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
|
|
@@ -59,17 +59,31 @@ export declare const RunManifestSchema: z.ZodObject<{
|
|
|
59
59
|
checks: z.ZodArray<z.ZodObject<{
|
|
60
60
|
checkName: z.ZodString;
|
|
61
61
|
status: z.ZodEnum<{
|
|
62
|
+
warn: "warn";
|
|
62
63
|
pass: "pass";
|
|
63
64
|
fail: "fail";
|
|
64
|
-
warn: "warn";
|
|
65
65
|
}>;
|
|
66
66
|
details: z.ZodString;
|
|
67
67
|
duration_ms: z.ZodNumber;
|
|
68
|
+
findings: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
69
|
+
category: z.ZodString;
|
|
70
|
+
severity: z.ZodEnum<{
|
|
71
|
+
error: "error";
|
|
72
|
+
warn: "warn";
|
|
73
|
+
info: "info";
|
|
74
|
+
}>;
|
|
75
|
+
message: z.ZodString;
|
|
76
|
+
command: z.ZodOptional<z.ZodString>;
|
|
77
|
+
exitCode: z.ZodOptional<z.ZodNumber>;
|
|
78
|
+
stdoutTail: z.ZodOptional<z.ZodString>;
|
|
79
|
+
stderrTail: z.ZodOptional<z.ZodString>;
|
|
80
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
81
|
+
}, z.core.$strip>>>;
|
|
68
82
|
}, z.core.$strip>>;
|
|
69
83
|
status: z.ZodEnum<{
|
|
84
|
+
warn: "warn";
|
|
70
85
|
pass: "pass";
|
|
71
86
|
fail: "fail";
|
|
72
|
-
warn: "warn";
|
|
73
87
|
}>;
|
|
74
88
|
duration_ms: z.ZodNumber;
|
|
75
89
|
}, z.core.$strip>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/run-model/schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAMnF;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;iBAazB,CAAA;AAMF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/run-model/schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAMnF;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;iBAazB,CAAA;AAMF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoB5B,CAAA;AAMF;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,wEAAwE;IACxE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;gBAExB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE;CAKzD"}
|
|
@@ -14,6 +14,28 @@
|
|
|
14
14
|
* - All imports use `.js` extensions per monorepo convention.
|
|
15
15
|
*/
|
|
16
16
|
import { z } from 'zod';
|
|
17
|
+
/**
|
|
18
|
+
* Schema for a single structured verification finding (story 55-1 / 55-3).
|
|
19
|
+
*
|
|
20
|
+
* Mirrors the VerificationFinding interface in
|
|
21
|
+
* packages/sdlc/src/verification/findings.ts without importing from that
|
|
22
|
+
* module to keep run-model free of a dependency on verification.
|
|
23
|
+
*/
|
|
24
|
+
export declare const StoredVerificationFindingSchema: z.ZodObject<{
|
|
25
|
+
category: z.ZodString;
|
|
26
|
+
severity: z.ZodEnum<{
|
|
27
|
+
error: "error";
|
|
28
|
+
warn: "warn";
|
|
29
|
+
info: "info";
|
|
30
|
+
}>;
|
|
31
|
+
message: z.ZodString;
|
|
32
|
+
command: z.ZodOptional<z.ZodString>;
|
|
33
|
+
exitCode: z.ZodOptional<z.ZodNumber>;
|
|
34
|
+
stdoutTail: z.ZodOptional<z.ZodString>;
|
|
35
|
+
stderrTail: z.ZodOptional<z.ZodString>;
|
|
36
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
export type StoredVerificationFinding = z.infer<typeof StoredVerificationFindingSchema>;
|
|
17
39
|
/**
|
|
18
40
|
* Schema for a single per-check verification result stored in the manifest.
|
|
19
41
|
*
|
|
@@ -23,12 +45,26 @@ import { z } from 'zod';
|
|
|
23
45
|
export declare const StoredVerificationCheckResultSchema: z.ZodObject<{
|
|
24
46
|
checkName: z.ZodString;
|
|
25
47
|
status: z.ZodEnum<{
|
|
48
|
+
warn: "warn";
|
|
26
49
|
pass: "pass";
|
|
27
50
|
fail: "fail";
|
|
28
|
-
warn: "warn";
|
|
29
51
|
}>;
|
|
30
52
|
details: z.ZodString;
|
|
31
53
|
duration_ms: z.ZodNumber;
|
|
54
|
+
findings: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
55
|
+
category: z.ZodString;
|
|
56
|
+
severity: z.ZodEnum<{
|
|
57
|
+
error: "error";
|
|
58
|
+
warn: "warn";
|
|
59
|
+
info: "info";
|
|
60
|
+
}>;
|
|
61
|
+
message: z.ZodString;
|
|
62
|
+
command: z.ZodOptional<z.ZodString>;
|
|
63
|
+
exitCode: z.ZodOptional<z.ZodNumber>;
|
|
64
|
+
stdoutTail: z.ZodOptional<z.ZodString>;
|
|
65
|
+
stderrTail: z.ZodOptional<z.ZodString>;
|
|
66
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
67
|
+
}, z.core.$strip>>>;
|
|
32
68
|
}, z.core.$strip>;
|
|
33
69
|
export type StoredVerificationCheckResult = z.infer<typeof StoredVerificationCheckResultSchema>;
|
|
34
70
|
/**
|
|
@@ -42,17 +78,31 @@ export declare const StoredVerificationSummarySchema: z.ZodObject<{
|
|
|
42
78
|
checks: z.ZodArray<z.ZodObject<{
|
|
43
79
|
checkName: z.ZodString;
|
|
44
80
|
status: z.ZodEnum<{
|
|
81
|
+
warn: "warn";
|
|
45
82
|
pass: "pass";
|
|
46
83
|
fail: "fail";
|
|
47
|
-
warn: "warn";
|
|
48
84
|
}>;
|
|
49
85
|
details: z.ZodString;
|
|
50
86
|
duration_ms: z.ZodNumber;
|
|
87
|
+
findings: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
88
|
+
category: z.ZodString;
|
|
89
|
+
severity: z.ZodEnum<{
|
|
90
|
+
error: "error";
|
|
91
|
+
warn: "warn";
|
|
92
|
+
info: "info";
|
|
93
|
+
}>;
|
|
94
|
+
message: z.ZodString;
|
|
95
|
+
command: z.ZodOptional<z.ZodString>;
|
|
96
|
+
exitCode: z.ZodOptional<z.ZodNumber>;
|
|
97
|
+
stdoutTail: z.ZodOptional<z.ZodString>;
|
|
98
|
+
stderrTail: z.ZodOptional<z.ZodString>;
|
|
99
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
100
|
+
}, z.core.$strip>>>;
|
|
51
101
|
}, z.core.$strip>>;
|
|
52
102
|
status: z.ZodEnum<{
|
|
103
|
+
warn: "warn";
|
|
53
104
|
pass: "pass";
|
|
54
105
|
fail: "fail";
|
|
55
|
-
warn: "warn";
|
|
56
106
|
}>;
|
|
57
107
|
duration_ms: z.ZodNumber;
|
|
58
108
|
}, z.core.$strip>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-result.d.ts","sourceRoot":"","sources":["../../src/run-model/verification-result.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC
|
|
1
|
+
{"version":3,"file":"verification-result.d.ts","sourceRoot":"","sources":["../../src/run-model/verification-result.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;iBAS1C,CAAA;AAEF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAA;AAMvF;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;iBAiB9C,CAAA;AAEF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mCAAmC,CAAC,CAAA;AAM/F;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAS1C,CAAA;AAEF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAA"}
|
|
@@ -15,6 +15,26 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { z } from 'zod';
|
|
17
17
|
// ---------------------------------------------------------------------------
|
|
18
|
+
// StoredVerificationFindingSchema — story 55-3
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Schema for a single structured verification finding (story 55-1 / 55-3).
|
|
22
|
+
*
|
|
23
|
+
* Mirrors the VerificationFinding interface in
|
|
24
|
+
* packages/sdlc/src/verification/findings.ts without importing from that
|
|
25
|
+
* module to keep run-model free of a dependency on verification.
|
|
26
|
+
*/
|
|
27
|
+
export const StoredVerificationFindingSchema = z.object({
|
|
28
|
+
category: z.string(),
|
|
29
|
+
severity: z.enum(['error', 'warn', 'info']),
|
|
30
|
+
message: z.string(),
|
|
31
|
+
command: z.string().optional(),
|
|
32
|
+
exitCode: z.number().int().optional(),
|
|
33
|
+
stdoutTail: z.string().optional(),
|
|
34
|
+
stderrTail: z.string().optional(),
|
|
35
|
+
durationMs: z.number().nonnegative().optional(),
|
|
36
|
+
});
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
18
38
|
// StoredVerificationCheckResultSchema
|
|
19
39
|
// ---------------------------------------------------------------------------
|
|
20
40
|
/**
|
|
@@ -32,6 +52,14 @@ export const StoredVerificationCheckResultSchema = z.object({
|
|
|
32
52
|
details: z.string(),
|
|
33
53
|
/** Duration of this check in milliseconds. */
|
|
34
54
|
duration_ms: z.number().nonnegative(),
|
|
55
|
+
/**
|
|
56
|
+
* Structured per-issue findings (story 55-1 / 55-3).
|
|
57
|
+
*
|
|
58
|
+
* Optional for backward compatibility with manifests produced before
|
|
59
|
+
* Epic 55 Phase 1 landed — a manifest without this field reads cleanly
|
|
60
|
+
* and callers that read the field see `undefined`.
|
|
61
|
+
*/
|
|
62
|
+
findings: z.array(StoredVerificationFindingSchema).optional(),
|
|
35
63
|
});
|
|
36
64
|
// ---------------------------------------------------------------------------
|
|
37
65
|
// StoredVerificationSummarySchema
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-result.js","sourceRoot":"","sources":["../../src/run-model/verification-result.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1D,iFAAiF;IACjF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,4BAA4B;IAC5B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,sDAAsD;IACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,8CAA8C;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;
|
|
1
|
+
{"version":3,"file":"verification-result.js","sourceRoot":"","sources":["../../src/run-model/verification-result.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CAChD,CAAC,CAAA;AAIF,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1D,iFAAiF;IACjF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,4BAA4B;IAC5B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,sDAAsD;IACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,8CAA8C;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;IACrC;;;;;;OAMG;IACH,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,QAAQ,EAAE;CAC9D,CAAC,CAAA;AAIF,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,iDAAiD;IACjD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,yDAAyD;IACzD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,mCAAmC,CAAC;IACpD,uDAAuD;IACvD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,uEAAuE;IACvE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;CACtC,CAAC,CAAA"}
|
|
@@ -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,
|
|
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;AA6CpB;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB3E;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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* criteria against structured dev-story output. The check is intentionally
|
|
6
6
|
* deterministic: no LLM calls, no shell commands, no repository inspection.
|
|
7
7
|
*/
|
|
8
|
+
import { renderFindings } from '../findings.js';
|
|
8
9
|
const EXPLICIT_AC_REF = /\bAC\s*:?\s*#?\s*(\d+)\b/gi;
|
|
9
10
|
const NUMBERED_CRITERION = /^\s*(?:[-*]\s*)?(?:\[[ xX]\]\s*)?(\d+)[.)]\s+\S/;
|
|
10
11
|
function normalizeAcId(value) {
|
|
@@ -94,65 +95,121 @@ export class AcceptanceCriteriaEvidenceCheck {
|
|
|
94
95
|
const start = Date.now();
|
|
95
96
|
const storyContent = context.storyContent?.trim();
|
|
96
97
|
if (!storyContent) {
|
|
98
|
+
const findings = [
|
|
99
|
+
{
|
|
100
|
+
category: 'ac-context-missing',
|
|
101
|
+
severity: 'warn',
|
|
102
|
+
message: 'story content unavailable - skipping AC evidence check',
|
|
103
|
+
},
|
|
104
|
+
];
|
|
97
105
|
return {
|
|
98
106
|
status: 'warn',
|
|
99
|
-
details:
|
|
107
|
+
details: renderFindings(findings),
|
|
100
108
|
duration_ms: Date.now() - start,
|
|
109
|
+
findings,
|
|
101
110
|
};
|
|
102
111
|
}
|
|
103
112
|
const expectedIds = extractAcceptanceCriteriaIds(storyContent);
|
|
104
113
|
if (expectedIds.length === 0) {
|
|
114
|
+
const findings = [
|
|
115
|
+
{
|
|
116
|
+
category: 'ac-context-missing',
|
|
117
|
+
severity: 'warn',
|
|
118
|
+
message: 'no numbered acceptance criteria found in story',
|
|
119
|
+
},
|
|
120
|
+
];
|
|
105
121
|
return {
|
|
106
122
|
status: 'warn',
|
|
107
|
-
details:
|
|
123
|
+
details: renderFindings(findings),
|
|
108
124
|
duration_ms: Date.now() - start,
|
|
125
|
+
findings,
|
|
109
126
|
};
|
|
110
127
|
}
|
|
111
128
|
const devResult = context.devStoryResult;
|
|
112
129
|
if (devResult === undefined) {
|
|
130
|
+
const findings = [
|
|
131
|
+
{
|
|
132
|
+
category: 'ac-context-missing',
|
|
133
|
+
severity: 'warn',
|
|
134
|
+
message: `dev-story result unavailable for ${formatIds(expectedIds)}`,
|
|
135
|
+
},
|
|
136
|
+
];
|
|
113
137
|
return {
|
|
114
138
|
status: 'warn',
|
|
115
|
-
details:
|
|
139
|
+
details: renderFindings(findings),
|
|
116
140
|
duration_ms: Date.now() - start,
|
|
141
|
+
findings,
|
|
117
142
|
};
|
|
118
143
|
}
|
|
119
144
|
const acFailures = devResult.ac_failures ?? [];
|
|
120
145
|
if (acFailures.length > 0) {
|
|
146
|
+
// Story 55-2 AC3: one finding per claimed failure, each naming the AC
|
|
147
|
+
const findings = acFailures.map((failure) => ({
|
|
148
|
+
category: 'ac-explicit-failure',
|
|
149
|
+
severity: 'error',
|
|
150
|
+
message: `dev-story reported AC failure: ${failure}`,
|
|
151
|
+
}));
|
|
121
152
|
return {
|
|
122
153
|
status: 'fail',
|
|
123
|
-
details:
|
|
154
|
+
details: renderFindings(findings),
|
|
124
155
|
duration_ms: Date.now() - start,
|
|
156
|
+
findings,
|
|
125
157
|
};
|
|
126
158
|
}
|
|
127
159
|
const testOutcome = normalizeTestOutcome(devResult.tests);
|
|
128
160
|
if (testOutcome === 'fail') {
|
|
161
|
+
const findings = [
|
|
162
|
+
{
|
|
163
|
+
category: 'ac-test-failure',
|
|
164
|
+
severity: 'error',
|
|
165
|
+
message: 'dev-story reported failing tests',
|
|
166
|
+
},
|
|
167
|
+
];
|
|
129
168
|
return {
|
|
130
169
|
status: 'fail',
|
|
131
|
-
details:
|
|
170
|
+
details: renderFindings(findings),
|
|
132
171
|
duration_ms: Date.now() - start,
|
|
172
|
+
findings,
|
|
133
173
|
};
|
|
134
174
|
}
|
|
135
175
|
const claimedIds = new Set(extractClaimedAcceptanceCriteriaIds(devResult.ac_met));
|
|
136
176
|
const missingIds = expectedIds.filter((id) => !claimedIds.has(id));
|
|
137
177
|
if (missingIds.length > 0) {
|
|
178
|
+
// Story 55-2 AC3: one finding per missing AC id so consumers can address them individually
|
|
179
|
+
const claimedSummary = formatIds(sortAcIds(claimedIds)) || 'none';
|
|
180
|
+
const findings = missingIds.map((id) => ({
|
|
181
|
+
category: 'ac-missing-evidence',
|
|
182
|
+
severity: 'error',
|
|
183
|
+
message: `missing dev-story AC evidence for ${id}` +
|
|
184
|
+
` (expected ${formatIds(expectedIds)}, claimed ${claimedSummary})`,
|
|
185
|
+
}));
|
|
138
186
|
return {
|
|
139
187
|
status: 'fail',
|
|
140
|
-
details:
|
|
141
|
-
`; expected ${formatIds(expectedIds)}, claimed ${formatIds(sortAcIds(claimedIds)) || 'none'}`,
|
|
188
|
+
details: renderFindings(findings),
|
|
142
189
|
duration_ms: Date.now() - start,
|
|
190
|
+
findings,
|
|
143
191
|
};
|
|
144
192
|
}
|
|
145
193
|
if (testOutcome === undefined) {
|
|
194
|
+
const findings = [
|
|
195
|
+
{
|
|
196
|
+
category: 'ac-test-outcome-missing',
|
|
197
|
+
severity: 'warn',
|
|
198
|
+
message: `AC evidence covers ${formatIds(expectedIds)} but test outcome is unavailable`,
|
|
199
|
+
},
|
|
200
|
+
];
|
|
146
201
|
return {
|
|
147
202
|
status: 'warn',
|
|
148
|
-
details:
|
|
203
|
+
details: renderFindings(findings),
|
|
149
204
|
duration_ms: Date.now() - start,
|
|
205
|
+
findings,
|
|
150
206
|
};
|
|
151
207
|
}
|
|
152
208
|
return {
|
|
153
209
|
status: 'pass',
|
|
154
210
|
details: `acceptance-criteria-evidence: AC evidence covers ${formatIds(expectedIds)}; tests=${testOutcome}`,
|
|
155
211
|
duration_ms: Date.now() - start,
|
|
212
|
+
findings: [],
|
|
156
213
|
};
|
|
157
214
|
}
|
|
158
215
|
}
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/build-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"build-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/build-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAUpB,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,QAAS,CAAA;AAiB5C;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA8B7D;AAMD;;;;;;;;;GASG;AACH,qBAAa,UAAW,YAAW,iBAAiB;IAClD,QAAQ,CAAC,IAAI,WAAU;IACvB,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAEtB,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA4HrE"}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
* 6. Non-Node markers → '' (skip)
|
|
21
21
|
* 7. Nothing found → '' (skip)
|
|
22
22
|
*/
|
|
23
|
+
import { renderFindings } from '../findings.js';
|
|
23
24
|
import { spawn } from 'node:child_process';
|
|
24
25
|
import { existsSync } from 'node:fs';
|
|
25
26
|
import { join } from 'node:path';
|
|
@@ -30,6 +31,12 @@ import { join } from 'node:path';
|
|
|
30
31
|
export const BUILD_CHECK_TIMEOUT_MS = 60_000;
|
|
31
32
|
/** Maximum characters to include in details string from build output. */
|
|
32
33
|
const MAX_OUTPUT_CHARS = 2000;
|
|
34
|
+
/** Per-stream tail size cap for structured findings (story 55-1 convention). */
|
|
35
|
+
const TAIL_BYTES = 4 * 1024;
|
|
36
|
+
/** Return the last N bytes of a UTF-8 string, sliced by string length for simplicity. */
|
|
37
|
+
function tail(text, bytes = TAIL_BYTES) {
|
|
38
|
+
return text.length <= bytes ? text : text.slice(text.length - bytes);
|
|
39
|
+
}
|
|
33
40
|
// ---------------------------------------------------------------------------
|
|
34
41
|
// Build command detection
|
|
35
42
|
// ---------------------------------------------------------------------------
|
|
@@ -98,10 +105,18 @@ export class BuildCheck {
|
|
|
98
105
|
: detectBuildCommand(context.workingDir);
|
|
99
106
|
// Empty command → skip (warn)
|
|
100
107
|
if (cmd === '') {
|
|
108
|
+
const findings = [
|
|
109
|
+
{
|
|
110
|
+
category: 'build-skip',
|
|
111
|
+
severity: 'warn',
|
|
112
|
+
message: `no build command detected for project at ${context.workingDir}`,
|
|
113
|
+
},
|
|
114
|
+
];
|
|
101
115
|
return {
|
|
102
116
|
status: 'warn',
|
|
103
|
-
details:
|
|
117
|
+
details: renderFindings(findings),
|
|
104
118
|
duration_ms: Date.now() - start,
|
|
119
|
+
findings,
|
|
105
120
|
};
|
|
106
121
|
}
|
|
107
122
|
// Spawn the build process as a detached process group so we can kill the
|
|
@@ -113,12 +128,21 @@ export class BuildCheck {
|
|
|
113
128
|
shell: true,
|
|
114
129
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
115
130
|
});
|
|
131
|
+
// Stream-separated capture so the structured finding can carry each stream
|
|
132
|
+
// independently. `output` is kept as the combined stream for backward-compat
|
|
133
|
+
// details rendering in the legacy format.
|
|
134
|
+
let stdout = '';
|
|
135
|
+
let stderr = '';
|
|
116
136
|
let output = '';
|
|
117
137
|
child.stdout?.on('data', (chunk) => {
|
|
118
|
-
|
|
138
|
+
const s = chunk.toString();
|
|
139
|
+
stdout += s;
|
|
140
|
+
output += s;
|
|
119
141
|
});
|
|
120
142
|
child.stderr?.on('data', (chunk) => {
|
|
121
|
-
|
|
143
|
+
const s = chunk.toString();
|
|
144
|
+
stderr += s;
|
|
145
|
+
output += s;
|
|
122
146
|
});
|
|
123
147
|
// Hard timeout: kill the process group and return fail
|
|
124
148
|
const timeoutHandle = setTimeout(() => {
|
|
@@ -128,29 +152,61 @@ export class BuildCheck {
|
|
|
128
152
|
catch {
|
|
129
153
|
// Process already exited between timeout fire and kill call
|
|
130
154
|
}
|
|
155
|
+
const duration = Date.now() - start;
|
|
156
|
+
const findings = [
|
|
157
|
+
{
|
|
158
|
+
category: 'build-timeout',
|
|
159
|
+
severity: 'error',
|
|
160
|
+
message: `command exceeded ${BUILD_CHECK_TIMEOUT_MS}ms`,
|
|
161
|
+
command: cmd,
|
|
162
|
+
// exitCode omitted — process was killed before reporting one
|
|
163
|
+
stdoutTail: tail(stdout),
|
|
164
|
+
stderrTail: tail(stderr),
|
|
165
|
+
durationMs: duration,
|
|
166
|
+
},
|
|
167
|
+
];
|
|
131
168
|
resolve({
|
|
132
169
|
status: 'fail',
|
|
133
|
-
details:
|
|
134
|
-
duration_ms:
|
|
170
|
+
details: renderFindings(findings),
|
|
171
|
+
duration_ms: duration,
|
|
172
|
+
findings,
|
|
135
173
|
});
|
|
136
174
|
}, BUILD_CHECK_TIMEOUT_MS);
|
|
137
175
|
child.on('close', (code) => {
|
|
138
176
|
clearTimeout(timeoutHandle);
|
|
177
|
+
const duration = Date.now() - start;
|
|
139
178
|
if (code === 0) {
|
|
140
179
|
resolve({
|
|
141
180
|
status: 'pass',
|
|
142
181
|
details: 'build passed',
|
|
143
|
-
duration_ms:
|
|
182
|
+
duration_ms: duration,
|
|
183
|
+
findings: [],
|
|
144
184
|
});
|
|
145
185
|
}
|
|
146
186
|
else {
|
|
147
187
|
const truncated = output.length > MAX_OUTPUT_CHARS
|
|
148
188
|
? output.slice(0, MAX_OUTPUT_CHARS) + '... (truncated)'
|
|
149
189
|
: output;
|
|
190
|
+
const findings = [
|
|
191
|
+
{
|
|
192
|
+
category: 'build-error',
|
|
193
|
+
severity: 'error',
|
|
194
|
+
// Message carries the same human-readable summary the legacy
|
|
195
|
+
// details string used to emit, so renderFindings(findings) ==
|
|
196
|
+
// the old details verbatim (minus the leading category prefix).
|
|
197
|
+
message: `build failed (exit ${code}): ${truncated}`,
|
|
198
|
+
command: cmd,
|
|
199
|
+
...(code !== null ? { exitCode: code } : {}),
|
|
200
|
+
stdoutTail: tail(stdout),
|
|
201
|
+
stderrTail: tail(stderr),
|
|
202
|
+
durationMs: duration,
|
|
203
|
+
},
|
|
204
|
+
];
|
|
150
205
|
resolve({
|
|
151
206
|
status: 'fail',
|
|
152
|
-
details:
|
|
153
|
-
duration_ms:
|
|
207
|
+
details: renderFindings(findings),
|
|
208
|
+
duration_ms: duration,
|
|
209
|
+
findings,
|
|
154
210
|
});
|
|
155
211
|
}
|
|
156
212
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-check.js","sourceRoot":"","sources":["../../../src/verification/checks/build-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;
|
|
1
|
+
{"version":3,"file":"build-check.js","sourceRoot":"","sources":["../../../src/verification/checks/build-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phantom-review-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/phantom-review-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"phantom-review-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/phantom-review-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAOpB;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,YAAW,iBAAiB;IAC1D,QAAQ,CAAC,IAAI,oBAAmB;IAChC,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAEtB,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA+DrE"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* - No shell invocations — pure static signal inspection over VerificationContext fields.
|
|
11
11
|
* - Runs first in Tier A (before TrivialOutputCheck, before BuildCheck).
|
|
12
12
|
*/
|
|
13
|
+
import { renderFindings } from '../findings.js';
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
14
15
|
// PhantomReviewCheck
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
@@ -35,6 +36,7 @@ export class PhantomReviewCheck {
|
|
|
35
36
|
status: 'pass',
|
|
36
37
|
details: 'phantom-review: no review result in context — skipping check',
|
|
37
38
|
duration_ms: Date.now() - start,
|
|
39
|
+
findings: [],
|
|
38
40
|
};
|
|
39
41
|
}
|
|
40
42
|
// AC1 + AC3: dispatch itself failed (non-zero exit, timeout, crash, or schema validation failure)
|
|
@@ -42,10 +44,18 @@ export class PhantomReviewCheck {
|
|
|
42
44
|
const reason = review.error === 'schema_validation_failed'
|
|
43
45
|
? 'schema validation failed'
|
|
44
46
|
: `dispatch failed${review.error ? ` — ${review.error}` : ''}`;
|
|
47
|
+
const findings = [
|
|
48
|
+
{
|
|
49
|
+
category: 'phantom-review',
|
|
50
|
+
severity: 'error',
|
|
51
|
+
message: reason,
|
|
52
|
+
},
|
|
53
|
+
];
|
|
45
54
|
return {
|
|
46
55
|
status: 'fail',
|
|
47
|
-
details:
|
|
56
|
+
details: renderFindings(findings),
|
|
48
57
|
duration_ms: Date.now() - start,
|
|
58
|
+
findings,
|
|
49
59
|
};
|
|
50
60
|
}
|
|
51
61
|
// AC2: agent produced no output — only flag when rawOutput is explicitly empty
|
|
@@ -53,10 +63,18 @@ export class PhantomReviewCheck {
|
|
|
53
63
|
// dispatch result may not have captured it (e.g., parsed YAML result without
|
|
54
64
|
// raw output preservation) — treat as pass since dispatchFailed was not set.
|
|
55
65
|
if (review.rawOutput !== undefined && review.rawOutput.trim().length === 0) {
|
|
66
|
+
const findings = [
|
|
67
|
+
{
|
|
68
|
+
category: 'phantom-review',
|
|
69
|
+
severity: 'error',
|
|
70
|
+
message: 'empty review output',
|
|
71
|
+
},
|
|
72
|
+
];
|
|
56
73
|
return {
|
|
57
74
|
status: 'fail',
|
|
58
|
-
details:
|
|
75
|
+
details: renderFindings(findings),
|
|
59
76
|
duration_ms: Date.now() - start,
|
|
77
|
+
findings,
|
|
60
78
|
};
|
|
61
79
|
}
|
|
62
80
|
// AC5: valid review — non-empty output, no dispatch failure
|
|
@@ -64,6 +82,7 @@ export class PhantomReviewCheck {
|
|
|
64
82
|
status: 'pass',
|
|
65
83
|
details: 'phantom-review: review output is valid',
|
|
66
84
|
duration_ms: Date.now() - start,
|
|
85
|
+
findings: [],
|
|
67
86
|
};
|
|
68
87
|
}
|
|
69
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phantom-review-check.js","sourceRoot":"","sources":["../../../src/verification/checks/phantom-review-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,gBAAgB,CAAA;IACvB,IAAI,GAAG,GAAY,CAAA;IAE5B,KAAK,CAAC,GAAG,CAAC,OAA4B;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAA;QAEnC,+EAA+E;QAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,8DAA8D;gBACvE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;
|
|
1
|
+
{"version":3,"file":"phantom-review-check.js","sourceRoot":"","sources":["../../../src/verification/checks/phantom-review-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,gBAAgB,CAAA;IACvB,IAAI,GAAG,GAAY,CAAA;IAE5B,KAAK,CAAC,GAAG,CAAC,OAA4B;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAA;QAEnC,+EAA+E;QAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,8DAA8D;gBACvE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC/B,QAAQ,EAAE,EAAE;aACb,CAAA;QACH,CAAC;QAED,kGAAkG;QAClG,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,MAAM,GACV,MAAM,CAAC,KAAK,KAAK,0BAA0B;gBACzC,CAAC,CAAC,0BAA0B;gBAC5B,CAAC,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;YAClE,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,MAAM;iBAChB;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,+EAA+E;QAC/E,+EAA+E;QAC/E,6EAA6E;QAC7E,6EAA6E;QAC7E,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3E,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,qBAAqB;iBAC/B;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,4DAA4D;QAC5D,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,wCAAwC;YACjD,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,
|
|
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;CAiDrE"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* - No shell invocations — pure in-process computation.
|
|
12
12
|
* - Runs in Tier A: before BuildCheck, after PhantomReviewCheck.
|
|
13
13
|
*/
|
|
14
|
+
import { renderFindings } from '../findings.js';
|
|
14
15
|
// ---------------------------------------------------------------------------
|
|
15
16
|
// Default threshold
|
|
16
17
|
// ---------------------------------------------------------------------------
|
|
@@ -45,20 +46,36 @@ export class TrivialOutputCheck {
|
|
|
45
46
|
const start = Date.now();
|
|
46
47
|
// AC5: missing token data → warn, not fail
|
|
47
48
|
if (context.outputTokenCount === undefined) {
|
|
49
|
+
const findings = [
|
|
50
|
+
{
|
|
51
|
+
category: 'trivial-output',
|
|
52
|
+
severity: 'warn',
|
|
53
|
+
message: 'output token count unavailable — skipping check',
|
|
54
|
+
},
|
|
55
|
+
];
|
|
48
56
|
return {
|
|
49
57
|
status: 'warn',
|
|
50
|
-
details:
|
|
58
|
+
details: renderFindings(findings),
|
|
51
59
|
duration_ms: Date.now() - start,
|
|
60
|
+
findings,
|
|
52
61
|
};
|
|
53
62
|
}
|
|
54
63
|
const count = context.outputTokenCount;
|
|
55
64
|
// AC1 + AC2: below threshold → fail with actionable message
|
|
56
65
|
if (count < this.threshold) {
|
|
66
|
+
const findings = [
|
|
67
|
+
{
|
|
68
|
+
category: 'trivial-output',
|
|
69
|
+
severity: 'error',
|
|
70
|
+
message: `output token count ${count} is below threshold ${this.threshold}` +
|
|
71
|
+
` — Re-run with increased maxTurns`,
|
|
72
|
+
},
|
|
73
|
+
];
|
|
57
74
|
return {
|
|
58
75
|
status: 'fail',
|
|
59
|
-
details:
|
|
60
|
-
` — Re-run with increased maxTurns`,
|
|
76
|
+
details: renderFindings(findings),
|
|
61
77
|
duration_ms: Date.now() - start,
|
|
78
|
+
findings,
|
|
62
79
|
};
|
|
63
80
|
}
|
|
64
81
|
// AC3: at or above threshold → pass
|
|
@@ -66,6 +83,7 @@ export class TrivialOutputCheck {
|
|
|
66
83
|
status: 'pass',
|
|
67
84
|
details: `output token count ${count} meets threshold ${this.threshold}`,
|
|
68
85
|
duration_ms: Date.now() - start,
|
|
86
|
+
findings: [],
|
|
69
87
|
};
|
|
70
88
|
}
|
|
71
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trivial-output-check.js","sourceRoot":"","sources":["../../../src/verification/checks/trivial-output-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,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,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,
|
|
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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VerificationFinding — structured per-issue payload emitted by verification checks.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the ad-hoc "stuff everything into VerificationResult.details" pattern
|
|
5
|
+
* that preceded it: every downstream consumer (retry prompts, run manifest,
|
|
6
|
+
* post-run analysis) used to string-parse a free-form blob that the emitting
|
|
7
|
+
* check never promised a schema for. With findings, each issue is an
|
|
8
|
+
* addressable record the pipeline can act on individually.
|
|
9
|
+
*
|
|
10
|
+
* The {command, exitCode, stdoutTail, stderrTail} optional fields are reserved
|
|
11
|
+
* primarily for Phase 2 runtime probes — they cost nothing on the current four
|
|
12
|
+
* Tier A checks (which leave them undefined) but let probe output flow through
|
|
13
|
+
* the same shape without a second refactor.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Severity of a single verification finding.
|
|
17
|
+
*
|
|
18
|
+
* - `error` → verification check returns `fail` (the aggregate status of the
|
|
19
|
+
* containing VerificationResult is `fail`).
|
|
20
|
+
* - `warn` → verification check returns `warn`.
|
|
21
|
+
* - `info` → a finding captured for diagnostic/telemetry purposes that does
|
|
22
|
+
* not itself raise the containing VerificationResult's status.
|
|
23
|
+
*/
|
|
24
|
+
export type VerificationFindingSeverity = 'error' | 'warn' | 'info';
|
|
25
|
+
/**
|
|
26
|
+
* One structured issue emitted by a verification check.
|
|
27
|
+
*
|
|
28
|
+
* `category` is the stable machine-readable identifier consumers filter/group
|
|
29
|
+
* on (e.g. `'build-error'`, `'ac-missing-evidence'`, `'phantom-review'`,
|
|
30
|
+
* `'trivial-output'`). New categories should be introduced alongside the
|
|
31
|
+
* check that emits them.
|
|
32
|
+
*/
|
|
33
|
+
export interface VerificationFinding {
|
|
34
|
+
/** Stable machine-readable category (e.g. `'build-error'`). */
|
|
35
|
+
category: string;
|
|
36
|
+
/** Severity classification for aggregate-status computation. */
|
|
37
|
+
severity: VerificationFindingSeverity;
|
|
38
|
+
/** Single-line human-readable summary. */
|
|
39
|
+
message: string;
|
|
40
|
+
/** The command that produced this finding, if any. Reserved primarily for Phase 2 runtime probes. */
|
|
41
|
+
command?: string;
|
|
42
|
+
/** Exit status of `command`, if applicable. */
|
|
43
|
+
exitCode?: number;
|
|
44
|
+
/** Last ≤ 4 KiB of stdout from `command`, if captured. */
|
|
45
|
+
stdoutTail?: string;
|
|
46
|
+
/** Last ≤ 4 KiB of stderr from `command`, if captured. */
|
|
47
|
+
stderrTail?: string;
|
|
48
|
+
/** Wall-clock milliseconds the producing action took. */
|
|
49
|
+
durationMs?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Render a list of findings into the multi-line human-readable string that
|
|
53
|
+
* populates VerificationResult.details. One line per finding:
|
|
54
|
+
*
|
|
55
|
+
* `${PREFIX} [${category}] ${message}`
|
|
56
|
+
*
|
|
57
|
+
* Checks that migrate to the findings-first pattern call this helper to derive
|
|
58
|
+
* `details` from the findings they emit, guaranteeing the two stay in sync.
|
|
59
|
+
*/
|
|
60
|
+
export declare function renderFindings(findings: VerificationFinding[]): string;
|
|
61
|
+
//# sourceMappingURL=findings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../src/verification/findings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH;;;;;;;;GAQG;AACH,MAAM,MAAM,2BAA2B,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAEnE;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAA;IAChB,gEAAgE;IAChE,QAAQ,EAAE,2BAA2B,CAAA;IACrC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,qGAAqG;IACrG,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAYD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAKtE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VerificationFinding — structured per-issue payload emitted by verification checks.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the ad-hoc "stuff everything into VerificationResult.details" pattern
|
|
5
|
+
* that preceded it: every downstream consumer (retry prompts, run manifest,
|
|
6
|
+
* post-run analysis) used to string-parse a free-form blob that the emitting
|
|
7
|
+
* check never promised a schema for. With findings, each issue is an
|
|
8
|
+
* addressable record the pipeline can act on individually.
|
|
9
|
+
*
|
|
10
|
+
* The {command, exitCode, stdoutTail, stderrTail} optional fields are reserved
|
|
11
|
+
* primarily for Phase 2 runtime probes — they cost nothing on the current four
|
|
12
|
+
* Tier A checks (which leave them undefined) but let probe output flow through
|
|
13
|
+
* the same shape without a second refactor.
|
|
14
|
+
*/
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Rendering
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
const SEVERITY_PREFIX = {
|
|
19
|
+
error: 'ERROR',
|
|
20
|
+
warn: 'WARN',
|
|
21
|
+
info: 'INFO',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Render a list of findings into the multi-line human-readable string that
|
|
25
|
+
* populates VerificationResult.details. One line per finding:
|
|
26
|
+
*
|
|
27
|
+
* `${PREFIX} [${category}] ${message}`
|
|
28
|
+
*
|
|
29
|
+
* Checks that migrate to the findings-first pattern call this helper to derive
|
|
30
|
+
* `details` from the findings they emit, guaranteeing the two stay in sync.
|
|
31
|
+
*/
|
|
32
|
+
export function renderFindings(findings) {
|
|
33
|
+
if (findings.length === 0)
|
|
34
|
+
return '';
|
|
35
|
+
return findings
|
|
36
|
+
.map((f) => `${SEVERITY_PREFIX[f.severity]} [${f.category}] ${f.message}`)
|
|
37
|
+
.join('\n');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=findings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findings.js","sourceRoot":"","sources":["../../src/verification/findings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA4CH,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,eAAe,GAAgD;IACnE,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACb,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,QAA+B;IAC5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACpC,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACzE,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC"}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* and concrete check implementations.
|
|
6
6
|
*/
|
|
7
7
|
export { VerificationPipeline, createDefaultVerificationPipeline } from './verification-pipeline.js';
|
|
8
|
-
export type { VerificationCheck, VerificationContext, VerificationResult, VerificationCheckResult, VerificationSummary, ReviewSignals, DevStorySignals, } from './types.js';
|
|
8
|
+
export type { VerificationCheck, VerificationContext, VerificationResult, VerificationCheckResult, VerificationSummary, ReviewSignals, DevStorySignals, VerificationFinding, VerificationFindingSeverity, } from './types.js';
|
|
9
|
+
export { renderFindings } from './findings.js';
|
|
9
10
|
export { PhantomReviewCheck } from './checks/index.js';
|
|
10
11
|
export { TrivialOutputCheck, DEFAULT_TRIVIAL_OUTPUT_THRESHOLD } from './checks/index.js';
|
|
11
12
|
export { AcceptanceCriteriaEvidenceCheck, extractAcceptanceCriteriaIds } 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,
|
|
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;AAE9C,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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* and concrete check implementations.
|
|
6
6
|
*/
|
|
7
7
|
export { VerificationPipeline, createDefaultVerificationPipeline } from './verification-pipeline.js';
|
|
8
|
+
export { renderFindings } from './findings.js';
|
|
8
9
|
// Concrete check implementations (story 51-2+)
|
|
9
10
|
export { PhantomReviewCheck } from './checks/index.js';
|
|
10
11
|
export { TrivialOutputCheck, DEFAULT_TRIVIAL_OUTPUT_THRESHOLD } 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;
|
|
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;AAC9C,+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"}
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* Package placement: packages/sdlc/src/verification/ — SDLC-specific fields
|
|
9
9
|
* (storyKey, commitSha, priorStoryFiles) make these types inappropriate for @substrate-ai/core.
|
|
10
10
|
*/
|
|
11
|
+
import type { VerificationFinding } from './findings.js';
|
|
12
|
+
export type { VerificationFinding, VerificationFindingSeverity } from './findings.js';
|
|
11
13
|
/**
|
|
12
14
|
* Slim projection of code-review dispatch signals needed by PhantomReviewCheck.
|
|
13
15
|
*
|
|
@@ -102,12 +104,19 @@ export interface VerificationContext {
|
|
|
102
104
|
/**
|
|
103
105
|
* Result returned by a single VerificationCheck.run() invocation.
|
|
104
106
|
*
|
|
105
|
-
*
|
|
107
|
+
* `details` is a human-readable rendering, preserved for any consumer that
|
|
108
|
+
* already reads it. `findings` (story 55-1) is the structured per-issue
|
|
109
|
+
* surface — downstream consumers (retry prompts, run manifest, post-run
|
|
110
|
+
* analysis) should prefer it. Checks that emit findings should derive
|
|
111
|
+
* `details` via `renderFindings(findings)` so the two stay in sync.
|
|
106
112
|
*/
|
|
107
113
|
export interface VerificationResult {
|
|
108
114
|
status: 'pass' | 'warn' | 'fail';
|
|
109
115
|
details: string;
|
|
110
116
|
duration_ms: number;
|
|
117
|
+
/** Structured per-issue payload. Optional for backward compatibility with
|
|
118
|
+
* checks and consumers that pre-date story 55-1. */
|
|
119
|
+
findings?: VerificationFinding[];
|
|
111
120
|
}
|
|
112
121
|
/**
|
|
113
122
|
* Per-check result included in a VerificationSummary.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/verification/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/verification/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAGxD,YAAY,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAA;AAMrF;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,6GAA6G;IAC7G,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAA;IACtC,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;CACjC;AAMD;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAA;IAChB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAA;IACjB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,eAAe,CAAA;IAChC;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAMD;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB;wDACoD;IACpD,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAA;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,uBAAuB,EAAE,CAAA;IACjC,gDAAgD;IAChD,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,WAAW,EAAE,MAAM,CAAA;CACpB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAA;IACZ,mFAAmF;IACnF,IAAI,EAAE,GAAG,GAAG,GAAG,CAAA;IACf;;;OAGG;IACH,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;CAC/D"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@substrate-ai/sdlc",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.4",
|
|
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.4",
|
|
28
28
|
"zod": "^4.3.6"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {}
|