@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.
Files changed (35) hide show
  1. package/dist/run-model/index.d.ts +2 -2
  2. package/dist/run-model/index.d.ts.map +1 -1
  3. package/dist/run-model/index.js +2 -1
  4. package/dist/run-model/index.js.map +1 -1
  5. package/dist/run-model/per-story-state.d.ts +16 -2
  6. package/dist/run-model/per-story-state.d.ts.map +1 -1
  7. package/dist/run-model/schemas.d.ts +16 -2
  8. package/dist/run-model/schemas.d.ts.map +1 -1
  9. package/dist/run-model/verification-result.d.ts +53 -3
  10. package/dist/run-model/verification-result.d.ts.map +1 -1
  11. package/dist/run-model/verification-result.js +28 -0
  12. package/dist/run-model/verification-result.js.map +1 -1
  13. package/dist/verification/checks/acceptance-criteria-evidence-check.d.ts.map +1 -1
  14. package/dist/verification/checks/acceptance-criteria-evidence-check.js +65 -8
  15. package/dist/verification/checks/acceptance-criteria-evidence-check.js.map +1 -1
  16. package/dist/verification/checks/build-check.d.ts.map +1 -1
  17. package/dist/verification/checks/build-check.js +64 -8
  18. package/dist/verification/checks/build-check.js.map +1 -1
  19. package/dist/verification/checks/phantom-review-check.d.ts.map +1 -1
  20. package/dist/verification/checks/phantom-review-check.js +21 -2
  21. package/dist/verification/checks/phantom-review-check.js.map +1 -1
  22. package/dist/verification/checks/trivial-output-check.d.ts.map +1 -1
  23. package/dist/verification/checks/trivial-output-check.js +21 -3
  24. package/dist/verification/checks/trivial-output-check.js.map +1 -1
  25. package/dist/verification/findings.d.ts +61 -0
  26. package/dist/verification/findings.d.ts.map +1 -0
  27. package/dist/verification/findings.js +39 -0
  28. package/dist/verification/findings.js.map +1 -0
  29. package/dist/verification/index.d.ts +2 -1
  30. package/dist/verification/index.d.ts.map +1 -1
  31. package/dist/verification/index.js +1 -0
  32. package/dist/verification/index.js.map +1 -1
  33. package/dist/verification/types.d.ts +10 -1
  34. package/dist/verification/types.d.ts.map +1 -1
  35. 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;AAGzE,OAAO,EAAE,mCAAmC,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAA;AAC/G,YAAY,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAGxG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,YAAY,EAAE,qBAAqB,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"}
@@ -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
- export { StoredVerificationCheckResultSchema, StoredVerificationSummarySchema } from './verification-result.js';
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,EAAE,mCAAmC,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAA;AAG/G,+CAA+C;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmB9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
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;;;;;;;;;iBAS9C,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"}
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;CACtC,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
+ {"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,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AA4CpB;;;;;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;CA0ErE"}
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: 'acceptance-criteria-evidence: story content unavailable - skipping AC evidence check',
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: 'acceptance-criteria-evidence: no numbered acceptance criteria found in story',
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: `acceptance-criteria-evidence: dev-story result unavailable for ${formatIds(expectedIds)}`,
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: `acceptance-criteria-evidence: dev-story reported AC failures: ${acFailures.join('; ')}`,
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: 'acceptance-criteria-evidence: dev-story reported failing tests',
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: `acceptance-criteria-evidence: missing dev-story AC evidence for ${formatIds(missingIds)}` +
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: `acceptance-criteria-evidence: AC evidence covers ${formatIds(expectedIds)} but test outcome is unavailable`,
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,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAS7F,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,QAAS,CAAA;AAS5C;;;;;;;;;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;CA2ErE"}
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: `build-skip: no build command detected for project at ${context.workingDir}`,
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
- output += chunk.toString();
138
+ const s = chunk.toString();
139
+ stdout += s;
140
+ output += s;
119
141
  });
120
142
  child.stderr?.on('data', (chunk) => {
121
- output += chunk.toString();
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: `build-timeout: command exceeded ${BUILD_CHECK_TIMEOUT_MS}ms`,
134
- duration_ms: Date.now() - start,
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: Date.now() - start,
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: `build failed (exit ${code}): ${truncated}`,
153
- duration_ms: Date.now() - start,
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":"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"}
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,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAMpB;;;;;;;;;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;CA6CrE"}
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: `phantom-review: ${reason}`,
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: 'phantom-review: empty review output',
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;aAChC,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,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,mBAAmB,MAAM,EAAE;gBACpC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAChC,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,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,qCAAqC;gBAC9C,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAChC,CAAA;QACH,CAAC;QAED,4DAA4D;QAC5D,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,wCAAwC;YACjD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAChC,CAAA;IACH,CAAC;CACF"}
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,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAMpB;;;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;CAgCrE"}
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: 'trivial-output: output token count unavailable — skipping check',
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: `trivial-output: output token count ${count} is below threshold ${this.threshold}` +
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,iEAAiE;gBAC1E,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAChC,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAA;QAEtC,4DAA4D;QAC5D,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EACL,sCAAsC,KAAK,uBAAuB,IAAI,CAAC,SAAS,EAAE;oBAClF,mCAAmC;gBACrC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAChC,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;SAChC,CAAA;IACH,CAAC;CACF"}
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,GAChB,MAAM,YAAY,CAAA;AAEnB,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"}
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;AAUpG,+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"}
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
- * AC2: status is 'pass' | 'warn' | 'fail'.
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;AAMH;;;;;;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;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB;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"}
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.2",
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.2",
27
+ "@substrate-ai/core": "0.20.4",
28
28
  "zod": "^4.3.6"
29
29
  },
30
30
  "devDependencies": {}