@3f-consulting/spec-controller-core 0.1.0-alpha.6 → 0.1.0-alpha.60

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 (249) 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 +29 -324
  5. package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
  6. package/dist/assemble/renderInput.d.ts +6 -72
  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 +10 -46
  11. package/dist/census/evidenceObligations.d.ts.map +1 -1
  12. package/dist/census/evidenceObligations.js +15 -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 +16 -386
  19. package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
  20. package/dist/domain/evidenceReconciliation.js +79 -375
  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 +7 -392
  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 +4 -328
  31. package/dist/domain/ledger.d.ts.map +1 -1
  32. package/dist/domain/ledger.js +11 -317
  33. package/dist/domain/ledger.js.map +1 -1
  34. package/dist/domain/messages.d.ts +191 -0
  35. package/dist/domain/messages.d.ts.map +1 -0
  36. package/dist/domain/messages.js +279 -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 +5 -102
  43. package/dist/domain/posting.d.ts.map +1 -1
  44. package/dist/domain/posting.js +3 -55
  45. package/dist/domain/posting.js.map +1 -1
  46. package/dist/domain/qualityCheckFault.d.ts +1 -41
  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 +5 -278
  51. package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
  52. package/dist/domain/qualityCheckReconciliation.js +53 -453
  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 +0 -205
  63. package/dist/domain/scenarioReconciliation.d.ts.map +1 -1
  64. package/dist/domain/scenarioReconciliation.js +1 -98
  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 +12 -38
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +6 -86
  77. package/dist/index.js.map +1 -1
  78. package/dist/internal.d.ts +3 -25
  79. package/dist/internal.d.ts.map +1 -1
  80. package/dist/internal.js +3 -93
  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 +0 -14
  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 +3 -151
  98. package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
  99. package/dist/parse/checkScriptsRunInCI.js +5 -143
  100. package/dist/parse/checkScriptsRunInCI.js.map +1 -1
  101. package/dist/parse/ciStepRecord.d.ts +2 -117
  102. package/dist/parse/ciStepRecord.d.ts.map +1 -1
  103. package/dist/parse/ciStepRecord.js +12 -218
  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 +0 -58
  108. package/dist/parse/commandRuns.js.map +1 -1
  109. package/dist/parse/cucumber.d.ts +0 -52
  110. package/dist/parse/cucumber.d.ts.map +1 -1
  111. package/dist/parse/cucumber.js +37 -143
  112. package/dist/parse/cucumber.js.map +1 -1
  113. package/dist/parse/discoveryScope.d.ts +0 -45
  114. package/dist/parse/discoveryScope.d.ts.map +1 -1
  115. package/dist/parse/discoveryScope.js +0 -55
  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 +0 -63
  124. package/dist/parse/reconcilerSteps.js.map +1 -1
  125. package/dist/parse/runningStaticChecks.d.ts +2 -118
  126. package/dist/parse/runningStaticChecks.d.ts.map +1 -1
  127. package/dist/parse/runningStaticChecks.js +14 -273
  128. package/dist/parse/runningStaticChecks.js.map +1 -1
  129. package/dist/parse/scenarioCodeErrors.d.ts +12 -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 +11 -447
  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 +0 -54
  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 +0 -45
  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 +47 -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 +1 -81
  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 +18 -100
  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/json.d.ts +0 -11
  186. package/dist/render/json.d.ts.map +1 -1
  187. package/dist/render/json.js +0 -11
  188. package/dist/render/json.js.map +1 -1
  189. package/dist/render/markdown.d.ts +0 -54
  190. package/dist/render/markdown.d.ts.map +1 -1
  191. package/dist/render/markdown.js +123 -463
  192. package/dist/render/markdown.js.map +1 -1
  193. package/dist/render/provenanceSection.d.ts +0 -22
  194. package/dist/render/provenanceSection.d.ts.map +1 -1
  195. package/dist/render/provenanceSection.js +10 -53
  196. package/dist/render/provenanceSection.js.map +1 -1
  197. package/dist/render/reconcilerSteps.d.ts +0 -25
  198. package/dist/render/reconcilerSteps.d.ts.map +1 -1
  199. package/dist/render/reconcilerSteps.js +5 -30
  200. package/dist/render/reconcilerSteps.js.map +1 -1
  201. package/dist/render/runVerdict.d.ts +0 -38
  202. package/dist/render/runVerdict.d.ts.map +1 -1
  203. package/dist/render/runVerdict.js +62 -129
  204. package/dist/render/runVerdict.js.map +1 -1
  205. package/dist/render/scenarioCodeErrorsSection.d.ts +3 -0
  206. package/dist/render/scenarioCodeErrorsSection.d.ts.map +1 -0
  207. package/dist/render/scenarioCodeErrorsSection.js +45 -0
  208. package/dist/render/scenarioCodeErrorsSection.js.map +1 -0
  209. package/dist/render/staticChecks.d.ts +0 -20
  210. package/dist/render/staticChecks.d.ts.map +1 -1
  211. package/dist/render/staticChecks.js +4 -61
  212. package/dist/render/staticChecks.js.map +1 -1
  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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenarioCodeErrorsSection.js","sourceRoot":"","sources":["../../src/render/scenarioCodeErrorsSection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,SAAS,OAAO,CAAC,CAAS,EAAE,IAAY;IACtC,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,UAA8C;IACpE,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACnF,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;IAClD,IAAI,YAAY,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAC5D,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,EACjE,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAClE,CAAC;IACF,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAChH,OAAO,aAAa,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,YAAY,KAAK,YAAY;QAAE,OAAO,aAAa,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,YAAY,GAAG,YAAY,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxG,OAAO,aAAa,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACzE,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC;IACzC,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,KAAK,GACT,MAAM,CAAC,MAAM,KAAK,CAAC;QACjB,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,oBAAoB,CAAC;QACjD,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvE,OAAO;QACL,OAAO;QACP,EAAE;QACF,aAAa,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC,KAAK,CAAC;QAC3D,EAAE;QACF,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;QAClE,EAAE;QACF,aAAa;QACb,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
@@ -1,23 +1,3 @@
1
- /**
2
- * THE STATIC-CHECK CENSUS a run banked — the counts line under Summary views, and the corpus's
3
- * half-converted checks beside it.
4
- *
5
- * Its own module rather than a section in `markdown.ts`, which sits at a `max-lines` exception —
6
- * and an exception excuses existing debt, never headroom. Moved out whole at 3F-3353, when the
7
- * behavioural-runner cut beside it needed the room; `runVerdict.ts` is the precedent, moved for
8
- * exactly this reason. NOTHING about the section changed in the move: same emitter, same lines,
9
- * same omit-when-absent.
10
- */
11
1
  import type { RenderInput } from "../assemble/renderInput.js";
12
- /**
13
- * Static checks (@SCN-USG-001) — the STATIC-check evidence observation side under
14
- * Summary views, the mirror of `### Test volume` on the runtime axis. Renders the counts line
15
- * (`N static check(s) run, K uncited static check(s)`) alone — a pure counts summary, symmetric with
16
- * `### Test volume` (2.4). The named count is implicit (`running − uncited`), so it
17
- * is no longer printed. The per-guard member detail lives in the rows (named → each
18
- * scenario's `@lint` sub-row; no-evidence-obligation → the suspense row's `cites-no-scenario` credit items), so
19
- * no list renders here. Omitted only when no static-check census is threaded (the back-compat path).
20
- * The counts read off the report's materialised `summary.staticChecks`.
21
- */
22
2
  export declare const staticChecksSection: (report: RenderInput) => string[];
23
3
  //# sourceMappingURL=staticChecks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"staticChecks.d.ts","sourceRoot":"","sources":["../../src/render/staticChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AA+B9D;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAyB/D,CAAC"}
1
+ {"version":3,"file":"staticChecks.d.ts","sourceRoot":"","sources":["../../src/render/staticChecks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,eAAO,MAAM,mBAAmB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAQ/D,CAAC"}
@@ -1,69 +1,12 @@
1
- /**
2
- * THE STATIC-CHECK CENSUS a run banked — the counts line under Summary views, and the corpus's
3
- * half-converted checks beside it.
4
- *
5
- * Its own module rather than a section in `markdown.ts`, which sits at a `max-lines` exception —
6
- * and an exception excuses existing debt, never headroom. Moved out whole at 3F-3353, when the
7
- * behavioural-runner cut beside it needed the room; `runVerdict.ts` is the precedent, moved for
8
- * exactly this reason. NOTHING about the section changed in the move: same emitter, same lines,
9
- * same omit-when-absent.
10
- */
11
- /**
12
- * A BAR A CONFIGURED ROW STILL CARRIES (@SCN-LNT-035), named `fitnessChecks[<@SCN>].<key>` by the
13
- * resolver. Its line says something different from a retired top-level key's, because its
14
- * consequence is different: the row still reaches the books, credited by its own step's outcome;
15
- * only the number on it is unread.
16
- */
17
- const isRowBar = (key) => key.startsWith("fitnessChecks[");
18
- /**
19
- * THE RETIRED-KEY ACCOUNT (@SCN-USG-021) — one line per `specController.*` key this reader has
20
- * retired that the target's manifest still carries, naming the key and saying what became of it.
21
- *
22
- * THE LINE EXISTS BECAUSE THE ALTERNATIVE IS SILENCE, the same argument
23
- * `behaviouralRunners.ts`'s `unrecognisedKeyAccount` makes for a key the target INVENTED: a
24
- * consumer who wrote `checkRegistry` in good faith, when it was read, believes it still routes
25
- * their checks. Nothing reads it now — the entries it names reach no candidate and resolve no
26
- * citation — so the only remaining question is whether they get to find that out, and this is
27
- * the answer.
28
- */
29
- const retiredKeyAccount = (keys) => (keys ?? []).map((key) => `- specController.${key} — retired: ${isRowBar(key)
30
- ? "this reader no longer reads a row's bar, and the row is credited by its step's outcome."
31
- : "this reader no longer reads it, and none of its entries reach the books."}`);
32
- /**
33
- * Static checks (@SCN-USG-001) — the STATIC-check evidence observation side under
34
- * Summary views, the mirror of `### Test volume` on the runtime axis. Renders the counts line
35
- * (`N static check(s) run, K uncited static check(s)`) alone — a pure counts summary, symmetric with
36
- * `### Test volume` (2.4). The named count is implicit (`running − uncited`), so it
37
- * is no longer printed. The per-guard member detail lives in the rows (named → each
38
- * scenario's `@lint` sub-row; no-evidence-obligation → the suspense row's `cites-no-scenario` credit items), so
39
- * no list renders here. Omitted only when no static-check census is threaded (the back-compat path).
40
- * The counts read off the report's materialised `summary.staticChecks`.
41
- */
1
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
42
2
  export const staticChecksSection = (report) => {
43
- // THE HALF-CONVERTED CHECKS (@SCN-LNT-020) render HERE, under the same heading, because they are
44
- // the same class of half-entry as an uncited static check — something the run saw and nothing
45
- // owed — read off the other side of the books. FACTS ONLY, count and ids: the reader is told what
46
- // the corpus said about itself and left with the one remedy there is, which is to write the row.
47
- // OMIT-WHEN-EMPTY, so an unconverted corpus renders byte-identically to before.
48
- const { staticChecks: counts, unconfiguredFitnessScenarios: halfConverted = [] } = report.summary;
3
+ const { staticChecks: counts } = report.summary;
49
4
  if (!counts)
50
5
  return [];
51
- // THE RETIRED-KEY ACCOUNT (@SCN-USG-021) renders HERE, under the same heading, because a
52
- // retired key is a fact about the STATIC axis: every key this reader has retired so far named
53
- // a route onto this axis's books, never the runtime one. OMIT-WHEN-EMPTY, the same as every
54
- // account beside it.
55
- const retired = retiredKeyAccount(report.summary.retiredKeys);
56
- // A pure counts summary off `summary.staticChecks` (2.4) — symmetric with the
57
- // runtime `### Test volume` line. There is no census section: the per-guard DETAIL lives in
58
- // the rows (named → each scenario's `@lint` sub-row; the no-evidence-obligation static-checks surface
59
- // as `cites-no-scenario` credit items on the `(no scenario)` suspense row). Only the running
60
- // volume + the uncited count render here; the named count is implicit.
61
6
  return [
62
- "### Static checks", "",
63
- `${counts.runningStaticCheckCount} static check(s) run, ${counts.uncitedStaticCheckCount} uncited static check(s).`,
7
+ CORE_MESSAGES[CoreMessage.StaticChecksHeading], "",
8
+ CORE_MESSAGES[CoreMessage.StaticChecksCounts](counts.runningStaticCheckCount, counts.uncitedStaticCheckCount),
64
9
  "",
65
- ...(halfConverted.length > 0 ? [`${halfConverted.length} @fitness scenario(s) no configured row names: ${halfConverted.join(", ")}.`, ""] : []),
66
- ...(retired.length > 0 ? [...retired, ""] : []),
67
10
  ];
68
11
  };
69
12
  //# sourceMappingURL=staticChecks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"staticChecks.js","sourceRoot":"","sources":["../../src/render/staticChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,iBAAiB,GAAG,CAAC,IAAmC,EAAY,EAAE,CAC1E,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CACd,CAAC,GAAG,EAAE,EAAE,CACN,oBAAoB,GAAG,eACrB,QAAQ,CAAC,GAAG,CAAC;IACX,CAAC,CAAC,yFAAyF;IAC3F,CAAC,CAAC,0EACN,EAAE,CACL,CAAC;AAEJ;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACnE,iGAAiG;IACjG,8FAA8F;IAC9F,kGAAkG;IAClG,iGAAiG;IACjG,gFAAgF;IAChF,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,4BAA4B,EAAE,aAAa,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;IAClG,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,yFAAyF;IACzF,8FAA8F;IAC9F,4FAA4F;IAC5F,qBAAqB;IACrB,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9D,8EAA8E;IAC9E,4FAA4F;IAC5F,sGAAsG;IACtG,6FAA6F;IAC7F,uEAAuE;IACvE,OAAO;QACL,mBAAmB,EAAE,EAAE;QACvB,GAAG,MAAM,CAAC,uBAAuB,yBAAyB,MAAM,CAAC,uBAAuB,2BAA2B;QACnH,EAAE;QACF,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,kDAAkD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/I,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"staticChecks.js","sourceRoot":"","sources":["../../src/render/staticChecks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACnE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO;QACL,aAAa,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE,EAAE;QAClD,aAAa,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,CAAC;QAC7G,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
@@ -1,39 +1,3 @@
1
- /**
2
- * WHAT BECAME OF EVERY STEP THIS RUN READ (@SCN-USG-018) — the population, the four dispositions,
3
- * and whether they add back up to it.
4
- *
5
- * THE SECTION IS THIS AXIS'S FIRST NON-NEGOTIABLE MADE CHECKABLE. Nothing seen is dropped: a step
6
- * that reaches the reader leaves it as a candidate fitness check, as one of the runners the target
7
- * named, as the reconciler, or as a step the consumer called a non-check, and there is no fifth
8
- * outcome. Every section above this one names what a step BECAME, so a step that became nothing is
9
- * missing from none of them and every one reads exactly as it would have read had the step never
10
- * existed. This is the only cut of the report that can see an absence, and seeing absences is what
11
- * the whole axis is for.
12
- *
13
- * BOTH TOTALS, SIDE BY SIDE, AND THE SUM IS NOT THE READER'S TO MAKE. `Accounted for` is the
14
- * figure the count itself arrived at; a reader adding the four dispositions up for themselves
15
- * would be checking their own arithmetic against nothing, and would go on agreeing with a report
16
- * whose four figures had lost a step between them. Stated as a pair, the identity is something a
17
- * consumer reads rather than derives.
18
- *
19
- * A TABLE AND THEN A SENTENCE, because the two answer different readers. The row is what a
20
- * consumer compares against their own pipeline — four candidates and three non-checks is a claim
21
- * about their file they can check. The line under it is the verdict, and where the figures
22
- * disagree it names both of them, because a bare "does not balance" over numbers a reader has to
23
- * subtract for themselves is the report withholding the one thing it knows.
24
- *
25
- * Its own module rather than a further section in `markdown.ts`, which sits at a `max-lines`
26
- * exception — and an exception excuses existing debt, never headroom. The precedent is
27
- * `runVerdict.ts` and, along this axis, `discoveryScope.ts`, `behaviouralRunners.ts`,
28
- * `excludedSteps.ts` and `reconcilerSteps.ts`.
29
- */
30
1
  import type { RenderInput } from "../assemble/renderInput.js";
31
- /**
32
- * The accounting, or nothing at all.
33
- *
34
- * OMITTED WHERE THE RUN READ NO STEP, which is the only way the count can be empty: the section
35
- * appears wherever there is a pipeline to account for, and a run handed no CI configuration
36
- * renders byte-identically to before.
37
- */
38
2
  export declare const stepAccountingSection: (report: RenderInput) => string[];
39
3
  //# sourceMappingURL=stepAccounting.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stepAccounting.d.ts","sourceRoot":"","sources":["../../src/render/stepAccounting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAiB9D;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAcjE,CAAC"}
1
+ {"version":3,"file":"stepAccounting.d.ts","sourceRoot":"","sources":["../../src/render/stepAccounting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAS9D,eAAO,MAAM,qBAAqB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAcjE,CAAC"}
@@ -1,60 +1,16 @@
1
- /**
2
- * WHAT BECAME OF EVERY STEP THIS RUN READ (@SCN-USG-018) — the population, the four dispositions,
3
- * and whether they add back up to it.
4
- *
5
- * THE SECTION IS THIS AXIS'S FIRST NON-NEGOTIABLE MADE CHECKABLE. Nothing seen is dropped: a step
6
- * that reaches the reader leaves it as a candidate fitness check, as one of the runners the target
7
- * named, as the reconciler, or as a step the consumer called a non-check, and there is no fifth
8
- * outcome. Every section above this one names what a step BECAME, so a step that became nothing is
9
- * missing from none of them and every one reads exactly as it would have read had the step never
10
- * existed. This is the only cut of the report that can see an absence, and seeing absences is what
11
- * the whole axis is for.
12
- *
13
- * BOTH TOTALS, SIDE BY SIDE, AND THE SUM IS NOT THE READER'S TO MAKE. `Accounted for` is the
14
- * figure the count itself arrived at; a reader adding the four dispositions up for themselves
15
- * would be checking their own arithmetic against nothing, and would go on agreeing with a report
16
- * whose four figures had lost a step between them. Stated as a pair, the identity is something a
17
- * consumer reads rather than derives.
18
- *
19
- * A TABLE AND THEN A SENTENCE, because the two answer different readers. The row is what a
20
- * consumer compares against their own pipeline — four candidates and three non-checks is a claim
21
- * about their file they can check. The line under it is the verdict, and where the figures
22
- * disagree it names both of them, because a bare "does not balance" over numbers a reader has to
23
- * subtract for themselves is the report withholding the one thing it knows.
24
- *
25
- * Its own module rather than a further section in `markdown.ts`, which sits at a `max-lines`
26
- * exception — and an exception excuses existing debt, never headroom. The precedent is
27
- * `runVerdict.ts` and, along this axis, `discoveryScope.ts`, `behaviouralRunners.ts`,
28
- * `excludedSteps.ts` and `reconcilerSteps.ts`.
29
- */
30
- /**
31
- * The verdict line — one sentence, and where the two totals disagree it states both.
32
- *
33
- * ONE SENTENCE FOR EITHER DISAGREEMENT, deliberately. A step accounted for as nothing and a step
34
- * accounted for twice are opposite faults, but the reader's next move is the same in both cases
35
- * and the figures already say which it is: a second sentence would be a branch nothing in this
36
- * repository can reach, kept alive to describe a case the guards on the count forbid.
37
- */
1
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
38
2
  const verdictOf = ({ stepsRead, accountedFor }) => accountedFor === stepsRead
39
- ? "- every step this run read is accounted for."
40
- : `- ${stepsRead} step(s) read, ${accountedFor} accounted for — the four dispositions do not ` +
41
- `add up to the steps this run read.`;
42
- /**
43
- * The accounting, or nothing at all.
44
- *
45
- * OMITTED WHERE THE RUN READ NO STEP, which is the only way the count can be empty: the section
46
- * appears wherever there is a pipeline to account for, and a run handed no CI configuration
47
- * renders byte-identically to before.
48
- */
3
+ ? `- ${CORE_MESSAGES[CoreMessage.EveryStepAccountedFor]}`
4
+ : `- ${CORE_MESSAGES[CoreMessage.StepsNotAccountedFor](stepsRead, accountedFor)}`;
49
5
  export const stepAccountingSection = (report) => {
50
6
  const accounting = report.summary.stepAccounting;
51
7
  if (accounting === undefined)
52
8
  return [];
53
9
  const { stepsRead, candidates, runners, reconciler, excluded, accountedFor } = accounting;
54
10
  return [
55
- "### Step accounting",
11
+ CORE_MESSAGES[CoreMessage.StepAccountingHeading],
56
12
  "",
57
- "| Steps read | Candidates | Runners | Reconciler | Excluded | Accounted for |",
13
+ CORE_MESSAGES[CoreMessage.StepAccountingTableHeader],
58
14
  "| --- | --- | --- | --- | --- | --- |",
59
15
  `| ${stepsRead} | ${candidates} | ${runners} | ${reconciler} | ${excluded} | ${accountedFor} |`,
60
16
  "",
@@ -1 +1 @@
1
- {"version":3,"file":"stepAccounting.js","sourceRoot":"","sources":["../../src/render/stepAccounting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH;;;;;;;GAOG;AACH,MAAM,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAkB,EAAU,EAAE,CACxE,YAAY,KAAK,SAAS;IACxB,CAAC,CAAC,8CAA8C;IAChD,CAAC,CAAC,KAAK,SAAS,kBAAkB,YAAY,gDAAgD;QAC5F,oCAAoC,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;IACjD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;IAC1F,OAAO;QACL,qBAAqB;QACrB,EAAE;QACF,+EAA+E;QAC/E,uCAAuC;QACvC,KAAK,SAAS,MAAM,UAAU,MAAM,OAAO,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAY,IAAI;QAC/F,EAAE;QACF,SAAS,CAAC,UAAU,CAAC;QACrB,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"stepAccounting.js","sourceRoot":"","sources":["../../src/render/stepAccounting.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAkB,EAAU,EAAE,CACxE,YAAY,KAAK,SAAS;IACxB,CAAC,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE;IACzD,CAAC,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;AAEtF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;IACjD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;IAC1F,OAAO;QACL,aAAa,CAAC,WAAW,CAAC,qBAAqB,CAAC;QAChD,EAAE;QACF,aAAa,CAAC,WAAW,CAAC,yBAAyB,CAAC;QACpD,uCAAuC;QACvC,KAAK,SAAS,MAAM,UAAU,MAAM,OAAO,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAY,IAAI;QAC/F,EAAE;QACF,SAAS,CAAC,UAAU,CAAC;QACrB,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
@@ -1,28 +1,3 @@
1
- /**
2
- * THE RUNTIME TEST-VOLUME CENSUS a run banked — the `### Test volume` cut under Summary views.
3
- *
4
- * Its own module rather than a section in `markdown.ts`, which sits at a `max-lines` exception —
5
- * and an exception excuses existing debt, never headroom. Moved out whole at @SCN-USG-015, when
6
- * the excluded-step cut beside it needed the room; `runVerdict.ts`, `staticChecks.ts` and
7
- * `behaviouralRunners.ts` are the precedent, each moved for exactly this reason. It goes out
8
- * BESIDE `staticChecks.ts` deliberately: that module's own header already calls this section its
9
- * mirror on the runtime axis, and the two now sit where a reader looking for either finds both.
10
- * NOTHING about the section changed in the move: same emitter, same lines, same omit-when-absent.
11
- */
12
1
  import type { RenderInput } from "../assemble/renderInput.js";
13
- /**
14
- * Test volume (@SCN-RPT-010) — the evidence-observation side under Summary views, the
15
- * counterpart to the Evidence reconciliation' evidence-obligation side. Renders the balancing identity
16
- * (`N evidence observations = a on scenarios + b on phantom scenarios + c on the suspense scenario`,
17
- * a DERIVED view of the retained aggregate, grouped by the SCENARIO-KIND each credit posted to)
18
- * then the per-quality-check evidence observation table
19
- * (all four runtime quality-checks, zeros shown — a fixed tally like Evidence reconciliation).
20
- * Omitted only when no evidence-observation read is threaded (the 3-arg back-compat path). The
21
- * identity holds BY CONSTRUCTION (one shared pass in src/evidenceObservations.ts); the renderer
22
- * only sums what the aggregate already counted by kind. Quality-checks read as their tag words,
23
- * lowercase (the label-=-tag rule). The numbers read off the report's materialised
24
- * `summary.testVolume` + `summary.rawByRuntimeQualityCheck` (both Ledger folds, 3F-2103 — the
25
- * `evidenceObservations` section retired).
26
- */
27
2
  export declare const testVolumeSection: (report: RenderInput) => string[];
28
3
  //# sourceMappingURL=testVolume.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testVolume.d.ts","sourceRoot":"","sources":["../../src/render/testVolume.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAyB7D,CAAC"}
1
+ {"version":3,"file":"testVolume.d.ts","sourceRoot":"","sources":["../../src/render/testVolume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,eAAO,MAAM,iBAAiB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAkB7D,CAAC"}
@@ -1,48 +1,17 @@
1
- /**
2
- * THE RUNTIME TEST-VOLUME CENSUS a run banked — the `### Test volume` cut under Summary views.
3
- *
4
- * Its own module rather than a section in `markdown.ts`, which sits at a `max-lines` exception —
5
- * and an exception excuses existing debt, never headroom. Moved out whole at @SCN-USG-015, when
6
- * the excluded-step cut beside it needed the room; `runVerdict.ts`, `staticChecks.ts` and
7
- * `behaviouralRunners.ts` are the precedent, each moved for exactly this reason. It goes out
8
- * BESIDE `staticChecks.ts` deliberately: that module's own header already calls this section its
9
- * mirror on the runtime axis, and the two now sit where a reader looking for either finds both.
10
- * NOTHING about the section changed in the move: same emitter, same lines, same omit-when-absent.
11
- */
12
1
  import { RUNTIME_QUALITY_CHECKS } from "../domain/ledger.js";
13
- /**
14
- * Test volume (@SCN-RPT-010) — the evidence-observation side under Summary views, the
15
- * counterpart to the Evidence reconciliation' evidence-obligation side. Renders the balancing identity
16
- * (`N evidence observations = a on scenarios + b on phantom scenarios + c on the suspense scenario`,
17
- * a DERIVED view of the retained aggregate, grouped by the SCENARIO-KIND each credit posted to)
18
- * then the per-quality-check evidence observation table
19
- * (all four runtime quality-checks, zeros shown — a fixed tally like Evidence reconciliation).
20
- * Omitted only when no evidence-observation read is threaded (the 3-arg back-compat path). The
21
- * identity holds BY CONSTRUCTION (one shared pass in src/evidenceObservations.ts); the renderer
22
- * only sums what the aggregate already counted by kind. Quality-checks read as their tag words,
23
- * lowercase (the label-=-tag rule). The numbers read off the report's materialised
24
- * `summary.testVolume` + `summary.rawByRuntimeQualityCheck` (both Ledger folds, 3F-2103 — the
25
- * `evidenceObservations` section retired).
26
- */
2
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
27
3
  export const testVolumeSection = (report) => {
28
4
  const volume = report.summary.testVolume;
29
5
  const raw = report.summary.rawByRuntimeQualityCheck;
30
6
  if (!volume || !raw)
31
7
  return [];
32
8
  const total = volume.totalEvidenceObservations;
33
- // Three DIRECT reads off the materialised kind-counts — the renderer does no arithmetic on this
34
- // line. The three terms are grouped by the SCENARIO-KIND each credit posted to (the canon
35
- // grouping): on scenarios (a scenario's account), on phantom scenarios (invented
36
- // phantom-scenario accounts — many can exist, hence the plural) and on the suspense scenario (the
37
- // one suspense account, singular — includes broken). The identity total = onScenario +
38
- // onPhantomScenario + onSuspenseScenario holds BY CONSTRUCTION (one shared runtimeObservationTally
39
- // fold), so the three printed terms cannot drift from the total.
40
9
  const lines = [
41
- "### Test volume",
10
+ CORE_MESSAGES[CoreMessage.TestVolumeHeading],
42
11
  "",
43
- `${total} evidence observations = ${volume.onScenario} on scenarios + ${volume.onPhantomScenario} on phantom scenarios + ${volume.onSuspenseScenario} on the suspense scenario.`,
12
+ CORE_MESSAGES[CoreMessage.TestVolumeSum](total, volume.onScenario, volume.onPhantomScenario, volume.onSuspenseScenario),
44
13
  "",
45
- "| Quality-check | Evidence observations |",
14
+ CORE_MESSAGES[CoreMessage.TestVolumeTableHeader],
46
15
  "| --- | --- |",
47
16
  ];
48
17
  for (const qualityCheck of RUNTIME_QUALITY_CHECKS) {
@@ -1 +1 @@
1
- {"version":3,"file":"testVolume.js","sourceRoot":"","sources":["../../src/render/testVolume.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAG7D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,yBAAyB,CAAC;IAC/C,gGAAgG;IAChG,0FAA0F;IAC1F,iFAAiF;IACjF,kGAAkG;IAClG,uFAAuF;IACvF,mGAAmG;IACnG,iEAAiE;IACjE,MAAM,KAAK,GAAG;QACZ,iBAAiB;QACjB,EAAE;QACF,GAAG,KAAK,4BAA4B,MAAM,CAAC,UAAU,mBAAmB,MAAM,CAAC,iBAAiB,2BAA2B,MAAM,CAAC,kBAAkB,4BAA4B;QAChL,EAAE;QACF,2CAA2C;QAC3C,eAAe;KAChB,CAAC;IACF,KAAK,MAAM,YAAY,IAAI,sBAAsB,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,KAAK,YAAY,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
1
+ {"version":3,"file":"testVolume.js","sourceRoot":"","sources":["../../src/render/testVolume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,yBAAyB,CAAC;IAC/C,MAAM,KAAK,GAAG;QACZ,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC;QAC5C,EAAE;QACF,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,kBAAkB,CAAC;QACvH,EAAE;QACF,aAAa,CAAC,WAAW,CAAC,qBAAqB,CAAC;QAChD,eAAe;KAChB,CAAC;IACF,KAAK,MAAM,YAAY,IAAI,sBAAsB,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,KAAK,YAAY,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@3f-consulting/spec-controller-core",
3
- "version": "0.1.0-alpha.6",
3
+ "version": "0.1.0-alpha.60",
4
4
  "description": "The pure, embeddable reconciliation core behind spec-controller — Gherkin/@SCN parse, the evidence model, reconcile primitives, and renderers. No CLI, no I/O.",
5
5
  "keywords": [
6
6
  "reconciliation",
@@ -32,6 +32,9 @@
32
32
  "publishConfig": {
33
33
  "access": "public"
34
34
  },
35
+ "devDependencies": {
36
+ "fast-check": "4.10.1"
37
+ },
35
38
  "scripts": {
36
39
  "build": "tsc -p tsconfig.build.json"
37
40
  },
@@ -1,88 +0,0 @@
1
- /**
2
- * THE PORTFOLIO'S CHECK CHARACTERISTICS — the words that may name what a fitness check asserts.
3
- *
4
- * WHAT THIS IS FOR NOW — A ROLL-UP VOCABULARY, NOT A GATE (3F-3167). A fitness scenario carries
5
- * one tag, `@fitness`, and names its characteristic as a FIELD on its configured row. The word is
6
- * therefore a REPORTING LABEL: it is what a report groups its fitness rows by and what the
7
- * portfolio says out loud about where a product is weak. Nothing parses it, and no check in this
8
- * repository holds a manifest to this list any more.
9
- *
10
- * THE GATE THAT USED TO (3F-2996, retired 3F-3167). The set of words that could name a
11
- * characteristic was once read out of the target's own check registry and
12
- * `specController.thresholds`, so adding a registry entry was simultaneously the act that MINTED
13
- * a characteristic and the act that CERTIFIED it. Fourteen tags for seven characteristics were
14
- * built over a month in a repository that reconciles its own tree on every push, and nothing
15
- * redded once (3F-2994). `lint:check-characteristics` closed that, along with a minting ceremony
16
- * for words canon had not named — and both left when the tag stopped doing two jobs. A word that
17
- * only labels a roll-up cannot be minted into the parser by a typo, because the parser does not
18
- * read it. Whether the portfolio SHOULD carry a given word is a canon question, asked of people.
19
- *
20
- * THE ROSTER IS STILL THE PORTFOLIO'S, AND IT STILL ARRIVES BY VERSION. Canon names this package
21
- * as the machine-readable form's home — *"a `spec-controller-core` export or its own shared
22
- * package … from which each product DERIVES its legal set via its pinned version, refreshed on a
23
- * bump — never a hand-typed roster"* (`fitness-functions.md` → *Static checks*). Every reconciled
24
- * product already installs this package to run `balance`, so the export is the smaller of the two
25
- * shapes canon offers: nothing is published that was not published before, and no consumer gains
26
- * a dependency. What changed at 3F-3167 is what a consumer DOES with it — group a report, not
27
- * refuse a build.
28
- *
29
- * ON THE PUBLIC `.` BARREL, NEVER `./internal`. A roster only the monorepo can import is
30
- * reachable by exactly the one product that does not need it.
31
- *
32
- * AND THE BARREL ENTRY IS NOT A FROZEN CONTRACT — it stays on its merits (3F-3410). This used to
33
- * say the entry was a "v1 contract change", reconciled against a hand-written surface updated in
34
- * the same act. Both halves are gone: that surface left at 3F-3449, and a 0.x package does not
35
- * freeze its exports, it drops the dead ones in a prerelease (operator, 2026-09-16). So nothing
36
- * keeps this export here by inertia, and 3F-3410 — which deleted the obligation-side observer from
37
- * this same barrel for having no caller — asked directly whether this one had one. It does, and not
38
- * in this repository: canon names it (below), and a sibling product holds a vendored copy naming
39
- * this module as its source, to be replaced by the import. A shared vocabulary's consumers are
40
- * outside the repository that publishes it, so a grep of this tree is the wrong population to
41
- * measure it by.
42
- *
43
- * ═══ THIS FILE IS A VENDORED COPY, AND SAYS SO ═══
44
- *
45
- * Canon lives in the `strategy` repository, which this one's CI never checks out and a public
46
- * consumer of an MIT-licensed tool would not have at all — the arrangement the operator ruled
47
- * for exactly this case (2026-08-03, 3F-2296). So this list is transcribed, and
48
- * holding it to canon belongs to the strategy repository's CI, where every product is visible. It
49
- * says so on its face rather than leaving a reader to wonder whether the reconciliation was
50
- * forgotten.
51
- *
52
- * PURE DATA AND ONE PREDICATE — no I/O, nothing imported, so it sits in `domain/` beside
53
- * the fitness-row readers, and `pnpm lint:boundaries` stays green by construction — the whole of
54
- * what asks that question, now that `domainPurity` has gone at 3F-3438.
55
- */
56
- /**
57
- * The characteristics the portfolio carries, transcribed from `fitness-functions.md`.
58
- *
59
- * THE WORDS ONLY — WHICH CHECKS SIT UNDER EACH IS NOT RECORDED HERE, AND THAT IS THE POINT
60
- * (3F-3410). This docblock used to carry canon's grouped-by-characteristic sentence, naming the
61
- * member checks per word. Canon removed that column on 2026-09-16 and said why in terms: the list
62
- * had been transcribed HERE, so one unread list had become two drifting ones, and by then most of
63
- * the checks it named had been deleted from this repository. Membership is recorded once, on each
64
- * product's own `specController.fitnessChecks` rows — the only place the answer is true and the
65
- * only place any reconciliation reads it (`dry`: the rows are the fact).
66
- *
67
- * TWO GROUPS, WHICH IS CANON'S OWN SPLIT AND NOT A MEMBERSHIP CLAIM. The static checks read the
68
- * source (or, for `self-balance`, the PRODUCED EVIDENCE rather than the source); the measured ones
69
- * are assessed by running the suite and measuring it (canon, *Runtime fitness functions*).
70
- *
71
- * BARE, AND SORTED BY NEITHER. The words carry no `@` because every reader hands this list bare
72
- * terms (`bareTerm`, 3F-2976), and the order is canon's own so a reader diffing the two documents
73
- * reads them in the same sequence.
74
- */
75
- export declare const PORTFOLIO_CHECK_CHARACTERISTICS: readonly string[];
76
- /**
77
- * Whether the portfolio roster carries this characteristic.
78
- *
79
- * EXACT, AND NEVER A NEAR-MATCH COURTESY. A word the roster does not carry is not resolved to the
80
- * roster word it resembles: the mint is the act being surfaced, and quietly reading `complexty`
81
- * as `complexity` would hide exactly what a caller reads this to make visible.
82
- *
83
- * The term arrives BARE. Every reader in this repository reaches the roster through the resolvers
84
- * that already store both terms bare, so stripping a sigil here would be a second reading of what
85
- * a term bare is — the disagreement between readers that 3F-2976 spent a slice removing.
86
- */
87
- export declare function isPortfolioCharacteristic(characteristic: string): boolean;
88
- //# sourceMappingURL=checkCharacteristics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkCharacteristics.d.ts","sourceRoot":"","sources":["../../src/domain/checkCharacteristics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,+BAA+B,EAAE,SAAS,MAAM,EAmB5D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAEzE"}
@@ -1,109 +0,0 @@
1
- /**
2
- * THE PORTFOLIO'S CHECK CHARACTERISTICS — the words that may name what a fitness check asserts.
3
- *
4
- * WHAT THIS IS FOR NOW — A ROLL-UP VOCABULARY, NOT A GATE (3F-3167). A fitness scenario carries
5
- * one tag, `@fitness`, and names its characteristic as a FIELD on its configured row. The word is
6
- * therefore a REPORTING LABEL: it is what a report groups its fitness rows by and what the
7
- * portfolio says out loud about where a product is weak. Nothing parses it, and no check in this
8
- * repository holds a manifest to this list any more.
9
- *
10
- * THE GATE THAT USED TO (3F-2996, retired 3F-3167). The set of words that could name a
11
- * characteristic was once read out of the target's own check registry and
12
- * `specController.thresholds`, so adding a registry entry was simultaneously the act that MINTED
13
- * a characteristic and the act that CERTIFIED it. Fourteen tags for seven characteristics were
14
- * built over a month in a repository that reconciles its own tree on every push, and nothing
15
- * redded once (3F-2994). `lint:check-characteristics` closed that, along with a minting ceremony
16
- * for words canon had not named — and both left when the tag stopped doing two jobs. A word that
17
- * only labels a roll-up cannot be minted into the parser by a typo, because the parser does not
18
- * read it. Whether the portfolio SHOULD carry a given word is a canon question, asked of people.
19
- *
20
- * THE ROSTER IS STILL THE PORTFOLIO'S, AND IT STILL ARRIVES BY VERSION. Canon names this package
21
- * as the machine-readable form's home — *"a `spec-controller-core` export or its own shared
22
- * package … from which each product DERIVES its legal set via its pinned version, refreshed on a
23
- * bump — never a hand-typed roster"* (`fitness-functions.md` → *Static checks*). Every reconciled
24
- * product already installs this package to run `balance`, so the export is the smaller of the two
25
- * shapes canon offers: nothing is published that was not published before, and no consumer gains
26
- * a dependency. What changed at 3F-3167 is what a consumer DOES with it — group a report, not
27
- * refuse a build.
28
- *
29
- * ON THE PUBLIC `.` BARREL, NEVER `./internal`. A roster only the monorepo can import is
30
- * reachable by exactly the one product that does not need it.
31
- *
32
- * AND THE BARREL ENTRY IS NOT A FROZEN CONTRACT — it stays on its merits (3F-3410). This used to
33
- * say the entry was a "v1 contract change", reconciled against a hand-written surface updated in
34
- * the same act. Both halves are gone: that surface left at 3F-3449, and a 0.x package does not
35
- * freeze its exports, it drops the dead ones in a prerelease (operator, 2026-09-16). So nothing
36
- * keeps this export here by inertia, and 3F-3410 — which deleted the obligation-side observer from
37
- * this same barrel for having no caller — asked directly whether this one had one. It does, and not
38
- * in this repository: canon names it (below), and a sibling product holds a vendored copy naming
39
- * this module as its source, to be replaced by the import. A shared vocabulary's consumers are
40
- * outside the repository that publishes it, so a grep of this tree is the wrong population to
41
- * measure it by.
42
- *
43
- * ═══ THIS FILE IS A VENDORED COPY, AND SAYS SO ═══
44
- *
45
- * Canon lives in the `strategy` repository, which this one's CI never checks out and a public
46
- * consumer of an MIT-licensed tool would not have at all — the arrangement the operator ruled
47
- * for exactly this case (2026-08-03, 3F-2296). So this list is transcribed, and
48
- * holding it to canon belongs to the strategy repository's CI, where every product is visible. It
49
- * says so on its face rather than leaving a reader to wonder whether the reconciliation was
50
- * forgotten.
51
- *
52
- * PURE DATA AND ONE PREDICATE — no I/O, nothing imported, so it sits in `domain/` beside
53
- * the fitness-row readers, and `pnpm lint:boundaries` stays green by construction — the whole of
54
- * what asks that question, now that `domainPurity` has gone at 3F-3438.
55
- */
56
- /**
57
- * The characteristics the portfolio carries, transcribed from `fitness-functions.md`.
58
- *
59
- * THE WORDS ONLY — WHICH CHECKS SIT UNDER EACH IS NOT RECORDED HERE, AND THAT IS THE POINT
60
- * (3F-3410). This docblock used to carry canon's grouped-by-characteristic sentence, naming the
61
- * member checks per word. Canon removed that column on 2026-09-16 and said why in terms: the list
62
- * had been transcribed HERE, so one unread list had become two drifting ones, and by then most of
63
- * the checks it named had been deleted from this repository. Membership is recorded once, on each
64
- * product's own `specController.fitnessChecks` rows — the only place the answer is true and the
65
- * only place any reconciliation reads it (`dry`: the rows are the fact).
66
- *
67
- * TWO GROUPS, WHICH IS CANON'S OWN SPLIT AND NOT A MEMBERSHIP CLAIM. The static checks read the
68
- * source (or, for `self-balance`, the PRODUCED EVIDENCE rather than the source); the measured ones
69
- * are assessed by running the suite and measuring it (canon, *Runtime fitness functions*).
70
- *
71
- * BARE, AND SORTED BY NEITHER. The words carry no `@` because every reader hands this list bare
72
- * terms (`bareTerm`, 3F-2976), and the order is canon's own so a reader diffing the two documents
73
- * reads them in the same sequence.
74
- */
75
- export const PORTFOLIO_CHECK_CHARACTERISTICS = [
76
- // Static checks
77
- "complexity",
78
- "function-length",
79
- "tech-conformance",
80
- "vocab",
81
- "traceability",
82
- "lint",
83
- "flag-hygiene",
84
- "doc-accuracy",
85
- "typecheck",
86
- "security",
87
- "licence",
88
- "bundle-size",
89
- "self-balance",
90
- // Measured
91
- "ci-run-time",
92
- "coverage",
93
- "mutation",
94
- ];
95
- /**
96
- * Whether the portfolio roster carries this characteristic.
97
- *
98
- * EXACT, AND NEVER A NEAR-MATCH COURTESY. A word the roster does not carry is not resolved to the
99
- * roster word it resembles: the mint is the act being surfaced, and quietly reading `complexty`
100
- * as `complexity` would hide exactly what a caller reads this to make visible.
101
- *
102
- * The term arrives BARE. Every reader in this repository reaches the roster through the resolvers
103
- * that already store both terms bare, so stripping a sigil here would be a second reading of what
104
- * a term bare is — the disagreement between readers that 3F-2976 spent a slice removing.
105
- */
106
- export function isPortfolioCharacteristic(characteristic) {
107
- return PORTFOLIO_CHECK_CHARACTERISTICS.includes(characteristic);
108
- }
109
- //# sourceMappingURL=checkCharacteristics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkCharacteristics.js","sourceRoot":"","sources":["../../src/domain/checkCharacteristics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAsB;IAChE,gBAAgB;IAChB,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,OAAO;IACP,cAAc;IACd,MAAM;IACN,cAAc;IACd,cAAc;IACd,WAAW;IACX,UAAU;IACV,SAAS;IACT,aAAa;IACb,cAAc;IACd,WAAW;IACX,aAAa;IACb,UAAU;IACV,UAAU;CACX,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CAAC,cAAsB;IAC9D,OAAO,+BAA+B,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAClE,CAAC"}