spec-controller 0.1.0-alpha.1 → 0.1.0-alpha.3
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 +94 -0
- package/dist/cli-args.d.ts +73 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +114 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-balance/cli.d.ts +2 -19
- package/dist/cli-balance/cli.d.ts.map +1 -1
- package/dist/cli-balance/cli.js +76 -78
- package/dist/cli-balance/cli.js.map +1 -1
- package/dist/cli-balance/emit/writer.d.ts +1 -1
- package/dist/cli-registry.d.ts +35 -12
- package/dist/cli-registry.d.ts.map +1 -1
- package/dist/cli-registry.js +93 -33
- package/dist/cli-registry.js.map +1 -1
- package/dist/cli.d.ts +5 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -3
- package/dist/cli.js.map +1 -1
- package/dist/corpus/cli.d.ts +34 -0
- package/dist/corpus/cli.d.ts.map +1 -0
- package/dist/corpus/cli.js +128 -0
- package/dist/corpus/cli.js.map +1 -0
- package/dist/deferralTags.d.ts +1 -1
- package/dist/deferralTags.js +1 -1
- package/dist/ingest/gherkinValidation.d.ts +23 -0
- package/dist/ingest/gherkinValidation.d.ts.map +1 -1
- package/dist/ingest/gherkinValidation.js +27 -0
- package/dist/ingest/gherkinValidation.js.map +1 -1
- package/dist/ingest/ingestQualityChecks.d.ts +17 -2
- package/dist/ingest/ingestQualityChecks.d.ts.map +1 -1
- package/dist/ingest/ingestQualityChecks.js +94 -39
- package/dist/ingest/ingestQualityChecks.js.map +1 -1
- package/dist/ingest/ingestScenarios.d.ts +2 -1
- package/dist/ingest/ingestScenarios.d.ts.map +1 -1
- package/dist/ingest/ingestScenarios.js +32 -3
- package/dist/ingest/ingestScenarios.js.map +1 -1
- package/dist/mutation-ratchet/index.d.ts +36 -38
- package/dist/mutation-ratchet/index.d.ts.map +1 -1
- package/dist/mutation-ratchet/index.js +35 -37
- package/dist/mutation-ratchet/index.js.map +1 -1
- package/dist/mutation-ratchet/record.d.ts +21 -53
- package/dist/mutation-ratchet/record.d.ts.map +1 -1
- package/dist/mutation-ratchet/record.js +28 -44
- package/dist/mutation-ratchet/record.js.map +1 -1
- package/dist/mutation-ratchet/report.d.ts +31 -5
- package/dist/mutation-ratchet/report.d.ts.map +1 -1
- package/dist/mutation-ratchet/report.js +11 -3
- package/dist/mutation-ratchet/report.js.map +1 -1
- package/dist/run-management/resolveRunInputs.d.ts +24 -11
- package/dist/run-management/resolveRunInputs.d.ts.map +1 -1
- package/dist/run-management/resolveRunInputs.js +49 -13
- package/dist/run-management/resolveRunInputs.js.map +1 -1
- package/package.json +7 -2
- package/dist/mutation-ratchet/ratchet.d.ts +0 -129
- package/dist/mutation-ratchet/ratchet.d.ts.map +0 -1
- package/dist/mutation-ratchet/ratchet.js +0 -222
- package/dist/mutation-ratchet/ratchet.js.map +0 -1
- package/dist/mutation-ratchet/ratchetCli.d.ts +0 -57
- package/dist/mutation-ratchet/ratchetCli.d.ts.map +0 -1
- package/dist/mutation-ratchet/ratchetCli.js +0 -139
- package/dist/mutation-ratchet/ratchetCli.js.map +0 -1
- package/dist/mutation-ratchet/reconcile.d.ts +0 -82
- package/dist/mutation-ratchet/reconcile.d.ts.map +0 -1
- package/dist/mutation-ratchet/reconcile.js +0 -67
- package/dist/mutation-ratchet/reconcile.js.map +0 -1
- package/dist/mutation-ratchet/verdict.d.ts +0 -177
- package/dist/mutation-ratchet/verdict.d.ts.map +0 -1
- package/dist/mutation-ratchet/verdict.js +0 -387
- package/dist/mutation-ratchet/verdict.js.map +0 -1
|
@@ -82,4 +82,31 @@ export class UnreadableFeatureCorpusError extends Error {
|
|
|
82
82
|
this.errors = errors;
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* The corpus-level ABSENCE refusal (@SCN-CLI-017, 3F-3345) — sibling to the parse refusal above,
|
|
87
|
+
* and deliberately the same shape: the reader refuses ONCE, and each command decides what the
|
|
88
|
+
* refusal means for it.
|
|
89
|
+
*
|
|
90
|
+
* WHY A TYPED ERROR RATHER THAN AN EMPTY CORPUS. The obvious fix is for `discoverFeatures` to hand
|
|
91
|
+
* back `[]` when the directory is not there. Measured, that would ship a NEW false green in a
|
|
92
|
+
* second command: `spec-controller tags` reaches the same reader through `readCorpusInputs`, whose
|
|
93
|
+
* GENERIC catch is the only thing turning an absent corpus — and, since `tags` carries no
|
|
94
|
+
* `checkInputsExist`, a supplied-but-absent `--features` too — into `The corpus could not be
|
|
95
|
+
* read: …` at exit 2. Tolerance at the reader turns both into `tags: OK …` at exit 0, inside the
|
|
96
|
+
* slice whose whole purpose is killing a vacuous certification. Typed, both survive untouched:
|
|
97
|
+
* this IS an `Error`, so it still lands in that generic catch.
|
|
98
|
+
*
|
|
99
|
+
* IT CARRIES THE DIRECTORY because the report is owed the name of what it examined — "I found no
|
|
100
|
+
* record" and "I found no regression" must never wear one word (3F-2947), and a consumer told
|
|
101
|
+
* their corpus is empty deserves to know which directory was read to reach that.
|
|
102
|
+
*/
|
|
103
|
+
export class MissingFeatureCorpusError extends Error {
|
|
104
|
+
/** The directory that is not there — as resolved, so a reader can print the path examined. */
|
|
105
|
+
directory;
|
|
106
|
+
constructor(directory) {
|
|
107
|
+
super(`The feature corpus directory does not exist: ${directory}`);
|
|
108
|
+
this.name = "MissingFeatureCorpusError";
|
|
109
|
+
this.directory = directory;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
85
112
|
//# sourceMappingURL=gherkinValidation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gherkinValidation.js","sourceRoot":"","sources":["../../src/ingest/gherkinValidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUjD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACxD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,0BAA0B,EAAE,CAAC,CAAC;IAEhG,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0FAA0F;QAC1F,sFAAsF;QACtF,0FAA0F;QAC1F,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAC5C,MAAM,CAA+B;IAE9C,YAAY,MAAoC;QAC9C,KAAK,CACH;YACE,yEAAyE;YACzE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC;SAC5D,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"gherkinValidation.js","sourceRoot":"","sources":["../../src/ingest/gherkinValidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUjD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACxD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,0BAA0B,EAAE,CAAC,CAAC;IAEhG,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0FAA0F;QAC1F,sFAAsF;QACtF,0FAA0F;QAC1F,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAC5C,MAAM,CAA+B;IAE9C,YAAY,MAAoC;QAC9C,KAAK,CACH;YACE,yEAAyE;YACzE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC;SAC5D,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,8FAA8F;IACrF,SAAS,CAAS;IAE3B,YAAY,SAAiB;QAC3B,KAAK,CAAC,gDAAgD,SAAS,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -38,7 +38,7 @@ export declare function killFloorReaderFor(root: string): (reference: {
|
|
|
38
38
|
* The reconciler's resolved input paths — the CLI options threaded to the readers.
|
|
39
39
|
* Every path is optional; a missing result file is tolerated (its evidence is
|
|
40
40
|
* simply absent). `packageJson` is the EXTERNALLY-SPECIFIED package.json the static
|
|
41
|
-
*
|
|
41
|
+
* static-check reader reads `exists` from (the --package-json seam, @SCN-LNT-005):
|
|
42
42
|
* default the tool's own cwd `package.json`; set it to reconcile ANOTHER repo's
|
|
43
43
|
* static checks — required to render the historical watermelon correctly.
|
|
44
44
|
*/
|
|
@@ -54,6 +54,19 @@ export interface ReconcileOptions {
|
|
|
54
54
|
* it contributes nothing, and each measured obligation it would have answered reads `missing`.
|
|
55
55
|
*/
|
|
56
56
|
measurements?: string;
|
|
57
|
+
/**
|
|
58
|
+
* The CI RUN'S OWN RECORD of what each of its steps did (@SCN-LNT-021, @SCN-LNT-028) — the credit
|
|
59
|
+
* side of every CONVERTED fitness check, written by the consumer's own pipeline and by neither
|
|
60
|
+
* party to this reconciliation.
|
|
61
|
+
*
|
|
62
|
+
* KEPT APART FROM `ci` BECAUSE THE TWO DOCUMENTS ANSWER DIFFERENT QUESTIONS. The workflow FILE
|
|
63
|
+
* says a check is wired into this pipeline and which row its step cites — a fact about a
|
|
64
|
+
* repository, true between runs. This is one RUN's record: did it run this time, and what did it
|
|
65
|
+
* find. Optional like the other result files: a consumer whose pipeline dumps no record, or a
|
|
66
|
+
* local run with no pipeline at all, hands none, and the converted rows it would have answered
|
|
67
|
+
* read `missing`.
|
|
68
|
+
*/
|
|
69
|
+
ciSteps?: string;
|
|
57
70
|
}
|
|
58
71
|
/**
|
|
59
72
|
* The feature corpus's INTEGRITY CHECKPOINT (@SCN-CLI-016, 3F-1767) — validate every discovered
|
|
@@ -101,7 +114,9 @@ export declare function featureCorpusDuplicateScnIds(featuresDir: string | undef
|
|
|
101
114
|
* (markdown-only — the by-feature cut is markdown-only, so it is NOT serialised to JSON).
|
|
102
115
|
* Uncoded files (`featureCode === null`) are omitted, so the by-feature emitter falls
|
|
103
116
|
* back to the bare `FFF` for any id whose code no file registers. One-prefix-one-file holds
|
|
104
|
-
* by invariant (`
|
|
117
|
+
* by invariant (`corpusFaults` raises `duplicate-feature-code`, @SCN-STG-010), so the map is
|
|
118
|
+
* unambiguous. That invariant was `lintFeatureCodes`' until 3F-3313; it is the shipped command's
|
|
119
|
+
* now, which is the first time a CONSUMER of this reader has it too.
|
|
105
120
|
*/
|
|
106
121
|
export declare function readFeatureNames(featuresDir?: string): Map<string, string>;
|
|
107
122
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingestQualityChecks.d.ts","sourceRoot":"","sources":["../../src/ingest/ingestQualityChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,OAAO,
|
|
1
|
+
{"version":3,"file":"ingestQualityChecks.d.ts","sourceRoot":"","sources":["../../src/ingest/ingestQualityChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,qCAAqC,CAAC;AA+B7C,OAAO,KAAK,EAIV,sBAAsB,EACvB,MAAM,qCAAqC,CAAC;AAwD7C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAMX,CAAC,SAAS,EAAE;IAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,MAAM,GAAG,IAAI,CAc/F;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,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;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA8ED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,iBAAiB,EAAE,CAQ7F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAStF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAM1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAqB9E;AA2CD,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,sBAAsB,CAgE3E"}
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
* `package.json` to observe each fitness check the corpus cites.
|
|
14
14
|
*/
|
|
15
15
|
import { readFileSync, existsSync } from "node:fs";
|
|
16
|
-
import { join } from "node:path";
|
|
16
|
+
import { basename, join } from "node:path";
|
|
17
17
|
import { ciSourcePathsOf } from "./ciSourcePaths.js";
|
|
18
18
|
import { discoverFeatures } from "./ingestScenarios.js";
|
|
19
19
|
import { parseScenarios, countScnOccurrences, parseUntaggedScenarios, proseOnlyCodes, } from "@3f-consulting/spec-controller-core";
|
|
20
|
-
import { UnreadableFeatureCorpusError } from "./gherkinValidation.js";
|
|
20
|
+
import { MissingFeatureCorpusError, UnreadableFeatureCorpusError, } from "./gherkinValidation.js";
|
|
21
21
|
import { DEFAULT_DEFERRAL_TAGS } from "../deferralTags.js";
|
|
22
22
|
import { evidenceObligations, } from "@3f-consulting/spec-controller-core";
|
|
23
23
|
import { parseVitestEvidenceObservations, } from "@3f-consulting/spec-controller-core";
|
|
@@ -30,9 +30,11 @@ import { parseCucumberEvidenceObservations, } from "@3f-consulting/spec-controll
|
|
|
30
30
|
// their CALLER. What is left here is the reads: this edge opens the files and hands the bytes over.
|
|
31
31
|
import { evidenceReconciliationFromSources } from "@3f-consulting/spec-controller-core";
|
|
32
32
|
import { resolveTargetRoot } from "../run-management/resolveRunInputs.js";
|
|
33
|
-
// The
|
|
34
|
-
//
|
|
35
|
-
//
|
|
33
|
+
// The record reader, reached for the RECORD half of a bar that names a gate (@SCN-MUT-012): its
|
|
34
|
+
// conventional record name, its parser, and the floor a gate's own figures imply. Through the
|
|
35
|
+
// barrel, which is the surface a caller holds. (The directory is still spelled `mutation-ratchet`
|
|
36
|
+
// and the ratchet it was named for is deleted — 3F-3337 left the name standing rather than move a
|
|
37
|
+
// module inside a delete; filed as a finding.)
|
|
36
38
|
import { gateRecordFor, killFloorOf, MalformedRecordError, parseGateRecords, RECORD_FILE, } from "../mutation-ratchet/index.js";
|
|
37
39
|
/**
|
|
38
40
|
* The per-input FALLBACK quality-check for each JS-ecosystem result source — the
|
|
@@ -44,22 +46,21 @@ import { gateRecordFor, killFloorOf, MalformedRecordError, parseGateRecords, REC
|
|
|
44
46
|
const VITEST_QUALITY_CHECK = "unit";
|
|
45
47
|
const CUCUMBER_QUALITY_CHECK = "integration";
|
|
46
48
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* `guard:*` is AWTY's (four `guard:*` guards run in AWTY's CI). A third convention adds its
|
|
51
|
-
* prefix here; the core never assumes the set. No CLI override flag yet — that earns its place
|
|
52
|
-
* at a third ecosystem, not now (mirrors the VITEST_QUALITY_CHECK stance above).
|
|
53
|
-
* `qualityCheck: "lint"` (the static-check axis name) is unchanged — this is the script prefix,
|
|
54
|
-
* not the axis.
|
|
49
|
+
* THIS TOOL, RUN TO RECONCILE (@SCN-USG-014, 3F-3343) — the invocation whose step is the
|
|
50
|
+
* reconciler rather than one of the reconciled rows, SET at the CLI edge and injected into the
|
|
51
|
+
* core like the prefixes above and the workflow names below.
|
|
55
52
|
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
53
|
+
* HOW THIS PRODUCT IS INVOKED IS THIS LAYER'S FACT. `spec-controller` is the `bin` this package
|
|
54
|
+
* publishes and `balance` is the command that reconciles; the engine holds neither, and a core
|
|
55
|
+
* that assumed them would be asserting something about a command line it never sees.
|
|
56
|
+
*
|
|
57
|
+
* BOTH TOKENS, AND THE SECOND IS NOT DECORATION. This repository's own pipeline runs
|
|
58
|
+
* `pnpm spec-controller tags` beside its balance step — the same binary, doing something that is
|
|
59
|
+
* an ordinary step of the pipeline being reconciled — so an invocation naming the binary alone
|
|
60
|
+
* would take that step off the books. The comparison is whole, adjacent shell tokens
|
|
61
|
+
* (`parse/commandRuns`), so this names the reconciliation and nothing else the tool can do.
|
|
61
62
|
*/
|
|
62
|
-
const
|
|
63
|
+
const RECONCILER_INVOCATION = "spec-controller balance";
|
|
63
64
|
/**
|
|
64
65
|
* A refusal met with an absent bar rather than let out of this edge.
|
|
65
66
|
*
|
|
@@ -127,6 +128,41 @@ function readJsonIfPresent(path) {
|
|
|
127
128
|
return undefined;
|
|
128
129
|
return JSON.parse(readFileSync(path, "utf8"));
|
|
129
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* THE CORPUS `balance` READS — the shared discovery, with an ABSENT directory read as NO CORPUS
|
|
133
|
+
* (@SCN-CLI-017, 3F-3345). The single place this command opts in.
|
|
134
|
+
*
|
|
135
|
+
* `new-client` is a supported adoption state, not a degraded one, and most targets have no
|
|
136
|
+
* `features/` directory at all — so an absent DEFAULT corpus is the target's honest shape and
|
|
137
|
+
* `balance` reports on it. Left to escape it was a raw `ENOENT` landing on Node's default exit 1,
|
|
138
|
+
* the OUT-OF-BALANCE code, which is exactly the collision @SCN-CLI-014/015/016 closed on every
|
|
139
|
+
* other input, alive on the one path each new consumer is guaranteed to take.
|
|
140
|
+
*
|
|
141
|
+
* ONE HELPER, NOT FIVE CATCHES, and that is the whole reason it exists: five readers each doing
|
|
142
|
+
* this by hand is five chances for one to stay intolerant, and a run that reports on a corpus for
|
|
143
|
+
* four of its readings and throws on the fifth is worse than one that throws. The translation is
|
|
144
|
+
* also why `discoverFeatures` is not the place to be tolerant — see its own note, and
|
|
145
|
+
* `MissingFeatureCorpusError`'s: `tags` reaches the same reader and keeps refusing.
|
|
146
|
+
*
|
|
147
|
+
* IT IS `[]`, NOT A VERDICT. Zero rows is what @SCN-CLI-019 reads as NOTHING TO RECONCILE, and a
|
|
148
|
+
* corpus-less target that still has uncited credits keeps its suspense row and its exit 1
|
|
149
|
+
* (@SCN-CLI-020) — this reader says what it found, never what the run means.
|
|
150
|
+
*
|
|
151
|
+
* A supplied-but-absent `--features` never arrives here: `checkInputsExist` refuses it at the CLI
|
|
152
|
+
* edge, exit 2 (@SCN-CLI-002). The precedent is `ciSourcePathsOf`, which already answers an absent
|
|
153
|
+
* DEFAULT `.github/workflows` with `[]` for the same reason — the default finding nothing is a fact
|
|
154
|
+
* about the target, not a mistake by its author.
|
|
155
|
+
*/
|
|
156
|
+
function balanceCorpus(featuresDir) {
|
|
157
|
+
try {
|
|
158
|
+
return featuresDir !== undefined ? discoverFeatures(featuresDir) : discoverFeatures();
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
if (err instanceof MissingFeatureCorpusError)
|
|
162
|
+
return [];
|
|
163
|
+
throw err;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
130
166
|
/**
|
|
131
167
|
* The discovered feature corpus's SOURCES — read once so the two readings a citing run needs (the
|
|
132
168
|
* obligations, and the corpus hop's `check tag → @SCN`) are taken from the same bytes. Two
|
|
@@ -134,8 +170,7 @@ function readJsonIfPresent(path) {
|
|
|
134
170
|
* was not built from is exactly the phantom-row fault (@SCN-LNT-009).
|
|
135
171
|
*/
|
|
136
172
|
function featureSources(featuresDir) {
|
|
137
|
-
|
|
138
|
-
return features.map((f) => readFileSync(f.path, "utf8"));
|
|
173
|
+
return balanceCorpus(featuresDir).map((f) => readFileSync(f.path, "utf8"));
|
|
139
174
|
}
|
|
140
175
|
function scenariosFromFeatures(featuresDir, deferralTags = DEFAULT_DEFERRAL_TAGS) {
|
|
141
176
|
return featureSources(featuresDir).flatMap((source) => parseScenarios(source, deferralTags));
|
|
@@ -153,8 +188,7 @@ function scenariosFromFeatures(featuresDir, deferralTags = DEFAULT_DEFERRAL_TAGS
|
|
|
153
188
|
* where to go.
|
|
154
189
|
*/
|
|
155
190
|
function untaggedScenariosFromFeatures(featuresDir) {
|
|
156
|
-
|
|
157
|
-
return features.flatMap((f) => parseUntaggedScenarios(readFileSync(f.path, "utf8")).map((scenario) => `${f.slug}.feature : ${scenario}`));
|
|
191
|
+
return balanceCorpus(featuresDir).flatMap((f) => parseUntaggedScenarios(readFileSync(f.path, "utf8")).map((scenario) => `${f.slug}.feature : ${scenario}`));
|
|
158
192
|
}
|
|
159
193
|
/**
|
|
160
194
|
* The feature corpus's INTEGRITY CHECKPOINT (@SCN-CLI-016, 3F-1767) — validate every discovered
|
|
@@ -174,10 +208,7 @@ function untaggedScenariosFromFeatures(featuresDir) {
|
|
|
174
208
|
*/
|
|
175
209
|
export function featureCorpusParseErrors(featuresDir) {
|
|
176
210
|
try {
|
|
177
|
-
|
|
178
|
-
discoverFeatures(featuresDir);
|
|
179
|
-
else
|
|
180
|
-
discoverFeatures();
|
|
211
|
+
balanceCorpus(featuresDir);
|
|
181
212
|
return [];
|
|
182
213
|
}
|
|
183
214
|
catch (err) {
|
|
@@ -224,12 +255,13 @@ export function featureCorpusDuplicateScnIds(featuresDir) {
|
|
|
224
255
|
* (markdown-only — the by-feature cut is markdown-only, so it is NOT serialised to JSON).
|
|
225
256
|
* Uncoded files (`featureCode === null`) are omitted, so the by-feature emitter falls
|
|
226
257
|
* back to the bare `FFF` for any id whose code no file registers. One-prefix-one-file holds
|
|
227
|
-
* by invariant (`
|
|
258
|
+
* by invariant (`corpusFaults` raises `duplicate-feature-code`, @SCN-STG-010), so the map is
|
|
259
|
+
* unambiguous. That invariant was `lintFeatureCodes`' until 3F-3313; it is the shipped command's
|
|
260
|
+
* now, which is the first time a CONSUMER of this reader has it too.
|
|
228
261
|
*/
|
|
229
262
|
export function readFeatureNames(featuresDir) {
|
|
230
|
-
const features = featuresDir !== undefined ? discoverFeatures(featuresDir) : discoverFeatures();
|
|
231
263
|
const map = new Map();
|
|
232
|
-
for (const f of
|
|
264
|
+
for (const f of balanceCorpus(featuresDir)) {
|
|
233
265
|
if (f.featureCode !== null)
|
|
234
266
|
map.set(f.featureCode, f.slug);
|
|
235
267
|
}
|
|
@@ -246,7 +278,7 @@ export function readFeatureNames(featuresDir) {
|
|
|
246
278
|
* threaded to the renderers via `writeOutputs`; `runReconcile` stays unchanged.
|
|
247
279
|
*/
|
|
248
280
|
export function readEvidenceObligations(features) {
|
|
249
|
-
const featureFiles =
|
|
281
|
+
const featureFiles = balanceCorpus(features);
|
|
250
282
|
let raw = 0;
|
|
251
283
|
let scenarioCount = 0;
|
|
252
284
|
const untagged = [];
|
|
@@ -285,9 +317,9 @@ function parseRuntimeObservations(opts, root) {
|
|
|
285
317
|
}
|
|
286
318
|
export function runReconcile(opts) {
|
|
287
319
|
// Read the target's package.json ONCE — its `specController.*` config supplies the deferral-tag
|
|
288
|
-
// extension (@SCN-PND-021)
|
|
289
|
-
//
|
|
290
|
-
//
|
|
320
|
+
// extension (@SCN-PND-021) and the configured fitness rows, and its `scripts` back the `exists`
|
|
321
|
+
// read. The disk read stays at this impure edge; the engine takes the resolved values as
|
|
322
|
+
// injected params, staying pure.
|
|
291
323
|
const pkgPath = opts.packageJson ?? "package.json";
|
|
292
324
|
const packageJson = readJsonIfPresent(pkgPath) ?? {};
|
|
293
325
|
// The TARGET repo root — the credit locators are made relative to it, so a phantom-scenario row's
|
|
@@ -302,6 +334,12 @@ export function runReconcile(opts) {
|
|
|
302
334
|
// file-vs-directory distinction, so one flag stays one flag and an explicit file is still
|
|
303
335
|
// a narrowing (@SCN-USG-008).
|
|
304
336
|
const ciPath = opts.ci ?? ".github/workflows";
|
|
337
|
+
// RESOLVED ONCE, READ TWICE (@SCN-USG-015). The engine takes anonymous source strings and holds
|
|
338
|
+
// no filesystem, so the mapping from a step's source index back to the workflow file it came
|
|
339
|
+
// from is made HERE, where the paths are already in hand — `ciSourcePaths.ts` is explicit that
|
|
340
|
+
// keeping the core that way is the point. Resolving the list twice would be two chances for the
|
|
341
|
+
// bytes and the names to fall out of the order they are paired by.
|
|
342
|
+
const ciPaths = ciSourcePathsOf(ciPath);
|
|
305
343
|
return evidenceReconciliationFromSources({
|
|
306
344
|
// The corpus's bytes, read ONCE at this impure edge (3F-3088). The engine composes the three
|
|
307
345
|
// readings a citing run needs from this one array, so they cannot be assembled from two
|
|
@@ -311,14 +349,31 @@ export function runReconcile(opts) {
|
|
|
311
349
|
// names the FILE, which the discovery knows and a source string does not.
|
|
312
350
|
untaggedScenarios: untaggedScenariosFromFeatures(opts.features),
|
|
313
351
|
packageJson,
|
|
314
|
-
ciSources:
|
|
352
|
+
ciSources: ciPaths.map((path) => readFileSync(path, "utf8")),
|
|
353
|
+
// THE FILE, NOT THE PATH. A `notChecks` entry opens with the workflow's own name — `ci.yml`,
|
|
354
|
+
// `release.yml` — which is what a consumer reads at the head of their run log and the only
|
|
355
|
+
// half of the entry that does not come out of the workflow's own text. The directory it sits
|
|
356
|
+
// in is the caller's `--ci`, not the consumer's subject, so it is not part of what they write.
|
|
357
|
+
ciSourceNames: ciPaths.map((path) => basename(path)),
|
|
315
358
|
measurements: readJsonIfPresent(opts.measurements) ?? {},
|
|
359
|
+
// The CONVERTED checks' credit stream, read at this edge like every other report. Absent it is
|
|
360
|
+
// undefined rather than empty, and that distinction reaches the reader (@SCN-LNT-027): "no
|
|
361
|
+
// record" is a run nobody recorded, "a record holding nothing" is a run that recorded none of
|
|
362
|
+
// these steps, and those are opposite facts.
|
|
363
|
+
// STRUCTURALLY, NOT BY NAME, for the reason `measurements` above is read that way: this module
|
|
364
|
+
// travels in the tarball and reaches core through the PUBLIC barrel alone (3F-3086), and
|
|
365
|
+
// `CiStepRecord` is not on it. The shape is the document's, which is the consumer's, so what is
|
|
366
|
+
// written here is what the file holds rather than a contract owed to anyone.
|
|
367
|
+
ciStepRecord: readJsonIfPresent(opts.ciSteps),
|
|
316
368
|
runtimeObservations: parseRuntimeObservations(opts, root),
|
|
317
|
-
// The three things the engine's resolvers cannot hold, and each for its own reason: the
|
|
318
|
-
// deferral set
|
|
319
|
-
// reader opens a file on the
|
|
369
|
+
// The three things the engine's resolvers cannot hold, and each for its own reason: the
|
|
370
|
+
// starter deferral set is the application layer's own policy, how this tool is invoked to
|
|
371
|
+
// reconcile is a fact about this product's command line, and the reader opens a file on the
|
|
372
|
+
// target's tree. THE PREFIX SET USED TO SIT HERE AND IS GONE (@SCN-USG-004, 3F-3343): the
|
|
373
|
+
// engine no longer decides a check's membership by its name, so there is no convention left
|
|
374
|
+
// for this edge to own.
|
|
320
375
|
deferralTags: DEFAULT_DEFERRAL_TAGS,
|
|
321
|
-
|
|
376
|
+
reconcilerInvocation: RECONCILER_INVOCATION,
|
|
322
377
|
killFloor: killFloorReaderFor(root),
|
|
323
378
|
});
|
|
324
379
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingestQualityChecks.js","sourceRoot":"","sources":["../../src/ingest/ingestQualityChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ingestQualityChecks.js","sourceRoot":"","sources":["../../src/ingest/ingestQualityChecks.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* records (split out of the old spec/featureCodes.ts). The pure per-source
|
|
5
5
|
* parsers (extractFeatureCode / parseScenarioCodes) live here with their sole consumer;
|
|
6
6
|
* the `scnId → feature-code` grammar helper is engine-side (packages/core/src/lib/
|
|
7
|
-
* featureCode.ts); the duplicate-code lint is
|
|
7
|
+
* featureCode.ts); the duplicate-code lint is engine-side too since 3F-3313, as @SCN-STG-010 in
|
|
8
|
+
* parse/corpusFaults.ts, and no longer a private check under tests/checks/.
|
|
8
9
|
*
|
|
9
10
|
* The foundation, folded into the @LDG runtime spine.
|
|
10
11
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingestScenarios.d.ts","sourceRoot":"","sources":["../../src/ingest/ingestScenarios.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ingestScenarios.d.ts","sourceRoot":"","sources":["../../src/ingest/ingestScenarios.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAeH,iFAAiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mFAAmF;IACnF,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBhE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAc3D;AAwCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,iBAAiB,EAAE,CAkBjF"}
|
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
* records (split out of the old spec/featureCodes.ts). The pure per-source
|
|
5
5
|
* parsers (extractFeatureCode / parseScenarioCodes) live here with their sole consumer;
|
|
6
6
|
* the `scnId → feature-code` grammar helper is engine-side (packages/core/src/lib/
|
|
7
|
-
* featureCode.ts); the duplicate-code lint is
|
|
7
|
+
* featureCode.ts); the duplicate-code lint is engine-side too since 3F-3313, as @SCN-STG-010 in
|
|
8
|
+
* parse/corpusFaults.ts, and no longer a private check under tests/checks/.
|
|
8
9
|
*
|
|
9
10
|
* The foundation, folded into the @LDG runtime spine.
|
|
10
11
|
*/
|
|
11
12
|
import { readFileSync, readdirSync } from "node:fs";
|
|
12
13
|
import { join } from "node:path";
|
|
13
|
-
import { UnreadableFeatureCorpusError, parseErrorsIn } from "./gherkinValidation.js";
|
|
14
|
+
import { MissingFeatureCorpusError, UnreadableFeatureCorpusError, parseErrorsIn, } from "./gherkinValidation.js";
|
|
14
15
|
/** A code is valid when it is 2–5 uppercase alphanumerics. */
|
|
15
16
|
const CODE_PATTERN = /^[A-Z0-9]{2,5}$/;
|
|
16
17
|
/**
|
|
@@ -81,6 +82,34 @@ export function parseScenarioCodes(source) {
|
|
|
81
82
|
function featuresDir() {
|
|
82
83
|
return join(process.cwd(), "features");
|
|
83
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* List the corpus directory, REFUSING an absent one by name rather than by `ENOENT` (@SCN-CLI-017,
|
|
87
|
+
* 3F-3345).
|
|
88
|
+
*
|
|
89
|
+
* Absence stays a REFUSAL AT THE READER — what changed is that it is typed, so a caller can decide.
|
|
90
|
+
* `balance` opts in to reporting on a target that has no corpus (most targets have no `features/`
|
|
91
|
+
* at all, and `new-client` is a supported adoption state); `tags` keeps refusing, unedited, because
|
|
92
|
+
* a `MissingFeatureCorpusError` is still an `Error` and still lands in its generic catch. Returning
|
|
93
|
+
* `[]` here instead would make that decision for both, and measured it turns two named refusals
|
|
94
|
+
* into `tags: OK …` at exit 0.
|
|
95
|
+
*
|
|
96
|
+
* ONLY `ENOENT`. A `features` path that exists but is a FILE, or one the process may not read, is
|
|
97
|
+
* a different fault and is not ours to reinterpret — it rethrows.
|
|
98
|
+
*
|
|
99
|
+
* A SUPPLIED `--features` never reaches here absent: `checkInputsExist` refuses it at the CLI edge
|
|
100
|
+
* with exit 2 (@SCN-CLI-002). Supplied-but-absent is the operator mistyping; absent-by-default is
|
|
101
|
+
* the target's honest shape.
|
|
102
|
+
*/
|
|
103
|
+
function corpusFileNames(dir) {
|
|
104
|
+
try {
|
|
105
|
+
return readdirSync(dir);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (err.code === "ENOENT")
|
|
109
|
+
throw new MissingFeatureCorpusError(dir);
|
|
110
|
+
throw err;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
84
113
|
/**
|
|
85
114
|
* Discover every feature file on disk and its header code — REFUSING a corpus the Gherkin
|
|
86
115
|
* parser rejects (@SCN-GPG-001, 3F-2817).
|
|
@@ -99,7 +128,7 @@ function featuresDir() {
|
|
|
99
128
|
* rejected tree would be back to reporting a verdict over a corpus it cannot read.
|
|
100
129
|
*/
|
|
101
130
|
export function discoverFeatures(dir = featuresDir()) {
|
|
102
|
-
const files =
|
|
131
|
+
const files = corpusFileNames(dir)
|
|
103
132
|
.filter((name) => name.endsWith(".feature"))
|
|
104
133
|
.sort()
|
|
105
134
|
.map((name) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingestScenarios.js","sourceRoot":"","sources":["../../src/ingest/ingestScenarios.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ingestScenarios.js","sourceRoot":"","sources":["../../src/ingest/ingestScenarios.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THE MODULE'S OWN SURFACE — curated symbol by symbol, never a re-export of the tree behind it
|
|
3
|
-
* (
|
|
3
|
+
* (3F-2804, 3F-3337).
|
|
4
|
+
*
|
|
5
|
+
* WHAT IS BEHIND THIS BARREL NOW IS TWO READERS, AND THE RATCHET THEY WERE BUILT FOR IS GONE
|
|
6
|
+
* (3F-3337). `record.ts` reads a target's banked gate record and hands back the kill floor it
|
|
7
|
+
* implies; `report.ts` counts a mutation report's own mutants into a measurement. What left with
|
|
8
|
+
* the ratchet is everything that COMPARED the two — the verdicts, the up-only recorder, the
|
|
9
|
+
* reconciliation entry and the command that ended on it — because this repository's gate is now a
|
|
10
|
+
* per-mutant comparison the runner keeps, and nothing types a mutation count here any more.
|
|
11
|
+
*
|
|
12
|
+
* ITS TWO CONSUMERS ARE BOTH IN THIS TREE, AND THEY WANT DIFFERENT HALVES. `ingest/
|
|
13
|
+
* ingestQualityChecks.ts` wants the RECORD half: the engine's `mutationGate` bar kind lets a target
|
|
14
|
+
* author a fitness row naming a gate instead of a figure, which is a published capability decided
|
|
15
|
+
* over a target's own record (@SCN-MUT-012, @SCN-MUT-013). `tests/checks/mutationScoreCli.ts` wants
|
|
16
|
+
* the REPORT half: `pnpm mutation:score` takes the two counts out of a sweep's report and divides
|
|
17
|
+
* them (@SCN-MUT-007, @SCN-MUT-008). Neither wants the other's, which is why both are named here
|
|
18
|
+
* rather than the tree behind them being passed on wholesale.
|
|
4
19
|
*
|
|
5
20
|
* A BARREL THAT RE-EXPORTED EVERY MODULE WOULD BE A CONTRACT NOBODY WROTE. Each module below
|
|
6
21
|
* exports what its own siblings need from it, and sibling-visibility is a much wider set than
|
|
7
|
-
* consumer-visibility
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* every one of them as something a consumer may depend on, and the first refactor that moved one
|
|
11
|
-
* would be a breaking change nobody meant to make. So this file names what a caller may hold and
|
|
12
|
-
* the omissions are decisions.
|
|
13
|
-
*
|
|
14
|
-
* WHAT IS HERE IS THIS LIBRARY'S OWN ENTRY, AND WHAT ITS FIRST CONSUMER NEEDS. The entry is
|
|
15
|
-
* `reconcileGate` — hand it the five terms a project owns and it answers with a verdict. Around it
|
|
16
|
-
* sit the pieces a consumer that wants to compose its own way needs: the verdict over counts
|
|
17
|
-
* already in hand, the two readers that turn a report into counts, the recorder, the loader, the
|
|
18
|
-
* three score functions a consumer rendering its own view needs, the kill floor those same figures
|
|
19
|
-
* imply in mutants, the default record name, and both error types the functions above raise — the
|
|
20
|
-
* record fault and the up-only refusal — because a refusal a caller cannot name in a `catch` is a
|
|
21
|
-
* refusal that caller cannot handle.
|
|
22
|
+
* consumer-visibility. Passing that set on wholesale would freeze every one of them as something a
|
|
23
|
+
* caller may depend on, and the first refactor that moved one would be a breaking change nobody
|
|
24
|
+
* meant to make. So this file names what a caller may hold and the omissions are decisions.
|
|
22
25
|
*
|
|
23
|
-
* THE KILL FLOOR
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* THE KILL FLOOR IS THE BAR, AND IT IS NOT A SCORE (3F-2788). `killFloorOf` answers a ledger
|
|
27
|
+
* holding a measured row to the figure a gate's own record implies, in mutants — a percentage would
|
|
28
|
+
* fold the kill lost and the population grown into one number, which is the distinction a bar on
|
|
29
|
+
* this axis exists to keep. A consumer that derived it instead would be the second place knowing
|
|
30
|
+
* how an allowance is spent.
|
|
28
31
|
*
|
|
29
|
-
* THE TYPES ARE SPELLED FOR A CONSUMER'S NAMESPACE RATHER THAN FOR THIS MODULE'S. `GateRecord`
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
32
|
+
* THE TYPES ARE SPELLED FOR A CONSUMER'S NAMESPACE RATHER THAN FOR THIS MODULE'S. `GateRecord` is
|
|
33
|
+
* unambiguous inside a directory about nothing else; imported into a repository that has gates of
|
|
34
|
+
* several kinds it is not, so it crosses this line under the fuller name. The aliasing is
|
|
35
|
+
* deliberate and one-directional: the internal spelling stays internal.
|
|
33
36
|
*
|
|
34
|
-
* AND NO DRIFT GUARD STANDS OVER IT, WHICH IS A DECISION
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* reader of this repository's own gate, and @SCN-RAT-014 reads the list back beside it — so a
|
|
41
|
-
* symbol added here is a symbol somebody wrote down twice, which is the guard this surface earns.
|
|
37
|
+
* AND NO DRIFT GUARD STANDS OVER IT, WHICH IS A DECISION RATHER THAN AN OPEN QUESTION. The sibling
|
|
38
|
+
* core package's barrel is reflected and compared against a frozen list in both directions, so a
|
|
39
|
+
* symbol quietly added or dropped reds. That is what a PUBLISHED surface is owed, and 3F-2859
|
|
40
|
+
* stopped publishing this one: no manifest key resolves here, and no caller outside this repository
|
|
41
|
+
* can spell the specifier at all. Freezing the list would make every refactor behind this barrel a
|
|
42
|
+
* change to a contract nobody holds.
|
|
42
43
|
*/
|
|
43
|
-
export {
|
|
44
|
-
export {
|
|
45
|
-
export { FallRefusedError, raisedRecordText } from "./ratchet.js";
|
|
46
|
-
export { measurementFromReport, readMutationReport, type MutationReportRead, } from "./report.js";
|
|
47
|
-
export { verdictFor, type MutationMeasurement, type MutationVerdict, type MutationVerdictKind, } from "./verdict.js";
|
|
44
|
+
export { floorOf, gateRecordFor, killFloorOf, MalformedRecordError, parseGateRecords, RECORD_FILE, type GateRecord as MutationGateRecord, } from "./record.js";
|
|
45
|
+
export { measurementFromReport, readMutationReport, type MutationMeasurement, type MutationReportRead, } from "./report.js";
|
|
48
46
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mutation-ratchet/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mutation-ratchet/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EACL,OAAO,EACP,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,KAAK,UAAU,IAAI,kBAAkB,GACtC,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC"}
|