@3f-consulting/spec-controller-core 0.1.0-alpha.7 → 0.1.0-alpha.70

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 (257) hide show
  1. package/README.md +3 -3
  2. package/dist/assemble/evidenceReconciliationFromSources.d.ts +5 -40
  3. package/dist/assemble/evidenceReconciliationFromSources.d.ts.map +1 -1
  4. package/dist/assemble/evidenceReconciliationFromSources.js +30 -325
  5. package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
  6. package/dist/assemble/renderInput.d.ts +7 -73
  7. package/dist/assemble/renderInput.d.ts.map +1 -1
  8. package/dist/assemble/renderInput.js +3 -45
  9. package/dist/assemble/renderInput.js.map +1 -1
  10. package/dist/census/evidenceObligations.d.ts +11 -46
  11. package/dist/census/evidenceObligations.d.ts.map +1 -1
  12. package/dist/census/evidenceObligations.js +19 -25
  13. package/dist/census/evidenceObligations.js.map +1 -1
  14. package/dist/domain/evidenceOrder.d.ts +3 -0
  15. package/dist/domain/evidenceOrder.d.ts.map +1 -0
  16. package/dist/domain/evidenceOrder.js +15 -0
  17. package/dist/domain/evidenceOrder.js.map +1 -0
  18. package/dist/domain/evidenceReconciliation.d.ts +21 -391
  19. package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
  20. package/dist/domain/evidenceReconciliation.js +87 -382
  21. package/dist/domain/evidenceReconciliation.js.map +1 -1
  22. package/dist/domain/featureCode.d.ts +4 -0
  23. package/dist/domain/featureCode.d.ts.map +1 -0
  24. package/dist/domain/featureCode.js +12 -0
  25. package/dist/domain/featureCode.js.map +1 -0
  26. package/dist/domain/journal.d.ts +8 -393
  27. package/dist/domain/journal.d.ts.map +1 -1
  28. package/dist/domain/journal.js +6 -118
  29. package/dist/domain/journal.js.map +1 -1
  30. package/dist/domain/ledger.d.ts +8 -328
  31. package/dist/domain/ledger.d.ts.map +1 -1
  32. package/dist/domain/ledger.js +23 -326
  33. package/dist/domain/ledger.js.map +1 -1
  34. package/dist/domain/messages.d.ts +213 -0
  35. package/dist/domain/messages.d.ts.map +1 -0
  36. package/dist/domain/messages.js +313 -0
  37. package/dist/domain/messages.js.map +1 -0
  38. package/dist/domain/outcome.d.ts +3 -0
  39. package/dist/domain/outcome.d.ts.map +1 -0
  40. package/dist/domain/outcome.js +2 -0
  41. package/dist/domain/outcome.js.map +1 -0
  42. package/dist/domain/posting.d.ts +8 -105
  43. package/dist/domain/posting.d.ts.map +1 -1
  44. package/dist/domain/posting.js +4 -56
  45. package/dist/domain/posting.js.map +1 -1
  46. package/dist/domain/qualityCheckFault.d.ts +3 -43
  47. package/dist/domain/qualityCheckFault.d.ts.map +1 -1
  48. package/dist/domain/qualityCheckFault.js +0 -24
  49. package/dist/domain/qualityCheckFault.js.map +1 -1
  50. package/dist/domain/qualityCheckReconciliation.d.ts +7 -280
  51. package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
  52. package/dist/domain/qualityCheckReconciliation.js +63 -463
  53. package/dist/domain/qualityCheckReconciliation.js.map +1 -1
  54. package/dist/domain/qualityCheckReconciliationFault.d.ts +0 -19
  55. package/dist/domain/qualityCheckReconciliationFault.d.ts.map +1 -1
  56. package/dist/domain/qualityCheckReconciliationFault.js +1 -24
  57. package/dist/domain/qualityCheckReconciliationFault.js.map +1 -1
  58. package/dist/domain/scenarioCodeError.d.ts +16 -0
  59. package/dist/domain/scenarioCodeError.d.ts.map +1 -0
  60. package/dist/domain/scenarioCodeError.js +4 -0
  61. package/dist/domain/scenarioCodeError.js.map +1 -0
  62. package/dist/domain/scenarioReconciliation.d.ts +2 -207
  63. package/dist/domain/scenarioReconciliation.d.ts.map +1 -1
  64. package/dist/domain/scenarioReconciliation.js +4 -101
  65. package/dist/domain/scenarioReconciliation.js.map +1 -1
  66. package/dist/domain/scnAllocation.d.ts +27 -0
  67. package/dist/domain/scnAllocation.d.ts.map +1 -0
  68. package/dist/domain/scnAllocation.js +33 -0
  69. package/dist/domain/scnAllocation.js.map +1 -0
  70. package/dist/domain/verdictCode.d.ts +10 -0
  71. package/dist/domain/verdictCode.d.ts.map +1 -0
  72. package/dist/domain/verdictCode.js +16 -0
  73. package/dist/domain/verdictCode.js.map +1 -0
  74. package/dist/index.d.ts +14 -40
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +8 -88
  77. package/dist/index.js.map +1 -1
  78. package/dist/internal.d.ts +3 -27
  79. package/dist/internal.d.ts.map +1 -1
  80. package/dist/internal.js +3 -94
  81. package/dist/internal.js.map +1 -1
  82. package/dist/lib/bareTerm.d.ts +0 -39
  83. package/dist/lib/bareTerm.d.ts.map +1 -1
  84. package/dist/lib/bareTerm.js +0 -39
  85. package/dist/lib/bareTerm.js.map +1 -1
  86. package/dist/lib/portablePath.d.ts.map +1 -1
  87. package/dist/lib/portablePath.js +2 -16
  88. package/dist/lib/portablePath.js.map +1 -1
  89. package/dist/lib/scnCitation.d.ts +0 -32
  90. package/dist/lib/scnCitation.d.ts.map +1 -1
  91. package/dist/lib/scnCitation.js +2 -42
  92. package/dist/lib/scnCitation.js.map +1 -1
  93. package/dist/model.d.ts +0 -23
  94. package/dist/model.d.ts.map +1 -1
  95. package/dist/model.js +0 -23
  96. package/dist/model.js.map +1 -1
  97. package/dist/parse/checkScriptsRunInCI.d.ts +5 -168
  98. package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
  99. package/dist/parse/checkScriptsRunInCI.js +11 -171
  100. package/dist/parse/checkScriptsRunInCI.js.map +1 -1
  101. package/dist/parse/ciStepRecord.d.ts +4 -118
  102. package/dist/parse/ciStepRecord.d.ts.map +1 -1
  103. package/dist/parse/ciStepRecord.js +18 -225
  104. package/dist/parse/ciStepRecord.js.map +1 -1
  105. package/dist/parse/commandRuns.d.ts +0 -39
  106. package/dist/parse/commandRuns.d.ts.map +1 -1
  107. package/dist/parse/commandRuns.js +6 -67
  108. package/dist/parse/commandRuns.js.map +1 -1
  109. package/dist/parse/cucumber.d.ts +0 -53
  110. package/dist/parse/cucumber.d.ts.map +1 -1
  111. package/dist/parse/cucumber.js +42 -146
  112. package/dist/parse/cucumber.js.map +1 -1
  113. package/dist/parse/discoveryScope.d.ts +1 -46
  114. package/dist/parse/discoveryScope.d.ts.map +1 -1
  115. package/dist/parse/discoveryScope.js +2 -57
  116. package/dist/parse/discoveryScope.js.map +1 -1
  117. package/dist/parse/fitnessCitations.d.ts +1 -72
  118. package/dist/parse/fitnessCitations.d.ts.map +1 -1
  119. package/dist/parse/fitnessCitations.js +3 -55
  120. package/dist/parse/fitnessCitations.js.map +1 -1
  121. package/dist/parse/reconcilerSteps.d.ts +0 -46
  122. package/dist/parse/reconcilerSteps.d.ts.map +1 -1
  123. package/dist/parse/reconcilerSteps.js +2 -64
  124. package/dist/parse/reconcilerSteps.js.map +1 -1
  125. package/dist/parse/runningFitnessFunctions.d.ts +9 -0
  126. package/dist/parse/runningFitnessFunctions.d.ts.map +1 -0
  127. package/dist/parse/runningFitnessFunctions.js +57 -0
  128. package/dist/parse/runningFitnessFunctions.js.map +1 -0
  129. package/dist/parse/scenarioCodeErrors.d.ts +11 -0
  130. package/dist/parse/scenarioCodeErrors.d.ts.map +1 -0
  131. package/dist/parse/scenarioCodeErrors.js +78 -0
  132. package/dist/parse/scenarioCodeErrors.js.map +1 -0
  133. package/dist/parse/scenarios.d.ts +3 -228
  134. package/dist/parse/scenarios.d.ts.map +1 -1
  135. package/dist/parse/scenarios.js +20 -457
  136. package/dist/parse/scenarios.js.map +1 -1
  137. package/dist/parse/stepAccounting.d.ts +0 -46
  138. package/dist/parse/stepAccounting.d.ts.map +1 -1
  139. package/dist/parse/stepAccounting.js +1 -55
  140. package/dist/parse/stepAccounting.js.map +1 -1
  141. package/dist/parse/stepExclusions.d.ts +0 -47
  142. package/dist/parse/stepExclusions.d.ts.map +1 -1
  143. package/dist/parse/stepExclusions.js +2 -50
  144. package/dist/parse/stepExclusions.js.map +1 -1
  145. package/dist/parse/stepNames.d.ts +0 -27
  146. package/dist/parse/stepNames.d.ts.map +1 -1
  147. package/dist/parse/stepNames.js +0 -27
  148. package/dist/parse/stepNames.js.map +1 -1
  149. package/dist/parse/targetCorpus.d.ts +1 -78
  150. package/dist/parse/targetCorpus.d.ts.map +1 -1
  151. package/dist/parse/targetCorpus.js +4 -46
  152. package/dist/parse/targetCorpus.js.map +1 -1
  153. package/dist/parse/targetManifest.d.ts +8 -146
  154. package/dist/parse/targetManifest.d.ts.map +1 -1
  155. package/dist/parse/targetManifest.js +48 -198
  156. package/dist/parse/targetManifest.js.map +1 -1
  157. package/dist/parse/vitest.d.ts +0 -60
  158. package/dist/parse/vitest.d.ts.map +1 -1
  159. package/dist/parse/vitest.js +4 -83
  160. package/dist/parse/vitest.js.map +1 -1
  161. package/dist/provenance/provenance.d.ts +2 -110
  162. package/dist/provenance/provenance.d.ts.map +1 -1
  163. package/dist/provenance/provenance.js +2 -58
  164. package/dist/provenance/provenance.js.map +1 -1
  165. package/dist/render/behaviouralRunners.d.ts +0 -29
  166. package/dist/render/behaviouralRunners.d.ts.map +1 -1
  167. package/dist/render/behaviouralRunners.js +6 -69
  168. package/dist/render/behaviouralRunners.js.map +1 -1
  169. package/dist/render/configurationNotRead.d.ts +3 -0
  170. package/dist/render/configurationNotRead.d.ts.map +1 -0
  171. package/dist/render/configurationNotRead.js +17 -0
  172. package/dist/render/configurationNotRead.js.map +1 -0
  173. package/dist/render/discoveryScope.d.ts +0 -37
  174. package/dist/render/discoveryScope.d.ts.map +1 -1
  175. package/dist/render/discoveryScope.js +3 -39
  176. package/dist/render/discoveryScope.js.map +1 -1
  177. package/dist/render/evidenceGrid.d.ts +1 -35
  178. package/dist/render/evidenceGrid.d.ts.map +1 -1
  179. package/dist/render/evidenceGrid.js +21 -103
  180. package/dist/render/evidenceGrid.js.map +1 -1
  181. package/dist/render/excludedSteps.d.ts +0 -26
  182. package/dist/render/excludedSteps.d.ts.map +1 -1
  183. package/dist/render/excludedSteps.js +4 -32
  184. package/dist/render/excludedSteps.js.map +1 -1
  185. package/dist/render/fitnessFunctions.d.ts +3 -0
  186. package/dist/render/fitnessFunctions.d.ts.map +1 -0
  187. package/dist/render/fitnessFunctions.js +12 -0
  188. package/dist/render/fitnessFunctions.js.map +1 -0
  189. package/dist/render/json.d.ts +0 -11
  190. package/dist/render/json.d.ts.map +1 -1
  191. package/dist/render/json.js +0 -11
  192. package/dist/render/json.js.map +1 -1
  193. package/dist/render/markdown.d.ts +1 -55
  194. package/dist/render/markdown.d.ts.map +1 -1
  195. package/dist/render/markdown.js +128 -467
  196. package/dist/render/markdown.js.map +1 -1
  197. package/dist/render/provenanceSection.d.ts +0 -22
  198. package/dist/render/provenanceSection.d.ts.map +1 -1
  199. package/dist/render/provenanceSection.js +10 -53
  200. package/dist/render/provenanceSection.js.map +1 -1
  201. package/dist/render/reconcilerSteps.d.ts +0 -25
  202. package/dist/render/reconcilerSteps.d.ts.map +1 -1
  203. package/dist/render/reconcilerSteps.js +5 -30
  204. package/dist/render/reconcilerSteps.js.map +1 -1
  205. package/dist/render/runVerdict.d.ts +0 -38
  206. package/dist/render/runVerdict.d.ts.map +1 -1
  207. package/dist/render/runVerdict.js +62 -129
  208. package/dist/render/runVerdict.js.map +1 -1
  209. package/dist/render/scenarioCodeErrorsSection.d.ts +3 -0
  210. package/dist/render/scenarioCodeErrorsSection.d.ts.map +1 -0
  211. package/dist/render/scenarioCodeErrorsSection.js +45 -0
  212. package/dist/render/scenarioCodeErrorsSection.js.map +1 -0
  213. package/dist/render/stepAccounting.d.ts +0 -36
  214. package/dist/render/stepAccounting.d.ts.map +1 -1
  215. package/dist/render/stepAccounting.js +5 -49
  216. package/dist/render/stepAccounting.js.map +1 -1
  217. package/dist/render/testVolume.d.ts +0 -25
  218. package/dist/render/testVolume.d.ts.map +1 -1
  219. package/dist/render/testVolume.js +4 -35
  220. package/dist/render/testVolume.js.map +1 -1
  221. package/package.json +4 -1
  222. package/dist/domain/checkCharacteristics.d.ts +0 -88
  223. package/dist/domain/checkCharacteristics.d.ts.map +0 -1
  224. package/dist/domain/checkCharacteristics.js +0 -109
  225. package/dist/domain/checkCharacteristics.js.map +0 -1
  226. package/dist/domain/fitnessChecks.d.ts +0 -79
  227. package/dist/domain/fitnessChecks.d.ts.map +0 -1
  228. package/dist/domain/fitnessChecks.js +0 -81
  229. package/dist/domain/fitnessChecks.js.map +0 -1
  230. package/dist/domain/qualityCheckFaultMessages.d.ts +0 -43
  231. package/dist/domain/qualityCheckFaultMessages.d.ts.map +0 -1
  232. package/dist/domain/qualityCheckFaultMessages.js +0 -38
  233. package/dist/domain/qualityCheckFaultMessages.js.map +0 -1
  234. package/dist/lib/featureCode.d.ts +0 -21
  235. package/dist/lib/featureCode.d.ts.map +0 -1
  236. package/dist/lib/featureCode.js +0 -24
  237. package/dist/lib/featureCode.js.map +0 -1
  238. package/dist/parse/corpusCodeFaults.d.ts +0 -76
  239. package/dist/parse/corpusCodeFaults.d.ts.map +0 -1
  240. package/dist/parse/corpusCodeFaults.js +0 -121
  241. package/dist/parse/corpusCodeFaults.js.map +0 -1
  242. package/dist/parse/corpusFaults.d.ts +0 -124
  243. package/dist/parse/corpusFaults.d.ts.map +0 -1
  244. package/dist/parse/corpusFaults.js +0 -72
  245. package/dist/parse/corpusFaults.js.map +0 -1
  246. package/dist/parse/corpusGrammarFaults.d.ts +0 -71
  247. package/dist/parse/corpusGrammarFaults.d.ts.map +0 -1
  248. package/dist/parse/corpusGrammarFaults.js +0 -292
  249. package/dist/parse/corpusGrammarFaults.js.map +0 -1
  250. package/dist/parse/runningStaticChecks.d.ts +0 -125
  251. package/dist/parse/runningStaticChecks.d.ts.map +0 -1
  252. package/dist/parse/runningStaticChecks.js +0 -316
  253. package/dist/parse/runningStaticChecks.js.map +0 -1
  254. package/dist/render/staticChecks.d.ts +0 -23
  255. package/dist/render/staticChecks.d.ts.map +0 -1
  256. package/dist/render/staticChecks.js +0 -69
  257. package/dist/render/staticChecks.js.map +0 -1
@@ -1,26 +1,5 @@
1
- /**
2
- * The `ingest/cucumber` reader — the second named observed-evidence reader.
3
- * Reads Cucumber-JS's JSON formatter output and normalises each scenario that
4
- * carries an @SCN tag into an EvidenceObservation, LEVELLED by the scenario's own
5
- * tier tag (@integration / @e2e / @performance).
6
- *
7
- * The level is DERIVED from the cited scenario's own tier tag, NOT from the input
8
- * source (Cucumber-as-orchestrator-across-levels: the scenario NAMES its tier by tag, cucumber
9
- * runs whichever). An @e2e scenario proven via cucumber yields an e2e observation. The
10
- * caller-supplied level (the JS-ecosystem default, integration, set at the CLI edge)
11
- * survives only as the fallback for an UNTAGGED scenario. The reader classifies FOUR-WAY
12
- * (@SCN-PND-013, extended by @SCN-LDG-019): any AMBIGUOUS step → a `broken` observation (a broken
13
- * harness — two step definitions match, so the step cannot run); any failed step → a `failed`
14
- * observation; all passed → a `passed` observation; otherwise INCONCLUSIVE (undefined/pending/
15
- * skipped) → the scenario is DROPPED (no observation), so its obligation reconciles missing by
16
- * absence — pending is never inferred from status.
17
- *
18
- * Parent: @SCN-LDG-011 (the tag-derivation headline) over @SCN-LDG-001 (the foundation seam).
19
- */
20
1
  import type { RuntimeQualityCheck, EvidenceObservation } from "../model.js";
21
- /** The minimal shape of Cucumber-JS's JSON formatter output this reader depends on. */
22
2
  export type CucumberJsonReport = Array<{
23
- /** The feature-file path (`uri`) / `name` — the locator for the evidenceObservations reconciliation. */
24
3
  uri?: string;
25
4
  name?: string;
26
5
  elements?: Array<{
@@ -28,21 +7,8 @@ export type CucumberJsonReport = Array<{
28
7
  name?: string;
29
8
  }>;
30
9
  steps?: Array<{
31
- /**
32
- * The step's Gherkin keyword and text (@SCN-LDG-019) — previously unread. An AMBIGUOUS step
33
- * carries no `error_message` (its result object is exactly `{ status, duration }`), so the
34
- * reader has nothing to quote: it must NAME the step itself, from these two fields, when it
35
- * synthesises the broken observation's what-broke message.
36
- */
37
10
  keyword?: string;
38
11
  name?: string;
39
- /**
40
- * A HOOK rather than one of the scenario's own steps (@SCN-LNT-026). Cucumber emits every
41
- * `Before` / `After` it ran as a step of the scenario, marked `hidden` and carrying its own
42
- * status — so a reader asking "what did the report say about this SCENARIO" has to know
43
- * which entries the corpus actually wrote. This reader does not: a hook that fails or is
44
- * skipped alters what the scenario's steps then read, which is signal it already has.
45
- */
46
12
  hidden?: boolean;
47
13
  result?: {
48
14
  status?: string;
@@ -51,24 +17,5 @@ export type CucumberJsonReport = Array<{
51
17
  }>;
52
18
  }>;
53
19
  }>;
54
- /**
55
- * Which tag on a REPORTED scenario is its `@SCN`.
56
- *
57
- * IT USED TO BE EXPORTED FOR A SECOND READER OF THIS SAME DOCUMENT — the fitness pass's own
58
- * cucumber report, read by `convertedFitnessCredits` (@SCN-LNT-021). That pass and that reader went
59
- * at 3F-3272: the converted checks' credits come off the CI run's own step record now, whose key IS
60
- * the code, so nothing there has a tag line to read. The export stands because the corpus reader
61
- * beside it takes the same pattern.
62
- */
63
- export declare const SCN_TAG: RegExp;
64
- /**
65
- * Parse a Cucumber JSON report into observed results, each levelled by DERIVING it from the
66
- * cited scenario's own tier tag (falling back to `fallbackQualityCheck` for an untagged
67
- * scenario). One result per scenario: those carrying an @SCN tag cite that scenario; those with
68
- * NO @SCN tag emit a null-scnId credit (@SCN-LDG-007 — previously DROPPED). A null-scnId credit
69
- * cites no scenario, so the reconciler folds it into the SUSPENSE row. A scenario is classified
70
- * THREE-WAY (@SCN-PND-013): passed (all steps passed) / failed (any step failed) / INCONCLUSIVE
71
- * (otherwise) — an inconclusive scenario emits NOTHING, dropped so it reconciles missing by absence.
72
- */
73
20
  export declare function parseCucumberEvidenceObservations(report: CucumberJsonReport, fallbackQualityCheck: RuntimeQualityCheck, root?: string): EvidenceObservation[];
74
21
  //# sourceMappingURL=cucumber.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cucumber.d.ts","sourceRoot":"","sources":["../../src/parse/cucumber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAkB,MAAM,aAAa,CAAC;AAG5F,uFAAuF;AACvF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC;IACrC,wGAAwG;IACxG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,IAAI,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAChC,KAAK,CAAC,EAAE,KAAK,CAAC;YACZ;;;;;eAKG;YACH,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd;;;;;;eAMG;YACH,MAAM,CAAC,EAAE,OAAO,CAAC;YACjB,MAAM,CAAC,EAAE;gBAAE,MAAM,CAAC,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACjD,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,QAA4B,CAAC;AAiEjD;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,kBAAkB,EAC1B,oBAAoB,EAAE,mBAAmB,EACzC,IAAI,CAAC,EAAE,MAAM,GACZ,mBAAmB,EAAE,CAwEvB"}
1
+ {"version":3,"file":"cucumber.d.ts","sourceRoot":"","sources":["../../src/parse/cucumber.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAkB,MAAM,aAAa,CAAC;AAK5F,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,IAAI,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAChC,KAAK,CAAC,EAAE,KAAK,CAAC;YACZ,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,MAAM,CAAC,EAAE,OAAO,CAAC;YACjB,MAAM,CAAC,EAAE;gBAAE,MAAM,CAAC,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACjD,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ,CAAC,CAAC;AA4BH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,kBAAkB,EAC1B,oBAAoB,EAAE,mBAAmB,EACzC,IAAI,CAAC,EAAE,MAAM,GACZ,mBAAmB,EAAE,CASvB"}
@@ -1,61 +1,8 @@
1
- /**
2
- * The `ingest/cucumber` reader — the second named observed-evidence reader.
3
- * Reads Cucumber-JS's JSON formatter output and normalises each scenario that
4
- * carries an @SCN tag into an EvidenceObservation, LEVELLED by the scenario's own
5
- * tier tag (@integration / @e2e / @performance).
6
- *
7
- * The level is DERIVED from the cited scenario's own tier tag, NOT from the input
8
- * source (Cucumber-as-orchestrator-across-levels: the scenario NAMES its tier by tag, cucumber
9
- * runs whichever). An @e2e scenario proven via cucumber yields an e2e observation. The
10
- * caller-supplied level (the JS-ecosystem default, integration, set at the CLI edge)
11
- * survives only as the fallback for an UNTAGGED scenario. The reader classifies FOUR-WAY
12
- * (@SCN-PND-013, extended by @SCN-LDG-019): any AMBIGUOUS step → a `broken` observation (a broken
13
- * harness — two step definitions match, so the step cannot run); any failed step → a `failed`
14
- * observation; all passed → a `passed` observation; otherwise INCONCLUSIVE (undefined/pending/
15
- * skipped) → the scenario is DROPPED (no observation), so its obligation reconciles missing by
16
- * absence — pending is never inferred from status.
17
- *
18
- * Parent: @SCN-LDG-011 (the tag-derivation headline) over @SCN-LDG-001 (the foundation seam).
19
- */
20
1
  import { relativizeToRoot } from "../lib/portablePath.js";
21
- /**
22
- * Which tag on a REPORTED scenario is its `@SCN`.
23
- *
24
- * IT USED TO BE EXPORTED FOR A SECOND READER OF THIS SAME DOCUMENT — the fitness pass's own
25
- * cucumber report, read by `convertedFitnessCredits` (@SCN-LNT-021). That pass and that reader went
26
- * at 3F-3272: the converted checks' credits come off the CI run's own step record now, whose key IS
27
- * the code, so nothing there has a tag line to read. The export stands because the corpus reader
28
- * beside it takes the same pattern.
29
- */
30
- export const SCN_TAG = /^@?(SCN-[A-Z0-9]+-\d+)$/;
31
- /**
32
- * The non-unit runtime tiers a scenario can NAME by tag. A cucumber observation's
33
- * level is DERIVED from the cited scenario's own tier tag — the product thesis
34
- * of Cucumber-as-orchestrator-ACROSS-levels: the scenario names its tier (@integration /
35
- * @e2e / @performance) and cucumber runs whichever, so an @e2e scenario proven via cucumber
36
- * yields an e2e observation. `@unit` is deliberately NOT here: unit is the vitest substrate,
37
- * and a cucumber run genuinely exercises the integrated tiers, not isolation. The caller-supplied
38
- * `fallbackQualityCheck` survives only for a scenario carrying NO tier tag (the JS-ecosystem
39
- * default, set at the CLI edge).
40
- */
2
+ import { SCN_ID_SOURCE } from "../domain/featureCode.js";
3
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
4
+ const SCN_TAG = new RegExp(`^@?(${SCN_ID_SOURCE})$`);
41
5
  const TIER_TAG = /^@?(integration|e2e|performance)$/;
42
- /**
43
- * Derive the SET of levels a cucumber observation discharges from the cited scenario's own
44
- * tier tag(s), falling back to a single caller-supplied level when the scenario carries none.
45
- *
46
- * The MULTI-TAG RULE (@SCN-LDG-014, generalising @SCN-LDG-011): a cucumber observation discharges
47
- * EVERY non-unit runtime obligation its cited scenario raises. So a scenario naming
48
- * `@integration @e2e` yields TWO levels from a SINGLE cucumber pass (integration + e2e); the caller
49
- * emits one observation per level. A single-tier scenario yields exactly ONE level (LDG-011/012/013
50
- * — the single-tier instances of this rule); an untagged scenario yields the single fallback tier.
51
- * Duplicates are collapsed so a repeated tag never fans out an extra observation.
52
- *
53
- * Why discharging both is honest, not double-crediting (Evidence Manifesto §11): §11 complementarity
54
- * is scoped to `@unit`-vs-the-run (isolation vs the integrated system, DIFFERENT runners) — so `@unit`
55
- * still needs its own vitest observation. §11 does NOT bite WITHIN the cucumber tiers: one cucumber
56
- * execution genuinely exercises the integrated components AND the end-to-end journey (the journey
57
- * CONTAINS the integration), so covering both from the one run is truthful.
58
- */
59
6
  function deriveLevels(tags, fallbackQualityCheck) {
60
7
  const levels = [];
61
8
  for (const t of tags) {
@@ -63,109 +10,58 @@ function deriveLevels(tags, fallbackQualityCheck) {
63
10
  if (m) {
64
11
  const level = m[1];
65
12
  if (!levels.includes(level))
66
- levels.push(level); // dedup — one observation per distinct tier.
13
+ levels.push(level);
67
14
  }
68
15
  }
69
16
  return levels.length > 0 ? levels : [fallbackQualityCheck];
70
17
  }
71
- /**
72
- * SYNTHESISE the what-broke message of an ambiguous step's `broken` observation (@SCN-LDG-019).
73
- *
74
- * Cucumber emits NO `error_message` for an ambiguous step — its result object is exactly
75
- * `{ "status": "ambiguous", "duration": 0 }` (the "Multiple step definitions match: …" detail is
76
- * PRETTY-FORMATTER-ONLY, never in the JSON). So the reader cannot quote the runner as the vitest
77
- * reader does (which passes the collection error through VERBATIM); it must STATE THE DIAGNOSIS
78
- * itself, from the one thing the report does give: the step's keyword and text.
79
- *
80
- * It names WHAT BROKE — this step, matched by two or more step definitions, so it never ran. It
81
- * prescribes NO CURE: which of the colliding definitions is the wrong one is not the ledger's to
82
- * say.
83
- */
84
18
  function ambiguousMessage(step) {
85
19
  const text = `${(step.keyword ?? "").trim()} ${step.name ?? ""}`.trim();
86
- const named = text.length > 0 ? `The step "${text}"` : "A step";
87
- return `${named} is ambiguous — two or more step definitions match it, so the step never ran.`;
20
+ return text.length > 0
21
+ ? CORE_MESSAGES[CoreMessage.AmbiguousNamedStep](text)
22
+ : CORE_MESSAGES[CoreMessage.AmbiguousUnnamedStep];
88
23
  }
89
- /**
90
- * Parse a Cucumber JSON report into observed results, each levelled by DERIVING it from the
91
- * cited scenario's own tier tag (falling back to `fallbackQualityCheck` for an untagged
92
- * scenario). One result per scenario: those carrying an @SCN tag cite that scenario; those with
93
- * NO @SCN tag emit a null-scnId credit (@SCN-LDG-007 — previously DROPPED). A null-scnId credit
94
- * cites no scenario, so the reconciler folds it into the SUSPENSE row. A scenario is classified
95
- * THREE-WAY (@SCN-PND-013): passed (all steps passed) / failed (any step failed) / INCONCLUSIVE
96
- * (otherwise) — an inconclusive scenario emits NOTHING, dropped so it reconciles missing by absence.
97
- */
98
24
  export function parseCucumberEvidenceObservations(report, fallbackQualityCheck, root) {
99
25
  const results = [];
100
26
  for (const feature of report) {
101
- // The feature-file locator (the where-to-fix) — carried on every credit (ruling
102
- // Q5), made portable relative to the run root (verbatim without root).
103
- const locator = relativizeToRoot(feature.uri ?? feature.name ?? "(unknown feature)", root);
27
+ const locator = relativizeToRoot(feature.uri ?? feature.name ?? CORE_MESSAGES[CoreMessage.UnknownFeature], root);
104
28
  for (const scenario of feature.elements ?? []) {
105
- const tags = scenario.tags ?? [];
106
- const scnTag = tags
107
- .map((t) => SCN_TAG.exec(t.name ?? ""))
108
- .find((m) => m !== null);
109
- const steps = scenario.steps ?? [];
110
- // FOUR-WAY classification (@SCN-PND-013, extended by @SCN-LDG-019) — pending is NEVER
111
- // inferred from status. The DROP is what realises inconclusive→missing and the `broken`
112
- // FLAG is what realises ambiguous→suspense, so `EvidenceStatus` stays binary: no new
113
- // status, no reconciler change. The drop is WHOLE-SCENARIO — an inconclusive scenario emits
114
- // no observation at ANY named tier (the `continue` below). The statuses that stay dropped
115
- // stay honest: `undefined` (no step definition is written — the test genuinely IS absent),
116
- // `pending` (explicitly deferred), `skipped` (never ran).
117
- //
118
- // THE AMBIGUOUS ARM IS ORDERED FIRST (@SCN-LDG-019) because cucumber halts the scenario at
119
- // the ambiguous step — every step after it reads `skipped`, so the inconclusive drop would
120
- // otherwise swallow the ambiguity along with them. An ambiguous step is not a stub that
121
- // proved nothing but a BROKEN HARNESS: two step definitions match one step, so the proof
122
- // exists and cannot execute. Dropping it as inconclusive sent the reader the WRONG remedy —
123
- // write a test that already exists, rather than fix the colliding step definitions. It is
124
- // cucumber's instance of the `broken` outcome vitest's collection failure established
125
- // (@SCN-LDG-017): evidence that NEVER MATERIALISED.
126
- //
127
- // ONE observation for the whole scenario (never one per named tier): the harness broke ONCE,
128
- // so a multi-tier scenario posts ONE broken item, levelled at its first named tier. Unlike
129
- // vitest's collection failure (citation-less by construction — a file that fails to collect
130
- // names no test), this observation CARRIES the scnId: the cucumber scenario DID cite its
131
- // @SCN; only its step could not run. The reconciler's fail-safe checks `broken` BEFORE
132
- // `status`, so it can never discharge (or fail) the obligation it cites; it posts to the
133
- // SUSPENSE row and the obligation reconciles `missing` BY ABSENCE (pinned in
134
- // reconcile.test.ts [SCN-LDG-019], under BOTH status values).
135
- const ambiguous = steps.find((s) => s.result?.status === "ambiguous");
136
- if (ambiguous) {
137
- results.push({
138
- qualityCheck: deriveLevels(tags, fallbackQualityCheck)[0],
139
- scnId: scnTag ? scnTag[1] : null,
140
- // Structurally required, and the step certainly did not pass; the reconciler's fail-safe
141
- // checks `broken` BEFORE `status`, so this never reconciles as `failing`.
142
- status: "failed",
143
- locator,
144
- broken: true,
145
- message: ambiguousMessage(ambiguous),
146
- });
147
- continue;
148
- }
149
- const anyFailed = steps.some((s) => s.result?.status === "failed");
150
- const allPassed = steps.length > 0 && steps.every((s) => s.result?.status === "passed");
151
- if (!anyFailed && !allPassed)
152
- continue; // inconclusive → drop the whole scenario.
153
- const status = anyFailed ? "failed" : "passed";
154
- // One observation PER named non-unit tier: a cucumber run of an @integration @e2e
155
- // scenario discharges BOTH obligations, so it emits an integration AND an e2e observation
156
- // (the multi-tag ruling's teeth, @SCN-LDG-014). A single-tier or untagged scenario emits
157
- // exactly one. The levels are DERIVED from the scenario's own tier tags, not the input
158
- // source; the caller-supplied level is the fallback for an untagged scenario.
159
- for (const level of deriveLevels(tags, fallbackQualityCheck)) {
160
- results.push({
161
- qualityCheck: level,
162
- scnId: scnTag ? scnTag[1] : null, // no @SCN tag → an uncited credit (SUSPENSE).
163
- status,
164
- locator,
165
- });
166
- }
29
+ results.push(...scenarioObservations(scenario, locator, fallbackQualityCheck));
167
30
  }
168
31
  }
169
32
  return results;
170
33
  }
34
+ function citedScnIdOf(tags) {
35
+ const scnTag = tags
36
+ .map((t) => SCN_TAG.exec(t.name ?? ""))
37
+ .find((m) => m !== null);
38
+ return scnTag ? scnTag[1] : null;
39
+ }
40
+ function scenarioObservations(scenario, locator, fallbackQualityCheck) {
41
+ const tags = scenario.tags ?? [];
42
+ const scnId = citedScnIdOf(tags);
43
+ const steps = scenario.steps ?? [];
44
+ const ambiguous = steps.find((s) => s.result?.status === "ambiguous");
45
+ if (ambiguous) {
46
+ return [{
47
+ qualityCheck: deriveLevels(tags, fallbackQualityCheck)[0],
48
+ scnId,
49
+ status: "failed",
50
+ locator,
51
+ broken: true,
52
+ message: ambiguousMessage(ambiguous),
53
+ }];
54
+ }
55
+ const anyFailed = steps.some((s) => s.result?.status === "failed");
56
+ const allPassed = steps.length > 0 && steps.every((s) => s.result?.status === "passed");
57
+ if (!anyFailed && !allPassed)
58
+ return [];
59
+ const status = anyFailed ? "failed" : "passed";
60
+ return deriveLevels(tags, fallbackQualityCheck).map((level) => ({
61
+ qualityCheck: level,
62
+ scnId,
63
+ status,
64
+ locator,
65
+ }));
66
+ }
171
67
  //# sourceMappingURL=cucumber.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cucumber.js","sourceRoot":"","sources":["../../src/parse/cucumber.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cucumber.js","sourceRoot":"","sources":["../../src/parse/cucumber.ts"],"names":[],"mappings":"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"}
@@ -1,49 +1,4 @@
1
- /**
2
- * THE SCOPE DISCOVERY RANGED OVER (@SCN-USG-020, 3F-3343) — one entry per job of every workflow
3
- * `--ci` resolved: the file, the job, how many steps this run read from it, and how many of those
4
- * steps are candidate fitness checks.
5
- *
6
- * WHY THE REPORT SAYS IT AT ALL, AND WHY IT IS THE ANSWER RATHER THAN A CONSOLATION FOR NOT HAVING
7
- * ONE. This axis's analysis asked what the tool says when it is pointed somewhere that yields an
8
- * implausible answer — at a release workflow, or at one job of several. The answer is that it
9
- * makes NO judgement about plausibility and states its scope instead: a trigger-based or name-based
10
- * rule for "this looks like a release workflow" is exactly the judgement the ticket puts out of
11
- * scope, and it is a list of ours, which is the drift the whole inversion exists to remove. A
12
- * consumer reading the file, the job and the counts knows on sight, and corrects it by narrowing
13
- * `--ci` (@SCN-USG-008) or by naming the steps that are not checks (@SCN-USG-015).
14
- *
15
- * AND IT IS THE ANSWER TO THE QUIETER HALF — THE JOB THE TOOL NEVER LOOKED AT. The census reports
16
- * how many checks ran and nothing said how many jobs, in how many files, that number came from. A
17
- * consumer whose second job holds three checks reads exactly what a consumer with three checks in
18
- * one job reads, and neither figure can be got from the other.
19
- *
20
- * BOTH FIGURES PER JOB, because either alone is satisfiable by a reader wrong about the other, and
21
- * a job that reads its whole pipeline and contributes nothing is precisely the case a reader most
22
- * needs to see. A job every step of which something took out is reported with none, never dropped.
23
- *
24
- * THE CANDIDATE FIGURE IS THE OBSERVER'S OWN RULE, asked through `isCandidateStep`
25
- * (`parse/runningStaticChecks`) rather than restated here. A census re-deriving membership would
26
- * be measuring its own arithmetic — it would go on agreeing with the scope section while the books
27
- * beneath it said something else, which is the one disagreement a reader of this section cannot
28
- * see. Same walk, too (`ciWorkflowSteps`), so the two readers cannot come to disagree about which
29
- * steps a workflow even runs.
30
- *
31
- * NOT THE ACCOUNTING IDENTITY (@SCN-USG-018). That one asserts the dispositions sum to the steps
32
- * read, so nothing the reader saw was dropped; this one asserts the provenance — which files and
33
- * which jobs those steps came from. A reader satisfies either alone: a correct sum over a scope it
34
- * never names, or a named scope whose numbers do not add up.
35
- *
36
- * SORTED, so two runs over one tree cannot differ and a diff of two reports never turns on the
37
- * order a directory happened to be handed back in — the same reason `ciSourcePathsOf` sorts. The
38
- * sort is stable, so two jobs no name separates stay in the order their sources were read.
39
- *
40
- * NO FILESYSTEM, AND THE NAMES ARE INJECTED, for the reason `stepExclusions` states next door:
41
- * `ciSources` is an array of anonymous source strings and `ciSourcePaths.ts` is explicit that
42
- * keeping the core that way is the point. A source this run was given no name for is still a
43
- * source it READ, so its jobs keep their entries and lose only the half of their name nobody
44
- * supplied — the direction `reconcilerSteps` takes, and never a dropped row.
45
- */
46
1
  import { type CiWorkflowStep, type PackageJsonScripts } from "./checkScriptsRunInCI.js";
47
2
  import type { JobDiscoveryScope } from "../domain/evidenceReconciliation.js";
48
- export declare function discoveryScope(ciSources: readonly string[], ciSourceNames: readonly string[], packageJson: PackageJsonScripts, runners: Readonly<Record<string, string | null>>, isExcludedFromDiscovery?: (step: CiWorkflowStep) => boolean): readonly JobDiscoveryScope[];
3
+ export declare function discoveryScope(ciSources: readonly string[], ciSourceNames: readonly string[], packageJson: PackageJsonScripts, runners: Readonly<Record<string, string | null>>, isExcludedFromDiscovery: (step: CiWorkflowStep) => boolean): readonly JobDiscoveryScope[];
49
4
  //# sourceMappingURL=discoveryScope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discoveryScope.d.ts","sourceRoot":"","sources":["../../src/parse/discoveryScope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEzG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAY7E,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAChD,uBAAuB,GAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAqB,GACvE,SAAS,iBAAiB,EAAE,CAsB9B"}
1
+ {"version":3,"file":"discoveryScope.d.ts","sourceRoot":"","sources":["../../src/parse/discoveryScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEzG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAM7E,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAChD,uBAAuB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,GACzD,SAAS,iBAAiB,EAAE,CAiB9B"}
@@ -1,63 +1,11 @@
1
- /**
2
- * THE SCOPE DISCOVERY RANGED OVER (@SCN-USG-020, 3F-3343) — one entry per job of every workflow
3
- * `--ci` resolved: the file, the job, how many steps this run read from it, and how many of those
4
- * steps are candidate fitness checks.
5
- *
6
- * WHY THE REPORT SAYS IT AT ALL, AND WHY IT IS THE ANSWER RATHER THAN A CONSOLATION FOR NOT HAVING
7
- * ONE. This axis's analysis asked what the tool says when it is pointed somewhere that yields an
8
- * implausible answer — at a release workflow, or at one job of several. The answer is that it
9
- * makes NO judgement about plausibility and states its scope instead: a trigger-based or name-based
10
- * rule for "this looks like a release workflow" is exactly the judgement the ticket puts out of
11
- * scope, and it is a list of ours, which is the drift the whole inversion exists to remove. A
12
- * consumer reading the file, the job and the counts knows on sight, and corrects it by narrowing
13
- * `--ci` (@SCN-USG-008) or by naming the steps that are not checks (@SCN-USG-015).
14
- *
15
- * AND IT IS THE ANSWER TO THE QUIETER HALF — THE JOB THE TOOL NEVER LOOKED AT. The census reports
16
- * how many checks ran and nothing said how many jobs, in how many files, that number came from. A
17
- * consumer whose second job holds three checks reads exactly what a consumer with three checks in
18
- * one job reads, and neither figure can be got from the other.
19
- *
20
- * BOTH FIGURES PER JOB, because either alone is satisfiable by a reader wrong about the other, and
21
- * a job that reads its whole pipeline and contributes nothing is precisely the case a reader most
22
- * needs to see. A job every step of which something took out is reported with none, never dropped.
23
- *
24
- * THE CANDIDATE FIGURE IS THE OBSERVER'S OWN RULE, asked through `isCandidateStep`
25
- * (`parse/runningStaticChecks`) rather than restated here. A census re-deriving membership would
26
- * be measuring its own arithmetic — it would go on agreeing with the scope section while the books
27
- * beneath it said something else, which is the one disagreement a reader of this section cannot
28
- * see. Same walk, too (`ciWorkflowSteps`), so the two readers cannot come to disagree about which
29
- * steps a workflow even runs.
30
- *
31
- * NOT THE ACCOUNTING IDENTITY (@SCN-USG-018). That one asserts the dispositions sum to the steps
32
- * read, so nothing the reader saw was dropped; this one asserts the provenance — which files and
33
- * which jobs those steps came from. A reader satisfies either alone: a correct sum over a scope it
34
- * never names, or a named scope whose numbers do not add up.
35
- *
36
- * SORTED, so two runs over one tree cannot differ and a diff of two reports never turns on the
37
- * order a directory happened to be handed back in — the same reason `ciSourcePathsOf` sorts. The
38
- * sort is stable, so two jobs no name separates stay in the order their sources were read.
39
- *
40
- * NO FILESYSTEM, AND THE NAMES ARE INJECTED, for the reason `stepExclusions` states next door:
41
- * `ciSources` is an array of anonymous source strings and `ciSourcePaths.ts` is explicit that
42
- * keeping the core that way is the point. A source this run was given no name for is still a
43
- * source it READ, so its jobs keep their entries and lose only the half of their name nobody
44
- * supplied — the direction `reconcilerSteps` takes, and never a dropped row.
45
- */
46
1
  import { ciWorkflowSteps } from "./checkScriptsRunInCI.js";
47
- import { isCandidateStep } from "./runningStaticChecks.js";
48
- /**
49
- * BY SOURCE INDEX AND JOB, never by the source's NAME. Two sources this run was given no name for
50
- * are two files it read, and keying on the name would fold their same-named jobs into one entry —
51
- * a job the reader ranged over, gone from the account of what it ranged over.
52
- */
2
+ import { isCandidateStep } from "./runningFitnessFunctions.js";
53
3
  const keyOf = (step) => `${step.sourceIndex}:${step.jobId}`;
54
- export function discoveryScope(ciSources, ciSourceNames, packageJson, runners, isExcludedFromDiscovery = () => false) {
4
+ export function discoveryScope(ciSources, ciSourceNames, packageJson, runners, isExcludedFromDiscovery) {
55
5
  const tallies = new Map();
56
6
  for (const step of ciWorkflowSteps(ciSources)) {
57
7
  const source = ciSourceNames[step.sourceIndex];
58
8
  const tally = tallies.get(keyOf(step)) ?? {
59
- // Spread rather than a `source: undefined` assignment, so an entry for a source nobody named
60
- // carries no key at all — the shape an absent citation has everywhere else in this engine.
61
9
  ...(source !== undefined ? { source } : {}),
62
10
  job: step.jobId,
63
11
  steps: 0,
@@ -68,9 +16,6 @@ export function discoveryScope(ciSources, ciSourceNames, packageJson, runners, i
68
16
  tally.candidates += 1;
69
17
  tallies.set(keyOf(step), tally);
70
18
  }
71
- // BY FILE AND THEN BY JOB. A source with no name sorts ahead of every named one, which is a
72
- // settled place rather than a chosen one: it is what an absent name compares as, and the point
73
- // of the sort is that two runs over one tree agree.
74
19
  return [...tallies.values()].sort((a, b) => (a.source ?? "").localeCompare(b.source ?? "") || a.job.localeCompare(b.job));
75
20
  }
76
21
  //# sourceMappingURL=discoveryScope.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discoveryScope.js","sourceRoot":"","sources":["../../src/parse/discoveryScope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,EAAE,eAAe,EAAgD,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAM3D;;;;GAIG;AACH,MAAM,KAAK,GAAG,CAAC,IAAoB,EAAU,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;AAEpF,MAAM,UAAU,cAAc,CAC5B,SAA4B,EAC5B,aAAgC,EAChC,WAA+B,EAC/B,OAAgD,EAChD,0BAA6D,GAAG,EAAE,CAAC,KAAK;IAExE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI;YACxC,6FAA6F;YAC7F,2FAA2F;YAC3F,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,EAAE,IAAI,CAAC,KAAK;YACf,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,CAAC;SACd,CAAC;QACF,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACjB,IAAI,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,CAAC;YAAE,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,4FAA4F;IAC5F,+FAA+F;IAC/F,oDAAoD;IACpD,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CACvF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"discoveryScope.js","sourceRoot":"","sources":["../../src/parse/discoveryScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgD,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAK/D,MAAM,KAAK,GAAG,CAAC,IAAoB,EAAU,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;AAEpF,MAAM,UAAU,cAAc,CAC5B,SAA4B,EAC5B,aAAgC,EAChC,WAA+B,EAC/B,OAAgD,EAChD,uBAA0D;IAE1D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI;YACxC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,EAAE,IAAI,CAAC,KAAK;YACf,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,CAAC;SACd,CAAC;QACF,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACjB,IAAI,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,CAAC;YAAE,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CACvF,CAAC;AACJ,CAAC"}
@@ -1,76 +1,5 @@
1
- /**
2
- * THE CITATION SEAM'S SURVIVING ROUTE — a consumer's own CI step states the code of the configured
3
- * row it answers, and this reads that row back as what the run cites.
4
- *
5
- * THE TWO-HOP REGISTRY ROUTE THIS FILE ONCE ALSO HELD IS RETIRED (3F-3161, @SCN-LNT-017 — the last
6
- * registry-`scn` scenario: a registry entry naming a scenario that carries a different
7
- * characteristic cited nothing, and no scenario is left needing that resolution at all).
8
- * The retired registry module (hop 1, script handle → bare check tag) and this module's own
9
- * `fitnessCitations` / `citationOfScript` (hop 2, bare check tag → the corpus's `@SCN`) went with
10
- * it. Every check now either states its own row's code on its CI step, or is a converted
11
- * `@fitness` row read through `domain/fitnessChecks` directly. `citationOfCitedRow` — the `id:`
12
- * route (@SCN-LNT-031) — is the whole of what is left.
13
- *
14
- * NOT A HOP, AND THE DIFFERENCE IS WHERE IT STARTS. The retired hops resolved a runnable script
15
- * HANDLE into a scenario, because a handle does not know what it is for. An `id:` is not a handle:
16
- * it is the consumer SAYING which row this check answers — a citation, never a declaration — so
17
- * there is nothing to resolve. The row keyed by that code carries the characteristic, and both
18
- * terms come off one configured row rather than one being recovered from the other.
19
- *
20
- * IT REFINES, IT DOES NOT MANUFACTURE (@SCN-LNT-031, and 3F-3261's rule kept whole). A code no
21
- * configured row answers returns `null` rather than a citation half-assembled from the handle that
22
- * ran: an `id:` names a ROW and never a characteristic, and reaching for the script's name for the
23
- * missing half is the name-match this axis retired, in a new spelling. A step carrying no code at
24
- * all is the same answer for the same reason — the target has said nothing about that check, so its
25
- * run cites nothing and posts to suspense, which is the state a consumer starts in.
26
- *
27
- * BARED ON THE WAY IN, because a manifest's `scn` is stored bare and a workflow is hand-authored:
28
- * the one spelling rule this repository has (`lib/bareTerm`) is what keeps a code written with a
29
- * sigil or a stray space from being looked up under a key no row is filed at.
30
- */
31
- import type { FitnessCheckIndex } from "../domain/fitnessChecks.js";
32
- /**
33
- * WHAT A RUN CITES — both terms the seam resolved, not just the far one.
34
- *
35
- * The `@SCN` says WHICH ROW the credit posts to; the bare check tag says WHICH OBLIGATION on that
36
- * row it answers. Both are needed, because neither is unique on its own: a row may carry more than
37
- * one bare check tag, so two runs can honestly cite the same `@SCN` (@SCN-LNT-012), and answering
38
- * by `@SCN` alone hands the first credit found to every fitness obligation the row raises.
39
- *
40
- * THE TAG IS THE OBSERVATION'S OWN CHARACTERISTIC, which is why it is carried rather than looked up
41
- * again downstream. The obligation names the BARE tag its stepless scenario carries (`typecheck`);
42
- * the run knows only the RUNNABLE HANDLE that invoked it (`lint:complexity`). Those are two
43
- * vocabularies by design, and comparing them is name-match in a new spelling — it agrees only where
44
- * the words happen to coincide, which is the single unprefixed check. Resolving the tag HERE, where
45
- * the registry is already in hand, is what lets the reconciler compare like with like.
46
- */
47
1
  export interface ScriptCitation {
48
- /** The BARE check tag this handle runs (`complexity`) — the word an obligation names. */
49
- readonly checkTag: string;
50
- /** The `@SCN` of the fitness scenario carrying that check — the row the credit posts to. */
51
2
  readonly scnId: string;
52
3
  }
53
- /**
54
- * THE CONSUMER'S OWN CITATION — the configured row a code written on a CI check step names, read
55
- * back as what that step's run cites.
56
- *
57
- * NOT A HOP, AND THE DIFFERENCE IS WHERE IT STARTS — the same point the file's own docblock makes,
58
- * repeated here because this function is where it is proved. The retired hops resolved a runnable
59
- * script HANDLE into a scenario, because a handle does not know what it is for. An `id:` is not a
60
- * handle: it is the consumer SAYING which row this check answers — a citation, never a declaration
61
- * — so there is nothing to resolve. The row keyed by that code carries the characteristic, and both
62
- * terms come off one configured row rather than one being recovered from the other.
63
- *
64
- * IT REFINES, IT DOES NOT MANUFACTURE (@SCN-LNT-031, and 3F-3261's rule kept whole). A code no
65
- * configured row answers returns `null` rather than a citation half-assembled from the handle that
66
- * ran: an `id:` names a ROW and never a characteristic, and reaching for the script's name for the
67
- * missing half is the name-match this axis retired, in a new spelling. A step carrying no code at
68
- * all is the same answer for the same reason — the target has said nothing about that check, so its
69
- * run cites nothing and posts to suspense, which is the state a consumer starts in.
70
- *
71
- * BARED ON THE WAY IN, because a manifest's `scn` is stored bare and a workflow is hand-authored:
72
- * the one spelling rule this repository has (`lib/bareTerm`) is what keeps a code written with a
73
- * sigil or a stray space from being looked up under a key no row is filed at.
74
- */
75
- export declare function citationOfCitedRow(citedScn: string | undefined, fitnessChecks: FitnessCheckIndex): ScriptCitation | null;
4
+ export declare function citationOfCitedRow(citedScn: string | undefined): ScriptCitation | null;
76
5
  //# sourceMappingURL=fitnessCitations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fitnessCitations.d.ts","sourceRoot":"","sources":["../../src/parse/fitnessCitations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGpE;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,cAAc;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,aAAa,EAAE,iBAAiB,GAC/B,cAAc,GAAG,IAAI,CAKvB"}
1
+ {"version":3,"file":"fitnessCitations.d.ts","sourceRoot":"","sources":["../../src/parse/fitnessCitations.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAItF"}
@@ -1,61 +1,9 @@
1
- /**
2
- * THE CITATION SEAM'S SURVIVING ROUTE — a consumer's own CI step states the code of the configured
3
- * row it answers, and this reads that row back as what the run cites.
4
- *
5
- * THE TWO-HOP REGISTRY ROUTE THIS FILE ONCE ALSO HELD IS RETIRED (3F-3161, @SCN-LNT-017 — the last
6
- * registry-`scn` scenario: a registry entry naming a scenario that carries a different
7
- * characteristic cited nothing, and no scenario is left needing that resolution at all).
8
- * The retired registry module (hop 1, script handle → bare check tag) and this module's own
9
- * `fitnessCitations` / `citationOfScript` (hop 2, bare check tag → the corpus's `@SCN`) went with
10
- * it. Every check now either states its own row's code on its CI step, or is a converted
11
- * `@fitness` row read through `domain/fitnessChecks` directly. `citationOfCitedRow` — the `id:`
12
- * route (@SCN-LNT-031) — is the whole of what is left.
13
- *
14
- * NOT A HOP, AND THE DIFFERENCE IS WHERE IT STARTS. The retired hops resolved a runnable script
15
- * HANDLE into a scenario, because a handle does not know what it is for. An `id:` is not a handle:
16
- * it is the consumer SAYING which row this check answers — a citation, never a declaration — so
17
- * there is nothing to resolve. The row keyed by that code carries the characteristic, and both
18
- * terms come off one configured row rather than one being recovered from the other.
19
- *
20
- * IT REFINES, IT DOES NOT MANUFACTURE (@SCN-LNT-031, and 3F-3261's rule kept whole). A code no
21
- * configured row answers returns `null` rather than a citation half-assembled from the handle that
22
- * ran: an `id:` names a ROW and never a characteristic, and reaching for the script's name for the
23
- * missing half is the name-match this axis retired, in a new spelling. A step carrying no code at
24
- * all is the same answer for the same reason — the target has said nothing about that check, so its
25
- * run cites nothing and posts to suspense, which is the state a consumer starts in.
26
- *
27
- * BARED ON THE WAY IN, because a manifest's `scn` is stored bare and a workflow is hand-authored:
28
- * the one spelling rule this repository has (`lib/bareTerm`) is what keeps a code written with a
29
- * sigil or a stray space from being looked up under a key no row is filed at.
30
- */
31
1
  import { bareTerm } from "../lib/bareTerm.js";
32
- /**
33
- * THE CONSUMER'S OWN CITATION — the configured row a code written on a CI check step names, read
34
- * back as what that step's run cites.
35
- *
36
- * NOT A HOP, AND THE DIFFERENCE IS WHERE IT STARTS — the same point the file's own docblock makes,
37
- * repeated here because this function is where it is proved. The retired hops resolved a runnable
38
- * script HANDLE into a scenario, because a handle does not know what it is for. An `id:` is not a
39
- * handle: it is the consumer SAYING which row this check answers — a citation, never a declaration
40
- * — so there is nothing to resolve. The row keyed by that code carries the characteristic, and both
41
- * terms come off one configured row rather than one being recovered from the other.
42
- *
43
- * IT REFINES, IT DOES NOT MANUFACTURE (@SCN-LNT-031, and 3F-3261's rule kept whole). A code no
44
- * configured row answers returns `null` rather than a citation half-assembled from the handle that
45
- * ran: an `id:` names a ROW and never a characteristic, and reaching for the script's name for the
46
- * missing half is the name-match this axis retired, in a new spelling. A step carrying no code at
47
- * all is the same answer for the same reason — the target has said nothing about that check, so its
48
- * run cites nothing and posts to suspense, which is the state a consumer starts in.
49
- *
50
- * BARED ON THE WAY IN, because a manifest's `scn` is stored bare and a workflow is hand-authored:
51
- * the one spelling rule this repository has (`lib/bareTerm`) is what keeps a code written with a
52
- * sigil or a stray space from being looked up under a key no row is filed at.
53
- */
54
- export function citationOfCitedRow(citedScn, fitnessChecks) {
2
+ import { SCN_CODE } from "./scenarios.js";
3
+ export function citationOfCitedRow(citedScn) {
55
4
  if (citedScn === undefined)
56
5
  return null;
57
6
  const scnId = bareTerm(citedScn);
58
- const row = fitnessChecks.get(scnId);
59
- return row === undefined ? null : { checkTag: row.characteristic, scnId };
7
+ return SCN_CODE.test(scnId) ? { scnId } : null;
60
8
  }
61
9
  //# sourceMappingURL=fitnessCitations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fitnessCitations.js","sourceRoot":"","sources":["../../src/parse/fitnessCitations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAwB9C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAA4B,EAC5B,aAAgC;IAEhC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC;AAC5E,CAAC"}
1
+ {"version":3,"file":"fitnessCitations.js","sourceRoot":"","sources":["../../src/parse/fitnessCitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAM1C,MAAM,UAAU,kBAAkB,CAAC,QAA4B;IAC7D,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC"}