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

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 (124) hide show
  1. package/README.md +1 -1
  2. package/dist/assemble/evidenceReconciliationFromSources.d.ts +8 -15
  3. package/dist/assemble/evidenceReconciliationFromSources.d.ts.map +1 -1
  4. package/dist/assemble/evidenceReconciliationFromSources.js +21 -24
  5. package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
  6. package/dist/domain/checkCharacteristics.d.ts +24 -15
  7. package/dist/domain/checkCharacteristics.d.ts.map +1 -1
  8. package/dist/domain/checkCharacteristics.js +24 -15
  9. package/dist/domain/checkCharacteristics.js.map +1 -1
  10. package/dist/domain/evidenceReconciliation.d.ts +26 -2
  11. package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
  12. package/dist/domain/evidenceReconciliation.js +164 -61
  13. package/dist/domain/evidenceReconciliation.js.map +1 -1
  14. package/dist/domain/fitnessChecks.d.ts +24 -35
  15. package/dist/domain/fitnessChecks.d.ts.map +1 -1
  16. package/dist/domain/fitnessChecks.js +3 -30
  17. package/dist/domain/fitnessChecks.js.map +1 -1
  18. package/dist/domain/journal.d.ts +13 -103
  19. package/dist/domain/journal.d.ts.map +1 -1
  20. package/dist/domain/journal.js +6 -19
  21. package/dist/domain/journal.js.map +1 -1
  22. package/dist/domain/ledger.d.ts.map +1 -1
  23. package/dist/domain/ledger.js +45 -34
  24. package/dist/domain/ledger.js.map +1 -1
  25. package/dist/domain/posting.d.ts.map +1 -1
  26. package/dist/domain/posting.js +4 -7
  27. package/dist/domain/posting.js.map +1 -1
  28. package/dist/domain/qualityCheckFaultMessages.d.ts +7 -2
  29. package/dist/domain/qualityCheckFaultMessages.d.ts.map +1 -1
  30. package/dist/domain/qualityCheckFaultMessages.js +7 -2
  31. package/dist/domain/qualityCheckFaultMessages.js.map +1 -1
  32. package/dist/domain/qualityCheckReconciliation.d.ts +23 -2
  33. package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
  34. package/dist/domain/qualityCheckReconciliation.js +40 -105
  35. package/dist/domain/qualityCheckReconciliation.js.map +1 -1
  36. package/dist/domain/qualityCheckReconciliationFault.d.ts +3 -1
  37. package/dist/domain/qualityCheckReconciliationFault.d.ts.map +1 -1
  38. package/dist/domain/qualityCheckReconciliationFault.js +3 -1
  39. package/dist/domain/qualityCheckReconciliationFault.js.map +1 -1
  40. package/dist/index.d.ts +17 -17
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +19 -19
  43. package/dist/index.js.map +1 -1
  44. package/dist/internal.d.ts +8 -15
  45. package/dist/internal.d.ts.map +1 -1
  46. package/dist/internal.js +37 -84
  47. package/dist/internal.js.map +1 -1
  48. package/dist/model.d.ts +3 -2
  49. package/dist/model.d.ts.map +1 -1
  50. package/dist/model.js +3 -2
  51. package/dist/model.js.map +1 -1
  52. package/dist/parse/checkScriptsRunInCI.d.ts +8 -7
  53. package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
  54. package/dist/parse/checkScriptsRunInCI.js +7 -6
  55. package/dist/parse/checkScriptsRunInCI.js.map +1 -1
  56. package/dist/parse/ciStepRecord.d.ts +5 -17
  57. package/dist/parse/ciStepRecord.d.ts.map +1 -1
  58. package/dist/parse/ciStepRecord.js +7 -27
  59. package/dist/parse/ciStepRecord.js.map +1 -1
  60. package/dist/parse/corpusCodeFaults.d.ts +4 -4
  61. package/dist/parse/corpusCodeFaults.js +4 -4
  62. package/dist/parse/corpusFaults.d.ts +26 -37
  63. package/dist/parse/corpusFaults.d.ts.map +1 -1
  64. package/dist/parse/corpusFaults.js +18 -33
  65. package/dist/parse/corpusFaults.js.map +1 -1
  66. package/dist/parse/corpusGrammarFaults.d.ts +11 -73
  67. package/dist/parse/corpusGrammarFaults.d.ts.map +1 -1
  68. package/dist/parse/corpusGrammarFaults.js +27 -58
  69. package/dist/parse/corpusGrammarFaults.js.map +1 -1
  70. package/dist/parse/runningStaticChecks.d.ts +3 -2
  71. package/dist/parse/runningStaticChecks.d.ts.map +1 -1
  72. package/dist/parse/runningStaticChecks.js +3 -2
  73. package/dist/parse/runningStaticChecks.js.map +1 -1
  74. package/dist/parse/scenarios.d.ts +28 -13
  75. package/dist/parse/scenarios.d.ts.map +1 -1
  76. package/dist/parse/scenarios.js +48 -86
  77. package/dist/parse/scenarios.js.map +1 -1
  78. package/dist/parse/targetCorpus.d.ts +21 -11
  79. package/dist/parse/targetCorpus.d.ts.map +1 -1
  80. package/dist/parse/targetCorpus.js +16 -19
  81. package/dist/parse/targetCorpus.js.map +1 -1
  82. package/dist/parse/targetManifest.d.ts +12 -86
  83. package/dist/parse/targetManifest.d.ts.map +1 -1
  84. package/dist/parse/targetManifest.js +49 -138
  85. package/dist/parse/targetManifest.js.map +1 -1
  86. package/dist/provenance/provenance.d.ts +8 -11
  87. package/dist/provenance/provenance.d.ts.map +1 -1
  88. package/dist/provenance/provenance.js +2 -3
  89. package/dist/provenance/provenance.js.map +1 -1
  90. package/dist/render/evidenceGrid.d.ts +45 -0
  91. package/dist/render/evidenceGrid.d.ts.map +1 -0
  92. package/dist/render/evidenceGrid.js +145 -0
  93. package/dist/render/evidenceGrid.js.map +1 -0
  94. package/dist/render/markdown.d.ts.map +1 -1
  95. package/dist/render/markdown.js +85 -190
  96. package/dist/render/markdown.js.map +1 -1
  97. package/dist/render/runVerdict.d.ts +3 -2
  98. package/dist/render/runVerdict.d.ts.map +1 -1
  99. package/dist/render/runVerdict.js +11 -4
  100. package/dist/render/runVerdict.js.map +1 -1
  101. package/dist/render/staticChecks.d.ts.map +1 -1
  102. package/dist/render/staticChecks.js +10 -1
  103. package/dist/render/staticChecks.js.map +1 -1
  104. package/package.json +1 -6
  105. package/dist/domain/thresholds.d.ts +0 -123
  106. package/dist/domain/thresholds.d.ts.map +0 -1
  107. package/dist/domain/thresholds.js +0 -185
  108. package/dist/domain/thresholds.js.map +0 -1
  109. package/dist/parse/checkStaticEvidenceObligations.d.ts +0 -32
  110. package/dist/parse/checkStaticEvidenceObligations.d.ts.map +0 -1
  111. package/dist/parse/checkStaticEvidenceObligations.js +0 -78
  112. package/dist/parse/checkStaticEvidenceObligations.js.map +0 -1
  113. package/dist/parse/corpusClaimFaults.d.ts +0 -104
  114. package/dist/parse/corpusClaimFaults.d.ts.map +0 -1
  115. package/dist/parse/corpusClaimFaults.js +0 -128
  116. package/dist/parse/corpusClaimFaults.js.map +0 -1
  117. package/dist/parse/measurements.d.ts +0 -47
  118. package/dist/parse/measurements.d.ts.map +0 -1
  119. package/dist/parse/measurements.js +0 -65
  120. package/dist/parse/measurements.js.map +0 -1
  121. package/dist/render/measuredItem.d.ts +0 -30
  122. package/dist/render/measuredItem.d.ts.map +0 -1
  123. package/dist/render/measuredItem.js +0 -43
  124. package/dist/render/measuredItem.js.map +0 -1
@@ -1,29 +1,27 @@
1
1
  /**
2
- * The TARGET's `specController.*` configuration, read into the rows, bars and mints the
2
+ * The TARGET's `specController.*` configuration, read into the rows and mints the
3
3
  * reconciler takes — the `resolve*` family, moved here from the app's ingest edge (3F-3087).
4
4
  *
5
5
  * WHY THEY LIVE IN THE ENGINE. Every one of them is a pure function of a manifest object
6
6
  * somebody else already read off disk, and every one of them is the ONE reading of the key it
7
- * names — `thresholdsOf`, `fitnessChecksOf` and `bareTerm` are all core's, so the reader and the
7
+ * names — `fitnessChecksOf` and `bareTerm` are both core's, so the reader and the
8
8
  * thing it reads through belonged on the same side of the package boundary. Sitting at the app
9
9
  * edge they were the reason a PUBLISHED module imported core's unpublished `/internal` subpath,
10
10
  * which is the fault 3F-3086 repairs; nothing about reading a parsed manifest ever needed the
11
11
  * edge that produced it.
12
12
  *
13
- * WHAT THE EDGE STILL OWES THEM, AND WHY IT IS A PARAMETER. Two of these readings depend on
13
+ * WHAT THE EDGE STILL OWES THEM, AND WHY IT IS A PARAMETER. One of these readings depends on
14
14
  * something the engine must not know: the deferral-tag STARTER SET is product policy the
15
- * application layer single-sources (`DEFAULT_DEFERRAL_TAGS`), and a bar naming a mutation gate
16
- * needs that gate's record read off the target's tree. Both arrive as arguments — the starter
17
- * set as data, the record as a `KillFloorReader` closure the edge builds — so the engine keeps
18
- * knowing nothing about files, records or ratchets (@SCN-EPG-001, and 3F-2841's pattern: a
19
- * project-owned term arrives as an input).
15
+ * application layer single-sources (`DEFAULT_DEFERRAL_TAGS`). It arrives as an argument, as data,
16
+ * so the engine keeps knowing nothing about files (`lint:boundaries`' `core-imports-io` rule,
17
+ * which was @SCN-EPG-001's `io-import` arm until 3F-3437; and 3F-2841's pattern: a project-owned
18
+ * term arrives as an input).
20
19
  *
21
20
  * DEFENSIVE THROUGHOUT, AND THAT IS THE FAMILY'S STANCE RATHER THAN LOCAL CHOICES PER RESOLVER.
22
21
  * Config is data from outside: a missing, non-object or array-shaped value resolves EMPTY, and a
23
22
  * malformed entry is dropped by the reading function it is handed to rather than thrown. A check
24
23
  * that throws on a typo produces no verdict at all.
25
24
  */
26
- import { type ThresholdIndex } from "../domain/thresholds.js";
27
25
  import { type FitnessCheckIndex } from "../domain/fitnessChecks.js";
28
26
  /**
29
27
  * The steps the TARGET names NON-CHECKS (@SCN-USG-015, 3F-3343) — `specController.notChecks`, read
@@ -49,65 +47,6 @@ export declare function resolveNotChecks(packageJson: {
49
47
  notChecks?: unknown;
50
48
  };
51
49
  }): readonly string[];
52
- /**
53
- * A bar naming a mutation gate rather than a figure.
54
- *
55
- * THE RECORD'S NAME MAY BE STATED AND OTHERWISE DEFAULTS, and the reason is whose the name is: the
56
- * record belongs to whoever owns the record, so the conventional one stands in and a project filing
57
- * its bars elsewhere writes it over.
58
- */
59
- export interface MutationGateReference {
60
- readonly mutationGate: string;
61
- readonly recordFile?: string;
62
- }
63
- /** The kill floor a reference names, or `null` where the record cannot supply it. */
64
- export type KillFloorReader = (reference: MutationGateReference) => number | null;
65
- /**
66
- * The TARGET's authored CEILINGS (@SCN-CIP-001) — `specController.thresholds`, read as
67
- * `@SCN → bare check tag → ceiling` through the engine's own `thresholdsOf`.
68
- *
69
- * The DEBIT side of the measured fitness check, and the reason the axis can reconcile at all. A
70
- * static check decides pass from fail itself; a measured one produces a number, and the bar that
71
- * number is held against has to come from somewhere the run cannot reach — otherwise the runner
72
- * grades its own homework and the ledger transcribes a verdict rather than reconciling one.
73
- *
74
- * IT IS THE TARGET'S, for the same reason the registry is (@SCN-LNT-005): a suite's acceptable
75
- * wall-clock is a property of the repository being reconciled and of the runner class it runs on,
76
- * never of the tool doing the reconciling. Read from `--package-json` alongside the scripts, the CI
77
- * config and the registry, so every input to a target's verdict came from that target.
78
- *
79
- * The third of this family's `specController.*` resolvers, and defensive like the two above it: a
80
- * missing, non-object or array-shaped config resolves EMPTY, and a malformed entry is dropped by
81
- * `thresholdsOf` rather than thrown. There is no starter set: a ceiling the target did not write
82
- * would hold its suites to a bar nobody chose.
83
- *
84
- * AND A BAR MAY NAME A MUTATION GATE INSTEAD OF A FIGURE (@SCN-MUT-012, 3F-2788). A number in a
85
- * manifest is a number somebody has to re-derive after every sweep that moves it. So the VALUE may
86
- * be a reference to a gate whose record already holds the counts, and it is substituted for that
87
- * gate's kill floor HERE — before `thresholdsOf` is called, so what reaches the index is the
88
- * number it has always taken. THE READER IS INJECTED, which is what keeps the engine knowing
89
- * nothing about records, gates or YAML now that the substitution lives inside it: the app edge
90
- * opens the target's record and hands in a closure, and this function only ever asks it for a
91
- * number (3F-3087).
92
- *
93
- * AND A REFERENCE THIS CANNOT SOURCE LEAVES NO BAR, NEVER A NUMBER (@SCN-MUT-013). A reference is a
94
- * bar living in a second file, so it can go missing four ways a typed one never could — and each
95
- * has a lenient reading that hands back a green nobody earned. All four are refused the same way,
96
- * which is `barOf`'s own way with an entry it cannot read: the key survives with nothing beside it,
97
- * so the check stays MEASURED and the complaint arrives from the missing-bar arm (@SCN-CIP-002)
98
- * rather than from the tag grammar, about a check nobody wrote.
99
- */
100
- export declare function resolveThresholds(packageJson: {
101
- specController?: {
102
- thresholds?: unknown;
103
- };
104
- },
105
- /**
106
- * The reader over the TARGET's records, built by the edge that knows where that tree is
107
- * (@SCN-LNT-005). One reader per resolution pass, so a manifest naming several gates of one
108
- * record reads that record once.
109
- */
110
- killFloor: KillFloorReader): ThresholdIndex;
111
50
  /**
112
51
  * Resolve the recognised deferral-tag set for the target (@SCN-PND-021) — the app's single-sourced
113
52
  * starter set EXTENDED by the target `package.json`'s `specController.deferralTags`. Config
@@ -144,29 +83,12 @@ starterTags: readonly string[]): readonly string[];
144
83
  * missing or wrongly-shaped config resolves EMPTY, and a malformed row is dropped by
145
84
  * `fitnessChecksOf` rather than thrown. There is no starter set: a target that has converted
146
85
  * nothing owes nothing on this route, which is what keeps the reading inert on an unswept corpus.
147
- *
148
- * AND A ROW'S BAR MAY NAME A MUTATION GATE INSTEAD OF A FIGURE, EXACTLY AS A THRESHOLD ENTRY'S MAY
149
- * (@SCN-MUT-012, 3F-3152). The row is the second place a target can author a bar, so it is the
150
- * second place the same substitution has to happen — through the SAME reader and the same
151
- * value-only, direction-blind replacement `resolveThresholds` calls, applied to the row before
152
- * `fitnessChecksOf` reads it. A converted row and a threshold entry cannot then come to disagree
153
- * about what a target wrote, which is the argument `fitnessCheckOf` already makes for reading the
154
- * bar through `barOf` rather than through a grammar of its own.
155
- *
156
- * A REFERENCE THIS CANNOT SOURCE STILL LEAVES NO BAR, NEVER A NUMBER (@SCN-MUT-013). What comes
157
- * back is `null` beside the key, which is what keeps the row MEASURED with nothing to hold it to —
158
- * the shape @SCN-CIP-002 reports, and the same reading the threshold route reaches.
159
86
  */
160
87
  export declare function resolveFitnessChecks(packageJson: {
161
88
  specController?: {
162
89
  fitnessChecks?: unknown;
163
90
  };
164
- },
165
- /**
166
- * The reader over the TARGET's records, built by the edge that knows where that tree is
167
- * (@SCN-LNT-005) — the same argument `resolveThresholds` takes, for the same reason.
168
- */
169
- killFloor: KillFloorReader): FitnessCheckIndex;
91
+ }): FitnessCheckIndex;
170
92
  /**
171
93
  * WHAT A TARGET'S RUNNER BLOCK YIELDED — the entries keyed by a canon tier, and the keys that are
172
94
  * not one (@SCN-USG-019).
@@ -234,6 +156,10 @@ export declare function resolveRunners(packageJson: {
234
156
  runners?: unknown;
235
157
  };
236
158
  }): ResolvedRunners;
159
+ /**
160
+ * ONE ACCOUNT FOR BOTH KINDS, in the order the manifest wrote them: a retired top-level key names
161
+ * itself, and `fitnessChecks` names each bar its rows still carry.
162
+ */
237
163
  export declare function resolveRetiredKeys(packageJson: {
238
164
  specController?: unknown;
239
165
  }): readonly string[];
@@ -1 +1 @@
1
- {"version":3,"file":"targetManifest.d.ts","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAWrF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE;IAC5C,cAAc,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,GAAG,SAAS,MAAM,EAAE,CAIpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAaD,qFAAqF;AACrF,MAAM,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,qBAAqB,KAAK,MAAM,GAAG,IAAI,CAAC;AAgDlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE;IAAE,cAAc,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE;AAC1D;;;;GAIG;AACH,SAAS,EAAE,eAAe,GACzB,cAAc,CAIhB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE;IACX,cAAc,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC7C;AACD,6FAA6F;AAC7F,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,SAAS,MAAM,EAAE,CAcnB;AAGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE;IACX,cAAc,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC9C;AACD;;;GAGG;AACH,SAAS,EAAE,eAAe,GACzB,iBAAiB,CAMnB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,uGAAuG;IACvG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,uGAAuG;IACvG,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE;IAC1C,cAAc,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACxC,GAAG,eAAe,CAclB;AAwBD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,MAAM,EAAE,CAM/F"}
1
+ {"version":3,"file":"targetManifest.d.ts","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAWrF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE;IAC5C,cAAc,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,GAAG,SAAS,MAAM,EAAE,CAIpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE;IACX,cAAc,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC7C;AACD,6FAA6F;AAC7F,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,SAAS,MAAM,EAAE,CAcnB;AAGD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE;IAChD,cAAc,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC9C,GAAG,iBAAiB,CAEpB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,uGAAuG;IACvG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,uGAAuG;IACvG,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE;IAC1C,cAAc,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACxC,GAAG,eAAe,CAclB;AAiDD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,MAAM,EAAE,CAO/F"}
@@ -1,22 +1,21 @@
1
1
  /**
2
- * The TARGET's `specController.*` configuration, read into the rows, bars and mints the
2
+ * The TARGET's `specController.*` configuration, read into the rows and mints the
3
3
  * reconciler takes — the `resolve*` family, moved here from the app's ingest edge (3F-3087).
4
4
  *
5
5
  * WHY THEY LIVE IN THE ENGINE. Every one of them is a pure function of a manifest object
6
6
  * somebody else already read off disk, and every one of them is the ONE reading of the key it
7
- * names — `thresholdsOf`, `fitnessChecksOf` and `bareTerm` are all core's, so the reader and the
7
+ * names — `fitnessChecksOf` and `bareTerm` are both core's, so the reader and the
8
8
  * thing it reads through belonged on the same side of the package boundary. Sitting at the app
9
9
  * edge they were the reason a PUBLISHED module imported core's unpublished `/internal` subpath,
10
10
  * which is the fault 3F-3086 repairs; nothing about reading a parsed manifest ever needed the
11
11
  * edge that produced it.
12
12
  *
13
- * WHAT THE EDGE STILL OWES THEM, AND WHY IT IS A PARAMETER. Two of these readings depend on
13
+ * WHAT THE EDGE STILL OWES THEM, AND WHY IT IS A PARAMETER. One of these readings depends on
14
14
  * something the engine must not know: the deferral-tag STARTER SET is product policy the
15
- * application layer single-sources (`DEFAULT_DEFERRAL_TAGS`), and a bar naming a mutation gate
16
- * needs that gate's record read off the target's tree. Both arrive as arguments — the starter
17
- * set as data, the record as a `KillFloorReader` closure the edge builds — so the engine keeps
18
- * knowing nothing about files, records or ratchets (@SCN-EPG-001, and 3F-2841's pattern: a
19
- * project-owned term arrives as an input).
15
+ * application layer single-sources (`DEFAULT_DEFERRAL_TAGS`). It arrives as an argument, as data,
16
+ * so the engine keeps knowing nothing about files (`lint:boundaries`' `core-imports-io` rule,
17
+ * which was @SCN-EPG-001's `io-import` arm until 3F-3437; and 3F-2841's pattern: a project-owned
18
+ * term arrives as an input).
20
19
  *
21
20
  * DEFENSIVE THROUGHOUT, AND THAT IS THE FAMILY'S STANCE RATHER THAN LOCAL CHOICES PER RESOLVER.
22
21
  * Config is data from outside: a missing, non-object or array-shaped value resolves EMPTY, and a
@@ -24,7 +23,6 @@
24
23
  * that throws on a typo produces no verdict at all.
25
24
  */
26
25
  import { bareTerm } from "../lib/bareTerm.js";
27
- import { thresholdsOf } from "../domain/thresholds.js";
28
26
  import { fitnessChecksOf } from "../domain/fitnessChecks.js";
29
27
  // THE FOUR CANON TIERS, read from the ledger's own enumeration rather than restated here
30
28
  // (@SCN-USG-019). A second list of the same four would agree by coincidence, and this axis's
@@ -59,107 +57,6 @@ export function resolveNotChecks(packageJson) {
59
57
  return [];
60
58
  return [...new Set(configured.filter((entry) => typeof entry === "string"))];
61
59
  }
62
- /** The reference a manifest value states, or `null` where it states none. */
63
- function gateReferenceOf(value) {
64
- if (!isBlock(value))
65
- return null;
66
- const gate = value["mutationGate"];
67
- if (typeof gate !== "string" || gate.trim() === "")
68
- return null;
69
- const recordFile = value["recordFile"];
70
- return typeof recordFile === "string"
71
- ? { mutationGate: gate, recordFile }
72
- : { mutationGate: gate };
73
- }
74
- /**
75
- * One check's entry with any gate reference in it replaced by the number that gate's record implies.
76
- *
77
- * VALUE-ONLY AND DIRECTION-BLIND. The key beside the number is the comparison, and this reads none
78
- * of them: a ceiling naming a gate resolves exactly as a floor does. The engine has no opinion
79
- * about which checks are floors (@SCN-LNT-005), so a target authoring a mutation ceiling is wrong
80
- * out loud rather than quietly overruled here.
81
- */
82
- function barWithGateResolved(bar, killFloor) {
83
- if (!isBlock(bar))
84
- return bar;
85
- const resolved = {};
86
- for (const [key, value] of Object.entries(bar)) {
87
- const reference = gateReferenceOf(value);
88
- // `null` where the record could not supply the floor — the value the engine already reads as
89
- // no bar, so a reference this could not source is indistinguishable downstream from an entry
90
- // nobody could read. What must never be written here is a number of this reader's choosing.
91
- resolved[key] = reference === null ? value : killFloor(reference);
92
- }
93
- return resolved;
94
- }
95
- /**
96
- * The manifest's threshold entries, with every gate reference in them substituted.
97
- *
98
- * NO RECORD IS OPENED FOR A MANIFEST THAT NAMES NO GATE, which is what keeps this inert for every
99
- * target that has never banked one — the two live `@ci-run-time` ceilings included.
100
- */
101
- function withGateReferencesResolved(entries, killFloor) {
102
- const resolved = {};
103
- for (const [scnKey, checks] of Object.entries(entries)) {
104
- if (!isBlock(checks)) {
105
- resolved[scnKey] = checks;
106
- continue;
107
- }
108
- const bars = {};
109
- for (const [checkKey, bar] of Object.entries(checks)) {
110
- bars[checkKey] = barWithGateResolved(bar, killFloor);
111
- }
112
- resolved[scnKey] = bars;
113
- }
114
- return resolved;
115
- }
116
- /**
117
- * The TARGET's authored CEILINGS (@SCN-CIP-001) — `specController.thresholds`, read as
118
- * `@SCN → bare check tag → ceiling` through the engine's own `thresholdsOf`.
119
- *
120
- * The DEBIT side of the measured fitness check, and the reason the axis can reconcile at all. A
121
- * static check decides pass from fail itself; a measured one produces a number, and the bar that
122
- * number is held against has to come from somewhere the run cannot reach — otherwise the runner
123
- * grades its own homework and the ledger transcribes a verdict rather than reconciling one.
124
- *
125
- * IT IS THE TARGET'S, for the same reason the registry is (@SCN-LNT-005): a suite's acceptable
126
- * wall-clock is a property of the repository being reconciled and of the runner class it runs on,
127
- * never of the tool doing the reconciling. Read from `--package-json` alongside the scripts, the CI
128
- * config and the registry, so every input to a target's verdict came from that target.
129
- *
130
- * The third of this family's `specController.*` resolvers, and defensive like the two above it: a
131
- * missing, non-object or array-shaped config resolves EMPTY, and a malformed entry is dropped by
132
- * `thresholdsOf` rather than thrown. There is no starter set: a ceiling the target did not write
133
- * would hold its suites to a bar nobody chose.
134
- *
135
- * AND A BAR MAY NAME A MUTATION GATE INSTEAD OF A FIGURE (@SCN-MUT-012, 3F-2788). A number in a
136
- * manifest is a number somebody has to re-derive after every sweep that moves it. So the VALUE may
137
- * be a reference to a gate whose record already holds the counts, and it is substituted for that
138
- * gate's kill floor HERE — before `thresholdsOf` is called, so what reaches the index is the
139
- * number it has always taken. THE READER IS INJECTED, which is what keeps the engine knowing
140
- * nothing about records, gates or YAML now that the substitution lives inside it: the app edge
141
- * opens the target's record and hands in a closure, and this function only ever asks it for a
142
- * number (3F-3087).
143
- *
144
- * AND A REFERENCE THIS CANNOT SOURCE LEAVES NO BAR, NEVER A NUMBER (@SCN-MUT-013). A reference is a
145
- * bar living in a second file, so it can go missing four ways a typed one never could — and each
146
- * has a lenient reading that hands back a green nobody earned. All four are refused the same way,
147
- * which is `barOf`'s own way with an entry it cannot read: the key survives with nothing beside it,
148
- * so the check stays MEASURED and the complaint arrives from the missing-bar arm (@SCN-CIP-002)
149
- * rather than from the tag grammar, about a check nobody wrote.
150
- */
151
- export function resolveThresholds(packageJson,
152
- /**
153
- * The reader over the TARGET's records, built by the edge that knows where that tree is
154
- * (@SCN-LNT-005). One reader per resolution pass, so a manifest naming several gates of one
155
- * record reads that record once.
156
- */
157
- killFloor) {
158
- const configured = packageJson.specController?.thresholds;
159
- if (!isBlock(configured))
160
- return thresholdsOf({});
161
- return thresholdsOf(withGateReferencesResolved(configured, killFloor));
162
- }
163
60
  /**
164
61
  * Resolve the recognised deferral-tag set for the target (@SCN-PND-021) — the app's single-sourced
165
62
  * starter set EXTENDED by the target `package.json`'s `specController.deferralTags`. Config
@@ -206,29 +103,9 @@ starterTags) {
206
103
  * missing or wrongly-shaped config resolves EMPTY, and a malformed row is dropped by
207
104
  * `fitnessChecksOf` rather than thrown. There is no starter set: a target that has converted
208
105
  * nothing owes nothing on this route, which is what keeps the reading inert on an unswept corpus.
209
- *
210
- * AND A ROW'S BAR MAY NAME A MUTATION GATE INSTEAD OF A FIGURE, EXACTLY AS A THRESHOLD ENTRY'S MAY
211
- * (@SCN-MUT-012, 3F-3152). The row is the second place a target can author a bar, so it is the
212
- * second place the same substitution has to happen — through the SAME reader and the same
213
- * value-only, direction-blind replacement `resolveThresholds` calls, applied to the row before
214
- * `fitnessChecksOf` reads it. A converted row and a threshold entry cannot then come to disagree
215
- * about what a target wrote, which is the argument `fitnessCheckOf` already makes for reading the
216
- * bar through `barOf` rather than through a grammar of its own.
217
- *
218
- * A REFERENCE THIS CANNOT SOURCE STILL LEAVES NO BAR, NEVER A NUMBER (@SCN-MUT-013). What comes
219
- * back is `null` beside the key, which is what keeps the row MEASURED with nothing to hold it to —
220
- * the shape @SCN-CIP-002 reports, and the same reading the threshold route reaches.
221
- */
222
- export function resolveFitnessChecks(packageJson,
223
- /**
224
- * The reader over the TARGET's records, built by the edge that knows where that tree is
225
- * (@SCN-LNT-005) — the same argument `resolveThresholds` takes, for the same reason.
226
106
  */
227
- killFloor) {
228
- const configured = packageJson.specController?.fitnessChecks;
229
- if (!Array.isArray(configured))
230
- return fitnessChecksOf(configured);
231
- return fitnessChecksOf(configured.map((row) => barWithGateResolved(row, killFloor)));
107
+ export function resolveFitnessChecks(packageJson) {
108
+ return fitnessChecksOf(packageJson.specController?.fitnessChecks);
232
109
  }
233
110
  /**
234
111
  * The TARGET's BEHAVIOURAL RUNNERS (@SCN-USG-011, 3F-3343) — `specController.runners`, read as
@@ -287,9 +164,9 @@ export function resolveRunners(packageJson) {
287
164
  };
288
165
  }
289
166
  /**
290
- * THE specController.* KEYS THIS READER HAS RETIRED (@SCN-USG-021, @SCN-USG-022) — the top-level
291
- * keys a manifest carries whose reading this tool has removed, in the order the manifest wrote
292
- * them.
167
+ * THE specController.* KEYS THIS READER HAS RETIRED (@SCN-USG-021, @SCN-USG-022, @SCN-USG-023) —
168
+ * the top-level keys a manifest carries whose reading this tool has removed, in the order the
169
+ * manifest wrote them.
293
170
  *
294
171
  * NAMED, NOT SILENTLY GONE. Retiring a route is not the same act as never having had one: a
295
172
  * consumer who wrote `checkRegistry` once, when it was read, believes it still routes their
@@ -301,16 +178,50 @@ export function resolveRunners(packageJson) {
301
178
  * retires once and is never re-read; the set only grows as this reader retires more of them
302
179
  * (`checkRegistry` first, 3F-3398; `staticChecks` second, 3F-3399 — the tiebreak
303
180
  * `parse/runningStaticChecks.ts`'s `handleOf` used to settle among several invoked scripts,
304
- * 3F-3396 deleted).
181
+ * 3F-3396 deleted; `thresholds` third, 3F-3517 — the ceilings the measured axis held a scenario
182
+ * to, 3F-3516 deleted).
305
183
  *
306
184
  * DEFENSIVE LIKE THE READERS ABOVE IT: a missing or non-object `specController` names no
307
185
  * retired key, never throws.
308
186
  */
309
- const RETIRED_SPEC_CONTROLLER_KEYS = ["checkRegistry", "staticChecks"];
187
+ const RETIRED_SPEC_CONTROLLER_KEYS = ["checkRegistry", "staticChecks", "thresholds"];
188
+ /**
189
+ * THE BAR A CONFIGURED ROW STILL CARRIES (@SCN-LNT-035) — the row-level keys this reader has
190
+ * retired, append-only like the top-level set above. Nothing reads a row's bar since 3F-3510: a
191
+ * row is credited by its own step's outcome, so a bar left on it holds the check to nothing. A
192
+ * `mutationGate` is a value of `atLeast`, so the key it sits under is what names it.
193
+ *
194
+ * NAMED WITH ITS ROW, `fitnessChecks[<@SCN>].<key>`, because a row-level key alone says nothing a
195
+ * consumer could find it by. A row stating no usable `@SCN` names no bar: the row reader drops it
196
+ * whole, and there is no handle to name its bar by.
197
+ */
198
+ const RETIRED_ROW_KEYS = ["atLeast", "atMost"];
199
+ function retiredRowKeysOf(rows) {
200
+ if (!Array.isArray(rows))
201
+ return [];
202
+ return rows.flatMap((row) => {
203
+ if (!isBlock(row) || typeof row["scn"] !== "string")
204
+ return [];
205
+ const scnId = bareTerm(row["scn"]);
206
+ if (scnId === "")
207
+ return [];
208
+ return Object.keys(row)
209
+ .filter((key) => RETIRED_ROW_KEYS.includes(key))
210
+ .map((key) => `fitnessChecks[${scnId}].${key}`);
211
+ });
212
+ }
213
+ /**
214
+ * ONE ACCOUNT FOR BOTH KINDS, in the order the manifest wrote them: a retired top-level key names
215
+ * itself, and `fitnessChecks` names each bar its rows still carry.
216
+ */
310
217
  export function resolveRetiredKeys(packageJson) {
311
218
  const configured = packageJson.specController;
312
219
  if (!isBlock(configured))
313
220
  return [];
314
- return Object.keys(configured).filter((key) => RETIRED_SPEC_CONTROLLER_KEYS.includes(key));
221
+ return Object.entries(configured).flatMap(([key, value]) => {
222
+ if (key === "fitnessChecks")
223
+ return retiredRowKeysOf(value);
224
+ return RETIRED_SPEC_CONTROLLER_KEYS.includes(key) ? [key] : [];
225
+ });
315
226
  }
316
227
  //# sourceMappingURL=targetManifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"targetManifest.js","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAuB,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAA0B,MAAM,4BAA4B,CAAC;AACrF,yFAAyF;AACzF,6FAA6F;AAC7F,uDAAuD;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,uGAAuG;AACvG,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAEhC;IACC,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,EAAE,SAAS,CAAC;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;AAChG,CAAC;AAcD,6EAA6E;AAC7E,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO,OAAO,UAAU,KAAK,QAAQ;QACnC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE;QACpC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAKD;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,GAAY,EAAE,SAA0B;IACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC9B,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACzC,6FAA6F;QAC7F,6FAA6F;QAC7F,4FAA4F;QAC5F,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,0BAA0B,CACjC,OAAgC,EAChC,SAA0B;IAE1B,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,QAAQ,CAAC,GAAG,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACvD,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC1B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAA0D;AAC1D;;;;GAIG;AACH,SAA0B;IAE1B,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,EAAE,UAAU,CAAC;IAC1D,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC;IAClD,OAAO,YAAY,CAAC,0BAA0B,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAEC;AACD,6FAA6F;AAC7F,WAA8B;IAE9B,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,EAAE,YAAY,CAAC;IAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QACtC,CAAC,CAAC,UAAU;aACP,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC;YACxD,0FAA0F;YAC1F,kFAAkF;YAClF,qEAAqE;aACpE,GAAG,CAAC,QAAQ,CAAC;aACb,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;QAChC,CAAC,CAAC,EAAE,CAAC;IACP,0FAA0F;IAC1F,8EAA8E;IAC9E,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAEC;AACD;;;GAGG;AACH,SAA0B;IAE1B,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,EAAE,aAAa,CAAC;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACnE,OAAO,eAAe,CACnB,UAAiC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CACrF,CAAC;AACJ,CAAC;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,UAAU,cAAc,CAAC,WAE9B;IACC,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,EAAE,OAAO,CAAC;IACvD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IACrE,MAAM,MAAM,GAAG,CAAC,GAAW,EAAW,EAAE,CACrC,sBAA4C,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAC/B,CAAC,KAAK,EAAoC,EAAE,CAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAC1E,CACF;QACD,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KACxE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,4BAA4B,GAAG,CAAC,eAAe,EAAE,cAAc,CAAU,CAAC;AAEhF,MAAM,UAAU,kBAAkB,CAAC,WAAyC;IAC1E,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,CAAC;IAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3C,4BAAkD,CAAC,QAAQ,CAAC,GAAG,CAAC,CAClE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"targetManifest.js","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"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"}
@@ -15,17 +15,15 @@
15
15
  */
16
16
  /**
17
17
  * The CLI input paths/flags actually used for a run — each optional; only the ones
18
- * the operator supplied are present. Mirrors the CLI's ReconcileOptions (the same
19
- * --features/--vitest/--cucumber/--ci/--package-json/--measurements/--ci-steps seams).
18
+ * the operator supplied are present. The same --features/--vitest/--cucumber/--ci/
19
+ * --package-json/--ci-steps seams as the CLI's ReconcileOptions.
20
20
  *
21
- * `measurements` and the converted checks' credit stream joined the interface at 3F-3184
22
- * (@SCN-RPT-027). They were
23
- * ALREADY flowing through it: `reconcileInputsOf` builds one ReconcileOptions carrying all
24
- * seven and that same object is both reconciled and assigned to `ctx.inputs`, so structural
25
- * typing let the two ride along unseen and the block simply never named them. Both are
26
- * optional by design — passed only where the file exists — which is exactly why their
27
- * silence was ambiguous between "the run never got it" and "the run got it and the block
28
- * does not say so".
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".
29
27
  */
30
28
  export interface RunInputs {
31
29
  features?: string;
@@ -33,7 +31,6 @@ export interface RunInputs {
33
31
  cucumber?: string;
34
32
  ci?: string;
35
33
  packageJson?: string;
36
- measurements?: string;
37
34
  ciSteps?: string;
38
35
  }
39
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/provenance/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;;;;;;;;;;;GAaG;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,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,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;AAiBD,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":"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"}
@@ -24,8 +24,7 @@ const INPUT_FLAGS = [
24
24
  // APPENDED, so no flag that was already rendered moves (@SCN-RPT-027). Widening this
25
25
  // list is the whole of the change: `presentInputs`, `provenanceObject`,
26
26
  // `projectProvenanceObject`, the markdown header and the JSON object all iterate it, so
27
- // the two surfaces gain the streams in step and neither can drift from the other.
28
- { key: "measurements", flag: "--measurements" },
27
+ // the two surfaces gain the stream in step and neither can drift from the other.
29
28
  { key: "ciSteps", flag: "--ci-steps" },
30
29
  ];
31
30
  /** Format an instant as second-precision UTC, e.g. `2026-06-27T08:17:53Z`. */
@@ -82,7 +81,7 @@ export function projectProvenanceObject(obj) {
82
81
  // The flags with no value, derived in the SAME pass over the SAME canonical list that
83
82
  // produces the flags with one (@SCN-RPT-028). One list, one traversal, two complementary
84
83
  // outputs — so a flag can never be named on both lines, nor missing from both, and adding
85
- // an eighth input flag reaches the absence line without anyone remembering to.
84
+ // another input flag reaches the absence line without anyone remembering to.
86
85
  const absentInputs = [];
87
86
  for (const { key, flag } of INPUT_FLAGS) {
88
87
  const value = obj.inputs[key];
@@ -1 +1 @@
1
- {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/provenance/provenance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/provenance/provenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
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
+ 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
+ export type EvidenceColumn = {
17
+ kind: "lint";
18
+ } | {
19
+ kind: "runtime";
20
+ qualityCheck: RuntimeQualityCheck;
21
+ };
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
+ export declare function evidenceColumns(scenarios: readonly ScenarioReconciliation[]): EvidenceColumn[];
28
+ /** The column's header — the tag word, title-cased (Lint / Unit / Integration / …). */
29
+ 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
+ export declare function evidenceCell(s: ScenarioReconciliation, col: EvidenceColumn): string;
45
+ //# sourceMappingURL=evidenceGrid.d.ts.map
@@ -0,0 +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"}