@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
@@ -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,aAAa,GAAG,YAAY,GAAG,YAAY,CAAC;IAClD,MAAM,IAAI,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9G,OAAO,aAAa,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACxF,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,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.7",
3
+ "version": "0.1.0-alpha.70",
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"}
@@ -1,79 +0,0 @@
1
- /**
2
- * THE FITNESS CHECK ROWS — what a CONVERTED check says about itself, keyed by the `@SCN` it is
3
- * about.
4
- *
5
- * @SCN the row what the corpus then reads
6
- * SCN-FIT-001 { characteristic: complexity } a @fitness scenario owes `complexity`
7
- *
8
- * THE TAG NAMES THE AXIS AND THE ROW NAMES THE SUBJECT. A bare characteristic tag answered two
9
- * questions at once — how a claim is proved, and what it is about — and the tier tags answer only
10
- * the first. So a converted scenario carries `@fitness` alone, and the characteristic moves here,
11
- * where it stays a first-class word the roll-up still groups by.
12
- *
13
- * NOT A SECOND OBLIGATION SHAPE. What a `@fitness` scenario raises is the same
14
- * `{ qualityCheck: "lint", staticCheck: <characteristic> }` a registered bare tag raises today, so
15
- * the pair key, the reconciler's static arm and the report's roll-up are all untouched. What
16
- * changed is only where the word came from.
17
- *
18
- * NOT THE (RETIRED) CHECK REGISTRY, AND THE DIFFERENCE IS THE SEAM THIS RETIRES. That registry
19
- * answered "which check is this runnable script handle", because a handle does not know what it
20
- * is for; the `@SCN`
21
- * is then resolved through the corpus, a second hop. A converted check is never discovered as a
22
- * handle — it is a scenario that ran, carrying its own tag line — so the `@SCN` is the KEY here
23
- * rather than something a lookup has to recover.
24
- *
25
- * PURE AND INJECTED — the rows arrive as data, read from the TARGET's own manifest at the app edge
26
- * (`specController.fitnessChecks`), the stance the retired `thresholdsOf` took. A target that
27
- * configures nothing raises nothing, so the reading is inert on a corpus
28
- * nobody has converted.
29
- */
30
- /**
31
- * ONE CONFIGURED ROW as the obligation rule reads it.
32
- *
33
- * The `scn` a row states is not a member here: it is this index's KEY, so a row cannot name one
34
- * scenario and be filed under another. The command a row states is not a member either — it is the
35
- * COMMAND half of the row and nothing on the debit side reads it. Every row is credited by its own
36
- * step's outcome in the run's record, so the characteristic is the whole of what the ledger reads.
37
- */
38
- export interface FitnessCheck {
39
- /** The bare characteristic this check asserts (`complexity`). */
40
- readonly characteristic: string;
41
- }
42
- /** The rows as the rule reads them — bare `@SCN` → the row naming that scenario's check. */
43
- export type FitnessCheckIndex = ReadonlyMap<string, FitnessCheck>;
44
- /**
45
- * Build the index from the rows a manifest holds.
46
- *
47
- * A LIST, NOT A BLOCK KEYED BY `@SCN`, and the shape is the row's own argument: a row is what a
48
- * check says about ITSELF — its `@SCN`, its characteristic, its command — so no one of those three
49
- * is promoted above the others by being the key somebody has to write it under. The `@SCN` becomes
50
- * the key HERE, where a lookup needs one.
51
- *
52
- * A MALFORMED ROW IS DROPPED, NOT TRUSTED AND NOT THROWN ON — the defensive stance the whole
53
- * `specController.*` family takes. Config is data from outside, and a reader that throws on a typo
54
- * turns one bad character into a run that produces no verdict at all, which is loud nowhere; a
55
- * dropped row leaves its scenario naming no characteristic, which the corpus reports.
56
- */
57
- export declare function fitnessChecksOf(entries: unknown): FitnessCheckIndex;
58
- /**
59
- * ONE CONFIGURED ROW THE TARGET'S CORPUS CARRIES NO SCENARIO FOR (3F-3472) — a check the manifest
60
- * declares and nothing in the corpus specifies.
61
- *
62
- * THE MIRROR OF `unconfiguredFitnessScenarios`, AND THE HALF THE BOOKS COULD NOT SEE. That one
63
- * reads a `@fitness` scenario no row names; this reads a row no scenario names. The asymmetry
64
- * between what each EARNS is the two facts' own: a scenario naming no row names no characteristic,
65
- * so there is nothing to put on the books and the census says who — a row names one, so there IS a
66
- * debit, and `features/fitness-checks.feature` promises it as "an Evidence Obligation nothing
67
- * observed".
68
- *
69
- * IT CARRIES THE CHARACTERISTIC BECAUSE THE OBLIGATION IT RAISES NAMES ONE. The `@SCN` alone would
70
- * leave the reader of this reading to go back to the index for the other half, which is the second
71
- * read `readTargetCorpus` composes its readings together to foreclose.
72
- */
73
- export interface UnspecifiedFitnessRow {
74
- /** The `@SCN` the row states, which no scenario in the target's corpus carries. */
75
- readonly scnId: string;
76
- /** The bare characteristic the row asserts (`complexity`) — what its debit is owed at. */
77
- readonly characteristic: string;
78
- }
79
- //# sourceMappingURL=fitnessChecks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fitnessChecks.d.ts","sourceRoot":"","sources":["../../src/domain/fitnessChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,4FAA4F;AAC5F,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AA2BlE;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAQnE;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC"}
@@ -1,81 +0,0 @@
1
- /**
2
- * THE FITNESS CHECK ROWS — what a CONVERTED check says about itself, keyed by the `@SCN` it is
3
- * about.
4
- *
5
- * @SCN the row what the corpus then reads
6
- * SCN-FIT-001 { characteristic: complexity } a @fitness scenario owes `complexity`
7
- *
8
- * THE TAG NAMES THE AXIS AND THE ROW NAMES THE SUBJECT. A bare characteristic tag answered two
9
- * questions at once — how a claim is proved, and what it is about — and the tier tags answer only
10
- * the first. So a converted scenario carries `@fitness` alone, and the characteristic moves here,
11
- * where it stays a first-class word the roll-up still groups by.
12
- *
13
- * NOT A SECOND OBLIGATION SHAPE. What a `@fitness` scenario raises is the same
14
- * `{ qualityCheck: "lint", staticCheck: <characteristic> }` a registered bare tag raises today, so
15
- * the pair key, the reconciler's static arm and the report's roll-up are all untouched. What
16
- * changed is only where the word came from.
17
- *
18
- * NOT THE (RETIRED) CHECK REGISTRY, AND THE DIFFERENCE IS THE SEAM THIS RETIRES. That registry
19
- * answered "which check is this runnable script handle", because a handle does not know what it
20
- * is for; the `@SCN`
21
- * is then resolved through the corpus, a second hop. A converted check is never discovered as a
22
- * handle — it is a scenario that ran, carrying its own tag line — so the `@SCN` is the KEY here
23
- * rather than something a lookup has to recover.
24
- *
25
- * PURE AND INJECTED — the rows arrive as data, read from the TARGET's own manifest at the app edge
26
- * (`specController.fitnessChecks`), the stance the retired `thresholdsOf` took. A target that
27
- * configures nothing raises nothing, so the reading is inert on a corpus
28
- * nobody has converted.
29
- */
30
- import { bareTerm } from "../lib/bareTerm.js";
31
- /**
32
- * One entry as a manifest spells it, read into the pair a lookup can use, or `null` where it names
33
- * nothing one can.
34
- *
35
- * BOTH TERMS ARE STORED BARE. A manifest written by hand will sooner or later spell an `@SCN` — and
36
- * a characteristic — the way a feature file does, and both lookups match bare; stripping once here
37
- * rather than at every call site is the stance the retired `thresholdsOf` took.
38
- *
39
- * A ROW NAMING NEITHER TERM IS DROPPED WHOLE, never half-read. The two terms make one claim
40
- * together — THIS scenario asserts THIS characteristic — so a row missing either says nothing a
41
- * lookup can act on, and there is no lenient reading that does not invent one of them.
42
- */
43
- function fitnessCheckOf(entry) {
44
- // THE TWO STRING READS ARE THE WHOLE GUARD, and a shape test ahead of them would add no teeth: a
45
- // string, a number, a list and a function all answer `undefined` here, so each is refused by the
46
- // read that matters rather than by a clause restating it. The optional chain is what covers the
47
- // two values a property read would throw on.
48
- const named = entry;
49
- if (typeof named?.scn !== "string" || typeof named.characteristic !== "string")
50
- return null;
51
- const scnId = bareTerm(named.scn);
52
- const characteristic = bareTerm(named.characteristic);
53
- if (scnId === "" || characteristic === "")
54
- return null;
55
- return [scnId, { characteristic }];
56
- }
57
- /**
58
- * Build the index from the rows a manifest holds.
59
- *
60
- * A LIST, NOT A BLOCK KEYED BY `@SCN`, and the shape is the row's own argument: a row is what a
61
- * check says about ITSELF — its `@SCN`, its characteristic, its command — so no one of those three
62
- * is promoted above the others by being the key somebody has to write it under. The `@SCN` becomes
63
- * the key HERE, where a lookup needs one.
64
- *
65
- * A MALFORMED ROW IS DROPPED, NOT TRUSTED AND NOT THROWN ON — the defensive stance the whole
66
- * `specController.*` family takes. Config is data from outside, and a reader that throws on a typo
67
- * turns one bad character into a run that produces no verdict at all, which is loud nowhere; a
68
- * dropped row leaves its scenario naming no characteristic, which the corpus reports.
69
- */
70
- export function fitnessChecksOf(entries) {
71
- if (!Array.isArray(entries))
72
- return new Map();
73
- const index = new Map();
74
- for (const entry of entries) {
75
- const row = fitnessCheckOf(entry);
76
- if (row !== null)
77
- index.set(row[0], row[1]);
78
- }
79
- return index;
80
- }
81
- //# sourceMappingURL=fitnessChecks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fitnessChecks.js","sourceRoot":"","sources":["../../src/domain/fitnessChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAkB9C;;;;;;;;;;;GAWG;AACH,SAAS,cAAc,CAAC,KAAc;IACpC,iGAAiG;IACjG,iGAAiG;IACjG,gGAAgG;IAChG,6CAA6C;IAC7C,MAAM,KAAK,GAAG,KAAuE,CAAC;IACtF,IAAI,OAAO,KAAK,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACtD,IAAI,KAAK,KAAK,EAAE,IAAI,cAAc,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,OAA6B,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,GAAG,KAAK,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}