@3f-consulting/spec-controller-core 0.1.0-alpha.4 → 0.1.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assemble/evidenceReconciliationFromSources.d.ts +4 -13
- package/dist/assemble/evidenceReconciliationFromSources.d.ts.map +1 -1
- package/dist/assemble/evidenceReconciliationFromSources.js +17 -22
- package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
- package/dist/domain/checkCharacteristics.d.ts +22 -15
- package/dist/domain/checkCharacteristics.d.ts.map +1 -1
- package/dist/domain/checkCharacteristics.js +22 -15
- package/dist/domain/checkCharacteristics.js.map +1 -1
- package/dist/domain/evidenceReconciliation.d.ts +26 -2
- package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
- package/dist/domain/evidenceReconciliation.js +164 -61
- package/dist/domain/evidenceReconciliation.js.map +1 -1
- package/dist/domain/fitnessChecks.d.ts +24 -35
- package/dist/domain/fitnessChecks.d.ts.map +1 -1
- package/dist/domain/fitnessChecks.js +3 -30
- package/dist/domain/fitnessChecks.js.map +1 -1
- package/dist/domain/journal.d.ts +13 -103
- package/dist/domain/journal.d.ts.map +1 -1
- package/dist/domain/journal.js +6 -19
- package/dist/domain/journal.js.map +1 -1
- package/dist/domain/ledger.d.ts.map +1 -1
- package/dist/domain/ledger.js +45 -34
- package/dist/domain/ledger.js.map +1 -1
- package/dist/domain/posting.d.ts.map +1 -1
- package/dist/domain/posting.js +4 -7
- package/dist/domain/posting.js.map +1 -1
- package/dist/domain/qualityCheckFaultMessages.d.ts +7 -2
- package/dist/domain/qualityCheckFaultMessages.d.ts.map +1 -1
- package/dist/domain/qualityCheckFaultMessages.js +7 -2
- package/dist/domain/qualityCheckFaultMessages.js.map +1 -1
- package/dist/domain/qualityCheckReconciliation.d.ts +21 -0
- package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
- package/dist/domain/qualityCheckReconciliation.js +40 -105
- package/dist/domain/qualityCheckReconciliation.js.map +1 -1
- package/dist/domain/qualityCheckReconciliationFault.d.ts +3 -1
- package/dist/domain/qualityCheckReconciliationFault.d.ts.map +1 -1
- package/dist/domain/qualityCheckReconciliationFault.js +3 -1
- package/dist/domain/qualityCheckReconciliationFault.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +2 -10
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +24 -71
- package/dist/internal.js.map +1 -1
- package/dist/parse/checkScriptsRunInCI.d.ts +8 -7
- package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
- package/dist/parse/checkScriptsRunInCI.js +7 -6
- package/dist/parse/checkScriptsRunInCI.js.map +1 -1
- package/dist/parse/ciStepRecord.d.ts +5 -17
- package/dist/parse/ciStepRecord.d.ts.map +1 -1
- package/dist/parse/ciStepRecord.js +7 -27
- package/dist/parse/ciStepRecord.js.map +1 -1
- package/dist/parse/corpusCodeFaults.d.ts +4 -4
- package/dist/parse/corpusCodeFaults.js +4 -4
- package/dist/parse/corpusFaults.d.ts +24 -36
- package/dist/parse/corpusFaults.d.ts.map +1 -1
- package/dist/parse/corpusFaults.js +16 -32
- package/dist/parse/corpusFaults.js.map +1 -1
- package/dist/parse/corpusGrammarFaults.d.ts +11 -73
- package/dist/parse/corpusGrammarFaults.d.ts.map +1 -1
- package/dist/parse/corpusGrammarFaults.js +27 -58
- package/dist/parse/corpusGrammarFaults.js.map +1 -1
- package/dist/parse/runningStaticChecks.d.ts +3 -2
- package/dist/parse/runningStaticChecks.d.ts.map +1 -1
- package/dist/parse/runningStaticChecks.js +3 -2
- package/dist/parse/runningStaticChecks.js.map +1 -1
- package/dist/parse/scenarios.d.ts +27 -12
- package/dist/parse/scenarios.d.ts.map +1 -1
- package/dist/parse/scenarios.js +47 -85
- package/dist/parse/scenarios.js.map +1 -1
- package/dist/parse/targetCorpus.d.ts +21 -11
- package/dist/parse/targetCorpus.d.ts.map +1 -1
- package/dist/parse/targetCorpus.js +16 -19
- package/dist/parse/targetCorpus.js.map +1 -1
- package/dist/parse/targetManifest.d.ts +10 -85
- package/dist/parse/targetManifest.d.ts.map +1 -1
- package/dist/parse/targetManifest.js +47 -137
- package/dist/parse/targetManifest.js.map +1 -1
- package/dist/provenance/provenance.d.ts +8 -11
- package/dist/provenance/provenance.d.ts.map +1 -1
- package/dist/provenance/provenance.js +2 -3
- package/dist/provenance/provenance.js.map +1 -1
- package/dist/render/evidenceGrid.d.ts +45 -0
- package/dist/render/evidenceGrid.d.ts.map +1 -0
- package/dist/render/evidenceGrid.js +145 -0
- package/dist/render/evidenceGrid.js.map +1 -0
- package/dist/render/markdown.d.ts.map +1 -1
- package/dist/render/markdown.js +85 -190
- package/dist/render/markdown.js.map +1 -1
- package/dist/render/runVerdict.d.ts +3 -2
- package/dist/render/runVerdict.d.ts.map +1 -1
- package/dist/render/runVerdict.js +3 -2
- package/dist/render/runVerdict.js.map +1 -1
- package/dist/render/staticChecks.d.ts.map +1 -1
- package/dist/render/staticChecks.js +10 -1
- package/dist/render/staticChecks.js.map +1 -1
- package/package.json +1 -1
- package/dist/domain/thresholds.d.ts +0 -123
- package/dist/domain/thresholds.d.ts.map +0 -1
- package/dist/domain/thresholds.js +0 -185
- package/dist/domain/thresholds.js.map +0 -1
- package/dist/parse/checkStaticEvidenceObligations.d.ts +0 -32
- package/dist/parse/checkStaticEvidenceObligations.d.ts.map +0 -1
- package/dist/parse/checkStaticEvidenceObligations.js +0 -78
- package/dist/parse/checkStaticEvidenceObligations.js.map +0 -1
- package/dist/parse/corpusClaimFaults.d.ts +0 -104
- package/dist/parse/corpusClaimFaults.d.ts.map +0 -1
- package/dist/parse/corpusClaimFaults.js +0 -128
- package/dist/parse/corpusClaimFaults.js.map +0 -1
- package/dist/parse/measurements.d.ts +0 -47
- package/dist/parse/measurements.d.ts.map +0 -1
- package/dist/parse/measurements.js +0 -65
- package/dist/parse/measurements.js.map +0 -1
- package/dist/render/measuredItem.d.ts +0 -30
- package/dist/render/measuredItem.d.ts.map +0 -1
- package/dist/render/measuredItem.js +0 -43
- package/dist/render/measuredItem.js.map +0 -1
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The TARGET's feature corpus read into the
|
|
3
|
-
*
|
|
2
|
+
* The TARGET's feature corpus read into the readings one reconciliation needs — moved here from
|
|
3
|
+
* the app's ingest edge (3F-3088).
|
|
4
4
|
*
|
|
5
5
|
* WHY IT LIVES IN THE ENGINE. Every line of it is a pure function of sources somebody else already
|
|
6
|
-
* read off disk: the obligation rule
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* repairs. One line made it impure and it was the only one: the feature discovery, which now
|
|
6
|
+
* read off disk: the obligation rule is `parseScenarios`, core's own. Sitting at the app edge it
|
|
7
|
+
* was the reason a PUBLISHED module imported core's unpublished `/internal` subpath for five
|
|
8
|
+
* symbols — the fault 3F-3086 repairs. One line made it impure and it was the only one: the feature discovery, which now
|
|
10
9
|
* happens at the edge and arrives as `sources`.
|
|
11
10
|
*
|
|
12
11
|
* THE REGISTRY-KEYED READING THIS FILE ONCE ALSO PRODUCED — `checkHandles` and `citedScn`, the
|
|
@@ -15,14 +14,13 @@
|
|
|
15
14
|
* (`citedRow`, below) or is a converted `@fitness` row read through `domain/fitnessChecks`
|
|
16
15
|
* directly; there is no second discovery left to key a handle set off.
|
|
17
16
|
*/
|
|
18
|
-
import type { FitnessCheckIndex } from "../domain/fitnessChecks.js";
|
|
19
|
-
import { type ThresholdIndex } from "../domain/thresholds.js";
|
|
17
|
+
import type { FitnessCheckIndex, UnspecifiedFitnessRow } from "../domain/fitnessChecks.js";
|
|
20
18
|
import { type ScriptCitation } from "./fitnessCitations.js";
|
|
21
19
|
import type { Scenario } from "../model.js";
|
|
22
20
|
/**
|
|
23
21
|
* The target's feature corpus as ONE run reads it — the obligations it raises, the `@SCN` a run
|
|
24
|
-
* whose CI step states a code cites,
|
|
25
|
-
*
|
|
22
|
+
* whose CI step states a code cites, the scenarios on the fitness axis no configured row names,
|
|
23
|
+
* and the configured rows the corpus carries no scenario for.
|
|
26
24
|
*
|
|
27
25
|
* THE READINGS ARE ONE, which is why they are produced together. All are derived from the same
|
|
28
26
|
* bytes and the same configured rows, and the fault they exist to foreclose is precisely their
|
|
@@ -55,6 +53,18 @@ export interface TargetCorpus {
|
|
|
55
53
|
* different reads — the same guarantee `citedRow` is composed here for.
|
|
56
54
|
*/
|
|
57
55
|
unconfiguredFitnessScenarios: readonly string[];
|
|
56
|
+
/**
|
|
57
|
+
* The CONFIGURED ROWS the corpus carries no scenario for (@SCN-LNT-027, 3F-3472) — the other
|
|
58
|
+
* direction of the same disagreement, in manifest order, each with the characteristic its debit
|
|
59
|
+
* is owed at.
|
|
60
|
+
*
|
|
61
|
+
* IT IS HERE FOR THE MIRROR'S REASON AND NOT A WEAKER ONE. The corpus walk and the configured
|
|
62
|
+
* rows are both in hand exactly once, so the rows this names and the obligations `scenarios`
|
|
63
|
+
* raises are taken from ONE read of each side. Computed at the composition from `corpus.scenarios`
|
|
64
|
+
* it would be a second walk, free to disagree with the walk the obligations came from — which is
|
|
65
|
+
* the fault this whole reading exists to foreclose.
|
|
66
|
+
*/
|
|
67
|
+
unspecifiedFitnessRows: readonly UnspecifiedFitnessRow[];
|
|
58
68
|
}
|
|
59
69
|
/**
|
|
60
70
|
* THE SOURCES ARRIVE READ, AND THAT IS THE WHOLE OF WHAT MOVED. The edge discovers the target's
|
|
@@ -64,7 +74,7 @@ export interface TargetCorpus {
|
|
|
64
74
|
* preserves that guarantee where a features directory would have re-opened the question inside the
|
|
65
75
|
* engine.
|
|
66
76
|
*/
|
|
67
|
-
export declare function readTargetCorpus(sources: readonly string[], deferralTags: readonly string[],
|
|
77
|
+
export declare function readTargetCorpus(sources: readonly string[], deferralTags: readonly string[],
|
|
68
78
|
/**
|
|
69
79
|
* The target's CONFIGURED ROWS (@SCN-LNT-018) — the CONVERTED route's half of the debit side. It
|
|
70
80
|
* reaches `parseScenarios`, which raises the Evidence Obligations, and `citedRow`, which reads a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targetCorpus.d.ts","sourceRoot":"","sources":["../../src/parse/targetCorpus.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"targetCorpus.d.ts","sourceRoot":"","sources":["../../src/parse/targetCorpus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAOhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB;;;;;;OAMG;IACH,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,cAAc,GAAG,IAAI,CAAC;IAClE;;;;;;;;OAQG;IACH,4BAA4B,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD;;;;;;;;;;OAUG;IACH,sBAAsB,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC1D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,YAAY,EAAE,SAAS,MAAM,EAAE;AAC/B;;;;;GAKG;AACH,aAAa,EAAE,iBAAiB,GAC/B,YAAY,CAkBd"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The TARGET's feature corpus read into the
|
|
3
|
-
*
|
|
2
|
+
* The TARGET's feature corpus read into the readings one reconciliation needs — moved here from
|
|
3
|
+
* the app's ingest edge (3F-3088).
|
|
4
4
|
*
|
|
5
5
|
* WHY IT LIVES IN THE ENGINE. Every line of it is a pure function of sources somebody else already
|
|
6
|
-
* read off disk: the obligation rule
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* repairs. One line made it impure and it was the only one: the feature discovery, which now
|
|
6
|
+
* read off disk: the obligation rule is `parseScenarios`, core's own. Sitting at the app edge it
|
|
7
|
+
* was the reason a PUBLISHED module imported core's unpublished `/internal` subpath for five
|
|
8
|
+
* symbols — the fault 3F-3086 repairs. One line made it impure and it was the only one: the feature discovery, which now
|
|
10
9
|
* happens at the edge and arrives as `sources`.
|
|
11
10
|
*
|
|
12
11
|
* THE REGISTRY-KEYED READING THIS FILE ONCE ALSO PRODUCED — `checkHandles` and `citedScn`, the
|
|
@@ -15,9 +14,8 @@
|
|
|
15
14
|
* (`citedRow`, below) or is a converted `@fitness` row read through `domain/fitnessChecks`
|
|
16
15
|
* directly; there is no second discovery left to key a handle set off.
|
|
17
16
|
*/
|
|
18
|
-
import { measuredCheckTags } from "../domain/thresholds.js";
|
|
19
17
|
import { citationOfCitedRow } from "./fitnessCitations.js";
|
|
20
|
-
import { parseScenarios, parseTaggedScenarios, unconfiguredFitnessScenarios } from "./scenarios.js";
|
|
18
|
+
import { parseScenarios, parseTaggedScenarios, unconfiguredFitnessScenarios, unspecifiedFitnessRows, } from "./scenarios.js";
|
|
21
19
|
/**
|
|
22
20
|
* THE SOURCES ARRIVE READ, AND THAT IS THE WHOLE OF WHAT MOVED. The edge discovers the target's
|
|
23
21
|
* feature files and reads them ONCE, so the reading a citing run needs is still taken from the same
|
|
@@ -26,7 +24,7 @@ import { parseScenarios, parseTaggedScenarios, unconfiguredFitnessScenarios } fr
|
|
|
26
24
|
* preserves that guarantee where a features directory would have re-opened the question inside the
|
|
27
25
|
* engine.
|
|
28
26
|
*/
|
|
29
|
-
export function readTargetCorpus(sources, deferralTags,
|
|
27
|
+
export function readTargetCorpus(sources, deferralTags,
|
|
30
28
|
/**
|
|
31
29
|
* The target's CONFIGURED ROWS (@SCN-LNT-018) — the CONVERTED route's half of the debit side. It
|
|
32
30
|
* reaches `parseScenarios`, which raises the Evidence Obligations, and `citedRow`, which reads a
|
|
@@ -34,21 +32,20 @@ export function readTargetCorpus(sources, deferralTags, thresholds,
|
|
|
34
32
|
* which is the whole reason this reading is composed here.
|
|
35
33
|
*/
|
|
36
34
|
fitnessChecks) {
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
//
|
|
45
|
-
// citation hop that once shared it retired with the registry, so there is only the one reader
|
|
46
|
-
// left to hand it to.
|
|
35
|
+
// NO BARE CHECK TAG RAISES AN OBLIGATION ON A TARGET'S CORPUS. The registered half of the
|
|
36
|
+
// union retired with the registry (3F-3161) and the measured half with the measured axis
|
|
37
|
+
// (3F-3516), so the bare-tag set handed to `parseScenarios` is empty: a fitness obligation is
|
|
38
|
+
// raised by the axis word and a configured row, and by nothing else.
|
|
39
|
+
const scenarios = sources.flatMap((source) => parseScenarios(source, deferralTags, [], fitnessChecks));
|
|
40
|
+
// THE TAGGED WALK THE TWO CORPUS-VS-MANIFEST READINGS SHARE. Kept as its own pass over the
|
|
41
|
+
// sources, and handed to BOTH of them — the disagreement each names is the other's direction, so
|
|
42
|
+
// taking them from one walk is what stops one reading seeing a scenario the other does not.
|
|
47
43
|
const tagged = sources.flatMap((source) => parseTaggedScenarios(source));
|
|
48
44
|
return {
|
|
49
45
|
scenarios,
|
|
50
46
|
citedRow: (citedScn) => citationOfCitedRow(citedScn, fitnessChecks),
|
|
51
47
|
unconfiguredFitnessScenarios: unconfiguredFitnessScenarios(tagged, fitnessChecks),
|
|
48
|
+
unspecifiedFitnessRows: unspecifiedFitnessRows(tagged, fitnessChecks),
|
|
52
49
|
};
|
|
53
50
|
}
|
|
54
51
|
//# sourceMappingURL=targetCorpus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targetCorpus.js","sourceRoot":"","sources":["../../src/parse/targetCorpus.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"targetCorpus.js","sourceRoot":"","sources":["../../src/parse/targetCorpus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,kBAAkB,EAAuB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAqDxB;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAA0B,EAC1B,YAA+B;AAC/B;;;;;GAKG;AACH,aAAgC;IAEhC,0FAA0F;IAC1F,yFAAyF;IACzF,8FAA8F;IAC9F,qEAAqE;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,CAAC,CACxD,CAAC;IACF,2FAA2F;IAC3F,iGAAiG;IACjG,4FAA4F;IAC5F,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IACzE,OAAO;QACL,SAAS;QACT,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,aAAa,CAAC;QACnE,4BAA4B,EAAE,4BAA4B,CAAC,MAAM,EAAE,aAAa,CAAC;QACjF,sBAAsB,EAAE,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC;KACtE,CAAC;AACJ,CAAC"}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The TARGET's `specController.*` configuration, read into the rows
|
|
2
|
+
* The TARGET's `specController.*` configuration, read into the rows and mints the
|
|
3
3
|
* reconciler takes — the `resolve*` family, moved here from the app's ingest edge (3F-3087).
|
|
4
4
|
*
|
|
5
5
|
* WHY THEY LIVE IN THE ENGINE. Every one of them is a pure function of a manifest object
|
|
6
6
|
* somebody else already read off disk, and every one of them is the ONE reading of the key it
|
|
7
|
-
* names — `
|
|
7
|
+
* names — `fitnessChecksOf` and `bareTerm` are both core's, so the reader and the
|
|
8
8
|
* thing it reads through belonged on the same side of the package boundary. Sitting at the app
|
|
9
9
|
* edge they were the reason a PUBLISHED module imported core's unpublished `/internal` subpath,
|
|
10
10
|
* which is the fault 3F-3086 repairs; nothing about reading a parsed manifest ever needed the
|
|
11
11
|
* edge that produced it.
|
|
12
12
|
*
|
|
13
|
-
* WHAT THE EDGE STILL OWES THEM, AND WHY IT IS A PARAMETER.
|
|
13
|
+
* WHAT THE EDGE STILL OWES THEM, AND WHY IT IS A PARAMETER. One of these readings depends on
|
|
14
14
|
* something the engine must not know: the deferral-tag STARTER SET is product policy the
|
|
15
|
-
* application layer single-sources (`DEFAULT_DEFERRAL_TAGS`)
|
|
16
|
-
*
|
|
17
|
-
* set as data, the record as a `KillFloorReader` closure the edge builds — so the engine keeps
|
|
18
|
-
* knowing nothing about files, records or ratchets (`lint:boundaries`' `core-imports-io` rule,
|
|
15
|
+
* application layer single-sources (`DEFAULT_DEFERRAL_TAGS`). It arrives as an argument, as data,
|
|
16
|
+
* so the engine keeps knowing nothing about files (`lint:boundaries`' `core-imports-io` rule,
|
|
19
17
|
* which was @SCN-EPG-001's `io-import` arm until 3F-3437; and 3F-2841's pattern: a project-owned
|
|
20
18
|
* term arrives as an input).
|
|
21
19
|
*
|
|
@@ -24,7 +22,6 @@
|
|
|
24
22
|
* malformed entry is dropped by the reading function it is handed to rather than thrown. A check
|
|
25
23
|
* that throws on a typo produces no verdict at all.
|
|
26
24
|
*/
|
|
27
|
-
import { type ThresholdIndex } from "../domain/thresholds.js";
|
|
28
25
|
import { type FitnessCheckIndex } from "../domain/fitnessChecks.js";
|
|
29
26
|
/**
|
|
30
27
|
* The steps the TARGET names NON-CHECKS (@SCN-USG-015, 3F-3343) — `specController.notChecks`, read
|
|
@@ -50,65 +47,6 @@ export declare function resolveNotChecks(packageJson: {
|
|
|
50
47
|
notChecks?: unknown;
|
|
51
48
|
};
|
|
52
49
|
}): readonly string[];
|
|
53
|
-
/**
|
|
54
|
-
* A bar naming a mutation gate rather than a figure.
|
|
55
|
-
*
|
|
56
|
-
* THE RECORD'S NAME MAY BE STATED AND OTHERWISE DEFAULTS, and the reason is whose the name is: the
|
|
57
|
-
* record belongs to whoever owns the record, so the conventional one stands in and a project filing
|
|
58
|
-
* its bars elsewhere writes it over.
|
|
59
|
-
*/
|
|
60
|
-
export interface MutationGateReference {
|
|
61
|
-
readonly mutationGate: string;
|
|
62
|
-
readonly recordFile?: string;
|
|
63
|
-
}
|
|
64
|
-
/** The kill floor a reference names, or `null` where the record cannot supply it. */
|
|
65
|
-
export type KillFloorReader = (reference: MutationGateReference) => number | null;
|
|
66
|
-
/**
|
|
67
|
-
* The TARGET's authored CEILINGS (@SCN-CIP-001) — `specController.thresholds`, read as
|
|
68
|
-
* `@SCN → bare check tag → ceiling` through the engine's own `thresholdsOf`.
|
|
69
|
-
*
|
|
70
|
-
* The DEBIT side of the measured fitness check, and the reason the axis can reconcile at all. A
|
|
71
|
-
* static check decides pass from fail itself; a measured one produces a number, and the bar that
|
|
72
|
-
* number is held against has to come from somewhere the run cannot reach — otherwise the runner
|
|
73
|
-
* grades its own homework and the ledger transcribes a verdict rather than reconciling one.
|
|
74
|
-
*
|
|
75
|
-
* IT IS THE TARGET'S, for the same reason the registry is (@SCN-LNT-005): a suite's acceptable
|
|
76
|
-
* wall-clock is a property of the repository being reconciled and of the runner class it runs on,
|
|
77
|
-
* never of the tool doing the reconciling. Read from `--package-json` alongside the scripts, the CI
|
|
78
|
-
* config and the registry, so every input to a target's verdict came from that target.
|
|
79
|
-
*
|
|
80
|
-
* The third of this family's `specController.*` resolvers, and defensive like the two above it: a
|
|
81
|
-
* missing, non-object or array-shaped config resolves EMPTY, and a malformed entry is dropped by
|
|
82
|
-
* `thresholdsOf` rather than thrown. There is no starter set: a ceiling the target did not write
|
|
83
|
-
* would hold its suites to a bar nobody chose.
|
|
84
|
-
*
|
|
85
|
-
* AND A BAR MAY NAME A MUTATION GATE INSTEAD OF A FIGURE (@SCN-MUT-012, 3F-2788). A number in a
|
|
86
|
-
* manifest is a number somebody has to re-derive after every sweep that moves it. So the VALUE may
|
|
87
|
-
* be a reference to a gate whose record already holds the counts, and it is substituted for that
|
|
88
|
-
* gate's kill floor HERE — before `thresholdsOf` is called, so what reaches the index is the
|
|
89
|
-
* number it has always taken. THE READER IS INJECTED, which is what keeps the engine knowing
|
|
90
|
-
* nothing about records, gates or YAML now that the substitution lives inside it: the app edge
|
|
91
|
-
* opens the target's record and hands in a closure, and this function only ever asks it for a
|
|
92
|
-
* number (3F-3087).
|
|
93
|
-
*
|
|
94
|
-
* AND A REFERENCE THIS CANNOT SOURCE LEAVES NO BAR, NEVER A NUMBER (@SCN-MUT-013). A reference is a
|
|
95
|
-
* bar living in a second file, so it can go missing four ways a typed one never could — and each
|
|
96
|
-
* has a lenient reading that hands back a green nobody earned. All four are refused the same way,
|
|
97
|
-
* which is `barOf`'s own way with an entry it cannot read: the key survives with nothing beside it,
|
|
98
|
-
* so the check stays MEASURED and the complaint arrives from the missing-bar arm (@SCN-CIP-002)
|
|
99
|
-
* rather than from the tag grammar, about a check nobody wrote.
|
|
100
|
-
*/
|
|
101
|
-
export declare function resolveThresholds(packageJson: {
|
|
102
|
-
specController?: {
|
|
103
|
-
thresholds?: unknown;
|
|
104
|
-
};
|
|
105
|
-
},
|
|
106
|
-
/**
|
|
107
|
-
* The reader over the TARGET's records, built by the edge that knows where that tree is
|
|
108
|
-
* (@SCN-LNT-005). One reader per resolution pass, so a manifest naming several gates of one
|
|
109
|
-
* record reads that record once.
|
|
110
|
-
*/
|
|
111
|
-
killFloor: KillFloorReader): ThresholdIndex;
|
|
112
50
|
/**
|
|
113
51
|
* Resolve the recognised deferral-tag set for the target (@SCN-PND-021) — the app's single-sourced
|
|
114
52
|
* starter set EXTENDED by the target `package.json`'s `specController.deferralTags`. Config
|
|
@@ -145,29 +83,12 @@ starterTags: readonly string[]): readonly string[];
|
|
|
145
83
|
* missing or wrongly-shaped config resolves EMPTY, and a malformed row is dropped by
|
|
146
84
|
* `fitnessChecksOf` rather than thrown. There is no starter set: a target that has converted
|
|
147
85
|
* nothing owes nothing on this route, which is what keeps the reading inert on an unswept corpus.
|
|
148
|
-
*
|
|
149
|
-
* AND A ROW'S BAR MAY NAME A MUTATION GATE INSTEAD OF A FIGURE, EXACTLY AS A THRESHOLD ENTRY'S MAY
|
|
150
|
-
* (@SCN-MUT-012, 3F-3152). The row is the second place a target can author a bar, so it is the
|
|
151
|
-
* second place the same substitution has to happen — through the SAME reader and the same
|
|
152
|
-
* value-only, direction-blind replacement `resolveThresholds` calls, applied to the row before
|
|
153
|
-
* `fitnessChecksOf` reads it. A converted row and a threshold entry cannot then come to disagree
|
|
154
|
-
* about what a target wrote, which is the argument `fitnessCheckOf` already makes for reading the
|
|
155
|
-
* bar through `barOf` rather than through a grammar of its own.
|
|
156
|
-
*
|
|
157
|
-
* A REFERENCE THIS CANNOT SOURCE STILL LEAVES NO BAR, NEVER A NUMBER (@SCN-MUT-013). What comes
|
|
158
|
-
* back is `null` beside the key, which is what keeps the row MEASURED with nothing to hold it to —
|
|
159
|
-
* the shape @SCN-CIP-002 reports, and the same reading the threshold route reaches.
|
|
160
86
|
*/
|
|
161
87
|
export declare function resolveFitnessChecks(packageJson: {
|
|
162
88
|
specController?: {
|
|
163
89
|
fitnessChecks?: unknown;
|
|
164
90
|
};
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* The reader over the TARGET's records, built by the edge that knows where that tree is
|
|
168
|
-
* (@SCN-LNT-005) — the same argument `resolveThresholds` takes, for the same reason.
|
|
169
|
-
*/
|
|
170
|
-
killFloor: KillFloorReader): FitnessCheckIndex;
|
|
91
|
+
}): FitnessCheckIndex;
|
|
171
92
|
/**
|
|
172
93
|
* WHAT A TARGET'S RUNNER BLOCK YIELDED — the entries keyed by a canon tier, and the keys that are
|
|
173
94
|
* not one (@SCN-USG-019).
|
|
@@ -235,6 +156,10 @@ export declare function resolveRunners(packageJson: {
|
|
|
235
156
|
runners?: unknown;
|
|
236
157
|
};
|
|
237
158
|
}): ResolvedRunners;
|
|
159
|
+
/**
|
|
160
|
+
* ONE ACCOUNT FOR BOTH KINDS, in the order the manifest wrote them: a retired top-level key names
|
|
161
|
+
* itself, and `fitnessChecks` names each bar its rows still carry.
|
|
162
|
+
*/
|
|
238
163
|
export declare function resolveRetiredKeys(packageJson: {
|
|
239
164
|
specController?: unknown;
|
|
240
165
|
}): readonly string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targetManifest.d.ts","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"targetManifest.d.ts","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAWrF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE;IAC5C,cAAc,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,GAAG,SAAS,MAAM,EAAE,CAIpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE;IACX,cAAc,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC7C;AACD,6FAA6F;AAC7F,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,SAAS,MAAM,EAAE,CAcnB;AAGD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE;IAChD,cAAc,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC9C,GAAG,iBAAiB,CAEpB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,uGAAuG;IACvG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,uGAAuG;IACvG,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE;IAC1C,cAAc,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACxC,GAAG,eAAe,CAclB;AAiDD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,MAAM,EAAE,CAO/F"}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The TARGET's `specController.*` configuration, read into the rows
|
|
2
|
+
* The TARGET's `specController.*` configuration, read into the rows and mints the
|
|
3
3
|
* reconciler takes — the `resolve*` family, moved here from the app's ingest edge (3F-3087).
|
|
4
4
|
*
|
|
5
5
|
* WHY THEY LIVE IN THE ENGINE. Every one of them is a pure function of a manifest object
|
|
6
6
|
* somebody else already read off disk, and every one of them is the ONE reading of the key it
|
|
7
|
-
* names — `
|
|
7
|
+
* names — `fitnessChecksOf` and `bareTerm` are both core's, so the reader and the
|
|
8
8
|
* thing it reads through belonged on the same side of the package boundary. Sitting at the app
|
|
9
9
|
* edge they were the reason a PUBLISHED module imported core's unpublished `/internal` subpath,
|
|
10
10
|
* which is the fault 3F-3086 repairs; nothing about reading a parsed manifest ever needed the
|
|
11
11
|
* edge that produced it.
|
|
12
12
|
*
|
|
13
|
-
* WHAT THE EDGE STILL OWES THEM, AND WHY IT IS A PARAMETER.
|
|
13
|
+
* WHAT THE EDGE STILL OWES THEM, AND WHY IT IS A PARAMETER. One of these readings depends on
|
|
14
14
|
* something the engine must not know: the deferral-tag STARTER SET is product policy the
|
|
15
|
-
* application layer single-sources (`DEFAULT_DEFERRAL_TAGS`)
|
|
16
|
-
*
|
|
17
|
-
* set as data, the record as a `KillFloorReader` closure the edge builds — so the engine keeps
|
|
18
|
-
* knowing nothing about files, records or ratchets (`lint:boundaries`' `core-imports-io` rule,
|
|
15
|
+
* application layer single-sources (`DEFAULT_DEFERRAL_TAGS`). It arrives as an argument, as data,
|
|
16
|
+
* so the engine keeps knowing nothing about files (`lint:boundaries`' `core-imports-io` rule,
|
|
19
17
|
* which was @SCN-EPG-001's `io-import` arm until 3F-3437; and 3F-2841's pattern: a project-owned
|
|
20
18
|
* term arrives as an input).
|
|
21
19
|
*
|
|
@@ -25,7 +23,6 @@
|
|
|
25
23
|
* that throws on a typo produces no verdict at all.
|
|
26
24
|
*/
|
|
27
25
|
import { bareTerm } from "../lib/bareTerm.js";
|
|
28
|
-
import { thresholdsOf } from "../domain/thresholds.js";
|
|
29
26
|
import { fitnessChecksOf } from "../domain/fitnessChecks.js";
|
|
30
27
|
// THE FOUR CANON TIERS, read from the ledger's own enumeration rather than restated here
|
|
31
28
|
// (@SCN-USG-019). A second list of the same four would agree by coincidence, and this axis's
|
|
@@ -60,107 +57,6 @@ export function resolveNotChecks(packageJson) {
|
|
|
60
57
|
return [];
|
|
61
58
|
return [...new Set(configured.filter((entry) => typeof entry === "string"))];
|
|
62
59
|
}
|
|
63
|
-
/** The reference a manifest value states, or `null` where it states none. */
|
|
64
|
-
function gateReferenceOf(value) {
|
|
65
|
-
if (!isBlock(value))
|
|
66
|
-
return null;
|
|
67
|
-
const gate = value["mutationGate"];
|
|
68
|
-
if (typeof gate !== "string" || gate.trim() === "")
|
|
69
|
-
return null;
|
|
70
|
-
const recordFile = value["recordFile"];
|
|
71
|
-
return typeof recordFile === "string"
|
|
72
|
-
? { mutationGate: gate, recordFile }
|
|
73
|
-
: { mutationGate: gate };
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* One check's entry with any gate reference in it replaced by the number that gate's record implies.
|
|
77
|
-
*
|
|
78
|
-
* VALUE-ONLY AND DIRECTION-BLIND. The key beside the number is the comparison, and this reads none
|
|
79
|
-
* of them: a ceiling naming a gate resolves exactly as a floor does. The engine has no opinion
|
|
80
|
-
* about which checks are floors (@SCN-LNT-005), so a target authoring a mutation ceiling is wrong
|
|
81
|
-
* out loud rather than quietly overruled here.
|
|
82
|
-
*/
|
|
83
|
-
function barWithGateResolved(bar, killFloor) {
|
|
84
|
-
if (!isBlock(bar))
|
|
85
|
-
return bar;
|
|
86
|
-
const resolved = {};
|
|
87
|
-
for (const [key, value] of Object.entries(bar)) {
|
|
88
|
-
const reference = gateReferenceOf(value);
|
|
89
|
-
// `null` where the record could not supply the floor — the value the engine already reads as
|
|
90
|
-
// no bar, so a reference this could not source is indistinguishable downstream from an entry
|
|
91
|
-
// nobody could read. What must never be written here is a number of this reader's choosing.
|
|
92
|
-
resolved[key] = reference === null ? value : killFloor(reference);
|
|
93
|
-
}
|
|
94
|
-
return resolved;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* The manifest's threshold entries, with every gate reference in them substituted.
|
|
98
|
-
*
|
|
99
|
-
* NO RECORD IS OPENED FOR A MANIFEST THAT NAMES NO GATE, which is what keeps this inert for every
|
|
100
|
-
* target that has never banked one — the two live `@ci-run-time` ceilings included.
|
|
101
|
-
*/
|
|
102
|
-
function withGateReferencesResolved(entries, killFloor) {
|
|
103
|
-
const resolved = {};
|
|
104
|
-
for (const [scnKey, checks] of Object.entries(entries)) {
|
|
105
|
-
if (!isBlock(checks)) {
|
|
106
|
-
resolved[scnKey] = checks;
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
const bars = {};
|
|
110
|
-
for (const [checkKey, bar] of Object.entries(checks)) {
|
|
111
|
-
bars[checkKey] = barWithGateResolved(bar, killFloor);
|
|
112
|
-
}
|
|
113
|
-
resolved[scnKey] = bars;
|
|
114
|
-
}
|
|
115
|
-
return resolved;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* The TARGET's authored CEILINGS (@SCN-CIP-001) — `specController.thresholds`, read as
|
|
119
|
-
* `@SCN → bare check tag → ceiling` through the engine's own `thresholdsOf`.
|
|
120
|
-
*
|
|
121
|
-
* The DEBIT side of the measured fitness check, and the reason the axis can reconcile at all. A
|
|
122
|
-
* static check decides pass from fail itself; a measured one produces a number, and the bar that
|
|
123
|
-
* number is held against has to come from somewhere the run cannot reach — otherwise the runner
|
|
124
|
-
* grades its own homework and the ledger transcribes a verdict rather than reconciling one.
|
|
125
|
-
*
|
|
126
|
-
* IT IS THE TARGET'S, for the same reason the registry is (@SCN-LNT-005): a suite's acceptable
|
|
127
|
-
* wall-clock is a property of the repository being reconciled and of the runner class it runs on,
|
|
128
|
-
* never of the tool doing the reconciling. Read from `--package-json` alongside the scripts, the CI
|
|
129
|
-
* config and the registry, so every input to a target's verdict came from that target.
|
|
130
|
-
*
|
|
131
|
-
* The third of this family's `specController.*` resolvers, and defensive like the two above it: a
|
|
132
|
-
* missing, non-object or array-shaped config resolves EMPTY, and a malformed entry is dropped by
|
|
133
|
-
* `thresholdsOf` rather than thrown. There is no starter set: a ceiling the target did not write
|
|
134
|
-
* would hold its suites to a bar nobody chose.
|
|
135
|
-
*
|
|
136
|
-
* AND A BAR MAY NAME A MUTATION GATE INSTEAD OF A FIGURE (@SCN-MUT-012, 3F-2788). A number in a
|
|
137
|
-
* manifest is a number somebody has to re-derive after every sweep that moves it. So the VALUE may
|
|
138
|
-
* be a reference to a gate whose record already holds the counts, and it is substituted for that
|
|
139
|
-
* gate's kill floor HERE — before `thresholdsOf` is called, so what reaches the index is the
|
|
140
|
-
* number it has always taken. THE READER IS INJECTED, which is what keeps the engine knowing
|
|
141
|
-
* nothing about records, gates or YAML now that the substitution lives inside it: the app edge
|
|
142
|
-
* opens the target's record and hands in a closure, and this function only ever asks it for a
|
|
143
|
-
* number (3F-3087).
|
|
144
|
-
*
|
|
145
|
-
* AND A REFERENCE THIS CANNOT SOURCE LEAVES NO BAR, NEVER A NUMBER (@SCN-MUT-013). A reference is a
|
|
146
|
-
* bar living in a second file, so it can go missing four ways a typed one never could — and each
|
|
147
|
-
* has a lenient reading that hands back a green nobody earned. All four are refused the same way,
|
|
148
|
-
* which is `barOf`'s own way with an entry it cannot read: the key survives with nothing beside it,
|
|
149
|
-
* so the check stays MEASURED and the complaint arrives from the missing-bar arm (@SCN-CIP-002)
|
|
150
|
-
* rather than from the tag grammar, about a check nobody wrote.
|
|
151
|
-
*/
|
|
152
|
-
export function resolveThresholds(packageJson,
|
|
153
|
-
/**
|
|
154
|
-
* The reader over the TARGET's records, built by the edge that knows where that tree is
|
|
155
|
-
* (@SCN-LNT-005). One reader per resolution pass, so a manifest naming several gates of one
|
|
156
|
-
* record reads that record once.
|
|
157
|
-
*/
|
|
158
|
-
killFloor) {
|
|
159
|
-
const configured = packageJson.specController?.thresholds;
|
|
160
|
-
if (!isBlock(configured))
|
|
161
|
-
return thresholdsOf({});
|
|
162
|
-
return thresholdsOf(withGateReferencesResolved(configured, killFloor));
|
|
163
|
-
}
|
|
164
60
|
/**
|
|
165
61
|
* Resolve the recognised deferral-tag set for the target (@SCN-PND-021) — the app's single-sourced
|
|
166
62
|
* starter set EXTENDED by the target `package.json`'s `specController.deferralTags`. Config
|
|
@@ -207,29 +103,9 @@ starterTags) {
|
|
|
207
103
|
* missing or wrongly-shaped config resolves EMPTY, and a malformed row is dropped by
|
|
208
104
|
* `fitnessChecksOf` rather than thrown. There is no starter set: a target that has converted
|
|
209
105
|
* nothing owes nothing on this route, which is what keeps the reading inert on an unswept corpus.
|
|
210
|
-
*
|
|
211
|
-
* AND A ROW'S BAR MAY NAME A MUTATION GATE INSTEAD OF A FIGURE, EXACTLY AS A THRESHOLD ENTRY'S MAY
|
|
212
|
-
* (@SCN-MUT-012, 3F-3152). The row is the second place a target can author a bar, so it is the
|
|
213
|
-
* second place the same substitution has to happen — through the SAME reader and the same
|
|
214
|
-
* value-only, direction-blind replacement `resolveThresholds` calls, applied to the row before
|
|
215
|
-
* `fitnessChecksOf` reads it. A converted row and a threshold entry cannot then come to disagree
|
|
216
|
-
* about what a target wrote, which is the argument `fitnessCheckOf` already makes for reading the
|
|
217
|
-
* bar through `barOf` rather than through a grammar of its own.
|
|
218
|
-
*
|
|
219
|
-
* A REFERENCE THIS CANNOT SOURCE STILL LEAVES NO BAR, NEVER A NUMBER (@SCN-MUT-013). What comes
|
|
220
|
-
* back is `null` beside the key, which is what keeps the row MEASURED with nothing to hold it to —
|
|
221
|
-
* the shape @SCN-CIP-002 reports, and the same reading the threshold route reaches.
|
|
222
|
-
*/
|
|
223
|
-
export function resolveFitnessChecks(packageJson,
|
|
224
|
-
/**
|
|
225
|
-
* The reader over the TARGET's records, built by the edge that knows where that tree is
|
|
226
|
-
* (@SCN-LNT-005) — the same argument `resolveThresholds` takes, for the same reason.
|
|
227
106
|
*/
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if (!Array.isArray(configured))
|
|
231
|
-
return fitnessChecksOf(configured);
|
|
232
|
-
return fitnessChecksOf(configured.map((row) => barWithGateResolved(row, killFloor)));
|
|
107
|
+
export function resolveFitnessChecks(packageJson) {
|
|
108
|
+
return fitnessChecksOf(packageJson.specController?.fitnessChecks);
|
|
233
109
|
}
|
|
234
110
|
/**
|
|
235
111
|
* The TARGET's BEHAVIOURAL RUNNERS (@SCN-USG-011, 3F-3343) — `specController.runners`, read as
|
|
@@ -288,9 +164,9 @@ export function resolveRunners(packageJson) {
|
|
|
288
164
|
};
|
|
289
165
|
}
|
|
290
166
|
/**
|
|
291
|
-
* THE specController.* KEYS THIS READER HAS RETIRED (@SCN-USG-021, @SCN-USG-022) —
|
|
292
|
-
* keys a manifest carries whose reading this tool has removed, in the order the
|
|
293
|
-
* them.
|
|
167
|
+
* THE specController.* KEYS THIS READER HAS RETIRED (@SCN-USG-021, @SCN-USG-022, @SCN-USG-023) —
|
|
168
|
+
* the top-level keys a manifest carries whose reading this tool has removed, in the order the
|
|
169
|
+
* manifest wrote them.
|
|
294
170
|
*
|
|
295
171
|
* NAMED, NOT SILENTLY GONE. Retiring a route is not the same act as never having had one: a
|
|
296
172
|
* consumer who wrote `checkRegistry` once, when it was read, believes it still routes their
|
|
@@ -302,16 +178,50 @@ export function resolveRunners(packageJson) {
|
|
|
302
178
|
* retires once and is never re-read; the set only grows as this reader retires more of them
|
|
303
179
|
* (`checkRegistry` first, 3F-3398; `staticChecks` second, 3F-3399 — the tiebreak
|
|
304
180
|
* `parse/runningStaticChecks.ts`'s `handleOf` used to settle among several invoked scripts,
|
|
305
|
-
* 3F-3396 deleted
|
|
181
|
+
* 3F-3396 deleted; `thresholds` third, 3F-3517 — the ceilings the measured axis held a scenario
|
|
182
|
+
* to, 3F-3516 deleted).
|
|
306
183
|
*
|
|
307
184
|
* DEFENSIVE LIKE THE READERS ABOVE IT: a missing or non-object `specController` names no
|
|
308
185
|
* retired key, never throws.
|
|
309
186
|
*/
|
|
310
|
-
const RETIRED_SPEC_CONTROLLER_KEYS = ["checkRegistry", "staticChecks"];
|
|
187
|
+
const RETIRED_SPEC_CONTROLLER_KEYS = ["checkRegistry", "staticChecks", "thresholds"];
|
|
188
|
+
/**
|
|
189
|
+
* THE BAR A CONFIGURED ROW STILL CARRIES (@SCN-LNT-035) — the row-level keys this reader has
|
|
190
|
+
* retired, append-only like the top-level set above. Nothing reads a row's bar since 3F-3510: a
|
|
191
|
+
* row is credited by its own step's outcome, so a bar left on it holds the check to nothing. A
|
|
192
|
+
* `mutationGate` is a value of `atLeast`, so the key it sits under is what names it.
|
|
193
|
+
*
|
|
194
|
+
* NAMED WITH ITS ROW, `fitnessChecks[<@SCN>].<key>`, because a row-level key alone says nothing a
|
|
195
|
+
* consumer could find it by. A row stating no usable `@SCN` names no bar: the row reader drops it
|
|
196
|
+
* whole, and there is no handle to name its bar by.
|
|
197
|
+
*/
|
|
198
|
+
const RETIRED_ROW_KEYS = ["atLeast", "atMost"];
|
|
199
|
+
function retiredRowKeysOf(rows) {
|
|
200
|
+
if (!Array.isArray(rows))
|
|
201
|
+
return [];
|
|
202
|
+
return rows.flatMap((row) => {
|
|
203
|
+
if (!isBlock(row) || typeof row["scn"] !== "string")
|
|
204
|
+
return [];
|
|
205
|
+
const scnId = bareTerm(row["scn"]);
|
|
206
|
+
if (scnId === "")
|
|
207
|
+
return [];
|
|
208
|
+
return Object.keys(row)
|
|
209
|
+
.filter((key) => RETIRED_ROW_KEYS.includes(key))
|
|
210
|
+
.map((key) => `fitnessChecks[${scnId}].${key}`);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* ONE ACCOUNT FOR BOTH KINDS, in the order the manifest wrote them: a retired top-level key names
|
|
215
|
+
* itself, and `fitnessChecks` names each bar its rows still carry.
|
|
216
|
+
*/
|
|
311
217
|
export function resolveRetiredKeys(packageJson) {
|
|
312
218
|
const configured = packageJson.specController;
|
|
313
219
|
if (!isBlock(configured))
|
|
314
220
|
return [];
|
|
315
|
-
return Object.
|
|
221
|
+
return Object.entries(configured).flatMap(([key, value]) => {
|
|
222
|
+
if (key === "fitnessChecks")
|
|
223
|
+
return retiredRowKeysOf(value);
|
|
224
|
+
return RETIRED_SPEC_CONTROLLER_KEYS.includes(key) ? [key] : [];
|
|
225
|
+
});
|
|
316
226
|
}
|
|
317
227
|
//# sourceMappingURL=targetManifest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targetManifest.js","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"targetManifest.js","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,17 +15,15 @@
|
|
|
15
15
|
*/
|
|
16
16
|
/**
|
|
17
17
|
* The CLI input paths/flags actually used for a run — each optional; only the ones
|
|
18
|
-
* the operator supplied are present.
|
|
19
|
-
* --
|
|
18
|
+
* the operator supplied are present. The same --features/--vitest/--cucumber/--ci/
|
|
19
|
+
* --package-json/--ci-steps seams as the CLI's ReconcileOptions.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* silence was ambiguous between "the run never got it" and "the run got it and the block
|
|
28
|
-
* does not say so".
|
|
21
|
+
* The converted checks' credit stream joined the interface at 3F-3184 (@SCN-RPT-027). It was
|
|
22
|
+
* ALREADY flowing through it: `reconcileInputsOf` builds one ReconcileOptions and that same
|
|
23
|
+
* object is assigned to `ctx.inputs`, so structural typing let the stream ride along unseen and
|
|
24
|
+
* the block simply never named it. It is optional by design — passed only where the file
|
|
25
|
+
* exists — which is exactly why its silence was ambiguous between "the run never got it" and
|
|
26
|
+
* "the run got it and the block does not say so".
|
|
29
27
|
*/
|
|
30
28
|
export interface RunInputs {
|
|
31
29
|
features?: string;
|
|
@@ -33,7 +31,6 @@ export interface RunInputs {
|
|
|
33
31
|
cucumber?: string;
|
|
34
32
|
ci?: string;
|
|
35
33
|
packageJson?: string;
|
|
36
|
-
measurements?: string;
|
|
37
34
|
ciSteps?: string;
|
|
38
35
|
}
|
|
39
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/provenance/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH
|
|
1
|
+
{"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/provenance/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,MAAM,EAAE,SAAS,CAAC;IAClB,oEAAoE;IACpE,QAAQ,EAAE,IAAI,CAAC;IACf,sEAAsE;IACtE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAgBD,sFAAsF;AACtF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2GAA2G;IAC3G,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;;OAYG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AA2BD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2GAA2G;IAC3G,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,CAWlE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,eAAe,CAwB9E;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,eAAe,CAElE"}
|