@substrate-ai/sdlc 0.20.23 → 0.20.28

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 (29) hide show
  1. package/dist/run-model/dev-story-signals.d.ts +44 -0
  2. package/dist/run-model/dev-story-signals.d.ts.map +1 -0
  3. package/dist/run-model/dev-story-signals.js +67 -0
  4. package/dist/run-model/dev-story-signals.js.map +1 -0
  5. package/dist/run-model/index.d.ts +2 -0
  6. package/dist/run-model/index.d.ts.map +1 -1
  7. package/dist/run-model/index.js +2 -0
  8. package/dist/run-model/index.js.map +1 -1
  9. package/dist/run-model/per-story-state.d.ts +7 -0
  10. package/dist/run-model/per-story-state.d.ts.map +1 -1
  11. package/dist/run-model/per-story-state.js +9 -0
  12. package/dist/run-model/per-story-state.js.map +1 -1
  13. package/dist/run-model/schemas.d.ts +8 -1
  14. package/dist/run-model/schemas.d.ts.map +1 -1
  15. package/dist/verification/checks/runtime-probe-check.d.ts +9 -7
  16. package/dist/verification/checks/runtime-probe-check.d.ts.map +1 -1
  17. package/dist/verification/checks/runtime-probe-check.js +131 -11
  18. package/dist/verification/checks/runtime-probe-check.js.map +1 -1
  19. package/dist/verification/probes/executor.d.ts.map +1 -1
  20. package/dist/verification/probes/executor.js +64 -1
  21. package/dist/verification/probes/executor.js.map +1 -1
  22. package/dist/verification/probes/types.d.ts +22 -0
  23. package/dist/verification/probes/types.d.ts.map +1 -1
  24. package/dist/verification/probes/types.js +26 -0
  25. package/dist/verification/probes/types.js.map +1 -1
  26. package/dist/verification/source-ac-fidelity-check.d.ts.map +1 -1
  27. package/dist/verification/source-ac-fidelity-check.js +297 -17
  28. package/dist/verification/source-ac-fidelity-check.js.map +1 -1
  29. package/package.json +2 -2
@@ -0,0 +1,44 @@
1
+ /**
2
+ * StoredDevStorySignals Zod schema — Story 60-8.
3
+ *
4
+ * Defines the typed schema for persisting the dev-story handler's normalized
5
+ * output (`DevStorySignals` from `packages/sdlc/src/verification/types.ts`)
6
+ * to the run manifest's `per_story_state[storyKey].dev_story_signals` field.
7
+ *
8
+ * Why this exists:
9
+ * - Story 60-3 (under-delivery detection) reads `context.devStoryResult.files_modified`
10
+ * during verification. The orchestrator passes it in-memory at dispatch time
11
+ * (verification-integration.ts:62 → assembleVerificationContext), so the
12
+ * check works in the SAME run.
13
+ * - But the field is never persisted to the manifest. Resume / retry-escalated
14
+ * / supervisor-restart / post-mortem analysis paths read state from the
15
+ * manifest and see `dev_story_signals: undefined`, which falls through to
16
+ * "no signal → benefit of doubt" warn instead of the intended under-delivery
17
+ * error. Epic 52's design contract is that the manifest is the single
18
+ * source of truth — devStorySignals omission contradicts that.
19
+ *
20
+ * Mirrors the DevStorySignals interface without importing verification module
21
+ * to keep run-model free of a dependency on verification (same pattern as
22
+ * StoredVerificationFindingSchema in verification-result.ts).
23
+ */
24
+ import { z } from 'zod';
25
+ /**
26
+ * Persisted shape of the normalized dev-story signals.
27
+ *
28
+ * All fields optional because:
29
+ * - Different dev-story dispatches surface different subsets of fields
30
+ * depending on the agent's YAML output (some omit `tests`, some omit
31
+ * `ac_failures` when none failed, etc.).
32
+ * - `result` uses the open extensible-union pattern (v0.19.6 convention)
33
+ * so future result strings (e.g. 'partial-checkpoint') don't break
34
+ * deserialization.
35
+ */
36
+ export declare const StoredDevStorySignalsSchema: z.ZodObject<{
37
+ result: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"completed">, z.ZodLiteral<"failed">, z.ZodLiteral<"partial">, z.ZodString]>>;
38
+ ac_met: z.ZodOptional<z.ZodArray<z.ZodString>>;
39
+ ac_failures: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ files_modified: z.ZodOptional<z.ZodArray<z.ZodString>>;
41
+ tests: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"pass">, z.ZodLiteral<"fail">, z.ZodLiteral<"unknown">, z.ZodString]>>;
42
+ }, z.core.$strip>;
43
+ export type StoredDevStorySignals = z.infer<typeof StoredDevStorySignalsSchema>;
44
+ //# sourceMappingURL=dev-story-signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-story-signals.d.ts","sourceRoot":"","sources":["../../src/run-model/dev-story-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B;;;;;;iBA8BtC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * StoredDevStorySignals Zod schema — Story 60-8.
3
+ *
4
+ * Defines the typed schema for persisting the dev-story handler's normalized
5
+ * output (`DevStorySignals` from `packages/sdlc/src/verification/types.ts`)
6
+ * to the run manifest's `per_story_state[storyKey].dev_story_signals` field.
7
+ *
8
+ * Why this exists:
9
+ * - Story 60-3 (under-delivery detection) reads `context.devStoryResult.files_modified`
10
+ * during verification. The orchestrator passes it in-memory at dispatch time
11
+ * (verification-integration.ts:62 → assembleVerificationContext), so the
12
+ * check works in the SAME run.
13
+ * - But the field is never persisted to the manifest. Resume / retry-escalated
14
+ * / supervisor-restart / post-mortem analysis paths read state from the
15
+ * manifest and see `dev_story_signals: undefined`, which falls through to
16
+ * "no signal → benefit of doubt" warn instead of the intended under-delivery
17
+ * error. Epic 52's design contract is that the manifest is the single
18
+ * source of truth — devStorySignals omission contradicts that.
19
+ *
20
+ * Mirrors the DevStorySignals interface without importing verification module
21
+ * to keep run-model free of a dependency on verification (same pattern as
22
+ * StoredVerificationFindingSchema in verification-result.ts).
23
+ */
24
+ import { z } from 'zod';
25
+ /**
26
+ * Persisted shape of the normalized dev-story signals.
27
+ *
28
+ * All fields optional because:
29
+ * - Different dev-story dispatches surface different subsets of fields
30
+ * depending on the agent's YAML output (some omit `tests`, some omit
31
+ * `ac_failures` when none failed, etc.).
32
+ * - `result` uses the open extensible-union pattern (v0.19.6 convention)
33
+ * so future result strings (e.g. 'partial-checkpoint') don't break
34
+ * deserialization.
35
+ */
36
+ export const StoredDevStorySignalsSchema = z.object({
37
+ /** Dev agent's overall verdict — open union for forward-compat. */
38
+ result: z
39
+ .union([
40
+ z.literal('completed'),
41
+ z.literal('failed'),
42
+ z.literal('partial'),
43
+ z.string(),
44
+ ])
45
+ .optional(),
46
+ /** ACs the dev agent claims it satisfied. */
47
+ ac_met: z.array(z.string()).optional(),
48
+ /** ACs the dev agent flagged as not satisfied. */
49
+ ac_failures: z.array(z.string()).optional(),
50
+ /**
51
+ * List of project-relative file paths the dev agent created or modified
52
+ * during this dispatch. Required by Story 60-3's under-delivery detection
53
+ * in source-ac-fidelity check; absence forces the check into "benefit of
54
+ * doubt" warn mode.
55
+ */
56
+ files_modified: z.array(z.string()).optional(),
57
+ /** Test outcome from the dev-story workflow — open union for forward-compat. */
58
+ tests: z
59
+ .union([
60
+ z.literal('pass'),
61
+ z.literal('fail'),
62
+ z.literal('unknown'),
63
+ z.string(),
64
+ ])
65
+ .optional(),
66
+ });
67
+ //# sourceMappingURL=dev-story-signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-story-signals.js","sourceRoot":"","sources":["../../src/run-model/dev-story-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,mEAAmE;IACnE,MAAM,EAAE,CAAC;SACN,KAAK,CAAC;QACL,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACtB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpB,CAAC,CAAC,MAAM,EAAE;KACX,CAAC;SACD,QAAQ,EAAE;IACb,6CAA6C;IAC7C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtC,kDAAkD;IAClD,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C;;;;;OAKG;IACH,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9C,gFAAgF;IAChF,KAAK,EAAE,CAAC;SACL,KAAK,CAAC;QACL,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACjB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpB,CAAC,CAAC,MAAM,EAAE;KACX,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAA"}
@@ -18,6 +18,8 @@ export { StoredVerificationFindingSchema, StoredVerificationCheckResultSchema, S
18
18
  export type { StoredVerificationFinding, StoredVerificationCheckResult, StoredVerificationSummary, } from './verification-result.js';
19
19
  export { rollupFindingCounts, ZERO_FINDING_COUNTS } from './verification-findings-counts.js';
20
20
  export type { VerificationFindingsCounts } from './verification-findings-counts.js';
21
+ export { StoredDevStorySignalsSchema } from './dev-story-signals.js';
22
+ export type { StoredDevStorySignals } from './dev-story-signals.js';
21
23
  export { SupervisorLock } from './supervisor-lock.js';
22
24
  export type { SupervisorLockOptions } from './supervisor-lock.js';
23
25
  //# 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;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,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAC5F,YAAY,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AAGnF,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,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAC5F,YAAY,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AAGnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AACpE,YAAY,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAGnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -17,6 +17,8 @@ export { PerStoryStatusSchema, PerStoryStateSchema } from './per-story-state.js'
17
17
  export { StoredVerificationFindingSchema, StoredVerificationCheckResultSchema, StoredVerificationSummarySchema, } from './verification-result.js';
18
18
  // Story 55-3b: roll-up helper for surfacing finding counts in CLI JSON output
19
19
  export { rollupFindingCounts, ZERO_FINDING_COUNTS } from './verification-findings-counts.js';
20
+ // Story 60-8: persisted dev-story signals (closes 60-3's manifest-source-of-truth gap)
21
+ export { StoredDevStorySignalsSchema } from './dev-story-signals.js';
20
22
  // Story 52-2: Supervisor locking and ownership
21
23
  export { SupervisorLock } from './supervisor-lock.js';
22
24
  //# 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,8EAA8E;AAC9E,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,0BAA0B,CAAA;AAOjC,8EAA8E;AAC9E,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAG5F,+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,8EAA8E;AAC9E,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAG5F,uFAAuF;AACvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AAGpE,+CAA+C;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
@@ -71,6 +71,13 @@ export declare const PerStoryStateSchema: z.ZodObject<{
71
71
  review_cycles: z.ZodOptional<z.ZodNumber>;
72
72
  dispatches: z.ZodOptional<z.ZodNumber>;
73
73
  retry_count: z.ZodOptional<z.ZodNumber>;
74
+ dev_story_signals: z.ZodOptional<z.ZodObject<{
75
+ result: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"completed">, z.ZodLiteral<"failed">, z.ZodLiteral<"partial">, z.ZodString]>>;
76
+ ac_met: z.ZodOptional<z.ZodArray<z.ZodString>>;
77
+ ac_failures: z.ZodOptional<z.ZodArray<z.ZodString>>;
78
+ files_modified: z.ZodOptional<z.ZodArray<z.ZodString>>;
79
+ tests: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"pass">, z.ZodLiteral<"fail">, z.ZodLiteral<"unknown">, z.ZodString]>>;
80
+ }, z.core.$strip>>;
74
81
  }, z.core.$strip>;
75
82
  export type PerStoryState = z.infer<typeof PerStoryStateSchema>;
76
83
  //# sourceMappingURL=per-story-state.d.ts.map
@@ -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;AAQvB;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2B9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import { z } from 'zod';
9
9
  import { StoredVerificationSummarySchema } from './verification-result.js';
10
+ import { StoredDevStorySignalsSchema } from './dev-story-signals.js';
10
11
  // ---------------------------------------------------------------------------
11
12
  // PerStoryStatusSchema — extensible union (v0.19.6 pattern)
12
13
  // ---------------------------------------------------------------------------
@@ -66,5 +67,13 @@ export const PerStoryStateSchema = z.object({
66
67
  dispatches: z.number().int().nonnegative().optional(),
67
68
  /** Number of retry attempts for this story (code review retries + recovery-engine retries). Initial dispatch is not counted. */
68
69
  retry_count: z.number().int().nonnegative().optional(),
70
+ /**
71
+ * Story 60-8: persisted dev-story signals — files_modified, ac_met,
72
+ * ac_failures, tests, result. Required by Story 60-3's under-delivery
73
+ * detection when reading state from manifest (resume / retry-escalated /
74
+ * supervisor-restart / post-mortem). Absent on pre-60-8 manifests
75
+ * (backward-compatible).
76
+ */
77
+ dev_story_signals: StoredDevStorySignalsSchema.optional(),
69
78
  });
70
79
  //# sourceMappingURL=per-story-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"per-story-state.js","sourceRoot":"","sources":["../../src/run-model/per-story-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAA;AAE1E,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC;IAC1C,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACvB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC;IAChC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAClB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC,CAAC,MAAM,EAAE,EAAE,qCAAqC;CAClD,CAAC,CAAA;AAIF,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,+DAA+D;IAC/D,MAAM,EAAE,oBAAoB;IAC5B,yEAAyE;IACzE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,iEAAiE;IACjE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,kEAAkE;IAClE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,6EAA6E;IAC7E,mBAAmB,EAAE,+BAA+B,CAAC,QAAQ,EAAE;IAC/D,iFAAiF;IACjF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC7C,4DAA4D;IAC5D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACxD,iDAAiD;IACjD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACrD,gIAAgI;IAChI,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CACvD,CAAC,CAAA"}
1
+ {"version":3,"file":"per-story-state.js","sourceRoot":"","sources":["../../src/run-model/per-story-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAA;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AAEpE,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC;IAC1C,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACvB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC;IAChC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAClB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC,CAAC,MAAM,EAAE,EAAE,qCAAqC;CAClD,CAAC,CAAA;AAIF,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,+DAA+D;IAC/D,MAAM,EAAE,oBAAoB;IAC5B,yEAAyE;IACzE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,iEAAiE;IACjE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,kEAAkE;IAClE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,6EAA6E;IAC7E,mBAAmB,EAAE,+BAA+B,CAAC,QAAQ,EAAE;IAC/D,iFAAiF;IACjF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC7C,4DAA4D;IAC5D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACxD,iDAAiD;IACjD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACrD,gIAAgI;IAChI,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACtD;;;;;;OAMG;IACH,iBAAiB,EAAE,2BAA2B,CAAC,QAAQ,EAAE;CAC1D,CAAC,CAAA"}
@@ -49,8 +49,8 @@ export declare const RunManifestSchema: z.ZodObject<{
49
49
  story_scope: z.ZodArray<z.ZodString>;
50
50
  run_status: z.ZodOptional<z.ZodEnum<{
51
51
  failed: "failed";
52
- running: "running";
53
52
  completed: "completed";
53
+ running: "running";
54
54
  stopped: "stopped";
55
55
  }>>;
56
56
  supervisor_pid: z.ZodNullable<z.ZodNumber>;
@@ -97,6 +97,13 @@ export declare const RunManifestSchema: z.ZodObject<{
97
97
  review_cycles: z.ZodOptional<z.ZodNumber>;
98
98
  dispatches: z.ZodOptional<z.ZodNumber>;
99
99
  retry_count: z.ZodOptional<z.ZodNumber>;
100
+ dev_story_signals: z.ZodOptional<z.ZodObject<{
101
+ result: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"completed">, z.ZodLiteral<"failed">, z.ZodLiteral<"partial">, z.ZodString]>>;
102
+ ac_met: z.ZodOptional<z.ZodArray<z.ZodString>>;
103
+ ac_failures: z.ZodOptional<z.ZodArray<z.ZodString>>;
104
+ files_modified: z.ZodOptional<z.ZodArray<z.ZodString>>;
105
+ tests: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"pass">, z.ZodLiteral<"fail">, z.ZodLiteral<"unknown">, z.ZodString]>>;
106
+ }, z.core.$strip>>;
100
107
  }, z.core.$strip>>;
101
108
  recovery_history: z.ZodArray<z.ZodObject<{
102
109
  story_key: z.ZodString;
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyB5B,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyB5B,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"}
@@ -9,13 +9,15 @@
9
9
  *
10
10
  * Architecture / scoring contract:
11
11
  *
12
- * - No probes declared → pass (skip note finding array is empty)
13
- * - Probes declared, YAML invalid → fail (one finding per parse error)
14
- * - Probe `sandbox: twin` → warn (deferred until Phase 3)
15
- * - Probe `sandbox: host`, exit 0 → pass; no finding emitted for that probe
16
- * - Probe `sandbox: host`, exit 0 fail (exit code + stdout/stderr tails)
17
- * - Probe `sandbox: host`, timed out → fail (runtime-probe-timeout category)
18
- * - No storyContent on context warn (cannot verify without story text)
12
+ * - No probes declared → pass (skip note finding array is empty)
13
+ * - Probes declared, YAML invalid → fail (one finding per parse error)
14
+ * - Probe `sandbox: twin` → warn (deferred until Phase 3)
15
+ * - Probe `sandbox: host`, exit 0, no assertions → pass; no finding emitted for that probe
16
+ * - Probe `sandbox: host`, exit 0, assertions all met pass; no finding emitted
17
+ * - Probe `sandbox: host`, exit 0, assertion missed → fail (runtime-probe-assertion-fail) [Story 60-4]
18
+ * - Probe `sandbox: host`, exit ≠ 0 fail (exit code + stdout/stderr tails)
19
+ * - Probe `sandbox: host`, timed out → fail (runtime-probe-timeout category)
20
+ * - No storyContent on context → warn (cannot verify without story text)
19
21
  *
20
22
  * Registered last in the canonical Tier A pipeline, after BuildCheck,
21
23
  * because probes may depend on a successful build's output.
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-probe-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/runtime-probe-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AAgB3B;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,CAAA;IACnD;wEACoE;IACpE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;CACjE;AAWD,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,IAAI,oBAAmB;IAChC,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;gBAEtC,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAOhD,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAmHrE"}
1
+ {"version":3,"file":"runtime-probe-check.d.ts","sourceRoot":"","sources":["../../../src/verification/checks/runtime-probe-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AAqG3B;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,CAAA;IACnD;wEACoE;IACpE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;CACjE;AAWD,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,IAAI,oBAAmB;IAChC,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;gBAEtC,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAOhD,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA0JrE"}
@@ -9,13 +9,15 @@
9
9
  *
10
10
  * Architecture / scoring contract:
11
11
  *
12
- * - No probes declared → pass (skip note finding array is empty)
13
- * - Probes declared, YAML invalid → fail (one finding per parse error)
14
- * - Probe `sandbox: twin` → warn (deferred until Phase 3)
15
- * - Probe `sandbox: host`, exit 0 → pass; no finding emitted for that probe
16
- * - Probe `sandbox: host`, exit 0 fail (exit code + stdout/stderr tails)
17
- * - Probe `sandbox: host`, timed out → fail (runtime-probe-timeout category)
18
- * - No storyContent on context warn (cannot verify without story text)
12
+ * - No probes declared → pass (skip note finding array is empty)
13
+ * - Probes declared, YAML invalid → fail (one finding per parse error)
14
+ * - Probe `sandbox: twin` → warn (deferred until Phase 3)
15
+ * - Probe `sandbox: host`, exit 0, no assertions → pass; no finding emitted for that probe
16
+ * - Probe `sandbox: host`, exit 0, assertions all met pass; no finding emitted
17
+ * - Probe `sandbox: host`, exit 0, assertion missed → fail (runtime-probe-assertion-fail) [Story 60-4]
18
+ * - Probe `sandbox: host`, exit ≠ 0 fail (exit code + stdout/stderr tails)
19
+ * - Probe `sandbox: host`, timed out → fail (runtime-probe-timeout category)
20
+ * - No storyContent on context → warn (cannot verify without story text)
19
21
  *
20
22
  * Registered last in the canonical Tier A pipeline, after BuildCheck,
21
23
  * because probes may depend on a successful build's output.
@@ -30,6 +32,88 @@ const CATEGORY_SKIP = 'runtime-probe-skip';
30
32
  const CATEGORY_DEFERRED = 'runtime-probe-deferred';
31
33
  const CATEGORY_FAIL = 'runtime-probe-fail';
32
34
  const CATEGORY_TIMEOUT = 'runtime-probe-timeout';
35
+ /**
36
+ * Story 60-4: command exited 0 but a stdout-shape assertion declared by the
37
+ * author tripped. Distinct from `runtime-probe-fail` (non-zero exit code)
38
+ * so retry prompts and post-run analysis can tell "tool crashed politely"
39
+ * from "tool errored loudly".
40
+ */
41
+ const CATEGORY_ASSERTION_FAIL = 'runtime-probe-assertion-fail';
42
+ /**
43
+ * Story 60-11: source AC describes an event-driven mechanism (hook, timer,
44
+ * signal, webhook) but no probe's command invokes a known production-trigger
45
+ * pattern. Strata Run 13 (Story 1-12, 2026-04-26): vault conflict hook
46
+ * shipped SHIP_IT non-functional because the dev's probe ran the hook script
47
+ * directly with `bash .git/hooks/post-merge` — git only fires post-merge on
48
+ * a SUCCESSFUL merge, so under conflict (the hook's actual use case) the
49
+ * production trigger never fires. Direct-invocation probe missed it; only
50
+ * e2e smoke caught it. Sibling to obs_012's success-shape gap.
51
+ *
52
+ * Severity is warn (advisory, non-blocking) until the heuristic is
53
+ * calibrated against several runs. Flip to error once false-positive rate
54
+ * is verified low.
55
+ */
56
+ const CATEGORY_MISSING_TRIGGER = 'runtime-probe-missing-production-trigger';
57
+ // ---------------------------------------------------------------------------
58
+ // Story 60-11: event-driven trigger heuristic
59
+ // ---------------------------------------------------------------------------
60
+ /**
61
+ * Source-AC keywords that signal an event-driven implementation. Word-boundary
62
+ * matched, case-insensitive. When any of these appears in source AC text AND
63
+ * no probe's command invokes a known production trigger, the check emits a
64
+ * `runtime-probe-missing-production-trigger` warn finding.
65
+ *
66
+ * Each keyword is paired with the trigger patterns that satisfy it:
67
+ * - `git hook` / `post-merge` / etc. → satisfied by `git merge|pull|push|commit|rebase`
68
+ * - `systemd` / `timer` / `unit` → satisfied by `systemctl ... start|enable|trigger`
69
+ * - `cron` / `crontab` / `schedule` → satisfied by `crontab|run-parts|schedule`
70
+ * - `signal` / `SIGHUP|SIGTERM|SIGUSR` → satisfied by `kill -<signal>`
71
+ * - `webhook` / `HTTP POST` / `endpoint` → satisfied by `curl ... -X POST` or wget
72
+ * - `inotify` / `path watch` → satisfied by `touch|mkdir|rm` (filesystem mutation)
73
+ */
74
+ const EVENT_DRIVEN_KEYWORDS = [
75
+ /\b(?:git\s+hook|post-merge|post-commit|post-rewrite|pre-push|pre-commit|pre-merge-commit)\b/i,
76
+ /\b(?:systemd\s+(?:unit|service|timer|path)|systemctl|\.timer\b|\.service\b)\b/i,
77
+ /\b(?:cron\s*(?:job|tab|expression)?|crontab|scheduled\s+task)\b/i,
78
+ /\b(?:signal\s+handler|SIG(?:HUP|TERM|INT|USR1|USR2|KILL))\b/,
79
+ /\b(?:webhook|HTTP\s+(?:POST|GET)\s+endpoint|REST\s+endpoint)\b/i,
80
+ /\b(?:inotify|path\s+watch|file\s+watcher)\b/i,
81
+ ];
82
+ /**
83
+ * Production-trigger command patterns. If ANY probe's command matches one of
84
+ * these, the heuristic considers the trigger covered. Word-boundary matched.
85
+ */
86
+ const TRIGGER_COMMAND_PATTERNS = [
87
+ /\bgit\s+(?:merge|pull|push|commit|rebase|cherry-pick)\b/,
88
+ /\bsystemctl\b/,
89
+ /\bcrontab\b|\brun-parts\b/,
90
+ /\bkill\s+-/,
91
+ /\bcurl\s+(?:[^|]*\s)?-X\s+(?:POST|GET|PUT|DELETE)/i,
92
+ /\bwget\s+--method=(?:POST|GET|PUT|DELETE)/i,
93
+ /\b(?:touch|mkdir|rm)\s+/, // filesystem-watch triggers
94
+ ];
95
+ /**
96
+ * Returns true if the source AC text mentions an event-driven mechanism.
97
+ */
98
+ function detectsEventDrivenAC(sourceEpicContent) {
99
+ for (const pattern of EVENT_DRIVEN_KEYWORDS) {
100
+ if (pattern.test(sourceEpicContent))
101
+ return true;
102
+ }
103
+ return false;
104
+ }
105
+ /**
106
+ * Returns true if any probe's command line invokes a known production trigger.
107
+ */
108
+ function probesInvokeProductionTrigger(probes) {
109
+ for (const probe of probes) {
110
+ for (const pattern of TRIGGER_COMMAND_PATTERNS) {
111
+ if (pattern.test(probe.command))
112
+ return true;
113
+ }
114
+ }
115
+ return false;
116
+ }
33
117
  const defaultExecutors = {
34
118
  host: (probe) => executeProbeOnHost(probe, { cwd: process.cwd() }),
35
119
  // twin intentionally omitted → RuntimeProbeCheck emits a warn finding
@@ -103,6 +187,29 @@ export class RuntimeProbeCheck {
103
187
  };
104
188
  }
105
189
  const findings = [];
190
+ // Story 60-11: event-driven AC + missing-trigger heuristic. Runs once
191
+ // per check invocation against the parsed probe list and the source AC
192
+ // text. If the source AC describes an event-driven mechanism (hook,
193
+ // timer, signal, webhook) AND no probe's command invokes a known
194
+ // production-trigger pattern, emit an advisory warn finding so the
195
+ // dev-story retry prompt and post-run analysis can flag the gap. Does
196
+ // not block (severity: warn) until calibrated.
197
+ if (context.sourceEpicContent !== undefined) {
198
+ if (detectsEventDrivenAC(context.sourceEpicContent) &&
199
+ !probesInvokeProductionTrigger(parsed.probes)) {
200
+ findings.push({
201
+ category: CATEGORY_MISSING_TRIGGER,
202
+ severity: 'warn',
203
+ message: `source AC describes an event-driven mechanism (hook / timer / signal / webhook) ` +
204
+ `but no probe's command invokes a known production trigger ` +
205
+ `(git merge/pull/push, systemctl, crontab, kill -<sig>, curl -X POST, etc.). ` +
206
+ `Probes that call the implementation directly skip the wiring layer ` +
207
+ `the AC's user-facing event would exercise — see strata Run 13 / Story 1-12 ` +
208
+ `for the canonical case (post-merge hook never fires under git's conflict semantic). ` +
209
+ `Authoring guidance: probes/event-driven section of create-story.md.`,
210
+ });
211
+ }
212
+ }
106
213
  for (const probe of parsed.probes) {
107
214
  if (probe.sandbox === 'twin') {
108
215
  findings.push({
@@ -118,11 +225,24 @@ export class RuntimeProbeCheck {
118
225
  if (result.outcome === 'pass') {
119
226
  continue;
120
227
  }
121
- const category = result.outcome === 'timeout' ? CATEGORY_TIMEOUT : CATEGORY_FAIL;
228
+ const category = result.outcome === 'timeout'
229
+ ? CATEGORY_TIMEOUT
230
+ : result.assertionFailures !== undefined
231
+ ? CATEGORY_ASSERTION_FAIL
232
+ : CATEGORY_FAIL;
122
233
  const descriptor = probe.description ? ` (${probe.description})` : '';
123
- const message = result.outcome === 'timeout'
124
- ? `probe "${probe.name}"${descriptor} timed out after ${result.durationMs}ms`
125
- : `probe "${probe.name}"${descriptor} failed with exit ${result.exitCode ?? 'unknown'}`;
234
+ let message;
235
+ if (result.outcome === 'timeout') {
236
+ message = `probe "${probe.name}"${descriptor} timed out after ${result.durationMs}ms`;
237
+ }
238
+ else if (result.assertionFailures !== undefined) {
239
+ message =
240
+ `probe "${probe.name}"${descriptor} exit 0 but stdout assertion failed: ` +
241
+ result.assertionFailures.join('; ');
242
+ }
243
+ else {
244
+ message = `probe "${probe.name}"${descriptor} failed with exit ${result.exitCode ?? 'unknown'}`;
245
+ }
126
246
  findings.push({
127
247
  category,
128
248
  severity: 'error',
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-probe-check.js","sourceRoot":"","sources":["../../../src/verification/checks/runtime-probe-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,oBAAoB,CAAA;AAE3B,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,cAAc,GAAG,2BAA2B,CAAA;AAClD,MAAM,aAAa,GAAG,oBAAoB,CAAA;AAC1C,MAAM,iBAAiB,GAAG,wBAAwB,CAAA;AAClD,MAAM,aAAa,GAAG,oBAAoB,CAAA;AAC1C,MAAM,gBAAgB,GAAG,uBAAuB,CAAA;AAkBhD,MAAM,gBAAgB,GAA0B;IAC9C,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAClE,sEAAsE;CACvE,CAAA;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,gBAAgB,CAAA;IACvB,IAAI,GAAG,GAAY,CAAA;IAEX,UAAU,CAAuB;IAElD,YAAY,SAA0C;QACpD,IAAI,CAAC,UAAU,GAAG;YAChB,GAAG,gBAAgB;YACnB,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;SACrB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAA4B;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAExB,uEAAuE;QACvE,qEAAqE;QACrE,mEAAmE;QACnE,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,aAAa;oBACvB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,0DAA0D;iBACpE;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,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QAEvD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,kEAAkE;gBAC3E,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC/B,QAAQ,EAAE,EAAE;aACb,CAAA;QACH,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAA0B;gBACtC;oBACE,QAAQ,EAAE,cAAc;oBACxB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,MAAM,CAAC,KAAK;iBACtB;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,iEAAiE;QACjE,sEAAsE;QACtE,iDAAiD;QACjD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,8CAA8C;gBACvD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC/B,QAAQ,EAAE,EAAE;aACb,CAAA;QACH,CAAC;QAED,MAAM,QAAQ,GAA0B,EAAE,CAAA;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,iBAAiB;oBAC3B,QAAQ,EAAE,MAAM;oBAChB,OAAO,EACL,UAAU,KAAK,CAAC,IAAI,8CAA8C;wBAClE,8CAA8C;iBACjD,CAAC,CAAA;gBACF,SAAQ;YACV,CAAC;YAED,qBAAqB;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAChD,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC9B,SAAQ;YACV,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAA;YAChF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YACrE,MAAM,OAAO,GACX,MAAM,CAAC,OAAO,KAAK,SAAS;gBAC1B,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,UAAU,oBAAoB,MAAM,CAAC,UAAU,IAAI;gBAC7E,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,UAAU,qBAAqB,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAA;YAE3F,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ;gBACR,QAAQ,EAAE,OAAO;gBACjB,OAAO;gBACP,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;YACzD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;gBAC3C,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,MAAM,CAAA;QAEZ,OAAO;YACL,MAAM;YACN,OAAO,EACL,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACjB,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;gBAC1B,CAAC,CAAC,mBAAmB,MAAM,CAAC,MAAM,CAAC,MAAM,kBAAkB;YAC/D,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC/B,QAAQ;SACT,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"runtime-probe-check.js","sourceRoot":"","sources":["../../../src/verification/checks/runtime-probe-check.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/verification/probes/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAA;AAenB,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC,CA0EtB"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/verification/probes/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAA;AA0EnB,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC,CA6FtB"}
@@ -20,6 +20,52 @@ import { DEFAULT_PROBE_TIMEOUT_MS, PROBE_TAIL_BYTES, } from './types.js';
20
20
  function tail(text, bytes = PROBE_TAIL_BYTES) {
21
21
  return text.length <= bytes ? text : text.slice(text.length - bytes);
22
22
  }
23
+ /**
24
+ * Story 60-4: evaluate `expect_stdout_no_regex` and `expect_stdout_regex`
25
+ * patterns against the captured stdout. Runs against the full (un-tailed)
26
+ * stdout so authors can match payload shape even when the response is
27
+ * larger than PROBE_TAIL_BYTES.
28
+ *
29
+ * Returns an array of human-readable failure descriptions. Empty array
30
+ * means all assertions passed.
31
+ *
32
+ * Invalid regex patterns (RegExp constructor throws) are reported as
33
+ * assertion failures themselves rather than crashing the executor — this
34
+ * way a typo in one author's probe surfaces as a deterministic finding,
35
+ * not a pipeline crash that masks the rest of the run.
36
+ */
37
+ function evaluateStdoutAssertions(probe, stdout) {
38
+ const failures = [];
39
+ for (const pattern of probe.expect_stdout_no_regex ?? []) {
40
+ let re;
41
+ try {
42
+ re = new RegExp(pattern);
43
+ }
44
+ catch (err) {
45
+ const detail = err instanceof Error ? err.message : String(err);
46
+ failures.push(`expect_stdout_no_regex pattern is not a valid regex (${detail}): ${pattern}`);
47
+ continue;
48
+ }
49
+ if (re.test(stdout)) {
50
+ failures.push(`expect_stdout_no_regex: stdout matched forbidden pattern: ${pattern}`);
51
+ }
52
+ }
53
+ for (const pattern of probe.expect_stdout_regex ?? []) {
54
+ let re;
55
+ try {
56
+ re = new RegExp(pattern);
57
+ }
58
+ catch (err) {
59
+ const detail = err instanceof Error ? err.message : String(err);
60
+ failures.push(`expect_stdout_regex pattern is not a valid regex (${detail}): ${pattern}`);
61
+ continue;
62
+ }
63
+ if (!re.test(stdout)) {
64
+ failures.push(`expect_stdout_regex: stdout did not match required pattern: ${pattern}`);
65
+ }
66
+ }
67
+ return failures;
68
+ }
23
69
  /**
24
70
  * Execute one probe on the host and return a structured ProbeResult.
25
71
  *
@@ -95,13 +141,30 @@ export function executeProbeOnHost(probe, options = {}) {
95
141
  child.on('close', (code) => {
96
142
  clearTimeout(timeoutHandle);
97
143
  const duration = Date.now() - start;
144
+ // Default outcome from exit code. Story 60-4: when the command exits
145
+ // 0, also evaluate stdout-shape assertions; if any tripped, downgrade
146
+ // outcome to 'fail' and surface the assertion failure list so the
147
+ // check can route to `runtime-probe-assertion-fail`. Assertions are
148
+ // not evaluated when the exit code already failed — the existing
149
+ // exit-code finding is more informative than a follow-on assertion
150
+ // miss caused by an error response.
151
+ let outcome = code === 0 ? 'pass' : 'fail';
152
+ let assertionFailures;
153
+ if (outcome === 'pass') {
154
+ const failures = evaluateStdoutAssertions(probe, stdout);
155
+ if (failures.length > 0) {
156
+ outcome = 'fail';
157
+ assertionFailures = failures;
158
+ }
159
+ }
98
160
  finalize({
99
- outcome: code === 0 ? 'pass' : 'fail',
161
+ outcome,
100
162
  command: probe.command,
101
163
  ...(code !== null ? { exitCode: code } : {}),
102
164
  stdoutTail: tail(stdout),
103
165
  stderrTail: tail(stderr),
104
166
  durationMs: duration,
167
+ ...(assertionFailures !== undefined ? { assertionFailures } : {}),
105
168
  });
106
169
  });
107
170
  });
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/verification/probes/executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/verification/probes/executor.ts"],"names":[],"mappings":"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"}
@@ -48,6 +48,15 @@ export declare const PROBE_TAIL_BYTES: number;
48
48
  * Required fields (`name`, `sandbox`, `command`) force authors to make
49
49
  * intent explicit — no silent defaults that could mask a miswritten probe.
50
50
  * Optional fields cover operational knobs with sensible fallbacks.
51
+ *
52
+ * Story 60-4: `expect_stdout_no_regex` and `expect_stdout_regex` close the
53
+ * exit-0-with-error-body gap. A probe that calls a tool returning HTTP 200
54
+ * with `{"isError": true}` (MCP convention) or `{"status": "error"}` (REST
55
+ * convention) exits 0 — exit-code-only verification accepts the broken tool
56
+ * as passing. Authors of probes that hit MCP / REST / JSON-RPC / A2A surfaces
57
+ * declare success-shape patterns to assert response payload structure beyond
58
+ * the shell exit code. Driven by strata Run 12 evidence: four MCP tools
59
+ * shipped SHIP_IT while throwing real Python TypeErrors against real data.
51
60
  */
52
61
  export declare const RuntimeProbeSchema: z.ZodObject<{
53
62
  name: z.ZodString;
@@ -58,6 +67,8 @@ export declare const RuntimeProbeSchema: z.ZodObject<{
58
67
  command: z.ZodString;
59
68
  timeout_ms: z.ZodOptional<z.ZodNumber>;
60
69
  description: z.ZodOptional<z.ZodString>;
70
+ expect_stdout_no_regex: z.ZodOptional<z.ZodArray<z.ZodString>>;
71
+ expect_stdout_regex: z.ZodOptional<z.ZodArray<z.ZodString>>;
61
72
  }, z.core.$strip>;
62
73
  export type RuntimeProbe = z.infer<typeof RuntimeProbeSchema>;
63
74
  /** Zod schema for the full list (wrapping the per-probe schema). */
@@ -70,6 +81,8 @@ export declare const RuntimeProbeListSchema: z.ZodArray<z.ZodObject<{
70
81
  command: z.ZodString;
71
82
  timeout_ms: z.ZodOptional<z.ZodNumber>;
72
83
  description: z.ZodOptional<z.ZodString>;
84
+ expect_stdout_no_regex: z.ZodOptional<z.ZodArray<z.ZodString>>;
85
+ expect_stdout_regex: z.ZodOptional<z.ZodArray<z.ZodString>>;
73
86
  }, z.core.$strip>>;
74
87
  /**
75
88
  * Result of parsing the `## Runtime Probes` section from story markdown.
@@ -118,5 +131,14 @@ export interface ProbeResult {
118
131
  stdoutTail: string;
119
132
  stderrTail: string;
120
133
  durationMs: number;
134
+ /**
135
+ * Story 60-4: populated when `outcome === 'fail'` because a stdout
136
+ * assertion (`expect_stdout_no_regex` or `expect_stdout_regex`) tripped,
137
+ * not because the shell exit code was non-zero. Each entry is a
138
+ * human-readable description of which pattern failed and why.
139
+ * Distinguishes assertion failures from exit-code failures so the check
140
+ * can route to `runtime-probe-assertion-fail` vs `runtime-probe-fail`.
141
+ */
142
+ assertionFailures?: string[];
121
143
  }
122
144
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/verification/probes/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB;;;EAA2B,CAAA;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAM3E;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAA;AAE9C;uEACuE;AACvE,eAAO,MAAM,gBAAgB,QAAW,CAAA;AAExC;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;iBAW7B,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D,oEAAoE;AACpE,eAAO,MAAM,sBAAsB;;;;;;;;;kBAA8B,CAAA;AAMjE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAMtC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/verification/probes/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB;;;EAA2B,CAAA;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAM3E;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAA;AAE9C;uEACuE;AACvE,eAAO,MAAM,gBAAgB,QAAW,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;iBA4B7B,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D,oEAAoE;AACpE,eAAO,MAAM,sBAAsB;;;;;;;;;;;kBAA8B,CAAA;AAMjE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAMtC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC7B"}
@@ -50,6 +50,15 @@ export const PROBE_TAIL_BYTES = 4 * 1024;
50
50
  * Required fields (`name`, `sandbox`, `command`) force authors to make
51
51
  * intent explicit — no silent defaults that could mask a miswritten probe.
52
52
  * Optional fields cover operational knobs with sensible fallbacks.
53
+ *
54
+ * Story 60-4: `expect_stdout_no_regex` and `expect_stdout_regex` close the
55
+ * exit-0-with-error-body gap. A probe that calls a tool returning HTTP 200
56
+ * with `{"isError": true}` (MCP convention) or `{"status": "error"}` (REST
57
+ * convention) exits 0 — exit-code-only verification accepts the broken tool
58
+ * as passing. Authors of probes that hit MCP / REST / JSON-RPC / A2A surfaces
59
+ * declare success-shape patterns to assert response payload structure beyond
60
+ * the shell exit code. Driven by strata Run 12 evidence: four MCP tools
61
+ * shipped SHIP_IT while throwing real Python TypeErrors against real data.
53
62
  */
54
63
  export const RuntimeProbeSchema = z.object({
55
64
  /** Stable, unique-within-story identifier used in finding messages and logs. */
@@ -62,6 +71,23 @@ export const RuntimeProbeSchema = z.object({
62
71
  timeout_ms: z.number().int().positive().optional(),
63
72
  /** Optional human-readable description. Surfaced in finding messages. */
64
73
  description: z.string().optional(),
74
+ /**
75
+ * Optional regex patterns that stdout must NOT match. If any pattern
76
+ * matches stdout, the probe is failed (outcome → 'fail', category →
77
+ * `runtime-probe-assertion-fail`) even when the shell exit code is 0.
78
+ * Use to assert the absence of structured-error payloads in tools that
79
+ * return HTTP 200 with an error body — `'"isError"\\s*:\\s*true'`,
80
+ * `'"status"\\s*:\\s*"error"'`, etc.
81
+ */
82
+ expect_stdout_no_regex: z.array(z.string().min(1)).optional(),
83
+ /**
84
+ * Optional regex patterns that stdout MUST match. Each pattern in the list
85
+ * must match stdout at least once; missing matches fail the probe with
86
+ * category `runtime-probe-assertion-fail`. Use to assert AC-specific
87
+ * success structure (e.g. for a search tool: `'"similarity_score"'` must
88
+ * appear in the response).
89
+ */
90
+ expect_stdout_regex: z.array(z.string().min(1)).optional(),
65
91
  });
66
92
  /** Zod schema for the full list (wrapping the per-probe schema). */
67
93
  export const RuntimeProbeListSchema = z.array(RuntimeProbeSchema);
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/verification/probes/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAGjE,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAA;AAE9C;uEACuE;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAA;AAExC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,gFAAgF;IAChF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;IACjD,2DAA2D;IAC3D,OAAO,EAAE,yBAAyB;IAClC,qFAAqF;IACrF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;IACvD,8EAA8E;IAC9E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,yEAAyE;IACzE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAA;AAIF,oEAAoE;AACpE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/verification/probes/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAGjE,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAA;AAE9C;uEACuE;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,gFAAgF;IAChF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;IACjD,2DAA2D;IAC3D,OAAO,EAAE,yBAAyB;IAClC,qFAAqF;IACrF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;IACvD,8EAA8E;IAC9E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,yEAAyE;IACzE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC;;;;;;;OAOG;IACH,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7D;;;;;;OAMG;IACH,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3D,CAAC,CAAA;AAIF,oEAAoE;AACpE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"source-ac-fidelity-check.d.ts","sourceRoot":"","sources":["../../src/verification/source-ac-fidelity-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,YAAY,CAAA;AA2PnB,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,QAAQ,CAAC,IAAI,wBAAuB;IACpC,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAEtB,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsIrE"}
1
+ {"version":3,"file":"source-ac-fidelity-check.d.ts","sourceRoot":"","sources":["../../src/verification/source-ac-fidelity-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,YAAY,CAAA;AA+enB,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,QAAQ,CAAC,IAAI,wBAAuB;IACpC,QAAQ,CAAC,IAAI,EAAG,GAAG,CAAS;IAEtB,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA4NrE"}
@@ -28,6 +28,52 @@ import { renderFindings } from './findings.js';
28
28
  const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.substrate', '_bmad-output', 'coverage', '.next', '.cache']);
29
29
  /** Max depth for the basename walk. Prevents pathological traversal. */
30
30
  const MAX_WALK_DEPTH = 8;
31
+ /**
32
+ * Story 60-7: detect operational/runtime path references in source AC.
33
+ *
34
+ * Source ACs frequently mention runtime locations the implementation
35
+ * INTERACTS WITH but does not SHIP — install destinations, system paths,
36
+ * user home references, git internals. The check's existing path-clause
37
+ * pipeline treats every backtick path as a deliverable and emits
38
+ * architectural-drift error when it isn't found in code. This produces
39
+ * false-positive verification failures.
40
+ *
41
+ * Concrete strata example (Run a880f201, Story 1-12, 2026-04-26): source AC
42
+ * said "When `.git/hooks/post-merge` is installed" — describing the runtime
43
+ * install location of a hook the dev's installer script writes. The dev
44
+ * correctly shipped `hooks/install-vault-hooks.sh` + `hooks/vault-conflict-resolver.sh`,
45
+ * but the check flagged `.git/hooks/post-merge` as architectural drift and
46
+ * VERIFICATION_FAILED'd the story across both review cycles.
47
+ *
48
+ * Patterns covered:
49
+ * - `^\.git/...` git internals (vault hooks, repo-internal paths)
50
+ * - `^/usr/...`, `^/etc/...`, `^/var/...`, `^/mnt/...`, `^/opt/...`,
51
+ * `^/srv/...`, `^/tmp/...`, `^/run/...`, `^/sys/...`, `^/proc/...`,
52
+ * `^/dev/...`, `^/home/...` Unix system / install destinations
53
+ * - `^~/...` user home references (`~/.config/...`, `~/obsidian-vault-test/`)
54
+ *
55
+ * Out of scope for v1 (deferred to follow-up if real evidence accumulates):
56
+ * - HTTP routes (`/api/embeddings`) — distinguishing a route from a system
57
+ * path requires extra signal (extension absence + plural-noun heuristic);
58
+ * punt until a story actually trips on this.
59
+ */
60
+ function isOperationalPath(pathClause) {
61
+ // Strip surrounding backticks for the prefix test.
62
+ const raw = pathClause.replace(/^`/, '').replace(/`$/, '');
63
+ if (raw.startsWith('.git/'))
64
+ return true;
65
+ if (raw.startsWith('~/'))
66
+ return true;
67
+ // Match Unix system paths: leading slash + one of the canonical
68
+ // root directories + slash. The trailing slash distinguishes
69
+ // `/usr/local/bin` (system path) from `/userland/something` (project path).
70
+ const SYSTEM_ROOTS = ['usr', 'etc', 'var', 'mnt', 'opt', 'srv', 'tmp', 'run', 'sys', 'proc', 'dev', 'home'];
71
+ for (const root of SYSTEM_ROOTS) {
72
+ if (raw.startsWith(`/${root}/`))
73
+ return true;
74
+ }
75
+ return false;
76
+ }
31
77
  /**
32
78
  * Return true if `base` (a filename like `discover.ts`) exists somewhere under
33
79
  * `root` within MAX_WALK_DEPTH levels, skipping SKIP_DIRS. The walk is
@@ -177,20 +223,35 @@ function pathReferencedInModifiedFiles(workingDir, pathClause, modifiedFiles) {
177
223
  /**
178
224
  * Extract the story's section from the full epic content.
179
225
  *
180
- * Uses the same heading pattern as `isImplicitlyCovered` in the monolith:
181
- * `### Story <storyKey>:` or `### Story <storyKey> ` or `### Story <storyKey>\n`
226
+ * Uses the heading pattern `### Story <storyKey>:` or `### Story <storyKey>[whitespace]`.
227
+ *
228
+ * **Separator-tolerant matching** (Story 60-6, mirrors create-story.ts Story
229
+ * 58-5 normalization): Substrate's canonical storyKey form is hyphen
230
+ * (`1-10c`) — `seed-methodology-context.ts` normalizes any author convention
231
+ * to hyphen before storing in `wg_stories`. But strata's `epics.md` uses
232
+ * dot-form headings (`### Story 1.10c:`). When the supplied storyKey
233
+ * (`1-10c`) doesn't textually match the heading separator (`.`), the
234
+ * extraction must still find the right section — silently scanning the
235
+ * whole epic and attributing every story's clauses to this one is far worse
236
+ * than emitting a clear "could not isolate" signal.
182
237
  *
183
238
  * Returns the extracted section text (from the heading match through to the
184
- * next `### Story` heading or end of file), or the full content if no
185
- * matching heading is found.
239
+ * next `### Story` heading or end of file), or `null` if no matching heading
240
+ * is found. Callers MUST handle null explicitly — the previous silent-fallback
241
+ * behavior (return-full-epic) inflated findings cross-story and is gone.
186
242
  */
187
243
  function extractStorySection(epicContent, storyKey) {
188
- const escapedKey = storyKey.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
189
- const headingPattern = new RegExp(`^###\\s+Story\\s+${escapedKey}[:\\s]`, 'm');
244
+ // Separator-tolerant: split on any of [-._ ] and rejoin with the same class
245
+ // so `1-10c` matches `### Story 1.10c:`, `### Story 1_10c:`, `### Story 1 10c:`,
246
+ // and vice versa.
247
+ const parts = storyKey.split(/[-._ ]/);
248
+ const normalized = parts
249
+ .map((p) => p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
250
+ .join('[-._ ]');
251
+ const headingPattern = new RegExp(`^###\\s+Story\\s+${normalized}[:\\s]`, 'm');
190
252
  const match = headingPattern.exec(epicContent);
191
253
  if (!match) {
192
- // No matching heading — return full content so clauses can still be found
193
- return epicContent;
254
+ return null;
194
255
  }
195
256
  const start = match.index;
196
257
  // Find the next `### Story ` heading after the match
@@ -200,22 +261,149 @@ function extractStorySection(epicContent, storyKey) {
200
261
  }
201
262
  return epicContent.slice(start);
202
263
  }
264
+ const ALTERNATIVE_ITEM = /^\s*-\s+\*\*\(([a-zA-Z])\)/;
265
+ /**
266
+ * Scan section lines for alternative-option groups. A group requires at least
267
+ * two consecutive lettered list items; isolated `- **(a)**` items are NOT
268
+ * treated as alternatives because there is no second option to compare against.
269
+ *
270
+ * Returns a flat list of options (each item annotated with its group id) so
271
+ * the caller can map any path-clause line back to its (group, option) bucket.
272
+ */
273
+ function detectAlternativeOptions(lines) {
274
+ const options = [];
275
+ let i = 0;
276
+ while (i < lines.length) {
277
+ const start = lines[i];
278
+ const m = start !== undefined ? ALTERNATIVE_ITEM.exec(start) : null;
279
+ if (m) {
280
+ const groupStartLine = i;
281
+ const items = [
282
+ { letter: m[1].toLowerCase(), line: i },
283
+ ];
284
+ let j = i + 1;
285
+ while (j < lines.length) {
286
+ const line = lines[j] ?? '';
287
+ const am = ALTERNATIVE_ITEM.exec(line);
288
+ if (am) {
289
+ items.push({ letter: am[1].toLowerCase(), line: j });
290
+ j++;
291
+ continue;
292
+ }
293
+ // Blank line or indented continuation — stays inside the group's span.
294
+ if (line.trim() === '' || /^\s+\S/.test(line)) {
295
+ j++;
296
+ continue;
297
+ }
298
+ // Non-list line at column zero — group ends.
299
+ break;
300
+ }
301
+ // Need 2+ items to call this an alternative group.
302
+ if (items.length >= 2) {
303
+ const groupId = `alt-L${groupStartLine}`;
304
+ for (let k = 0; k < items.length; k++) {
305
+ const item = items[k];
306
+ const next = k + 1 < items.length ? items[k + 1].line : j;
307
+ options.push({
308
+ group: groupId,
309
+ option: item.letter,
310
+ lineStart: item.line,
311
+ lineEnd: next,
312
+ });
313
+ }
314
+ }
315
+ i = j;
316
+ }
317
+ else {
318
+ i++;
319
+ }
320
+ }
321
+ return options;
322
+ }
323
+ /** Resolve the (group, option) for a path clause whose match appeared on
324
+ * `lineIndex`, or undefined if the line is not inside any alternative option. */
325
+ function findOptionForLine(lineIndex, options) {
326
+ for (const opt of options) {
327
+ if (lineIndex >= opt.lineStart && lineIndex < opt.lineEnd) {
328
+ return { group: opt.group, option: opt.option };
329
+ }
330
+ }
331
+ return undefined;
332
+ }
333
+ /**
334
+ * Story 60-5: compute the "taken" option per alternative group.
335
+ *
336
+ * For each group of alternative options:
337
+ * - Each option owns one or more path clauses (tagged with the same `group`
338
+ * and the option's letter).
339
+ * - An option is satisfied when every path clause it owns exists in code
340
+ * (pathSatisfiedByCode === true). Missing paths in code make the option
341
+ * unsatisfied — the dev did not take this option.
342
+ * - The group's taken-option is the alphabetically-first satisfied letter,
343
+ * for deterministic selection when multiple options happen to be
344
+ * satisfied (uncommon, but possible if both options' paths exist from
345
+ * prior unrelated work).
346
+ *
347
+ * Returns a map: group-id → option-letter that was taken. Groups with no
348
+ * satisfied option are absent from the map (caller falls back to existing
349
+ * per-path error-severity drift detection).
350
+ */
351
+ function computeTakenOptionPerGroup(hardClauses, workingDir) {
352
+ // group → option-letter → "all paths satisfied so far"
353
+ const optionState = new Map();
354
+ for (const clause of hardClauses) {
355
+ if (clause.type !== 'path' || !clause.alternative)
356
+ continue;
357
+ const { group, option } = clause.alternative;
358
+ if (!optionState.has(group))
359
+ optionState.set(group, new Map());
360
+ const groupMap = optionState.get(group);
361
+ const exists = pathSatisfiedByCode(workingDir, clause.text);
362
+ if (!groupMap.has(option)) {
363
+ groupMap.set(option, exists);
364
+ }
365
+ else if (!exists) {
366
+ // Any one missing path unsatisfies the option.
367
+ groupMap.set(option, false);
368
+ }
369
+ }
370
+ const taken = new Map();
371
+ for (const [group, opts] of optionState) {
372
+ const sorted = [...opts.entries()].sort((a, b) => a[0].localeCompare(b[0]));
373
+ for (const [letter, satisfied] of sorted) {
374
+ if (satisfied) {
375
+ taken.set(group, letter);
376
+ break;
377
+ }
378
+ }
379
+ }
380
+ return taken;
381
+ }
203
382
  /**
204
383
  * Extract hard clauses from a story section of an epic file.
205
384
  *
206
385
  * Hard clauses:
207
386
  * 1. Lines containing MUST NOT / MUST / SHALL NOT / SHALL as standalone keywords (case-sensitive)
208
- * 2. Backtick-wrapped paths with at least one `/` (excludes bare filenames)
387
+ * 2. Backtick-wrapped paths with at least one `/` (excludes bare filenames).
388
+ * Story 60-5: paths inside `- **(letter)**` list items belonging to a
389
+ * multi-option alternative group are tagged with `{group, option}` so
390
+ * the verification phase can OR satisfaction across options.
209
391
  * 3. The presence of `## Runtime Probes` heading followed by a fenced yaml block
210
392
  * (represented as a single "runtime-probes-section" clause)
211
393
  */
212
394
  function extractHardClauses(sectionContent) {
213
395
  const clauses = [];
396
+ const lines = sectionContent.split('\n');
397
+ // Story 60-5: detect alternative-option line ranges up-front so any path
398
+ // extracted from inside one of those ranges can be tagged with its
399
+ // (group, option) — without this metadata the verification phase has no
400
+ // way to recognize that "(a)'s path missing" is acceptable when "(b)'s
401
+ // path is satisfied".
402
+ const alternativeOptions = detectAlternativeOptions(lines);
214
403
  // --- MUST NOT / MUST / SHALL NOT / SHALL lines ---
215
404
  // Word-boundary match, case-sensitive, captures the whole line.
216
405
  // Order matters: MUST NOT before MUST, SHALL NOT before SHALL to avoid double-matching.
217
406
  const mustPattern = /\b(MUST NOT|MUST|SHALL NOT|SHALL)\b/;
218
- const lines = sectionContent.split('\n');
219
407
  for (const line of lines) {
220
408
  const match = mustPattern.exec(line);
221
409
  if (match) {
@@ -224,13 +412,24 @@ function extractHardClauses(sectionContent) {
224
412
  }
225
413
  }
226
414
  // --- Backtick-wrapped paths with at least one slash ---
227
- // Match `path/with/at-least-one-slash` — excludes bare `filename.ts`
415
+ // Match `path/with/at-least-one-slash` — excludes bare `filename.ts`.
416
+ // Iterate line-by-line so each match's line index is known and can be
417
+ // mapped to an alternative option (Story 60-5).
228
418
  const pathPattern = /`([a-zA-Z0-9_./-]+\/[a-zA-Z0-9_./-]+)`/g;
229
- let pathMatch;
230
- while ((pathMatch = pathPattern.exec(sectionContent)) !== null) {
231
- // The full backtick-wrapped expression (including backticks) is the clause text
232
- // so the literal substring match against storyContent checks the exact same form.
233
- clauses.push({ type: 'path', text: `\`${pathMatch[1]}\`` });
419
+ for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
420
+ const line = lines[lineIdx] ?? '';
421
+ pathPattern.lastIndex = 0;
422
+ let pathMatch;
423
+ while ((pathMatch = pathPattern.exec(line)) !== null) {
424
+ const alt = findOptionForLine(lineIdx, alternativeOptions);
425
+ clauses.push({
426
+ type: 'path',
427
+ // The full backtick-wrapped expression (including backticks) is the clause text
428
+ // so the literal substring match against storyContent checks the exact same form.
429
+ text: `\`${pathMatch[1]}\``,
430
+ ...(alt ? { alternative: alt } : {}),
431
+ });
432
+ }
234
433
  }
235
434
  // --- Runtime Probes section ---
236
435
  // Detect ## Runtime Probes heading followed by a fenced yaml block
@@ -264,12 +463,53 @@ export class SourceAcFidelityCheck {
264
463
  findings,
265
464
  };
266
465
  }
267
- // Extract the story's section from the epic content
466
+ // Extract the story's section from the epic content. Story 60-6: when no
467
+ // heading matches, this is now `null` rather than a silent return-full-
468
+ // epic fallback. Falling back to the full epic attributed every story's
469
+ // hard clauses to this one — surfaced when strata's hyphen-form storyKey
470
+ // (`1-10c`) didn't match the dot-form heading (`### Story 1.10c:`) and
471
+ // produced cross-story findings. Loud warn finding here is strictly
472
+ // better than silently grading the wrong scope.
268
473
  const storySection = extractStorySection(context.sourceEpicContent, context.storyKey);
474
+ if (storySection === null) {
475
+ const findings = [
476
+ {
477
+ category: 'source-ac-section-not-found',
478
+ severity: 'warn',
479
+ message: `could not locate "### Story ${context.storyKey}" heading in source epic content — ` +
480
+ `skipping fidelity check (the heading may use a separator convention ` +
481
+ `(e.g. dot vs hyphen vs underscore) the matcher does not recognize, ` +
482
+ `or the story may not exist in this epic file)`,
483
+ },
484
+ ];
485
+ return {
486
+ status: 'pass',
487
+ details: renderFindings(findings),
488
+ duration_ms: Date.now() - start,
489
+ findings,
490
+ };
491
+ }
269
492
  // Extract all hard clauses from the story section
270
493
  const hardClauses = extractHardClauses(storySection);
271
494
  const findings = [];
272
495
  const storyContent = context.storyContent ?? '';
496
+ // Story 60-5: compute taken-option per alternative group BEFORE the main
497
+ // emission loop, so path-clause processing can recognize un-taken options
498
+ // and emit them as info-severity rather than error.
499
+ //
500
+ // An option is considered "satisfied" if all its path clauses exist in
501
+ // code (pathSatisfiedByCode === true). When at least one option in a
502
+ // group is satisfied, the group's taken-option is the alphabetically-
503
+ // first satisfied letter (deterministic). Other options' paths are
504
+ // emitted as info findings ("alternative not taken — story took option X").
505
+ //
506
+ // This closes strata obs_2026-04-26_013: 1-10c source AC offered (a) TS
507
+ // shim and (b) Python re-impl as alternatives; dev correctly took (b),
508
+ // but v0.20.23's check hard-gated on (a)'s path being missing. The
509
+ // alternative metadata + this OR'ing semantic preserves error severity
510
+ // for genuinely-missing paths while accepting either option as valid
511
+ // when source AC explicitly offered both.
512
+ const takenOption = computeTakenOptionPerGroup(hardClauses, context.workingDir);
273
513
  for (const clause of hardClauses) {
274
514
  if (clause.type === 'runtime-probes-section') {
275
515
  // Special handling: check whether the story artifact contains ## Runtime Probes
@@ -309,6 +549,46 @@ export class SourceAcFidelityCheck {
309
549
  // false positives (like strata 1-7's unquoted `./discover.ts`)
310
550
  // pass through as advisory.
311
551
  if (clause.type === 'path') {
552
+ // Story 60-7: operational-path heuristic. Source ACs frequently
553
+ // mention runtime install destinations, system paths, or git
554
+ // internals that the implementation INTERACTS WITH but does not
555
+ // SHIP — `.git/hooks/post-merge`, `/usr/local/bin/foo`,
556
+ // `~/.config/strata/`. These are not deliverable file paths;
557
+ // emitting them as architectural drift produces false
558
+ // VERIFICATION_FAILED on stories that correctly ship installers
559
+ // for these locations. Surfaced strata Run a880f201 (Story 1-12,
560
+ // 2026-04-26): dev correctly shipped `hooks/install-vault-hooks.sh`
561
+ // + `hooks/vault-conflict-resolver.sh` but the check flagged
562
+ // `.git/hooks/post-merge` (the install destination) as missing.
563
+ if (isOperationalPath(clause.text)) {
564
+ findings.push({
565
+ category: 'source-ac-operational-path-reference',
566
+ severity: 'info',
567
+ message: `path: "${truncated}" referenced in source AC as a runtime / ` +
568
+ `install / system location (matches operational-path heuristic) ` +
569
+ `— treated as informational, not a deliverable file path`,
570
+ });
571
+ continue;
572
+ }
573
+ // Story 60-5: if this path belongs to an un-taken alternative
574
+ // option (source AC offered (a) and (b); story implemented (b)),
575
+ // emit info-severity rather than error. The dev correctly chose
576
+ // a different option in the same group; flagging the un-taken
577
+ // option's path as architectural drift was the v0.20.23 false
578
+ // positive that hard-gated strata 1-10c despite a correct
579
+ // option-(b) implementation.
580
+ if (clause.alternative) {
581
+ const { group, option } = clause.alternative;
582
+ const taken = takenOption.get(group);
583
+ if (taken !== undefined && taken !== option) {
584
+ findings.push({
585
+ category: 'source-ac-alternative-not-taken',
586
+ severity: 'info',
587
+ message: `path: "${truncated}" not implemented — source AC offered this as alternative option (${option}); story implemented option (${taken}) instead`,
588
+ });
589
+ continue;
590
+ }
591
+ }
312
592
  // Story 58-9c: delegated to pathSatisfiedByCode which handles
313
593
  // literal / dot-stripped / basename-search resolution so
314
594
  // relative-path source ACs (e.g., `./discover.ts`) are correctly
@@ -1 +1 @@
1
- {"version":3,"file":"source-ac-fidelity-check.js","sourceRoot":"","sources":["../../src/verification/source-ac-fidelity-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"source-ac-fidelity-check.js","sourceRoot":"","sources":["../../src/verification/source-ac-fidelity-check.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@substrate-ai/sdlc",
3
- "version": "0.20.23",
3
+ "version": "0.20.28",
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.23",
27
+ "@substrate-ai/core": "0.20.28",
28
28
  "js-yaml": "^4.1.1",
29
29
  "zod": "^4.3.6"
30
30
  },