@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,109 +1,30 @@
1
- /**
2
- * The `ingest/vitest` reader — one of the two named observed-evidence readers
3
- * (the embryonic adapters, deliberately not a registry in v1). Reads Vitest's
4
- * JSON reporter output and normalises each assertion that cites an @SCN id into
5
- * an EvidenceObservation at the `unit` level.
6
- *
7
- * The level is supplied by the CALLER, not inferred: the caller states the level this Vitest
8
- * source yields, and the reader stamps it — no Vitest⇒unit assumption baked into the parser. The
9
- * JS-ecosystem default (unit) is set at the CLI edge.
10
- *
11
- * The @SCN id is the bracketed `[SCN-<FFF>-<NNN>]` token carried in the test's
12
- * `describe`/`it` name (the bidirectional-link rule). The bracket is what makes it a
13
- * citation and not a mention: this module's regex used to match any SCN-shaped token
14
- * anywhere in the name, so fixture data and prose cross-references cited scenarios nobody
15
- * meant to cite (@SCN-LDG-033, 3F-2368). The form now lives in `lib/scnCitation.ts`,
16
- * shared with the scn-subissue gate's cite scan so one answer serves both readers.
17
- *
18
- * Vitest surfaces the assertion's OWN name as `assertionResults[].title` and its
19
- * ANCESTOR PATH (describe → it) as `fullName`;
20
- * the citation belongs to the assertion, so the reader reads the leaf's title FIRST and
21
- * falls back to the ancestor path only when the leaf does not self-cite — most-specific-
22
- * citation-wins (@SCN-LDG-016).
23
- *
24
- * The reader classifies THREE-WAY (@SCN-PND-015), uniform with the cucumber reader
25
- * (@SCN-PND-013): a `passed` assertion → a `passed` observation (satisfied); a `failed`
26
- * assertion → a `failed` observation (failing); an INCONCLUSIVE vitest status (`skipped`/`todo`,
27
- * and any status ∉ {passed, failed}) → the assertion is DROPPED (no observation), so its
28
- * obligation reconciles missing by absence — pending is never inferred from status. A skipped/todo
29
- * unit test is a GAP, not a failure.
30
- *
31
- * Parent: @SCN-LDG-001 (the foundation seam; balanced path).
32
- */
33
1
  import { relativizeToRoot } from "../lib/portablePath.js";
34
2
  import { parseScnCitation } from "../lib/scnCitation.js";
35
- /**
36
- * Parse a Vitest JSON report into observed results at the CALLER-SUPPLIED level. One result per
37
- * EMITTED assertion: those carrying an @SCN id cite that scenario; those with NO id emit a
38
- * null-scnId credit (@SCN-LDG-007 — previously DROPPED). A null-scnId credit cites no scenario,
39
- * so the reconciler folds it into the SUSPENSE row. Every result carries its test-file locator.
40
- *
41
- * THREE-WAY classification (@SCN-PND-015), uniform with the cucumber reader (@SCN-PND-013) —
42
- * pending is NEVER inferred from status:
43
- * - `passed` → a `passed` observation → satisfied.
44
- * - `failed` → a `failed` observation → failing.
45
- * - otherwise (`skipped`/`todo`, and any status ∉ {passed, failed}) → INCONCLUSIVE: an assertion
46
- * that RAN but proved nothing. Emit NOTHING — the evidence obligation then finds no matching
47
- * observation and reconciles missing BY ABSENCE.
48
- * Treating any non-pass-non-fail status as inconclusive keeps the reader robust to vitest's status
49
- * spelling (`skipped`/`todo`/`pending`). `EvidenceStatus` stays binary (no new status, no reconciler
50
- * change): the DROP is what realises inconclusive→missing. The uncited (null-scnId) SUSPENSE credit
51
- * is preserved for genuine passed/failed results — only inconclusive assertions are dropped.
52
- */
3
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
53
4
  export function parseVitestEvidenceObservations(report, qualityCheck, root) {
54
5
  const results = [];
55
6
  for (const file of report.testResults ?? []) {
56
- // The test-file locator (the where-to-fix) — carried on every credit (ruling
57
- // Q5), made portable relative to the run root (verbatim when no root given).
58
- const locator = relativizeToRoot(file.name ?? "(unknown vitest file)", root);
59
- // BROKEN, NOT ABSENT (@SCN-LDG-017) — the COLLECTION FAILURE. A file that failed to collect
60
- // reports `status: "failed"` WITH a message and ZERO assertionResults: it errored before it
61
- // named a test. Walking `assertionResults[]` alone saw nothing to emit, so the scenario whose
62
- // proof lived here reconciled `missing` — indistinguishable from an unwritten test, and the
63
- // wrong remedy (write a test vs fix the harness). Emit ONE observation carrying the collection
64
- // failure: `broken: true`, the file locator (WHERE to fix), and the runner's message (WHAT
65
- // broke). It cites NO scenario (`scnId: null`) — a suite that named no test cites no @SCN — so
66
- // the reconciler posts it to the SUSPENSE row.
67
- //
68
- // The signature is the PAIR (failed + zero assertions), never file status alone: an ordinary
69
- // red run also reports `status: "failed"` at file level, but its assertions ARE named and
70
- // attributable, and already land as `failing` on the scenarios they cite (the boundary). A
71
- // green file with zero assertions is likewise not broken — nothing errored.
7
+ const locator = relativizeToRoot(file.name ?? CORE_MESSAGES[CoreMessage.UnknownVitestFile], root);
72
8
  const assertions = file.assertionResults ?? [];
73
9
  if (file.status === "failed" && assertions.length === 0) {
74
10
  results.push({
75
11
  qualityCheck,
76
12
  scnId: null,
77
- // `status` is structurally required and the runner did report `failed`; the FAIL-SAFE in
78
- // the reconciler checks `broken` BEFORE `status`, so this never reconciles as `failing`.
79
13
  status: "failed",
80
14
  locator,
81
15
  broken: true,
82
- ...(file.message !== undefined ? { message: file.message } : {}),
16
+ message: file.message,
83
17
  });
84
18
  continue;
85
19
  }
86
20
  for (const assertion of assertions) {
87
21
  const status = assertion.status;
88
- // THREE-WAY (@SCN-PND-015): drop any inconclusive assertion (status ∉ {passed, failed}) —
89
- // skipped/todo/pending/undefined proved nothing, so the obligation reconciles missing by
90
- // absence. Only genuine passed/failed emit (the guard narrows `status` to EvidenceStatus).
91
22
  if (status !== "passed" && status !== "failed")
92
23
  continue;
93
- // MOST-SPECIFIC-CITATION-WINS (@SCN-LDG-016): the citation belongs to the ASSERTION, and
94
- // the assertion's OWN name is `title`; `fullName` is the ancestor PATH (outermost describe
95
- // → innermost it). So read the leaf's own title FIRST and fall back to the ancestor path
96
- // only when the leaf does not self-cite. This preserves the "describe carries the bracket,
97
- // plain `it`s beneath" style (a bare leaf falls through to the describe's citation) while
98
- // letting a self-citing leaf OVERRIDE its ancestor. The retired first-match-on-
99
- // `fullName + " " + title` did the opposite: a grouping describe's citation SHADOWED a
100
- // self-citing child, so the leaf's scenario reconciled missing while the ancestor took a
101
- // spurious SECOND credit. Semantic, not positional — last-match on the concatenation would
102
- // misfire when a leaf's prose names a second scenario after its own.
103
24
  const scnId = parseScnCitation(assertion.title ?? "") ?? parseScnCitation(assertion.fullName ?? "");
104
25
  results.push({
105
26
  qualityCheck,
106
- scnId, // no BRACKETED @SCN → an uncited credit (SUSPENSE).
27
+ scnId,
107
28
  status,
108
29
  locator,
109
30
  });
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/parse/vitest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAyBzD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,+BAA+B,CAC7C,MAAwB,EACxB,YAAiC,EACjC,IAAa;IAEb,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QAC5C,6EAA6E;QAC7E,6EAA6E;QAC7E,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,IAAI,uBAAuB,EAAE,IAAI,CAAC,CAAC;QAC7E,4FAA4F;QAC5F,4FAA4F;QAC5F,8FAA8F;QAC9F,4FAA4F;QAC5F,+FAA+F;QAC/F,2FAA2F;QAC3F,+FAA+F;QAC/F,+CAA+C;QAC/C,EAAE;QACF,6FAA6F;QAC7F,0FAA0F;QAC1F,2FAA2F;QAC3F,4EAA4E;QAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC;gBACX,YAAY;gBACZ,KAAK,EAAE,IAAI;gBACX,yFAAyF;gBACzF,yFAAyF;gBACzF,MAAM,EAAE,QAAQ;gBAChB,OAAO;gBACP,MAAM,EAAE,IAAI;gBACZ,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAChC,0FAA0F;YAC1F,yFAAyF;YACzF,2FAA2F;YAC3F,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;gBAAE,SAAS;YACzD,yFAAyF;YACzF,2FAA2F;YAC3F,yFAAyF;YACzF,2FAA2F;YAC3F,0FAA0F;YAC1F,gFAAgF;YAChF,uFAAuF;YACvF,yFAAyF;YACzF,2FAA2F;YAC3F,qEAAqE;YACrE,MAAM,KAAK,GACT,gBAAgB,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC;gBACX,YAAY;gBACZ,KAAK,EAAE,oDAAoD;gBAC3D,MAAM;gBACN,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/parse/vitest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAenE,MAAM,UAAU,+BAA+B,CAC7C,MAAwB,EACxB,YAAiC,EACjC,IAAa;IAEb,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;QAClG,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC;gBACX,YAAY;gBACZ,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,QAAQ;gBAChB,OAAO;gBACP,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAChC,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;gBAAE,SAAS;YACzD,MAAM,KAAK,GACT,gBAAgB,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC;gBACX,YAAY;gBACZ,KAAK;gBACL,MAAM;gBACN,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,30 +1,3 @@
1
- /**
2
- * The RunContext — run provenance threaded CLI→renderers as a SIBLING to the pure
3
- * Ledger, never folded into it. The Ledger model carries obligation-vs-observation
4
- * reconciliation only; run metadata — the input paths/flags used, the target repo, the
5
- * UTC run timestamp, the source SHA — is a separate concern carried alongside.
6
- *
7
- * Built once in the CLI (reusing the existing runStart; the target is the verbatim
8
- * --target) and threaded renderMarkdown(balance, ctx) / writeOutputs(... ctx);
9
- * it is threaded to renderJson too. The shared provenance projection (consumed by
10
- * the markdown header here and the JSON object) lives here so the two surfaces
11
- * never drift. This is the PURE provenance projection — the impure `resolveSourceSha` /
12
- * `resolveTargetRoot` git reads live in `run-management/resolveRunInputs.ts`.
13
- *
14
- * Parent: (@SCN-RPT-001).
15
- */
16
- /**
17
- * The CLI input paths/flags actually used for a run — each optional; only the ones
18
- * the operator supplied are present. The same --features/--vitest/--cucumber/--ci/
19
- * --package-json/--ci-steps seams as the CLI's ReconcileOptions.
20
- *
21
- * The converted checks' credit stream joined the interface at 3F-3184 (@SCN-RPT-027). It was
22
- * ALREADY flowing through it: `reconcileInputsOf` builds one ReconcileOptions and that same
23
- * object is assigned to `ctx.inputs`, so structural typing let the stream ride along unseen and
24
- * the block simply never named it. It is optional by design — passed only where the file
25
- * exists — which is exactly why its silence was ambiguous between "the run never got it" and
26
- * "the run got it and the block does not say so".
27
- */
28
1
  export interface RunInputs {
29
2
  features?: string;
30
3
  vitest?: string;
@@ -33,120 +6,39 @@ export interface RunInputs {
33
6
  packageJson?: string;
34
7
  ciSteps?: string;
35
8
  }
36
- /**
37
- * Run provenance — the sibling argument threaded CLI→renderers. `sourceSha` is the
38
- * target's resolved source revision, or null when unknown (a non-git target with no
39
- * --source-sha override).
40
- */
41
9
  export interface RunContext {
42
- /** The target-repo name — the verbatim --target, or "unknown-target" on omit. */
43
10
  target: string;
44
- /** The CLI input paths/flags actually used. */
45
11
  inputs: RunInputs;
46
- /** The run-start instant — the same Date that names the run dir. */
47
12
  runStart: Date;
48
- /** The target's source SHA, or null when unknown (non-git target). */
49
13
  sourceSha: string | null;
50
- /**
51
- * The TOOL's own git SHA — which spec-controller produced this run (3F-1916),
52
- * distinct from the target's `sourceSha`. Null when the tool is not a git checkout
53
- * (an installed package). OPTIONAL on the ctx: fixtures that do not exercise
54
- * tool-provenance omit it and the projection defaults it to null; the CLI always
55
- * resolves it via `resolveToolIdentity`.
56
- */
57
14
  toolSha?: string | null;
58
- /**
59
- * The TOOL's package version — always resolvable (read from the tool's own
60
- * package.json), so it attributes a run even when no git SHA is available. OPTIONAL
61
- * on the ctx (defaults to "unknown" in the projection); the CLI always sets it.
62
- */
63
15
  toolVersion?: string;
64
- /**
65
- * The run root the recorded input paths are made relative to — the exact
66
- * parallel of `countRuntimeEvidenceObservationKinds`'s root. Opt-in: when omitted, input paths are
67
- * recorded verbatim (existing ctx fixtures unchanged). The CLI sets it to the target
68
- * root (reconcile runs with cwd = the target repo root), so an absolute input path
69
- * under that root is recorded relative — a banked artefact stays portable.
70
- */
71
16
  root?: string;
17
+ strict?: boolean;
72
18
  }
73
- /** One input flag actually used, as the flag handle + the value the operator gave. */
74
19
  export interface ProvenanceInput {
75
20
  flag: string;
76
21
  value: string;
77
22
  }
78
- /**
79
- * The provenance FACTS — the single projection both report surfaces share so they
80
- * never drift (project design §1; slice design "Provenance projection"). The
81
- * markdown header formats it; the JSON `provenance` object will
82
- * serialise the same facts. `runStartUtc` is second-precision UTC; `sourceSha` is
83
- * carried raw (null preserved — markdown renders the null explicitly, JSON keeps it).
84
- */
85
23
  export interface ProvenanceFacts {
86
24
  target: string;
87
25
  inputs: ProvenanceInput[];
88
26
  runStartUtc: string;
89
27
  sourceSha: string | null;
90
- /** The tool's own SHA — which spec-controller produced the run (3F-1916); null when not a git checkout. */
91
28
  toolSha: string | null;
92
- /** The tool's package version — always present. */
93
29
  toolVersion: string;
94
- /**
95
- * The canonical input flags the run did NOT receive — the complement of `inputs` over
96
- * INPUT_FLAGS, in the same canonical order (@SCN-RPT-028, 3F-3155). @SCN-RPT-027 made the
97
- * block name every stream a run was handed, which killed the "handed it and the block does
98
- * not say so" reading; it left the other one alive, because absence from a list only informs
99
- * a reader who already holds the list. Naming the flags with no value is what makes the page
100
- * self-describing about the streams it did not get.
101
- *
102
- * PRESENTATION ONLY, AND THAT IS A RULING. It lives here and NOT on `ProvenanceObject`,
103
- * because the JSON persists a fact iff it is not derivable (see that interface) and absence
104
- * is exactly derivable — `inputs` plus this file's canonical flag list determines it. A
105
- * second persisted copy would agree with the first only until one of them was edited.
106
- */
107
30
  absentInputs: string[];
108
31
  }
109
- /**
110
- * The provenance OBJECT — the canonical projection of a RunContext to the
111
- * non-derivable run facts, the single shape both report surfaces consume so they
112
- * never drift (project design §1, §3; slice design "Provenance projection"). The
113
- * JSON `provenance` object serialises this verbatim ({ provenance, scenarios, warnings });
114
- * `projectProvenance` below derives the markdown header's presentation form from the
115
- * SAME source. `runTimestamp` is second-precision UTC; `inputs` carries only the flags
116
- * actually used (keyed by their canonical name); `sourceSha` is raw (null preserved).
117
- */
118
32
  export interface ProvenanceObject {
119
33
  target: string;
120
34
  sourceSha: string | null;
121
- /** The tool's own SHA (3F-1916) — which spec-controller produced the run; null when not a git checkout. */
122
35
  toolSha: string | null;
123
- /** The tool's package version — always present. */
124
36
  toolVersion: string;
125
37
  runTimestamp: string;
126
38
  inputs: RunInputs;
39
+ strict?: boolean;
127
40
  }
128
- /**
129
- * Project a RunContext to the canonical provenance object. The one helper the JSON
130
- * surface serialises and the markdown header (via `projectProvenance`) derives from —
131
- * the timestamp formatting, the source SHA, and the input-presence selection live here
132
- * once, so the two surfaces project the same ctx without duplicating field logic.
133
- */
134
41
  export declare function provenanceObject(ctx: RunContext): ProvenanceObject;
135
- /**
136
- * Project a canonical provenance OBJECT to the markdown header's presentation FACTS —
137
- * inputs as ordered `{flag, value}` pairs, the UTC timestamp as `runStartUtc`. This is
138
- * the projection that needs no `RunContext`: the markdown renderer reads it off the shared
139
- * report model's `runProvenance` (already a `ProvenanceObject`), so the human header and
140
- * the JSON object project the SAME facts without re-touching the ctx (slice 3's
141
- * render-from-saved-JSON path calls this directly). `projectProvenance(ctx)` delegates here.
142
- */
143
42
  export declare function projectProvenanceObject(obj: ProvenanceObject): ProvenanceFacts;
144
- /**
145
- * Project a RunContext to the markdown header's provenance facts — the presentation
146
- * form (inputs as ordered `{flag, value}` pairs, the UTC timestamp as `runStartUtc`).
147
- * Derived from the canonical `provenanceObject` (then `projectProvenanceObject`) so the
148
- * markdown header and the JSON object share the same timestamp, source SHA, and
149
- * input-presence selection (no re-derivation).
150
- */
151
43
  export declare function projectProvenance(ctx: RunContext): ProvenanceFacts;
152
44
  //# sourceMappingURL=provenance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/provenance/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,MAAM,EAAE,SAAS,CAAC;IAClB,oEAAoE;IACpE,QAAQ,EAAE,IAAI,CAAC;IACf,sEAAsE;IACtE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAgBD,sFAAsF;AACtF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2GAA2G;IAC3G,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;;OAYG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AA2BD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2GAA2G;IAC3G,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,CAWlE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,eAAe,CAwB9E;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,eAAe,CAElE"}
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/provenance/provenance.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAWD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAiBD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,CAUlE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,eAAe,CAoB9E;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,eAAe,CAElE"}
@@ -1,45 +1,15 @@
1
- /**
2
- * The RunContext — run provenance threaded CLI→renderers as a SIBLING to the pure
3
- * Ledger, never folded into it. The Ledger model carries obligation-vs-observation
4
- * reconciliation only; run metadata — the input paths/flags used, the target repo, the
5
- * UTC run timestamp, the source SHA — is a separate concern carried alongside.
6
- *
7
- * Built once in the CLI (reusing the existing runStart; the target is the verbatim
8
- * --target) and threaded renderMarkdown(balance, ctx) / writeOutputs(... ctx);
9
- * it is threaded to renderJson too. The shared provenance projection (consumed by
10
- * the markdown header here and the JSON object) lives here so the two surfaces
11
- * never drift. This is the PURE provenance projection — the impure `resolveSourceSha` /
12
- * `resolveTargetRoot` git reads live in `run-management/resolveRunInputs.ts`.
13
- *
14
- * Parent: (@SCN-RPT-001).
15
- */
16
1
  import { relativizeToRoot } from "../lib/portablePath.js";
17
- /** The canonical input flags, in render order, mapped to their RunInputs key. */
18
2
  const INPUT_FLAGS = [
19
3
  { key: "features", flag: "--features" },
20
4
  { key: "vitest", flag: "--vitest" },
21
5
  { key: "cucumber", flag: "--cucumber" },
22
6
  { key: "ci", flag: "--ci" },
23
7
  { key: "packageJson", flag: "--package-json" },
24
- // APPENDED, so no flag that was already rendered moves (@SCN-RPT-027). Widening this
25
- // list is the whole of the change: `presentInputs`, `provenanceObject`,
26
- // `projectProvenanceObject`, the markdown header and the JSON object all iterate it, so
27
- // the two surfaces gain the stream in step and neither can drift from the other.
28
8
  { key: "ciSteps", flag: "--ci-steps" },
29
9
  ];
30
- /** Format an instant as second-precision UTC, e.g. `2026-06-27T08:17:53Z`. */
31
10
  function formatUtc(instant) {
32
- return instant.toISOString().replace(/\.\d+Z$/, "Z");
11
+ return instant.toISOString().replace(/\.\d+Z/, "Z");
33
12
  }
34
- /**
35
- * The inputs actually used — RunInputs filtered to the present, non-empty values, in
36
- * canonical flag order, each made PORTABLE relative to the run `root`. The
37
- * single input-presence + portability selection both surfaces share: the JSON
38
- * `provenance.inputs` object serialises it directly; the markdown header derives its
39
- * `{flag, value}` lines from it. A present value is relativized via `relativizeToRoot`
40
- * (absolute-under-root → relative; otherwise verbatim — see the helper); only its
41
- * presence is tested before recording.
42
- */
43
13
  function presentInputs(inputs, root) {
44
14
  const out = {};
45
15
  for (const { key } of INPUT_FLAGS) {
@@ -50,38 +20,19 @@ function presentInputs(inputs, root) {
50
20
  }
51
21
  return out;
52
22
  }
53
- /**
54
- * Project a RunContext to the canonical provenance object. The one helper the JSON
55
- * surface serialises and the markdown header (via `projectProvenance`) derives from —
56
- * the timestamp formatting, the source SHA, and the input-presence selection live here
57
- * once, so the two surfaces project the same ctx without duplicating field logic.
58
- */
59
23
  export function provenanceObject(ctx) {
60
24
  return {
61
25
  target: ctx.target,
62
26
  sourceSha: ctx.sourceSha,
63
- // The tool identity (3F-1916), defaulted for ctx fixtures that omit it; the CLI
64
- // always sets both via resolveToolIdentity.
65
27
  toolSha: ctx.toolSha ?? null,
66
28
  toolVersion: ctx.toolVersion ?? "unknown",
67
29
  runTimestamp: formatUtc(ctx.runStart),
68
30
  inputs: presentInputs(ctx.inputs, ctx.root),
31
+ strict: ctx.strict === true,
69
32
  };
70
33
  }
71
- /**
72
- * Project a canonical provenance OBJECT to the markdown header's presentation FACTS —
73
- * inputs as ordered `{flag, value}` pairs, the UTC timestamp as `runStartUtc`. This is
74
- * the projection that needs no `RunContext`: the markdown renderer reads it off the shared
75
- * report model's `runProvenance` (already a `ProvenanceObject`), so the human header and
76
- * the JSON object project the SAME facts without re-touching the ctx (slice 3's
77
- * render-from-saved-JSON path calls this directly). `projectProvenance(ctx)` delegates here.
78
- */
79
34
  export function projectProvenanceObject(obj) {
80
35
  const inputs = [];
81
- // The flags with no value, derived in the SAME pass over the SAME canonical list that
82
- // produces the flags with one (@SCN-RPT-028). One list, one traversal, two complementary
83
- // outputs — so a flag can never be named on both lines, nor missing from both, and adding
84
- // another input flag reaches the absence line without anyone remembering to.
85
36
  const absentInputs = [];
86
37
  for (const { key, flag } of INPUT_FLAGS) {
87
38
  const value = obj.inputs[key];
@@ -102,13 +53,6 @@ export function projectProvenanceObject(obj) {
102
53
  toolVersion: obj.toolVersion,
103
54
  };
104
55
  }
105
- /**
106
- * Project a RunContext to the markdown header's provenance facts — the presentation
107
- * form (inputs as ordered `{flag, value}` pairs, the UTC timestamp as `runStartUtc`).
108
- * Derived from the canonical `provenanceObject` (then `projectProvenanceObject`) so the
109
- * markdown header and the JSON object share the same timestamp, source SHA, and
110
- * input-presence selection (no re-derivation).
111
- */
112
56
  export function projectProvenance(ctx) {
113
57
  return projectProvenanceObject(provenanceObject(ctx));
114
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/provenance/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AA6D1D,iFAAiF;AACjF,MAAM,WAAW,GAAsD;IACrE,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE;IACvC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE;IACnC,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE;IACvC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;IAC3B,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAC9C,qFAAqF;IACrF,wEAAwE;IACxE,wFAAwF;IACxF,iFAAiF;IACjF,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE;CACvC,CAAC;AAwCF,8EAA8E;AAC9E,SAAS,SAAS,CAAC,OAAa;IAC9B,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,MAAiB,EAAE,IAAwB;IAChE,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAsBD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAe;IAC9C,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,gFAAgF;QAChF,4CAA4C;QAC5C,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;QACzC,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;QACrC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,sFAAsF;IACtF,yFAAyF;IACzF,0FAA0F;IAC1F,6EAA6E;IAC7E,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM;QACN,YAAY;QACZ,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAe;IAC/C,OAAO,uBAAuB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/provenance/provenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAsB1D,MAAM,WAAW,GAAsD;IACrE,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE;IACvC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE;IACnC,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE;IACvC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;IAC3B,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAC9C,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE;CACvC,CAAC;AAiBF,SAAS,SAAS,CAAC,OAAa;IAC9B,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,MAAiB,EAAE,IAAwB;IAChE,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAYD,MAAM,UAAU,gBAAgB,CAAC,GAAe;IAC9C,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;QACzC,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;QACrC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC;QAC3C,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM;QACN,YAAY;QACZ,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAe;IAC/C,OAAO,uBAAuB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -1,32 +1,3 @@
1
- /**
2
- * THE BEHAVIOURAL RUNNERS a run recognised (@SCN-USG-011) — the tier a consumer named, the runner
3
- * they named for it, and the step of their pipeline it was recognised at.
4
- *
5
- * WHY THE REPORT SAYS IT AT ALL. A recognition rule over somebody else's pipeline will be wrong
6
- * sometimes, and the question is only whether being wrong is VISIBLE. Naming the steps this reader
7
- * recognised is what makes it so: a consumer reads the row, sees a step they know is a fitness
8
- * check, and corrects it in one line of their own configuration. Silence here would put the rule
9
- * back where the prefix set was — a judgement nobody can see being made. Since @SCN-USG-004 the
10
- * same recognition also DECIDES membership rather than only reporting it, which is what makes the
11
- * visibility load-bearing instead of courteous.
12
- *
13
- * Its own module rather than a further section in `markdown.ts`, which sits at a `max-lines`
14
- * exception — and an exception excuses existing debt, never headroom. The precedent is
15
- * `runVerdict.ts`, moved out for exactly this reason.
16
- */
17
1
  import type { RenderInput } from "../assemble/renderInput.js";
18
- /**
19
- * The recognised-runner cut and the account of the tiers it recognised none for, or nothing at all.
20
- *
21
- * OMITTED WHEN THE TARGET HAS SAID NOTHING, which is every target carrying no runner block: the
22
- * section appears when the target named something and the report is otherwise byte-identical to
23
- * what it was. This section speaks only for a target that has spoken.
24
- *
25
- * AND THE SILENCE IS THE RIGHT ANSWER FOR THE ONE THAT HAS NOT (@SCN-USG-017), which was an open
26
- * question when the omission was written and is now settled by the scenario that asked it. What a
27
- * `new-client` is owed is every step of their pipeline on the books, which the observer gives them;
28
- * a section here would have nothing to report but four tiers nobody named, and printing it would
29
- * turn an absence the tool supports into a form the report asks them to fill in.
30
- */
31
2
  export declare const behaviouralRunnersSection: (report: RenderInput) => string[];
32
3
  //# sourceMappingURL=behaviouralRunners.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"behaviouralRunners.d.ts","sourceRoot":"","sources":["../../src/render/behaviouralRunners.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAqD9D;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAsBrE,CAAC"}
1
+ {"version":3,"file":"behaviouralRunners.d.ts","sourceRoot":"","sources":["../../src/render/behaviouralRunners.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAmB9D,eAAO,MAAM,yBAAyB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAoBrE,CAAC"}
@@ -1,88 +1,25 @@
1
- /**
2
- * THE BEHAVIOURAL RUNNERS a run recognised (@SCN-USG-011) — the tier a consumer named, the runner
3
- * they named for it, and the step of their pipeline it was recognised at.
4
- *
5
- * WHY THE REPORT SAYS IT AT ALL. A recognition rule over somebody else's pipeline will be wrong
6
- * sometimes, and the question is only whether being wrong is VISIBLE. Naming the steps this reader
7
- * recognised is what makes it so: a consumer reads the row, sees a step they know is a fitness
8
- * check, and corrects it in one line of their own configuration. Silence here would put the rule
9
- * back where the prefix set was — a judgement nobody can see being made. Since @SCN-USG-004 the
10
- * same recognition also DECIDES membership rather than only reporting it, which is what makes the
11
- * visibility load-bearing instead of courteous.
12
- *
13
- * Its own module rather than a further section in `markdown.ts`, which sits at a `max-lines`
14
- * exception — and an exception excuses existing debt, never headroom. The precedent is
15
- * `runVerdict.ts`, moved out for exactly this reason.
16
- */
17
1
  import { RUNTIME_QUALITY_CHECKS } from "../domain/ledger.js";
18
- /**
19
- * WHAT THE TARGET SAID ABOUT THE TIERS NO RUNNER WAS NAMED FOR (@SCN-USG-016) — one line each, and
20
- * two different lines, because a tier the target says it HAS none and a tier it never mentioned are
21
- * opposite facts. Neither recognises a step and neither excludes one, so this is the only place in
22
- * the whole run where the difference between them is readable.
23
- *
24
- * AND THE UNNAMED LINE IS WHAT MAKES THE NULL WORTH WRITING. Without it a consumer who states
25
- * `"performance": null` gets the report they would have got by saying nothing, and no reason to
26
- * ever write it; with it, the tool says out loud that it has not been told, and the null is the
27
- * answer. That is the same asymmetry the whole axis runs on — say what was seen and what was not,
28
- * and let the consumer correct it in one line of their own configuration.
29
- *
30
- * THE FOUR TIERS ARE CANON AND ARE NOT A LIST THIS MODULE KEEPS. `RUNTIME_QUALITY_CHECKS` is the
31
- * ledger's own enumeration of the runtime tiers, read here rather than restated: a second copy
32
- * would agree by coincidence, and this axis's whole argument is that a list of names is the drift.
33
- *
34
- * A NAMED TIER IS NOT ACCOUNTED FOR HERE, whether or not a step was recognised for it. What a
35
- * target that named a runner nothing runs is owed stays the open question the section below
36
- * already deferred; naming a runner is not saying you have none.
37
- */
2
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
38
3
  const runnerTierAccount = (runnerTiers) => runnerTiers === undefined
39
4
  ? []
40
5
  : RUNTIME_QUALITY_CHECKS.filter((tier) => typeof runnerTiers[tier] !== "string").map((tier) => Object.hasOwn(runnerTiers, tier)
41
- ? `- ${tier} — no runner: the target names none.`
42
- : `- ${tier} — unnamed: the target has not said.`);
43
- /**
44
- * THE KEYS THE RUNNER BLOCK WAS GIVEN THAT ARE NOT TIERS (@SCN-USG-019) — one line each, naming the
45
- * key and saying what it did.
46
- *
47
- * THE LINE EXISTS BECAUSE THE ALTERNATIVE IS SILENCE, and silence here is the same fault as a
48
- * dropped step: the consumer wrote a key, believes it took effect, and nothing they can read says
49
- * otherwise. The key is not honoured — the resolver partitioned it out before any recognition ran —
50
- * so the only remaining question was whether they get to find that out, and this is the answer.
51
- *
52
- * IT SAYS WHAT THE KEY DID, NOT ONLY THAT IT WAS SEEN. "Excludes nothing" is the fact a consumer
53
- * needs to act on: they wrote it to take a check out of discovery, that is precisely what it did
54
- * not do, and the check is on the books below where they can read it.
55
- */
56
- const unrecognisedKeyAccount = (keys) => (keys ?? []).map((key) => `- ${key} — not a tier: the runner block is keyed by the four canon tiers, and this key excludes nothing.`);
57
- /**
58
- * The recognised-runner cut and the account of the tiers it recognised none for, or nothing at all.
59
- *
60
- * OMITTED WHEN THE TARGET HAS SAID NOTHING, which is every target carrying no runner block: the
61
- * section appears when the target named something and the report is otherwise byte-identical to
62
- * what it was. This section speaks only for a target that has spoken.
63
- *
64
- * AND THE SILENCE IS THE RIGHT ANSWER FOR THE ONE THAT HAS NOT (@SCN-USG-017), which was an open
65
- * question when the omission was written and is now settled by the scenario that asked it. What a
66
- * `new-client` is owed is every step of their pipeline on the books, which the observer gives them;
67
- * a section here would have nothing to report but four tiers nobody named, and printing it would
68
- * turn an absence the tool supports into a form the report asks them to fill in.
69
- */
6
+ ? `- ${CORE_MESSAGES[CoreMessage.RunnerTierNamesNone](tier)}`
7
+ : `- ${CORE_MESSAGES[CoreMessage.RunnerTierUnnamed](tier)}`);
8
+ const unrecognisedKeyAccount = (keys) => (keys ?? []).map((key) => `- ${CORE_MESSAGES[CoreMessage.RunnerKeyNotATier](key)}`);
70
9
  export const behaviouralRunnersSection = (report) => {
71
10
  const runners = report.summary.behaviouralRunners ?? [];
72
11
  const account = [
73
12
  ...runnerTierAccount(report.summary.runnerTiers),
74
- // AFTER THE TIERS, because the four are the block's subject and an unrecognised key is what was
75
- // written beside them. A consumer reads down the canon set and then what did not belong to it.
76
13
  ...unrecognisedKeyAccount(report.summary.unrecognisedRunnerKeys),
77
14
  ];
78
15
  if (runners.length === 0 && account.length === 0)
79
16
  return [];
80
17
  return [
81
- "### Behavioural runners",
18
+ CORE_MESSAGES[CoreMessage.BehaviouralRunnersHeading],
82
19
  "",
83
20
  ...(runners.length > 0
84
21
  ? [
85
- "| Tier | Runner | Recognised at |",
22
+ CORE_MESSAGES[CoreMessage.BehaviouralRunnersTableHeader],
86
23
  "| --- | --- | --- |",
87
24
  ...runners.map(({ tier, runner, step }) => `| ${tier} | ${runner} | ${step} |`),
88
25
  "",
@@ -1 +1 @@
1
- {"version":3,"file":"behaviouralRunners.js","sourceRoot":"","sources":["../../src/render/behaviouralRunners.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,iBAAiB,GAAG,CACxB,WAAgE,EACtD,EAAE,CACZ,WAAW,KAAK,SAAS;IACvB,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1F,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC;QAC9B,CAAC,CAAC,KAAK,IAAI,sCAAsC;QACjD,CAAC,CAAC,KAAK,IAAI,sCAAsC,CACpD,CAAC;AAER;;;;;;;;;;;;GAYG;AACH,MAAM,sBAAsB,GAAG,CAAC,IAAmC,EAAY,EAAE,CAC/E,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CACd,CAAC,GAAG,EAAE,EAAE,CACN,KAAK,GAAG,kGAAkG,CAC7G,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACzE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG;QACd,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAChD,gGAAgG;QAChG,+FAA+F;QAC/F,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC;KACjE,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5D,OAAO;QACL,yBAAyB;QACzB,EAAE;QACF,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACpB,CAAC,CAAC;gBACE,mCAAmC;gBACnC,qBAAqB;gBACrB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,KAAK,IAAI,MAAM,MAAM,MAAM,IAAI,IAAI,CAAC;gBAC/E,EAAE;aACH;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"behaviouralRunners.js","sourceRoot":"","sources":["../../src/render/behaviouralRunners.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,iBAAiB,GAAG,CACxB,WAAgE,EACtD,EAAE,CACZ,WAAW,KAAK,SAAS;IACvB,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1F,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC;QAC9B,CAAC,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE;QAC7D,CAAC,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAC9D,CAAC;AAER,MAAM,sBAAsB,GAAG,CAAC,IAAmC,EAAY,EAAE,CAC/E,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAClB,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACzE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG;QACd,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAChD,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC;KACjE,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5D,OAAO;QACL,aAAa,CAAC,WAAW,CAAC,yBAAyB,CAAC;QACpD,EAAE;QACF,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACpB,CAAC,CAAC;gBACE,aAAa,CAAC,WAAW,CAAC,6BAA6B,CAAC;gBACxD,qBAAqB;gBACrB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,KAAK,IAAI,MAAM,MAAM,MAAM,IAAI,IAAI,CAAC;gBAC/E,EAAE;aACH;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderInput } from "../assemble/renderInput.js";
2
+ export declare const configurationNotReadSection: (report: RenderInput) => string[];
3
+ //# sourceMappingURL=configurationNotRead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configurationNotRead.d.ts","sourceRoot":"","sources":["../../src/render/configurationNotRead.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,eAAO,MAAM,2BAA2B,GAAI,QAAQ,WAAW,KAAG,MAAM,EAiBvE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { CORE_MESSAGES, CoreMessage } from "../domain/messages.js";
2
+ export const configurationNotReadSection = (report) => {
3
+ const wrongKinds = report.summary.wrongKindConfiguration ?? [];
4
+ const unknownKeys = report.summary.unknownConfigurationKeys ?? [];
5
+ if (wrongKinds.length === 0 && unknownKeys.length === 0)
6
+ return [];
7
+ return [
8
+ CORE_MESSAGES[CoreMessage.ConfigurationNotReadHeading],
9
+ "",
10
+ CORE_MESSAGES[CoreMessage.ConfigurationNotReadIntro],
11
+ "",
12
+ ...wrongKinds.map(({ entry, is, reads }) => `- ${CORE_MESSAGES[CoreMessage.ConfigurationWrongKind](`\`${entry}\``, is, reads)}`),
13
+ ...unknownKeys.map((key) => `- ${CORE_MESSAGES[CoreMessage.ConfigurationUnknownKey](`\`specController.${key}\``)}`),
14
+ "",
15
+ ];
16
+ };
17
+ //# sourceMappingURL=configurationNotRead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configurationNotRead.js","sourceRoot":"","sources":["../../src/render/configurationNotRead.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,MAAmB,EAAY,EAAE;IAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,IAAI,EAAE,CAAC;IAClE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnE,OAAO;QACL,aAAa,CAAC,WAAW,CAAC,2BAA2B,CAAC;QACtD,EAAE;QACF,aAAa,CAAC,WAAW,CAAC,yBAAyB,CAAC;QACpD,EAAE;QACF,GAAG,UAAU,CAAC,GAAG,CACf,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAC9G;QACD,GAAG,WAAW,CAAC,GAAG,CAChB,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC,oBAAoB,GAAG,IAAI,CAAC,EAAE,CAChG;QACD,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
@@ -1,40 +1,3 @@
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
1
  import type { RenderInput } from "../assemble/renderInput.js";
26
- /**
27
- * The scope, or nothing at all.
28
- *
29
- * OMITTED WHERE THE RUN READ NO CI CONFIGURATION, which is the only way the census can be empty:
30
- * the section appears wherever there is a pipeline to account for, and a run handed none renders
31
- * byte-identically to before.
32
- *
33
- * A SOURCE THIS RUN WAS GIVEN NO NAME FOR STILL GETS ITS ROW, with an empty cell where the file
34
- * would be. The core holds no filesystem and the names arrive as data from the CLI edge
35
- * (`parse/stepNames`), so an unnamed source is one nobody could name rather than one nothing read
36
- * — and dropping its jobs would be a job the reader ranged over vanishing from the account of what
37
- * it ranged over, which is the silence this axis exists to end.
38
- */
39
2
  export declare const discoveryScopeSection: (report: RenderInput) => string[];
40
3
  //# sourceMappingURL=discoveryScope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discoveryScope.d.ts","sourceRoot":"","sources":["../../src/render/discoveryScope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAcjE,CAAC"}
1
+ {"version":3,"file":"discoveryScope.d.ts","sourceRoot":"","sources":["../../src/render/discoveryScope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,eAAO,MAAM,qBAAqB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAcjE,CAAC"}