@3f-consulting/spec-controller-core 0.1.0-alpha.7 → 0.1.0-alpha.71
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 +3 -3
- package/dist/assemble/evidenceReconciliationFromSources.d.ts +5 -40
- package/dist/assemble/evidenceReconciliationFromSources.d.ts.map +1 -1
- package/dist/assemble/evidenceReconciliationFromSources.js +30 -325
- package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
- package/dist/assemble/renderInput.d.ts +7 -73
- 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 +11 -46
- package/dist/census/evidenceObligations.d.ts.map +1 -1
- package/dist/census/evidenceObligations.js +19 -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 +21 -391
- package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
- package/dist/domain/evidenceReconciliation.js +87 -382
- 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 +8 -393
- 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 +8 -328
- package/dist/domain/ledger.d.ts.map +1 -1
- package/dist/domain/ledger.js +23 -326
- package/dist/domain/ledger.js.map +1 -1
- package/dist/domain/messages.d.ts +213 -0
- package/dist/domain/messages.d.ts.map +1 -0
- package/dist/domain/messages.js +313 -0
- package/dist/domain/messages.js.map +1 -0
- 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 +8 -105
- package/dist/domain/posting.d.ts.map +1 -1
- package/dist/domain/posting.js +4 -56
- package/dist/domain/posting.js.map +1 -1
- package/dist/domain/qualityCheckFault.d.ts +3 -43
- 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/qualityCheckReconciliation.d.ts +7 -280
- package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
- package/dist/domain/qualityCheckReconciliation.js +63 -463
- 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 +1 -24
- 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 +2 -207
- package/dist/domain/scenarioReconciliation.d.ts.map +1 -1
- package/dist/domain/scenarioReconciliation.js +4 -101
- 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 +14 -40
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -88
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +3 -27
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +3 -94
- 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 +2 -16
- 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 +5 -168
- package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
- package/dist/parse/checkScriptsRunInCI.js +11 -171
- package/dist/parse/checkScriptsRunInCI.js.map +1 -1
- package/dist/parse/ciStepRecord.d.ts +4 -118
- package/dist/parse/ciStepRecord.d.ts.map +1 -1
- package/dist/parse/ciStepRecord.js +18 -225
- 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 +6 -67
- package/dist/parse/commandRuns.js.map +1 -1
- package/dist/parse/cucumber.d.ts +0 -53
- package/dist/parse/cucumber.d.ts.map +1 -1
- package/dist/parse/cucumber.js +42 -146
- package/dist/parse/cucumber.js.map +1 -1
- package/dist/parse/discoveryScope.d.ts +1 -46
- package/dist/parse/discoveryScope.d.ts.map +1 -1
- package/dist/parse/discoveryScope.js +2 -57
- 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 +2 -64
- package/dist/parse/reconcilerSteps.js.map +1 -1
- package/dist/parse/runningFitnessFunctions.d.ts +9 -0
- package/dist/parse/runningFitnessFunctions.d.ts.map +1 -0
- package/dist/parse/runningFitnessFunctions.js +57 -0
- package/dist/parse/runningFitnessFunctions.js.map +1 -0
- package/dist/parse/scenarioCodeErrors.d.ts +11 -0
- package/dist/parse/scenarioCodeErrors.d.ts.map +1 -0
- package/dist/parse/scenarioCodeErrors.js +78 -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 +20 -457
- 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 +1 -55
- 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 +2 -50
- 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 +48 -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 +4 -83
- 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 +6 -69
- 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 +3 -39
- 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 +21 -103
- 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 +4 -32
- package/dist/render/excludedSteps.js.map +1 -1
- package/dist/render/fitnessFunctions.d.ts +3 -0
- package/dist/render/fitnessFunctions.d.ts.map +1 -0
- package/dist/render/fitnessFunctions.js +12 -0
- package/dist/render/fitnessFunctions.js.map +1 -0
- 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 +1 -55
- package/dist/render/markdown.d.ts.map +1 -1
- package/dist/render/markdown.js +128 -467
- 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 +10 -53
- 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 +5 -30
- 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 +62 -129
- 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 +45 -0
- package/dist/render/scenarioCodeErrorsSection.js.map +1 -0
- package/dist/render/stepAccounting.d.ts +0 -36
- package/dist/render/stepAccounting.d.ts.map +1 -1
- package/dist/render/stepAccounting.js +5 -49
- 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 +4 -35
- 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/domain/qualityCheckFaultMessages.d.ts +0 -43
- package/dist/domain/qualityCheckFaultMessages.d.ts.map +0 -1
- package/dist/domain/qualityCheckFaultMessages.js +0 -38
- package/dist/domain/qualityCheckFaultMessages.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/parse/runningStaticChecks.d.ts +0 -125
- package/dist/parse/runningStaticChecks.d.ts.map +0 -1
- package/dist/parse/runningStaticChecks.js +0 -316
- package/dist/parse/runningStaticChecks.js.map +0 -1
- package/dist/render/staticChecks.d.ts +0 -23
- package/dist/render/staticChecks.d.ts.map +0 -1
- package/dist/render/staticChecks.js +0 -69
- package/dist/render/staticChecks.js.map +0 -1
package/README.md
CHANGED
|
@@ -34,11 +34,11 @@ const ledger = reconcile(scenarios, observed);
|
|
|
34
34
|
isBalanced(ledger); // false while any scenario names evidence that did not arrive
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
`parseScenarios` reads the `@SCN` code and the quality-check tags off each scenario and turns them into the **obligations** it names. `parseVitestEvidenceObservations` turns a test report into the **observations** that posted back, each citing the `@SCN` it
|
|
37
|
+
`parseScenarios` reads the `@SCN` code and the quality-check tags off each scenario and turns them into the **obligations** it names. `parseVitestEvidenceObservations` turns a test report into the **observations** that posted back, each citing the `@SCN` it claims. `reconcile` puts the two sides against each other and answers per scenario. Everything else on the barrel is a variation on those three moves.
|
|
38
38
|
|
|
39
39
|
## What is on the barrel
|
|
40
40
|
|
|
41
|
-
- **Parse** — `parseScenarios` and
|
|
41
|
+
- **Parse** — `parseScenarios`, `parseUntaggedScenarios` and `countScnOccurrences`; `parseVitestEvidenceObservations`, `parseCucumberEvidenceObservations`; the readers for fitness functions and for what a pipeline's steps actually ran.
|
|
42
42
|
- **Reconcile** — `reconcile` for the ledger itself, `evidenceReconciliationOf` for the ledger plus its summary, and `evidenceReconciliationFromSources` for the whole composition over sources you have already read.
|
|
43
43
|
- **Ask the ledger** — `isBalanced`, `hasPendingItems`, `hasBrokenEvidence`, `hasNothingToReconcile`. These are the four questions a caller decides on: the CLI's own balanced / out-of-balance / unsound / pending-under-strict / nothing-to-reconcile verdicts are built out of these four and nothing else.
|
|
44
44
|
- **Render** — `renderMarkdown`, `renderJson`, `renderReport`, `renderReportFromJson`, and `assembleRenderInput` if you want the payload rather than a string.
|
|
@@ -48,7 +48,7 @@ The types these functions take and return are exported alongside them, so a cons
|
|
|
48
48
|
|
|
49
49
|
## The surface is a contract
|
|
50
50
|
|
|
51
|
-
This barrel is the whole public surface — the package publishes exactly one entrypoint, and what that entrypoint exports is the contract you build on. **Nothing checks it for drift.** A symbol quietly added to the barrel, or quietly dropped from it, reds no build today: the surface is not held against a written-down list, and a generated API report will be adopted at `1.0`, where the compatibility promise comes back.
|
|
51
|
+
This barrel is the whole public surface — the package publishes exactly one entrypoint, and what that entrypoint exports is the contract you build on. **Nothing checks it for drift.** A symbol quietly added to the barrel, or quietly dropped from it, reds no build today: the surface is not held against a written-down list, and a generated API report will be adopted at `1.0`, where the compatibility promise comes back. Before `1.0`, the package is at a `0.x` version and makes no compatibility promise — see [`doc/compatibility.md`](https://github.com/3f-consulting/spec-controller/blob/main/doc/compatibility.md). Pin an exact version.
|
|
52
52
|
|
|
53
53
|
Source, issues and history: [github.com/3f-consulting/spec-controller](https://github.com/3f-consulting/spec-controller).
|
|
54
54
|
|
|
@@ -1,56 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE RECONCILE COMPOSITION — a target's already-read sources reconciled into its Evidence
|
|
3
|
-
* Reconciliation. The ONE entry point core's `.` barrel gains at 3F-3086, and the last step of
|
|
4
|
-
* moving the composition off the app's ingest edge (3F-3087, 3F-3088).
|
|
5
|
-
*
|
|
6
|
-
* WHY IT IS ONE FUNCTION AND NOT A SURFACE. `ingestQualityChecks.ts` is a published module, and it
|
|
7
|
-
* reached nine core symbols through the unpublished `./internal` subpath to assemble this — which
|
|
8
|
-
* is why an installed `spec-controller balance --help` threw ERR_PACKAGE_PATH_NOT_EXPORTED while
|
|
9
|
-
* every gate in the workspace stayed green. Promoting those nine onto the public barrel would fix
|
|
10
|
-
* the crash by freezing exactly the surface `3F-2837` un-published, and the registry-home question
|
|
11
|
-
* (increment D) still governs their shape. So the CALLERS move to core's side of the boundary
|
|
12
|
-
* instead, and the app reaches the whole composition through this one membership decision
|
|
13
|
-
* (`3F-2804`). Nothing here is re-exported: the nine stay internal.
|
|
14
|
-
*
|
|
15
|
-
* WHY THE ARGUMENTS ARE DATA AND NOT READERS. Everything below is already in memory by the time
|
|
16
|
-
* the edge calls this — the feature bytes, the manifest object, the CI bytes, the CI run's own
|
|
17
|
-
* record, the runtime observations. Handing a reader for any of them would move I/O into the
|
|
18
|
-
* engine wearing a callback, and `lint:boundaries`' `core-imports-io` rule reds over exactly that
|
|
19
|
-
* (@SCN-EPG-001's `io-import` arm until 3F-3437).
|
|
20
|
-
*
|
|
21
|
-
* THE TARGET ROOT DOES NOT CROSS. It is resolved at the edge and every remaining use of it is
|
|
22
|
-
* there: relativising the runtime observations before they arrive.
|
|
23
|
-
* Threading it in as well would put `node:child_process` and `process.cwd()`'s answer inside the
|
|
24
|
-
* engine to be read by nothing.
|
|
25
|
-
*
|
|
26
|
-
* THE INPUT IS AN INLINE OBJECT TYPE, deliberately. A named exported interface would be a second
|
|
27
|
-
* symbol on the public v1 surface for a shape only this function takes — one entry point means one
|
|
28
|
-
* name. Nothing has reconciled that surface against a written-down list since 3F-3449, so the
|
|
29
|
-
* restraint is a judgement rather than something a guard would catch.
|
|
30
|
-
*/
|
|
31
1
|
import type { EvidenceObservation } from "../model.js";
|
|
32
2
|
import type { PackageJsonScripts } from "../parse/checkScriptsRunInCI.js";
|
|
33
3
|
import { type CiStepRecord } from "../parse/ciStepRecord.js";
|
|
34
4
|
import type { EvidenceReconciliation } from "./renderInput.js";
|
|
35
|
-
/** A target's manifest as this composition reads it — its scripts, and its `specController` block. */
|
|
36
5
|
type TargetManifest = PackageJsonScripts & {
|
|
37
6
|
specController?: {
|
|
38
7
|
deferralTags?: unknown;
|
|
39
|
-
staticChecks?: unknown;
|
|
40
|
-
fitnessChecks?: unknown;
|
|
41
8
|
runners?: unknown;
|
|
42
9
|
notChecks?: unknown;
|
|
43
10
|
};
|
|
44
11
|
};
|
|
45
|
-
/**
|
|
46
|
-
* EVERYTHING A `balance` RUN IS HANDED — the target's bytes, its manifest, and the two things the
|
|
47
|
-
* application layer owns rather than the engine. Named rather than written inline on the function
|
|
48
|
-
* below, so the function stays under the `max-lines-per-function` ceiling by being smaller rather
|
|
49
|
-
* than by an exception, and so the contract a caller writes against has somewhere to be read. Each
|
|
50
|
-
* member is documented on the function's own `@param` list, where it has always been.
|
|
51
|
-
*/
|
|
52
12
|
export interface EvidenceReconciliationSources {
|
|
53
13
|
featureSources: readonly string[];
|
|
14
|
+
featureFiles?: readonly FeatureFileHeader[];
|
|
54
15
|
untaggedScenarios: readonly string[];
|
|
55
16
|
packageJson: TargetManifest;
|
|
56
17
|
ciSources: readonly string[];
|
|
@@ -60,6 +21,10 @@ export interface EvidenceReconciliationSources {
|
|
|
60
21
|
deferralTags: readonly string[];
|
|
61
22
|
ciStepRecord?: CiStepRecord;
|
|
62
23
|
}
|
|
24
|
+
interface FeatureFileHeader {
|
|
25
|
+
readonly slug: string;
|
|
26
|
+
readonly featureCode: string | null;
|
|
27
|
+
}
|
|
63
28
|
export declare function evidenceReconciliationFromSources(input: EvidenceReconciliationSources): EvidenceReconciliation;
|
|
64
29
|
export {};
|
|
65
30
|
//# sourceMappingURL=evidenceReconciliationFromSources.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidenceReconciliationFromSources.d.ts","sourceRoot":"","sources":["../../src/assemble/evidenceReconciliationFromSources.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"evidenceReconciliationFromSources.d.ts","sourceRoot":"","sources":["../../src/assemble/evidenceReconciliationFromSources.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAkB,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAgBlF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,KAAK,cAAc,GAAG,kBAAkB,GAAG;IACzC,cAAc,CAAC,EAAE;QACf,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH,CAAC;AA4BF,MAAM,WAAW,6BAA6B;IAC5C,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC5C,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,WAAW,EAAE,cAAc,CAAC;IAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACpD,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAkCD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,6BAA6B,GACnC,sBAAsB,CAuBxB"}
|
|
@@ -1,126 +1,26 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE RECONCILE COMPOSITION — a target's already-read sources reconciled into its Evidence
|
|
3
|
-
* Reconciliation. The ONE entry point core's `.` barrel gains at 3F-3086, and the last step of
|
|
4
|
-
* moving the composition off the app's ingest edge (3F-3087, 3F-3088).
|
|
5
|
-
*
|
|
6
|
-
* WHY IT IS ONE FUNCTION AND NOT A SURFACE. `ingestQualityChecks.ts` is a published module, and it
|
|
7
|
-
* reached nine core symbols through the unpublished `./internal` subpath to assemble this — which
|
|
8
|
-
* is why an installed `spec-controller balance --help` threw ERR_PACKAGE_PATH_NOT_EXPORTED while
|
|
9
|
-
* every gate in the workspace stayed green. Promoting those nine onto the public barrel would fix
|
|
10
|
-
* the crash by freezing exactly the surface `3F-2837` un-published, and the registry-home question
|
|
11
|
-
* (increment D) still governs their shape. So the CALLERS move to core's side of the boundary
|
|
12
|
-
* instead, and the app reaches the whole composition through this one membership decision
|
|
13
|
-
* (`3F-2804`). Nothing here is re-exported: the nine stay internal.
|
|
14
|
-
*
|
|
15
|
-
* WHY THE ARGUMENTS ARE DATA AND NOT READERS. Everything below is already in memory by the time
|
|
16
|
-
* the edge calls this — the feature bytes, the manifest object, the CI bytes, the CI run's own
|
|
17
|
-
* record, the runtime observations. Handing a reader for any of them would move I/O into the
|
|
18
|
-
* engine wearing a callback, and `lint:boundaries`' `core-imports-io` rule reds over exactly that
|
|
19
|
-
* (@SCN-EPG-001's `io-import` arm until 3F-3437).
|
|
20
|
-
*
|
|
21
|
-
* THE TARGET ROOT DOES NOT CROSS. It is resolved at the edge and every remaining use of it is
|
|
22
|
-
* there: relativising the runtime observations before they arrive.
|
|
23
|
-
* Threading it in as well would put `node:child_process` and `process.cwd()`'s answer inside the
|
|
24
|
-
* engine to be read by nothing.
|
|
25
|
-
*
|
|
26
|
-
* THE INPUT IS AN INLINE OBJECT TYPE, deliberately. A named exported interface would be a second
|
|
27
|
-
* symbol on the public v1 surface for a shape only this function takes — one entry point means one
|
|
28
|
-
* name. Nothing has reconciled that surface against a written-down list since 3F-3449, so the
|
|
29
|
-
* restraint is a judgement rather than something a guard would catch.
|
|
30
|
-
*/
|
|
31
1
|
import { evidenceReconciliationOf } from "../domain/evidenceReconciliation.js";
|
|
32
|
-
import { bareTerm } from "../lib/bareTerm.js";
|
|
33
2
|
import { ciStepRecordCredits } from "../parse/ciStepRecord.js";
|
|
34
|
-
import { recognisedRunners,
|
|
3
|
+
import { recognisedRunners, runningFitnessFunctions } from "../parse/runningFitnessFunctions.js";
|
|
35
4
|
import { readTargetCorpus } from "../parse/targetCorpus.js";
|
|
36
5
|
import { stepExclusions } from "../parse/stepExclusions.js";
|
|
37
6
|
import { discoveryScope } from "../parse/discoveryScope.js";
|
|
38
7
|
import { stepAccounting } from "../parse/stepAccounting.js";
|
|
8
|
+
import { scenarioCodeErrorsOf, scenarioCodePopulationOf } from "../parse/scenarioCodeErrors.js";
|
|
39
9
|
import { reconcilerSteps } from "../parse/reconcilerSteps.js";
|
|
40
|
-
import { resolveDeferralTags, resolveNotChecks,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
* measurements, left with the measured axis (3F-3516).
|
|
44
|
-
*
|
|
45
|
-
* ITS OWN FUNCTION, extracted when the consumer's exclusion seam (@SCN-USG-015) took the
|
|
46
|
-
* composition past the `max-lines-per-function` ceiling — `withUnconfiguredFitnessScenarios`'s
|
|
47
|
-
* precedent, and the same seam: the streams are one idea with a name, and what is left above is
|
|
48
|
-
* the composition that reads a target and hands them to the factory. Nothing about any of them
|
|
49
|
-
* changed in the move.
|
|
50
|
-
*/
|
|
51
|
-
function observationStreams(input, corpus, packageJson, fitnessChecks, runnerTiers, isExcluded) {
|
|
52
|
-
// WHICH ROWS THE RUN'S OWN RECORD ANSWERS FOR, so the derivation reader does not answer them
|
|
53
|
-
// again (@SCN-LNT-021, @SCN-LNT-030; forced by @SCN-USG-004). A converted check
|
|
54
|
-
// used to be one no discovery reader could SEE — its command is not a script of the manifest, so
|
|
55
|
-
// no prefix reached it — and that accident is what kept one check from being observed twice.
|
|
56
|
-
// Under the inverted membership rule every step is discovered, so the guarantee has to be a
|
|
57
|
-
// mechanism: where a run is handed its own record, the CONFIGURED rows are answered by that
|
|
58
|
-
// record, and derivation answers the residue — the steps citing no configured row at all.
|
|
59
|
-
//
|
|
60
|
-
// IT IS THE ROWS AND NOT THE ENTRIES, because the record answers for a row it holds NO entry for
|
|
61
|
-
// too: that is broken evidence naming the row (@SCN-LNT-027), and a derivation credit landing
|
|
62
|
-
// beside it would soften the loudest thing this axis can say into an ordinary green.
|
|
63
|
-
//
|
|
64
|
-
// NOT A FIFTH DISPOSITION AND NOT A DROP. The step is on the books either way; what this decides
|
|
65
|
-
// is WHICH stream credits it, and the streams differ in what they know — the record carries what
|
|
66
|
-
// the step DID, and a derivation credit carries only that it is wired in. Two credits on one row
|
|
67
|
-
// let the poorer one win, which is measurable: a `continue-on-error` step the record says failed
|
|
68
|
-
// reconciles `watermelon` rather than `failing` when both are posted.
|
|
69
|
-
const answeredByTheRecord = input.ciStepRecord === undefined ? new Set() : new Set(fitnessChecks.keys());
|
|
10
|
+
import { configurationNotRead, resolveDeferralTags, resolveNotChecks, resolveRunners, } from "../parse/targetManifest.js";
|
|
11
|
+
function observationStreams(input, corpus, packageJson, runnerTiers, isExcluded) {
|
|
12
|
+
const recordAnswersCitingSteps = input.ciStepRecord !== undefined;
|
|
70
13
|
return [
|
|
71
14
|
...input.runtimeObservations,
|
|
72
|
-
...checkObservations(corpus, input.ciSources, packageJson, runnerTiers, isExcluded,
|
|
73
|
-
|
|
74
|
-
// observation side, beside the workflow FILE the two config-reading observers above already
|
|
75
|
-
// read. Two documents and two questions: the file says a check is wired into this pipeline
|
|
76
|
-
// and which row its step cites, the record says what that step DID on this run. Neither can
|
|
77
|
-
// be got from the other's document, which is why both are read and neither replaces the
|
|
78
|
-
// other.
|
|
79
|
-
//
|
|
80
|
-
// THEY JOIN THE STATIC STREAM BESIDE THE TWO CONFIG-READING OBSERVERS RATHER THAN REPLACING
|
|
81
|
-
// EITHER: a target mid-conversion runs both kinds at once, and a converted check is simply
|
|
82
|
-
// one no script-handle observer can see — it is never discovered, so nothing double-observes
|
|
83
|
-
// it. The rows are the SAME reading the obligations were raised from, taken from `corpus`'s
|
|
84
|
-
// own registry, so a credit can never cite a characteristic the debit side never owed.
|
|
85
|
-
//
|
|
86
|
-
// THE OPTIONALITY IS PASSED THROUGH RATHER THAN FLATTENED (@SCN-LNT-027). A run handed NO
|
|
87
|
-
// record is not a run handed a record carrying nothing, and those are opposite facts. The
|
|
88
|
-
// first is a consumer whose pipeline dumps no record, or a run nobody recorded: its rows
|
|
89
|
-
// reconcile missing and the run is out of balance. The second is a run that happened and
|
|
90
|
-
// named not one of these steps, which is every configured check broken. The reader tells
|
|
91
|
-
// them apart; nothing here may.
|
|
92
|
-
...ciStepRecordCredits(input.ciStepRecord, fitnessChecks),
|
|
15
|
+
...checkObservations(corpus, input.ciSources, packageJson, runnerTiers, isExcluded, recordAnswersCitingSteps),
|
|
16
|
+
...ciStepRecordCredits(input.ciStepRecord),
|
|
93
17
|
];
|
|
94
18
|
}
|
|
95
19
|
function pipelineReadings(input) {
|
|
96
20
|
const { packageJson } = input;
|
|
97
|
-
// THE CONSUMER'S OWN EXCLUSIONS, RESOLVED ONCE (@SCN-USG-015), and both things this run does
|
|
98
|
-
// with them come off that one reading: the seam the discovery reader is asked through, and the
|
|
99
|
-
// account the report carries. Two resolutions would be free to describe two different manifests
|
|
100
|
-
// in one report — a step excluded from the books and named nowhere, or named as excluded while
|
|
101
|
-
// still on them, and each of those is a report that lies in a different direction.
|
|
102
21
|
const exclusions = stepExclusions(input.ciSources, input.ciSourceNames ?? [], resolveNotChecks(packageJson));
|
|
103
|
-
// THE TARGET'S OWN RUNNERS, RESOLVED ONCE (@SCN-USG-004, @SCN-USG-011), for the reason the two
|
|
104
|
-
// readings beside them are: what a run does with them is the membership rule the discovery
|
|
105
|
-
// observer asks AND the account the report carries, and two resolutions would be free to name a
|
|
106
|
-
// step the unit runner in one section while the books posted it as an uncited check in another.
|
|
107
22
|
const runners = resolveRunners(packageJson);
|
|
108
|
-
// THE RECONCILER'S OWN STEPS (@SCN-USG-014), read off the same bytes and the same manifest, and
|
|
109
|
-
// read whatever the target configured — it is the one exclusion no consumer writes, and the one
|
|
110
|
-
// that has to hold over a manifest saying nothing. Like the exclusions above, both things this
|
|
111
|
-
// run does with it come off ONE reading: the seam discovery is asked through, and the account
|
|
112
|
-
// the report carries.
|
|
113
23
|
const reconciler = reconcilerSteps(input.ciSources, input.ciSourceNames ?? [], input.reconcilerInvocation ?? "", packageJson);
|
|
114
|
-
// THE TWO EXCLUSIONS, COMPOSED HERE AND NOWHERE ELSE. Discovery needs one answer per step, and
|
|
115
|
-
// the precedence between "the reconciler" and "the consumer said so" is the report's business
|
|
116
|
-
// rather than an observer's: both take the step out of the books, and each says so in its own
|
|
117
|
-
// section. The reconciler is asked first because it holds whatever the manifest says. The
|
|
118
|
-
// runner is NOT one of them: it is the membership rule itself and the observer applies it, so
|
|
119
|
-
// folding it in here would put the same question in two places.
|
|
120
|
-
//
|
|
121
|
-
// ONE COMPOSITION, TWO READERS (@SCN-USG-020). The observer posts a check for every step this
|
|
122
|
-
// leaves in, and the scope census counts them per job — so a second composition would let the
|
|
123
|
-
// report state a number of candidates for a job that the books beneath it never posted.
|
|
124
24
|
return {
|
|
125
25
|
runners,
|
|
126
26
|
exclusions,
|
|
@@ -130,88 +30,35 @@ function pipelineReadings(input) {
|
|
|
130
30
|
}
|
|
131
31
|
export function evidenceReconciliationFromSources(input) {
|
|
132
32
|
const { packageJson } = input;
|
|
133
|
-
|
|
134
|
-
// the characteristic a converted scenario owes and the CREDIT for the characteristic its reported
|
|
135
|
-
// scenario answers, and two resolutions would be free to disagree about a manifest neither of
|
|
136
|
-
// them wrote — the same guarantee `readTargetCorpus` composes its three readings for.
|
|
137
|
-
const fitnessChecks = resolveFitnessChecks(packageJson);
|
|
138
|
-
const corpus = readTargetCorpus(input.featureSources, resolveDeferralTags(packageJson, input.deferralTags), fitnessChecks);
|
|
139
|
-
// WHAT THE TARGET SAID ABOUT ITS OWN PIPELINE, read once (see `pipelineReadings`).
|
|
33
|
+
const corpus = readTargetCorpus(input.featureSources, resolveDeferralTags(packageJson, input.deferralTags));
|
|
140
34
|
const { runners, exclusions, reconciler, isExcluded } = pipelineReadings(input);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
// `no-scn-code` on its own out-of-balance row — never silently dropped from the debit side.
|
|
144
|
-
// THE CONCEPT, BUILT BY ITS OWN FACTORY (3F-2233) — nobody assembles a Ledger and leaves someone
|
|
145
|
-
// downstream to total it. The two axis GATES are always on for a `balance` run: both the
|
|
146
|
-
// runtime-observation and the static-check streams are threaded.
|
|
147
|
-
const reconciliation = evidenceReconciliationOf(corpus.scenarios, observationStreams(input, corpus, packageJson, fitnessChecks, runners.tiers, isExcluded), [...input.untaggedScenarios], true, true,
|
|
148
|
-
// THE FOURTH POPULATION (@SCN-LNT-027, 3F-3472) — the configured rows this corpus carries no
|
|
149
|
-
// scenario for, taken from the SAME corpus reading the obligations were raised from. A row
|
|
150
|
-
// with no scenario raises nothing on the corpus side, so without this the check it declares
|
|
151
|
-
// reaches the books nowhere and the run reads balanced over it.
|
|
152
|
-
corpus.unspecifiedFitnessRows);
|
|
153
|
-
return withReaderAccounts(reconciliation, corpus, input, packageJson, runners, exclusions, reconciler, isExcluded);
|
|
35
|
+
const reconciliation = evidenceReconciliationOf(corpus.scenarios, observationStreams(input, corpus, packageJson, runners.tiers, isExcluded), [...input.untaggedScenarios], true, true);
|
|
36
|
+
return withScenarioCodeErrors(withConfigurationAccount(withReaderAccounts(reconciliation, corpus, input, packageJson, runners, exclusions, reconciler, isExcluded), packageJson), input);
|
|
154
37
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
*
|
|
166
|
-
* THE ORDER IS THE REPORT'S, NOT A PREFERENCE. Each graft only adds its own member, so no two can
|
|
167
|
-
* overwrite one another and the composition is free to read in the order a reader meets the
|
|
168
|
-
* sections: what the corpus said, what ran the suites, what this tool took out of its own books,
|
|
169
|
-
* then what the consumer took out.
|
|
170
|
-
*/
|
|
171
|
-
function withReaderAccounts(reconciliation, corpus, input, packageJson, runners, exclusions, reconciler, isExcluded) {
|
|
172
|
-
return withStepAccounting(withScopeAccount(withExclusionAccount(withReconcilerAccount(withRunnerAccount(withRetiredKeysAccount(withUnconfiguredFitnessScenarios(reconciliation, corpus), packageJson), input.ciSources, packageJson, runners), reconciler), exclusions), input, packageJson, runners.tiers, isExcluded), input.ciSources, packageJson, runners.tiers, reconciler, exclusions);
|
|
38
|
+
function withConfigurationAccount(reconciliation, packageJson) {
|
|
39
|
+
const { wrongKinds, unknownKeys } = configurationNotRead(packageJson);
|
|
40
|
+
return {
|
|
41
|
+
...reconciliation,
|
|
42
|
+
summary: {
|
|
43
|
+
...reconciliation.summary,
|
|
44
|
+
...(wrongKinds.length > 0 ? { wrongKindConfiguration: wrongKinds } : {}),
|
|
45
|
+
...(unknownKeys.length > 0 ? { unknownConfigurationKeys: unknownKeys } : {}),
|
|
46
|
+
},
|
|
47
|
+
};
|
|
173
48
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
* no longer reads, carried onto the summary the factory built rather than threaded through it,
|
|
177
|
-
* for the reason the half-converted scenarios beside it are: the factory's inputs are the
|
|
178
|
-
* JOURNAL, and a retired key is neither an obligation nor an observation. Nothing reads it, so
|
|
179
|
-
* there is no row for it to be derived from — only a name for the report to carry.
|
|
180
|
-
*
|
|
181
|
-
* READ OFF THE SAME MANIFEST EVERY OTHER GRAFT IN THIS MODULE COMES FROM, and nothing else: a
|
|
182
|
-
* retired key is a fact about what the target WROTE, not about its pipeline, so it needs no CI
|
|
183
|
-
* bytes and no corpus reading to resolve.
|
|
184
|
-
*
|
|
185
|
-
* ONLY WHEN THERE IS SOMETHING TO SAY, so a target that has never written a retired key — every
|
|
186
|
-
* target today — renders and serialises byte-identically to before.
|
|
187
|
-
*/
|
|
188
|
-
function withRetiredKeysAccount(reconciliation, packageJson) {
|
|
189
|
-
const retiredKeys = resolveRetiredKeys(packageJson);
|
|
190
|
-
if (retiredKeys.length === 0)
|
|
49
|
+
function withScenarioCodeErrors(reconciliation, input) {
|
|
50
|
+
if (input.featureFiles === undefined)
|
|
191
51
|
return reconciliation;
|
|
52
|
+
const files = input.featureFiles.map((header, i) => ({ ...header, source: input.featureSources[i] ?? "" }));
|
|
192
53
|
return {
|
|
193
54
|
...reconciliation,
|
|
194
|
-
|
|
55
|
+
scenarioCodeErrors: scenarioCodeErrorsOf(files),
|
|
56
|
+
scenarioCodePopulation: scenarioCodePopulationOf(files),
|
|
195
57
|
};
|
|
196
58
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
* inputs are the JOURNAL, and three of the four dispositions post no row at all.
|
|
201
|
-
*
|
|
202
|
-
* LAST OF THE GRAFTS, because it is the one that counts what the others named. It takes the
|
|
203
|
-
* reconciler and the exclusions as their two SEPARATE seams rather than as the composed answer the
|
|
204
|
-
* observer is asked through: the observer needs one answer per step and cannot tell the two facts
|
|
205
|
-
* apart, while this reader has to, because a report that folded them would tell a consumer who
|
|
206
|
-
* configured nothing that their configuration took two steps out.
|
|
207
|
-
*
|
|
208
|
-
* IT ASKS THE PRODUCT'S OWN RULES rather than re-deriving any of them, and `parse/stepAccounting`
|
|
209
|
-
* states why: a count that decided membership for itself would agree with itself over books that
|
|
210
|
-
* said something else, which is the one disagreement a reader of a total cannot see.
|
|
211
|
-
*
|
|
212
|
-
* ONLY WHEN A STEP WAS READ, so a run handed no CI configuration renders and serialises
|
|
213
|
-
* byte-identically to before.
|
|
214
|
-
*/
|
|
59
|
+
function withReaderAccounts(reconciliation, corpus, input, packageJson, runners, exclusions, reconciler, isExcluded) {
|
|
60
|
+
return withStepAccounting(withScopeAccount(withExclusionAccount(withReconcilerAccount(withRunnerAccount(reconciliation, input.ciSources, packageJson, runners), reconciler), exclusions), input, packageJson, runners.tiers, isExcluded), input.ciSources, packageJson, runners.tiers, reconciler, exclusions);
|
|
61
|
+
}
|
|
215
62
|
function withStepAccounting(reconciliation, ciSources, packageJson, runnerTiers, reconciler, exclusions) {
|
|
216
63
|
const accounting = stepAccounting(ciSources, packageJson, runnerTiers, reconciler.isReconciler, exclusions.isExcluded);
|
|
217
64
|
if (accounting.stepsRead === 0)
|
|
@@ -221,42 +68,12 @@ function withStepAccounting(reconciliation, ciSources, packageJson, runnerTiers,
|
|
|
221
68
|
summary: { ...reconciliation.summary, stepAccounting: accounting },
|
|
222
69
|
};
|
|
223
70
|
}
|
|
224
|
-
/**
|
|
225
|
-
* THE SCOPE ACCOUNT (@SCN-USG-020) — which workflow files and which of their jobs this run read,
|
|
226
|
-
* with the steps each held and how many became candidates, carried onto the summary the factory
|
|
227
|
-
* built for the reason the three accounts beside it are: the factory's inputs are the JOURNAL, and
|
|
228
|
-
* a job is neither an obligation nor an observation. It is where the steps CAME FROM, so there is
|
|
229
|
-
* no row for it to be derived from.
|
|
230
|
-
*
|
|
231
|
-
* LAST OF THE GRAFTS AND FIRST OF THE SECTIONS, and that is not a contradiction. It is grafted
|
|
232
|
-
* last because it is the only one needing the composed exclusion seam the observer was asked
|
|
233
|
-
* through — the same seam, so the candidates it counts per job are the candidates the books
|
|
234
|
-
* posted. It renders first because it is the pipeline every figure under it was read from.
|
|
235
|
-
*
|
|
236
|
-
* ONLY WHEN THERE IS SOMETHING TO SAY, so a run handed no CI configuration renders and serialises
|
|
237
|
-
* byte-identically to before.
|
|
238
|
-
*/
|
|
239
71
|
function withScopeAccount(reconciliation, input, packageJson, runnerTiers, isExcluded) {
|
|
240
72
|
const scope = discoveryScope(input.ciSources, input.ciSourceNames ?? [], packageJson, runnerTiers, isExcluded);
|
|
241
73
|
if (scope.length === 0)
|
|
242
74
|
return reconciliation;
|
|
243
75
|
return { ...reconciliation, summary: { ...reconciliation.summary, discoveryScope: scope } };
|
|
244
76
|
}
|
|
245
|
-
/**
|
|
246
|
-
* THE RECONCILER ACCOUNT (@SCN-USG-014) — the steps of the target's pipeline that ARE this
|
|
247
|
-
* reconciliation, carried onto the summary the factory built rather than threaded through it, for
|
|
248
|
-
* the reason the two accounts beside it are: the factory's inputs are the JOURNAL, and the
|
|
249
|
-
* reconciler is neither an obligation nor an observation. It is the disposition a step got INSTEAD
|
|
250
|
-
* of reaching the books, so there is no row for it to be derived from.
|
|
251
|
-
*
|
|
252
|
-
* SEPARATE FROM THE EXCLUSION ACCOUNT, deliberately, though both end as steps that are off the
|
|
253
|
-
* books. That one is a list the consumer wrote; this one is nobody's. Folding them would tell a
|
|
254
|
-
* consumer who configured nothing that their configuration took two steps out — and a consumer who
|
|
255
|
-
* then went looking for the entries would find none.
|
|
256
|
-
*
|
|
257
|
-
* ONLY WHEN THERE IS SOMETHING TO SAY, so a target whose pipeline does not run this tool renders
|
|
258
|
-
* and serialises byte-identically to before.
|
|
259
|
-
*/
|
|
260
77
|
function withReconcilerAccount(reconciliation, reconciler) {
|
|
261
78
|
if (reconciler.steps.length === 0)
|
|
262
79
|
return reconciliation;
|
|
@@ -265,24 +82,8 @@ function withReconcilerAccount(reconciliation, reconciler) {
|
|
|
265
82
|
summary: { ...reconciliation.summary, reconcilerSteps: reconciler.steps },
|
|
266
83
|
};
|
|
267
84
|
}
|
|
268
|
-
/**
|
|
269
|
-
* THE EXCLUSION ACCOUNT (@SCN-USG-015) — the steps the target named non-checks and the entries of
|
|
270
|
-
* its list that named none, carried onto the summary the factory built rather than threaded
|
|
271
|
-
* through it, for the reason the runner account beside it is: the factory's inputs are the
|
|
272
|
-
* JOURNAL, and an excluded step is neither an obligation nor an observation. It is the disposition
|
|
273
|
-
* a step got INSTEAD of reaching the books, so there is no row for it to be derived from.
|
|
274
|
-
*
|
|
275
|
-
* BOTH HALVES OFF ONE PARTITION, which is why they are grafted together. They are the two sides of
|
|
276
|
-
* the same list and their totals have to add up to it — an entry in neither is an exclusion the
|
|
277
|
-
* consumer wrote that nothing anywhere accounts for.
|
|
278
|
-
*
|
|
279
|
-
* EACH ONLY WHEN THERE IS SOMETHING TO SAY, so a target that names no non-checks renders and
|
|
280
|
-
* serialises byte-identically to before.
|
|
281
|
-
*/
|
|
282
85
|
function withExclusionAccount(reconciliation, exclusions) {
|
|
283
86
|
const { excluded, unmatchedEntries } = exclusions;
|
|
284
|
-
if (excluded.length === 0 && unmatchedEntries.length === 0)
|
|
285
|
-
return reconciliation;
|
|
286
87
|
return {
|
|
287
88
|
...reconciliation,
|
|
288
89
|
summary: {
|
|
@@ -292,44 +93,9 @@ function withExclusionAccount(reconciliation, exclusions) {
|
|
|
292
93
|
},
|
|
293
94
|
};
|
|
294
95
|
}
|
|
295
|
-
/**
|
|
296
|
-
* THE RUNNER ACCOUNT — what the target SAID about each tier (@SCN-USG-016) and which steps a run
|
|
297
|
-
* RECOGNISED off it (@SCN-USG-011), carried onto the summary the factory built rather than threaded
|
|
298
|
-
* through it, for the reason the half-converted scenarios beside them are: the factory's inputs are
|
|
299
|
-
* the JOURNAL, and a runner is neither an obligation nor an observation. It is the disposition a
|
|
300
|
-
* step gets INSTEAD of reaching the books, so there is no row for it to be derived from.
|
|
301
|
-
*
|
|
302
|
-
* ONE READING OF THE BLOCK BEHIND BOTH, which is why they are one function and not two. They are
|
|
303
|
-
* opposite facts — one about the manifest, one about the pipeline — and the interesting cases are
|
|
304
|
-
* exactly where they fail to line up: a tier the target says it has NO runner for is recognised at
|
|
305
|
-
* no step, and so is a tier it never mentioned. Two resolutions would be free to describe two
|
|
306
|
-
* different manifests in one report, and the report would read as though it had found something.
|
|
307
|
-
*
|
|
308
|
-
* EACH ONLY WHEN THERE IS SOMETHING TO SAY, so a target that has named no runners — no block, or a
|
|
309
|
-
* block nothing could be read out of — renders and serialises byte-identically to before.
|
|
310
|
-
*
|
|
311
|
-
* AND THAT IS WHAT A `new-client` IS OWED, settled by the scenario that was still open when this
|
|
312
|
-
* graft was written (@SCN-USG-017). Such a target has named nothing, so nothing is taken out of
|
|
313
|
-
* discovery and every step of its pipeline reaches the books as a candidate — which is the whole of
|
|
314
|
-
* the report that state is sold on. It is the OBSERVER that owes them that, not this graft: there
|
|
315
|
-
* is no runner to account for, and an account of four tiers nobody named would read as the tool
|
|
316
|
-
* asking for configuration before it will answer.
|
|
317
|
-
*/
|
|
318
96
|
function withRunnerAccount(reconciliation, ciSources, packageJson, { tiers: runnerTiers, unrecognisedKeys }) {
|
|
319
|
-
// THE PARTITION, NOT THE BLOCK (@SCN-USG-019). Only the entries keyed by a canon tier reach the
|
|
320
|
-
// recognition below; a key outside the four is carried to the report instead, where it is named.
|
|
321
|
-
// Reading the whole block would let a consumer take their own checks out of discovery one
|
|
322
|
-
// invented key at a time, which is the closure's whole subject — and since @SCN-USG-004 that is
|
|
323
|
-
// no longer only a reporting question: these tiers ARE the membership rule.
|
|
324
|
-
//
|
|
325
|
-
// RULE D, over the SAME manifest and the SAME CI bytes every other reading in this module comes
|
|
326
|
-
// from (@SCN-USG-011), and through the same `namedRunnersAt` the discovery observer asks. So a
|
|
327
|
-
// step named here as a runner is the same step that is not on the books as a fitness check.
|
|
328
97
|
const behaviouralRunners = recognisedRunners(ciSources, packageJson, runnerTiers);
|
|
329
98
|
const named = Object.keys(runnerTiers).length > 0;
|
|
330
|
-
if (behaviouralRunners.length === 0 && !named && unrecognisedKeys.length === 0) {
|
|
331
|
-
return reconciliation;
|
|
332
|
-
}
|
|
333
99
|
return {
|
|
334
100
|
...reconciliation,
|
|
335
101
|
summary: {
|
|
@@ -340,70 +106,9 @@ function withRunnerAccount(reconciliation, ciSources, packageJson, { tiers: runn
|
|
|
340
106
|
},
|
|
341
107
|
};
|
|
342
108
|
}
|
|
343
|
-
|
|
344
|
-
* THE CORPUS'S HALF-CONVERTED CHECKS (@SCN-LNT-020), carried onto the summary the factory built
|
|
345
|
-
* rather than threaded through it. The factory's inputs are the JOURNAL — obligations and
|
|
346
|
-
* observations — and this is neither: it is what the corpus said about itself that no row answered,
|
|
347
|
-
* so a scenario naming it raises nothing for a Ledger to hold. It is grafted where the corpus
|
|
348
|
-
* reading and the reconciliation are both in hand, and only when there is something to name, so a
|
|
349
|
-
* target that has converted nothing serialises exactly as before.
|
|
350
|
-
*
|
|
351
|
-
* ITS OWN FUNCTION, extracted when the credit stream (@SCN-LNT-021) took the composition past the
|
|
352
|
-
* `max-lines-per-function` ceiling. The graft is one idea with a name; nothing about it changed.
|
|
353
|
-
*/
|
|
354
|
-
function withUnconfiguredFitnessScenarios(reconciliation, corpus) {
|
|
355
|
-
if (corpus.unconfiguredFitnessScenarios.length === 0)
|
|
356
|
-
return reconciliation;
|
|
357
|
-
return {
|
|
358
|
-
...reconciliation,
|
|
359
|
-
summary: {
|
|
360
|
-
...reconciliation.summary,
|
|
361
|
-
unconfiguredFitnessScenarios: corpus.unconfiguredFitnessScenarios,
|
|
362
|
-
},
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* The COMPLETE static stream the reconciliation consumes, from the RUNNING-check observer — the
|
|
367
|
-
* static analogue of a runner emitting every test result, so nothing a gate runs is off the books.
|
|
368
|
-
*
|
|
369
|
-
* THE OBLIGATION-SIDE OBSERVER THIS COMPOSED ALONGSIDE IS RETIRED (3F-3161, @SCN-LNT-017). It
|
|
370
|
-
* answered for every check the corpus obliged by a REGISTERED handle (`corpus.checkHandles`), and
|
|
371
|
-
* that discovery went with the registry it was keyed from: every check now either states its own
|
|
372
|
-
* row's code on its CI step, which the running-check observer already reads, or is a converted
|
|
373
|
-
* `@fitness` row with no runnable script handle to be discovered by. There is no second observer
|
|
374
|
-
* left to double-observe against.
|
|
375
|
-
*
|
|
376
|
-
* WHAT A SURVIVOR CITES IS THE TARGET'S OWN ANSWER (@SCN-LNT-031). A check whose CI step states the
|
|
377
|
-
* code of the configured row it runs posts to that row; one whose step states none cites no
|
|
378
|
-
* scenario and the reconciliation folds it into the suspense row (@SCN-USG-001), which is where an
|
|
379
|
-
* unattributed check is meant to surface. That is the state a consumer starts in, and it is the
|
|
380
|
-
* report this axis's first useful sentence is made of.
|
|
381
|
-
*/
|
|
382
|
-
function checkObservations(corpus, ciSources, packageJson,
|
|
383
|
-
// @SCN-USG-004 — the target's declared behavioural runners, resolved ONCE by the composition and
|
|
384
|
-
// read by both the account the report carries and the membership rule below. Two resolutions
|
|
385
|
-
// would be free to name a step the unit runner in one section while the books posted it as a
|
|
386
|
-
// fitness check in the other.
|
|
387
|
-
runnerTiers,
|
|
388
|
-
// @SCN-USG-015 — the consumer's own exclusions, reaching the DISCOVERY observer.
|
|
389
|
-
isExcluded,
|
|
390
|
-
// The configured rows this run's own record answers for — none when it was handed no record.
|
|
391
|
-
// Stated at the composition (`observationStreams`), because which STREAM answers a row is a
|
|
392
|
-
// question about the run's inputs and not one an observer has any business holding.
|
|
393
|
-
answeredByTheRecord) {
|
|
109
|
+
function checkObservations(corpus, ciSources, packageJson, runnerTiers, isExcluded, recordAnswersCitingSteps) {
|
|
394
110
|
return [
|
|
395
|
-
...
|
|
396
|
-
// THE CONSUMER'S OWN CITATION, WIRED (@SCN-LNT-031). The walk carries a check step's `id:`
|
|
397
|
-
// and this observer reads it, and until this seam was passed the two met nowhere: every
|
|
398
|
-
// discovered check on the live path cited nothing, so a fully annotated pipeline reconciled
|
|
399
|
-
// exactly as an unannotated one — `new-client` reported over a target in `annotated`.
|
|
400
|
-
//
|
|
401
|
-
// THE HANDLE IS DELIBERATELY NOT CONSULTED. The row a step's code names carries the
|
|
402
|
-
// characteristic, so both terms come off ONE configured row; reaching for the script's
|
|
403
|
-
// spelling to supply the half a CI step cannot state is the name-match this axis retired.
|
|
404
|
-
// A step with no code, or one naming no configured row, reaches no citation and posts to
|
|
405
|
-
// suspense — which is `new-client`, unnarrowed.
|
|
406
|
-
(_script, citedByStep) => corpus.citedRow(citedByStep), isExcluded).filter((o) => !(o.scnId !== undefined && answeredByTheRecord.has(bareTerm(o.scnId)))),
|
|
111
|
+
...runningFitnessFunctions(ciSources, packageJson, runnerTiers, (_script, citedByStep) => corpus.citedRow(citedByStep), isExcluded).filter((o) => !(recordAnswersCitingSteps && o.scnId !== undefined)),
|
|
407
112
|
];
|
|
408
113
|
}
|
|
409
114
|
//# sourceMappingURL=evidenceReconciliationFromSources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidenceReconciliationFromSources.js","sourceRoot":"","sources":["../../src/assemble/evidenceReconciliationFromSources.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evidenceReconciliationFromSources.js","sourceRoot":"","sources":["../../src/assemble/evidenceReconciliationFromSources.ts"],"names":[],"mappings":"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"}
|