@3f-consulting/spec-controller-core 0.1.0-alpha.4 → 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 (119) hide show
  1. package/dist/assemble/evidenceReconciliationFromSources.d.ts +4 -13
  2. package/dist/assemble/evidenceReconciliationFromSources.d.ts.map +1 -1
  3. package/dist/assemble/evidenceReconciliationFromSources.js +17 -22
  4. package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
  5. package/dist/domain/checkCharacteristics.d.ts +22 -15
  6. package/dist/domain/checkCharacteristics.d.ts.map +1 -1
  7. package/dist/domain/checkCharacteristics.js +22 -15
  8. package/dist/domain/checkCharacteristics.js.map +1 -1
  9. package/dist/domain/evidenceReconciliation.d.ts +26 -2
  10. package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
  11. package/dist/domain/evidenceReconciliation.js +164 -61
  12. package/dist/domain/evidenceReconciliation.js.map +1 -1
  13. package/dist/domain/fitnessChecks.d.ts +24 -35
  14. package/dist/domain/fitnessChecks.d.ts.map +1 -1
  15. package/dist/domain/fitnessChecks.js +3 -30
  16. package/dist/domain/fitnessChecks.js.map +1 -1
  17. package/dist/domain/journal.d.ts +13 -103
  18. package/dist/domain/journal.d.ts.map +1 -1
  19. package/dist/domain/journal.js +6 -19
  20. package/dist/domain/journal.js.map +1 -1
  21. package/dist/domain/ledger.d.ts.map +1 -1
  22. package/dist/domain/ledger.js +45 -34
  23. package/dist/domain/ledger.js.map +1 -1
  24. package/dist/domain/posting.d.ts.map +1 -1
  25. package/dist/domain/posting.js +4 -7
  26. package/dist/domain/posting.js.map +1 -1
  27. package/dist/domain/qualityCheckFaultMessages.d.ts +7 -2
  28. package/dist/domain/qualityCheckFaultMessages.d.ts.map +1 -1
  29. package/dist/domain/qualityCheckFaultMessages.js +7 -2
  30. package/dist/domain/qualityCheckFaultMessages.js.map +1 -1
  31. package/dist/domain/qualityCheckReconciliation.d.ts +21 -0
  32. package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
  33. package/dist/domain/qualityCheckReconciliation.js +40 -105
  34. package/dist/domain/qualityCheckReconciliation.js.map +1 -1
  35. package/dist/domain/qualityCheckReconciliationFault.d.ts +3 -1
  36. package/dist/domain/qualityCheckReconciliationFault.d.ts.map +1 -1
  37. package/dist/domain/qualityCheckReconciliationFault.js +3 -1
  38. package/dist/domain/qualityCheckReconciliationFault.js.map +1 -1
  39. package/dist/index.d.ts +0 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +0 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/internal.d.ts +2 -10
  44. package/dist/internal.d.ts.map +1 -1
  45. package/dist/internal.js +24 -71
  46. package/dist/internal.js.map +1 -1
  47. package/dist/parse/checkScriptsRunInCI.d.ts +8 -7
  48. package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
  49. package/dist/parse/checkScriptsRunInCI.js +7 -6
  50. package/dist/parse/checkScriptsRunInCI.js.map +1 -1
  51. package/dist/parse/ciStepRecord.d.ts +5 -17
  52. package/dist/parse/ciStepRecord.d.ts.map +1 -1
  53. package/dist/parse/ciStepRecord.js +7 -27
  54. package/dist/parse/ciStepRecord.js.map +1 -1
  55. package/dist/parse/corpusCodeFaults.d.ts +4 -4
  56. package/dist/parse/corpusCodeFaults.js +4 -4
  57. package/dist/parse/corpusFaults.d.ts +24 -36
  58. package/dist/parse/corpusFaults.d.ts.map +1 -1
  59. package/dist/parse/corpusFaults.js +16 -32
  60. package/dist/parse/corpusFaults.js.map +1 -1
  61. package/dist/parse/corpusGrammarFaults.d.ts +11 -73
  62. package/dist/parse/corpusGrammarFaults.d.ts.map +1 -1
  63. package/dist/parse/corpusGrammarFaults.js +27 -58
  64. package/dist/parse/corpusGrammarFaults.js.map +1 -1
  65. package/dist/parse/runningStaticChecks.d.ts +3 -2
  66. package/dist/parse/runningStaticChecks.d.ts.map +1 -1
  67. package/dist/parse/runningStaticChecks.js +3 -2
  68. package/dist/parse/runningStaticChecks.js.map +1 -1
  69. package/dist/parse/scenarios.d.ts +27 -12
  70. package/dist/parse/scenarios.d.ts.map +1 -1
  71. package/dist/parse/scenarios.js +47 -85
  72. package/dist/parse/scenarios.js.map +1 -1
  73. package/dist/parse/targetCorpus.d.ts +21 -11
  74. package/dist/parse/targetCorpus.d.ts.map +1 -1
  75. package/dist/parse/targetCorpus.js +16 -19
  76. package/dist/parse/targetCorpus.js.map +1 -1
  77. package/dist/parse/targetManifest.d.ts +10 -85
  78. package/dist/parse/targetManifest.d.ts.map +1 -1
  79. package/dist/parse/targetManifest.js +47 -137
  80. package/dist/parse/targetManifest.js.map +1 -1
  81. package/dist/provenance/provenance.d.ts +8 -11
  82. package/dist/provenance/provenance.d.ts.map +1 -1
  83. package/dist/provenance/provenance.js +2 -3
  84. package/dist/provenance/provenance.js.map +1 -1
  85. package/dist/render/evidenceGrid.d.ts +45 -0
  86. package/dist/render/evidenceGrid.d.ts.map +1 -0
  87. package/dist/render/evidenceGrid.js +145 -0
  88. package/dist/render/evidenceGrid.js.map +1 -0
  89. package/dist/render/markdown.d.ts.map +1 -1
  90. package/dist/render/markdown.js +85 -190
  91. package/dist/render/markdown.js.map +1 -1
  92. package/dist/render/runVerdict.d.ts +3 -2
  93. package/dist/render/runVerdict.d.ts.map +1 -1
  94. package/dist/render/runVerdict.js +3 -2
  95. package/dist/render/runVerdict.js.map +1 -1
  96. package/dist/render/staticChecks.d.ts.map +1 -1
  97. package/dist/render/staticChecks.js +10 -1
  98. package/dist/render/staticChecks.js.map +1 -1
  99. package/package.json +1 -1
  100. package/dist/domain/thresholds.d.ts +0 -123
  101. package/dist/domain/thresholds.d.ts.map +0 -1
  102. package/dist/domain/thresholds.js +0 -185
  103. package/dist/domain/thresholds.js.map +0 -1
  104. package/dist/parse/checkStaticEvidenceObligations.d.ts +0 -32
  105. package/dist/parse/checkStaticEvidenceObligations.d.ts.map +0 -1
  106. package/dist/parse/checkStaticEvidenceObligations.js +0 -78
  107. package/dist/parse/checkStaticEvidenceObligations.js.map +0 -1
  108. package/dist/parse/corpusClaimFaults.d.ts +0 -104
  109. package/dist/parse/corpusClaimFaults.d.ts.map +0 -1
  110. package/dist/parse/corpusClaimFaults.js +0 -128
  111. package/dist/parse/corpusClaimFaults.js.map +0 -1
  112. package/dist/parse/measurements.d.ts +0 -47
  113. package/dist/parse/measurements.d.ts.map +0 -1
  114. package/dist/parse/measurements.js +0 -65
  115. package/dist/parse/measurements.js.map +0 -1
  116. package/dist/render/measuredItem.d.ts +0 -30
  117. package/dist/render/measuredItem.d.ts.map +0 -1
  118. package/dist/render/measuredItem.js +0 -43
  119. package/dist/render/measuredItem.js.map +0 -1
@@ -53,7 +53,7 @@ evidenceObligationsOf, pendingItemsOf, } from "../model.js";
53
53
  import { reconcileEvidenceObligation,
54
54
  // THE CREDIT-SIDE AND DEGENERATE OUTCOME RULES (3F-2204) — what an entry reconciles TO, as
55
55
  // opposed to where it lands. `reconcile` asks; it no longer maps outcomes itself.
56
- noEvidenceObligationReconciliationsOf, citesUnknownScenarioReconciliationsOf, suspenseReconciliationsOf, noScnCodeReconciliations, } from "./qualityCheckReconciliation.js";
56
+ noEvidenceObligationReconciliationsOf, citesUnknownScenarioReconciliationsOf, suspenseReconciliationsOf, noScnCodeReconciliations, unspecifiedRowReconciliations, } from "./qualityCheckReconciliation.js";
57
57
  import { ledgerTally, runtimeObservationTally, staticObservationTally, } from "./ledger.js";
58
58
  import { verdictFor, reconcilingItemsOf,
59
59
  // THE ROW-SHAPE RULE (3F-2204) — the both-missing degeneration and its pending clause.
@@ -61,8 +61,8 @@ qualityCheckReconciliationsOf, } from "./scenarioReconciliation.js";
61
61
  // THE POSTING RULE (3F-2202) — where an entry lands is canon's own glossary group, so it lives on
62
62
  // its own concept module. `reconcile` no longer decides a destination; it ASKS.
63
63
  import { postingOf } from "./posting.js";
64
- // The `lint` quality-check's own sub-discriminator (@SCN-CIP-003), asked here to NARROW what the
65
- // posting rule has already routed — see the fitness arm below.
64
+ // The `lint` quality-check's own predicate, asked here to NARROW what the posting rule has already
65
+ // routed — see the fitness arm below.
66
66
  import { isStaticCheckObservation } from "../model.js";
67
67
  function citationIndex() {
68
68
  const byScn = new Map();
@@ -107,9 +107,6 @@ function routeCredits(evidenceObservations, scenarioIds) {
107
107
  // same kind of absence, so it lands in the same stream and renders through the same section.
108
108
  const brokenEvidence = [];
109
109
  const uncited = [];
110
- // The FITNESS union, not the static interface alone (@SCN-CIP-003). A measurement always cites —
111
- // its runner stamps the citation — so it cannot in fact reach suspense; the stream is typed to
112
- // what `postingOf` may hand it rather than to what today's producers happen to emit.
113
110
  const noEvidenceObligationGuards = [];
114
111
  for (const o of evidenceObservations) {
115
112
  // The union NARROW — `qualityCheck === "lint"` is the `EvidenceObservation` union's TYPE TAG,
@@ -161,55 +158,57 @@ function routeCredits(evidenceObservations, scenarioIds) {
161
158
  }
162
159
  return { citations, brokenEvidence, uncited, noEvidenceObligationGuards };
163
160
  }
164
- export function reconcile(scenarios, evidenceObservations, untaggedScenarios = []) {
165
- const scenarioReconciliations = [];
166
- // THE OBLIGATION SIDE, prepared once — the three sets the posting rule and the outcome rules read.
167
- // Each is already the MODEL's own rule (never re-derived here), and each is built ONCE and
168
- // shared, so no two consumers can drift: `scenarioIds` is which scenarios exist,
169
- // and `evidenceObligationPairs` is what they name at each quality-check (3F-1858).
170
- const scenarioIds = new Set(scenarios.map((d) => d.scnId));
171
- // The NAMED pairs — the model's rule, built ONCE and shared with the census (3F-1858).
172
- // Pending obligations are excluded: a pending obligation names nothing.
173
- const evidenceObligationPairs = evidenceObligationPairsOf(scenarios);
174
- // THE ONE ROUTING PASS (3F-2202) — asked of the posting rule, in one place, and read back as
175
- // four streams. What each of them then RECONCILES to is the fold's, below.
176
- const { citations, brokenEvidence, uncited, noEvidenceObligationGuards } = routeCredits(evidenceObservations, scenarioIds);
177
- for (const d of scenarios) {
178
- // THE PENDING PARTITION (@SCN-PND-004) — `pendingItemsOf` and `evidenceObligationsOf`
179
- // are exact complements over the scenario's obligations, so nothing is dropped and nothing is
180
- // counted twice. Rule + rationale: `domain/journal`.
181
- const pendingItems = pendingItemsOf(d);
182
- // The DEBIT side — each NAMED obligation reconciled against the observed evidence.
183
- const reconciledEvidenceObligations = evidenceObligationsOf(d.evidenceObligations).map((req) => reconcileEvidenceObligation(d.scnId, req, evidenceObservations));
184
- // The CREDIT side — NO-EVIDENCE-OBLIGATION (@SCN-LDG-008): a credit citing THIS real scenario at a
185
- // quality-check it never named. Rule + rationale: `domain/qualityCheckReconciliation`.
186
- const noEvidenceObligationItems = noEvidenceObligationReconciliationsOf(d.scnId, citations.creditsFor(d.scnId), evidenceObligationPairs);
187
- // The row's SUB-ROWS, degenerating to one `both-missing` item when the row reconciled to
188
- // nothing either way (@SCN-LDG-009). Rule + rationale: `domain/scenarioReconciliation`.
189
- const qualityCheckReconciliations = qualityCheckReconciliationsOf(reconciledEvidenceObligations, noEvidenceObligationItems, pendingItems);
190
- scenarioReconciliations.push({
191
- scnId: d.scnId,
192
- kind: "scenario",
193
- verdict: verdictFor(qualityCheckReconciliations),
194
- // THE POSTED CREDITS (@SCN-LDG-022) — every credit CITING this scenario, whatever it
195
- // reconciles to above. The citation index holds every citing credit, so this includes one citing a
196
- // PENDING quality-check, which reconciles `no-evidence-obligation` (3F-1858 — it used to reconcile to
197
- // NO ROW AT ALL, the false-green this posting made visible without fixing). It posts and is
198
- // findable WHATEVER it reconciles to; posting is not classifying, and a misclassification
199
- // must misfile an entry, never vaporise it. A fitness check's run is in here too and by the
200
- // SAME route (3F-2590): it cites this scenario, so the citation index holds it like any other.
201
- evidenceObservations: citations.creditsFor(d.scnId),
202
- // THE POSTED DEBITS (@SCN-LDG-023) — every obligation THIS scenario RAISES, in document
203
- // order, keyed by quality-check. The debit half of the same posting: where a credit is
204
- // routed by its citation, a debit needs no routing at all — the account IS the scenario.
205
- // Includes a PENDING obligation, which partitioned off above and earns NO reconciled row: it
206
- // posts ANYWAY. Posting is not classifying, on this side too.
207
- evidenceObligations: [...d.evidenceObligations],
208
- qualityCheckReconciliations,
209
- reconcilingItems: reconcilingItemsOf(qualityCheckReconciliations),
210
- pendingItems,
211
- });
212
- }
161
+ /**
162
+ * ONE REAL SCENARIO'S ROW — the debit side reconciled against the observed evidence, the credit
163
+ * side's no-evidence-obligation items beside it, and the row assembled from both.
164
+ *
165
+ * ITS OWN FUNCTION, extracted at @SCN-LNT-027 (3F-3472) when the fourth population took `reconcile`
166
+ * past the `max-lines-per-function` ceiling — `routeCredits`' own precedent, and the same seam.
167
+ * Routing is one idea with a name, what each population RECONCILES to is another, and `reconcile`
168
+ * is the ORDER they are filed in. Nothing any of them decides moved.
169
+ */
170
+ function scenarioRow(d, evidenceObservations, citations, evidenceObligationPairs) {
171
+ // THE PENDING PARTITION (@SCN-PND-004) — `pendingItemsOf` and `evidenceObligationsOf`
172
+ // are exact complements over the scenario's obligations, so nothing is dropped and nothing is
173
+ // counted twice. Rule + rationale: `domain/journal`.
174
+ const pendingItems = pendingItemsOf(d);
175
+ // The DEBIT side — each NAMED obligation reconciled against the observed evidence.
176
+ const reconciledEvidenceObligations = evidenceObligationsOf(d.evidenceObligations).map((req) => reconcileEvidenceObligation(d.scnId, req, evidenceObservations));
177
+ // The CREDIT side — NO-EVIDENCE-OBLIGATION (@SCN-LDG-008): a credit citing THIS real scenario at a
178
+ // quality-check it never named. Rule + rationale: `domain/qualityCheckReconciliation`.
179
+ const noEvidenceObligationItems = noEvidenceObligationReconciliationsOf(d.scnId, citations.creditsFor(d.scnId), evidenceObligationPairs);
180
+ // The row's SUB-ROWS, degenerating to one `both-missing` item when the row reconciled to
181
+ // nothing either way (@SCN-LDG-009). Rule + rationale: `domain/scenarioReconciliation`.
182
+ const qualityCheckReconciliations = qualityCheckReconciliationsOf(reconciledEvidenceObligations, noEvidenceObligationItems, pendingItems);
183
+ return {
184
+ scnId: d.scnId,
185
+ kind: "scenario",
186
+ verdict: verdictFor(qualityCheckReconciliations),
187
+ // THE POSTED CREDITS (@SCN-LDG-022) — every credit CITING this scenario, whatever it
188
+ // reconciles to above. The citation index holds every citing credit, so this includes one citing a
189
+ // PENDING quality-check, which reconciles `no-evidence-obligation` (3F-1858 — it used to reconcile to
190
+ // NO ROW AT ALL, the false-green this posting made visible without fixing). It posts and is
191
+ // findable WHATEVER it reconciles to; posting is not classifying, and a misclassification
192
+ // must misfile an entry, never vaporise it. A fitness check's run is in here too and by the
193
+ // SAME route (3F-2590): it cites this scenario, so the citation index holds it like any other.
194
+ evidenceObservations: citations.creditsFor(d.scnId),
195
+ // THE POSTED DEBITS (@SCN-LDG-023) — every obligation THIS scenario RAISES, in document
196
+ // order, keyed by quality-check. The debit half of the same posting: where a credit is
197
+ // routed by its citation, a debit needs no routing at all — the account IS the scenario.
198
+ // Includes a PENDING obligation, which partitioned off above and earns NO reconciled row: it
199
+ // posts ANYWAY. Posting is not classifying, on this side too.
200
+ evidenceObligations: [...d.evidenceObligations],
201
+ qualityCheckReconciliations,
202
+ reconcilingItems: reconcilingItemsOf(qualityCheckReconciliations),
203
+ pendingItems,
204
+ };
205
+ }
206
+ /**
207
+ * THE PHANTOM ROWS, assembled (@SCN-LDG-006). Extracted beside its siblings at 3F-3472; the
208
+ * routing that produced `citations.phantomIds` is `routeCredits`', and unchanged.
209
+ */
210
+ function phantomScenarioRows(citations) {
211
+ const rows = [];
213
212
  // CREDIT-SIDE — PHANTOM scenarios (@SCN-LDG-006). One phantom Scenario Reconciliation per
214
213
  // UNKNOWN cited id, in first-seen order, its Quality Check Reconciliation(s) carrying the
215
214
  // outcome `cites-unknown-scenario` (and the evidence observation's locator, ruling Q5), verdict
@@ -223,7 +222,7 @@ export function reconcile(scenarios, evidenceObservations, untaggedScenarios = [
223
222
  const credits = citations.creditsFor(scnId);
224
223
  // ASKED, not decided (3F-2204).
225
224
  const items = citesUnknownScenarioReconciliationsOf(credits);
226
- scenarioReconciliations.push({
225
+ rows.push({
227
226
  scnId,
228
227
  kind: "phantom-scenario",
229
228
  // ASKED, not restated (3F-2204, the close-gate read). Canon says a phantom row is ALWAYS
@@ -245,6 +244,14 @@ export function reconcile(scenarios, evidenceObservations, untaggedScenarios = [
245
244
  pendingItems: [],
246
245
  });
247
246
  }
247
+ return rows;
248
+ }
249
+ /**
250
+ * THE SUSPENSE ROW, assembled (@SCN-LDG-007) — nil rows or one. Extracted beside its siblings at
251
+ * 3F-3472; what lands on it is `routeCredits`' decision, and unchanged.
252
+ */
253
+ function suspenseScenarioRows(brokenEvidence, uncited, noEvidenceObligationGuards) {
254
+ const rows = [];
248
255
  // THE SUSPENSE ROW (@SCN-LDG-007) — every entry that names no scenario aggregates into ONE row
249
256
  // (sentinel scnId `(no scenario)`), grouped LAST, verdict always out-of-balance.
250
257
  //
@@ -254,7 +261,7 @@ export function reconcile(scenarios, evidenceObservations, untaggedScenarios = [
254
261
  // on it, so no credit means no row.
255
262
  if (brokenEvidence.length > 0 || uncited.length > 0 || noEvidenceObligationGuards.length > 0) {
256
263
  const items = suspenseReconciliationsOf(brokenEvidence, uncited, noEvidenceObligationGuards);
257
- scenarioReconciliations.push({
264
+ rows.push({
258
265
  scnId: "(no scenario)",
259
266
  kind: "suspense-scenario",
260
267
  // ASKED, not restated — same reason as the phantom row. The `if` above is what makes this
@@ -272,6 +279,13 @@ export function reconcile(scenarios, evidenceObservations, untaggedScenarios = [
272
279
  pendingItems: [],
273
280
  });
274
281
  }
282
+ return rows;
283
+ }
284
+ /**
285
+ * THE UNCODED-WORK ROWS, assembled (@SCN-LDG-021). Extracted beside its siblings at 3F-3472.
286
+ */
287
+ function untaggedScenarioRows(untaggedScenarios) {
288
+ const rows = [];
275
289
  // UNCODED WORK (@SCN-LDG-021) — a scenario carrying no @SCN. It is REAL and ORDINARY
276
290
  // (`kind: "scenario"`, never phantom or suspense: it exists, and cucumber runs it); what is
277
291
  // absent is the CODE its obligation needs in order to link to an observation. It gets its own
@@ -281,7 +295,7 @@ export function reconcile(scenarios, evidenceObservations, untaggedScenarios = [
281
295
  // are the item concept's (3F-2204, `noScnCodeReconciliations` — rule + rationale there).
282
296
  for (const name of untaggedScenarios) {
283
297
  const items = noScnCodeReconciliations();
284
- scenarioReconciliations.push({
298
+ rows.push({
285
299
  // The scenario's NAME is its only handle — it has no code. (Precedent: the suspense row's
286
300
  // "(no scenario)" sentinel; `featureCodeOf` falls back to the raw id when it cannot parse.)
287
301
  scnId: name,
@@ -299,7 +313,89 @@ export function reconcile(scenarios, evidenceObservations, untaggedScenarios = [
299
313
  pendingItems: [],
300
314
  });
301
315
  }
302
- return { scenarioReconciliations };
316
+ return rows;
317
+ }
318
+ /**
319
+ * THE ROWS A CONFIGURED ROW WITH NO SCENARIO EARNS, assembled (@SCN-LNT-027, 3F-3472).
320
+ */
321
+ function unspecifiedFitnessRowRows(unspecifiedFitnessRows) {
322
+ const rows = [];
323
+ // A CONFIGURED ROW THE CORPUS CARRIES NO SCENARIO FOR (@SCN-LNT-027, 3F-3472) — a check the
324
+ // target's manifest declares and nothing in its corpus specifies. The obligations travel with
325
+ // the scenarios, so such a row raised NOTHING: it was not `missing`, not phantom, not suspense,
326
+ // and a tree carrying one reconciled balanced at exit 0 over a check declared and never written.
327
+ // `features/fitness-checks.feature` promises the opposite in terms — "a row whose scenario the
328
+ // corpus does not carry as an Evidence Obligation nothing observed" — and this is that promise.
329
+ //
330
+ // THE PRECEDENT IS UNCODED WORK, three lines up: a fact the ordinary obligation path cannot raise
331
+ // reaches the ledger by a reading of its own and gets its own out-of-balance row so the verdict
332
+ // can see it at all. There the CORPUS supplies a row the obligations cannot; here the MANIFEST
333
+ // does.
334
+ //
335
+ // THE ROW IS NOT IN `scenarioIds`, WHICH IS WHAT MAKES IT UNDISCHARGEABLE. That set was built
336
+ // from `scenarios` alone and is not widened here, so a credit citing this row's code still mints
337
+ // a PHANTOM row (@SCN-LDG-006, @SCN-LNT-009) and a broken credit still lands on SUSPENSE — and
338
+ // there is no route left by which any credit settles this debit. Synthesising a `Scenario` for
339
+ // the row instead would have put it INTO that set, so a run whose CI step cited a declared-but-
340
+ // unwritten check would reconcile BALANCED: a new false green, in the case the phantom row
341
+ // already covers.
342
+ for (const row of unspecifiedFitnessRows) {
343
+ const items = unspecifiedRowReconciliations(row.characteristic);
344
+ rows.push({
345
+ scnId: row.scnId,
346
+ kind: "scenario",
347
+ // ASKED, not restated — the phantom and suspense rows' rule. `unspecifiedRowReconciliations`
348
+ // always returns the one `missing` item, so the verdict follows from it.
349
+ verdict: verdictFor(items),
350
+ // No scenario carries this code, so the citation router posts no credit here — see above.
351
+ evidenceObservations: [],
352
+ // THE DEBIT IS REAL AND IS POSTED (@SCN-LDG-023). Unlike the untagged row above, which
353
+ // reaches the ledger by name and names no check, this row names exactly one characteristic:
354
+ // that is the obligation, and the manifest is what raised it.
355
+ evidenceObligations: [...items.map((item) => item.evidenceObligation)],
356
+ qualityCheckReconciliations: items,
357
+ reconcilingItems: items,
358
+ pendingItems: [],
359
+ });
360
+ }
361
+ return rows;
362
+ }
363
+ export function reconcile(scenarios, evidenceObservations, untaggedScenarios = [],
364
+ /**
365
+ * The CONFIGURED ROWS the target's corpus carries no scenario for (@SCN-LNT-027, 3F-3472) — the
366
+ * fourth population, minted below.
367
+ *
368
+ * IT DEFAULTS, WHERE THE TWO GATES BELOW DELIBERATELY DO NOT (3F-2875). A gate that defaults is a
369
+ * gate a caller can forget and thereby CHANGE what the summary claims. This is a population, and
370
+ * an omitted population is indistinguishable from an empty one in the only way that matters:
371
+ * both mint no rows, and neither says anything about a manifest. Every caller that constructs
372
+ * `Scenario[]` by hand has no manifest to read rows from, which is `untaggedScenarios`' own
373
+ * argument for the default it already carries.
374
+ */
375
+ unspecifiedFitnessRows = []) {
376
+ // THE OBLIGATION SIDE, prepared once — the three sets the posting rule and the outcome rules read.
377
+ // Each is already the MODEL's own rule (never re-derived here), and each is built ONCE and
378
+ // shared, so no two consumers can drift: `scenarioIds` is which scenarios exist,
379
+ // and `evidenceObligationPairs` is what they name at each quality-check (3F-1858).
380
+ const scenarioIds = new Set(scenarios.map((d) => d.scnId));
381
+ // The NAMED pairs — the model's rule, built ONCE and shared with the census (3F-1858).
382
+ // Pending obligations are excluded: a pending obligation names nothing.
383
+ const evidenceObligationPairs = evidenceObligationPairsOf(scenarios);
384
+ // THE ONE ROUTING PASS (3F-2202) — asked of the posting rule, in one place, and read back as
385
+ // four streams. What each of them then RECONCILES to is the fold's, below.
386
+ const { citations, brokenEvidence, uncited, noEvidenceObligationGuards } = routeCredits(evidenceObservations, scenarioIds);
387
+ // THE ORDER THE POPULATIONS ARE FILED IN IS THE LEDGER'S GROUPING, and it is the whole of what
388
+ // this function decides now: the real scenario rows, then the phantom rows a credit invented,
389
+ // then the one suspense row, then uncoded work, then the configured rows no scenario specifies.
390
+ return {
391
+ scenarioReconciliations: [
392
+ ...scenarios.map((d) => scenarioRow(d, evidenceObservations, citations, evidenceObligationPairs)),
393
+ ...phantomScenarioRows(citations),
394
+ ...suspenseScenarioRows(brokenEvidence, uncited, noEvidenceObligationGuards),
395
+ ...untaggedScenarioRows(untaggedScenarios),
396
+ ...unspecifiedFitnessRowRows(unspecifiedFitnessRows),
397
+ ],
398
+ };
303
399
  }
304
400
  /**
305
401
  * Materialise the summary totals from the balance — the aggregate the markdown's trial-balance
@@ -388,8 +484,15 @@ export function summaryOf(ledger, withRuntimeObservations, withStaticChecks) {
388
484
  * so. A default is the wrong shape for an argument whose omission is indistinguishable from a
389
485
  * deliberate `false`.
390
486
  */
391
- export function evidenceReconciliationOf(scenarios, evidenceObservations, untaggedScenarios, withRuntimeObservations, withStaticChecks) {
392
- const ledger = reconcile(scenarios, evidenceObservations, untaggedScenarios);
487
+ export function evidenceReconciliationOf(scenarios, evidenceObservations, untaggedScenarios, withRuntimeObservations, withStaticChecks,
488
+ /**
489
+ * The CONFIGURED ROWS the corpus carries no scenario for (@SCN-LNT-027, 3F-3472) — passed
490
+ * through to `reconcile`, which mints one row apiece. It defaults for the reason given there, and
491
+ * that reason is NOT the trailing three's: a population omitted mints nothing and claims nothing,
492
+ * where a gate omitted silently changes what the summary says is in play.
493
+ */
494
+ unspecifiedFitnessRows = []) {
495
+ const ledger = reconcile(scenarios, evidenceObservations, untaggedScenarios, unspecifiedFitnessRows);
393
496
  return { summary: summaryOf(ledger, withRuntimeObservations, withStaticChecks), ledger };
394
497
  }
395
498
  //# sourceMappingURL=evidenceReconciliation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"evidenceReconciliation.js","sourceRoot":"","sources":["../../src/domain/evidenceReconciliation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evidenceReconciliation.js","sourceRoot":"","sources":["../../src/domain/evidenceReconciliation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAaH,OAAO,EACL,yBAAyB;AACzB,6FAA6F;AAC7F,qBAAqB,EACrB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,2BAA2B;AAC3B,2FAA2F;AAC3F,kFAAkF;AAClF,qCAAqC,EACrC,qCAAqC,EACrC,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,UAAU,EACV,kBAAkB;AAClB,uFAAuF;AACvF,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC;AACrC,kGAAkG;AAClG,gFAAgF;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,mGAAmG;AACnG,sCAAsC;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAyBvD,SAAS,aAAa;IACpB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IACvD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,OAAO;QACL,IAAI,CAAC,OAAO,EAAE,WAAW;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/E,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;QAC7C,UAAU;KACX,CAAC;AACJ,CAAC;AAiBD;;;;;;;;;;;;;;GAcG;AACH,SAAS,YAAY,CACnB,oBAAoD,EACpD,WAAgC;IAEhC,yFAAyF;IACzF,uFAAuF;IACvF,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,+FAA+F;IAC/F,gGAAgG;IAChG,sEAAsE;IACtE,+FAA+F;IAC/F,gGAAgG;IAChG,6FAA6F;IAC7F,MAAM,cAAc,GAA8D,EAAE,CAAC;IACrF,MAAM,OAAO,GAAiC,EAAE,CAAC;IACjD,MAAM,0BAA0B,GAAiC,EAAE,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,oBAAoB,EAAE,CAAC;QACrC,8FAA8F;QAC9F,gGAAgG;QAChG,oBAAoB;QACpB,IAAI,CAAC,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAC1C,uFAAuF;YACvF,0FAA0F;YAC1F,yFAAyF;YACzF,0FAA0F;YAC1F,EAAE;YACF,0FAA0F;YAC1F,uFAAuF;YACvF,2FAA2F;YAC3F,yFAAyF;YACzF,qEAAqE;YACrE,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACzC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,wBAAwB,CAAC,CAAC,CAAC;oBAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;oBAClF,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,oFAAoF;YACpF,mFAAmF;;gBAC9E,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC1C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,UAAU,CAAC;YAChB,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,wFAAwF;gBACxF,6EAA6E;gBAC7E,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;YACD,KAAK,mBAAmB;gBACtB,wFAAwF;gBACxF,0FAA0F;gBAC1F,2FAA2F;gBAC3F,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;oBAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;oBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACrB,MAAM;QACV,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAC5E,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,WAAW,CAClB,CAAW,EACX,oBAA2C,EAC3C,SAAwB,EACxB,uBAA4C;IAE5C,sFAAsF;IACtF,8FAA8F;IAC9F,qDAAqD;IACrD,MAAM,YAAY,GAAkB,cAAc,CAAC,CAAC,CAAC,CAAC;IAEtD,mFAAmF;IACnF,MAAM,6BAA6B,GAAG,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7F,2BAA2B,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAChE,CAAC;IAEF,mGAAmG;IACnG,uFAAuF;IACvF,MAAM,yBAAyB,GAAG,qCAAqC,CACrE,CAAC,CAAC,KAAK,EACP,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAC7B,uBAAuB,CACxB,CAAC;IAEF,yFAAyF;IACzF,wFAAwF;IACxF,MAAM,2BAA2B,GAAG,6BAA6B,CAC/D,6BAA6B,EAC7B,yBAAyB,EACzB,YAAY,CACb,CAAC;IACF,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,UAAU,CAAC,2BAA2B,CAAC;QAChD,qFAAqF;QACrF,mGAAmG;QACnG,sGAAsG;QACtG,4FAA4F;QAC5F,0FAA0F;QAC1F,4FAA4F;QAC5F,+FAA+F;QAC/F,oBAAoB,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;QACnD,wFAAwF;QACxF,uFAAuF;QACvF,yFAAyF;QACzF,6FAA6F;QAC7F,8DAA8D;QAC9D,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC,mBAAmB,CAAC;QAC/C,2BAA2B;QAC3B,gBAAgB,EAAE,kBAAkB,CAAC,2BAA2B,CAAC;QACjE,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,SAAwB;IACnD,MAAM,IAAI,GAA6B,EAAE,CAAC;IAC1C,0FAA0F;IAC1F,0FAA0F;IAC1F,gGAAgG;IAChG,0DAA0D;IAC1D,EAAE;IACF,8FAA8F;IAC9F,2FAA2F;IAC3F,6FAA6F;IAC7F,yDAAyD;IACzD,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5C,gCAAgC;QAChC,MAAM,KAAK,GAAG,qCAAqC,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC;YACR,KAAK;YACL,IAAI,EAAE,kBAAkB;YACxB,yFAAyF;YACzF,yFAAyF;YACzF,wFAAwF;YACxF,8FAA8F;YAC9F,2FAA2F;YAC3F,+FAA+F;YAC/F,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;YAC1B,0FAA0F;YAC1F,uFAAuF;YACvF,oBAAoB,EAAE,CAAC,GAAG,OAAO,CAAC;YAClC,uFAAuF;YACvF,0FAA0F;YAC1F,iDAAiD;YACjD,mBAAmB,EAAE,EAAE;YACvB,2BAA2B,EAAE,KAAK;YAClC,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAC3B,cAAkF,EAClF,OAA8C,EAC9C,0BAAiE;IAEjE,MAAM,IAAI,GAA6B,EAAE,CAAC;IAC1C,+FAA+F;IAC/F,iFAAiF;IACjF,EAAE;IACF,8FAA8F;IAC9F,+FAA+F;IAC/F,gGAAgG;IAChG,oCAAoC;IACpC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7F,MAAM,KAAK,GAAG,yBAAyB,CAAC,cAAc,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC7F,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,mBAAmB;YACzB,0FAA0F;YAC1F,kFAAkF;YAClF,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;YAC1B,wFAAwF;YACxF,sFAAsF;YACtF,iGAAiG;YACjG,oBAAoB,EAAE,CAAC,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,GAAG,0BAA0B,CAAC;YACpF,8EAA8E;YAC9E,iEAAiE;YACjE,mBAAmB,EAAE,EAAE;YACvB,2BAA2B,EAAE,KAAK;YAClC,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,iBAAoC;IAChE,MAAM,IAAI,GAA6B,EAAE,CAAC;IAC1C,qFAAqF;IACrF,4FAA4F;IAC5F,8FAA8F;IAC9F,uDAAuD;IACvD,EAAE;IACF,8FAA8F;IAC9F,yFAAyF;IACzF,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,wBAAwB,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC;YACR,0FAA0F;YAC1F,4FAA4F;YAC5F,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,UAAU;YAChB,wFAAwF;YACxF,gFAAgF;YAChF,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;YAC1B,0FAA0F;YAC1F,oBAAoB,EAAE,EAAE;YACxB,wFAAwF;YACxF,yBAAyB;YACzB,mBAAmB,EAAE,EAAE;YACvB,2BAA2B,EAAE,KAAK;YAClC,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAChC,sBAAwD;IAExD,MAAM,IAAI,GAA6B,EAAE,CAAC;IAC1C,4FAA4F;IAC5F,8FAA8F;IAC9F,gGAAgG;IAChG,iGAAiG;IACjG,+FAA+F;IAC/F,gGAAgG;IAChG,EAAE;IACF,kGAAkG;IAClG,gGAAgG;IAChG,+FAA+F;IAC/F,QAAQ;IACR,EAAE;IACF,8FAA8F;IAC9F,iGAAiG;IACjG,+FAA+F;IAC/F,+FAA+F;IAC/F,gGAAgG;IAChG,2FAA2F;IAC3F,kBAAkB;IAClB,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,6BAA6B,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,UAAU;YAChB,6FAA6F;YAC7F,yEAAyE;YACzE,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;YAC1B,0FAA0F;YAC1F,oBAAoB,EAAE,EAAE;YACxB,uFAAuF;YACvF,4FAA4F;YAC5F,8DAA8D;YAC9D,mBAAmB,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAmB,CAAC,CAAC;YACvE,2BAA2B,EAAE,KAAK;YAClC,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,SAAqB,EACrB,oBAA2C,EAC3C,oBAAuC,EAAE;AACzC;;;;;;;;;;GAUG;AACH,yBAA2D,EAAE;IAE7D,mGAAmG;IACnG,2FAA2F;IAC3F,iFAAiF;IACjF,mFAAmF;IACnF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,uFAAuF;IACvF,wEAAwE;IACxE,MAAM,uBAAuB,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACrE,6FAA6F;IAC7F,2EAA2E;IAC3E,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE,GAAG,YAAY,CACrF,oBAAoB,EACpB,WAAW,CACZ,CAAC;IACF,+FAA+F;IAC/F,8FAA8F;IAC9F,gGAAgG;IAChG,OAAO;QACL,uBAAuB,EAAE;YACvB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,WAAW,CAAC,CAAC,EAAE,oBAAoB,EAAE,SAAS,EAAE,uBAAuB,CAAC,CACzE;YACD,GAAG,mBAAmB,CAAC,SAAS,CAAC;YACjC,GAAG,oBAAoB,CAAC,cAAc,EAAE,OAAO,EAAE,0BAA0B,CAAC;YAC5E,GAAG,oBAAoB,CAAC,iBAAiB,CAAC;YAC1C,GAAG,yBAAyB,CAAC,sBAAsB,CAAC;SACrD;KACF,CAAC;AACJ,CAAC;AAqWD;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CACvB,MAAc,EACd,uBAAgC,EAChC,gBAAyB;IAEzB,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,+FAA+F;IAC/F,iGAAiG;IACjG,mGAAmG;IACnG,gGAAgG;IAChG,wEAAwE;IACxE,MAAM,YAAY,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACrD,+FAA+F;IAC/F,kGAAkG;IAClG,oGAAoG;IACpG,iGAAiG;IACjG,MAAM,YAAY,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACpD,OAAO;QACL,uBAAuB,EAAE,KAAK,CAAC,uBAAuB;QACtD,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,iGAAiG;QACjG,gGAAgG;QAChG,8FAA8F;QAC9F,2FAA2F;QAC3F,0GAA0G;QAC1G,oHAAoH;QACpH,8FAA8F;QAC9F,6GAA6G;QAC7G,wFAAwF;QACxF,2FAA2F;QAC3F,sBAAsB;QACtB,GAAG,CAAC,uBAAuB;YACzB,CAAC,CAAC;gBACE,UAAU,EAAE;oBACV,kFAAkF;oBAClF,qFAAqF;oBACrF,8CAA8C;oBAC9C,yBAAyB,EAAE,YAAY,CAAC,KAAK;oBAC7C,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,iBAAiB,EAAE,YAAY,CAAC,iBAAiB;oBACjD,kBAAkB,EAAE,YAAY,CAAC,kBAAkB;iBACpD;gBACD,qFAAqF;gBACrF,8DAA8D;gBAC9D,wBAAwB,EAAE,YAAY,CAAC,wBAAwB;aAChE;YACH,CAAC,CAAC,EAAE,CAAC;QACP,6FAA6F;QAC7F,4FAA4F;QAC5F,wEAAwE;QACxE,iGAAiG;QACjG,oGAAoG;QACpG,2CAA2C;QAC3C,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,8FAA8F;QAC9F,mDAAmD;QACnD,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAqB,EACrB,oBAA2C,EAC3C,iBAAoC,EACpC,uBAAgC,EAChC,gBAAyB;AACzB;;;;;GAKG;AACH,yBAA2D,EAAE;IAE7D,MAAM,MAAM,GAAG,SAAS,CACtB,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,CACvB,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,uBAAuB,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;AAC3F,CAAC"}
@@ -23,54 +23,22 @@
23
23
  * rather than something a lookup has to recover.
24
24
  *
25
25
  * PURE AND INJECTED — the rows arrive as data, read from the TARGET's own manifest at the app edge
26
- * (`specController.fitnessChecks`), the stance `thresholdsOf` already takes. A target that
26
+ * (`specController.fitnessChecks`), the stance the retired `thresholdsOf` took. A target that
27
27
  * configures nothing raises nothing, so the reading is inert on a corpus
28
28
  * nobody has converted.
29
29
  */
30
- import { type ThresholdBar } from "./thresholds.js";
31
30
  /**
32
31
  * ONE CONFIGURED ROW as the obligation rule reads it.
33
32
  *
34
33
  * The `scn` a row states is not a member here: it is this index's KEY, so a row cannot name one
35
34
  * scenario and be filed under another. The command a row states is not a member either — it is the
36
- * COMMAND half of the row and nothing on the debit side reads it. The BAR is, because whether the
37
- * row names one is what says the check is measured (@SCN-LNT-019).
38
- *
39
- * AND SO IS THE ENDING BY WHICH THAT COMMAND SAYS `I EXAMINED NOTHING` (3F-3177). It is not the
40
- * command: it is the row's sentence about how the command SPEAKS, and the credit side has to ask
41
- * it, because a skip in the run's step record is honest exactly where the row named the ending that
42
- * produced it and incidental everywhere else. One field read by two sides belongs in the ONE
43
- * reading of the rows, beside the bar — a second copy elsewhere is two readers of one fact.
35
+ * COMMAND half of the row and nothing on the debit side reads it. Every row is credited by its own
36
+ * step's outcome in the run's record, so the characteristic is the whole of what the ledger reads.
44
37
  */
45
38
  export interface FitnessCheck {
46
39
  /** The bare characteristic this check asserts (`complexity`). */
47
40
  readonly characteristic: string;
48
- /**
49
- * The BAR this check's number is held to (@SCN-LNT-019), and the field whose PRESENCE says the
50
- * check is measured at all.
51
- *
52
- * THREE STATES, AND THE MIDDLE ONE IS THE POINT. Absent: the row named no bar key, so the check
53
- * is static — the discrimination `thresholdsOf` has always made, where a check with no entry is
54
- * already the static case. A bar: the row named one and it read. `null`: the row named one and
55
- * authored none this could read, which keeps the check MEASURED with nothing to hold it to —
56
- * `barOf`'s own way with an entry it cannot read, and the shape @SCN-CIP-002 exists to report.
57
- *
58
- * READ THROUGH `carriesBar`, NEVER BY REACHING FOR THIS FIELD, because both sides of the ledger
59
- * ask the same question of it and one spelling is what keeps their answers the same.
60
- */
61
- readonly bar?: ThresholdBar | null;
62
41
  }
63
- /**
64
- * THE ONE PREDICATE — does this row carry a bar (@SCN-LNT-019).
65
- *
66
- * The DEBIT asks it to decide whether to raise a measured obligation or a static one; the CREDIT
67
- * asks it to decide whether a step's outcome raises a credit at all, a measured row's credit
68
- * being its NUMBER. Two questions, one fact, and one spelling: two readers over this field would
69
- * eventually differ, and the row whose bar nothing can read — measured, with `null` beside it — is
70
- * exactly where they would differ first, producing an obligation with no credit or two credits for
71
- * one obligation.
72
- */
73
- export declare function carriesBar(check: FitnessCheck): boolean;
74
42
  /** The rows as the rule reads them — bare `@SCN` → the row naming that scenario's check. */
75
43
  export type FitnessCheckIndex = ReadonlyMap<string, FitnessCheck>;
76
44
  /**
@@ -87,4 +55,25 @@ export type FitnessCheckIndex = ReadonlyMap<string, FitnessCheck>;
87
55
  * dropped row leaves its scenario naming no characteristic, which the corpus reports.
88
56
  */
89
57
  export declare function fitnessChecksOf(entries: unknown): FitnessCheckIndex;
58
+ /**
59
+ * ONE CONFIGURED ROW THE TARGET'S CORPUS CARRIES NO SCENARIO FOR (3F-3472) — a check the manifest
60
+ * declares and nothing in the corpus specifies.
61
+ *
62
+ * THE MIRROR OF `unconfiguredFitnessScenarios`, AND THE HALF THE BOOKS COULD NOT SEE. That one
63
+ * reads a `@fitness` scenario no row names; this reads a row no scenario names. The asymmetry
64
+ * between what each EARNS is the two facts' own: a scenario naming no row names no characteristic,
65
+ * so there is nothing to put on the books and the census says who — a row names one, so there IS a
66
+ * debit, and `features/fitness-checks.feature` promises it as "an Evidence Obligation nothing
67
+ * observed".
68
+ *
69
+ * IT CARRIES THE CHARACTERISTIC BECAUSE THE OBLIGATION IT RAISES NAMES ONE. The `@SCN` alone would
70
+ * leave the reader of this reading to go back to the index for the other half, which is the second
71
+ * read `readTargetCorpus` composes its readings together to foreclose.
72
+ */
73
+ export interface UnspecifiedFitnessRow {
74
+ /** The `@SCN` the row states, which no scenario in the target's corpus carries. */
75
+ readonly scnId: string;
76
+ /** The bare characteristic the row asserts (`complexity`) — what its debit is owed at. */
77
+ readonly characteristic: string;
78
+ }
90
79
  //# sourceMappingURL=fitnessChecks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fitnessChecks.d.ts","sourceRoot":"","sources":["../../src/domain/fitnessChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACpC;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAEvD;AAED,4FAA4F;AAC5F,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAwClE;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAQnE"}
1
+ {"version":3,"file":"fitnessChecks.d.ts","sourceRoot":"","sources":["../../src/domain/fitnessChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,4FAA4F;AAC5F,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AA2BlE;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAQnE;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC"}
@@ -23,38 +23,18 @@
23
23
  * rather than something a lookup has to recover.
24
24
  *
25
25
  * PURE AND INJECTED — the rows arrive as data, read from the TARGET's own manifest at the app edge
26
- * (`specController.fitnessChecks`), the stance `thresholdsOf` already takes. A target that
26
+ * (`specController.fitnessChecks`), the stance the retired `thresholdsOf` took. A target that
27
27
  * configures nothing raises nothing, so the reading is inert on a corpus
28
28
  * nobody has converted.
29
29
  */
30
30
  import { bareTerm } from "../lib/bareTerm.js";
31
- import { barOf } from "./thresholds.js";
32
- /**
33
- * THE ONE PREDICATE — does this row carry a bar (@SCN-LNT-019).
34
- *
35
- * The DEBIT asks it to decide whether to raise a measured obligation or a static one; the CREDIT
36
- * asks it to decide whether a step's outcome raises a credit at all, a measured row's credit
37
- * being its NUMBER. Two questions, one fact, and one spelling: two readers over this field would
38
- * eventually differ, and the row whose bar nothing can read — measured, with `null` beside it — is
39
- * exactly where they would differ first, producing an obligation with no credit or two credits for
40
- * one obligation.
41
- */
42
- export function carriesBar(check) {
43
- return check.bar !== undefined;
44
- }
45
- /**
46
- * The two keys a row names its bar with. Either one makes the row MEASURED, whatever stands beside
47
- * it — the key is the target saying this check produces a number, and only the value can fail to
48
- * read.
49
- */
50
- const BAR_DIRECTIONS = ["atLeast", "atMost"];
51
31
  /**
52
32
  * One entry as a manifest spells it, read into the pair a lookup can use, or `null` where it names
53
33
  * nothing one can.
54
34
  *
55
35
  * BOTH TERMS ARE STORED BARE. A manifest written by hand will sooner or later spell an `@SCN` — and
56
36
  * a characteristic — the way a feature file does, and both lookups match bare; stripping once here
57
- * rather than at every call site is the stance `thresholdsOf` already takes.
37
+ * rather than at every call site is the stance the retired `thresholdsOf` took.
58
38
  *
59
39
  * A ROW NAMING NEITHER TERM IS DROPPED WHOLE, never half-read. The two terms make one claim
60
40
  * together — THIS scenario asserts THIS characteristic — so a row missing either says nothing a
@@ -72,14 +52,7 @@ function fitnessCheckOf(entry) {
72
52
  const characteristic = bareTerm(named.characteristic);
73
53
  if (scnId === "" || characteristic === "")
74
54
  return null;
75
- // THE ROW'S SHAPE SAYS WHICH KIND OF CHECK IT IS — no type field, no second tag, no roster of
76
- // measured characteristics somebody has to keep in step with the rows. The bar is read by the
77
- // threshold index's OWN reader, handed the row whole: one grammar for `atLeast` / `atMost`, so a
78
- // converted row and a threshold entry cannot come to disagree about what a target wrote.
79
- const row = named;
80
- if (!BAR_DIRECTIONS.some((direction) => direction in row))
81
- return [scnId, { characteristic }];
82
- return [scnId, { characteristic, bar: barOf(row) }];
55
+ return [scnId, { characteristic }];
83
56
  }
84
57
  /**
85
58
  * Build the index from the rows a manifest holds.
@@ -1 +1 @@
1
- {"version":3,"file":"fitnessChecks.js","sourceRoot":"","sources":["../../src/domain/fitnessChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAqB,MAAM,iBAAiB,CAAC;AAmC3D;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,KAAmB;IAC5C,OAAO,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC;AACjC,CAAC;AAKD;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAU,CAAC;AAEtD;;;;;;;;;;;GAWG;AACH,SAAS,cAAc,CAAC,KAAc;IACpC,iGAAiG;IACjG,iGAAiG;IACjG,gGAAgG;IAChG,6CAA6C;IAC7C,MAAM,KAAK,GAAG,KAAuE,CAAC;IACtF,IAAI,OAAO,KAAK,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACtD,IAAI,KAAK,KAAK,EAAE,IAAI,cAAc,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvD,8FAA8F;IAC9F,8FAA8F;IAC9F,iGAAiG;IACjG,yFAAyF;IACzF,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;IAC9F,OAAO,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,OAA6B,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,GAAG,KAAK,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"fitnessChecks.js","sourceRoot":"","sources":["../../src/domain/fitnessChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAkB9C;;;;;;;;;;;GAWG;AACH,SAAS,cAAc,CAAC,KAAc;IACpC,iGAAiG;IACjG,iGAAiG;IACjG,gGAAgG;IAChG,6CAA6C;IAC7C,MAAM,KAAK,GAAG,KAAuE,CAAC;IACtF,IAAI,OAAO,KAAK,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACtD,IAAI,KAAK,KAAK,EAAE,IAAI,cAAc,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,OAA6B,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,GAAG,KAAK,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}