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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +3 -3
  2. package/dist/assemble/evidenceReconciliationFromSources.d.ts +5 -40
  3. package/dist/assemble/evidenceReconciliationFromSources.d.ts.map +1 -1
  4. package/dist/assemble/evidenceReconciliationFromSources.js +30 -325
  5. package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
  6. package/dist/assemble/renderInput.d.ts +7 -73
  7. package/dist/assemble/renderInput.d.ts.map +1 -1
  8. package/dist/assemble/renderInput.js +3 -45
  9. package/dist/assemble/renderInput.js.map +1 -1
  10. package/dist/census/evidenceObligations.d.ts +11 -46
  11. package/dist/census/evidenceObligations.d.ts.map +1 -1
  12. package/dist/census/evidenceObligations.js +19 -25
  13. package/dist/census/evidenceObligations.js.map +1 -1
  14. package/dist/domain/evidenceOrder.d.ts +3 -0
  15. package/dist/domain/evidenceOrder.d.ts.map +1 -0
  16. package/dist/domain/evidenceOrder.js +15 -0
  17. package/dist/domain/evidenceOrder.js.map +1 -0
  18. package/dist/domain/evidenceReconciliation.d.ts +21 -391
  19. package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
  20. package/dist/domain/evidenceReconciliation.js +87 -382
  21. package/dist/domain/evidenceReconciliation.js.map +1 -1
  22. package/dist/domain/featureCode.d.ts +4 -0
  23. package/dist/domain/featureCode.d.ts.map +1 -0
  24. package/dist/domain/featureCode.js +12 -0
  25. package/dist/domain/featureCode.js.map +1 -0
  26. package/dist/domain/journal.d.ts +8 -393
  27. package/dist/domain/journal.d.ts.map +1 -1
  28. package/dist/domain/journal.js +6 -118
  29. package/dist/domain/journal.js.map +1 -1
  30. package/dist/domain/ledger.d.ts +8 -328
  31. package/dist/domain/ledger.d.ts.map +1 -1
  32. package/dist/domain/ledger.js +23 -326
  33. package/dist/domain/ledger.js.map +1 -1
  34. package/dist/domain/messages.d.ts +213 -0
  35. package/dist/domain/messages.d.ts.map +1 -0
  36. package/dist/domain/messages.js +313 -0
  37. package/dist/domain/messages.js.map +1 -0
  38. package/dist/domain/outcome.d.ts +3 -0
  39. package/dist/domain/outcome.d.ts.map +1 -0
  40. package/dist/domain/outcome.js +2 -0
  41. package/dist/domain/outcome.js.map +1 -0
  42. package/dist/domain/posting.d.ts +8 -105
  43. package/dist/domain/posting.d.ts.map +1 -1
  44. package/dist/domain/posting.js +4 -56
  45. package/dist/domain/posting.js.map +1 -1
  46. package/dist/domain/qualityCheckFault.d.ts +3 -43
  47. package/dist/domain/qualityCheckFault.d.ts.map +1 -1
  48. package/dist/domain/qualityCheckFault.js +0 -24
  49. package/dist/domain/qualityCheckFault.js.map +1 -1
  50. package/dist/domain/qualityCheckReconciliation.d.ts +7 -280
  51. package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
  52. package/dist/domain/qualityCheckReconciliation.js +63 -463
  53. package/dist/domain/qualityCheckReconciliation.js.map +1 -1
  54. package/dist/domain/qualityCheckReconciliationFault.d.ts +0 -19
  55. package/dist/domain/qualityCheckReconciliationFault.d.ts.map +1 -1
  56. package/dist/domain/qualityCheckReconciliationFault.js +1 -24
  57. package/dist/domain/qualityCheckReconciliationFault.js.map +1 -1
  58. package/dist/domain/scenarioCodeError.d.ts +16 -0
  59. package/dist/domain/scenarioCodeError.d.ts.map +1 -0
  60. package/dist/domain/scenarioCodeError.js +4 -0
  61. package/dist/domain/scenarioCodeError.js.map +1 -0
  62. package/dist/domain/scenarioReconciliation.d.ts +2 -207
  63. package/dist/domain/scenarioReconciliation.d.ts.map +1 -1
  64. package/dist/domain/scenarioReconciliation.js +4 -101
  65. package/dist/domain/scenarioReconciliation.js.map +1 -1
  66. package/dist/domain/scnAllocation.d.ts +27 -0
  67. package/dist/domain/scnAllocation.d.ts.map +1 -0
  68. package/dist/domain/scnAllocation.js +33 -0
  69. package/dist/domain/scnAllocation.js.map +1 -0
  70. package/dist/domain/verdictCode.d.ts +10 -0
  71. package/dist/domain/verdictCode.d.ts.map +1 -0
  72. package/dist/domain/verdictCode.js +16 -0
  73. package/dist/domain/verdictCode.js.map +1 -0
  74. package/dist/index.d.ts +14 -40
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +8 -88
  77. package/dist/index.js.map +1 -1
  78. package/dist/internal.d.ts +3 -27
  79. package/dist/internal.d.ts.map +1 -1
  80. package/dist/internal.js +3 -94
  81. package/dist/internal.js.map +1 -1
  82. package/dist/lib/bareTerm.d.ts +0 -39
  83. package/dist/lib/bareTerm.d.ts.map +1 -1
  84. package/dist/lib/bareTerm.js +0 -39
  85. package/dist/lib/bareTerm.js.map +1 -1
  86. package/dist/lib/portablePath.d.ts.map +1 -1
  87. package/dist/lib/portablePath.js +2 -16
  88. package/dist/lib/portablePath.js.map +1 -1
  89. package/dist/lib/scnCitation.d.ts +0 -32
  90. package/dist/lib/scnCitation.d.ts.map +1 -1
  91. package/dist/lib/scnCitation.js +2 -42
  92. package/dist/lib/scnCitation.js.map +1 -1
  93. package/dist/model.d.ts +0 -23
  94. package/dist/model.d.ts.map +1 -1
  95. package/dist/model.js +0 -23
  96. package/dist/model.js.map +1 -1
  97. package/dist/parse/checkScriptsRunInCI.d.ts +5 -168
  98. package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
  99. package/dist/parse/checkScriptsRunInCI.js +11 -171
  100. package/dist/parse/checkScriptsRunInCI.js.map +1 -1
  101. package/dist/parse/ciStepRecord.d.ts +4 -118
  102. package/dist/parse/ciStepRecord.d.ts.map +1 -1
  103. package/dist/parse/ciStepRecord.js +18 -225
  104. package/dist/parse/ciStepRecord.js.map +1 -1
  105. package/dist/parse/commandRuns.d.ts +0 -39
  106. package/dist/parse/commandRuns.d.ts.map +1 -1
  107. package/dist/parse/commandRuns.js +6 -67
  108. package/dist/parse/commandRuns.js.map +1 -1
  109. package/dist/parse/cucumber.d.ts +0 -53
  110. package/dist/parse/cucumber.d.ts.map +1 -1
  111. package/dist/parse/cucumber.js +42 -146
  112. package/dist/parse/cucumber.js.map +1 -1
  113. package/dist/parse/discoveryScope.d.ts +1 -46
  114. package/dist/parse/discoveryScope.d.ts.map +1 -1
  115. package/dist/parse/discoveryScope.js +2 -57
  116. package/dist/parse/discoveryScope.js.map +1 -1
  117. package/dist/parse/fitnessCitations.d.ts +1 -72
  118. package/dist/parse/fitnessCitations.d.ts.map +1 -1
  119. package/dist/parse/fitnessCitations.js +3 -55
  120. package/dist/parse/fitnessCitations.js.map +1 -1
  121. package/dist/parse/reconcilerSteps.d.ts +0 -46
  122. package/dist/parse/reconcilerSteps.d.ts.map +1 -1
  123. package/dist/parse/reconcilerSteps.js +2 -64
  124. package/dist/parse/reconcilerSteps.js.map +1 -1
  125. package/dist/parse/runningFitnessFunctions.d.ts +9 -0
  126. package/dist/parse/runningFitnessFunctions.d.ts.map +1 -0
  127. package/dist/parse/runningFitnessFunctions.js +57 -0
  128. package/dist/parse/runningFitnessFunctions.js.map +1 -0
  129. package/dist/parse/scenarioCodeErrors.d.ts +11 -0
  130. package/dist/parse/scenarioCodeErrors.d.ts.map +1 -0
  131. package/dist/parse/scenarioCodeErrors.js +78 -0
  132. package/dist/parse/scenarioCodeErrors.js.map +1 -0
  133. package/dist/parse/scenarios.d.ts +3 -228
  134. package/dist/parse/scenarios.d.ts.map +1 -1
  135. package/dist/parse/scenarios.js +20 -457
  136. package/dist/parse/scenarios.js.map +1 -1
  137. package/dist/parse/stepAccounting.d.ts +0 -46
  138. package/dist/parse/stepAccounting.d.ts.map +1 -1
  139. package/dist/parse/stepAccounting.js +1 -55
  140. package/dist/parse/stepAccounting.js.map +1 -1
  141. package/dist/parse/stepExclusions.d.ts +0 -47
  142. package/dist/parse/stepExclusions.d.ts.map +1 -1
  143. package/dist/parse/stepExclusions.js +2 -50
  144. package/dist/parse/stepExclusions.js.map +1 -1
  145. package/dist/parse/stepNames.d.ts +0 -27
  146. package/dist/parse/stepNames.d.ts.map +1 -1
  147. package/dist/parse/stepNames.js +0 -27
  148. package/dist/parse/stepNames.js.map +1 -1
  149. package/dist/parse/targetCorpus.d.ts +1 -78
  150. package/dist/parse/targetCorpus.d.ts.map +1 -1
  151. package/dist/parse/targetCorpus.js +4 -46
  152. package/dist/parse/targetCorpus.js.map +1 -1
  153. package/dist/parse/targetManifest.d.ts +8 -146
  154. package/dist/parse/targetManifest.d.ts.map +1 -1
  155. package/dist/parse/targetManifest.js +48 -198
  156. package/dist/parse/targetManifest.js.map +1 -1
  157. package/dist/parse/vitest.d.ts +0 -60
  158. package/dist/parse/vitest.d.ts.map +1 -1
  159. package/dist/parse/vitest.js +4 -83
  160. package/dist/parse/vitest.js.map +1 -1
  161. package/dist/provenance/provenance.d.ts +2 -110
  162. package/dist/provenance/provenance.d.ts.map +1 -1
  163. package/dist/provenance/provenance.js +2 -58
  164. package/dist/provenance/provenance.js.map +1 -1
  165. package/dist/render/behaviouralRunners.d.ts +0 -29
  166. package/dist/render/behaviouralRunners.d.ts.map +1 -1
  167. package/dist/render/behaviouralRunners.js +6 -69
  168. package/dist/render/behaviouralRunners.js.map +1 -1
  169. package/dist/render/configurationNotRead.d.ts +3 -0
  170. package/dist/render/configurationNotRead.d.ts.map +1 -0
  171. package/dist/render/configurationNotRead.js +17 -0
  172. package/dist/render/configurationNotRead.js.map +1 -0
  173. package/dist/render/discoveryScope.d.ts +0 -37
  174. package/dist/render/discoveryScope.d.ts.map +1 -1
  175. package/dist/render/discoveryScope.js +3 -39
  176. package/dist/render/discoveryScope.js.map +1 -1
  177. package/dist/render/evidenceGrid.d.ts +1 -35
  178. package/dist/render/evidenceGrid.d.ts.map +1 -1
  179. package/dist/render/evidenceGrid.js +21 -103
  180. package/dist/render/evidenceGrid.js.map +1 -1
  181. package/dist/render/excludedSteps.d.ts +0 -26
  182. package/dist/render/excludedSteps.d.ts.map +1 -1
  183. package/dist/render/excludedSteps.js +4 -32
  184. package/dist/render/excludedSteps.js.map +1 -1
  185. package/dist/render/fitnessFunctions.d.ts +3 -0
  186. package/dist/render/fitnessFunctions.d.ts.map +1 -0
  187. package/dist/render/fitnessFunctions.js +12 -0
  188. package/dist/render/fitnessFunctions.js.map +1 -0
  189. package/dist/render/json.d.ts +0 -11
  190. package/dist/render/json.d.ts.map +1 -1
  191. package/dist/render/json.js +0 -11
  192. package/dist/render/json.js.map +1 -1
  193. package/dist/render/markdown.d.ts +1 -55
  194. package/dist/render/markdown.d.ts.map +1 -1
  195. package/dist/render/markdown.js +128 -467
  196. package/dist/render/markdown.js.map +1 -1
  197. package/dist/render/provenanceSection.d.ts +0 -22
  198. package/dist/render/provenanceSection.d.ts.map +1 -1
  199. package/dist/render/provenanceSection.js +10 -53
  200. package/dist/render/provenanceSection.js.map +1 -1
  201. package/dist/render/reconcilerSteps.d.ts +0 -25
  202. package/dist/render/reconcilerSteps.d.ts.map +1 -1
  203. package/dist/render/reconcilerSteps.js +5 -30
  204. package/dist/render/reconcilerSteps.js.map +1 -1
  205. package/dist/render/runVerdict.d.ts +0 -38
  206. package/dist/render/runVerdict.d.ts.map +1 -1
  207. package/dist/render/runVerdict.js +62 -129
  208. package/dist/render/runVerdict.js.map +1 -1
  209. package/dist/render/scenarioCodeErrorsSection.d.ts +3 -0
  210. package/dist/render/scenarioCodeErrorsSection.d.ts.map +1 -0
  211. package/dist/render/scenarioCodeErrorsSection.js +45 -0
  212. package/dist/render/scenarioCodeErrorsSection.js.map +1 -0
  213. package/dist/render/stepAccounting.d.ts +0 -36
  214. package/dist/render/stepAccounting.d.ts.map +1 -1
  215. package/dist/render/stepAccounting.js +5 -49
  216. package/dist/render/stepAccounting.js.map +1 -1
  217. package/dist/render/testVolume.d.ts +0 -25
  218. package/dist/render/testVolume.d.ts.map +1 -1
  219. package/dist/render/testVolume.js +4 -35
  220. package/dist/render/testVolume.js.map +1 -1
  221. package/package.json +4 -1
  222. package/dist/domain/checkCharacteristics.d.ts +0 -88
  223. package/dist/domain/checkCharacteristics.d.ts.map +0 -1
  224. package/dist/domain/checkCharacteristics.js +0 -109
  225. package/dist/domain/checkCharacteristics.js.map +0 -1
  226. package/dist/domain/fitnessChecks.d.ts +0 -79
  227. package/dist/domain/fitnessChecks.d.ts.map +0 -1
  228. package/dist/domain/fitnessChecks.js +0 -81
  229. package/dist/domain/fitnessChecks.js.map +0 -1
  230. package/dist/domain/qualityCheckFaultMessages.d.ts +0 -43
  231. package/dist/domain/qualityCheckFaultMessages.d.ts.map +0 -1
  232. package/dist/domain/qualityCheckFaultMessages.js +0 -38
  233. package/dist/domain/qualityCheckFaultMessages.js.map +0 -1
  234. package/dist/lib/featureCode.d.ts +0 -21
  235. package/dist/lib/featureCode.d.ts.map +0 -1
  236. package/dist/lib/featureCode.js +0 -24
  237. package/dist/lib/featureCode.js.map +0 -1
  238. package/dist/parse/corpusCodeFaults.d.ts +0 -76
  239. package/dist/parse/corpusCodeFaults.d.ts.map +0 -1
  240. package/dist/parse/corpusCodeFaults.js +0 -121
  241. package/dist/parse/corpusCodeFaults.js.map +0 -1
  242. package/dist/parse/corpusFaults.d.ts +0 -124
  243. package/dist/parse/corpusFaults.d.ts.map +0 -1
  244. package/dist/parse/corpusFaults.js +0 -72
  245. package/dist/parse/corpusFaults.js.map +0 -1
  246. package/dist/parse/corpusGrammarFaults.d.ts +0 -71
  247. package/dist/parse/corpusGrammarFaults.d.ts.map +0 -1
  248. package/dist/parse/corpusGrammarFaults.js +0 -292
  249. package/dist/parse/corpusGrammarFaults.js.map +0 -1
  250. package/dist/parse/runningStaticChecks.d.ts +0 -125
  251. package/dist/parse/runningStaticChecks.d.ts.map +0 -1
  252. package/dist/parse/runningStaticChecks.js +0 -316
  253. package/dist/parse/runningStaticChecks.js.map +0 -1
  254. package/dist/render/staticChecks.d.ts +0 -23
  255. package/dist/render/staticChecks.d.ts.map +0 -1
  256. package/dist/render/staticChecks.js +0 -69
  257. package/dist/render/staticChecks.js.map +0 -1
@@ -1,48 +1,12 @@
1
- /**
2
- * THE SCOPE THIS RUN RANGED OVER (@SCN-USG-020) — the workflow files `--ci` resolved, the jobs
3
- * within them, how many steps each held and how many of those became candidate fitness checks.
4
- *
5
- * THE SECTION IS THE TOOL'S ANSWER TO BEING POINTED AT THE WRONG THING. It makes no judgement
6
- * about whether a scope is a plausible one — a rule for "this looks like a release workflow" is
7
- * exactly the judgement this axis puts out of scope, and it is a list of ours. What it does
8
- * instead is say what it read, so a consumer sees a workflow they did not mean or a job they
9
- * forgot they had, and corrects it by narrowing `--ci` or by naming the steps that are not checks.
10
- *
11
- * AND IT IS WHERE THE QUIET JOB BECOMES VISIBLE. Every other cut of this report is about steps
12
- * that became something; this one is about the pipeline the steps came out of, so a job whose
13
- * every step was taken out — and a job the consumer forgot the tool could not see — reads here
14
- * and nowhere else.
15
- *
16
- * A TABLE RATHER THAN A LINE PER JOB, because four facts per row is what a reader compares down a
17
- * column: two jobs of one file, or the two figures of one job, are read against each other rather
18
- * than one sentence at a time. `behaviouralRunners.ts` takes the same shape for the same reason.
19
- *
20
- * Its own module rather than a further section in `markdown.ts`, which sits at a `max-lines`
21
- * exception — and an exception excuses existing debt, never headroom. The precedent is
22
- * `runVerdict.ts` and, along this axis, `behaviouralRunners.ts`, `excludedSteps.ts` and
23
- * `reconcilerSteps.ts`.
24
- */
25
- /**
26
- * The scope, or nothing at all.
27
- *
28
- * OMITTED WHERE THE RUN READ NO CI CONFIGURATION, which is the only way the census can be empty:
29
- * the section appears wherever there is a pipeline to account for, and a run handed none renders
30
- * byte-identically to before.
31
- *
32
- * A SOURCE THIS RUN WAS GIVEN NO NAME FOR STILL GETS ITS ROW, with an empty cell where the file
33
- * would be. The core holds no filesystem and the names arrive as data from the CLI edge
34
- * (`parse/stepNames`), so an unnamed source is one nobody could name rather than one nothing read
35
- * — and dropping its jobs would be a job the reader ranged over vanishing from the account of what
36
- * it ranged over, which is the silence this axis exists to end.
37
- */
1
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
38
2
  export const discoveryScopeSection = (report) => {
39
3
  const scope = report.summary.discoveryScope ?? [];
40
4
  if (scope.length === 0)
41
5
  return [];
42
6
  return [
43
- "### Discovery scope",
7
+ CORE_MESSAGES[CoreMessage.DiscoveryScopeHeading],
44
8
  "",
45
- "| Workflow | Job | Steps read | Candidates |",
9
+ CORE_MESSAGES[CoreMessage.DiscoveryScopeTableHeader],
46
10
  "| --- | --- | --- | --- |",
47
11
  ...scope.map(({ source, job, steps, candidates }) => `| ${source ?? "—"} | ${job} | ${steps} | ${candidates} |`),
48
12
  "",
@@ -1 +1 @@
1
- {"version":3,"file":"discoveryScope.js","sourceRoot":"","sources":["../../src/render/discoveryScope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;IAClD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO;QACL,qBAAqB;QACrB,EAAE;QACF,8CAA8C;QAC9C,2BAA2B;QAC3B,GAAG,KAAK,CAAC,GAAG,CACV,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CACrC,KAAK,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,KAAK,MAAM,UAAU,IAAI,CAC7D;QACD,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"discoveryScope.js","sourceRoot":"","sources":["../../src/render/discoveryScope.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;IAClD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO;QACL,aAAa,CAAC,WAAW,CAAC,qBAAqB,CAAC;QAChD,EAAE;QACF,aAAa,CAAC,WAAW,CAAC,yBAAyB,CAAC;QACpD,2BAA2B;QAC3B,GAAG,KAAK,CAAC,GAAG,CACV,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CACrC,KAAK,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,KAAK,MAAM,UAAU,IAAI,CAC7D;QACD,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
@@ -1,45 +1,11 @@
1
- /**
2
- * THE LEDGER'S EVIDENCE GRID — the corpus-driven evidence columns the Scenario Reconciliations table
3
- * gains when the runtime-observation axis is in play, and the two-sided cell under each.
4
- *
5
- * Its own module rather than a block in `markdown.ts`, moved out whole at 3F-3524 so the ledger
6
- * section's split into functions under the complexity and function-length ceilings did not push
7
- * the file past its `max-lines`; `staticChecks.ts` and `runVerdict.ts` are the precedent. NOTHING
8
- * about the grid changed in the move: same columns, same headers, same cells.
9
- */
10
1
  import type { ScenarioReconciliation, RuntimeQualityCheck } from "../model.js";
11
- /**
12
- * One corpus-driven evidence column in the ledger: the lint (static) column,
13
- * or a runtime quality-check column. The column SET is corpus-driven — only the quality-checks
14
- * the run raises or observes appear, so e2e / performance show up only when present.
15
- */
16
2
  export type EvidenceColumn = {
17
- kind: "lint";
3
+ kind: "fitness";
18
4
  } | {
19
5
  kind: "runtime";
20
6
  qualityCheck: RuntimeQualityCheck;
21
7
  };
22
- /**
23
- * The corpus-driven evidence columns: lint first (when any scenario names a static check), then
24
- * each runtime quality-check present as an EVIDENCE OBLIGATION or as a posted EVIDENCE OBSERVATION
25
- * on a scenario row, in canonical quality-check order.
26
- */
27
8
  export declare function evidenceColumns(scenarios: readonly ScenarioReconciliation[]): EvidenceColumn[];
28
- /** The column's header — the tag word, title-cased (Lint / Unit / Integration / …). */
29
9
  export declare function columnHeader(col: EvidenceColumn): string;
30
- /**
31
- * One evidence cell — the two-sided `<obligation>/<observation>` encoding. The LEFT side is the
32
- * EVIDENCE OBLIGATION (a single quality-check letter iff the scenario obligated this check, else `-`); the RIGHT
33
- * side is the OBSERVATION count (the multiplicity of posted credits at this check, else `-`). It
34
- * projects the two-sided ledger row — it reconstructs nothing. It counts BACKING (presence), NOT
35
- * quality: a failing runtime evidenceObligation still shows its credit count (the failing-ness lives
36
- * in the Verdict + Reconciling-items columns), so `U/-` is unambiguously named-but-missing (zero
37
- * evidenceObservations). A `-/N` cell is a NO-EVIDENCE-OBLIGATION observation (a credit at a check the scenario
38
- * did not name, @SCN-LDG-008); a doubly-empty `-/-` renders BLANK (`""`) — no evidence obligation, no credit.
39
- * The lint cell reads the scenario's static evidenceObligation outcomes (lint is not a counted
40
- * evidence observation): its right side is the count of static checks PRESENT — `balanced` or the
41
- * watermelon (the script exists; its inadequacy is quality, in Reconciling-items 🍉), NOT a posted
42
- * credit. The count exposes backing, not quality — never rank by it.
43
- */
44
10
  export declare function evidenceCell(s: ScenarioReconciliation, col: EvidenceColumn): string;
45
11
  //# sourceMappingURL=evidenceGrid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"evidenceGrid.d.ts","sourceRoot":"","sources":["../../src/render/evidenceGrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAgB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAS7F;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEvG;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,sBAAsB,EAAE,GAC3C,cAAc,EAAE,CAgClB;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAGxD;AAiBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,sBAAsB,EACzB,GAAG,EAAE,cAAc,GAClB,MAAM,CAMR"}
1
+ {"version":3,"file":"evidenceGrid.d.ts","sourceRoot":"","sources":["../../src/render/evidenceGrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAgB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAS7F,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAiB1G,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,sBAAsB,EAAE,GAC3C,cAAc,EAAE,CAYlB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAGxD;AAUD,wBAAgB,YAAY,CAC1B,CAAC,EAAE,sBAAsB,EACzB,GAAG,EAAE,cAAc,GAClB,MAAM,CAGR"}
@@ -1,143 +1,61 @@
1
- /**
2
- * THE LEDGER'S EVIDENCE GRID — the corpus-driven evidence columns the Scenario Reconciliations table
3
- * gains when the runtime-observation axis is in play, and the two-sided cell under each.
4
- *
5
- * Its own module rather than a block in `markdown.ts`, moved out whole at 3F-3524 so the ledger
6
- * section's split into functions under the complexity and function-length ceilings did not push
7
- * the file past its `max-lines`; `staticChecks.ts` and `runVerdict.ts` are the precedent. NOTHING
8
- * about the grid changed in the move: same columns, same headers, same cells.
9
- */
10
1
  import { RUNTIME_QUALITY_CHECKS } from "../domain/ledger.js";
11
- import { isScenario, staticCheckReconciliationsOf, presentStaticCheckCountOf, } from "../domain/scenarioReconciliation.js";
2
+ import { isScenario, fitnessFunctionReconciliationsOf, presentFitnessFunctionCountOf, } from "../domain/scenarioReconciliation.js";
12
3
  import { evidenceObligationsOf } from "../domain/journal.js";
13
- /**
14
- * The corpus-driven evidence columns: lint first (when any scenario names a static check), then
15
- * each runtime quality-check present as an EVIDENCE OBLIGATION or as a posted EVIDENCE OBSERVATION
16
- * on a scenario row, in canonical quality-check order.
17
- */
18
- export function evidenceColumns(scenarios) {
19
- // Only scenario rows carry evidence obligations that drive columns — a phantom / suspense
20
- // row's credit-side items are not evidence obligations, so they never add a column.
21
- const scenarioRows = scenarios.filter(isScenario);
22
- // ASKED (3F-2203) — whether a row has static-check sub-rows is the same model cut the grid cell
23
- // and the lint table read. Whether a COLUMN then appears is the renderer's own business; what a
24
- // row's lint sub-rows ARE is not.
25
- const hasStatic = scenarioRows.some((s) => staticCheckReconciliationsOf(s).length > 0);
26
- const qualityChecksPresent = new Set();
27
- // A column appears for every runtime quality-check present in EVIDENCE OBLIGATION or OBSERVATION on a scenario
28
- // row. Both are read off the Ledger: a named or no-evidence-obligation quality-check surfaces as a
29
- // `QualityCheckReconciliation` at that check; every observed credit surfaces as a posted credit on
30
- // the row (@SCN-LDG-022). The retired census's `attributed[]` re-represented those posted credits
31
- // — it added no quality-check the rows do not already carry (a matched/no-evidence-obligation credit always
32
- // has its `QualityCheckReconciliation`), so folding the rows keeps the column set byte-identical.
4
+ function runtimeQualityChecksPresent(scenarioRows) {
5
+ const present = new Set();
33
6
  for (const s of scenarioRows) {
34
7
  for (const o of s.qualityCheckReconciliations) {
35
- // A both-missing item carries no quality-check — it drives no column.
36
- if (o.qualityCheck && o.qualityCheck !== "lint")
37
- qualityChecksPresent.add(o.qualityCheck);
8
+ if (o.qualityCheck && o.qualityCheck !== "fitness")
9
+ present.add(o.qualityCheck);
38
10
  }
39
11
  for (const o of s.evidenceObservations) {
40
- if (o.qualityCheck !== "lint")
41
- qualityChecksPresent.add(o.qualityCheck);
12
+ if (o.qualityCheck !== "fitness")
13
+ present.add(o.qualityCheck);
42
14
  }
43
15
  }
16
+ return present;
17
+ }
18
+ export function evidenceColumns(scenarios) {
19
+ const scenarioRows = scenarios.filter(isScenario);
20
+ const hasFitnessFunction = scenarioRows.some((s) => fitnessFunctionReconciliationsOf(s).length > 0);
21
+ const qualityChecksPresent = runtimeQualityChecksPresent(scenarioRows);
44
22
  const columns = [];
45
- if (hasStatic)
46
- columns.push({ kind: "lint" });
23
+ if (hasFitnessFunction)
24
+ columns.push({ kind: "fitness" });
47
25
  for (const qualityCheck of RUNTIME_QUALITY_CHECKS) {
48
26
  if (qualityChecksPresent.has(qualityCheck))
49
27
  columns.push({ kind: "runtime", qualityCheck });
50
28
  }
51
29
  return columns;
52
30
  }
53
- /** The column's header — the tag word, title-cased (Lint / Unit / Integration / …). */
54
31
  export function columnHeader(col) {
55
- const word = col.kind === "lint" ? "lint" : col.qualityCheck;
32
+ const word = col.kind === "fitness" ? "fitness" : col.qualityCheck;
56
33
  return word.charAt(0).toUpperCase() + word.slice(1);
57
34
  }
58
- /**
59
- * The quality-check → single-letter obligation glyph, parallel to `columnHeader` — the LEFT side
60
- * of the two-sided cell (the evidence obligation). A single letter names WHICH check is obligated; the right
61
- * side (after the `/`) carries the OBSERVATION count (the credit). Lint's left MAY carry a count
62
- * suffix (`L2`/`L3`) when a scenario names more than one static check — the evidence-obligation
63
- * count; the runtime letters stay countless (one obligation per tier).
64
- */
65
35
  const QUALITY_CHECK_LETTER = {
66
- lint: "L",
36
+ fitness: "F",
67
37
  unit: "U",
68
38
  integration: "I",
69
39
  e2e: "E",
70
40
  performance: "P",
71
41
  };
72
- /**
73
- * One evidence cell — the two-sided `<obligation>/<observation>` encoding. The LEFT side is the
74
- * EVIDENCE OBLIGATION (a single quality-check letter iff the scenario obligated this check, else `-`); the RIGHT
75
- * side is the OBSERVATION count (the multiplicity of posted credits at this check, else `-`). It
76
- * projects the two-sided ledger row — it reconstructs nothing. It counts BACKING (presence), NOT
77
- * quality: a failing runtime evidenceObligation still shows its credit count (the failing-ness lives
78
- * in the Verdict + Reconciling-items columns), so `U/-` is unambiguously named-but-missing (zero
79
- * evidenceObservations). A `-/N` cell is a NO-EVIDENCE-OBLIGATION observation (a credit at a check the scenario
80
- * did not name, @SCN-LDG-008); a doubly-empty `-/-` renders BLANK (`""`) — no evidence obligation, no credit.
81
- * The lint cell reads the scenario's static evidenceObligation outcomes (lint is not a counted
82
- * evidence observation): its right side is the count of static checks PRESENT — `balanced` or the
83
- * watermelon (the script exists; its inadequacy is quality, in Reconciling-items 🍉), NOT a posted
84
- * credit. The count exposes backing, not quality — never rank by it.
85
- */
86
42
  export function evidenceCell(s, col) {
87
- // A PHANTOM / suspense row has no evidence obligation of its own — its
88
- // whole story is the credit-side reconciling item. Every evidence cell is neither-named-nor-
89
- // matched, so it reads `—`; the citation shows in Reconciling items.
90
43
  if (!isScenario(s))
91
44
  return "—";
92
- return col.kind === "lint" ? lintCell(s) : runtimeCell(s, col.qualityCheck);
45
+ return col.kind === "fitness" ? fitnessCell(s) : runtimeCell(s, col.qualityCheck);
93
46
  }
94
- /**
95
- * The two sides joined — except a doubly-empty cell (no evidence obligation, no credit), which
96
- * renders BLANK: the column is simply absent for this scenario.
97
- */
98
47
  function twoSided(left, right) {
99
48
  return left === "-" && right === "-" ? "" : `${left}/${right}`;
100
49
  }
101
- /** The lint column's cell on a scenario row. */
102
- function lintCell(s) {
103
- // LEFT: a lint obligation is NAMED iff a lint QualityCheckReconciliation exists on the row
104
- // (`L`; `L2`/`L3` when the row names >1 static check — the evidence-obligation count, one
105
- // lint QCR per `@lint=<guard>` obligation). RIGHT: the PRESENT-guard count — the
106
- // static checks `satisfied` or watermelon. Lint's right stays this static-outcome derivation
107
- // (NOT `evidenceObservations`): lint carries no credit multiplicity, so the count is exact.
108
- // BOTH SIDES ASKED (3F-2203) — the named-guard sub-rows and the present-guard count are
109
- // model facts, read off the row. "Present" spans satisfied AND watermelon (a watermelon guard
110
- // EXISTS; its inadequacy is quality, shown in Reconciling items 🍉) — an outcome-vocabulary
111
- // rule, which is why the renderer no longer states it.
112
- const statics = staticCheckReconciliationsOf(s);
113
- const left = statics.length > 0
114
- ? QUALITY_CHECK_LETTER.lint + (statics.length > 1 ? String(statics.length) : "")
115
- : "-";
116
- const present = presentStaticCheckCountOf(s);
50
+ function fitnessCell(s) {
51
+ const left = fitnessFunctionReconciliationsOf(s).length > 0 ? QUALITY_CHECK_LETTER.fitness : "-";
52
+ const present = presentFitnessFunctionCountOf(s);
117
53
  const right = present > 0 ? String(present) : "-";
118
54
  return twoSided(left, right);
119
55
  }
120
- /** A runtime quality-check column's cell on a scenario row. */
121
56
  function runtimeCell(s, qualityCheck) {
122
- // LEFT — EVIDENCE OBLIGATION is ASKED of the Ledger, not reconstructed. `s.evidenceObligations` is the debit
123
- // side the scenario RAISED (@SCN-LDG-023) — the fact itself — filtered to the ACTIVE ones: a
124
- // `<qc>pending` obligation names NOTHING (it partitions off to a one-sided Pending Item), so it
125
- // is not an evidence obligation. Named → the check's letter; else `-`.
126
- // ASKED, not re-encoded (3F-2203). "A pending obligation names nothing" is the model's rule
127
- // (canon, Pending Item — a `<qc>pending` tag raises NO Evidence Obligation), and it is the SAME
128
- // rule `evidenceObligationPairsOf` applies. The renderer stated the
129
- // `!pending` clause itself before: a third home for one rule, agreeing by copy.
130
57
  const named = evidenceObligationsOf(s.evidenceObligations).some((o) => o.qualityCheck === qualityCheck);
131
58
  const left = named ? QUALITY_CHECK_LETTER[qualityCheck] : "-";
132
- // RIGHT — the OBSERVATION count is the MULTIPLICITY of POSTED CREDITS at this quality-check on THIS
133
- // row (@SCN-LDG-022) — read straight off the Ledger's `evidenceObservations`, NEVER from
134
- // `qualityCheckReconciliations` (which collapse to ONE matched row however many credits cite the
135
- // pair, and would undercount duplicate citations). BOTH the named and no-evidence-obligation arms read this
136
- // one source: a named check's credits are matched-attributed, a no-evidence-obligation check's credits post
137
- // as no-evidence-obligation rows — the same posted credits either way, so `evidenceObservations` is the single
138
- // multiplicity-correct count. (Provably equal to the retired split off `qualityCheckReconciliations`
139
- // for the no-evidence-obligation arm — the reconciler posts one no-evidence-obligation QCR per citing credit — but that
140
- // derivation collapses duplicate citations, so the credits are the correct source.)
141
59
  const observed = s.evidenceObservations.filter((o) => o.qualityCheck === qualityCheck).length;
142
60
  const right = observed > 0 ? String(observed) : "-";
143
61
  return twoSided(left, right);
@@ -1 +1 @@
1
- {"version":3,"file":"evidenceGrid.js","sourceRoot":"","sources":["../../src/render/evidenceGrid.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evidenceGrid.js","sourceRoot":"","sources":["../../src/render/evidenceGrid.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,3 @@
1
- /**
2
- * THE STEPS THE TARGET NAMED NON-CHECKS (@SCN-USG-015), and the entries of its list that named no
3
- * step at all.
4
- *
5
- * THIS SECTION IS WHY THE EXCLUSION IS ALLOWED TO EXIST. A step that reaches the reader leaves it
6
- * as an observation, as a behavioural runner, as the reconciler, or as a step the consumer named a
7
- * non-check — and none of those four is silent. An exclusion that simply removed a step would be
8
- * the very silence this axis exists to end, arriving in a new coat and with the consumer's own
9
- * signature on it, so the price of being able to say "not a check" is being told what it took out.
10
- *
11
- * TWO SENTENCES, BECAUSE THE TWO HALVES ARE OPPOSITE FACTS. An entry that named a step took one out
12
- * of discovery, which is a thing that happened and a thing to check. An entry that named none took
13
- * nothing out — a stale line, most often a step renamed since it was written — and reading it as
14
- * the first would tell the consumer their pipeline is narrower than it is.
15
- *
16
- * Its own module rather than a further section in `markdown.ts`, which sits at a `max-lines`
17
- * exception — and an exception excuses existing debt, never headroom. The precedent is
18
- * `runVerdict.ts` and, one sub-issue along, `behaviouralRunners.ts`.
19
- */
20
1
  import type { RenderInput } from "../assemble/renderInput.js";
21
- /**
22
- * The excluded steps and the stale entries, or nothing at all.
23
- *
24
- * OMITTED WHEN THE TARGET HAS NAMED NO NON-CHECKS, which is every target that carries no such
25
- * list: the section appears only when there is something the consumer said, and every other
26
- * report is byte-identical to what it was.
27
- */
28
2
  export declare const excludedStepsSection: (report: RenderInput) => string[];
29
3
  //# sourceMappingURL=excludedSteps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"excludedSteps.d.ts","sourceRoot":"","sources":["../../src/render/excludedSteps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAgBhE,CAAC"}
1
+ {"version":3,"file":"excludedSteps.d.ts","sourceRoot":"","sources":["../../src/render/excludedSteps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,eAAO,MAAM,oBAAoB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAWhE,CAAC"}
@@ -1,42 +1,14 @@
1
- /**
2
- * THE STEPS THE TARGET NAMED NON-CHECKS (@SCN-USG-015), and the entries of its list that named no
3
- * step at all.
4
- *
5
- * THIS SECTION IS WHY THE EXCLUSION IS ALLOWED TO EXIST. A step that reaches the reader leaves it
6
- * as an observation, as a behavioural runner, as the reconciler, or as a step the consumer named a
7
- * non-check — and none of those four is silent. An exclusion that simply removed a step would be
8
- * the very silence this axis exists to end, arriving in a new coat and with the consumer's own
9
- * signature on it, so the price of being able to say "not a check" is being told what it took out.
10
- *
11
- * TWO SENTENCES, BECAUSE THE TWO HALVES ARE OPPOSITE FACTS. An entry that named a step took one out
12
- * of discovery, which is a thing that happened and a thing to check. An entry that named none took
13
- * nothing out — a stale line, most often a step renamed since it was written — and reading it as
14
- * the first would tell the consumer their pipeline is narrower than it is.
15
- *
16
- * Its own module rather than a further section in `markdown.ts`, which sits at a `max-lines`
17
- * exception — and an exception excuses existing debt, never headroom. The precedent is
18
- * `runVerdict.ts` and, one sub-issue along, `behaviouralRunners.ts`.
19
- */
20
- /**
21
- * The excluded steps and the stale entries, or nothing at all.
22
- *
23
- * OMITTED WHEN THE TARGET HAS NAMED NO NON-CHECKS, which is every target that carries no such
24
- * list: the section appears only when there is something the consumer said, and every other
25
- * report is byte-identical to what it was.
26
- */
1
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
27
2
  export const excludedStepsSection = (report) => {
28
3
  const excluded = report.summary.excludedSteps ?? [];
29
4
  const unmatched = report.summary.unmatchedNotChecks ?? [];
30
5
  if (excluded.length === 0 && unmatched.length === 0)
31
6
  return [];
32
7
  return [
33
- "### Excluded steps",
8
+ CORE_MESSAGES[CoreMessage.ExcludedStepsHeading],
34
9
  "",
35
- ...excluded.map((entry) => `- ${entry} — excluded: the target names this step a non-check.`),
36
- // AFTER THE STEPS THAT WERE EXCLUDED, because those are what the list did and these are what
37
- // it failed to do. A consumer reads what came out of discovery and then what they wrote that
38
- // took nothing out of it.
39
- ...unmatched.map((entry) => `- ${entry} — matches no step: the entry names nothing this run read.`),
10
+ ...excluded.map((entry) => `- ${CORE_MESSAGES[CoreMessage.StepExcluded](entry)}`),
11
+ ...unmatched.map((entry) => `- ${CORE_MESSAGES[CoreMessage.NotChecksEntryMatchesNoStep](entry)}`),
40
12
  "",
41
13
  ];
42
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"excludedSteps.js","sourceRoot":"","sources":["../../src/render/excludedSteps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,IAAI,EAAE,CAAC;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/D,OAAO;QACL,oBAAoB;QACpB,EAAE;QACF,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,sDAAsD,CAAC;QAC5F,6FAA6F;QAC7F,6FAA6F;QAC7F,0BAA0B;QAC1B,GAAG,SAAS,CAAC,GAAG,CACd,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,4DAA4D,CAClF;QACD,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"excludedSteps.js","sourceRoot":"","sources":["../../src/render/excludedSteps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,IAAI,EAAE,CAAC;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/D,OAAO;QACL,aAAa,CAAC,WAAW,CAAC,oBAAoB,CAAC;QAC/C,EAAE;QACF,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACjF,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACjG,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderInput } from "../assemble/renderInput.js";
2
+ export declare const fitnessFunctionsSection: (report: RenderInput) => string[];
3
+ //# sourceMappingURL=fitnessFunctions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fitnessFunctions.d.ts","sourceRoot":"","sources":["../../src/render/fitnessFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,eAAO,MAAM,uBAAuB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAQnE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
2
+ export const fitnessFunctionsSection = (report) => {
3
+ const { fitnessFunctions: counts } = report.summary;
4
+ if (!counts)
5
+ return [];
6
+ return [
7
+ CORE_MESSAGES[CoreMessage.FitnessFunctionsHeading], "",
8
+ CORE_MESSAGES[CoreMessage.FitnessFunctionsCounts](counts.runningFitnessFunctionCount, counts.uncitedFitnessFunctionCount),
9
+ "",
10
+ ];
11
+ };
12
+ //# sourceMappingURL=fitnessFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fitnessFunctions.js","sourceRoot":"","sources":["../../src/render/fitnessFunctions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACvE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO;QACL,aAAa,CAAC,WAAW,CAAC,uBAAuB,CAAC,EAAE,EAAE;QACtD,aAAa,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,2BAA2B,EAAE,MAAM,CAAC,2BAA2B,CAAC;QACzH,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
@@ -1,14 +1,3 @@
1
- /**
2
- * The JSON renderer — the machine-readable whole-document report, the sibling of the
3
- * markdown renderer. Now GLUE-FREE (@SCN-RMD-001): it serialises the ONE
4
- * whole-document report model (`assembleRenderInput`) with `JSON.stringify`, no per-key
5
- * hand-assembly. The report model — not this renderer — owns the section set, the
6
- * document order, and the manifesto-vocabulary key names. So the JSON is provably
7
- * the model, not a lossy projection: humans read the markdown; machines/CI read the json;
8
- * both are one model in two renderings.
9
- *
10
- * Parent: (@SCN-RMD-001).
11
- */
12
1
  import type { EvidenceReconciliation } from "../domain/evidenceReconciliation.js";
13
2
  import type { RunContext } from "../provenance/provenance.js";
14
3
  import type { EvidenceObligations } from "../census/evidenceObligations.js";
@@ -1 +1 @@
1
- {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/render/json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,wBAAgB,UAAU,CACxB,sBAAsB,EAAE,sBAAsB,EAC9C,GAAG,EAAE,UAAU,EACf,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,YAAY,CAAC,EAAE,YAAY,GAC1B,MAAM,CAMR"}
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/render/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,wBAAgB,UAAU,CACxB,sBAAsB,EAAE,sBAAsB,EAC9C,GAAG,EAAE,UAAU,EACf,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,YAAY,CAAC,EAAE,YAAY,GAC1B,MAAM,CAMR"}
@@ -1,14 +1,3 @@
1
- /**
2
- * The JSON renderer — the machine-readable whole-document report, the sibling of the
3
- * markdown renderer. Now GLUE-FREE (@SCN-RMD-001): it serialises the ONE
4
- * whole-document report model (`assembleRenderInput`) with `JSON.stringify`, no per-key
5
- * hand-assembly. The report model — not this renderer — owns the section set, the
6
- * document order, and the manifesto-vocabulary key names. So the JSON is provably
7
- * the model, not a lossy projection: humans read the markdown; machines/CI read the json;
8
- * both are one model in two renderings.
9
- *
10
- * Parent: (@SCN-RMD-001).
11
- */
12
1
  import { assembleRenderInput } from "../assemble/renderInput.js";
13
2
  export function renderJson(evidenceReconciliation, ctx, evidenceObligations, featureNames) {
14
3
  return JSON.stringify(assembleRenderInput(evidenceReconciliation, ctx, evidenceObligations, featureNames), null, 2);
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/render/json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,UAAU,CACxB,sBAA8C,EAC9C,GAAe,EACf,mBAAyC,EACzC,YAA2B;IAE3B,OAAO,IAAI,CAAC,SAAS,CACnB,mBAAmB,CAAC,sBAAsB,EAAE,GAAG,EAAE,mBAAmB,EAAE,YAAY,CAAC,EACnF,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/render/json.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,UAAU,CACxB,sBAA8C,EAC9C,GAAe,EACf,mBAAyC,EACzC,YAA2B;IAE3B,OAAO,IAAI,CAAC,SAAS,CACnB,mBAAmB,CAAC,sBAAsB,EAAE,GAAG,EAAE,mBAAmB,EAAE,YAAY,CAAC,EACnF,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,63 +1,9 @@
1
- /**
2
- * The markdown renderer — the human-readable spec reconciliation: summary views up
3
- * top (the derived cuts OF the reconciliation), the per-scenario Scenario Reconciliations last.
4
- * Each Scenario Reconciliation row carries its binary VERDICT (balanced | out-of-balance) and the
5
- * LIST of EVERY reconciling item that holds it out of balance (no single
6
- * picked winner; an out-of-balance scenario lists all its non-balanced items, typed).
7
- *
8
- * A PURE PRESENTATION of the shared whole-document `EvidenceReconciliation` model: the JSON
9
- * renderer serialises that model, and this renderer projects the SAME model to markdown,
10
- * so the two outputs are one model in two renderings and cannot diverge. `renderMarkdown`
11
- * keeps its `(balance, ctx, …)` signature — it builds `assembleRenderInput(...)` internally
12
- * (mirroring `json.ts`) then delegates to `renderReport(report, featureNames)`, the
13
- * from-model pipeline (exposed for slice 3's render-from-saved-JSON path). Every section
14
- * emitter reads MATERIALISED fields off the report rather than recomputing them.
15
- *
16
- * The report IS the reconciliation; the per-scenario Evidence reconciliation is its core, and the
17
- * summary views — the Evidence reconciliation aggregate (the balance-check that verifies the accounts
18
- * agree), lint evidence obligations, out-of-balance by feature — are cuts OF it. Layout
19
- * reorganised summary-first / ledger-last.
20
- *
21
- * Parent: (@SCN-LDG-001).
22
- */
23
1
  import type { RunContext } from "../provenance/provenance.js";
24
- import type { EvidenceObligations } from "../census/evidenceObligations.js";
2
+ import { type EvidenceObligations } from "../census/evidenceObligations.js";
25
3
  import { type RenderInput } from "../assemble/renderInput.js";
26
4
  import type { EvidenceReconciliation } from "../domain/evidenceReconciliation.js";
27
- /**
28
- * The target-derived `feature-code → slug` map — a markdown-only render arg (NOT
29
- * serialised by `renderJson`, NOT part of the shared `EvidenceReconciliation` model). Built by
30
- * `readFeatureNames` over `discoverFeatures`: each coded feature file's `@<FFF>` header maps
31
- * to its filename slug. Display enrichment for the by-feature cut (keyed on the `FFF` already
32
- * in every `scnId`), not a non-derivable machine fact — so it stays off the JSON surface.
33
- */
34
5
  export type FeatureNames = ReadonlyMap<string, string>;
35
- /**
36
- * Render the whole-document report model to markdown — the from-model pipeline,
37
- * a PURE PRESENTATION over the same `EvidenceReconciliation` the JSON serialises. Exposed for slice 3's
38
- * render-from-saved-JSON path: a consumer rebuilds a `EvidenceReconciliation` from banked JSON and
39
- * renders the human view off it, with no `RunContext` in hand. Needs NO external map — the
40
- * feature titles are read off `report.metadata.featureNames` (@SCN-RMD-006; nested under
41
- * `metadata`), so the by-feature cut names each feature in full from the model alone.
42
- */
43
6
  export declare function renderReport(report: RenderInput): string;
44
- /**
45
- * Regenerate the markdown from a banked `spec-reconciliation.json` ALONE (@SCN-RMD-007)
46
- * — the render-from-saved-JSON seam. `JSON.parse` the stored whole-document report back into a
47
- * `EvidenceReconciliation` and render it via `renderReport`: no `RunContext`, no live inputs, the JSON is the
48
- * whole document. Drift-equality is the acceptance — the markdown from the saved JSON equals the
49
- * markdown rendered directly from the same run (the by-feature titles included, which is why the
50
- * feature-title model-completion @SCN-RMD-006 is the enabling dependency). The load-bearing proof
51
- * that the JSON is the model, not a lossy projection.
52
- */
53
7
  export declare function renderReportFromJson(json: string): string;
54
- /**
55
- * Render the reconciliation to markdown. Keeps its `(balance, ctx, …)` signature (mirroring
56
- * `json.ts`): it assembles the shared whole-document report from the reconcile pieces —
57
- * threading the live `featureNames` title source INTO `assembleRenderInput`, so the titles
58
- * land on the model — then delegates to `renderReport`. So `writer.ts` and the unit tests are
59
- * untouched, the markdown stays byte-identical (same slugs, now model-sourced), and it is
60
- * provably a presentation of the same model the JSON serialises.
61
- */
62
8
  export declare function renderMarkdown(evidenceReconciliation: EvidenceReconciliation, ctx: RunContext, evidenceObligations?: EvidenceObligations, featureNames?: FeatureNames): string;
63
9
  //# sourceMappingURL=markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/render/markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAcH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AA2LlF;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AA6dvD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAExD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,sBAAsB,EAAE,sBAAsB,EAC9C,GAAG,EAAE,UAAU,EACf,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,YAAY,CAAC,EAAE,YAAY,GAC1B,MAAM,CAER"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/render/markdown.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAEL,KAAK,mBAAmB,EAGzB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAwFlF,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AA0SvD,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAExD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,cAAc,CAC5B,sBAAsB,EAAE,sBAAsB,EAC9C,GAAG,EAAE,UAAU,EACf,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,YAAY,CAAC,EAAE,YAAY,GAC1B,MAAM,CAER"}