@sdd-method/sdd-cli 1.1.0 → 1.3.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/dist/lib/catalogue/aggregate.d.ts.map +1 -1
- package/dist/lib/catalogue/aggregate.js +5 -4
- package/dist/lib/catalogue/aggregate.js.map +1 -1
- package/dist/lib/catalogue/build.d.ts.map +1 -1
- package/dist/lib/catalogue/build.js +16 -7
- package/dist/lib/catalogue/build.js.map +1 -1
- package/dist/lib/catalogue/builders/capability-edges.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/capability-edges.js +10 -1
- package/dist/lib/catalogue/builders/capability-edges.js.map +1 -1
- package/dist/lib/catalogue/builders/capability-spec.d.ts +9 -3
- package/dist/lib/catalogue/builders/capability-spec.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/capability-spec.js +9 -3
- package/dist/lib/catalogue/builders/capability-spec.js.map +1 -1
- package/dist/lib/catalogue/builders/index.d.ts +2 -0
- package/dist/lib/catalogue/builders/index.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/index.js +1 -0
- package/dist/lib/catalogue/builders/index.js.map +1 -1
- package/dist/lib/catalogue/builders/quality-scores.d.ts +14 -0
- package/dist/lib/catalogue/builders/quality-scores.d.ts.map +1 -0
- package/dist/lib/catalogue/builders/quality-scores.js +321 -0
- package/dist/lib/catalogue/builders/quality-scores.js.map +1 -0
- package/dist/lib/catalogue/builders/services.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/services.js +5 -1
- package/dist/lib/catalogue/builders/services.js.map +1 -1
- package/dist/lib/catalogue/canonical-schema.yaml +255 -6
- package/dist/lib/catalogue/coverage-predicates.d.ts +176 -0
- package/dist/lib/catalogue/coverage-predicates.d.ts.map +1 -0
- package/dist/lib/catalogue/coverage-predicates.js +603 -0
- package/dist/lib/catalogue/coverage-predicates.js.map +1 -0
- package/dist/lib/catalogue/coverage-render.d.ts +54 -0
- package/dist/lib/catalogue/coverage-render.d.ts.map +1 -0
- package/dist/lib/catalogue/coverage-render.js +432 -0
- package/dist/lib/catalogue/coverage-render.js.map +1 -0
- package/dist/lib/catalogue/coverage-run.d.ts +33 -0
- package/dist/lib/catalogue/coverage-run.d.ts.map +1 -0
- package/dist/lib/catalogue/coverage-run.js +97 -0
- package/dist/lib/catalogue/coverage-run.js.map +1 -0
- package/dist/lib/catalogue/ddl-generator.d.ts +80 -0
- package/dist/lib/catalogue/ddl-generator.d.ts.map +1 -0
- package/dist/lib/catalogue/ddl-generator.js +215 -0
- package/dist/lib/catalogue/ddl-generator.js.map +1 -0
- package/dist/lib/catalogue/engine-validator.d.ts +103 -0
- package/dist/lib/catalogue/engine-validator.d.ts.map +1 -0
- package/dist/lib/catalogue/engine-validator.js +221 -0
- package/dist/lib/catalogue/engine-validator.js.map +1 -0
- package/dist/lib/catalogue/enum-validator.d.ts.map +1 -1
- package/dist/lib/catalogue/enum-validator.js +15 -0
- package/dist/lib/catalogue/enum-validator.js.map +1 -1
- package/dist/lib/catalogue/fk-validator.d.ts +6 -0
- package/dist/lib/catalogue/fk-validator.d.ts.map +1 -1
- package/dist/lib/catalogue/fk-validator.js +6 -0
- package/dist/lib/catalogue/fk-validator.js.map +1 -1
- package/dist/lib/catalogue/gate-checks.d.ts +117 -0
- package/dist/lib/catalogue/gate-checks.d.ts.map +1 -0
- package/dist/lib/catalogue/gate-checks.js +261 -0
- package/dist/lib/catalogue/gate-checks.js.map +1 -0
- package/dist/lib/catalogue/parity-harness.d.ts +48 -0
- package/dist/lib/catalogue/parity-harness.d.ts.map +1 -0
- package/dist/lib/catalogue/parity-harness.js +76 -0
- package/dist/lib/catalogue/parity-harness.js.map +1 -0
- package/dist/lib/catalogue/schema-compat.d.ts +3 -3
- package/dist/lib/catalogue/schema-compat.js +3 -3
- package/dist/lib/catalogue/scores-coverage.d.ts +138 -0
- package/dist/lib/catalogue/scores-coverage.d.ts.map +1 -0
- package/dist/lib/catalogue/scores-coverage.js +346 -0
- package/dist/lib/catalogue/scores-coverage.js.map +1 -0
- package/dist/lib/catalogue/validate.d.ts.map +1 -1
- package/dist/lib/catalogue/validate.js +6 -11
- package/dist/lib/catalogue/validate.js.map +1 -1
- package/dist/lib/mcp/parse/gate-registry.d.ts +63 -4
- package/dist/lib/mcp/parse/gate-registry.d.ts.map +1 -1
- package/dist/lib/mcp/parse/gate-registry.js +127 -31
- package/dist/lib/mcp/parse/gate-registry.js.map +1 -1
- package/dist/lib/mcp/resources/gates.d.ts.map +1 -1
- package/dist/lib/mcp/resources/gates.js +13 -27
- package/dist/lib/mcp/resources/gates.js.map +1 -1
- package/dist/lib/mcp/tools/query-gate-status.d.ts.map +1 -1
- package/dist/lib/mcp/tools/query-gate-status.js +13 -27
- package/dist/lib/mcp/tools/query-gate-status.js.map +1 -1
- package/dist/verbs/catalogue.d.ts.map +1 -1
- package/dist/verbs/catalogue.js +24 -0
- package/dist/verbs/catalogue.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine-path FK/PK/enum validation — M-ADR 0205 §4.4 (Phase A2).
|
|
3
|
+
*
|
|
4
|
+
* Runs the ddl-generator's queries on the embedded engine and returns
|
|
5
|
+
* results in the SAME shapes as fk-validator.ts / enum-validator.ts, so
|
|
6
|
+
* the parity harness can compare count AND list, field for field. The
|
|
7
|
+
* input is the same rowsByCatalogue map the in-memory validators take:
|
|
8
|
+
* A2 compares the two VALIDATION implementations on identical parsed
|
|
9
|
+
* input — CSV-read equivalence is deliberately out of this comparison's
|
|
10
|
+
* scope and belongs to the cutover evaluation.
|
|
11
|
+
*
|
|
12
|
+
* The engine package is a devDependency until cutover (M-ADR 0205 §4.1's
|
|
13
|
+
* no-fallback rule governs how it eventually ships). It is imported
|
|
14
|
+
* dynamically inside the entry function so merely loading this module
|
|
15
|
+
* never requires it: no production path imports the engine today, and an
|
|
16
|
+
* adopter install without the package only fails if something actually
|
|
17
|
+
* calls it — loudly.
|
|
18
|
+
*
|
|
19
|
+
* PK-duplicate detection has NO in-memory counterpart at validate time
|
|
20
|
+
* (builders dedupe at emission instead), so pkDuplicates is engine-only
|
|
21
|
+
* information: reported, never part of the parity claim — you cannot
|
|
22
|
+
* claim agreement with an instrument that does not exist.
|
|
23
|
+
*/
|
|
24
|
+
import { generateConstraintQueries, generateExternalFindingQueries, generateTableDdl, sqlType, } from "./ddl-generator.js";
|
|
25
|
+
const INSERT_CHUNK = 500;
|
|
26
|
+
function sqlStringLiteral(value) {
|
|
27
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* One loaded engine: schema DDL applied, every provided catalogue's rows
|
|
31
|
+
* inserted. Shared by the FK/PK/enum path and the coverage predicates so
|
|
32
|
+
* there is exactly one load semantics to reason about.
|
|
33
|
+
*/
|
|
34
|
+
export async function createEngineSession(schema, rowsByCatalogue) {
|
|
35
|
+
const { DuckDBInstance } = await import("@duckdb/node-api");
|
|
36
|
+
const instance = await DuckDBInstance.create(":memory:");
|
|
37
|
+
const conn = await instance.connect();
|
|
38
|
+
for (const ddl of generateTableDdl(schema)) {
|
|
39
|
+
await conn.run(ddl);
|
|
40
|
+
}
|
|
41
|
+
await loadRows(conn, schema, rowsByCatalogue);
|
|
42
|
+
return { conn, dispose: () => conn.disconnectSync() };
|
|
43
|
+
}
|
|
44
|
+
export async function validateWithEngine(schema, rowsByCatalogue, options = {}) {
|
|
45
|
+
const session = await createEngineSession(schema, rowsByCatalogue);
|
|
46
|
+
const conn = session.conn;
|
|
47
|
+
try {
|
|
48
|
+
const typeNonconformances = await findTypeNonconformances(conn, schema, rowsByCatalogue);
|
|
49
|
+
const failures = [];
|
|
50
|
+
const enumViolations = [];
|
|
51
|
+
const pkDuplicates = [];
|
|
52
|
+
for (const q of generateConstraintQueries(schema, options)) {
|
|
53
|
+
const reader = await conn.runAndReadAll(q.sql);
|
|
54
|
+
for (const row of reader.getRows()) {
|
|
55
|
+
if (q.kind === "fk") {
|
|
56
|
+
failures.push({
|
|
57
|
+
catalogue: q.catalogue,
|
|
58
|
+
column: q.column,
|
|
59
|
+
referencingRow: String(row[0] ?? ""),
|
|
60
|
+
value: String(row[1] ?? ""),
|
|
61
|
+
target: q.target,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else if (q.kind === "enum") {
|
|
65
|
+
const enumDef = schema.enums[q.target];
|
|
66
|
+
enumViolations.push({
|
|
67
|
+
catalogue: q.catalogue,
|
|
68
|
+
column: q.column,
|
|
69
|
+
rowPk: row[0] === null || row[0] === undefined ? "<no-pk>" : String(row[0]),
|
|
70
|
+
value: String(row[1] ?? ""),
|
|
71
|
+
allowed: enumDef.values.map((v) => v.value).join(" | "),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
pkDuplicates.push({
|
|
76
|
+
catalogue: q.catalogue,
|
|
77
|
+
rowPk: String(row[0] ?? ""),
|
|
78
|
+
count: Number(row[1]),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const externalFindingDetails = [];
|
|
84
|
+
for (const q of generateExternalFindingQueries(schema, options)) {
|
|
85
|
+
const reader = await conn.runAndReadAll(q.sql);
|
|
86
|
+
for (const row of reader.getRows()) {
|
|
87
|
+
externalFindingDetails.push({
|
|
88
|
+
catalogue: q.catalogue,
|
|
89
|
+
column: q.column,
|
|
90
|
+
target: q.target,
|
|
91
|
+
rowPk: row[0] === null || row[0] === undefined ? "?" : String(row[0]),
|
|
92
|
+
value: String(row[1] ?? ""),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
fk: {
|
|
98
|
+
internalPass: failures.length === 0,
|
|
99
|
+
internalFailures: failures,
|
|
100
|
+
externalFindings: externalFindingDetails.length,
|
|
101
|
+
},
|
|
102
|
+
enums: { pass: enumViolations.length === 0, violations: enumViolations },
|
|
103
|
+
externalFindingDetails,
|
|
104
|
+
pkDuplicates,
|
|
105
|
+
typeNonconformances,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
session.dispose();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The A4 cutover surface: runs the engine validation and writes findings
|
|
114
|
+
* into the caller's FindingsLog with BYTE-IDENTICAL text to what
|
|
115
|
+
* fk-validator.ts / enum-validator.ts wrote — adopters' committed
|
|
116
|
+
* findings baselines hold those literal lines, so the text is a
|
|
117
|
+
* compatibility contract, not a style choice. Line ORDER within a
|
|
118
|
+
* category follows the engine's total ORDER BY (M-ADR 0205 §4.2) and may
|
|
119
|
+
* differ from the old file-order rendering; baselines compare by
|
|
120
|
+
* membership, so ordering is free — declared in the change-set anyway.
|
|
121
|
+
*/
|
|
122
|
+
export async function validateWithEngineToLog(schema, rowsByCatalogue, findings, options = {}, extras = {}) {
|
|
123
|
+
const logEnumFindings = extras.logEnumFindings !== false;
|
|
124
|
+
const res = await validateWithEngine(schema, rowsByCatalogue, options);
|
|
125
|
+
for (const d of res.externalFindingDetails) {
|
|
126
|
+
findings.add("external", `${d.catalogue}.${d.column} → ${d.target}=${d.value} ` +
|
|
127
|
+
`(referencing row pk=${d.rowPk}; resolves at aggregation)`);
|
|
128
|
+
}
|
|
129
|
+
if (logEnumFindings) {
|
|
130
|
+
const enumNameByCatalogueColumn = new Map();
|
|
131
|
+
for (const cat of schema.catalogues) {
|
|
132
|
+
for (const [column, enumRef] of Object.entries(cat.columnEnums)) {
|
|
133
|
+
enumNameByCatalogueColumn.set(`${cat.name}.${column}`, enumRef.replace(/^enums\./, ""));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
for (const v of res.enums.violations) {
|
|
137
|
+
const enumName = enumNameByCatalogueColumn.get(`${v.catalogue}.${v.column}`);
|
|
138
|
+
findings.add("divergence", `${v.catalogue}.${v.column}: row ${v.rowPk} value "${v.value}" is outside the bound enum ${enumName} (${v.allowed})`, "error");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return { fk: res.fk, enums: res.enums };
|
|
142
|
+
}
|
|
143
|
+
async function loadRows(conn, schema, rowsByCatalogue) {
|
|
144
|
+
for (const cat of schema.catalogues) {
|
|
145
|
+
const rows = rowsByCatalogue.get(cat.name) ?? [];
|
|
146
|
+
if (rows.length === 0)
|
|
147
|
+
continue;
|
|
148
|
+
for (let i = 0; i < rows.length; i += INSERT_CHUNK) {
|
|
149
|
+
const chunk = rows.slice(i, i + INSERT_CHUNK);
|
|
150
|
+
const tuples = chunk
|
|
151
|
+
.map((row) => `(${cat.columns
|
|
152
|
+
.map((c) => literal(row[c.name], cat.name, c.name, c.type))
|
|
153
|
+
.join(", ")})`)
|
|
154
|
+
.join(",\n");
|
|
155
|
+
await conn.run(`INSERT INTO "${cat.name}" VALUES\n${tuples};`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Renders one cell. String columns keep the empty string AS an empty
|
|
161
|
+
* string — the in-memory validators' emptiness predicates see '' from the
|
|
162
|
+
* CSV reader, and the generated queries test both NULL and ''. Non-string
|
|
163
|
+
* columns TRY_CAST with '' becoming NULL: one uncastable cell must not
|
|
164
|
+
* abort a whole run (measured on a real estate: a prose value in a
|
|
165
|
+
* date-typed column), and the miss is not smoothed either —
|
|
166
|
+
* findTypeNonconformances re-derives every such cell with the engine's
|
|
167
|
+
* own cast semantics and reports it.
|
|
168
|
+
*/
|
|
169
|
+
function literal(value, catalogue, column, type) {
|
|
170
|
+
const s = value === null || value === undefined ? "" : String(value);
|
|
171
|
+
if (type === "string")
|
|
172
|
+
return sqlStringLiteral(s);
|
|
173
|
+
if (s === "")
|
|
174
|
+
return "NULL";
|
|
175
|
+
return `TRY_CAST(${sqlStringLiteral(s)} AS ${sqlType(catalogue, column, type)})`;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Exact engine-semantics detection of the cells TRY_CAST nulled: the
|
|
179
|
+
* distinct non-empty values of every typed column are re-checked with the
|
|
180
|
+
* SAME cast the load used — a JS re-implementation of the engine's parsers
|
|
181
|
+
* would be a second opinion pretending to be the first.
|
|
182
|
+
*/
|
|
183
|
+
async function findTypeNonconformances(conn, schema, rowsByCatalogue) {
|
|
184
|
+
const out = [];
|
|
185
|
+
for (const cat of schema.catalogues) {
|
|
186
|
+
const rows = rowsByCatalogue.get(cat.name) ?? [];
|
|
187
|
+
if (rows.length === 0)
|
|
188
|
+
continue;
|
|
189
|
+
for (const col of cat.columns) {
|
|
190
|
+
if (col.type === "string")
|
|
191
|
+
continue;
|
|
192
|
+
const counts = new Map();
|
|
193
|
+
for (const row of rows) {
|
|
194
|
+
const v = row[col.name];
|
|
195
|
+
const s = v === null || v === undefined ? "" : String(v);
|
|
196
|
+
if (s === "")
|
|
197
|
+
continue;
|
|
198
|
+
counts.set(s, (counts.get(s) ?? 0) + 1);
|
|
199
|
+
}
|
|
200
|
+
if (counts.size === 0)
|
|
201
|
+
continue;
|
|
202
|
+
const engineType = sqlType(cat.name, col.name, col.type);
|
|
203
|
+
const values = [...counts.keys()].sort();
|
|
204
|
+
const tuples = values.map((v) => `(${sqlStringLiteral(v)})`).join(", ");
|
|
205
|
+
const reader = await conn.runAndReadAll(`SELECT v FROM (VALUES ${tuples}) t(v) ` +
|
|
206
|
+
`WHERE TRY_CAST(v AS ${engineType}) IS NULL ORDER BY v;`);
|
|
207
|
+
for (const row of reader.getRows()) {
|
|
208
|
+
const value = String(row[0]);
|
|
209
|
+
out.push({
|
|
210
|
+
catalogue: cat.name,
|
|
211
|
+
column: col.name,
|
|
212
|
+
declaredType: col.type,
|
|
213
|
+
value,
|
|
214
|
+
rows: counts.get(value) ?? 0,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return out;
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=engine-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-validator.js","sourceRoot":"","sources":["../../../src/lib/catalogue/engine-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH,OAAO,EACL,yBAAyB,EACzB,8BAA8B,EAC9B,gBAAgB,EAChB,OAAO,GACR,MAAM,oBAAoB,CAAC;AA2C5B,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAC1C,CAAC;AAYD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAuB,EACvB,eAA6D;IAE7D,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAuB,EACvB,eAA6D,EAC7D,UAA+B,EAAE;IAEjC,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,mBAAmB,GAAG,MAAM,uBAAuB,CACvD,IAAI,EACJ,MAAM,EACN,eAAe,CAChB,CAAC;QAEF,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,MAAM,cAAc,GAAoB,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAkB,EAAE,CAAC;QAEvC,KAAK,MAAM,CAAC,IAAI,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACpB,QAAQ,CAAC,IAAI,CAAC;wBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACpC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC3B,MAAM,EAAE,CAAC,CAAC,MAAO;qBAClB,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAO,CAAE,CAAC;oBACzC,cAAc,CAAC,IAAI,CAAC;wBAClB,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBAC3E,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC3B,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;qBACxD,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC;wBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC3B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,sBAAsB,GAA4B,EAAE,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAI,8BAA8B,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnC,sBAAsB,CAAC,IAAI,CAAC;oBAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,MAAM,EAAE,CAAC,CAAC,MAAO;oBACjB,KAAK,EACH,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAChE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC5B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO;YACL,EAAE,EAAE;gBACF,YAAY,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;gBACnC,gBAAgB,EAAE,QAAQ;gBAC1B,gBAAgB,EAAE,sBAAsB,CAAC,MAAM;aAChD;YACD,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE;YACxE,sBAAsB;YACtB,YAAY;YACZ,mBAAmB;SACpB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAuB,EACvB,eAA6D,EAC7D,QAAqB,EACrB,UAA+B,EAAE,EACjC,SAMI,EAAE;IAEN,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;IACvE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,sBAAsB,EAAE,CAAC;QAC3C,QAAQ,CAAC,GAAG,CACV,UAAU,EACV,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG;YACpD,uBAAuB,CAAC,CAAC,KAAK,4BAA4B,CAC7D,CAAC;IACJ,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACpC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChE,yBAAyB,CAAC,GAAG,CAC3B,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EACvB,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAChC,CAAC;YACJ,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAG,CAC5C,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,CAC7B,CAAC;YACF,QAAQ,CAAC,GAAG,CACV,YAAY,EACZ,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK,+BAA+B,QAAQ,KAAK,CAAC,CAAC,OAAO,GAAG,EACpH,OAAO,CACR,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,IAA4C,EAC5C,MAAuB,EACvB,eAA6D;IAE7D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK;iBACjB,GAAG,CACF,CAAC,GAAG,EAAE,EAAE,CACN,IAAI,GAAG,CAAC,OAAO;iBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;iBAC1D,IAAI,CAAC,IAAI,CAAC,GAAG,CACnB;iBACA,IAAI,CAAC,KAAK,CAAC,CAAC;YACf,MAAM,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,IAAI,aAAa,MAAM,GAAG,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,OAAO,CACd,KAA2B,EAC3B,SAAiB,EACjB,MAAc,EACd,IAAY;IAEZ,MAAM,CAAC,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC;IAC5B,OAAO,YAAY,gBAAgB,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;AACnF,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,uBAAuB,CACpC,IAGC,EACD,MAAuB,EACvB,eAA6D;IAE7D,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;YACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxB,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACzD,IAAI,CAAC,KAAK,EAAE;oBAAE,SAAS;gBACvB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;gBAAE,SAAS;YAChC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CACrC,yBAAyB,MAAM,SAAS;gBACtC,uBAAuB,UAAU,uBAAuB,CAC3D,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,GAAG,CAAC,IAAI,CAAC;oBACP,SAAS,EAAE,GAAG,CAAC,IAAI;oBACnB,MAAM,EAAE,GAAG,CAAC,IAAI;oBAChB,YAAY,EAAE,GAAG,CAAC,IAAI;oBACtB,KAAK;oBACL,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;iBAC7B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/enum-validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"enum-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/enum-validator.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAC;CAC/C;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EACvB,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,EAC7D,QAAQ,EAAE,WAAW,GACpB,oBAAoB,CAgDtB"}
|
|
@@ -16,6 +16,12 @@
|
|
|
16
16
|
//
|
|
17
17
|
// reads: the in-memory rows of every schema catalogue carrying a
|
|
18
18
|
// `column_enums` block (no filesystem access of its own).
|
|
19
|
+
//
|
|
20
|
+
// POST-CUTOVER ROLE (M-ADR 0205 §4.4, A4): no production path calls this
|
|
21
|
+
// module — validate/build/aggregate run the engine path. It remains as
|
|
22
|
+
// the reference side of the standing differential (parity-harness.ts and
|
|
23
|
+
// the estate sweep driver), so implementation drift between the two gets
|
|
24
|
+
// caught by the suite instead of lurking.
|
|
19
25
|
export function validateColumnEnums(schema, rowsByCatalogue, findings) {
|
|
20
26
|
const violations = [];
|
|
21
27
|
for (const cat of schema.catalogues) {
|
|
@@ -29,6 +35,15 @@ export function validateColumnEnums(schema, rowsByCatalogue, findings) {
|
|
|
29
35
|
findings.add("convention", `${cat.name}.${column}: column_enums references unknown enum "${enumRef}" — nothing to validate against`, "error");
|
|
30
36
|
continue;
|
|
31
37
|
}
|
|
38
|
+
if (!cat.columns.some((c) => c.name === column)) {
|
|
39
|
+
// A binding to a column the catalogue does not declare reads every
|
|
40
|
+
// row's absent cell as empty and skips it — vacuously green. That
|
|
41
|
+
// is how repositories.service_type (the authoring field's name, not
|
|
42
|
+
// the column's) validated as true from 3.0.0 until schema 3.1.3
|
|
43
|
+
// corrected it. Same discipline as the unknown-enum case above.
|
|
44
|
+
findings.add("convention", `${cat.name}.${column}: column_enums binds a column the catalogue does not declare — the binding validates nothing`, "error");
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
32
47
|
const allowedSet = new Set(enumDef.values.map((v) => v.value));
|
|
33
48
|
const allowed = enumDef.values.map((v) => v.value).join(" | ");
|
|
34
49
|
for (const row of rowsByCatalogue.get(cat.name) ?? []) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum-validator.js","sourceRoot":"","sources":["../../../src/lib/catalogue/enum-validator.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,0DAA0D;AAC1D,EAAE;AACF,4EAA4E;AAC5E,sEAAsE;AACtE,2EAA2E;AAC3E,0EAA0E;AAC1E,0EAA0E;AAC1E,2EAA2E;AAC3E,2DAA2D;AAC3D,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,0EAA0E;AAC1E,8CAA8C;AAC9C,EAAE;AACF,iEAAiE;AACjE,0DAA0D;
|
|
1
|
+
{"version":3,"file":"enum-validator.js","sourceRoot":"","sources":["../../../src/lib/catalogue/enum-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,12 @@
|
|
|
14
14
|
* named even if it resolves cross-SDD.
|
|
15
15
|
*
|
|
16
16
|
* Returns a structured result; the caller decides exit code + reporting.
|
|
17
|
+
*
|
|
18
|
+
* POST-CUTOVER ROLE (M-ADR 0205 §4.4, A4): no production path calls this
|
|
19
|
+
* module — validate/build/aggregate run the engine path. It remains as the
|
|
20
|
+
* reference side of the standing differential (parity-harness.ts and the
|
|
21
|
+
* estate sweep driver), so implementation drift between the two gets
|
|
22
|
+
* caught by the suite instead of lurking.
|
|
17
23
|
*/
|
|
18
24
|
import type { CanonicalSchema } from "./schema-loader.js";
|
|
19
25
|
import type { CatalogueRow } from "./csv-writer.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fk-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/fk-validator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fk-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/fk-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,SAAS,SAAS,EAAE,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAC3C;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EACvB,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,EAC7D,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CA4FpB"}
|
|
@@ -14,6 +14,12 @@
|
|
|
14
14
|
* named even if it resolves cross-SDD.
|
|
15
15
|
*
|
|
16
16
|
* Returns a structured result; the caller decides exit code + reporting.
|
|
17
|
+
*
|
|
18
|
+
* POST-CUTOVER ROLE (M-ADR 0205 §4.4, A4): no production path calls this
|
|
19
|
+
* module — validate/build/aggregate run the engine path. It remains as the
|
|
20
|
+
* reference side of the standing differential (parity-harness.ts and the
|
|
21
|
+
* estate sweep driver), so implementation drift between the two gets
|
|
22
|
+
* caught by the suite instead of lurking.
|
|
17
23
|
*/
|
|
18
24
|
/**
|
|
19
25
|
* Build an in-memory map of every catalogue's primary-key set, then walk
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fk-validator.js","sourceRoot":"","sources":["../../../src/lib/catalogue/fk-validator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fk-validator.js","sourceRoot":"","sources":["../../../src/lib/catalogue/fk-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase-0 gate checks as SQL — M-ADR 0205 §4.4 (engine-evolution Phase A3,
|
|
3
|
+
* final tranche). The nine small catalogue-integrity-gate steps
|
|
4
|
+
* re-expressed on the engine: emptiness-vs-populated-inputs signals
|
|
5
|
+
* (repo-edges 0157, data-model-entities 0159, capability-event 0160,
|
|
6
|
+
* feature-event 0161, platform-dependencies 0162, glossary-xref 0158),
|
|
7
|
+
* the per-domain event-catalogue count compare (0156), and the two
|
|
8
|
+
* features.csv Phase-0 checks (0177 F1 promotion, F2 near-duplicate
|
|
9
|
+
* surfaces — the classified borderline: engine for access, the token
|
|
10
|
+
* Jaccard stays host-language).
|
|
11
|
+
*
|
|
12
|
+
* The shell scripts remain the REFERENCE implementations until A4. Known,
|
|
13
|
+
* deliberate divergence class: several references read CSV columns
|
|
14
|
+
* POSITIONALLY with a naive comma split (`awk -F, $5`) and count PHYSICAL
|
|
15
|
+
* lines rather than CSV records — this port reads by column name over
|
|
16
|
+
* parsed records. Where real data makes those disagree, the dual-run
|
|
17
|
+
* driver surfaces it and the adjudication is a defect in the shell side
|
|
18
|
+
* (the exact matcher-error class M-ADR 0205 §1 exists to kill), never a
|
|
19
|
+
* smoothing of this side.
|
|
20
|
+
*
|
|
21
|
+
* File and YAML ingestion stay host-side, mirroring each reference's
|
|
22
|
+
* refusal semantics (a missing key, an unparseable document, an absent
|
|
23
|
+
* tool each behave exactly as the reference behaves).
|
|
24
|
+
*/
|
|
25
|
+
import type { EngineSession } from "./engine-validator.js";
|
|
26
|
+
export interface DomainCatalogueGap {
|
|
27
|
+
readonly domain: string;
|
|
28
|
+
readonly declared: number;
|
|
29
|
+
readonly emitted: number;
|
|
30
|
+
}
|
|
31
|
+
export interface EventCatalogueCheckOptions {
|
|
32
|
+
readonly sddRoot: string;
|
|
33
|
+
/** events.csv file presence — absent means the whole check is skipped. */
|
|
34
|
+
readonly eventsPresent: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function runEventCatalogueCheck(session: EngineSession, options: EventCatalogueCheckOptions): Promise<{
|
|
37
|
+
readonly skipped: boolean;
|
|
38
|
+
readonly gaps: readonly DomainCatalogueGap[];
|
|
39
|
+
}>;
|
|
40
|
+
export interface RepoEdgesResult {
|
|
41
|
+
readonly repoCapabilityGap?: {
|
|
42
|
+
readonly capabilityService: number;
|
|
43
|
+
readonly servicesWithRepo: number;
|
|
44
|
+
};
|
|
45
|
+
readonly repoContractForwardGap?: {
|
|
46
|
+
readonly contracts: number;
|
|
47
|
+
readonly repoConfigsWithContracts: number;
|
|
48
|
+
};
|
|
49
|
+
readonly repoContractPathXGap?: {
|
|
50
|
+
readonly serviceContracts: number;
|
|
51
|
+
readonly servicesWithRepo: number;
|
|
52
|
+
};
|
|
53
|
+
readonly repoContractReverseGap?: {
|
|
54
|
+
readonly contracts: number;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export declare function runRepoEdgesCheck(session: EngineSession, options: {
|
|
58
|
+
readonly sddRoot: string;
|
|
59
|
+
}): Promise<RepoEdgesResult>;
|
|
60
|
+
export declare function runGlossaryXrefCheck(session: EngineSession, options: {
|
|
61
|
+
readonly sddRoot: string;
|
|
62
|
+
readonly xrefPresent: boolean;
|
|
63
|
+
}): Promise<{
|
|
64
|
+
readonly finding: boolean;
|
|
65
|
+
}>;
|
|
66
|
+
export interface DataModelEntitiesResult {
|
|
67
|
+
readonly entitiesGap?: {
|
|
68
|
+
readonly domainModels: number;
|
|
69
|
+
};
|
|
70
|
+
readonly serviceEntityGap?: {
|
|
71
|
+
readonly entities: number;
|
|
72
|
+
readonly services: number;
|
|
73
|
+
};
|
|
74
|
+
readonly containerEntityGap?: {
|
|
75
|
+
readonly containersWithService: number;
|
|
76
|
+
readonly serviceEntity: number;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export declare function runDataModelEntitiesCheck(session: EngineSession): Promise<DataModelEntitiesResult>;
|
|
80
|
+
export interface CapabilityEventResult {
|
|
81
|
+
readonly derivableGap?: {
|
|
82
|
+
readonly serviceEvent: number;
|
|
83
|
+
readonly capabilityService: number;
|
|
84
|
+
};
|
|
85
|
+
readonly authoredGap?: {
|
|
86
|
+
readonly derived: number;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export declare function runCapabilityEventCheck(session: EngineSession): Promise<CapabilityEventResult>;
|
|
90
|
+
export declare function runFeatureEventCheck(session: EngineSession): Promise<{
|
|
91
|
+
readonly gap?: {
|
|
92
|
+
readonly serviceEvent: number;
|
|
93
|
+
readonly featureService: number;
|
|
94
|
+
};
|
|
95
|
+
}>;
|
|
96
|
+
export declare function runPlatformDependenciesCheck(session: EngineSession, options: {
|
|
97
|
+
readonly sddRoot: string;
|
|
98
|
+
}): Promise<{
|
|
99
|
+
readonly finding: boolean;
|
|
100
|
+
}>;
|
|
101
|
+
export interface FeatureSpecPromotionResult {
|
|
102
|
+
readonly finding?: {
|
|
103
|
+
readonly intermediate: number;
|
|
104
|
+
readonly total: number;
|
|
105
|
+
readonly pctResolvable: number;
|
|
106
|
+
readonly note: "predominantly un-promoted" | "partially promoted";
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export declare function runFeatureSpecPromotionCheck(session: EngineSession): Promise<FeatureSpecPromotionResult>;
|
|
110
|
+
export interface FeatureSurfaceDuplicationResult {
|
|
111
|
+
readonly finding?: {
|
|
112
|
+
readonly pairs: number;
|
|
113
|
+
readonly capabilities: number;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export declare function runFeatureSurfaceDuplicationCheck(session: EngineSession): Promise<FeatureSurfaceDuplicationResult>;
|
|
117
|
+
//# sourceMappingURL=gate-checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-checks.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/gate-checks.ts"],"names":[],"mappings":"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"}
|