spec-controller 0.1.0-alpha.1 → 0.1.0-alpha.2
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/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
|
@@ -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 { RECORD_FILE,
|
|
44
|
-
export { floorOf, gateRecordFor, killFloorOf, MalformedRecordError, parseGateRecords, recordedScoreOf, scoreOf, } from "./record.js";
|
|
45
|
-
export { FallRefusedError, raisedRecordText } from "./ratchet.js";
|
|
44
|
+
export { floorOf, gateRecordFor, killFloorOf, MalformedRecordError, parseGateRecords, RECORD_FILE, } from "./record.js";
|
|
46
45
|
export { measurementFromReport, readMutationReport, } from "./report.js";
|
|
47
|
-
export { verdictFor, } from "./verdict.js";
|
|
48
46
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mutation-ratchet/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","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,GAEZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAGnB,MAAM,aAAa,CAAC"}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A GATE'S RECORD — the pair of counts it last banked, and the allowance stated against them
|
|
3
|
-
* (@SCN-
|
|
3
|
+
* (@SCN-MUT-012, 3F-2790, 3F-3337).
|
|
4
|
+
*
|
|
5
|
+
* THE RATCHET THAT ONCE RECONCILED AGAINST THIS IS GONE; THE READER IS NOT (3F-3337). What reaches
|
|
6
|
+
* this module now is the engine's `mutationGate` bar kind, through `ingestQualityChecks.ts`: a
|
|
7
|
+
* target may author a fitness row whose bar names a gate rather than a figure, and the kill floor
|
|
8
|
+
* that gate's record implies is the bar the ledger then holds it to. That is a published
|
|
9
|
+
* capability, decided over a TARGET'S record, and this repository no longer keeps one of its own.
|
|
10
|
+
* @SCN-MUT-012 and @SCN-MUT-013 are what specify it — the second carrying, as its own Examples,
|
|
11
|
+
* the record that holds no gate of that name, the record that is not there to be read and the
|
|
12
|
+
* record holding text nothing can read as a record.
|
|
4
13
|
*
|
|
5
14
|
* THE RECORD IS TWO COUNTS, NEVER A BARE SCORE, and that is the load-bearing choice this whole
|
|
6
15
|
* module exists to make possible. A mutation score is detected over total, so it falls for two
|
|
@@ -21,7 +30,7 @@
|
|
|
21
30
|
* measured nothing read as scoring zero, an allowance nobody justified read as justified. The bar
|
|
22
31
|
* is then enforced as though somebody had written it, and the only symptom is a build that has
|
|
23
32
|
* quietly stopped being able to red. So each one is refused by name, and the refusal says which
|
|
24
|
-
* record it read and where in that record the fault is (@SCN-
|
|
33
|
+
* record it read and where in that record the fault is (@SCN-MUT-013, 3F-2792).
|
|
25
34
|
*
|
|
26
35
|
* IT IS NOT A STATIC CHECK, and takes no `static-check:` prefix. A static check is a pure function
|
|
27
36
|
* of the checked-out tree; the record this reads feeds a reconciler that judges a MEASUREMENT,
|
|
@@ -29,27 +38,18 @@
|
|
|
29
38
|
* this portfolio already carries.
|
|
30
39
|
*/
|
|
31
40
|
/**
|
|
32
|
-
* The
|
|
33
|
-
*
|
|
34
|
-
* EXPORTED SO THE RECORDER CANNOT HOLD A SECOND COPY OF IT. `ratchet.ts` finds the same section in
|
|
35
|
-
* the same text in order to rewrite two of its lines, and two spellings of one name is the
|
|
36
|
-
* agreeing-until-somebody-edits-one shape this whole library exists to remove.
|
|
41
|
+
* The name a record is filed under when its caller does not choose one.
|
|
37
42
|
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*/
|
|
43
|
-
export declare const MUTATION_GATES = "mutation-gates";
|
|
44
|
-
/**
|
|
45
|
-
* The field a refusal names when the fault is the ASK rather than a field of a gate's block — a
|
|
46
|
-
* gate the record does not hold at all.
|
|
43
|
+
* A DEFAULT, NEVER A CONSTANT THE READER GOES LOOKING FOR. Which file holds a project's bars is
|
|
44
|
+
* that project's own fact, and a caller naming its own is answered by that name — this is only
|
|
45
|
+
* what stands in when none is given, and it is exported so a caller happy with the convention does
|
|
46
|
+
* not have to respell it and get one character of it wrong.
|
|
47
47
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
48
|
+
* IT MOVED HERE FROM `reconcile.ts` WHEN THE RATCHET LEFT (3F-3337), unchanged. The entry that used
|
|
49
|
+
* to sit beside it reconciled a gate against this record; what is left reading a record is this
|
|
50
|
+
* module, so the default name sits with the reader that defaults to it.
|
|
51
51
|
*/
|
|
52
|
-
export declare const
|
|
52
|
+
export declare const RECORD_FILE = "quality-thresholds.yml";
|
|
53
53
|
/**
|
|
54
54
|
* Raised when a record cannot be read as a bar.
|
|
55
55
|
*
|
|
@@ -107,36 +107,6 @@ export interface GateRecord {
|
|
|
107
107
|
readonly total: number;
|
|
108
108
|
readonly allowance: GateAllowance;
|
|
109
109
|
}
|
|
110
|
-
/** A mutation score, as a percentage, computed from counts rather than read off a report. */
|
|
111
|
-
export declare function scoreOf(detected: number, total: number): number;
|
|
112
|
-
/** A percentage, at the one precision every figure in this library is stated to. */
|
|
113
|
-
export declare function pct(value: number): string;
|
|
114
|
-
/**
|
|
115
|
-
* `detected/total (score%)` — the one shape every count pair in this library is stated in.
|
|
116
|
-
*
|
|
117
|
-
* BOTH HALVES, ALWAYS, AND THE SCORE BESIDE THEM. A message naming only the figure that moved
|
|
118
|
-
* leaves its reader unable to see WHICH of the two moved, which is the single distinction this
|
|
119
|
-
* library exists to make.
|
|
120
|
-
*
|
|
121
|
-
* IT LIVES HERE, BESIDE THE COUNTS, BECAUSE TWO READERS STATE IT. The reconciler prints it in every
|
|
122
|
-
* verdict and the recorder prints it in its refusal, and one sentence spelled twice is the
|
|
123
|
-
* agreeing-until-somebody-edits-one shape this library was built to remove.
|
|
124
|
-
*/
|
|
125
|
-
export declare function counts(detected: number, total: number): string;
|
|
126
|
-
/**
|
|
127
|
-
* Whether one pair of counts scores strictly ABOVE another.
|
|
128
|
-
*
|
|
129
|
-
* CROSS-MULTIPLIED RATHER THAN DIVIDED, so the comparison is exact. Two scores equal as ratios can
|
|
130
|
-
* differ in their last bit once each has been through a division, and a pair that did not move would
|
|
131
|
-
* then read as one that did. The counts are whole and small enough that the products are exact.
|
|
132
|
-
*
|
|
133
|
-
* ONE FUNCTION READ BOTH WAYS ROUND, WHICH IS WHAT LEAVES EQUAL UNCLAIMED. Above and below are the
|
|
134
|
-
* same two products with the arguments swapped, so no run can be claimed by both, and — the case
|
|
135
|
-
* that matters — none can be claimed by neither. Two comparisons reached by different arithmetic
|
|
136
|
-
* could each answer `false` for a run that is genuinely one or the other, and the run would fall out
|
|
137
|
-
* of every reader here at once.
|
|
138
|
-
*/
|
|
139
|
-
export declare function scoreRoseOver(detected: number, total: number, overDetected: number, overTotal: number): boolean;
|
|
140
110
|
/**
|
|
141
111
|
* The failing floor: the record's counts with its allowance spent out of the DETECTED count.
|
|
142
112
|
*
|
|
@@ -170,8 +140,6 @@ export declare function floorOf(record: GateRecord): number;
|
|
|
170
140
|
* holding it — agreeing until the day one of them is edited.
|
|
171
141
|
*/
|
|
172
142
|
export declare function killFloorOf(record: GateRecord): number;
|
|
173
|
-
/** The score the record itself states — what the ratchet raises and the verdict compares against. */
|
|
174
|
-
export declare function recordedScoreOf(record: GateRecord): number;
|
|
175
143
|
/**
|
|
176
144
|
* Read every gate's record out of a record file's text.
|
|
177
145
|
*
|
|
@@ -189,7 +157,7 @@ export declare function parseGateRecords(text: string, recordFile: string): Map<
|
|
|
189
157
|
* This one is a record that reads perfectly, asked for a gate it never held — a gate name mistyped
|
|
190
158
|
* where the caller states it. The lenient answer is not a wrong bar but NO bar, which reads
|
|
191
159
|
* downstream as a gate with nothing to enforce, and it greens for as long as the typo survives.
|
|
192
|
-
* Nothing about the record is wrong, so nobody is ever sent to look at it (@SCN-
|
|
160
|
+
* Nothing about the record is wrong, so nobody is ever sent to look at it (@SCN-MUT-013, 3F-2793).
|
|
193
161
|
*
|
|
194
162
|
* AND THE REFUSAL LISTS THE GATES THE RECORD DOES HOLD. A record's gates are near-neighbours by
|
|
195
163
|
* construction — a project names them after the scopes it is quarantining from each other — so a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/mutation-ratchet/record.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/mutation-ratchet/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAIH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,2BAA2B,CAAC;AA0CpD;;;;;;;;;;;;GAYG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,4FAA4F;IAC5F,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM;;IAPtB,yEAAyE;IAChE,UAAU,EAAE,MAAM;IAC3B,uFAAuF;IAC9E,OAAO,EAAE,MAAM;IACxB,4FAA4F;IACnF,GAAG,EAAE,MAAM;IACpB,mCAAmC;IAC1B,KAAK,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM;CAKjB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;CACnC;AAOD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAElD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAEtD;AAiLD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAI1F;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,UAAU,EAAE,MAAM,GACjB,UAAU,CAYZ"}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A GATE'S RECORD — the pair of counts it last banked, and the allowance stated against them
|
|
3
|
-
* (@SCN-
|
|
3
|
+
* (@SCN-MUT-012, 3F-2790, 3F-3337).
|
|
4
|
+
*
|
|
5
|
+
* THE RATCHET THAT ONCE RECONCILED AGAINST THIS IS GONE; THE READER IS NOT (3F-3337). What reaches
|
|
6
|
+
* this module now is the engine's `mutationGate` bar kind, through `ingestQualityChecks.ts`: a
|
|
7
|
+
* target may author a fitness row whose bar names a gate rather than a figure, and the kill floor
|
|
8
|
+
* that gate's record implies is the bar the ledger then holds it to. That is a published
|
|
9
|
+
* capability, decided over a TARGET'S record, and this repository no longer keeps one of its own.
|
|
10
|
+
* @SCN-MUT-012 and @SCN-MUT-013 are what specify it — the second carrying, as its own Examples,
|
|
11
|
+
* the record that holds no gate of that name, the record that is not there to be read and the
|
|
12
|
+
* record holding text nothing can read as a record.
|
|
4
13
|
*
|
|
5
14
|
* THE RECORD IS TWO COUNTS, NEVER A BARE SCORE, and that is the load-bearing choice this whole
|
|
6
15
|
* module exists to make possible. A mutation score is detected over total, so it falls for two
|
|
@@ -21,7 +30,7 @@
|
|
|
21
30
|
* measured nothing read as scoring zero, an allowance nobody justified read as justified. The bar
|
|
22
31
|
* is then enforced as though somebody had written it, and the only symptom is a build that has
|
|
23
32
|
* quietly stopped being able to red. So each one is refused by name, and the refusal says which
|
|
24
|
-
* record it read and where in that record the fault is (@SCN-
|
|
33
|
+
* record it read and where in that record the fault is (@SCN-MUT-013, 3F-2792).
|
|
25
34
|
*
|
|
26
35
|
* IT IS NOT A STATIC CHECK, and takes no `static-check:` prefix. A static check is a pure function
|
|
27
36
|
* of the checked-out tree; the record this reads feeds a reconciler that judges a MEASUREMENT,
|
|
@@ -29,6 +38,19 @@
|
|
|
29
38
|
* this portfolio already carries.
|
|
30
39
|
*/
|
|
31
40
|
import { parse } from "yaml";
|
|
41
|
+
/**
|
|
42
|
+
* The name a record is filed under when its caller does not choose one.
|
|
43
|
+
*
|
|
44
|
+
* A DEFAULT, NEVER A CONSTANT THE READER GOES LOOKING FOR. Which file holds a project's bars is
|
|
45
|
+
* that project's own fact, and a caller naming its own is answered by that name — this is only
|
|
46
|
+
* what stands in when none is given, and it is exported so a caller happy with the convention does
|
|
47
|
+
* not have to respell it and get one character of it wrong.
|
|
48
|
+
*
|
|
49
|
+
* IT MOVED HERE FROM `reconcile.ts` WHEN THE RATCHET LEFT (3F-3337), unchanged. The entry that used
|
|
50
|
+
* to sit beside it reconciled a gate against this record; what is left reading a record is this
|
|
51
|
+
* module, so the default name sits with the reader that defaults to it.
|
|
52
|
+
*/
|
|
53
|
+
export const RECORD_FILE = "quality-thresholds.yml";
|
|
32
54
|
/**
|
|
33
55
|
* The section of a record file that holds every gate's counts.
|
|
34
56
|
*
|
|
@@ -41,7 +63,7 @@ import { parse } from "yaml";
|
|
|
41
63
|
* asks of it is one section, under one name, so a project can file its mutation bars beside the
|
|
42
64
|
* rest of its policy rather than in a file of their own.
|
|
43
65
|
*/
|
|
44
|
-
|
|
66
|
+
const MUTATION_GATES = "mutation-gates";
|
|
45
67
|
/**
|
|
46
68
|
* The document itself, when the fault is above any one gate — a record whose top level is not a
|
|
47
69
|
* mapping of sections, or one the YAML parser could not read at all.
|
|
@@ -63,7 +85,7 @@ const WHOLE_SECTION = "<section>";
|
|
|
63
85
|
* asked to raise a gate no block is written for, and a refusal a reader has to recognise in two
|
|
64
86
|
* spellings is one they will eventually parse wrongly.
|
|
65
87
|
*/
|
|
66
|
-
|
|
88
|
+
const WHOLE_GATE = "<gate>";
|
|
67
89
|
/**
|
|
68
90
|
* Raised when a record cannot be read as a bar.
|
|
69
91
|
*
|
|
@@ -100,43 +122,9 @@ export class MalformedRecordError extends Error {
|
|
|
100
122
|
}
|
|
101
123
|
}
|
|
102
124
|
/** A mutation score, as a percentage, computed from counts rather than read off a report. */
|
|
103
|
-
|
|
125
|
+
function scoreOf(detected, total) {
|
|
104
126
|
return (detected / total) * 100;
|
|
105
127
|
}
|
|
106
|
-
/** A percentage, at the one precision every figure in this library is stated to. */
|
|
107
|
-
export function pct(value) {
|
|
108
|
-
return value.toFixed(4);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* `detected/total (score%)` — the one shape every count pair in this library is stated in.
|
|
112
|
-
*
|
|
113
|
-
* BOTH HALVES, ALWAYS, AND THE SCORE BESIDE THEM. A message naming only the figure that moved
|
|
114
|
-
* leaves its reader unable to see WHICH of the two moved, which is the single distinction this
|
|
115
|
-
* library exists to make.
|
|
116
|
-
*
|
|
117
|
-
* IT LIVES HERE, BESIDE THE COUNTS, BECAUSE TWO READERS STATE IT. The reconciler prints it in every
|
|
118
|
-
* verdict and the recorder prints it in its refusal, and one sentence spelled twice is the
|
|
119
|
-
* agreeing-until-somebody-edits-one shape this library was built to remove.
|
|
120
|
-
*/
|
|
121
|
-
export function counts(detected, total) {
|
|
122
|
-
return `${detected}/${total} (${pct(scoreOf(detected, total))}%)`;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Whether one pair of counts scores strictly ABOVE another.
|
|
126
|
-
*
|
|
127
|
-
* CROSS-MULTIPLIED RATHER THAN DIVIDED, so the comparison is exact. Two scores equal as ratios can
|
|
128
|
-
* differ in their last bit once each has been through a division, and a pair that did not move would
|
|
129
|
-
* then read as one that did. The counts are whole and small enough that the products are exact.
|
|
130
|
-
*
|
|
131
|
-
* ONE FUNCTION READ BOTH WAYS ROUND, WHICH IS WHAT LEAVES EQUAL UNCLAIMED. Above and below are the
|
|
132
|
-
* same two products with the arguments swapped, so no run can be claimed by both, and — the case
|
|
133
|
-
* that matters — none can be claimed by neither. Two comparisons reached by different arithmetic
|
|
134
|
-
* could each answer `false` for a run that is genuinely one or the other, and the run would fall out
|
|
135
|
-
* of every reader here at once.
|
|
136
|
-
*/
|
|
137
|
-
export function scoreRoseOver(detected, total, overDetected, overTotal) {
|
|
138
|
-
return detected * overTotal > overDetected * total;
|
|
139
|
-
}
|
|
140
128
|
/**
|
|
141
129
|
* The failing floor: the record's counts with its allowance spent out of the DETECTED count.
|
|
142
130
|
*
|
|
@@ -174,10 +162,6 @@ export function floorOf(record) {
|
|
|
174
162
|
export function killFloorOf(record) {
|
|
175
163
|
return record.detected - record.allowance.mutants;
|
|
176
164
|
}
|
|
177
|
-
/** The score the record itself states — what the ratchet raises and the verdict compares against. */
|
|
178
|
-
export function recordedScoreOf(record) {
|
|
179
|
-
return scoreOf(record.detected, record.total);
|
|
180
|
-
}
|
|
181
165
|
/**
|
|
182
166
|
* Read the record's text into a document mapping.
|
|
183
167
|
*
|
|
@@ -303,7 +287,7 @@ export function parseGateRecords(text, recordFile) {
|
|
|
303
287
|
* This one is a record that reads perfectly, asked for a gate it never held — a gate name mistyped
|
|
304
288
|
* where the caller states it. The lenient answer is not a wrong bar but NO bar, which reads
|
|
305
289
|
* downstream as a gate with nothing to enforce, and it greens for as long as the typo survives.
|
|
306
|
-
* Nothing about the record is wrong, so nobody is ever sent to look at it (@SCN-
|
|
290
|
+
* Nothing about the record is wrong, so nobody is ever sent to look at it (@SCN-MUT-013, 3F-2793).
|
|
307
291
|
*
|
|
308
292
|
* AND THE REFUSAL LISTS THE GATES THE RECORD DOES HOLD. A record's gates are near-neighbours by
|
|
309
293
|
* construction — a project names them after the scopes it is quarantining from each other — so a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/mutation-ratchet/record.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/mutation-ratchet/record.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THE MEASUREMENT — a gate's run, counted out of its mutation report's own mutants
|
|
3
|
-
* (@SCN-
|
|
3
|
+
* (@SCN-MUT-007, 3F-2799, 3F-3337).
|
|
4
|
+
*
|
|
5
|
+
* THE RATCHET THAT RECONCILED THIS IS GONE; THE READER IS NOT (3F-3337). Its one remaining caller
|
|
6
|
+
* is `tests/checks/mutationScoreCli.ts` — `pnpm mutation:score`, the producer that posts
|
|
7
|
+
* SCN-FIT-002's number — which takes the two counts out of this and divides them. @SCN-MUT-007 and
|
|
8
|
+
* @SCN-MUT-008 are what specify it now, and they state the same two things this file states: the
|
|
9
|
+
* valid population is the killed and the timed-out over those plus the survived and the
|
|
10
|
+
* never-covered, and a run with no readable report posts nothing rather than a count of zero.
|
|
4
11
|
*
|
|
5
12
|
* STATED, NEVER INFERRED, AND THAT IS THE WHOLE MODULE. A mutation report groups its mutants by
|
|
6
13
|
* the file they were made in and gives each one a status. The metric scores two of those statuses
|
|
@@ -21,7 +28,8 @@
|
|
|
21
28
|
* AND THE REPORT'S OWN THRESHOLDS ARE NOT READ, WHICH IS THE SAME RULING ONE ARTEFACT FURTHER OUT.
|
|
22
29
|
* A report carries the thresholds its own run was configured against, and reading them would be
|
|
23
30
|
* taking the runner's verdict on its own homework as the measurement. The bar lives in the record
|
|
24
|
-
* (`
|
|
31
|
+
* (SCN-FIT-002's own row, which `stryker.config.mjs` reads back), and the report is only ever
|
|
32
|
+
* asked what happened. Every figure produced here is
|
|
25
33
|
* counted from the mutants; every other number in the document is left where it lies, however
|
|
26
34
|
* conveniently it is shaped.
|
|
27
35
|
*
|
|
@@ -31,7 +39,7 @@
|
|
|
31
39
|
* holding exactly one, which is the shape a small fixture takes by default.
|
|
32
40
|
*
|
|
33
41
|
* AND A REPORT THAT CANNOT BE READ, OR THAT HOLDS NO SCORED MUTANT AT ALL, IS REFUSED RATHER THAN
|
|
34
|
-
* SCORED ZERO (@SCN-
|
|
42
|
+
* SCORED ZERO (@SCN-MUT-008). Zero is a measurement — a run that mutated the scope and killed none
|
|
35
43
|
* of it — and the two must not be spelled the same, because reconciling a zero reaches a regression
|
|
36
44
|
* whose message sends its reader hunting kills that in this case never happened. The refusal comes
|
|
37
45
|
* back as a value rather than a throw, so a caller cannot drop it by forgetting to catch.
|
|
@@ -40,9 +48,27 @@
|
|
|
40
48
|
* is the report FORMAT's, which is nobody's installation, and the gate's name arrives from the
|
|
41
49
|
* caller rather than out of the document.
|
|
42
50
|
*/
|
|
43
|
-
import type { MutationMeasurement } from "./verdict.js";
|
|
44
51
|
/**
|
|
45
|
-
*
|
|
52
|
+
* One gate's measured run, in the two counts the metric is defined over.
|
|
53
|
+
*
|
|
54
|
+
* IT MOVED HERE FROM `verdict.ts` WHEN THE RATCHET LEFT (3F-3337), unchanged. It sat beside the
|
|
55
|
+
* comparison while there was one; what produces it now is this module alone, so it sits where it
|
|
56
|
+
* is made.
|
|
57
|
+
*
|
|
58
|
+
* TWO COUNTS AND NOT A SCORE. A measurement that arrived as a score would already have folded the
|
|
59
|
+
* two events a reader has to tell apart — a kill lost, and a population that grew — into one
|
|
60
|
+
* number, before any caller could look at either.
|
|
61
|
+
*/
|
|
62
|
+
export interface MutationMeasurement {
|
|
63
|
+
/** The gate this run measured, as the caller names it. */
|
|
64
|
+
readonly gate: string;
|
|
65
|
+
/** Mutants the suite detected. */
|
|
66
|
+
readonly detected: number;
|
|
67
|
+
/** Every mutant the gate measured, detected or not. */
|
|
68
|
+
readonly total: number;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A report read: the measurement, or the reason there is not one (@SCN-MUT-008, 3F-2800).
|
|
46
72
|
*
|
|
47
73
|
* A REFUSAL IS A RESULT, NEVER AN EXCEPTION THE CALLER MAY FORGET TO CATCH. Reading a report is the
|
|
48
74
|
* one step of this library that reaches for something outside its own arguments, so it is the one
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/mutation-ratchet/report.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/mutation-ratchet/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAIH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA+DpD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,kBAAkB,CAoBpB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAWvF"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THE MEASUREMENT — a gate's run, counted out of its mutation report's own mutants
|
|
3
|
-
* (@SCN-
|
|
3
|
+
* (@SCN-MUT-007, 3F-2799, 3F-3337).
|
|
4
|
+
*
|
|
5
|
+
* THE RATCHET THAT RECONCILED THIS IS GONE; THE READER IS NOT (3F-3337). Its one remaining caller
|
|
6
|
+
* is `tests/checks/mutationScoreCli.ts` — `pnpm mutation:score`, the producer that posts
|
|
7
|
+
* SCN-FIT-002's number — which takes the two counts out of this and divides them. @SCN-MUT-007 and
|
|
8
|
+
* @SCN-MUT-008 are what specify it now, and they state the same two things this file states: the
|
|
9
|
+
* valid population is the killed and the timed-out over those plus the survived and the
|
|
10
|
+
* never-covered, and a run with no readable report posts nothing rather than a count of zero.
|
|
4
11
|
*
|
|
5
12
|
* STATED, NEVER INFERRED, AND THAT IS THE WHOLE MODULE. A mutation report groups its mutants by
|
|
6
13
|
* the file they were made in and gives each one a status. The metric scores two of those statuses
|
|
@@ -21,7 +28,8 @@
|
|
|
21
28
|
* AND THE REPORT'S OWN THRESHOLDS ARE NOT READ, WHICH IS THE SAME RULING ONE ARTEFACT FURTHER OUT.
|
|
22
29
|
* A report carries the thresholds its own run was configured against, and reading them would be
|
|
23
30
|
* taking the runner's verdict on its own homework as the measurement. The bar lives in the record
|
|
24
|
-
* (`
|
|
31
|
+
* (SCN-FIT-002's own row, which `stryker.config.mjs` reads back), and the report is only ever
|
|
32
|
+
* asked what happened. Every figure produced here is
|
|
25
33
|
* counted from the mutants; every other number in the document is left where it lies, however
|
|
26
34
|
* conveniently it is shaped.
|
|
27
35
|
*
|
|
@@ -31,7 +39,7 @@
|
|
|
31
39
|
* holding exactly one, which is the shape a small fixture takes by default.
|
|
32
40
|
*
|
|
33
41
|
* AND A REPORT THAT CANNOT BE READ, OR THAT HOLDS NO SCORED MUTANT AT ALL, IS REFUSED RATHER THAN
|
|
34
|
-
* SCORED ZERO (@SCN-
|
|
42
|
+
* SCORED ZERO (@SCN-MUT-008). Zero is a measurement — a run that mutated the scope and killed none
|
|
35
43
|
* of it — and the two must not be spelled the same, because reconciling a zero reaches a regression
|
|
36
44
|
* whose message sends its reader hunting kills that in this case never happened. The refusal comes
|
|
37
45
|
* back as a value rather than a throw, so a caller cannot drop it by forgetting to catch.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/mutation-ratchet/report.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/mutation-ratchet/report.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spec-controller",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.2",
|
|
4
4
|
"description": "Reconcile the behaviour your scenarios name against the evidence that actually ran — the deterministic `balance` CLI.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"reconciliation",
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
"double-entry",
|
|
11
11
|
"cli"
|
|
12
12
|
],
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/3f-consulting/spec-controller.git",
|
|
16
|
+
"directory": "packages/spec-controller"
|
|
17
|
+
},
|
|
13
18
|
"license": "MIT",
|
|
14
19
|
"type": "module",
|
|
15
20
|
"engines": {
|
|
@@ -25,7 +30,7 @@
|
|
|
25
30
|
"@cucumber/gherkin": "^41.0.0",
|
|
26
31
|
"@cucumber/messages": "^34.0.1",
|
|
27
32
|
"yaml": "^2.9.0",
|
|
28
|
-
"@3f-consulting/spec-controller-core": "0.1.0-alpha.
|
|
33
|
+
"@3f-consulting/spec-controller-core": "0.1.0-alpha.2"
|
|
29
34
|
},
|
|
30
35
|
"publishConfig": {
|
|
31
36
|
"access": "public"
|