@gate-forge/core 0.1.0
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/LICENSE +202 -0
- package/dist/baselines/adoption.d.ts +76 -0
- package/dist/baselines/adoption.d.ts.map +1 -0
- package/dist/baselines/adoption.js +163 -0
- package/dist/baselines/adoption.js.map +1 -0
- package/dist/baselines/index.d.ts +102 -0
- package/dist/baselines/index.d.ts.map +1 -0
- package/dist/baselines/index.js +186 -0
- package/dist/baselines/index.js.map +1 -0
- package/dist/canonical-json.d.ts +51 -0
- package/dist/canonical-json.d.ts.map +1 -0
- package/dist/canonical-json.js +112 -0
- package/dist/canonical-json.js.map +1 -0
- package/dist/classifier/bind.d.ts +64 -0
- package/dist/classifier/bind.d.ts.map +1 -0
- package/dist/classifier/bind.js +188 -0
- package/dist/classifier/bind.js.map +1 -0
- package/dist/classifier/classify.d.ts +154 -0
- package/dist/classifier/classify.d.ts.map +1 -0
- package/dist/classifier/classify.js +1207 -0
- package/dist/classifier/classify.js.map +1 -0
- package/dist/classifier/glob.d.ts +48 -0
- package/dist/classifier/glob.d.ts.map +1 -0
- package/dist/classifier/glob.js +104 -0
- package/dist/classifier/glob.js.map +1 -0
- package/dist/classifier/index.d.ts +10 -0
- package/dist/classifier/index.d.ts.map +1 -0
- package/dist/classifier/index.js +21 -0
- package/dist/classifier/index.js.map +1 -0
- package/dist/classifier/schema.d.ts +150 -0
- package/dist/classifier/schema.d.ts.map +1 -0
- package/dist/classifier/schema.js +139 -0
- package/dist/classifier/schema.js.map +1 -0
- package/dist/config/index.d.ts +259 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +523 -0
- package/dist/config/index.js.map +1 -0
- package/dist/fingerprints.d.ts +56 -0
- package/dist/fingerprints.d.ts.map +1 -0
- package/dist/fingerprints.js +59 -0
- package/dist/fingerprints.js.map +1 -0
- package/dist/graph/build.d.ts +16 -0
- package/dist/graph/build.d.ts.map +1 -0
- package/dist/graph/build.js +423 -0
- package/dist/graph/build.js.map +1 -0
- package/dist/graph/index.d.ts +12 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +10 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/schema.d.ts +448 -0
- package/dist/graph/schema.d.ts.map +1 -0
- package/dist/graph/schema.js +237 -0
- package/dist/graph/schema.js.map +1 -0
- package/dist/graph/symbols.d.ts +129 -0
- package/dist/graph/symbols.d.ts.map +1 -0
- package/dist/graph/symbols.js +177 -0
- package/dist/graph/symbols.js.map +1 -0
- package/dist/graph/util.d.ts +40 -0
- package/dist/graph/util.d.ts.map +1 -0
- package/dist/graph/util.js +41 -0
- package/dist/graph/util.js.map +1 -0
- package/dist/index.d.ts +683 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +563 -0
- package/dist/index.js.map +1 -0
- package/dist/mapping/resolve.d.ts +177 -0
- package/dist/mapping/resolve.d.ts.map +1 -0
- package/dist/mapping/resolve.js +523 -0
- package/dist/mapping/resolve.js.map +1 -0
- package/dist/policy/coverage.d.ts +79 -0
- package/dist/policy/coverage.d.ts.map +1 -0
- package/dist/policy/coverage.js +119 -0
- package/dist/policy/coverage.js.map +1 -0
- package/dist/policy/evaluate.d.ts +275 -0
- package/dist/policy/evaluate.d.ts.map +1 -0
- package/dist/policy/evaluate.js +382 -0
- package/dist/policy/evaluate.js.map +1 -0
- package/dist/policy/index.d.ts +15 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +14 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/trusted.d.ts +59 -0
- package/dist/policy/trusted.d.ts.map +1 -0
- package/dist/policy/trusted.js +96 -0
- package/dist/policy/trusted.js.map +1 -0
- package/dist/provenance.d.ts +170 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +306 -0
- package/dist/provenance.js.map +1 -0
- package/dist/receipt/index.d.ts +74 -0
- package/dist/receipt/index.d.ts.map +1 -0
- package/dist/receipt/index.js +154 -0
- package/dist/receipt/index.js.map +1 -0
- package/dist/report/index.d.ts +100 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +355 -0
- package/dist/report/index.js.map +1 -0
- package/dist/schemas/adoption.d.ts +40 -0
- package/dist/schemas/adoption.d.ts.map +1 -0
- package/dist/schemas/adoption.js +87 -0
- package/dist/schemas/adoption.js.map +1 -0
- package/dist/schemas/baseline.d.ts +19 -0
- package/dist/schemas/baseline.d.ts.map +1 -0
- package/dist/schemas/baseline.js +45 -0
- package/dist/schemas/baseline.js.map +1 -0
- package/dist/schemas/claim.d.ts +32 -0
- package/dist/schemas/claim.d.ts.map +1 -0
- package/dist/schemas/claim.js +34 -0
- package/dist/schemas/claim.js.map +1 -0
- package/dist/schemas/classification-policy.d.ts +84 -0
- package/dist/schemas/classification-policy.d.ts.map +1 -0
- package/dist/schemas/classification-policy.js +130 -0
- package/dist/schemas/classification-policy.js.map +1 -0
- package/dist/schemas/classification-signal.d.ts +125 -0
- package/dist/schemas/classification-signal.d.ts.map +1 -0
- package/dist/schemas/classification-signal.js +126 -0
- package/dist/schemas/classification-signal.js.map +1 -0
- package/dist/schemas/classification.d.ts +120 -0
- package/dist/schemas/classification.d.ts.map +1 -0
- package/dist/schemas/classification.js +154 -0
- package/dist/schemas/classification.js.map +1 -0
- package/dist/schemas/common.d.ts +73 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +60 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/coverage-policy.d.ts +89 -0
- package/dist/schemas/coverage-policy.d.ts.map +1 -0
- package/dist/schemas/coverage-policy.js +81 -0
- package/dist/schemas/coverage-policy.js.map +1 -0
- package/dist/schemas/evidence.d.ts +65 -0
- package/dist/schemas/evidence.d.ts.map +1 -0
- package/dist/schemas/evidence.js +64 -0
- package/dist/schemas/evidence.js.map +1 -0
- package/dist/schemas/execution-result.d.ts +214 -0
- package/dist/schemas/execution-result.d.ts.map +1 -0
- package/dist/schemas/execution-result.js +240 -0
- package/dist/schemas/execution-result.js.map +1 -0
- package/dist/schemas/gate-receipt.d.ts +86 -0
- package/dist/schemas/gate-receipt.d.ts.map +1 -0
- package/dist/schemas/gate-receipt.js +193 -0
- package/dist/schemas/gate-receipt.js.map +1 -0
- package/dist/schemas/index.d.ts +22 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +22 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/obligation.d.ts +37 -0
- package/dist/schemas/obligation.d.ts.map +1 -0
- package/dist/schemas/obligation.js +46 -0
- package/dist/schemas/obligation.js.map +1 -0
- package/dist/schemas/plugin.d.ts +19 -0
- package/dist/schemas/plugin.d.ts.map +1 -0
- package/dist/schemas/plugin.js +20 -0
- package/dist/schemas/plugin.js.map +1 -0
- package/dist/schemas/policy.d.ts +73 -0
- package/dist/schemas/policy.d.ts.map +1 -0
- package/dist/schemas/policy.js +46 -0
- package/dist/schemas/policy.js.map +1 -0
- package/dist/schemas/resource.d.ts +26 -0
- package/dist/schemas/resource.d.ts.map +1 -0
- package/dist/schemas/resource.js +29 -0
- package/dist/schemas/resource.js.map +1 -0
- package/dist/schemas/run-manifest.d.ts +72 -0
- package/dist/schemas/run-manifest.d.ts.map +1 -0
- package/dist/schemas/run-manifest.js +125 -0
- package/dist/schemas/run-manifest.js.map +1 -0
- package/dist/schemas/runner-adapter.d.ts +169 -0
- package/dist/schemas/runner-adapter.d.ts.map +1 -0
- package/dist/schemas/runner-adapter.js +2 -0
- package/dist/schemas/runner-adapter.js.map +1 -0
- package/dist/schemas/test-catalog.d.ts +472 -0
- package/dist/schemas/test-catalog.d.ts.map +1 -0
- package/dist/schemas/test-catalog.js +311 -0
- package/dist/schemas/test-catalog.js.map +1 -0
- package/dist/schemas/test-map.d.ts +99 -0
- package/dist/schemas/test-map.d.ts.map +1 -0
- package/dist/schemas/test-map.js +103 -0
- package/dist/schemas/test-map.js.map +1 -0
- package/dist/schemas/verdict.d.ts +73 -0
- package/dist/schemas/verdict.d.ts.map +1 -0
- package/dist/schemas/verdict.js +92 -0
- package/dist/schemas/verdict.js.map +1 -0
- package/dist/schemas/waiver.d.ts +36 -0
- package/dist/schemas/waiver.d.ts.map +1 -0
- package/dist/schemas/waiver.js +42 -0
- package/dist/schemas/waiver.js.map +1 -0
- package/dist/supervision/index.d.ts +170 -0
- package/dist/supervision/index.d.ts.map +1 -0
- package/dist/supervision/index.js +354 -0
- package/dist/supervision/index.js.map +1 -0
- package/dist/testing/clock.d.ts +50 -0
- package/dist/testing/clock.d.ts.map +1 -0
- package/dist/testing/clock.js +75 -0
- package/dist/testing/clock.js.map +1 -0
- package/dist/testing/env.d.ts +66 -0
- package/dist/testing/env.d.ts.map +1 -0
- package/dist/testing/env.js +106 -0
- package/dist/testing/env.js.map +1 -0
- package/dist/testing/gate-runner.d.ts +141 -0
- package/dist/testing/gate-runner.d.ts.map +1 -0
- package/dist/testing/gate-runner.js +173 -0
- package/dist/testing/gate-runner.js.map +1 -0
- package/dist/testing/gf19.d.ts +106 -0
- package/dist/testing/gf19.d.ts.map +1 -0
- package/dist/testing/gf19.js +282 -0
- package/dist/testing/gf19.js.map +1 -0
- package/dist/testing/index.d.ts +20 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +14 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/red-probe.d.ts +138 -0
- package/dist/testing/red-probe.d.ts.map +1 -0
- package/dist/testing/red-probe.js +251 -0
- package/dist/testing/red-probe.js.map +1 -0
- package/dist/testing/temp-repo.d.ts +126 -0
- package/dist/testing/temp-repo.d.ts.map +1 -0
- package/dist/testing/temp-repo.js +214 -0
- package/dist/testing/temp-repo.js.map +1 -0
- package/dist/verdict/cause.d.ts +99 -0
- package/dist/verdict/cause.d.ts.map +1 -0
- package/dist/verdict/cause.js +206 -0
- package/dist/verdict/cause.js.map +1 -0
- package/dist/verdict/evaluate.d.ts +135 -0
- package/dist/verdict/evaluate.d.ts.map +1 -0
- package/dist/verdict/evaluate.js +1513 -0
- package/dist/verdict/evaluate.js.map +1 -0
- package/dist/verdict/index.d.ts +21 -0
- package/dist/verdict/index.d.ts.map +1 -0
- package/dist/verdict/index.js +20 -0
- package/dist/verdict/index.js.map +1 -0
- package/dist/verdict/pack-verifiers.d.ts +97 -0
- package/dist/verdict/pack-verifiers.d.ts.map +1 -0
- package/dist/verdict/pack-verifiers.js +763 -0
- package/dist/verdict/pack-verifiers.js.map +1 -0
- package/dist/verdict/registry.d.ts +180 -0
- package/dist/verdict/registry.d.ts.map +1 -0
- package/dist/verdict/registry.js +67 -0
- package/dist/verdict/registry.js.map +1 -0
- package/dist/waivers/index.d.ts +103 -0
- package/dist/waivers/index.d.ts.map +1 -0
- package/dist/waivers/index.js +192 -0
- package/dist/waivers/index.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE mapping resolver (plan 2026-09-13 §5.3, Phase 3 item 1):
|
|
3
|
+
* normalizes native annotation claims, sidecar declarations, prior-run
|
|
4
|
+
* hints, and inference into a single resolved-mappings surface that the
|
|
5
|
+
* grading seam and the suggestion surface both read.
|
|
6
|
+
*
|
|
7
|
+
* Hard rules encoded here (§5.2/§5.3):
|
|
8
|
+
* - many-to-many mappings are valid; exact duplicates (native + sidecar
|
|
9
|
+
* declaring the same test/obligation) deduplicate idempotently;
|
|
10
|
+
* - contradictions (conflicting kinds across entries, a declared kind
|
|
11
|
+
* against strong observed signals or observed mocking) are typed
|
|
12
|
+
* TEST_MAPPING_AMBIGUOUS problems naming BOTH locations — never
|
|
13
|
+
* "whichever ran last";
|
|
14
|
+
* - stale declarations (deleted/renamed tests, changed title paths,
|
|
15
|
+
* unknown obligation ids) are typed TEST_MAPPING_STALE problems that
|
|
16
|
+
* name what vanished; a rename yields a migration suggestion, never a
|
|
17
|
+
* silent transfer;
|
|
18
|
+
* - wildcards are prohibited in strict mode: a file-level selector (no
|
|
19
|
+
* titlePath) is an unsafe declaration and binds nothing;
|
|
20
|
+
* - inference NEVER auto-writes a mapping: inferred bindings are marked
|
|
21
|
+
* `origin: 'inferred'`, are excluded from grading claims, and only
|
|
22
|
+
* feed suggestions;
|
|
23
|
+
* - a mapping DECLARES INTENT and supplies no test result — grading
|
|
24
|
+
* claims produced here still require witnessed evidence (the CLI seam
|
|
25
|
+
* injects them as declared claims, so a mapped-but-unexecuted
|
|
26
|
+
* obligation grades EVIDENCE_NOT_COLLECTED, never satisfied).
|
|
27
|
+
*
|
|
28
|
+
* Deterministic: identical inputs produce identical outputs; every array
|
|
29
|
+
* is sorted (compareStrings order) and no SHA-256-style Set iteration
|
|
30
|
+
* leaks into ordering.
|
|
31
|
+
*/
|
|
32
|
+
import { compareStrings } from '../graph/util.js';
|
|
33
|
+
import { ClaimSchema } from '../schemas/claim.js';
|
|
34
|
+
import { CAUSE_NEXT_ACTIONS } from '../schemas/verdict.js';
|
|
35
|
+
/** Sort rank of binding origins (declared first, hints last). */
|
|
36
|
+
const ORIGIN_RANK = Object.freeze({
|
|
37
|
+
native: 0,
|
|
38
|
+
sidecar: 1,
|
|
39
|
+
'prior-run': 2,
|
|
40
|
+
inferred: 3,
|
|
41
|
+
});
|
|
42
|
+
/** Sort rank of problem causes (deterministic output order). */
|
|
43
|
+
const PROBLEM_RANK = Object.freeze({
|
|
44
|
+
TEST_MAPPING_AMBIGUOUS: 0,
|
|
45
|
+
TEST_MAPPING_STALE: 1,
|
|
46
|
+
TEST_KIND_UNKNOWN: 2,
|
|
47
|
+
});
|
|
48
|
+
/** Test kinds that claim end-to-end proof (mocking disqualifies them, §3.2). */
|
|
49
|
+
const E2E_KINDS = new Set(['browser-e2e', 'api-e2e']);
|
|
50
|
+
/**
|
|
51
|
+
* Whether a catalog row matches a sidecar selector exactly (§5.2: line
|
|
52
|
+
* numbers and digests are never identity inputs).
|
|
53
|
+
*/
|
|
54
|
+
function matchesSelector(row, selector) {
|
|
55
|
+
if (row.runner !== selector.runner || row.file !== selector.file)
|
|
56
|
+
return false;
|
|
57
|
+
if (selector.project !== undefined && row.project !== selector.project)
|
|
58
|
+
return false;
|
|
59
|
+
if (selector.titlePath !== undefined && selector.titlePath.join('>') !== row.titlePath.join('>')) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
/** Projects a catalog row to its instance identity. */
|
|
65
|
+
function instanceOf(row) {
|
|
66
|
+
return {
|
|
67
|
+
runner: row.runner,
|
|
68
|
+
project: row.project,
|
|
69
|
+
file: row.file,
|
|
70
|
+
titlePath: [...row.titlePath],
|
|
71
|
+
parameterIdentity: row.parameterIdentity,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolves native claims, sidecar declarations, prior-run hints, and
|
|
76
|
+
* inference into the one resolved-mappings surface.
|
|
77
|
+
*
|
|
78
|
+
* Args:
|
|
79
|
+
* input: catalog, native claims, validated sidecar, obligation ids,
|
|
80
|
+
* and optional prior-run hints.
|
|
81
|
+
*
|
|
82
|
+
* Returns:
|
|
83
|
+
* ResolvedMappings: per-obligation bindings plus typed problems, all
|
|
84
|
+
* deterministically sorted.
|
|
85
|
+
*/
|
|
86
|
+
export function resolveTestMappings(input) {
|
|
87
|
+
const registry = new Set(input.obligationIds);
|
|
88
|
+
const rowsByKey = new Map(input.catalog.entries.map((row) => [row.logicalKey, row]));
|
|
89
|
+
const problems = [];
|
|
90
|
+
const seenProblems = new Set();
|
|
91
|
+
/** obligationId → logicalKey → binding. */
|
|
92
|
+
const byObligation = new Map();
|
|
93
|
+
const pushProblem = (problem) => {
|
|
94
|
+
const dedupeKey = `${problem.cause}\u0000${problem.obligationId ?? ''}\u0000${problem.detail}`;
|
|
95
|
+
if (seenProblems.has(dedupeKey))
|
|
96
|
+
return;
|
|
97
|
+
seenProblems.add(dedupeKey);
|
|
98
|
+
problems.push(problem);
|
|
99
|
+
};
|
|
100
|
+
const bindingsFor = (obligationId) => {
|
|
101
|
+
let existing = byObligation.get(obligationId);
|
|
102
|
+
if (existing === undefined) {
|
|
103
|
+
existing = new Map();
|
|
104
|
+
byObligation.set(obligationId, existing);
|
|
105
|
+
}
|
|
106
|
+
return existing;
|
|
107
|
+
};
|
|
108
|
+
// --- sidecar declarations ------------------------------------------------
|
|
109
|
+
const sidecarEntries = [...input.sidecar.tests].sort((a, b) => compareStrings(a.key, b.key));
|
|
110
|
+
for (const entry of sidecarEntries) {
|
|
111
|
+
const claims = [...new Set(entry.claims)].sort(compareStrings);
|
|
112
|
+
const matched = input.catalog.entries
|
|
113
|
+
.filter((row) => matchesSelector(row, entry.selector))
|
|
114
|
+
.sort((a, b) => compareStrings(a.logicalKey, b.logicalKey));
|
|
115
|
+
// Wildcard prohibition (§5.2): a file-level selector covers a whole
|
|
116
|
+
// file — an unsafe declaration that binds NOTHING (fail closed).
|
|
117
|
+
if (entry.selector.titlePath === undefined) {
|
|
118
|
+
for (const obligationId of claims) {
|
|
119
|
+
pushProblem({
|
|
120
|
+
cause: 'TEST_MAPPING_AMBIGUOUS',
|
|
121
|
+
obligationId,
|
|
122
|
+
detail: `sidecar entry '${entry.key}' uses a file-level selector (no titlePath) for ` +
|
|
123
|
+
`'${entry.selector.file}' — wildcard declarations are prohibited in strict mode; ` +
|
|
124
|
+
'declare the exact test title path',
|
|
125
|
+
locations: [{ file: entry.selector.file, line: 1, col: 0 }],
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// Stale declaration (§5.2): the selector no longer matches the
|
|
131
|
+
// catalog. Name what vanished; suggest a migration on a rename.
|
|
132
|
+
if (matched.length === 0) {
|
|
133
|
+
const renameTarget = input.catalog.entries.find((row) => row.file === entry.selector.file &&
|
|
134
|
+
row.titlePath.join('>') === (entry.selector.titlePath ?? []).join('>'));
|
|
135
|
+
const sameFile = input.catalog.entries.filter((row) => row.file === entry.selector.file);
|
|
136
|
+
const vanished = renameTarget !== undefined
|
|
137
|
+
? `the test now appears as key '${renameTarget.logicalKey}' — migrate the declaration to ` +
|
|
138
|
+
'the new key (never silently transfer the old declaration or its proof)'
|
|
139
|
+
: sameFile.length > 0
|
|
140
|
+
? `the file still exists but its title path changed (current: ${sameFile
|
|
141
|
+
.slice(0, 3)
|
|
142
|
+
.map((row) => `'${row.titlePath.join('>')}'`)
|
|
143
|
+
.join(', ')})`
|
|
144
|
+
: `the file '${entry.selector.file}' has no catalog rows anymore`;
|
|
145
|
+
for (const obligationId of claims) {
|
|
146
|
+
if (!registry.has(obligationId))
|
|
147
|
+
continue;
|
|
148
|
+
pushProblem({
|
|
149
|
+
cause: 'TEST_MAPPING_STALE',
|
|
150
|
+
obligationId,
|
|
151
|
+
detail: `sidecar key '${entry.key}' no longer matches the catalog ` +
|
|
152
|
+
`(selector ${entry.selector.runner}/${entry.selector.project ?? '*'}:` +
|
|
153
|
+
`${entry.selector.file}:${(entry.selector.titlePath ?? []).join('>')}): ${vanished}`,
|
|
154
|
+
locations: renameTarget !== undefined ? [renameTarget.sourceLocation] : [],
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// Unknown obligation ids (§5.4 TEST_MAPPING_STALE): the declaration
|
|
160
|
+
// points outside the registry — the obligation vanished or the id is
|
|
161
|
+
// misspelled. Other claims of the same entry still bind.
|
|
162
|
+
for (const obligationId of claims) {
|
|
163
|
+
if (!registry.has(obligationId)) {
|
|
164
|
+
pushProblem({
|
|
165
|
+
cause: 'TEST_MAPPING_STALE',
|
|
166
|
+
obligationId,
|
|
167
|
+
detail: `sidecar entry '${entry.key}' claims '${obligationId}', which is not in the current ` +
|
|
168
|
+
'obligation registry (the obligation vanished or the id is misspelled); correct the mapping',
|
|
169
|
+
locations: [matched[0]?.sourceLocation ?? { file: entry.selector.file, line: 1, col: 0 }],
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Kind contradictions (§5.3: an explicit kind may resolve `unknown`,
|
|
174
|
+
// but cannot override strong observed signals or observed mocking).
|
|
175
|
+
for (const row of matched) {
|
|
176
|
+
if (entry.kind === undefined) {
|
|
177
|
+
if (row.inferredKind === 'unknown') {
|
|
178
|
+
for (const obligationId of claims) {
|
|
179
|
+
if (!registry.has(obligationId))
|
|
180
|
+
continue;
|
|
181
|
+
pushProblem({
|
|
182
|
+
cause: 'TEST_KIND_UNKNOWN',
|
|
183
|
+
obligationId,
|
|
184
|
+
detail: `test '${entry.key}' (${row.file}:${row.titlePath.join('>')}) is relevant but ` +
|
|
185
|
+
'code analysis could not classify its kind — inspect and declare its kind',
|
|
186
|
+
locations: [row.sourceLocation],
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const mock = row.suppressionSignals.find((signal) => signal.kind === 'mock');
|
|
193
|
+
if (E2E_KINDS.has(entry.kind) && mock !== undefined) {
|
|
194
|
+
for (const obligationId of claims) {
|
|
195
|
+
pushProblem({
|
|
196
|
+
cause: 'TEST_MAPPING_AMBIGUOUS',
|
|
197
|
+
obligationId,
|
|
198
|
+
detail: `sidecar entry '${entry.key}' declares kind '${entry.kind}' but the catalog observed ` +
|
|
199
|
+
`mocking (${mock.detail}) — an explicit kind cannot override observed mocking (§5.3)`,
|
|
200
|
+
locations: [mock.location],
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const strong = row.kindSignals[0];
|
|
206
|
+
if (row.inferredKind !== 'unknown' && row.kindSignals.length > 0 && entry.kind !== row.inferredKind) {
|
|
207
|
+
for (const obligationId of claims) {
|
|
208
|
+
pushProblem({
|
|
209
|
+
cause: 'TEST_MAPPING_AMBIGUOUS',
|
|
210
|
+
obligationId,
|
|
211
|
+
detail: `sidecar entry '${entry.key}' declares kind '${entry.kind}' but inference resolved ` +
|
|
212
|
+
`'${row.inferredKind}' from strong code signals (${strong?.ruleId ?? 'unknown'} at ` +
|
|
213
|
+
`${strong?.location.file ?? row.file}:${String(strong?.location.line ?? row.sourceLocation.line)}) — ` +
|
|
214
|
+
'correct the declaration or the classification',
|
|
215
|
+
locations: [row.sourceLocation, ...(strong !== undefined ? [strong.location] : [])],
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Bind the declaration (many-to-many allowed). Ambiguity problems
|
|
221
|
+
// above stay visible; the binding itself is data for suggestions.
|
|
222
|
+
for (const obligationId of claims) {
|
|
223
|
+
if (!registry.has(obligationId))
|
|
224
|
+
continue;
|
|
225
|
+
bindingsFor(obligationId).set(entry.key, {
|
|
226
|
+
logicalKey: entry.key,
|
|
227
|
+
instances: matched.map(instanceOf),
|
|
228
|
+
origin: 'sidecar',
|
|
229
|
+
sourceDigest: matched[0]?.sourceDigest ?? null,
|
|
230
|
+
declaredKind: entry.kind ?? null,
|
|
231
|
+
categories: [...new Set(entry.categories ?? [])].sort(compareStrings),
|
|
232
|
+
reason: entry.reason,
|
|
233
|
+
sourceLocation: matched[0]?.sourceLocation ?? null,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Cross-entry ambiguity: two entries claiming the same obligation with
|
|
238
|
+
// conflicting declared kinds (§5.4 "a declaration is unsafe").
|
|
239
|
+
const obligationIdsSorted = [...registry].sort(compareStrings);
|
|
240
|
+
for (const obligationId of obligationIdsSorted) {
|
|
241
|
+
const declared = [...(byObligation.get(obligationId)?.values() ?? [])]
|
|
242
|
+
.filter((binding) => binding.origin === 'sidecar' && binding.declaredKind !== null)
|
|
243
|
+
.sort((a, b) => compareStrings(a.logicalKey, b.logicalKey));
|
|
244
|
+
const kinds = new Set(declared.map((binding) => binding.declaredKind));
|
|
245
|
+
if (declared.length > 1 && kinds.size > 1) {
|
|
246
|
+
const first = declared[0];
|
|
247
|
+
const second = declared.find((binding) => binding.declaredKind !== first?.declaredKind);
|
|
248
|
+
pushProblem({
|
|
249
|
+
cause: 'TEST_MAPPING_AMBIGUOUS',
|
|
250
|
+
obligationId,
|
|
251
|
+
detail: `obligation '${obligationId}' is claimed with conflicting kinds: '${String(first?.declaredKind)}' by '${first?.logicalKey}' and '${String(second?.declaredKind)}' by '${second?.logicalKey}' — ` +
|
|
252
|
+
'correct the exact mapping',
|
|
253
|
+
locations: [
|
|
254
|
+
...(first?.sourceLocation !== undefined && first.sourceLocation !== null ? [first.sourceLocation] : []),
|
|
255
|
+
...(second?.sourceLocation !== undefined && second.sourceLocation !== null ? [second.sourceLocation] : []),
|
|
256
|
+
],
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// --- native annotation claims -------------------------------------------
|
|
261
|
+
const nativeClaims = [...input.nativeClaims].sort((a, b) => compareStrings(a.obligationId, b.obligationId) || compareStrings(a.testId, b.testId));
|
|
262
|
+
for (const claim of nativeClaims) {
|
|
263
|
+
if (!registry.has(claim.obligationId)) {
|
|
264
|
+
pushProblem({
|
|
265
|
+
cause: 'TEST_MAPPING_STALE',
|
|
266
|
+
obligationId: claim.obligationId,
|
|
267
|
+
detail: `native annotation on test '${claim.testId}'` +
|
|
268
|
+
`${claim.testFile !== undefined ? ` (${claim.testFile})` : ''} claims ` +
|
|
269
|
+
`'${claim.obligationId}', which is not in the current obligation registry ` +
|
|
270
|
+
'(the obligation vanished or the policy changed); correct the annotation or the mapping',
|
|
271
|
+
locations: claim.location !== undefined ? [claim.location] : [],
|
|
272
|
+
});
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
// Exact duplicate of a sidecar declaration (same obligation, same
|
|
276
|
+
// test file) → dedupe idempotently: the sidecar binding (a superset:
|
|
277
|
+
// reason/kind/categories) stands, the native row adds nothing.
|
|
278
|
+
const instances = input.catalog.entries
|
|
279
|
+
.filter((row) => row.file === claim.testFile)
|
|
280
|
+
.sort((a, b) => compareStrings(a.logicalKey, b.logicalKey));
|
|
281
|
+
const existingBindings = byObligation.get(claim.obligationId);
|
|
282
|
+
const duplicate = existingBindings !== undefined &&
|
|
283
|
+
[...existingBindings.values()].some((binding) => binding.origin === 'sidecar' && binding.instances.some((inst) => inst.file === claim.testFile));
|
|
284
|
+
if (duplicate)
|
|
285
|
+
continue;
|
|
286
|
+
bindingsFor(claim.obligationId).set(claim.testId, {
|
|
287
|
+
logicalKey: claim.testId,
|
|
288
|
+
instances: instances.map(instanceOf),
|
|
289
|
+
origin: 'native',
|
|
290
|
+
sourceDigest: instances[0]?.sourceDigest ?? null,
|
|
291
|
+
declaredKind: null,
|
|
292
|
+
categories: [],
|
|
293
|
+
reason: null,
|
|
294
|
+
sourceLocation: claim.location ?? null,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
// --- prior-run hints (suggestions only, never grading) -------------------
|
|
298
|
+
const hints = [...(input.priorRunHints ?? [])].sort((a, b) => compareStrings(a.obligationId, b.obligationId) || compareStrings(a.logicalKey, b.logicalKey));
|
|
299
|
+
for (const hint of hints) {
|
|
300
|
+
const row = rowsByKey.get(hint.logicalKey);
|
|
301
|
+
if (row === undefined || !registry.has(hint.obligationId))
|
|
302
|
+
continue;
|
|
303
|
+
const bindings = bindingsFor(hint.obligationId);
|
|
304
|
+
if (bindings.has(hint.logicalKey))
|
|
305
|
+
continue;
|
|
306
|
+
bindings.set(hint.logicalKey, {
|
|
307
|
+
logicalKey: hint.logicalKey,
|
|
308
|
+
instances: [instanceOf(row)],
|
|
309
|
+
origin: 'prior-run',
|
|
310
|
+
sourceDigest: row.sourceDigest,
|
|
311
|
+
declaredKind: null,
|
|
312
|
+
categories: [],
|
|
313
|
+
reason: 'a prior run bound this test to the obligation (a hint only — it never satisfies a new run)',
|
|
314
|
+
sourceLocation: row.sourceLocation,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
// --- inference (NEVER auto-writes a mapping; suggestions only) -----------
|
|
318
|
+
for (const obligationId of obligationIdsSorted) {
|
|
319
|
+
const bindings = byObligation.get(obligationId);
|
|
320
|
+
if (bindings !== undefined && [...bindings.values()].some((b) => b.origin === 'native' || b.origin === 'sidecar')) {
|
|
321
|
+
continue; // a declared mapping exists — inference adds nothing
|
|
322
|
+
}
|
|
323
|
+
const map = bindings ?? bindingsFor(obligationId);
|
|
324
|
+
for (const candidate of inferredCandidates(obligationId, input.catalog)) {
|
|
325
|
+
if (map.has(candidate.row.logicalKey))
|
|
326
|
+
continue;
|
|
327
|
+
map.set(candidate.row.logicalKey, {
|
|
328
|
+
logicalKey: candidate.row.logicalKey,
|
|
329
|
+
instances: [instanceOf(candidate.row)],
|
|
330
|
+
origin: 'inferred',
|
|
331
|
+
sourceDigest: candidate.row.sourceDigest,
|
|
332
|
+
declaredKind: candidate.row.inferredKind,
|
|
333
|
+
categories: candidate.row.categorySignals.map((signal) => signal.label).sort(compareStrings),
|
|
334
|
+
reason: `inferred, never auto-declared: ${candidate.why.join('; ')}`,
|
|
335
|
+
sourceLocation: candidate.row.sourceLocation,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
const obligations = obligationIdsSorted.map((obligationId) => ({
|
|
340
|
+
obligationId,
|
|
341
|
+
bindings: [...(byObligation.get(obligationId)?.values() ?? [])].sort((a, b) => ORIGIN_RANK[a.origin] - ORIGIN_RANK[b.origin] || compareStrings(a.logicalKey, b.logicalKey)),
|
|
342
|
+
}));
|
|
343
|
+
problems.sort((a, b) => PROBLEM_RANK[a.cause] - PROBLEM_RANK[b.cause] ||
|
|
344
|
+
compareStrings(a.obligationId ?? '', b.obligationId ?? '') ||
|
|
345
|
+
compareStrings(a.detail, b.detail));
|
|
346
|
+
return { obligations, problems: problems.map((problem) => ({ ...problem, locations: [...problem.locations] })) };
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Deterministic token inference (plan Phase 3 item 2): obligation
|
|
350
|
+
* resource-id tokens (`tenant.accounts` → `tenant`, `accounts`) matched
|
|
351
|
+
* against catalog rows' files, title paths, and category labels. Signals
|
|
352
|
+
* feed SUGGESTIONS only — an inference never writes a mapping (§5.3).
|
|
353
|
+
*/
|
|
354
|
+
function inferredCandidates(obligationId, catalog) {
|
|
355
|
+
const resourceId = obligationId.slice(0, Math.max(0, obligationId.indexOf(':')));
|
|
356
|
+
const tokens = resourceId
|
|
357
|
+
.split(/[.\-_]/)
|
|
358
|
+
.map((token) => token.toLowerCase())
|
|
359
|
+
.filter((token) => token.length > 2);
|
|
360
|
+
if (tokens.length === 0)
|
|
361
|
+
return [];
|
|
362
|
+
const candidates = [];
|
|
363
|
+
for (const row of catalog.entries) {
|
|
364
|
+
const why = [];
|
|
365
|
+
const title = row.titlePath.join('>').toLowerCase();
|
|
366
|
+
for (const token of tokens) {
|
|
367
|
+
if (row.file.toLowerCase().includes(token)) {
|
|
368
|
+
why.push(`resource token '${token}' matches the test file '${row.file}'`);
|
|
369
|
+
}
|
|
370
|
+
else if (title.includes(token)) {
|
|
371
|
+
why.push(`resource token '${token}' matches the test title path`);
|
|
372
|
+
}
|
|
373
|
+
else if (row.categorySignals.some((signal) => signal.label.toLowerCase().includes(token))) {
|
|
374
|
+
why.push(`resource token '${token}' matches a category label`);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (why.length > 0)
|
|
378
|
+
candidates.push({ row, why });
|
|
379
|
+
}
|
|
380
|
+
return candidates.sort((a, b) => compareStrings(a.row.logicalKey, b.row.logicalKey));
|
|
381
|
+
}
|
|
382
|
+
/** Suggestion order = reuse order (connect → declare kind → repair stale → repair conflict). */
|
|
383
|
+
const SUGGESTION_RANK = Object.freeze({
|
|
384
|
+
TEST_MAPPING_MISSING: 0,
|
|
385
|
+
TEST_KIND_UNKNOWN: 1,
|
|
386
|
+
TEST_MAPPING_STALE: 2,
|
|
387
|
+
TEST_MAPPING_AMBIGUOUS: 3,
|
|
388
|
+
});
|
|
389
|
+
/**
|
|
390
|
+
* Produces per-obligation reuse suggestions ordered by reuse (plan
|
|
391
|
+
* Phase 3 item 6). Obligations with a clean DECLARED mapping produce no
|
|
392
|
+
* suggestion (their remaining gap is executed proof, not mapping).
|
|
393
|
+
* `newTestNeeded` is true only when no candidate exists after resolution.
|
|
394
|
+
*
|
|
395
|
+
* Args:
|
|
396
|
+
* input: catalog, scoped obligation ids, and the resolution.
|
|
397
|
+
*
|
|
398
|
+
* Returns:
|
|
399
|
+
* MappingSuggestion[]: sorted by reuse rank, then obligation id.
|
|
400
|
+
*/
|
|
401
|
+
export function mappingSuggestions(input) {
|
|
402
|
+
const byId = new Map(input.resolution.obligations.map((entry) => [entry.obligationId, entry.bindings]));
|
|
403
|
+
const suggestions = [];
|
|
404
|
+
for (const obligationId of [...input.obligationIds].sort(compareStrings)) {
|
|
405
|
+
const bindings = byId.get(obligationId) ?? [];
|
|
406
|
+
const problems = input.resolution.problems.filter((problem) => problem.obligationId === obligationId);
|
|
407
|
+
const ambiguous = problems.find((problem) => problem.cause === 'TEST_MAPPING_AMBIGUOUS');
|
|
408
|
+
if (ambiguous !== undefined) {
|
|
409
|
+
suggestions.push({
|
|
410
|
+
obligationId,
|
|
411
|
+
cause: 'TEST_MAPPING_AMBIGUOUS',
|
|
412
|
+
candidates: [],
|
|
413
|
+
missingEvidence: 'a safe, unambiguous declaration (the current declaration conflicts with itself or the catalog)',
|
|
414
|
+
nextAction: CAUSE_NEXT_ACTIONS['TEST_MAPPING_AMBIGUOUS'],
|
|
415
|
+
newTestNeeded: false,
|
|
416
|
+
});
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
const stale = problems.find((problem) => problem.cause === 'TEST_MAPPING_STALE');
|
|
420
|
+
if (stale !== undefined) {
|
|
421
|
+
const candidates = inferredCandidates(obligationId, input.catalog).map((candidate) => ({
|
|
422
|
+
logicalKey: candidate.row.logicalKey,
|
|
423
|
+
file: candidate.row.file,
|
|
424
|
+
why: candidate.why,
|
|
425
|
+
}));
|
|
426
|
+
suggestions.push({
|
|
427
|
+
obligationId,
|
|
428
|
+
cause: 'TEST_MAPPING_STALE',
|
|
429
|
+
candidates,
|
|
430
|
+
missingEvidence: `an up-to-date declaration (the current one is stale: ${stale.detail})`,
|
|
431
|
+
nextAction: CAUSE_NEXT_ACTIONS['TEST_MAPPING_STALE'],
|
|
432
|
+
newTestNeeded: candidates.length === 0,
|
|
433
|
+
});
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
const declared = bindings.filter((binding) => binding.origin === 'native' || binding.origin === 'sidecar');
|
|
437
|
+
const kindUnknown = problems.find((problem) => problem.cause === 'TEST_KIND_UNKNOWN');
|
|
438
|
+
if (kindUnknown !== undefined) {
|
|
439
|
+
suggestions.push({
|
|
440
|
+
obligationId,
|
|
441
|
+
cause: 'TEST_KIND_UNKNOWN',
|
|
442
|
+
candidates: declared
|
|
443
|
+
.map((binding) => ({
|
|
444
|
+
logicalKey: binding.logicalKey,
|
|
445
|
+
file: binding.instances[0]?.file ?? '',
|
|
446
|
+
why: ['mapped by declaration, but its kind is unknown'],
|
|
447
|
+
}))
|
|
448
|
+
.sort((a, b) => compareStrings(a.logicalKey, b.logicalKey)),
|
|
449
|
+
missingEvidence: 'a declared kind for the connected test (code analysis could not classify it)',
|
|
450
|
+
nextAction: CAUSE_NEXT_ACTIONS['TEST_KIND_UNKNOWN'],
|
|
451
|
+
newTestNeeded: false,
|
|
452
|
+
});
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
if (declared.length > 0)
|
|
456
|
+
continue; // declared + clean: the gap is execution, not mapping
|
|
457
|
+
const candidates = bindings
|
|
458
|
+
.map((binding) => ({
|
|
459
|
+
logicalKey: binding.logicalKey,
|
|
460
|
+
file: binding.instances[0]?.file ?? '',
|
|
461
|
+
why: binding.origin === 'inferred' || binding.origin === 'prior-run'
|
|
462
|
+
? [binding.reason ?? binding.origin]
|
|
463
|
+
: [`bound by native annotation (${binding.logicalKey})`],
|
|
464
|
+
}))
|
|
465
|
+
.sort((a, b) => compareStrings(a.logicalKey, b.logicalKey));
|
|
466
|
+
suggestions.push({
|
|
467
|
+
obligationId,
|
|
468
|
+
cause: 'TEST_MAPPING_MISSING',
|
|
469
|
+
candidates,
|
|
470
|
+
missingEvidence: candidates.length > 0
|
|
471
|
+
? 'a DECLARED mapping and witnessed evidence for this change (a mapping declares intent; it supplies no test result)'
|
|
472
|
+
: 'a declared mapping to any existing test — no candidate survived resolution',
|
|
473
|
+
nextAction: CAUSE_NEXT_ACTIONS['TEST_MAPPING_MISSING'],
|
|
474
|
+
newTestNeeded: candidates.length === 0,
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
return suggestions.sort((a, b) => SUGGESTION_RANK[a.cause] - SUGGESTION_RANK[b.cause] ||
|
|
478
|
+
compareStrings(a.obligationId, b.obligationId));
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Projects resolved bindings into declared grading claims (plan §5.3:
|
|
482
|
+
* both declaration paths normalize into existing claims). ONLY `native`
|
|
483
|
+
* and `sidecar` bindings project — inferred and prior-run bindings are
|
|
484
|
+
* suggestions and never grade. Exact duplicates of claims the run state
|
|
485
|
+
* already carries are dropped idempotently. The claims declare INTENT:
|
|
486
|
+
* they contain no evidence, so a mapped obligation with no witnessed
|
|
487
|
+
* records still grades EVIDENCE_NOT_COLLECTED (blocking), never satisfied.
|
|
488
|
+
*
|
|
489
|
+
* Phase 4 note (runtime selection): the suite fixture submits evidence
|
|
490
|
+
* per native annotations using the reporter's own testIds, so sidecar
|
|
491
|
+
* claims (whose testId is the logical key) cannot receive runtime
|
|
492
|
+
* evidence until Phase 4 wires claim injection through session open.
|
|
493
|
+
*
|
|
494
|
+
* Args:
|
|
495
|
+
* resolution: the resolved-mappings surface.
|
|
496
|
+
* existingClaims: the run-state claims (native annotations).
|
|
497
|
+
*
|
|
498
|
+
* Returns:
|
|
499
|
+
* Claim[]: validated declared claims, sorted by (obligationId, testId).
|
|
500
|
+
*/
|
|
501
|
+
export function mappingGradingClaims(resolution, existingClaims) {
|
|
502
|
+
const existing = new Set(existingClaims.map((claim) => `${claim.obligationId}\u0000${claim.testId}`));
|
|
503
|
+
const claims = [];
|
|
504
|
+
for (const entry of resolution.obligations) {
|
|
505
|
+
for (const binding of entry.bindings) {
|
|
506
|
+
if (binding.origin !== 'native' && binding.origin !== 'sidecar')
|
|
507
|
+
continue;
|
|
508
|
+
const dedupeKey = `${entry.obligationId}\u0000${binding.logicalKey}`;
|
|
509
|
+
if (existing.has(dedupeKey))
|
|
510
|
+
continue;
|
|
511
|
+
existing.add(dedupeKey);
|
|
512
|
+
const file = binding.instances[0]?.file;
|
|
513
|
+
claims.push(ClaimSchema.parse({
|
|
514
|
+
schemaVersion: 1,
|
|
515
|
+
obligationId: entry.obligationId,
|
|
516
|
+
testId: binding.logicalKey,
|
|
517
|
+
...(file !== undefined ? { testFile: file } : {}),
|
|
518
|
+
}));
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return claims.sort((a, b) => compareStrings(a.obligationId, b.obligationId) || compareStrings(a.testId, b.testId));
|
|
522
|
+
}
|
|
523
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/mapping/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAuG3D,iEAAiE;AACjE,MAAM,WAAW,GAA4C,MAAM,CAAC,MAAM,CAAC;IACzE,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,CAAC;IACd,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,gEAAgE;AAChE,MAAM,YAAY,GAAkD,MAAM,CAAC,MAAM,CAAC;IAChF,sBAAsB,EAAE,CAAC;IACzB,kBAAkB,EAAE,CAAC;IACrB,iBAAiB,EAAE,CAAC;CACrB,CAAC,CAAC;AAEH,gFAAgF;AAChF,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AAE3E;;;GAGG;AACH,SAAS,eAAe,CAAC,GAAqB,EAAE,QAA8C;IAC5F,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/E,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACrF,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjG,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uDAAuD;AACvD,SAAS,UAAU,CAAC,GAAqB;IACvC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC;QAC7B,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;KACzC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA2B;IAC7D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,2CAA2C;IAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,EAA6C,CAAC;IAE1E,MAAM,WAAW,GAAG,CAAC,OAAuB,EAAQ,EAAE;QACpD,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,KAAK,SAAS,OAAO,CAAC,YAAY,IAAI,EAAE,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/F,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QACxC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,YAAoB,EAAqC,EAAE;QAC9E,IAAI,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;YACrB,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,4EAA4E;IAC5E,MAAM,cAAc,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7F,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO;aAClC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;aACrD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAE9D,oEAAoE;QACpE,iEAAiE;QACjE,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC3C,KAAK,MAAM,YAAY,IAAI,MAAM,EAAE,CAAC;gBAClC,WAAW,CAAC;oBACV,KAAK,EAAE,wBAAwB;oBAC/B,YAAY;oBACZ,MAAM,EACJ,kBAAkB,KAAK,CAAC,GAAG,kDAAkD;wBAC7E,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,2DAA2D;wBAClF,mCAAmC;oBACrC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;iBAC5D,CAAC,CAAC;YACL,CAAC;YACD,SAAS;QACX,CAAC;QAED,+DAA+D;QAC/D,gEAAgE;QAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAC7C,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI;gBAChC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACzE,CAAC;YACF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACzF,MAAM,QAAQ,GAAG,YAAY,KAAK,SAAS;gBACzC,CAAC,CAAC,gCAAgC,YAAY,CAAC,UAAU,iCAAiC;oBACxF,wEAAwE;gBAC1E,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACnB,CAAC,CAAC,8DAA8D,QAAQ;yBACnE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;yBACX,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;yBAC5C,IAAI,CAAC,IAAI,CAAC,GAAG;oBAClB,CAAC,CAAC,aAAa,KAAK,CAAC,QAAQ,CAAC,IAAI,+BAA+B,CAAC;YACtE,KAAK,MAAM,YAAY,IAAI,MAAM,EAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC;oBAAE,SAAS;gBAC1C,WAAW,CAAC;oBACV,KAAK,EAAE,oBAAoB;oBAC3B,YAAY;oBACZ,MAAM,EACJ,gBAAgB,KAAK,CAAC,GAAG,kCAAkC;wBAC3D,aAAa,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,GAAG,GAAG;wBACtE,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE;oBACtF,SAAS,EAAE,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE;iBAC3E,CAAC,CAAC;YACL,CAAC;YACD,SAAS;QACX,CAAC;QAED,oEAAoE;QACpE,qEAAqE;QACrE,yDAAyD;QACzD,KAAK,MAAM,YAAY,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChC,WAAW,CAAC;oBACV,KAAK,EAAE,oBAAoB;oBAC3B,YAAY;oBACZ,MAAM,EACJ,kBAAkB,KAAK,CAAC,GAAG,aAAa,YAAY,iCAAiC;wBACrF,4FAA4F;oBAC9F,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;iBAC1F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,oEAAoE;QACpE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBACnC,KAAK,MAAM,YAAY,IAAI,MAAM,EAAE,CAAC;wBAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC;4BAAE,SAAS;wBAC1C,WAAW,CAAC;4BACV,KAAK,EAAE,mBAAmB;4BAC1B,YAAY;4BACZ,MAAM,EACJ,SAAS,KAAK,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB;gCAC/E,0EAA0E;4BAC5E,SAAS,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC;yBAChC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAC7E,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACpD,KAAK,MAAM,YAAY,IAAI,MAAM,EAAE,CAAC;oBAClC,WAAW,CAAC;wBACV,KAAK,EAAE,wBAAwB;wBAC/B,YAAY;wBACZ,MAAM,EACJ,kBAAkB,KAAK,CAAC,GAAG,oBAAoB,KAAK,CAAC,IAAI,6BAA6B;4BACtF,YAAY,IAAI,CAAC,MAAM,8DAA8D;wBACvF,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;qBAC3B,CAAC,CAAC;gBACL,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,YAAY,EAAE,CAAC;gBACpG,KAAK,MAAM,YAAY,IAAI,MAAM,EAAE,CAAC;oBAClC,WAAW,CAAC;wBACV,KAAK,EAAE,wBAAwB;wBAC/B,YAAY;wBACZ,MAAM,EACJ,kBAAkB,KAAK,CAAC,GAAG,oBAAoB,KAAK,CAAC,IAAI,2BAA2B;4BACpF,IAAI,GAAG,CAAC,YAAY,+BAA+B,MAAM,EAAE,MAAM,IAAI,SAAS,MAAM;4BACpF,GAAG,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM;4BACtG,+CAA+C;wBACjD,SAAS,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;qBACpF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,kEAAkE;QAClE,KAAK,MAAM,YAAY,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC;gBAAE,SAAS;YAC1C,WAAW,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE;gBACvC,UAAU,EAAE,KAAK,CAAC,GAAG;gBACrB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;gBAClC,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,IAAI;gBAC9C,YAAY,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;gBAChC,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;gBACrE,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,IAAI,IAAI;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,+DAA+D;IAC/D,MAAM,mBAAmB,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/D,KAAK,MAAM,YAAY,IAAI,mBAAmB,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACnE,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC;aAClF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACvE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,KAAK,EAAE,YAAY,CAAC,CAAC;YACxF,WAAW,CAAC;gBACV,KAAK,EAAE,wBAAwB;gBAC/B,YAAY;gBACZ,MAAM,EACJ,eAAe,YAAY,yCAAyC,MAAM,CACxE,KAAK,EAAE,YAAY,CACpB,SAAS,KAAK,EAAE,UAAU,UAAU,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,MAAM,EAAE,UAAU,MAAM;oBAClG,2BAA2B;gBAC7B,SAAS,EAAE;oBACT,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvG,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,SAAS,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC3G;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAC/C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAC/F,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,WAAW,CAAC;gBACV,KAAK,EAAE,oBAAoB;gBAC3B,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,MAAM,EACJ,8BAA8B,KAAK,CAAC,MAAM,GAAG;oBAC7C,GAAG,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU;oBACvE,IAAI,KAAK,CAAC,YAAY,qDAAqD;oBAC3E,wFAAwF;gBAC1F,SAAS,EAAE,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;aAChE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,kEAAkE;QAClE,qEAAqE;QACrE,+DAA+D;QAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO;aACpC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC;aAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9D,MAAM,gBAAgB,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9D,MAAM,SAAS,GACb,gBAAgB,KAAK,SAAS;YAC9B,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CACjC,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,CACjG,CAAC;QACJ,IAAI,SAAS;YAAE,SAAS;QACxB,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;YAChD,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;YACpC,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,IAAI;YAChD,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,IAAI;YACZ,cAAc,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;SACvC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CACvG,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,SAAS;QACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,SAAS;QAC5C,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE;YAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,4FAA4F;YACpG,cAAc,EAAE,GAAG,CAAC,cAAc;SACnC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,KAAK,MAAM,YAAY,IAAI,mBAAmB,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;YAClH,SAAS,CAAC,qDAAqD;QACjE,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,IAAI,WAAW,CAAC,YAAY,CAAC,CAAC;QAClD,KAAK,MAAM,SAAS,IAAI,kBAAkB,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACxE,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,SAAS;YAChD,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE;gBAChC,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU;gBACpC,SAAS,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACtC,MAAM,EAAE,UAAU;gBAClB,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,YAAY;gBACxC,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,YAAY;gBACxC,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;gBAC5F,MAAM,EAAE,kCAAkC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACpE,cAAc,EAAE,SAAS,CAAC,GAAG,CAAC,cAAc;aAC7C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC7D,YAAY;QACZ,QAAQ,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAClE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAC9F;KACF,CAAC,CAAC,CAAC;IACJ,QAAQ,CAAC,IAAI,CACX,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7C,cAAc,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC;QAC1D,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CACrC,CAAC;IACF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACnH,CAAC;AAUD;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,YAAoB,EAAE,OAAoB;IACpE,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,UAAU;SACtB,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACnC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,UAAU,GAAwB,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,4BAA4B,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;YAC5E,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,+BAA+B,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC5F,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,4BAA4B,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACvF,CAAC;AA6CD,gGAAgG;AAChG,MAAM,eAAe,GAAqD,MAAM,CAAC,MAAM,CAAC;IACtF,oBAAoB,EAAE,CAAC;IACvB,iBAAiB,EAAE,CAAC;IACpB,kBAAkB,EAAE,CAAC;IACrB,sBAAsB,EAAE,CAAC;CAC1B,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxG,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,KAAK,MAAM,YAAY,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC;QACtG,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,wBAAwB,CAAC,CAAC;QACzF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,WAAW,CAAC,IAAI,CAAC;gBACf,YAAY;gBACZ,KAAK,EAAE,wBAAwB;gBAC/B,UAAU,EAAE,EAAE;gBACd,eAAe,EAAE,gGAAgG;gBACjH,UAAU,EAAE,kBAAkB,CAAC,wBAAwB,CAAC;gBACxD,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,oBAAoB,CAAC,CAAC;QACjF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,kBAAkB,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACrF,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU;gBACpC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI;gBACxB,GAAG,EAAE,SAAS,CAAC,GAAG;aACnB,CAAC,CAAC,CAAC;YACJ,WAAW,CAAC,IAAI,CAAC;gBACf,YAAY;gBACZ,KAAK,EAAE,oBAAoB;gBAC3B,UAAU;gBACV,eAAe,EAAE,wDAAwD,KAAK,CAAC,MAAM,GAAG;gBACxF,UAAU,EAAE,kBAAkB,CAAC,oBAAoB,CAAC;gBACpD,aAAa,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;aACvC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC3G,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,mBAAmB,CAAC,CAAC;QACtF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,WAAW,CAAC,IAAI,CAAC;gBACf,YAAY;gBACZ,KAAK,EAAE,mBAAmB;gBAC1B,UAAU,EAAE,QAAQ;qBACjB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACjB,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE;oBACtC,GAAG,EAAE,CAAC,gDAAgD,CAAC;iBACxD,CAAC,CAAC;qBACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC7D,eAAe,EAAE,8EAA8E;gBAC/F,UAAU,EAAE,kBAAkB,CAAC,mBAAmB,CAAC;gBACnD,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS,CAAC,sDAAsD;QACzF,MAAM,UAAU,GAAG,QAAQ;aACxB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACjB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE;YACtC,GAAG,EACD,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;gBAC7D,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;gBACpC,CAAC,CAAC,CAAC,+BAA+B,OAAO,CAAC,UAAU,GAAG,CAAC;SAC7D,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9D,WAAW,CAAC,IAAI,CAAC;YACf,YAAY;YACZ,KAAK,EAAE,sBAAsB;YAC7B,UAAU;YACV,eAAe,EACb,UAAU,CAAC,MAAM,GAAG,CAAC;gBACnB,CAAC,CAAC,mHAAmH;gBACrH,CAAC,CAAC,4EAA4E;YAClF,UAAU,EAAE,kBAAkB,CAAC,sBAAsB,CAAC;YACtD,aAAa,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC;QACnD,cAAc,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CACjD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAA4B,EAC5B,cAAgC;IAEhC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtG,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS;YAC1E,MAAM,SAAS,GAAG,GAAG,KAAK,CAAC,YAAY,SAAS,OAAO,CAAC,UAAU,EAAE,CAAC;YACrE,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YACtC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACxC,MAAM,CAAC,IAAI,CACT,WAAW,CAAC,KAAK,CAAC;gBAChB,aAAa,EAAE,CAAC;gBAChB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,MAAM,EAAE,OAAO,CAAC,UAAU;gBAC1B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClD,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAChB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAC/F,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type CauseCode } from '../schemas/verdict.js';
|
|
2
|
+
import type { CoverageOperation, CoverageTable } from '../schemas/coverage-policy.js';
|
|
3
|
+
/**
|
|
4
|
+
* One inventory table the caller derived from the current run's resource
|
|
5
|
+
* graph (user-facing, non-endpoint resources). Passing the inventory is
|
|
6
|
+
* REQUIRED: it is what makes a silently dropped policy table detectable.
|
|
7
|
+
*/
|
|
8
|
+
export interface CoverageInventoryTable {
|
|
9
|
+
/** Bare resource name, matched exactly against policy table names. */
|
|
10
|
+
name: string;
|
|
11
|
+
/** Operations the resource's lifecycle currently enables (dropped-table findings name these). */
|
|
12
|
+
operations: readonly CoverageOperation[];
|
|
13
|
+
}
|
|
14
|
+
/** One resolved test mapping (plan §5.1 mapping resolution) — input, not proof. */
|
|
15
|
+
export interface MappedCoverage {
|
|
16
|
+
/** Bare table name the mapping covers. */
|
|
17
|
+
table: string;
|
|
18
|
+
/** The covered operation. */
|
|
19
|
+
operation: CoverageOperation;
|
|
20
|
+
/** Declared test kind; ONLY `browser-e2e` satisfies closed-world coverage. */
|
|
21
|
+
testKind: string;
|
|
22
|
+
}
|
|
23
|
+
/** Configuration-error finding: the policy names a table the inventory cannot see. */
|
|
24
|
+
export interface CoverageConfigError {
|
|
25
|
+
/** Always `COVERAGE_TABLE_UNKNOWN`. */
|
|
26
|
+
code: 'COVERAGE_TABLE_UNKNOWN';
|
|
27
|
+
/** The unknown policy table name. */
|
|
28
|
+
table: string;
|
|
29
|
+
/** Single-cause explanation; callers turn this into exit 2. */
|
|
30
|
+
detail: string;
|
|
31
|
+
}
|
|
32
|
+
/** Blocking finding: required real-UI coverage is missing and undispositioned. */
|
|
33
|
+
export interface CoverageBlockingFinding {
|
|
34
|
+
/** Always `CRUD_COVERAGE_MISSING` (plan §3.6/§5.4). */
|
|
35
|
+
code: 'CRUD_COVERAGE_MISSING';
|
|
36
|
+
/** Stable cause code carried into the shared report model. */
|
|
37
|
+
cause: Extract<CauseCode, 'CRUD_COVERAGE_MISSING'>;
|
|
38
|
+
/** The table lacking coverage. */
|
|
39
|
+
table: string;
|
|
40
|
+
/** The uncovered operation; null for a whole-table dropped violation. */
|
|
41
|
+
operation: CoverageOperation | null;
|
|
42
|
+
/** Single-cause explanation naming the gap. */
|
|
43
|
+
detail: string;
|
|
44
|
+
/** Plan §5.4 next action for `CRUD_COVERAGE_MISSING`. */
|
|
45
|
+
nextAction: string;
|
|
46
|
+
}
|
|
47
|
+
/** The complete evaluator result: config errors and blocking findings, sorted. */
|
|
48
|
+
export interface CoveragePolicyResult {
|
|
49
|
+
/** Configuration errors (unknown table names) — callers exit 2 on these. */
|
|
50
|
+
configErrors: CoverageConfigError[];
|
|
51
|
+
/** Blocking findings — callers surface these as blocking report entries. */
|
|
52
|
+
blocking: CoverageBlockingFinding[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Evaluates the coverage policy against the current inventory and
|
|
56
|
+
* resolved mappings. Pure: identical inputs produce byte-identical
|
|
57
|
+
* results; findings sort by table then operation.
|
|
58
|
+
*
|
|
59
|
+
* Semantics:
|
|
60
|
+
* - policy table absent from the inventory → CONFIG-ERROR
|
|
61
|
+
* (`COVERAGE_TABLE_UNKNOWN`);
|
|
62
|
+
* - inventory table absent from the policy → blocking (closed-world: a
|
|
63
|
+
* silently dropped table is a violation);
|
|
64
|
+
* - dispositioned table → excused (the disposition is a trusted owner
|
|
65
|
+
* act recorded in config, never an agent self-approval);
|
|
66
|
+
* - otherwise each required operation without a `browser-e2e` mapping →
|
|
67
|
+
* blocking `CRUD_COVERAGE_MISSING`.
|
|
68
|
+
*
|
|
69
|
+
* Args:
|
|
70
|
+
* tables: the policy's table entries (validated `CoveragePolicySchema`).
|
|
71
|
+
* inventory: the current run's user-facing table inventory (REQUIRED).
|
|
72
|
+
* mappedCoverage: resolved test mappings; may be empty while the
|
|
73
|
+
* mapping subsystem is unbuilt (Phase 2-3).
|
|
74
|
+
*
|
|
75
|
+
* Returns:
|
|
76
|
+
* CoveragePolicyResult: sorted config errors and blocking findings.
|
|
77
|
+
*/
|
|
78
|
+
export declare function evaluateCoveragePolicy(tables: readonly CoverageTable[], inventory: readonly CoverageInventoryTable[], mappedCoverage?: readonly MappedCoverage[]): CoveragePolicyResult;
|
|
79
|
+
//# sourceMappingURL=coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/policy/coverage.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEtF;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC1C;AAED,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sFAAsF;AACtF,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,kFAAkF;AAClF,MAAM,WAAW,uBAAuB;IACtC,uDAAuD;IACvD,IAAI,EAAE,uBAAuB,CAAC;IAC9B,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IACnD,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,4EAA4E;IAC5E,QAAQ,EAAE,uBAAuB,EAAE,CAAC;CACrC;AAKD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,SAAS,EAAE,SAAS,sBAAsB,EAAE,EAC5C,cAAc,GAAE,SAAS,cAAc,EAAO,GAC7C,oBAAoB,CA4EtB"}
|