@3f-consulting/spec-controller-core 0.1.0-alpha.5 → 0.1.0-alpha.50
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.
- package/README.md +6 -4
- package/dist/assemble/evidenceReconciliationFromSources.d.ts +5 -40
- package/dist/assemble/evidenceReconciliationFromSources.d.ts.map +1 -1
- package/dist/assemble/evidenceReconciliationFromSources.js +31 -319
- package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
- package/dist/assemble/renderInput.d.ts +6 -72
- package/dist/assemble/renderInput.d.ts.map +1 -1
- package/dist/assemble/renderInput.js +3 -45
- package/dist/assemble/renderInput.js.map +1 -1
- package/dist/census/evidenceObligations.d.ts +10 -46
- package/dist/census/evidenceObligations.d.ts.map +1 -1
- package/dist/census/evidenceObligations.js +15 -25
- package/dist/census/evidenceObligations.js.map +1 -1
- package/dist/domain/evidenceOrder.d.ts +3 -0
- package/dist/domain/evidenceOrder.d.ts.map +1 -0
- package/dist/domain/evidenceOrder.js +15 -0
- package/dist/domain/evidenceOrder.js.map +1 -0
- package/dist/domain/evidenceReconciliation.d.ts +16 -386
- package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
- package/dist/domain/evidenceReconciliation.js +79 -375
- package/dist/domain/evidenceReconciliation.js.map +1 -1
- package/dist/domain/featureCode.d.ts +4 -0
- package/dist/domain/featureCode.d.ts.map +1 -0
- package/dist/domain/featureCode.js +12 -0
- package/dist/domain/featureCode.js.map +1 -0
- package/dist/domain/journal.d.ts +7 -392
- package/dist/domain/journal.d.ts.map +1 -1
- package/dist/domain/journal.js +6 -118
- package/dist/domain/journal.js.map +1 -1
- package/dist/domain/ledger.d.ts +4 -328
- package/dist/domain/ledger.d.ts.map +1 -1
- package/dist/domain/ledger.js +11 -317
- package/dist/domain/ledger.js.map +1 -1
- package/dist/domain/outcome.d.ts +3 -0
- package/dist/domain/outcome.d.ts.map +1 -0
- package/dist/domain/outcome.js +2 -0
- package/dist/domain/outcome.js.map +1 -0
- package/dist/domain/posting.d.ts +5 -102
- package/dist/domain/posting.d.ts.map +1 -1
- package/dist/domain/posting.js +3 -55
- package/dist/domain/posting.js.map +1 -1
- package/dist/domain/qualityCheckFault.d.ts +1 -41
- package/dist/domain/qualityCheckFault.d.ts.map +1 -1
- package/dist/domain/qualityCheckFault.js +0 -24
- package/dist/domain/qualityCheckFault.js.map +1 -1
- package/dist/domain/qualityCheckFaultMessages.d.ts +0 -35
- package/dist/domain/qualityCheckFaultMessages.d.ts.map +1 -1
- package/dist/domain/qualityCheckFaultMessages.js +0 -28
- package/dist/domain/qualityCheckFaultMessages.js.map +1 -1
- package/dist/domain/qualityCheckReconciliation.d.ts +5 -278
- package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
- package/dist/domain/qualityCheckReconciliation.js +53 -453
- package/dist/domain/qualityCheckReconciliation.js.map +1 -1
- package/dist/domain/qualityCheckReconciliationFault.d.ts +0 -19
- package/dist/domain/qualityCheckReconciliationFault.d.ts.map +1 -1
- package/dist/domain/qualityCheckReconciliationFault.js +0 -23
- package/dist/domain/qualityCheckReconciliationFault.js.map +1 -1
- package/dist/domain/scenarioCodeError.d.ts +16 -0
- package/dist/domain/scenarioCodeError.d.ts.map +1 -0
- package/dist/domain/scenarioCodeError.js +4 -0
- package/dist/domain/scenarioCodeError.js.map +1 -0
- package/dist/domain/scenarioReconciliation.d.ts +0 -205
- package/dist/domain/scenarioReconciliation.d.ts.map +1 -1
- package/dist/domain/scenarioReconciliation.js +1 -98
- package/dist/domain/scenarioReconciliation.js.map +1 -1
- package/dist/domain/scnAllocation.d.ts +27 -0
- package/dist/domain/scnAllocation.d.ts.map +1 -0
- package/dist/domain/scnAllocation.js +33 -0
- package/dist/domain/scnAllocation.js.map +1 -0
- package/dist/domain/verdictCode.d.ts +10 -0
- package/dist/domain/verdictCode.d.ts.map +1 -0
- package/dist/domain/verdictCode.js +16 -0
- package/dist/domain/verdictCode.js.map +1 -0
- package/dist/index.d.ts +12 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -86
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +3 -25
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +3 -93
- package/dist/internal.js.map +1 -1
- package/dist/lib/bareTerm.d.ts +0 -39
- package/dist/lib/bareTerm.d.ts.map +1 -1
- package/dist/lib/bareTerm.js +0 -39
- package/dist/lib/bareTerm.js.map +1 -1
- package/dist/lib/portablePath.d.ts.map +1 -1
- package/dist/lib/portablePath.js +0 -14
- package/dist/lib/portablePath.js.map +1 -1
- package/dist/lib/scnCitation.d.ts +0 -32
- package/dist/lib/scnCitation.d.ts.map +1 -1
- package/dist/lib/scnCitation.js +2 -42
- package/dist/lib/scnCitation.js.map +1 -1
- package/dist/model.d.ts +0 -23
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -23
- package/dist/model.js.map +1 -1
- package/dist/parse/checkScriptsRunInCI.d.ts +3 -151
- package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
- package/dist/parse/checkScriptsRunInCI.js +5 -143
- package/dist/parse/checkScriptsRunInCI.js.map +1 -1
- package/dist/parse/ciStepRecord.d.ts +2 -117
- package/dist/parse/ciStepRecord.d.ts.map +1 -1
- package/dist/parse/ciStepRecord.js +12 -218
- package/dist/parse/ciStepRecord.js.map +1 -1
- package/dist/parse/commandRuns.d.ts +0 -39
- package/dist/parse/commandRuns.d.ts.map +1 -1
- package/dist/parse/commandRuns.js +0 -58
- package/dist/parse/commandRuns.js.map +1 -1
- package/dist/parse/cucumber.d.ts +0 -52
- package/dist/parse/cucumber.d.ts.map +1 -1
- package/dist/parse/cucumber.js +37 -143
- package/dist/parse/cucumber.js.map +1 -1
- package/dist/parse/discoveryScope.d.ts +0 -45
- package/dist/parse/discoveryScope.d.ts.map +1 -1
- package/dist/parse/discoveryScope.js +0 -55
- package/dist/parse/discoveryScope.js.map +1 -1
- package/dist/parse/fitnessCitations.d.ts +1 -72
- package/dist/parse/fitnessCitations.d.ts.map +1 -1
- package/dist/parse/fitnessCitations.js +3 -55
- package/dist/parse/fitnessCitations.js.map +1 -1
- package/dist/parse/reconcilerSteps.d.ts +0 -46
- package/dist/parse/reconcilerSteps.d.ts.map +1 -1
- package/dist/parse/reconcilerSteps.js +0 -63
- package/dist/parse/reconcilerSteps.js.map +1 -1
- package/dist/parse/runningStaticChecks.d.ts +2 -118
- package/dist/parse/runningStaticChecks.d.ts.map +1 -1
- package/dist/parse/runningStaticChecks.js +14 -273
- package/dist/parse/runningStaticChecks.js.map +1 -1
- package/dist/parse/scenarioCodeErrors.d.ts +12 -0
- package/dist/parse/scenarioCodeErrors.d.ts.map +1 -0
- package/dist/parse/scenarioCodeErrors.js +88 -0
- package/dist/parse/scenarioCodeErrors.js.map +1 -0
- package/dist/parse/scenarios.d.ts +3 -228
- package/dist/parse/scenarios.d.ts.map +1 -1
- package/dist/parse/scenarios.js +11 -447
- package/dist/parse/scenarios.js.map +1 -1
- package/dist/parse/stepAccounting.d.ts +0 -46
- package/dist/parse/stepAccounting.d.ts.map +1 -1
- package/dist/parse/stepAccounting.js +0 -54
- package/dist/parse/stepAccounting.js.map +1 -1
- package/dist/parse/stepExclusions.d.ts +0 -47
- package/dist/parse/stepExclusions.d.ts.map +1 -1
- package/dist/parse/stepExclusions.js +0 -45
- package/dist/parse/stepExclusions.js.map +1 -1
- package/dist/parse/stepNames.d.ts +0 -27
- package/dist/parse/stepNames.d.ts.map +1 -1
- package/dist/parse/stepNames.js +0 -27
- package/dist/parse/stepNames.js.map +1 -1
- package/dist/parse/targetCorpus.d.ts +1 -78
- package/dist/parse/targetCorpus.d.ts.map +1 -1
- package/dist/parse/targetCorpus.js +4 -46
- package/dist/parse/targetCorpus.js.map +1 -1
- package/dist/parse/targetManifest.d.ts +8 -146
- package/dist/parse/targetManifest.d.ts.map +1 -1
- package/dist/parse/targetManifest.js +47 -198
- package/dist/parse/targetManifest.js.map +1 -1
- package/dist/parse/vitest.d.ts +0 -60
- package/dist/parse/vitest.d.ts.map +1 -1
- package/dist/parse/vitest.js +1 -81
- package/dist/parse/vitest.js.map +1 -1
- package/dist/provenance/provenance.d.ts +2 -110
- package/dist/provenance/provenance.d.ts.map +1 -1
- package/dist/provenance/provenance.js +2 -58
- package/dist/provenance/provenance.js.map +1 -1
- package/dist/render/behaviouralRunners.d.ts +0 -29
- package/dist/render/behaviouralRunners.d.ts.map +1 -1
- package/dist/render/behaviouralRunners.js +0 -64
- package/dist/render/behaviouralRunners.js.map +1 -1
- package/dist/render/configurationNotRead.d.ts +3 -0
- package/dist/render/configurationNotRead.d.ts.map +1 -0
- package/dist/render/configurationNotRead.js +17 -0
- package/dist/render/configurationNotRead.js.map +1 -0
- package/dist/render/discoveryScope.d.ts +0 -37
- package/dist/render/discoveryScope.d.ts.map +1 -1
- package/dist/render/discoveryScope.js +0 -37
- package/dist/render/discoveryScope.js.map +1 -1
- package/dist/render/evidenceGrid.d.ts +1 -35
- package/dist/render/evidenceGrid.d.ts.map +1 -1
- package/dist/render/evidenceGrid.js +18 -100
- package/dist/render/evidenceGrid.js.map +1 -1
- package/dist/render/excludedSteps.d.ts +0 -26
- package/dist/render/excludedSteps.d.ts.map +1 -1
- package/dist/render/excludedSteps.js +0 -29
- package/dist/render/excludedSteps.js.map +1 -1
- package/dist/render/json.d.ts +0 -11
- package/dist/render/json.d.ts.map +1 -1
- package/dist/render/json.js +0 -11
- package/dist/render/json.js.map +1 -1
- package/dist/render/markdown.d.ts +0 -54
- package/dist/render/markdown.d.ts.map +1 -1
- package/dist/render/markdown.js +88 -426
- package/dist/render/markdown.js.map +1 -1
- package/dist/render/provenanceSection.d.ts +0 -22
- package/dist/render/provenanceSection.d.ts.map +1 -1
- package/dist/render/provenanceSection.js +0 -44
- package/dist/render/provenanceSection.js.map +1 -1
- package/dist/render/reconcilerSteps.d.ts +0 -25
- package/dist/render/reconcilerSteps.d.ts.map +1 -1
- package/dist/render/reconcilerSteps.js +0 -26
- package/dist/render/reconcilerSteps.js.map +1 -1
- package/dist/render/runVerdict.d.ts +0 -38
- package/dist/render/runVerdict.d.ts.map +1 -1
- package/dist/render/runVerdict.js +68 -127
- package/dist/render/runVerdict.js.map +1 -1
- package/dist/render/scenarioCodeErrorsSection.d.ts +3 -0
- package/dist/render/scenarioCodeErrorsSection.d.ts.map +1 -0
- package/dist/render/scenarioCodeErrorsSection.js +42 -0
- package/dist/render/scenarioCodeErrorsSection.js.map +1 -0
- package/dist/render/staticChecks.d.ts +0 -20
- package/dist/render/staticChecks.d.ts.map +1 -1
- package/dist/render/staticChecks.js +1 -59
- package/dist/render/staticChecks.js.map +1 -1
- package/dist/render/stepAccounting.d.ts +0 -36
- package/dist/render/stepAccounting.d.ts.map +1 -1
- package/dist/render/stepAccounting.js +0 -44
- package/dist/render/stepAccounting.js.map +1 -1
- package/dist/render/testVolume.d.ts +0 -25
- package/dist/render/testVolume.d.ts.map +1 -1
- package/dist/render/testVolume.js +0 -32
- package/dist/render/testVolume.js.map +1 -1
- package/package.json +4 -1
- package/dist/domain/checkCharacteristics.d.ts +0 -88
- package/dist/domain/checkCharacteristics.d.ts.map +0 -1
- package/dist/domain/checkCharacteristics.js +0 -109
- package/dist/domain/checkCharacteristics.js.map +0 -1
- package/dist/domain/fitnessChecks.d.ts +0 -79
- package/dist/domain/fitnessChecks.d.ts.map +0 -1
- package/dist/domain/fitnessChecks.js +0 -81
- package/dist/domain/fitnessChecks.js.map +0 -1
- package/dist/lib/featureCode.d.ts +0 -21
- package/dist/lib/featureCode.d.ts.map +0 -1
- package/dist/lib/featureCode.js +0 -24
- package/dist/lib/featureCode.js.map +0 -1
- package/dist/parse/corpusCodeFaults.d.ts +0 -76
- package/dist/parse/corpusCodeFaults.d.ts.map +0 -1
- package/dist/parse/corpusCodeFaults.js +0 -121
- package/dist/parse/corpusCodeFaults.js.map +0 -1
- package/dist/parse/corpusFaults.d.ts +0 -124
- package/dist/parse/corpusFaults.d.ts.map +0 -1
- package/dist/parse/corpusFaults.js +0 -72
- package/dist/parse/corpusFaults.js.map +0 -1
- package/dist/parse/corpusGrammarFaults.d.ts +0 -71
- package/dist/parse/corpusGrammarFaults.d.ts.map +0 -1
- package/dist/parse/corpusGrammarFaults.js +0 -292
- package/dist/parse/corpusGrammarFaults.js.map +0 -1
package/dist/domain/posting.js
CHANGED
|
@@ -1,68 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
* POSTING — the rule for WHERE an entry lands. Canon gives Posting its own glossary group
|
|
3
|
-
* (`strategy/double-entry-manifesto.md`, "### Posting") beside Journal, Ledger and Reconciling,
|
|
4
|
-
* and this module is that group's home (module, not class), co-locating the destination type with
|
|
5
|
-
* the pure rule that decides it.
|
|
6
|
-
*
|
|
7
|
-
* It sits BETWEEN the journal and the Ledger, which is why it is neither's: `domain/ledger` folds
|
|
8
|
-
* over an ASSEMBLED Ledger, and the posting rule runs BEFORE a Ledger exists; `domain/journal`
|
|
9
|
-
* owns the entry types and what a scenario NAMES. Posting reads both sides and yields the row an
|
|
10
|
-
* entry lands on. (3F-2202 — extracted from the `reconcile` fold, which decided this inline.)
|
|
11
|
-
*
|
|
12
|
-
* ONE CLAUSE, OVER BOTH AXES (3F-2590). THE CREDIT CITES. A test carries `@SCN-XXX`; a fitness
|
|
13
|
-
* check's run carries the `@SCN` of the fitness scenario that raises its obligation. So
|
|
14
|
-
* one credit names one scenario and posts to EXACTLY ONE row, and a credit posting to no real
|
|
15
|
-
* scenario is PHANTOM (its `@SCN` matches no scenario) or SUSPENSE (it cites nothing).
|
|
16
|
-
*
|
|
17
|
-
* THE BY-NAME ROUTE IS GONE, and with it the exception it forced. `lint` used to be the axis where
|
|
18
|
-
* the DEBIT cited: a scenario carried `@lint=<static-check>`, the run cited nothing, and it was
|
|
19
|
-
* matched BY NAME to EVERY row whose obligation named it. That is why the invariant had to be
|
|
20
|
-
* written "every evidence observation posts to AT LEAST ONE account, never to none" — not *exactly*
|
|
21
|
-
* one, which was the runtime property over-generalised. With both axes citing, EXACTLY ONE is true
|
|
22
|
-
* universally, and it is the stronger claim: "at least one" is silent about a double-post, and a
|
|
23
|
-
* double-post is a second copy of the same fact. `Posting` is total over the `EvidenceObservation`
|
|
24
|
-
* union by construction: every variant yields a destination.
|
|
25
|
-
*
|
|
26
|
-
* POSTING IS NOT CLASSIFYING. This rule decides WHERE an entry lands, never what it reconciles TO.
|
|
27
|
-
* A credit posts to its row whatever outcome it later earns — or none at all. The outcome rules
|
|
28
|
-
* are the sibling concepts' (`qualityCheckReconciliation`, `scenarioReconciliation`).
|
|
29
|
-
*/
|
|
30
|
-
// The union's OWN predicate over the `lint` quality-check — asked rather than a hand-written shape
|
|
31
|
-
// test, so this rule classes an observation exactly as the reconciler does.
|
|
32
|
-
// A value import, hence its own statement beside the type-only one above.
|
|
33
|
-
import { isStaticCheckObservation } from "./journal.js";
|
|
1
|
+
import { isFitnessObservation } from "./journal.js";
|
|
34
2
|
export function postingOf(observation, scenarioIds) {
|
|
35
|
-
if (observation.qualityCheck === "
|
|
36
|
-
|
|
37
|
-
// down and carries its reason unchanged: broken is taken on the FLAG, before `scnId` is ever
|
|
38
|
-
// consulted, so a proof that never ran can never be citation-routed — not to a real row, not
|
|
39
|
-
// to a phantom one — and so can neither discharge nor fail the obligation it cites. The
|
|
40
|
-
// observation MAY carry an `scnId` and a `checkTag`, and does; both are ignored here.
|
|
41
|
-
//
|
|
42
|
-
// Asked through the union's own predicate, so this rule and the reconciler class a static-check
|
|
43
|
-
// observation the same way.
|
|
44
|
-
if (isStaticCheckObservation(observation) && observation.broken === true) {
|
|
3
|
+
if (observation.qualityCheck === "fitness") {
|
|
4
|
+
if (isFitnessObservation(observation) && observation.broken === true) {
|
|
45
5
|
return { kind: "suspense-scenario", posted: "broken" };
|
|
46
6
|
}
|
|
47
|
-
// THE CITATION ROUTE (@SCN-LNT-001) — the run carries the `@SCN` of the fitness scenario that
|
|
48
|
-
// raises its obligation, so it posts by citation like every other credit: exactly one row,
|
|
49
|
-
// real or invented. This is deliberately the SAME rule the runtime arm applies below, not a
|
|
50
|
-
// static-axis variant of it — a whole-system characteristic belongs to the one scenario that
|
|
51
|
-
// holds it, and the moment the static axis is allowed its own posting rule is the moment the
|
|
52
|
-
// smear can be reintroduced under a different name.
|
|
53
7
|
if (observation.scnId !== undefined) {
|
|
54
8
|
return scenarioIds.has(observation.scnId)
|
|
55
9
|
? { kind: "scenario", scnId: observation.scnId }
|
|
56
10
|
: { kind: "phantom-scenario", scnId: observation.scnId };
|
|
57
11
|
}
|
|
58
|
-
// The seam reached no `@SCN` — the handle is unregistered, or no fitness scenario carries its
|
|
59
|
-
// check — so the run cites nothing and posts to SUSPENSE, the static analogue of an uncited
|
|
60
|
-
// runtime credit. There is no by-name fallback to try: a check nobody named is meant to
|
|
61
|
-
// surface, and matching it to rows by handle is exactly the smear this route replaced.
|
|
62
12
|
return { kind: "suspense-scenario", posted: "no-evidence-obligation-static-check" };
|
|
63
13
|
}
|
|
64
|
-
// THE RUNTIME AXIS — the CREDIT cites, so exactly one row, resolved from the `@SCN` it carries.
|
|
65
|
-
// The fail-safe first: broken is taken on the FLAG, before scnId is ever consulted.
|
|
66
14
|
if (observation.broken === true)
|
|
67
15
|
return { kind: "suspense-scenario", posted: "broken" };
|
|
68
16
|
if (observation.scnId === null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posting.js","sourceRoot":"","sources":["../../src/domain/posting.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"posting.js","sourceRoot":"","sources":["../../src/domain/posting.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AA6BpD,MAAM,UAAU,SAAS,CACvB,WAAgC,EAChC,WAAgC;IAEhC,IAAI,WAAW,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC3C,IAAI,oBAAoB,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACrE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACzD,CAAC;QACD,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;gBACvC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE;gBAChD,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACxF,IAAI,WAAW,CAAC,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC9F,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -1,59 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
* The QUALITY CHECK FAULT vocabulary (@SCN-MSG-001, 3F-2872) — what a refused minting carries
|
|
3
|
-
* INSTEAD of a sentence.
|
|
4
|
-
*
|
|
5
|
-
* Stryker mutates every string literal in the domain, so an invariant that states its refusal as
|
|
6
|
-
* an interpolated template puts its prose on the mutated surface: emptying a template chunk
|
|
7
|
-
* survives every test that does not pin wording, and pinning wording turns a copy-edit red. The
|
|
8
|
-
* cure is to move the question rather than answer it — the throw site names a CODE and carries its
|
|
9
|
-
* parameters as fields, and the prose that renders them lives in a catalogue held as data.
|
|
10
|
-
*
|
|
11
|
-
* THE CODE IS A NUMERIC, IMPLICITLY-VALUED ENUM, AND THAT IS THE WHOLE POINT. A string enum would
|
|
12
|
-
* relocate the mutable prose onto the enum's own values — the survivors would move house rather
|
|
13
|
-
* than leave it. Implicit numbering means there is no literal here for a mutator to reach, so what
|
|
14
|
-
* remains on the mutated surface is exactly the logic worth mutating: WHICH fault is raised, and
|
|
15
|
-
* with WHAT parameters.
|
|
16
|
-
*/
|
|
17
|
-
import type { Outcome, SidePresence } from "./qualityCheckReconciliation.js";
|
|
18
|
-
/**
|
|
19
|
-
* One member per throw site in `makeQualityCheckReconciliation`.
|
|
20
|
-
*
|
|
21
|
-
* Numeric and implicitly valued deliberately (see the module note). The members are named for the
|
|
22
|
-
* divergence they report, so a reader meets the meaning at the identifier rather than in a table.
|
|
23
|
-
*/
|
|
1
|
+
import type { Outcome, SidePresence } from "./outcome.js";
|
|
24
2
|
export declare enum QualityCheckFaultCode {
|
|
25
|
-
/** The carried evidence obligation (debit) side disagrees with the outcome's canon row. */
|
|
26
3
|
ObligationSideDivergesFromCanon = 0,
|
|
27
|
-
/** The carried evidence observation (credit) side disagrees with the outcome's canon row. */
|
|
28
4
|
ObservationSideDivergesFromCanon = 1
|
|
29
5
|
}
|
|
30
|
-
/**
|
|
31
|
-
* What BOTH divergences carry: the outcome whose canon row was consulted, the side-presence that
|
|
32
|
-
* row REQUIRED, and the side-presence the fields ACTUALLY carried.
|
|
33
|
-
*
|
|
34
|
-
* `required` and `actual` are the two halves of the comparison that failed, so a reader — and an
|
|
35
|
-
* assertion — recovers the whole disagreement from the fault without reading a sentence.
|
|
36
|
-
*/
|
|
37
6
|
interface SideDivergence {
|
|
38
7
|
readonly outcome: Outcome;
|
|
39
8
|
readonly required: SidePresence;
|
|
40
9
|
readonly actual: SidePresence;
|
|
41
10
|
}
|
|
42
|
-
/** The debit side diverged: the obligation is carried where canon says None, or absent where it says Exists. */
|
|
43
11
|
export interface ObligationSideDivergesFromCanonFault extends SideDivergence {
|
|
44
12
|
readonly code: QualityCheckFaultCode.ObligationSideDivergesFromCanon;
|
|
45
13
|
}
|
|
46
|
-
/** The credit side diverged: the observation is carried where canon says None, or absent where it says Exists. */
|
|
47
14
|
export interface ObservationSideDivergesFromCanonFault extends SideDivergence {
|
|
48
15
|
readonly code: QualityCheckFaultCode.ObservationSideDivergesFromCanon;
|
|
49
16
|
}
|
|
50
|
-
/**
|
|
51
|
-
* The discriminated union over every fault this concept can raise.
|
|
52
|
-
*
|
|
53
|
-
* Discriminated on `code` so the catalogue can be a mapped type over it (3F-2873): the compiler
|
|
54
|
-
* then refuses both a code with no message and a message reaching for a parameter its fault does
|
|
55
|
-
* not carry. Completeness is not asserted; it is unconstructible otherwise.
|
|
56
|
-
*/
|
|
57
17
|
export type QualityCheckFault = ObligationSideDivergesFromCanonFault | ObservationSideDivergesFromCanonFault;
|
|
58
18
|
export {};
|
|
59
19
|
//# sourceMappingURL=qualityCheckFault.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qualityCheckFault.d.ts","sourceRoot":"","sources":["../../src/domain/qualityCheckFault.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"qualityCheckFault.d.ts","sourceRoot":"","sources":["../../src/domain/qualityCheckFault.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,oBAAY,qBAAqB;IAC/B,+BAA+B,IAAA;IAC/B,gCAAgC,IAAA;CACjC;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAED,MAAM,WAAW,oCAAqC,SAAQ,cAAc;IAC1E,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC,+BAA+B,CAAC;CACtE;AAED,MAAM,WAAW,qCAAsC,SAAQ,cAAc;IAC3E,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC,gCAAgC,CAAC;CACvE;AAED,MAAM,MAAM,iBAAiB,GACzB,oCAAoC,GACpC,qCAAqC,CAAC"}
|
|
@@ -1,30 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The QUALITY CHECK FAULT vocabulary (@SCN-MSG-001, 3F-2872) — what a refused minting carries
|
|
3
|
-
* INSTEAD of a sentence.
|
|
4
|
-
*
|
|
5
|
-
* Stryker mutates every string literal in the domain, so an invariant that states its refusal as
|
|
6
|
-
* an interpolated template puts its prose on the mutated surface: emptying a template chunk
|
|
7
|
-
* survives every test that does not pin wording, and pinning wording turns a copy-edit red. The
|
|
8
|
-
* cure is to move the question rather than answer it — the throw site names a CODE and carries its
|
|
9
|
-
* parameters as fields, and the prose that renders them lives in a catalogue held as data.
|
|
10
|
-
*
|
|
11
|
-
* THE CODE IS A NUMERIC, IMPLICITLY-VALUED ENUM, AND THAT IS THE WHOLE POINT. A string enum would
|
|
12
|
-
* relocate the mutable prose onto the enum's own values — the survivors would move house rather
|
|
13
|
-
* than leave it. Implicit numbering means there is no literal here for a mutator to reach, so what
|
|
14
|
-
* remains on the mutated surface is exactly the logic worth mutating: WHICH fault is raised, and
|
|
15
|
-
* with WHAT parameters.
|
|
16
|
-
*/
|
|
17
|
-
/**
|
|
18
|
-
* One member per throw site in `makeQualityCheckReconciliation`.
|
|
19
|
-
*
|
|
20
|
-
* Numeric and implicitly valued deliberately (see the module note). The members are named for the
|
|
21
|
-
* divergence they report, so a reader meets the meaning at the identifier rather than in a table.
|
|
22
|
-
*/
|
|
23
1
|
export var QualityCheckFaultCode;
|
|
24
2
|
(function (QualityCheckFaultCode) {
|
|
25
|
-
/** The carried evidence obligation (debit) side disagrees with the outcome's canon row. */
|
|
26
3
|
QualityCheckFaultCode[QualityCheckFaultCode["ObligationSideDivergesFromCanon"] = 0] = "ObligationSideDivergesFromCanon";
|
|
27
|
-
/** The carried evidence observation (credit) side disagrees with the outcome's canon row. */
|
|
28
4
|
QualityCheckFaultCode[QualityCheckFaultCode["ObservationSideDivergesFromCanon"] = 1] = "ObservationSideDivergesFromCanon";
|
|
29
5
|
})(QualityCheckFaultCode || (QualityCheckFaultCode = {}));
|
|
30
6
|
//# sourceMappingURL=qualityCheckFault.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qualityCheckFault.js","sourceRoot":"","sources":["../../src/domain/qualityCheckFault.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"qualityCheckFault.js","sourceRoot":"","sources":["../../src/domain/qualityCheckFault.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,qBAGX;AAHD,WAAY,qBAAqB;IAC/B,uHAA+B,CAAA;IAC/B,yHAAgC,CAAA;AAClC,CAAC,EAHW,qBAAqB,KAArB,qBAAqB,QAGhC"}
|
|
@@ -1,43 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE MESSAGE CATALOGUE (@SCN-MSG-001, 3F-2872) — the human-facing prose for every
|
|
3
|
-
* `QualityCheckFaultCode`, and NOTHING ELSE.
|
|
4
|
-
*
|
|
5
|
-
* PURE DATA, DELIBERATELY. This module holds one table and no behaviour at all: the indexing
|
|
6
|
-
* that turns a fault into its sentence lives in `qualityCheckFault.ts`, on the mutated surface,
|
|
7
|
-
* where it belongs. The split is what makes the mutate exclusion honest — "do not mutate this
|
|
8
|
-
* file" is defensible over a table of sentences and indefensible over anything that decides
|
|
9
|
-
* something. A render helper parked here would leave the deciding logic unmutated too, and the
|
|
10
|
-
* exclusion would then hide more than the prose it was granted for. NOTHING NOW ASSERTS THAT IT
|
|
11
|
-
* DOES NOT: a check read the real stryker config back and redded on an exclusion that had widened,
|
|
12
|
-
* until 3F-3490 retired it as a claim about our own configuration rather than about the product.
|
|
13
|
-
* @SCN-MSG-002 keeps the half that IS about the product — every code renders a non-blank message
|
|
14
|
-
* carrying its own fault's parameters, proved in `qualityCheckFaultMessages.test.ts` beside this
|
|
15
|
-
* file — and the widened-exclusion residual is stated in `features/message-catalogue.feature`'s
|
|
16
|
-
* preamble, where the next reader of the exclusion meets it.
|
|
17
|
-
*
|
|
18
|
-
* TOTALITY IS NOT ASSERTED, IT IS UNCONSTRUCTIBLE. `QualityCheckFaultMessages` is a mapped type
|
|
19
|
-
* over the code union, so the compiler refuses both a code with no message AND a message reaching
|
|
20
|
-
* for a parameter its own fault does not carry. That is the same type-forced totality
|
|
21
|
-
* `OUTCOME_SIDE_PROFILE` and `OUTCOME_DESCRIPTION` already rely on: a new code cannot join the
|
|
22
|
-
* union without stating its sentence here.
|
|
23
|
-
*/
|
|
24
1
|
import { QualityCheckFaultCode, type QualityCheckFault } from "./qualityCheckFault.js";
|
|
25
|
-
/**
|
|
26
|
-
* One renderer per code, each seeing EXACTLY its own fault member.
|
|
27
|
-
*
|
|
28
|
-
* `Extract<…, { code: C }>` narrows per key, so a renderer for the obligation-side code cannot
|
|
29
|
-
* reach a field only the observation-side fault carries — the compiler, not a reviewer, is what
|
|
30
|
-
* keeps each sentence honest about the parameters available to it.
|
|
31
|
-
*/
|
|
32
2
|
export type QualityCheckFaultMessages = {
|
|
33
3
|
readonly [C in QualityCheckFaultCode]: (fault: Extract<QualityCheckFault, {
|
|
34
4
|
code: C;
|
|
35
5
|
}>) => string;
|
|
36
6
|
};
|
|
37
|
-
/**
|
|
38
|
-
* The catalogue. Prose is the one thing in this tree that may be rewritten without a ticket, and
|
|
39
|
-
* this is where it may be rewritten: no test reads these sentences, and no mutant is raised over
|
|
40
|
-
* them once the exclusion lands.
|
|
41
|
-
*/
|
|
42
7
|
export declare const QUALITY_CHECK_FAULT_MESSAGES: QualityCheckFaultMessages;
|
|
43
8
|
//# sourceMappingURL=qualityCheckFaultMessages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qualityCheckFaultMessages.d.ts","sourceRoot":"","sources":["../../src/domain/qualityCheckFaultMessages.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"qualityCheckFaultMessages.d.ts","sourceRoot":"","sources":["../../src/domain/qualityCheckFaultMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEvF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,CAAC,IAAI,qBAAqB,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,KAAK,MAAM;CAClG,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,yBAS1C,CAAC"}
|
|
@@ -1,32 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE MESSAGE CATALOGUE (@SCN-MSG-001, 3F-2872) — the human-facing prose for every
|
|
3
|
-
* `QualityCheckFaultCode`, and NOTHING ELSE.
|
|
4
|
-
*
|
|
5
|
-
* PURE DATA, DELIBERATELY. This module holds one table and no behaviour at all: the indexing
|
|
6
|
-
* that turns a fault into its sentence lives in `qualityCheckFault.ts`, on the mutated surface,
|
|
7
|
-
* where it belongs. The split is what makes the mutate exclusion honest — "do not mutate this
|
|
8
|
-
* file" is defensible over a table of sentences and indefensible over anything that decides
|
|
9
|
-
* something. A render helper parked here would leave the deciding logic unmutated too, and the
|
|
10
|
-
* exclusion would then hide more than the prose it was granted for. NOTHING NOW ASSERTS THAT IT
|
|
11
|
-
* DOES NOT: a check read the real stryker config back and redded on an exclusion that had widened,
|
|
12
|
-
* until 3F-3490 retired it as a claim about our own configuration rather than about the product.
|
|
13
|
-
* @SCN-MSG-002 keeps the half that IS about the product — every code renders a non-blank message
|
|
14
|
-
* carrying its own fault's parameters, proved in `qualityCheckFaultMessages.test.ts` beside this
|
|
15
|
-
* file — and the widened-exclusion residual is stated in `features/message-catalogue.feature`'s
|
|
16
|
-
* preamble, where the next reader of the exclusion meets it.
|
|
17
|
-
*
|
|
18
|
-
* TOTALITY IS NOT ASSERTED, IT IS UNCONSTRUCTIBLE. `QualityCheckFaultMessages` is a mapped type
|
|
19
|
-
* over the code union, so the compiler refuses both a code with no message AND a message reaching
|
|
20
|
-
* for a parameter its own fault does not carry. That is the same type-forced totality
|
|
21
|
-
* `OUTCOME_SIDE_PROFILE` and `OUTCOME_DESCRIPTION` already rely on: a new code cannot join the
|
|
22
|
-
* union without stating its sentence here.
|
|
23
|
-
*/
|
|
24
1
|
import { QualityCheckFaultCode } from "./qualityCheckFault.js";
|
|
25
|
-
/**
|
|
26
|
-
* The catalogue. Prose is the one thing in this tree that may be rewritten without a ticket, and
|
|
27
|
-
* this is where it may be rewritten: no test reads these sentences, and no mutant is raised over
|
|
28
|
-
* them once the exclusion lands.
|
|
29
|
-
*/
|
|
30
2
|
export const QUALITY_CHECK_FAULT_MESSAGES = {
|
|
31
3
|
[QualityCheckFaultCode.ObligationSideDivergesFromCanon]: (fault) => `QualityCheckReconciliation invariant (@SCN-LDG-030): outcome "${fault.outcome}" requires the ` +
|
|
32
4
|
`evidence obligation (debit) side to be ${fault.required}, but it was ` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qualityCheckFaultMessages.js","sourceRoot":"","sources":["../../src/domain/qualityCheckFaultMessages.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"qualityCheckFaultMessages.js","sourceRoot":"","sources":["../../src/domain/qualityCheckFaultMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAA0B,MAAM,wBAAwB,CAAC;AAMvF,MAAM,CAAC,MAAM,4BAA4B,GAA8B;IACrE,CAAC,qBAAqB,CAAC,+BAA+B,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CACjE,iEAAiE,KAAK,CAAC,OAAO,iBAAiB;QAC/F,0CAA0C,KAAK,CAAC,QAAQ,eAAe;QACvE,GAAG,KAAK,CAAC,MAAM,GAAG;IACpB,CAAC,qBAAqB,CAAC,gCAAgC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAClE,iEAAiE,KAAK,CAAC,OAAO,iBAAiB;QAC/F,4CAA4C,KAAK,CAAC,QAAQ,eAAe;QACzE,GAAG,KAAK,CAAC,MAAM,GAAG;CACrB,CAAC"}
|
|
@@ -1,304 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* co-locates the concept's type with its OWN behaviour — the outcome vocabulary, the canon
|
|
5
|
-
* descriptions, and `reconcileEvidenceObligation`, the pure derivation that computes a single
|
|
6
|
-
* obligation's outcome from the observed evidence (module, not class; the rule lives WITH the
|
|
7
|
-
* concept, not in the reconcile orchestration that folds it).
|
|
8
|
-
*/
|
|
9
|
-
import type { QualityCheck, EvidenceObligation, EvidenceObservation, GuardEvidenceObservation, FitnessEvidenceObservation, RuntimeEvidenceObservation } from "./journal.js";
|
|
10
|
-
/**
|
|
11
|
-
* The reconciled OUTCOME of a single quality-check evidence obligation — one
|
|
12
|
-
* RECONCILING ITEM in the accounting frame (the per-evidenceObligation line explaining
|
|
13
|
-
* why obligation and observation disagree). The rationalisation: the
|
|
14
|
-
* per-evidenceObligation axis is the OUTCOME — `satisfied` (its `balanced` retired,
|
|
15
|
-
* `balanced` being the scenario VERDICT's word), and the watermelon reads plainly
|
|
16
|
-
* as `watermelon`.
|
|
17
|
-
*/
|
|
18
|
-
export type Outcome = "satisfied" | "failing" | "watermelon" | "missing" | "cites-unknown-scenario" | "cites-no-scenario" | "broken" | "no-evidence-obligation" | "no-scn-code" | "both-missing";
|
|
19
|
-
/**
|
|
20
|
-
* The canon description for each reconciling-item Outcome — the human-readable gloss a
|
|
21
|
-
* markdown reader needs (the bare handle means nothing in a CI log). SINGLE SOURCE: the
|
|
22
|
-
* markdown renderer renders this description in place of the handle EVERYWHERE an outcome
|
|
23
|
-
* surfaces to a reader — the Evidence-reconciliation summary's `↳` decomposition rows, the
|
|
24
|
-
* per-scenario reconciling-items list, and the lint-obligation table's Outcome column. The
|
|
25
|
-
* JSON keeps the bare handle (the machine axis; a programmatic consumer uses it).
|
|
26
|
-
*
|
|
27
|
-
* Keyed by EVERY `Outcome` (a `Record<Outcome, …>`), so a new outcome cannot be added to the
|
|
28
|
-
* union without a description here — the description can never silently diverge from the
|
|
29
|
-
* outcome it names (the drift class this project has been burned by: the census, the views).
|
|
30
|
-
* These phrasings ARE the original canon — later abbreviated to the handles; 3F-1626 restores
|
|
31
|
-
* them. `satisfied` (the balanced outcome, excluded from the out-of-balance decomposition)
|
|
32
|
-
* carries one for totality's sake.
|
|
33
|
-
*
|
|
34
|
-
* ⚠ KEY ORDER IS LOAD-BEARING (3F-1806). `OUT_OF_BALANCE_OUTCOMES` is DERIVED from these keys,
|
|
35
|
-
* and the renderer walks that list to emit the decomposition rows — so this map's key order IS
|
|
36
|
-
* the report's row order (`missing` first: the headline cause, the one carrying the bare-level
|
|
37
|
-
* split as Detail). Reordering these keys is a REPORT CHANGE, not a cosmetic tidy. The order
|
|
38
|
-
* follows canon, grouped by reconciling-item shape: a DEBIT block (missing, failing, watermelon,
|
|
39
|
-
* no-scn-code), a CREDIT block (cites-unknown-scenario, cites-no-scenario, no-evidence-obligation), then
|
|
40
|
-
* NEITHER (broken, both-missing). @SCN-RPT-019 now pins this SEQUENCE against the rendered `↳`
|
|
41
|
-
* rows (3F-1926), so a reorder reds — the exhaustiveness guard alone proved MEMBERSHIP, not
|
|
42
|
-
* order, and used not to catch one (which is how the order drifted before it was pinned).
|
|
43
|
-
*/
|
|
1
|
+
import type { QualityCheck, EvidenceObligation, EvidenceObservation, FitnessEvidenceObservation, RuntimeEvidenceObservation } from "./journal.js";
|
|
2
|
+
import type { Outcome, SidePresence } from "./outcome.js";
|
|
3
|
+
export type { Outcome, SidePresence } from "./outcome.js";
|
|
44
4
|
export declare const OUTCOME_DESCRIPTION: Record<Outcome, string>;
|
|
45
|
-
/**
|
|
46
|
-
* The out-of-balance reconciling-item outcomes, in report reading order — every `Outcome`
|
|
47
|
-
* except `satisfied` (the BALANCED outcome, not part of the OUT-of-balance decomposition).
|
|
48
|
-
* The renderer walks this to emit the summary's `↳` leaf rows (@SCN-RPT-019), each reconciling
|
|
49
|
-
* to the out-of-balance total exactly once (a FLAT list: the old debit/credit/neither grouping
|
|
50
|
-
* emitted a `↳ <group>-side` subtotal AND its leaves at the same indent, so a naive column-sum
|
|
51
|
-
* double-counted — the live 170 vs 85).
|
|
52
|
-
*
|
|
53
|
-
* DERIVED from the type-forced `OUTCOME_DESCRIPTION`, never hand-listed (3F-1806). It was a
|
|
54
|
-
* hand-maintained `readonly Outcome[]` in the renderer, which accepted a missing union member
|
|
55
|
-
* SILENTLY: `broken` (@SCN-LDG-017) joined the union, tallied into `byOutcome`, compiled clean,
|
|
56
|
-
* and would have been omitted from the table. Deriving the keys makes that omission IMPOSSIBLE
|
|
57
|
-
* rather than merely CAUGHT — a new `Outcome` cannot compile without a description, and the
|
|
58
|
-
* moment it has one it renders a leaf row with no change to the renderer.
|
|
59
|
-
*
|
|
60
|
-
* Lives in the model, not the renderer: which outcomes are out-of-balance is the model's rule,
|
|
61
|
-
* not a presentation choice (`entity-owns-its-behaviour`). The @SCN-RPT-019 guard remains as the
|
|
62
|
-
* end-to-end backstop — it renders real markdown and reads the rows back, deriving its
|
|
63
|
-
* expectation from its OWN type-forced record (`double-entry`, not a re-read of this source).
|
|
64
|
-
*/
|
|
65
5
|
export declare const OUT_OF_BALANCE_OUTCOMES: readonly Outcome[];
|
|
66
|
-
/**
|
|
67
|
-
* THE NOMINAL BRAND (@SCN-LDG-030, 3F-2016) — a module-private `unique symbol` phantom field.
|
|
68
|
-
* `QualityCheckReconciliation` is `QualityCheckReconciliationFields` PLUS a required field of this
|
|
69
|
-
* symbol's type, so no object literal typechecks as a `QualityCheckReconciliation` OUTSIDE this
|
|
70
|
-
* module — only `makeQualityCheckReconciliation` (which casts) can mint one. The brand symbol has
|
|
71
|
-
* no runtime presence; the field is a Symbol key, so `JSON.stringify` skips it (never
|
|
72
|
-
* serialised) and `.toEqual` sees no runtime key (value-literal comparisons stay green). The brand
|
|
73
|
-
* restricts CONSTRUCTION only — consumers only READ QCRs, so no read site changes.
|
|
74
|
-
*/
|
|
75
6
|
declare const qualityCheckReconciliationBrand: unique symbol;
|
|
76
|
-
/**
|
|
77
|
-
* A single evidenceObligation's reconciliation outcome — a reconciling item. A SINGLE
|
|
78
|
-
* flat shape mirroring EvidenceObligation: keyed on `qualityCheck`, with
|
|
79
|
-
* `staticCheck` present IFF `qualityCheck === 'lint'` (the static-check reconciling item).
|
|
80
|
-
*
|
|
81
|
-
* The un-branded FIELDS (module-internal). The exported `QualityCheckReconciliation` type is this
|
|
82
|
-
* intersected with the nominal brand; `makeQualityCheckReconciliation` takes these fields and mints
|
|
83
|
-
* the branded value.
|
|
84
|
-
*/
|
|
85
7
|
interface QualityCheckReconciliationFields {
|
|
86
|
-
/**
|
|
87
|
-
* The flat quality-check this reconciling item is about. ABSENT only for the degenerate
|
|
88
|
-
* `both-missing` item — the neither-side shape, blank on both sides: it names no
|
|
89
|
-
* quality-check because it is neither a debit evidence obligation nor a credit evidence observation. Present on
|
|
90
|
-
* every other outcome (debit and credit alike).
|
|
91
|
-
*/
|
|
92
8
|
qualityCheck?: QualityCheck;
|
|
93
|
-
/** The `staticCheck` handle — present IFF `qualityCheck === 'lint'`. */
|
|
94
9
|
staticCheck?: string;
|
|
95
10
|
outcome: Outcome;
|
|
96
|
-
/**
|
|
97
|
-
* The DEBIT side of the two-sided reconciling item (@SCN-LDG-026): the evidence obligation
|
|
98
|
-
* this item reconciles, carried on the reconciliation itself rather than joined from a
|
|
99
|
-
* separate scenario-level array at print time. Present IFF the obligation Exists — every
|
|
100
|
-
* debit-bearing outcome (`satisfied` / `missing` / `failing` / `watermelon`), AND `no-scn-code`,
|
|
101
|
-
* which carries a SYNTHESIZED scenario-scope obligation (an empty `{}`, no `qualityCheck` /
|
|
102
|
-
* `staticCheck`): canon (`double-entry-manifesto.md` line 39) marks `no-scn-code` Obligation
|
|
103
|
-
* Exists, Observation None — the debit twin of `cites-no-scenario` (@SCN-LDG-029). ABSENT on the
|
|
104
|
-
* credit-only outcomes (`cites-unknown-scenario` / `cites-no-scenario` / `no-evidence-obligation`) and the
|
|
105
|
-
* neither-side outcomes (`broken` / `both-missing`), where no obligation is in scope.
|
|
106
|
-
* `JSON.stringify` omits it when undefined, so a byte-identical golden is preserved everywhere the
|
|
107
|
-
* obligation is absent.
|
|
108
|
-
*/
|
|
109
11
|
evidenceObligation?: EvidenceObligation;
|
|
110
|
-
/**
|
|
111
|
-
* The CREDIT side of the two-sided reconciling item (@SCN-LDG-027): the evidence observation
|
|
112
|
-
* this item reconciles, carried on the reconciliation itself rather than joined from a
|
|
113
|
-
* separate scenario-level array at print time. Present IFF the observation Exists — every
|
|
114
|
-
* observation-bearing outcome: the two-sided debit outcomes (`satisfied` / `failing` /
|
|
115
|
-
* `watermelon`) whose match `reconcileEvidenceObligation` found, AND the credit-only outcomes
|
|
116
|
-
* (`cites-unknown-scenario` / `cites-no-scenario` / `no-evidence-obligation`) the fold produces from a
|
|
117
|
-
* citing observation. ABSENT on `missing` (obligation Exists, observation None) and the
|
|
118
|
-
* neither-side outcomes (`no-scn-code` / `broken` / `both-missing`), where no observation is in
|
|
119
|
-
* scope. For a lint `missing` the absent static check is FOUND as the negative fact
|
|
120
|
-
* `{exists:false}` — an ABSENCE, not an observation (@SCN-LDG-028) — so it is NOT carried here:
|
|
121
|
-
* only a REAL observation (`exists:true`) is the credit side. `JSON.stringify` omits it when
|
|
122
|
-
* undefined, so a byte-identical golden is preserved everywhere the observation is absent.
|
|
123
|
-
*/
|
|
124
12
|
evidenceObservation?: EvidenceObservation;
|
|
125
|
-
/**
|
|
126
|
-
* The where-to-fix for a CREDIT-side reconciling item (ruling Q5) — the
|
|
127
|
-
* evidence-observation locator (the test-file path the citing credit came from),
|
|
128
|
-
* carried so it survives the detail-arrays-into-rows move. Present only on a
|
|
129
|
-
* credit-side Quality Check Reconciliation (e.g. `cites-unknown-scenario` on a
|
|
130
|
-
* phantom scenario); a debit-side evidence obligation carries none.
|
|
131
|
-
*/
|
|
132
13
|
locator?: string;
|
|
133
|
-
/**
|
|
134
|
-
* The WHAT-BROKE payload of a `broken` credit-side reconciling item (@SCN-LDG-017) — the
|
|
135
|
-
* collection error the runner reported, carried alongside the `locator` (the file to fix).
|
|
136
|
-
* Present only on a `broken` item; every other outcome carries none.
|
|
137
|
-
*/
|
|
138
14
|
message?: string;
|
|
139
15
|
}
|
|
140
|
-
/**
|
|
141
|
-
* A single evidenceObligation's reconciliation outcome — the branded reconciling item. The fields
|
|
142
|
-
* intersected with the nominal brand (@SCN-LDG-030): mintable ONLY by
|
|
143
|
-
* `makeQualityCheckReconciliation`, so every QCR in the system has passed the (outcome,
|
|
144
|
-
* side-presence) consistency check. The barrel (`index.ts`) re-exports this TYPE via
|
|
145
|
-
* `model.ts`; the phantom field adds no exported SYMBOL, so the symbol NAMES on the public v1
|
|
146
|
-
* surface are unchanged — but constructibility is deliberately NARROWED: QCRs are engine-minted,
|
|
147
|
-
* and the type is exported for READING the reconciliation the engine produced, not for external
|
|
148
|
-
* CONSTRUCTION (the smart constructor is unexported). That narrowed contract is stated executably
|
|
149
|
-
* by the type-level guard in `index.test.ts` (@SCN-API-002, 3F-2040), not merely asserted here.
|
|
150
|
-
*/
|
|
151
16
|
export type QualityCheckReconciliation = QualityCheckReconciliationFields & {
|
|
152
17
|
readonly [qualityCheckReconciliationBrand]: typeof qualityCheckReconciliationBrand;
|
|
153
18
|
};
|
|
154
|
-
/**
|
|
155
|
-
* Whether a canon-correct reconciling item CARRIES a given side — the value both halves of the
|
|
156
|
-
* invariant are stated in: what the canon row required, and what the fields actually carried.
|
|
157
|
-
*
|
|
158
|
-
* Named rather than restated inline so the fault that reports a divergence (`qualityCheckFault.ts`)
|
|
159
|
-
* is typed in the reconciliation's own vocabulary instead of re-spelling the two literals a third
|
|
160
|
-
* and fourth time.
|
|
161
|
-
*/
|
|
162
|
-
export type SidePresence = "Exists" | "None";
|
|
163
|
-
/**
|
|
164
|
-
* THE CANON OUTCOME-SIDE PROFILE (@SCN-LDG-030, 3F-2016) — the (outcome → side-presence) table
|
|
165
|
-
* transcribed from canon (`double-entry-manifesto.md` lines 35-44), keyed by EVERY `Outcome` (a
|
|
166
|
-
* `Record<Outcome, …>`), so a new outcome cannot join the union without STATING its side
|
|
167
|
-
* profile here — the type-forced totality that makes this map the SINGLE SOURCE the invariant is
|
|
168
|
-
* checked against (mirroring `OUTCOME_DESCRIPTION`).
|
|
169
|
-
*
|
|
170
|
-
* `obligation`/`observation` are `"Exists" | "None"` — whether a canon-correct reconciling item
|
|
171
|
-
* of that outcome CARRIES the debit (evidence obligation) and the credit (evidence observation)
|
|
172
|
-
* side respectively. NOT a naive function of side-presence: `missing` and `no-scn-code` share
|
|
173
|
-
* (Exists, None); the three credit outcomes (`cites-unknown-scenario` / `cites-no-scenario` /
|
|
174
|
-
* `no-evidence-obligation`) share (None, Exists). So the invariant `makeQualityCheckReconciliation` enforces
|
|
175
|
-
* is (outcome, side-presence) CONSISTENCY against this row, never a derivation of outcome FROM the
|
|
176
|
-
* sides.
|
|
177
|
-
*/
|
|
178
19
|
export declare const OUTCOME_SIDE_PROFILE: Record<Outcome, {
|
|
179
20
|
obligation: SidePresence;
|
|
180
21
|
observation: SidePresence;
|
|
181
22
|
}>;
|
|
182
|
-
/**
|
|
183
|
-
* THE SMART CONSTRUCTOR (@SCN-LDG-030, 3F-2016) — the ONLY way to mint a
|
|
184
|
-
* `QualityCheckReconciliation`. It takes `outcome` as GIVEN (a consistency check, NOT a
|
|
185
|
-
* derivation — `missing`/`no-scn-code` share a profile, so the outcome cannot be recovered from
|
|
186
|
-
* side-presence alone), looks up the canon row in `OUTCOME_SIDE_PROFILE`, and THROWS if the
|
|
187
|
-
* carried sides disagree with it: a divergent (outcome, side-presence) pair — the watermelon class
|
|
188
|
-
* this tool exists to catch, in its own output — is UNCONSTRUCTIBLE.
|
|
189
|
-
*
|
|
190
|
-
* Returns `fields` UNCHANGED (cast to the branded type): the producer's own key order is preserved
|
|
191
|
-
* verbatim, so every unchanged row stays byte-identical (no object is reconstructed).
|
|
192
|
-
*/
|
|
193
23
|
export declare function makeQualityCheckReconciliation(fields: QualityCheckReconciliationFields): QualityCheckReconciliation;
|
|
194
|
-
/**
|
|
195
|
-
* Reconcile one evidence obligation against the observed evidence, keyed on the
|
|
196
|
-
* flat `qualityCheck`. `qualityCheck === "lint"` is the watermelon
|
|
197
|
-
* discriminator: it routes to the STATIC-check mapping;
|
|
198
|
-
* every other value routes to the RUNTIME-result mapping.
|
|
199
|
-
*/
|
|
200
24
|
export declare function reconcileEvidenceObligation(scnId: string, req: EvidenceObligation, evidenceObservations: EvidenceObservation[]): QualityCheckReconciliation;
|
|
201
|
-
/**
|
|
202
|
-
* The NO-EVIDENCE-OBLIGATION items on a real scenario's row (@SCN-LDG-008) — one per credit citing THIS
|
|
203
|
-
* scenario at a quality-check it never named. The credit posts to a real row against NO
|
|
204
|
-
* evidence obligation, so the item is CREDIT-ONLY (no obligation is in scope).
|
|
205
|
-
*
|
|
206
|
-
* The pair-check is what distinguishes no-evidence-obligation from a matched credit: a credit at a NAMED
|
|
207
|
-
* `(scnId, quality-check)` pair reconciles satisfied/failing via `reconcileEvidenceObligation` and
|
|
208
|
-
* is NOT re-listed here. `evidenceObligationPairs` is the journal's rule (`evidenceObligationPairsOf`),
|
|
209
|
-
* built once and shared — which is what makes a credit citing a PENDING pair land here rather than
|
|
210
|
-
* nowhere (3F-1858: a pending obligation names nothing, so such a credit is no-evidence-obligation exactly
|
|
211
|
-
* as when nothing was raised at all, and the run that used to read balanced over it now fails).
|
|
212
|
-
*/
|
|
213
25
|
export declare function noEvidenceObligationReconciliationsOf(scnId: string, postedCredits: readonly EvidenceObservation[], evidenceObligationPairs: ReadonlySet<string>): QualityCheckReconciliation[];
|
|
214
|
-
/**
|
|
215
|
-
* The items on a PHANTOM row (@SCN-LDG-006) — one `cites-unknown-scenario` per credit citing an
|
|
216
|
-
* `@SCN` no scenario carries, in citation order. CREDIT-ONLY: a phantom row is minted BY a credit,
|
|
217
|
-
* so nothing can ever have been named of it, and no obligation is in scope.
|
|
218
|
-
*
|
|
219
|
-
* THE WHERE-TO-FIX IS THE WHOLE OF WHAT THIS ITEM CAN OFFER, which is why both halves ride through
|
|
220
|
-
* (ruling Q5): a phantom item has no obligation to point a reader at instead. A runtime credit
|
|
221
|
-
* carries its locator (the test file that cited); a FITNESS credit carries the CHECK THAT RAN —
|
|
222
|
-
* it is read from a target's config, not from a test file, so it has no locator and the handle is
|
|
223
|
-
* all there is. That half became reachable when the fitness axis started citing (@SCN-LNT-009);
|
|
224
|
-
* the suspense arm below already carried it, and the two unmatched-credit destinations must not
|
|
225
|
-
* tell a reader different amounts about the same class of fault.
|
|
226
|
-
*/
|
|
227
26
|
export declare function citesUnknownScenarioReconciliationsOf(credits: readonly EvidenceObservation[]): QualityCheckReconciliation[];
|
|
228
|
-
|
|
229
|
-
* The items on the SUSPENSE row (@SCN-LDG-007) — every entry that names no scenario at all,
|
|
230
|
-
* in the ONE order canon fixes.
|
|
231
|
-
*
|
|
232
|
-
* THE ORDER IS THE RULE, not an accident of assembly. `broken` comes FIRST because a broken run's
|
|
233
|
-
* other suspense items are downstream noise: the reader must be sent to the harness before being
|
|
234
|
-
* asked to read anything the harness failed to produce.
|
|
235
|
-
*
|
|
236
|
-
* THE SPLIT (@SCN-LDG-017) is why `broken` and `cites-no-scenario` are separate arms rather than
|
|
237
|
-
* one map over "everything uncited". Both land here because they name no scenario, but they are
|
|
238
|
-
* distinguished by errored-vs-completed and their remedies differ: a `cites-no-scenario` test RAN
|
|
239
|
-
* and forgot its citation (add the `@SCN`); a `broken` suite never ran at all (fix the harness).
|
|
240
|
-
* Folding the second into the first would hide a collection failure behind the wrong cure.
|
|
241
|
-
*
|
|
242
|
-
* The three arms carry different payloads, each for a stated reason:
|
|
243
|
-
* - `broken` carries its WHERE-to-fix (locator) and its WHAT-broke (the runner's message), and
|
|
244
|
-
* NO `evidenceObservation` — a proof that never ran is not an observed piece of evidence.
|
|
245
|
-
* - an uncited runtime credit carries the observation it reconciles, plus its locator.
|
|
246
|
-
* - a no-evidence-obligation static check carries its handle and its observation; it has no locator (a
|
|
247
|
-
* static check is read from config, not from a test file).
|
|
248
|
-
*
|
|
249
|
-
* THE BROKEN STREAM TAKES EITHER AXIS SINCE @SCN-LNT-026, AND THE ARM NEEDED NO BRANCH FOR IT.
|
|
250
|
-
* A converted static check that did not run carries the same two payload halves under the same
|
|
251
|
-
* two names, so the map reads what the observation holds exactly as it does for a vitest suite
|
|
252
|
-
* that failed to collect. What differs is only the `qualityCheck` the item then carries — `lint`
|
|
253
|
-
* rather than a runtime tier — which is read off the observation and not decided here.
|
|
254
|
-
*/
|
|
255
|
-
export declare function suspenseReconciliationsOf(brokenEvidence: readonly (RuntimeEvidenceObservation | GuardEvidenceObservation)[], uncited: readonly RuntimeEvidenceObservation[], noEvidenceObligationGuards: readonly FitnessEvidenceObservation[]): QualityCheckReconciliation[];
|
|
256
|
-
/**
|
|
257
|
-
* The item on an UNTAGGED scenario's row (@SCN-LDG-021) — the DEBIT twin of `cites-no-scenario`
|
|
258
|
-
* (same missing link, opposite side; suspense stays credit-only).
|
|
259
|
-
*
|
|
260
|
-
* A scenario carrying no `@SCN` is REAL and ORDINARY — cucumber runs it — but its obligation has no
|
|
261
|
-
* CODE for an observation to link to, so it could reconcile NOTHING: not satisfied, not failing,
|
|
262
|
-
* not even `missing`, because an obligation never RAISED cannot be ABSENT. Without this item it
|
|
263
|
-
* contributed nothing to the verdict and the run went green over work nothing proves.
|
|
264
|
-
*
|
|
265
|
-
* It carries NO `qualityCheck`: with no code, no observation can link at ANY tier, so the missing
|
|
266
|
-
* link is SCENARIO-scope, not tier-scope (the shape `both-missing` also uses). The synthesised
|
|
267
|
-
* scenario-scope obligation — an empty `{}` — lives ONLY on this item; the row's own
|
|
268
|
-
* `evidenceObligations` stays empty (canon citation: double-entry-manifesto line 39, Obligation
|
|
269
|
-
* Exists / Observation None).
|
|
270
|
-
*/
|
|
27
|
+
export declare function suspenseReconciliationsOf(brokenEvidence: readonly (RuntimeEvidenceObservation | FitnessEvidenceObservation)[], uncited: readonly RuntimeEvidenceObservation[], noEvidenceObligationStaticChecks: readonly FitnessEvidenceObservation[]): QualityCheckReconciliation[];
|
|
271
28
|
export declare function noScnCodeReconciliations(): QualityCheckReconciliation[];
|
|
272
|
-
|
|
273
|
-
* The degenerate BOTH-MISSING item (@SCN-LDG-009) — the NEITHER-side outcome, blank on both sides:
|
|
274
|
-
* no `qualityCheck` (it is neither a debit obligation nor a credit observation), no carried entry.
|
|
275
|
-
* A scenario that reconciled to zero rows on BOTH sides posts exactly one of these, and is
|
|
276
|
-
* out-of-balance through it.
|
|
277
|
-
*
|
|
278
|
-
* Construction lives here with the item; the rule for WHEN a row carries it instead of its sub-rows
|
|
279
|
-
* is the ROW's, and lives on `scenarioReconciliation` (`qualityCheckReconciliationsOf`).
|
|
280
|
-
*/
|
|
29
|
+
export declare function duplicateScnCodeReconciliationsOf(obligations: readonly EvidenceObligation[]): QualityCheckReconciliation[];
|
|
281
30
|
export declare function bothMissingReconciliation(): QualityCheckReconciliation;
|
|
282
|
-
/**
|
|
283
|
-
* The item on the row a CONFIGURED ROW WITH NO SCENARIO earns (@SCN-LNT-027, 3F-3472) — canon's
|
|
284
|
-
* `missing`: Obligation Exists, Observation None.
|
|
285
|
-
*
|
|
286
|
-
* NO NEW OUTCOME, AND THAT IS THE ARGUMENT RATHER THAN THE CONVENIENCE. A row the manifest declares
|
|
287
|
-
* and no scenario specifies is a debit nothing observed, which is what `missing` already means and
|
|
288
|
-
* what `features/fitness-checks.feature` promises in those words. Minting a fourth corpus-shape
|
|
289
|
-
* outcome would put a second sentence beside a row canon already has a sentence for.
|
|
290
|
-
*
|
|
291
|
-
* THE OBLIGATION IS THE ROW'S OWN, and it is REAL — `{ qualityCheck: "lint", staticCheck: <the
|
|
292
|
-
* characteristic> }`, the same shape a converted scenario raises. That is what separates this from
|
|
293
|
-
* the uncoded-work item beside it: THAT one synthesises an empty `{}` because an untagged scenario
|
|
294
|
-
* names no check at all, and this row names exactly one. So the row posts it as a debit too, and
|
|
295
|
-
* the summary counts the obligation the manifest raised.
|
|
296
|
-
*
|
|
297
|
-
* NOTHING HERE CAN DISCHARGE IT, and that is structural rather than asserted: no observation is
|
|
298
|
-
* offered to this item at all, and the minted row's `@SCN` is not a member of the set the citation
|
|
299
|
-
* router posts credits against. A credit citing the row's code still mints a phantom row
|
|
300
|
-
* (@SCN-LNT-009); there is no route by which it reaches this one.
|
|
301
|
-
*/
|
|
302
|
-
export declare function unspecifiedRowReconciliations(characteristic: string): QualityCheckReconciliation[];
|
|
303
|
-
export {};
|
|
304
31
|
//# sourceMappingURL=qualityCheckReconciliation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qualityCheckReconciliation.d.ts","sourceRoot":"","sources":["../../src/domain/qualityCheckReconciliation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"qualityCheckReconciliation.d.ts","sourceRoot":"","sources":["../../src/domain/qualityCheckReconciliation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AAOtB,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAcvD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,OAAO,EAER,CAAC;AAE/C,OAAO,CAAC,MAAM,+BAA+B,EAAE,OAAO,MAAM,CAAC;AAE7D,UAAU,gCAAgC;IACxC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,0BAA0B,GAAG,gCAAgC,GAAG;IAC1E,QAAQ,CAAC,CAAC,+BAA+B,CAAC,EAAE,OAAO,+BAA+B,CAAC;CACpF,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CACvC,OAAO,EACP;IAAE,UAAU,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,YAAY,CAAA;CAAE,CAaxD,CAAC;AAEF,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,gCAAgC,GACvC,0BAA0B,CAmB5B;AA8DD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,kBAAkB,EACvB,oBAAoB,EAAE,mBAAmB,EAAE,GAC1C,0BAA0B,CAiB5B;AAQD,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,SAAS,mBAAmB,EAAE,EAC7C,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAAC,GAC3C,0BAA0B,EAAE,CAe9B;AAED,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,SAAS,mBAAmB,EAAE,GACtC,0BAA0B,EAAE,CAU9B;AAED,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,SAAS,CAAC,0BAA0B,GAAG,0BAA0B,CAAC,EAAE,EACpF,OAAO,EAAE,SAAS,0BAA0B,EAAE,EAC9C,gCAAgC,EAAE,SAAS,0BAA0B,EAAE,GACtE,0BAA0B,EAAE,CA2B9B;AAED,wBAAgB,wBAAwB,IAAI,0BAA0B,EAAE,CAEvE;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,SAAS,kBAAkB,EAAE,GACzC,0BAA0B,EAAE,CAa9B;AAED,wBAAgB,yBAAyB,IAAI,0BAA0B,CAEtE"}
|