@3f-consulting/spec-controller-core 0.1.0-alpha.5 → 0.1.0-alpha.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/assemble/evidenceReconciliationFromSources.d.ts +5 -40
- package/dist/assemble/evidenceReconciliationFromSources.d.ts.map +1 -1
- package/dist/assemble/evidenceReconciliationFromSources.js +31 -319
- package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
- package/dist/assemble/renderInput.d.ts +6 -72
- package/dist/assemble/renderInput.d.ts.map +1 -1
- package/dist/assemble/renderInput.js +3 -45
- package/dist/assemble/renderInput.js.map +1 -1
- package/dist/census/evidenceObligations.d.ts +10 -46
- package/dist/census/evidenceObligations.d.ts.map +1 -1
- package/dist/census/evidenceObligations.js +15 -25
- package/dist/census/evidenceObligations.js.map +1 -1
- package/dist/domain/evidenceOrder.d.ts +3 -0
- package/dist/domain/evidenceOrder.d.ts.map +1 -0
- package/dist/domain/evidenceOrder.js +15 -0
- package/dist/domain/evidenceOrder.js.map +1 -0
- package/dist/domain/evidenceReconciliation.d.ts +16 -386
- package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
- package/dist/domain/evidenceReconciliation.js +79 -375
- package/dist/domain/evidenceReconciliation.js.map +1 -1
- package/dist/domain/featureCode.d.ts +4 -0
- package/dist/domain/featureCode.d.ts.map +1 -0
- package/dist/domain/featureCode.js +12 -0
- package/dist/domain/featureCode.js.map +1 -0
- package/dist/domain/journal.d.ts +7 -392
- package/dist/domain/journal.d.ts.map +1 -1
- package/dist/domain/journal.js +6 -118
- package/dist/domain/journal.js.map +1 -1
- package/dist/domain/ledger.d.ts +4 -328
- package/dist/domain/ledger.d.ts.map +1 -1
- package/dist/domain/ledger.js +11 -317
- package/dist/domain/ledger.js.map +1 -1
- package/dist/domain/outcome.d.ts +3 -0
- package/dist/domain/outcome.d.ts.map +1 -0
- package/dist/domain/outcome.js +2 -0
- package/dist/domain/outcome.js.map +1 -0
- package/dist/domain/posting.d.ts +5 -102
- package/dist/domain/posting.d.ts.map +1 -1
- package/dist/domain/posting.js +3 -55
- package/dist/domain/posting.js.map +1 -1
- package/dist/domain/qualityCheckFault.d.ts +1 -41
- package/dist/domain/qualityCheckFault.d.ts.map +1 -1
- package/dist/domain/qualityCheckFault.js +0 -24
- package/dist/domain/qualityCheckFault.js.map +1 -1
- package/dist/domain/qualityCheckFaultMessages.d.ts +0 -35
- package/dist/domain/qualityCheckFaultMessages.d.ts.map +1 -1
- package/dist/domain/qualityCheckFaultMessages.js +0 -28
- package/dist/domain/qualityCheckFaultMessages.js.map +1 -1
- package/dist/domain/qualityCheckReconciliation.d.ts +5 -278
- package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
- package/dist/domain/qualityCheckReconciliation.js +53 -453
- package/dist/domain/qualityCheckReconciliation.js.map +1 -1
- package/dist/domain/qualityCheckReconciliationFault.d.ts +0 -19
- package/dist/domain/qualityCheckReconciliationFault.d.ts.map +1 -1
- package/dist/domain/qualityCheckReconciliationFault.js +0 -23
- package/dist/domain/qualityCheckReconciliationFault.js.map +1 -1
- package/dist/domain/scenarioCodeError.d.ts +16 -0
- package/dist/domain/scenarioCodeError.d.ts.map +1 -0
- package/dist/domain/scenarioCodeError.js +4 -0
- package/dist/domain/scenarioCodeError.js.map +1 -0
- package/dist/domain/scenarioReconciliation.d.ts +0 -205
- package/dist/domain/scenarioReconciliation.d.ts.map +1 -1
- package/dist/domain/scenarioReconciliation.js +1 -98
- package/dist/domain/scenarioReconciliation.js.map +1 -1
- package/dist/domain/scnAllocation.d.ts +27 -0
- package/dist/domain/scnAllocation.d.ts.map +1 -0
- package/dist/domain/scnAllocation.js +33 -0
- package/dist/domain/scnAllocation.js.map +1 -0
- package/dist/domain/verdictCode.d.ts +10 -0
- package/dist/domain/verdictCode.d.ts.map +1 -0
- package/dist/domain/verdictCode.js +16 -0
- package/dist/domain/verdictCode.js.map +1 -0
- package/dist/index.d.ts +12 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -86
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +3 -25
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +3 -93
- package/dist/internal.js.map +1 -1
- package/dist/lib/bareTerm.d.ts +0 -39
- package/dist/lib/bareTerm.d.ts.map +1 -1
- package/dist/lib/bareTerm.js +0 -39
- package/dist/lib/bareTerm.js.map +1 -1
- package/dist/lib/portablePath.d.ts.map +1 -1
- package/dist/lib/portablePath.js +0 -14
- package/dist/lib/portablePath.js.map +1 -1
- package/dist/lib/scnCitation.d.ts +0 -32
- package/dist/lib/scnCitation.d.ts.map +1 -1
- package/dist/lib/scnCitation.js +2 -42
- package/dist/lib/scnCitation.js.map +1 -1
- package/dist/model.d.ts +0 -23
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -23
- package/dist/model.js.map +1 -1
- package/dist/parse/checkScriptsRunInCI.d.ts +3 -151
- package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
- package/dist/parse/checkScriptsRunInCI.js +5 -143
- package/dist/parse/checkScriptsRunInCI.js.map +1 -1
- package/dist/parse/ciStepRecord.d.ts +2 -117
- package/dist/parse/ciStepRecord.d.ts.map +1 -1
- package/dist/parse/ciStepRecord.js +12 -218
- package/dist/parse/ciStepRecord.js.map +1 -1
- package/dist/parse/commandRuns.d.ts +0 -39
- package/dist/parse/commandRuns.d.ts.map +1 -1
- package/dist/parse/commandRuns.js +0 -58
- package/dist/parse/commandRuns.js.map +1 -1
- package/dist/parse/cucumber.d.ts +0 -52
- package/dist/parse/cucumber.d.ts.map +1 -1
- package/dist/parse/cucumber.js +37 -143
- package/dist/parse/cucumber.js.map +1 -1
- package/dist/parse/discoveryScope.d.ts +0 -45
- package/dist/parse/discoveryScope.d.ts.map +1 -1
- package/dist/parse/discoveryScope.js +0 -55
- package/dist/parse/discoveryScope.js.map +1 -1
- package/dist/parse/fitnessCitations.d.ts +1 -72
- package/dist/parse/fitnessCitations.d.ts.map +1 -1
- package/dist/parse/fitnessCitations.js +3 -55
- package/dist/parse/fitnessCitations.js.map +1 -1
- package/dist/parse/reconcilerSteps.d.ts +0 -46
- package/dist/parse/reconcilerSteps.d.ts.map +1 -1
- package/dist/parse/reconcilerSteps.js +0 -63
- package/dist/parse/reconcilerSteps.js.map +1 -1
- package/dist/parse/runningStaticChecks.d.ts +2 -118
- package/dist/parse/runningStaticChecks.d.ts.map +1 -1
- package/dist/parse/runningStaticChecks.js +14 -273
- package/dist/parse/runningStaticChecks.js.map +1 -1
- package/dist/parse/scenarioCodeErrors.d.ts +12 -0
- package/dist/parse/scenarioCodeErrors.d.ts.map +1 -0
- package/dist/parse/scenarioCodeErrors.js +88 -0
- package/dist/parse/scenarioCodeErrors.js.map +1 -0
- package/dist/parse/scenarios.d.ts +3 -228
- package/dist/parse/scenarios.d.ts.map +1 -1
- package/dist/parse/scenarios.js +11 -447
- package/dist/parse/scenarios.js.map +1 -1
- package/dist/parse/stepAccounting.d.ts +0 -46
- package/dist/parse/stepAccounting.d.ts.map +1 -1
- package/dist/parse/stepAccounting.js +0 -54
- package/dist/parse/stepAccounting.js.map +1 -1
- package/dist/parse/stepExclusions.d.ts +0 -47
- package/dist/parse/stepExclusions.d.ts.map +1 -1
- package/dist/parse/stepExclusions.js +0 -45
- package/dist/parse/stepExclusions.js.map +1 -1
- package/dist/parse/stepNames.d.ts +0 -27
- package/dist/parse/stepNames.d.ts.map +1 -1
- package/dist/parse/stepNames.js +0 -27
- package/dist/parse/stepNames.js.map +1 -1
- package/dist/parse/targetCorpus.d.ts +1 -78
- package/dist/parse/targetCorpus.d.ts.map +1 -1
- package/dist/parse/targetCorpus.js +4 -46
- package/dist/parse/targetCorpus.js.map +1 -1
- package/dist/parse/targetManifest.d.ts +8 -146
- package/dist/parse/targetManifest.d.ts.map +1 -1
- package/dist/parse/targetManifest.js +47 -198
- package/dist/parse/targetManifest.js.map +1 -1
- package/dist/parse/vitest.d.ts +0 -60
- package/dist/parse/vitest.d.ts.map +1 -1
- package/dist/parse/vitest.js +1 -81
- package/dist/parse/vitest.js.map +1 -1
- package/dist/provenance/provenance.d.ts +2 -110
- package/dist/provenance/provenance.d.ts.map +1 -1
- package/dist/provenance/provenance.js +2 -58
- package/dist/provenance/provenance.js.map +1 -1
- package/dist/render/behaviouralRunners.d.ts +0 -29
- package/dist/render/behaviouralRunners.d.ts.map +1 -1
- package/dist/render/behaviouralRunners.js +0 -64
- package/dist/render/behaviouralRunners.js.map +1 -1
- package/dist/render/configurationNotRead.d.ts +3 -0
- package/dist/render/configurationNotRead.d.ts.map +1 -0
- package/dist/render/configurationNotRead.js +17 -0
- package/dist/render/configurationNotRead.js.map +1 -0
- package/dist/render/discoveryScope.d.ts +0 -37
- package/dist/render/discoveryScope.d.ts.map +1 -1
- package/dist/render/discoveryScope.js +0 -37
- package/dist/render/discoveryScope.js.map +1 -1
- package/dist/render/evidenceGrid.d.ts +1 -35
- package/dist/render/evidenceGrid.d.ts.map +1 -1
- package/dist/render/evidenceGrid.js +18 -100
- package/dist/render/evidenceGrid.js.map +1 -1
- package/dist/render/excludedSteps.d.ts +0 -26
- package/dist/render/excludedSteps.d.ts.map +1 -1
- package/dist/render/excludedSteps.js +0 -29
- package/dist/render/excludedSteps.js.map +1 -1
- package/dist/render/json.d.ts +0 -11
- package/dist/render/json.d.ts.map +1 -1
- package/dist/render/json.js +0 -11
- package/dist/render/json.js.map +1 -1
- package/dist/render/markdown.d.ts +0 -54
- package/dist/render/markdown.d.ts.map +1 -1
- package/dist/render/markdown.js +88 -426
- package/dist/render/markdown.js.map +1 -1
- package/dist/render/provenanceSection.d.ts +0 -22
- package/dist/render/provenanceSection.d.ts.map +1 -1
- package/dist/render/provenanceSection.js +0 -44
- package/dist/render/provenanceSection.js.map +1 -1
- package/dist/render/reconcilerSteps.d.ts +0 -25
- package/dist/render/reconcilerSteps.d.ts.map +1 -1
- package/dist/render/reconcilerSteps.js +0 -26
- package/dist/render/reconcilerSteps.js.map +1 -1
- package/dist/render/runVerdict.d.ts +0 -38
- package/dist/render/runVerdict.d.ts.map +1 -1
- package/dist/render/runVerdict.js +68 -127
- package/dist/render/runVerdict.js.map +1 -1
- package/dist/render/scenarioCodeErrorsSection.d.ts +3 -0
- package/dist/render/scenarioCodeErrorsSection.d.ts.map +1 -0
- package/dist/render/scenarioCodeErrorsSection.js +42 -0
- package/dist/render/scenarioCodeErrorsSection.js.map +1 -0
- package/dist/render/staticChecks.d.ts +0 -20
- package/dist/render/staticChecks.d.ts.map +1 -1
- package/dist/render/staticChecks.js +1 -59
- package/dist/render/staticChecks.js.map +1 -1
- package/dist/render/stepAccounting.d.ts +0 -36
- package/dist/render/stepAccounting.d.ts.map +1 -1
- package/dist/render/stepAccounting.js +0 -44
- package/dist/render/stepAccounting.js.map +1 -1
- package/dist/render/testVolume.d.ts +0 -25
- package/dist/render/testVolume.d.ts.map +1 -1
- package/dist/render/testVolume.js +0 -32
- package/dist/render/testVolume.js.map +1 -1
- package/package.json +4 -1
- package/dist/domain/checkCharacteristics.d.ts +0 -88
- package/dist/domain/checkCharacteristics.d.ts.map +0 -1
- package/dist/domain/checkCharacteristics.js +0 -109
- package/dist/domain/checkCharacteristics.js.map +0 -1
- package/dist/domain/fitnessChecks.d.ts +0 -79
- package/dist/domain/fitnessChecks.d.ts.map +0 -1
- package/dist/domain/fitnessChecks.js +0 -81
- package/dist/domain/fitnessChecks.js.map +0 -1
- package/dist/lib/featureCode.d.ts +0 -21
- package/dist/lib/featureCode.d.ts.map +0 -1
- package/dist/lib/featureCode.js +0 -24
- package/dist/lib/featureCode.js.map +0 -1
- package/dist/parse/corpusCodeFaults.d.ts +0 -76
- package/dist/parse/corpusCodeFaults.d.ts.map +0 -1
- package/dist/parse/corpusCodeFaults.js +0 -121
- package/dist/parse/corpusCodeFaults.js.map +0 -1
- package/dist/parse/corpusFaults.d.ts +0 -124
- package/dist/parse/corpusFaults.d.ts.map +0 -1
- package/dist/parse/corpusFaults.js +0 -72
- package/dist/parse/corpusFaults.js.map +0 -1
- package/dist/parse/corpusGrammarFaults.d.ts +0 -71
- package/dist/parse/corpusGrammarFaults.d.ts.map +0 -1
- package/dist/parse/corpusGrammarFaults.js +0 -292
- package/dist/parse/corpusGrammarFaults.js.map +0 -1
|
@@ -1,23 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE STATIC-CHECK CENSUS a run banked — the counts line under Summary views, and the corpus's
|
|
3
|
-
* half-converted checks beside it.
|
|
4
|
-
*
|
|
5
|
-
* Its own module rather than a section in `markdown.ts`, which sits at a `max-lines` exception —
|
|
6
|
-
* and an exception excuses existing debt, never headroom. Moved out whole at 3F-3353, when the
|
|
7
|
-
* behavioural-runner cut beside it needed the room; `runVerdict.ts` is the precedent, moved for
|
|
8
|
-
* exactly this reason. NOTHING about the section changed in the move: same emitter, same lines,
|
|
9
|
-
* same omit-when-absent.
|
|
10
|
-
*/
|
|
11
1
|
import type { RenderInput } from "../assemble/renderInput.js";
|
|
12
|
-
/**
|
|
13
|
-
* Static checks (@SCN-USG-001) — the STATIC-check evidence observation side under
|
|
14
|
-
* Summary views, the mirror of `### Test volume` on the runtime axis. Renders the counts line
|
|
15
|
-
* (`N static check(s) run, K uncited static check(s)`) alone — a pure counts summary, symmetric with
|
|
16
|
-
* `### Test volume` (2.4). The named count is implicit (`running − uncited`), so it
|
|
17
|
-
* is no longer printed. The per-guard member detail lives in the rows (named → each
|
|
18
|
-
* scenario's `@lint` sub-row; no-evidence-obligation → the suspense row's `cites-no-scenario` credit items), so
|
|
19
|
-
* no list renders here. Omitted only when no static-check census is threaded (the back-compat path).
|
|
20
|
-
* The counts read off the report's materialised `summary.staticChecks`.
|
|
21
|
-
*/
|
|
22
2
|
export declare const staticChecksSection: (report: RenderInput) => string[];
|
|
23
3
|
//# sourceMappingURL=staticChecks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staticChecks.d.ts","sourceRoot":"","sources":["../../src/render/staticChecks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"staticChecks.d.ts","sourceRoot":"","sources":["../../src/render/staticChecks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,eAAO,MAAM,mBAAmB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAQ/D,CAAC"}
|
|
@@ -1,69 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE STATIC-CHECK CENSUS a run banked — the counts line under Summary views, and the corpus's
|
|
3
|
-
* half-converted checks beside it.
|
|
4
|
-
*
|
|
5
|
-
* Its own module rather than a section in `markdown.ts`, which sits at a `max-lines` exception —
|
|
6
|
-
* and an exception excuses existing debt, never headroom. Moved out whole at 3F-3353, when the
|
|
7
|
-
* behavioural-runner cut beside it needed the room; `runVerdict.ts` is the precedent, moved for
|
|
8
|
-
* exactly this reason. NOTHING about the section changed in the move: same emitter, same lines,
|
|
9
|
-
* same omit-when-absent.
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* A BAR A CONFIGURED ROW STILL CARRIES (@SCN-LNT-035), named `fitnessChecks[<@SCN>].<key>` by the
|
|
13
|
-
* resolver. Its line says something different from a retired top-level key's, because its
|
|
14
|
-
* consequence is different: the row still reaches the books, credited by its own step's outcome;
|
|
15
|
-
* only the number on it is unread.
|
|
16
|
-
*/
|
|
17
|
-
const isRowBar = (key) => key.startsWith("fitnessChecks[");
|
|
18
|
-
/**
|
|
19
|
-
* THE RETIRED-KEY ACCOUNT (@SCN-USG-021) — one line per `specController.*` key this reader has
|
|
20
|
-
* retired that the target's manifest still carries, naming the key and saying what became of it.
|
|
21
|
-
*
|
|
22
|
-
* THE LINE EXISTS BECAUSE THE ALTERNATIVE IS SILENCE, the same argument
|
|
23
|
-
* `behaviouralRunners.ts`'s `unrecognisedKeyAccount` makes for a key the target INVENTED: a
|
|
24
|
-
* consumer who wrote `checkRegistry` in good faith, when it was read, believes it still routes
|
|
25
|
-
* their checks. Nothing reads it now — the entries it names reach no candidate and resolve no
|
|
26
|
-
* citation — so the only remaining question is whether they get to find that out, and this is
|
|
27
|
-
* the answer.
|
|
28
|
-
*/
|
|
29
|
-
const retiredKeyAccount = (keys) => (keys ?? []).map((key) => `- specController.${key} — retired: ${isRowBar(key)
|
|
30
|
-
? "this reader no longer reads a row's bar, and the row is credited by its step's outcome."
|
|
31
|
-
: "this reader no longer reads it, and none of its entries reach the books."}`);
|
|
32
|
-
/**
|
|
33
|
-
* Static checks (@SCN-USG-001) — the STATIC-check evidence observation side under
|
|
34
|
-
* Summary views, the mirror of `### Test volume` on the runtime axis. Renders the counts line
|
|
35
|
-
* (`N static check(s) run, K uncited static check(s)`) alone — a pure counts summary, symmetric with
|
|
36
|
-
* `### Test volume` (2.4). The named count is implicit (`running − uncited`), so it
|
|
37
|
-
* is no longer printed. The per-guard member detail lives in the rows (named → each
|
|
38
|
-
* scenario's `@lint` sub-row; no-evidence-obligation → the suspense row's `cites-no-scenario` credit items), so
|
|
39
|
-
* no list renders here. Omitted only when no static-check census is threaded (the back-compat path).
|
|
40
|
-
* The counts read off the report's materialised `summary.staticChecks`.
|
|
41
|
-
*/
|
|
42
1
|
export const staticChecksSection = (report) => {
|
|
43
|
-
|
|
44
|
-
// the same class of half-entry as an uncited static check — something the run saw and nothing
|
|
45
|
-
// owed — read off the other side of the books. FACTS ONLY, count and ids: the reader is told what
|
|
46
|
-
// the corpus said about itself and left with the one remedy there is, which is to write the row.
|
|
47
|
-
// OMIT-WHEN-EMPTY, so an unconverted corpus renders byte-identically to before.
|
|
48
|
-
const { staticChecks: counts, unconfiguredFitnessScenarios: halfConverted = [] } = report.summary;
|
|
2
|
+
const { staticChecks: counts } = report.summary;
|
|
49
3
|
if (!counts)
|
|
50
4
|
return [];
|
|
51
|
-
// THE RETIRED-KEY ACCOUNT (@SCN-USG-021) renders HERE, under the same heading, because a
|
|
52
|
-
// retired key is a fact about the STATIC axis: every key this reader has retired so far named
|
|
53
|
-
// a route onto this axis's books, never the runtime one. OMIT-WHEN-EMPTY, the same as every
|
|
54
|
-
// account beside it.
|
|
55
|
-
const retired = retiredKeyAccount(report.summary.retiredKeys);
|
|
56
|
-
// A pure counts summary off `summary.staticChecks` (2.4) — symmetric with the
|
|
57
|
-
// runtime `### Test volume` line. There is no census section: the per-guard DETAIL lives in
|
|
58
|
-
// the rows (named → each scenario's `@lint` sub-row; the no-evidence-obligation static-checks surface
|
|
59
|
-
// as `cites-no-scenario` credit items on the `(no scenario)` suspense row). Only the running
|
|
60
|
-
// volume + the uncited count render here; the named count is implicit.
|
|
61
5
|
return [
|
|
62
6
|
"### Static checks", "",
|
|
63
7
|
`${counts.runningStaticCheckCount} static check(s) run, ${counts.uncitedStaticCheckCount} uncited static check(s).`,
|
|
64
8
|
"",
|
|
65
|
-
...(halfConverted.length > 0 ? [`${halfConverted.length} @fitness scenario(s) no configured row names: ${halfConverted.join(", ")}.`, ""] : []),
|
|
66
|
-
...(retired.length > 0 ? [...retired, ""] : []),
|
|
67
9
|
];
|
|
68
10
|
};
|
|
69
11
|
//# sourceMappingURL=staticChecks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staticChecks.js","sourceRoot":"","sources":["../../src/render/staticChecks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"staticChecks.js","sourceRoot":"","sources":["../../src/render/staticChecks.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACnE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO;QACL,mBAAmB,EAAE,EAAE;QACvB,GAAG,MAAM,CAAC,uBAAuB,yBAAyB,MAAM,CAAC,uBAAuB,2BAA2B;QACnH,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,39 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WHAT BECAME OF EVERY STEP THIS RUN READ (@SCN-USG-018) — the population, the four dispositions,
|
|
3
|
-
* and whether they add back up to it.
|
|
4
|
-
*
|
|
5
|
-
* THE SECTION IS THIS AXIS'S FIRST NON-NEGOTIABLE MADE CHECKABLE. Nothing seen is dropped: a step
|
|
6
|
-
* that reaches the reader leaves it as a candidate fitness check, as one of the runners the target
|
|
7
|
-
* named, as the reconciler, or as a step the consumer called a non-check, and there is no fifth
|
|
8
|
-
* outcome. Every section above this one names what a step BECAME, so a step that became nothing is
|
|
9
|
-
* missing from none of them and every one reads exactly as it would have read had the step never
|
|
10
|
-
* existed. This is the only cut of the report that can see an absence, and seeing absences is what
|
|
11
|
-
* the whole axis is for.
|
|
12
|
-
*
|
|
13
|
-
* BOTH TOTALS, SIDE BY SIDE, AND THE SUM IS NOT THE READER'S TO MAKE. `Accounted for` is the
|
|
14
|
-
* figure the count itself arrived at; a reader adding the four dispositions up for themselves
|
|
15
|
-
* would be checking their own arithmetic against nothing, and would go on agreeing with a report
|
|
16
|
-
* whose four figures had lost a step between them. Stated as a pair, the identity is something a
|
|
17
|
-
* consumer reads rather than derives.
|
|
18
|
-
*
|
|
19
|
-
* A TABLE AND THEN A SENTENCE, because the two answer different readers. The row is what a
|
|
20
|
-
* consumer compares against their own pipeline — four candidates and three non-checks is a claim
|
|
21
|
-
* about their file they can check. The line under it is the verdict, and where the figures
|
|
22
|
-
* disagree it names both of them, because a bare "does not balance" over numbers a reader has to
|
|
23
|
-
* subtract for themselves is the report withholding the one thing it knows.
|
|
24
|
-
*
|
|
25
|
-
* Its own module rather than a further section in `markdown.ts`, which sits at a `max-lines`
|
|
26
|
-
* exception — and an exception excuses existing debt, never headroom. The precedent is
|
|
27
|
-
* `runVerdict.ts` and, along this axis, `discoveryScope.ts`, `behaviouralRunners.ts`,
|
|
28
|
-
* `excludedSteps.ts` and `reconcilerSteps.ts`.
|
|
29
|
-
*/
|
|
30
1
|
import type { RenderInput } from "../assemble/renderInput.js";
|
|
31
|
-
/**
|
|
32
|
-
* The accounting, or nothing at all.
|
|
33
|
-
*
|
|
34
|
-
* OMITTED WHERE THE RUN READ NO STEP, which is the only way the count can be empty: the section
|
|
35
|
-
* appears wherever there is a pipeline to account for, and a run handed no CI configuration
|
|
36
|
-
* renders byte-identically to before.
|
|
37
|
-
*/
|
|
38
2
|
export declare const stepAccountingSection: (report: RenderInput) => string[];
|
|
39
3
|
//# sourceMappingURL=stepAccounting.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepAccounting.d.ts","sourceRoot":"","sources":["../../src/render/stepAccounting.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stepAccounting.d.ts","sourceRoot":"","sources":["../../src/render/stepAccounting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAS9D,eAAO,MAAM,qBAAqB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAcjE,CAAC"}
|
|
@@ -1,51 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WHAT BECAME OF EVERY STEP THIS RUN READ (@SCN-USG-018) — the population, the four dispositions,
|
|
3
|
-
* and whether they add back up to it.
|
|
4
|
-
*
|
|
5
|
-
* THE SECTION IS THIS AXIS'S FIRST NON-NEGOTIABLE MADE CHECKABLE. Nothing seen is dropped: a step
|
|
6
|
-
* that reaches the reader leaves it as a candidate fitness check, as one of the runners the target
|
|
7
|
-
* named, as the reconciler, or as a step the consumer called a non-check, and there is no fifth
|
|
8
|
-
* outcome. Every section above this one names what a step BECAME, so a step that became nothing is
|
|
9
|
-
* missing from none of them and every one reads exactly as it would have read had the step never
|
|
10
|
-
* existed. This is the only cut of the report that can see an absence, and seeing absences is what
|
|
11
|
-
* the whole axis is for.
|
|
12
|
-
*
|
|
13
|
-
* BOTH TOTALS, SIDE BY SIDE, AND THE SUM IS NOT THE READER'S TO MAKE. `Accounted for` is the
|
|
14
|
-
* figure the count itself arrived at; a reader adding the four dispositions up for themselves
|
|
15
|
-
* would be checking their own arithmetic against nothing, and would go on agreeing with a report
|
|
16
|
-
* whose four figures had lost a step between them. Stated as a pair, the identity is something a
|
|
17
|
-
* consumer reads rather than derives.
|
|
18
|
-
*
|
|
19
|
-
* A TABLE AND THEN A SENTENCE, because the two answer different readers. The row is what a
|
|
20
|
-
* consumer compares against their own pipeline — four candidates and three non-checks is a claim
|
|
21
|
-
* about their file they can check. The line under it is the verdict, and where the figures
|
|
22
|
-
* disagree it names both of them, because a bare "does not balance" over numbers a reader has to
|
|
23
|
-
* subtract for themselves is the report withholding the one thing it knows.
|
|
24
|
-
*
|
|
25
|
-
* Its own module rather than a further section in `markdown.ts`, which sits at a `max-lines`
|
|
26
|
-
* exception — and an exception excuses existing debt, never headroom. The precedent is
|
|
27
|
-
* `runVerdict.ts` and, along this axis, `discoveryScope.ts`, `behaviouralRunners.ts`,
|
|
28
|
-
* `excludedSteps.ts` and `reconcilerSteps.ts`.
|
|
29
|
-
*/
|
|
30
|
-
/**
|
|
31
|
-
* The verdict line — one sentence, and where the two totals disagree it states both.
|
|
32
|
-
*
|
|
33
|
-
* ONE SENTENCE FOR EITHER DISAGREEMENT, deliberately. A step accounted for as nothing and a step
|
|
34
|
-
* accounted for twice are opposite faults, but the reader's next move is the same in both cases
|
|
35
|
-
* and the figures already say which it is: a second sentence would be a branch nothing in this
|
|
36
|
-
* repository can reach, kept alive to describe a case the guards on the count forbid.
|
|
37
|
-
*/
|
|
38
1
|
const verdictOf = ({ stepsRead, accountedFor }) => accountedFor === stepsRead
|
|
39
2
|
? "- every step this run read is accounted for."
|
|
40
3
|
: `- ${stepsRead} step(s) read, ${accountedFor} accounted for — the four dispositions do not ` +
|
|
41
4
|
`add up to the steps this run read.`;
|
|
42
|
-
/**
|
|
43
|
-
* The accounting, or nothing at all.
|
|
44
|
-
*
|
|
45
|
-
* OMITTED WHERE THE RUN READ NO STEP, which is the only way the count can be empty: the section
|
|
46
|
-
* appears wherever there is a pipeline to account for, and a run handed no CI configuration
|
|
47
|
-
* renders byte-identically to before.
|
|
48
|
-
*/
|
|
49
5
|
export const stepAccountingSection = (report) => {
|
|
50
6
|
const accounting = report.summary.stepAccounting;
|
|
51
7
|
if (accounting === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepAccounting.js","sourceRoot":"","sources":["../../src/render/stepAccounting.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stepAccounting.js","sourceRoot":"","sources":["../../src/render/stepAccounting.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAkB,EAAU,EAAE,CACxE,YAAY,KAAK,SAAS;IACxB,CAAC,CAAC,8CAA8C;IAChD,CAAC,CAAC,KAAK,SAAS,kBAAkB,YAAY,gDAAgD;QAC5F,oCAAoC,CAAC;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;IACjD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;IAC1F,OAAO;QACL,qBAAqB;QACrB,EAAE;QACF,+EAA+E;QAC/E,uCAAuC;QACvC,KAAK,SAAS,MAAM,UAAU,MAAM,OAAO,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAY,IAAI;QAC/F,EAAE;QACF,SAAS,CAAC,UAAU,CAAC;QACrB,EAAE;KACH,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,28 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE RUNTIME TEST-VOLUME CENSUS a run banked — the `### Test volume` cut under Summary views.
|
|
3
|
-
*
|
|
4
|
-
* Its own module rather than a section in `markdown.ts`, which sits at a `max-lines` exception —
|
|
5
|
-
* and an exception excuses existing debt, never headroom. Moved out whole at @SCN-USG-015, when
|
|
6
|
-
* the excluded-step cut beside it needed the room; `runVerdict.ts`, `staticChecks.ts` and
|
|
7
|
-
* `behaviouralRunners.ts` are the precedent, each moved for exactly this reason. It goes out
|
|
8
|
-
* BESIDE `staticChecks.ts` deliberately: that module's own header already calls this section its
|
|
9
|
-
* mirror on the runtime axis, and the two now sit where a reader looking for either finds both.
|
|
10
|
-
* NOTHING about the section changed in the move: same emitter, same lines, same omit-when-absent.
|
|
11
|
-
*/
|
|
12
1
|
import type { RenderInput } from "../assemble/renderInput.js";
|
|
13
|
-
/**
|
|
14
|
-
* Test volume (@SCN-RPT-010) — the evidence-observation side under Summary views, the
|
|
15
|
-
* counterpart to the Evidence reconciliation' evidence-obligation side. Renders the balancing identity
|
|
16
|
-
* (`N evidence observations = a on scenarios + b on phantom scenarios + c on the suspense scenario`,
|
|
17
|
-
* a DERIVED view of the retained aggregate, grouped by the SCENARIO-KIND each credit posted to)
|
|
18
|
-
* then the per-quality-check evidence observation table
|
|
19
|
-
* (all four runtime quality-checks, zeros shown — a fixed tally like Evidence reconciliation).
|
|
20
|
-
* Omitted only when no evidence-observation read is threaded (the 3-arg back-compat path). The
|
|
21
|
-
* identity holds BY CONSTRUCTION (one shared pass in src/evidenceObservations.ts); the renderer
|
|
22
|
-
* only sums what the aggregate already counted by kind. Quality-checks read as their tag words,
|
|
23
|
-
* lowercase (the label-=-tag rule). The numbers read off the report's materialised
|
|
24
|
-
* `summary.testVolume` + `summary.rawByRuntimeQualityCheck` (both Ledger folds, 3F-2103 — the
|
|
25
|
-
* `evidenceObservations` section retired).
|
|
26
|
-
*/
|
|
27
2
|
export declare const testVolumeSection: (report: RenderInput) => string[];
|
|
28
3
|
//# sourceMappingURL=testVolume.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testVolume.d.ts","sourceRoot":"","sources":["../../src/render/testVolume.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testVolume.d.ts","sourceRoot":"","sources":["../../src/render/testVolume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,eAAO,MAAM,iBAAiB,GAAI,QAAQ,WAAW,KAAG,MAAM,EAkB7D,CAAC"}
|
|
@@ -1,42 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE RUNTIME TEST-VOLUME CENSUS a run banked — the `### Test volume` cut under Summary views.
|
|
3
|
-
*
|
|
4
|
-
* Its own module rather than a section in `markdown.ts`, which sits at a `max-lines` exception —
|
|
5
|
-
* and an exception excuses existing debt, never headroom. Moved out whole at @SCN-USG-015, when
|
|
6
|
-
* the excluded-step cut beside it needed the room; `runVerdict.ts`, `staticChecks.ts` and
|
|
7
|
-
* `behaviouralRunners.ts` are the precedent, each moved for exactly this reason. It goes out
|
|
8
|
-
* BESIDE `staticChecks.ts` deliberately: that module's own header already calls this section its
|
|
9
|
-
* mirror on the runtime axis, and the two now sit where a reader looking for either finds both.
|
|
10
|
-
* NOTHING about the section changed in the move: same emitter, same lines, same omit-when-absent.
|
|
11
|
-
*/
|
|
12
1
|
import { RUNTIME_QUALITY_CHECKS } from "../domain/ledger.js";
|
|
13
|
-
/**
|
|
14
|
-
* Test volume (@SCN-RPT-010) — the evidence-observation side under Summary views, the
|
|
15
|
-
* counterpart to the Evidence reconciliation' evidence-obligation side. Renders the balancing identity
|
|
16
|
-
* (`N evidence observations = a on scenarios + b on phantom scenarios + c on the suspense scenario`,
|
|
17
|
-
* a DERIVED view of the retained aggregate, grouped by the SCENARIO-KIND each credit posted to)
|
|
18
|
-
* then the per-quality-check evidence observation table
|
|
19
|
-
* (all four runtime quality-checks, zeros shown — a fixed tally like Evidence reconciliation).
|
|
20
|
-
* Omitted only when no evidence-observation read is threaded (the 3-arg back-compat path). The
|
|
21
|
-
* identity holds BY CONSTRUCTION (one shared pass in src/evidenceObservations.ts); the renderer
|
|
22
|
-
* only sums what the aggregate already counted by kind. Quality-checks read as their tag words,
|
|
23
|
-
* lowercase (the label-=-tag rule). The numbers read off the report's materialised
|
|
24
|
-
* `summary.testVolume` + `summary.rawByRuntimeQualityCheck` (both Ledger folds, 3F-2103 — the
|
|
25
|
-
* `evidenceObservations` section retired).
|
|
26
|
-
*/
|
|
27
2
|
export const testVolumeSection = (report) => {
|
|
28
3
|
const volume = report.summary.testVolume;
|
|
29
4
|
const raw = report.summary.rawByRuntimeQualityCheck;
|
|
30
5
|
if (!volume || !raw)
|
|
31
6
|
return [];
|
|
32
7
|
const total = volume.totalEvidenceObservations;
|
|
33
|
-
// Three DIRECT reads off the materialised kind-counts — the renderer does no arithmetic on this
|
|
34
|
-
// line. The three terms are grouped by the SCENARIO-KIND each credit posted to (the canon
|
|
35
|
-
// grouping): on scenarios (a scenario's account), on phantom scenarios (invented
|
|
36
|
-
// phantom-scenario accounts — many can exist, hence the plural) and on the suspense scenario (the
|
|
37
|
-
// one suspense account, singular — includes broken). The identity total = onScenario +
|
|
38
|
-
// onPhantomScenario + onSuspenseScenario holds BY CONSTRUCTION (one shared runtimeObservationTally
|
|
39
|
-
// fold), so the three printed terms cannot drift from the total.
|
|
40
8
|
const lines = [
|
|
41
9
|
"### Test volume",
|
|
42
10
|
"",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testVolume.js","sourceRoot":"","sources":["../../src/render/testVolume.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"testVolume.js","sourceRoot":"","sources":["../../src/render/testVolume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAmB,EAAY,EAAE;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,yBAAyB,CAAC;IAC/C,MAAM,KAAK,GAAG;QACZ,iBAAiB;QACjB,EAAE;QACF,GAAG,KAAK,4BAA4B,MAAM,CAAC,UAAU,mBAAmB,MAAM,CAAC,iBAAiB,2BAA2B,MAAM,CAAC,kBAAkB,4BAA4B;QAChL,EAAE;QACF,2CAA2C;QAC3C,eAAe;KAChB,CAAC;IACF,KAAK,MAAM,YAAY,IAAI,sBAAsB,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,KAAK,YAAY,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@3f-consulting/spec-controller-core",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.50",
|
|
4
4
|
"description": "The pure, embeddable reconciliation core behind spec-controller — Gherkin/@SCN parse, the evidence model, reconcile primitives, and renderers. No CLI, no I/O.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"reconciliation",
|
|
@@ -32,6 +32,9 @@
|
|
|
32
32
|
"publishConfig": {
|
|
33
33
|
"access": "public"
|
|
34
34
|
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"fast-check": "4.10.1"
|
|
37
|
+
},
|
|
35
38
|
"scripts": {
|
|
36
39
|
"build": "tsc -p tsconfig.build.json"
|
|
37
40
|
},
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE PORTFOLIO'S CHECK CHARACTERISTICS — the words that may name what a fitness check asserts.
|
|
3
|
-
*
|
|
4
|
-
* WHAT THIS IS FOR NOW — A ROLL-UP VOCABULARY, NOT A GATE (3F-3167). A fitness scenario carries
|
|
5
|
-
* one tag, `@fitness`, and names its characteristic as a FIELD on its configured row. The word is
|
|
6
|
-
* therefore a REPORTING LABEL: it is what a report groups its fitness rows by and what the
|
|
7
|
-
* portfolio says out loud about where a product is weak. Nothing parses it, and no check in this
|
|
8
|
-
* repository holds a manifest to this list any more.
|
|
9
|
-
*
|
|
10
|
-
* THE GATE THAT USED TO (3F-2996, retired 3F-3167). The set of words that could name a
|
|
11
|
-
* characteristic was once read out of the target's own check registry and
|
|
12
|
-
* `specController.thresholds`, so adding a registry entry was simultaneously the act that MINTED
|
|
13
|
-
* a characteristic and the act that CERTIFIED it. Fourteen tags for seven characteristics were
|
|
14
|
-
* built over a month in a repository that reconciles its own tree on every push, and nothing
|
|
15
|
-
* redded once (3F-2994). `lint:check-characteristics` closed that, along with a minting ceremony
|
|
16
|
-
* for words canon had not named — and both left when the tag stopped doing two jobs. A word that
|
|
17
|
-
* only labels a roll-up cannot be minted into the parser by a typo, because the parser does not
|
|
18
|
-
* read it. Whether the portfolio SHOULD carry a given word is a canon question, asked of people.
|
|
19
|
-
*
|
|
20
|
-
* THE ROSTER IS STILL THE PORTFOLIO'S, AND IT STILL ARRIVES BY VERSION. Canon names this package
|
|
21
|
-
* as the machine-readable form's home — *"a `spec-controller-core` export or its own shared
|
|
22
|
-
* package … from which each product DERIVES its legal set via its pinned version, refreshed on a
|
|
23
|
-
* bump — never a hand-typed roster"* (`fitness-functions.md` → *Static checks*). Every reconciled
|
|
24
|
-
* product already installs this package to run `balance`, so the export is the smaller of the two
|
|
25
|
-
* shapes canon offers: nothing is published that was not published before, and no consumer gains
|
|
26
|
-
* a dependency. What changed at 3F-3167 is what a consumer DOES with it — group a report, not
|
|
27
|
-
* refuse a build.
|
|
28
|
-
*
|
|
29
|
-
* ON THE PUBLIC `.` BARREL, NEVER `./internal`. A roster only the monorepo can import is
|
|
30
|
-
* reachable by exactly the one product that does not need it.
|
|
31
|
-
*
|
|
32
|
-
* AND THE BARREL ENTRY IS NOT A FROZEN CONTRACT — it stays on its merits (3F-3410). This used to
|
|
33
|
-
* say the entry was a "v1 contract change", reconciled against a hand-written surface updated in
|
|
34
|
-
* the same act. Both halves are gone: that surface left at 3F-3449, and a 0.x package does not
|
|
35
|
-
* freeze its exports, it drops the dead ones in a prerelease (operator, 2026-09-16). So nothing
|
|
36
|
-
* keeps this export here by inertia, and 3F-3410 — which deleted the obligation-side observer from
|
|
37
|
-
* this same barrel for having no caller — asked directly whether this one had one. It does, and not
|
|
38
|
-
* in this repository: canon names it (below), and a sibling product holds a vendored copy naming
|
|
39
|
-
* this module as its source, to be replaced by the import. A shared vocabulary's consumers are
|
|
40
|
-
* outside the repository that publishes it, so a grep of this tree is the wrong population to
|
|
41
|
-
* measure it by.
|
|
42
|
-
*
|
|
43
|
-
* ═══ THIS FILE IS A VENDORED COPY, AND SAYS SO ═══
|
|
44
|
-
*
|
|
45
|
-
* Canon lives in the `strategy` repository, which this one's CI never checks out and a public
|
|
46
|
-
* consumer of an MIT-licensed tool would not have at all — the arrangement the operator ruled
|
|
47
|
-
* for exactly this case (2026-08-03, 3F-2296). So this list is transcribed, and
|
|
48
|
-
* holding it to canon belongs to the strategy repository's CI, where every product is visible. It
|
|
49
|
-
* says so on its face rather than leaving a reader to wonder whether the reconciliation was
|
|
50
|
-
* forgotten.
|
|
51
|
-
*
|
|
52
|
-
* PURE DATA AND ONE PREDICATE — no I/O, nothing imported, so it sits in `domain/` beside
|
|
53
|
-
* the fitness-row readers, and `pnpm lint:boundaries` stays green by construction — the whole of
|
|
54
|
-
* what asks that question, now that `domainPurity` has gone at 3F-3438.
|
|
55
|
-
*/
|
|
56
|
-
/**
|
|
57
|
-
* The characteristics the portfolio carries, transcribed from `fitness-functions.md`.
|
|
58
|
-
*
|
|
59
|
-
* THE WORDS ONLY — WHICH CHECKS SIT UNDER EACH IS NOT RECORDED HERE, AND THAT IS THE POINT
|
|
60
|
-
* (3F-3410). This docblock used to carry canon's grouped-by-characteristic sentence, naming the
|
|
61
|
-
* member checks per word. Canon removed that column on 2026-09-16 and said why in terms: the list
|
|
62
|
-
* had been transcribed HERE, so one unread list had become two drifting ones, and by then most of
|
|
63
|
-
* the checks it named had been deleted from this repository. Membership is recorded once, on each
|
|
64
|
-
* product's own `specController.fitnessChecks` rows — the only place the answer is true and the
|
|
65
|
-
* only place any reconciliation reads it (`dry`: the rows are the fact).
|
|
66
|
-
*
|
|
67
|
-
* TWO GROUPS, WHICH IS CANON'S OWN SPLIT AND NOT A MEMBERSHIP CLAIM. The static checks read the
|
|
68
|
-
* source (or, for `self-balance`, the PRODUCED EVIDENCE rather than the source); the measured ones
|
|
69
|
-
* are assessed by running the suite and measuring it (canon, *Runtime fitness functions*).
|
|
70
|
-
*
|
|
71
|
-
* BARE, AND SORTED BY NEITHER. The words carry no `@` because every reader hands this list bare
|
|
72
|
-
* terms (`bareTerm`, 3F-2976), and the order is canon's own so a reader diffing the two documents
|
|
73
|
-
* reads them in the same sequence.
|
|
74
|
-
*/
|
|
75
|
-
export declare const PORTFOLIO_CHECK_CHARACTERISTICS: readonly string[];
|
|
76
|
-
/**
|
|
77
|
-
* Whether the portfolio roster carries this characteristic.
|
|
78
|
-
*
|
|
79
|
-
* EXACT, AND NEVER A NEAR-MATCH COURTESY. A word the roster does not carry is not resolved to the
|
|
80
|
-
* roster word it resembles: the mint is the act being surfaced, and quietly reading `complexty`
|
|
81
|
-
* as `complexity` would hide exactly what a caller reads this to make visible.
|
|
82
|
-
*
|
|
83
|
-
* The term arrives BARE. Every reader in this repository reaches the roster through the resolvers
|
|
84
|
-
* that already store both terms bare, so stripping a sigil here would be a second reading of what
|
|
85
|
-
* a term bare is — the disagreement between readers that 3F-2976 spent a slice removing.
|
|
86
|
-
*/
|
|
87
|
-
export declare function isPortfolioCharacteristic(characteristic: string): boolean;
|
|
88
|
-
//# sourceMappingURL=checkCharacteristics.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkCharacteristics.d.ts","sourceRoot":"","sources":["../../src/domain/checkCharacteristics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,+BAA+B,EAAE,SAAS,MAAM,EAmB5D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAEzE"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE PORTFOLIO'S CHECK CHARACTERISTICS — the words that may name what a fitness check asserts.
|
|
3
|
-
*
|
|
4
|
-
* WHAT THIS IS FOR NOW — A ROLL-UP VOCABULARY, NOT A GATE (3F-3167). A fitness scenario carries
|
|
5
|
-
* one tag, `@fitness`, and names its characteristic as a FIELD on its configured row. The word is
|
|
6
|
-
* therefore a REPORTING LABEL: it is what a report groups its fitness rows by and what the
|
|
7
|
-
* portfolio says out loud about where a product is weak. Nothing parses it, and no check in this
|
|
8
|
-
* repository holds a manifest to this list any more.
|
|
9
|
-
*
|
|
10
|
-
* THE GATE THAT USED TO (3F-2996, retired 3F-3167). The set of words that could name a
|
|
11
|
-
* characteristic was once read out of the target's own check registry and
|
|
12
|
-
* `specController.thresholds`, so adding a registry entry was simultaneously the act that MINTED
|
|
13
|
-
* a characteristic and the act that CERTIFIED it. Fourteen tags for seven characteristics were
|
|
14
|
-
* built over a month in a repository that reconciles its own tree on every push, and nothing
|
|
15
|
-
* redded once (3F-2994). `lint:check-characteristics` closed that, along with a minting ceremony
|
|
16
|
-
* for words canon had not named — and both left when the tag stopped doing two jobs. A word that
|
|
17
|
-
* only labels a roll-up cannot be minted into the parser by a typo, because the parser does not
|
|
18
|
-
* read it. Whether the portfolio SHOULD carry a given word is a canon question, asked of people.
|
|
19
|
-
*
|
|
20
|
-
* THE ROSTER IS STILL THE PORTFOLIO'S, AND IT STILL ARRIVES BY VERSION. Canon names this package
|
|
21
|
-
* as the machine-readable form's home — *"a `spec-controller-core` export or its own shared
|
|
22
|
-
* package … from which each product DERIVES its legal set via its pinned version, refreshed on a
|
|
23
|
-
* bump — never a hand-typed roster"* (`fitness-functions.md` → *Static checks*). Every reconciled
|
|
24
|
-
* product already installs this package to run `balance`, so the export is the smaller of the two
|
|
25
|
-
* shapes canon offers: nothing is published that was not published before, and no consumer gains
|
|
26
|
-
* a dependency. What changed at 3F-3167 is what a consumer DOES with it — group a report, not
|
|
27
|
-
* refuse a build.
|
|
28
|
-
*
|
|
29
|
-
* ON THE PUBLIC `.` BARREL, NEVER `./internal`. A roster only the monorepo can import is
|
|
30
|
-
* reachable by exactly the one product that does not need it.
|
|
31
|
-
*
|
|
32
|
-
* AND THE BARREL ENTRY IS NOT A FROZEN CONTRACT — it stays on its merits (3F-3410). This used to
|
|
33
|
-
* say the entry was a "v1 contract change", reconciled against a hand-written surface updated in
|
|
34
|
-
* the same act. Both halves are gone: that surface left at 3F-3449, and a 0.x package does not
|
|
35
|
-
* freeze its exports, it drops the dead ones in a prerelease (operator, 2026-09-16). So nothing
|
|
36
|
-
* keeps this export here by inertia, and 3F-3410 — which deleted the obligation-side observer from
|
|
37
|
-
* this same barrel for having no caller — asked directly whether this one had one. It does, and not
|
|
38
|
-
* in this repository: canon names it (below), and a sibling product holds a vendored copy naming
|
|
39
|
-
* this module as its source, to be replaced by the import. A shared vocabulary's consumers are
|
|
40
|
-
* outside the repository that publishes it, so a grep of this tree is the wrong population to
|
|
41
|
-
* measure it by.
|
|
42
|
-
*
|
|
43
|
-
* ═══ THIS FILE IS A VENDORED COPY, AND SAYS SO ═══
|
|
44
|
-
*
|
|
45
|
-
* Canon lives in the `strategy` repository, which this one's CI never checks out and a public
|
|
46
|
-
* consumer of an MIT-licensed tool would not have at all — the arrangement the operator ruled
|
|
47
|
-
* for exactly this case (2026-08-03, 3F-2296). So this list is transcribed, and
|
|
48
|
-
* holding it to canon belongs to the strategy repository's CI, where every product is visible. It
|
|
49
|
-
* says so on its face rather than leaving a reader to wonder whether the reconciliation was
|
|
50
|
-
* forgotten.
|
|
51
|
-
*
|
|
52
|
-
* PURE DATA AND ONE PREDICATE — no I/O, nothing imported, so it sits in `domain/` beside
|
|
53
|
-
* the fitness-row readers, and `pnpm lint:boundaries` stays green by construction — the whole of
|
|
54
|
-
* what asks that question, now that `domainPurity` has gone at 3F-3438.
|
|
55
|
-
*/
|
|
56
|
-
/**
|
|
57
|
-
* The characteristics the portfolio carries, transcribed from `fitness-functions.md`.
|
|
58
|
-
*
|
|
59
|
-
* THE WORDS ONLY — WHICH CHECKS SIT UNDER EACH IS NOT RECORDED HERE, AND THAT IS THE POINT
|
|
60
|
-
* (3F-3410). This docblock used to carry canon's grouped-by-characteristic sentence, naming the
|
|
61
|
-
* member checks per word. Canon removed that column on 2026-09-16 and said why in terms: the list
|
|
62
|
-
* had been transcribed HERE, so one unread list had become two drifting ones, and by then most of
|
|
63
|
-
* the checks it named had been deleted from this repository. Membership is recorded once, on each
|
|
64
|
-
* product's own `specController.fitnessChecks` rows — the only place the answer is true and the
|
|
65
|
-
* only place any reconciliation reads it (`dry`: the rows are the fact).
|
|
66
|
-
*
|
|
67
|
-
* TWO GROUPS, WHICH IS CANON'S OWN SPLIT AND NOT A MEMBERSHIP CLAIM. The static checks read the
|
|
68
|
-
* source (or, for `self-balance`, the PRODUCED EVIDENCE rather than the source); the measured ones
|
|
69
|
-
* are assessed by running the suite and measuring it (canon, *Runtime fitness functions*).
|
|
70
|
-
*
|
|
71
|
-
* BARE, AND SORTED BY NEITHER. The words carry no `@` because every reader hands this list bare
|
|
72
|
-
* terms (`bareTerm`, 3F-2976), and the order is canon's own so a reader diffing the two documents
|
|
73
|
-
* reads them in the same sequence.
|
|
74
|
-
*/
|
|
75
|
-
export const PORTFOLIO_CHECK_CHARACTERISTICS = [
|
|
76
|
-
// Static checks
|
|
77
|
-
"complexity",
|
|
78
|
-
"function-length",
|
|
79
|
-
"tech-conformance",
|
|
80
|
-
"vocab",
|
|
81
|
-
"traceability",
|
|
82
|
-
"lint",
|
|
83
|
-
"flag-hygiene",
|
|
84
|
-
"doc-accuracy",
|
|
85
|
-
"typecheck",
|
|
86
|
-
"security",
|
|
87
|
-
"licence",
|
|
88
|
-
"bundle-size",
|
|
89
|
-
"self-balance",
|
|
90
|
-
// Measured
|
|
91
|
-
"ci-run-time",
|
|
92
|
-
"coverage",
|
|
93
|
-
"mutation",
|
|
94
|
-
];
|
|
95
|
-
/**
|
|
96
|
-
* Whether the portfolio roster carries this characteristic.
|
|
97
|
-
*
|
|
98
|
-
* EXACT, AND NEVER A NEAR-MATCH COURTESY. A word the roster does not carry is not resolved to the
|
|
99
|
-
* roster word it resembles: the mint is the act being surfaced, and quietly reading `complexty`
|
|
100
|
-
* as `complexity` would hide exactly what a caller reads this to make visible.
|
|
101
|
-
*
|
|
102
|
-
* The term arrives BARE. Every reader in this repository reaches the roster through the resolvers
|
|
103
|
-
* that already store both terms bare, so stripping a sigil here would be a second reading of what
|
|
104
|
-
* a term bare is — the disagreement between readers that 3F-2976 spent a slice removing.
|
|
105
|
-
*/
|
|
106
|
-
export function isPortfolioCharacteristic(characteristic) {
|
|
107
|
-
return PORTFOLIO_CHECK_CHARACTERISTICS.includes(characteristic);
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=checkCharacteristics.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkCharacteristics.js","sourceRoot":"","sources":["../../src/domain/checkCharacteristics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAsB;IAChE,gBAAgB;IAChB,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,OAAO;IACP,cAAc;IACd,MAAM;IACN,cAAc;IACd,cAAc;IACd,WAAW;IACX,UAAU;IACV,SAAS;IACT,aAAa;IACb,cAAc;IACd,WAAW;IACX,aAAa;IACb,UAAU;IACV,UAAU;CACX,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CAAC,cAAsB;IAC9D,OAAO,+BAA+B,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE FITNESS CHECK ROWS — what a CONVERTED check says about itself, keyed by the `@SCN` it is
|
|
3
|
-
* about.
|
|
4
|
-
*
|
|
5
|
-
* @SCN the row what the corpus then reads
|
|
6
|
-
* SCN-FIT-001 { characteristic: complexity } a @fitness scenario owes `complexity`
|
|
7
|
-
*
|
|
8
|
-
* THE TAG NAMES THE AXIS AND THE ROW NAMES THE SUBJECT. A bare characteristic tag answered two
|
|
9
|
-
* questions at once — how a claim is proved, and what it is about — and the tier tags answer only
|
|
10
|
-
* the first. So a converted scenario carries `@fitness` alone, and the characteristic moves here,
|
|
11
|
-
* where it stays a first-class word the roll-up still groups by.
|
|
12
|
-
*
|
|
13
|
-
* NOT A SECOND OBLIGATION SHAPE. What a `@fitness` scenario raises is the same
|
|
14
|
-
* `{ qualityCheck: "lint", staticCheck: <characteristic> }` a registered bare tag raises today, so
|
|
15
|
-
* the pair key, the reconciler's static arm and the report's roll-up are all untouched. What
|
|
16
|
-
* changed is only where the word came from.
|
|
17
|
-
*
|
|
18
|
-
* NOT THE (RETIRED) CHECK REGISTRY, AND THE DIFFERENCE IS THE SEAM THIS RETIRES. That registry
|
|
19
|
-
* answered "which check is this runnable script handle", because a handle does not know what it
|
|
20
|
-
* is for; the `@SCN`
|
|
21
|
-
* is then resolved through the corpus, a second hop. A converted check is never discovered as a
|
|
22
|
-
* handle — it is a scenario that ran, carrying its own tag line — so the `@SCN` is the KEY here
|
|
23
|
-
* rather than something a lookup has to recover.
|
|
24
|
-
*
|
|
25
|
-
* PURE AND INJECTED — the rows arrive as data, read from the TARGET's own manifest at the app edge
|
|
26
|
-
* (`specController.fitnessChecks`), the stance the retired `thresholdsOf` took. A target that
|
|
27
|
-
* configures nothing raises nothing, so the reading is inert on a corpus
|
|
28
|
-
* nobody has converted.
|
|
29
|
-
*/
|
|
30
|
-
/**
|
|
31
|
-
* ONE CONFIGURED ROW as the obligation rule reads it.
|
|
32
|
-
*
|
|
33
|
-
* The `scn` a row states is not a member here: it is this index's KEY, so a row cannot name one
|
|
34
|
-
* scenario and be filed under another. The command a row states is not a member either — it is the
|
|
35
|
-
* COMMAND half of the row and nothing on the debit side reads it. Every row is credited by its own
|
|
36
|
-
* step's outcome in the run's record, so the characteristic is the whole of what the ledger reads.
|
|
37
|
-
*/
|
|
38
|
-
export interface FitnessCheck {
|
|
39
|
-
/** The bare characteristic this check asserts (`complexity`). */
|
|
40
|
-
readonly characteristic: string;
|
|
41
|
-
}
|
|
42
|
-
/** The rows as the rule reads them — bare `@SCN` → the row naming that scenario's check. */
|
|
43
|
-
export type FitnessCheckIndex = ReadonlyMap<string, FitnessCheck>;
|
|
44
|
-
/**
|
|
45
|
-
* Build the index from the rows a manifest holds.
|
|
46
|
-
*
|
|
47
|
-
* A LIST, NOT A BLOCK KEYED BY `@SCN`, and the shape is the row's own argument: a row is what a
|
|
48
|
-
* check says about ITSELF — its `@SCN`, its characteristic, its command — so no one of those three
|
|
49
|
-
* is promoted above the others by being the key somebody has to write it under. The `@SCN` becomes
|
|
50
|
-
* the key HERE, where a lookup needs one.
|
|
51
|
-
*
|
|
52
|
-
* A MALFORMED ROW IS DROPPED, NOT TRUSTED AND NOT THROWN ON — the defensive stance the whole
|
|
53
|
-
* `specController.*` family takes. Config is data from outside, and a reader that throws on a typo
|
|
54
|
-
* turns one bad character into a run that produces no verdict at all, which is loud nowhere; a
|
|
55
|
-
* dropped row leaves its scenario naming no characteristic, which the corpus reports.
|
|
56
|
-
*/
|
|
57
|
-
export declare function fitnessChecksOf(entries: unknown): FitnessCheckIndex;
|
|
58
|
-
/**
|
|
59
|
-
* ONE CONFIGURED ROW THE TARGET'S CORPUS CARRIES NO SCENARIO FOR (3F-3472) — a check the manifest
|
|
60
|
-
* declares and nothing in the corpus specifies.
|
|
61
|
-
*
|
|
62
|
-
* THE MIRROR OF `unconfiguredFitnessScenarios`, AND THE HALF THE BOOKS COULD NOT SEE. That one
|
|
63
|
-
* reads a `@fitness` scenario no row names; this reads a row no scenario names. The asymmetry
|
|
64
|
-
* between what each EARNS is the two facts' own: a scenario naming no row names no characteristic,
|
|
65
|
-
* so there is nothing to put on the books and the census says who — a row names one, so there IS a
|
|
66
|
-
* debit, and `features/fitness-checks.feature` promises it as "an Evidence Obligation nothing
|
|
67
|
-
* observed".
|
|
68
|
-
*
|
|
69
|
-
* IT CARRIES THE CHARACTERISTIC BECAUSE THE OBLIGATION IT RAISES NAMES ONE. The `@SCN` alone would
|
|
70
|
-
* leave the reader of this reading to go back to the index for the other half, which is the second
|
|
71
|
-
* read `readTargetCorpus` composes its readings together to foreclose.
|
|
72
|
-
*/
|
|
73
|
-
export interface UnspecifiedFitnessRow {
|
|
74
|
-
/** The `@SCN` the row states, which no scenario in the target's corpus carries. */
|
|
75
|
-
readonly scnId: string;
|
|
76
|
-
/** The bare characteristic the row asserts (`complexity`) — what its debit is owed at. */
|
|
77
|
-
readonly characteristic: string;
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=fitnessChecks.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fitnessChecks.d.ts","sourceRoot":"","sources":["../../src/domain/fitnessChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,4FAA4F;AAC5F,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AA2BlE;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAQnE;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC"}
|