@duckcodeailabs/dql-core 1.6.21 → 1.6.23
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/contracts/index.d.ts +1 -1
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/registry.d.ts +25 -1
- package/dist/contracts/registry.d.ts.map +1 -1
- package/dist/contracts/registry.js +104 -12
- package/dist/contracts/registry.js.map +1 -1
- package/dist/contracts/types.d.ts +55 -0
- package/dist/contracts/types.d.ts.map +1 -1
- package/dist/contracts/types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lineage/builder.d.ts.map +1 -1
- package/dist/lineage/builder.js +12 -0
- package/dist/lineage/builder.js.map +1 -1
- package/dist/lineage/column-lineage.d.ts +27 -0
- package/dist/lineage/column-lineage.d.ts.map +1 -1
- package/dist/lineage/column-lineage.js +147 -0
- package/dist/lineage/column-lineage.js.map +1 -1
- package/dist/lineage/derivation.d.ts +111 -0
- package/dist/lineage/derivation.d.ts.map +1 -0
- package/dist/lineage/derivation.js +177 -0
- package/dist/lineage/derivation.js.map +1 -0
- package/dist/lineage/impact.d.ts +127 -0
- package/dist/lineage/impact.d.ts.map +1 -0
- package/dist/lineage/impact.js +305 -0
- package/dist/lineage/impact.js.map +1 -0
- package/dist/lineage/index.d.ts +3 -1
- package/dist/lineage/index.d.ts.map +1 -1
- package/dist/lineage/index.js +3 -1
- package/dist/lineage/index.js.map +1 -1
- package/dist/manifest/builder.d.ts +16 -0
- package/dist/manifest/builder.d.ts.map +1 -1
- package/dist/manifest/builder.js +117 -10
- package/dist/manifest/builder.js.map +1 -1
- package/dist/manifest/dbt-freshness.d.ts +65 -0
- package/dist/manifest/dbt-freshness.d.ts.map +1 -0
- package/dist/manifest/dbt-freshness.js +264 -0
- package/dist/manifest/dbt-freshness.js.map +1 -0
- package/dist/manifest/domain-writer.d.ts +66 -0
- package/dist/manifest/domain-writer.d.ts.map +1 -0
- package/dist/manifest/domain-writer.js +114 -0
- package/dist/manifest/domain-writer.js.map +1 -0
- package/dist/manifest/index.d.ts +4 -1
- package/dist/manifest/index.d.ts.map +1 -1
- package/dist/manifest/index.js +3 -0
- package/dist/manifest/index.js.map +1 -1
- package/dist/manifest/output-drift.d.ts +31 -0
- package/dist/manifest/output-drift.d.ts.map +1 -0
- package/dist/manifest/output-drift.js +97 -0
- package/dist/manifest/output-drift.js.map +1 -0
- package/dist/manifest/types.d.ts +156 -1
- package/dist/manifest/types.d.ts.map +1 -1
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +8 -0
- package/dist/parser/parser.js.map +1 -1
- package/dist/semantic/analyzer.d.ts +8 -0
- package/dist/semantic/analyzer.d.ts.map +1 -1
- package/dist/semantic/analyzer.js +8 -0
- package/dist/semantic/analyzer.js.map +1 -1
- package/dist/semantic/conflicts.d.ts +33 -0
- package/dist/semantic/conflicts.d.ts.map +1 -0
- package/dist/semantic/conflicts.js +270 -0
- package/dist/semantic/conflicts.js.map +1 -0
- package/dist/semantic/index.d.ts +1 -1
- package/dist/semantic/index.d.ts.map +1 -1
- package/dist/semantic/index.js +1 -1
- package/dist/semantic/index.js.map +1 -1
- package/dist/trust/index.d.ts +3 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +2 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/labels.d.ts +122 -0
- package/dist/trust/labels.d.ts.map +1 -0
- package/dist/trust/labels.js +185 -0
- package/dist/trust/labels.js.map +1 -0
- package/package.json +5 -1
|
@@ -225,6 +225,153 @@ function readFunctionName(expr) {
|
|
|
225
225
|
}
|
|
226
226
|
return '';
|
|
227
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* Extract, per `ref()`'d child block, the columns a parent block's SQL
|
|
230
|
+
* references. Powers output-contract drift detection: each returned column is
|
|
231
|
+
* checked against the child block's current output schema.
|
|
232
|
+
*
|
|
233
|
+
* In DQL, `ref("child")` appears in a FROM/JOIN clause and parses (via
|
|
234
|
+
* node-sql-parser) as a *function* call — not a `table` node — so the standard
|
|
235
|
+
* column-lineage table resolver does not see it. This walker special-cases
|
|
236
|
+
* that shape: it maps each `ref(...)` source to its alias, then attributes
|
|
237
|
+
* column references back to the child block by alias. Unqualified columns are
|
|
238
|
+
* attributed only when there is exactly one `ref()` source and no other table
|
|
239
|
+
* in the FROM clause (so we never guess wrong on joins).
|
|
240
|
+
*
|
|
241
|
+
* Conservative by design: anything ambiguous yields no usage rather than a
|
|
242
|
+
* false-positive drift warning. Returns one entry per distinct child block.
|
|
243
|
+
*/
|
|
244
|
+
export function extractRefColumnUsage(sql, dialect = DEFAULT_DIALECT) {
|
|
245
|
+
const parser = new Parser();
|
|
246
|
+
let astRoot;
|
|
247
|
+
try {
|
|
248
|
+
astRoot = parser.astify(sql, { database: DIALECT_MAP[dialect.toLowerCase()] ?? 'postgresql' });
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return [];
|
|
252
|
+
}
|
|
253
|
+
const stmts = Array.isArray(astRoot) ? astRoot : [astRoot];
|
|
254
|
+
const select = stmts.find((s) => isSelectNode(s));
|
|
255
|
+
if (!select)
|
|
256
|
+
return [];
|
|
257
|
+
// Map ref-alias -> child block name. Also track non-ref relations so we know
|
|
258
|
+
// whether unqualified columns can be safely attributed to a single ref.
|
|
259
|
+
const aliasToBlock = new Map();
|
|
260
|
+
let nonRefRelationCount = 0;
|
|
261
|
+
const fromList = select.from;
|
|
262
|
+
if (Array.isArray(fromList)) {
|
|
263
|
+
for (const entry of fromList) {
|
|
264
|
+
if (!entry || typeof entry !== 'object')
|
|
265
|
+
continue;
|
|
266
|
+
const e = entry;
|
|
267
|
+
const childBlock = readRefFunctionArg(e.expr);
|
|
268
|
+
if (childBlock) {
|
|
269
|
+
const alias = typeof e.as === 'string' && e.as ? e.as : childBlock;
|
|
270
|
+
aliasToBlock.set(alias, childBlock);
|
|
271
|
+
}
|
|
272
|
+
else if (typeof e.table === 'string' && e.table) {
|
|
273
|
+
nonRefRelationCount += 1;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (aliasToBlock.size === 0)
|
|
278
|
+
return [];
|
|
279
|
+
const soleRefBlock = aliasToBlock.size === 1 && nonRefRelationCount === 0
|
|
280
|
+
? [...aliasToBlock.values()][0]
|
|
281
|
+
: undefined;
|
|
282
|
+
// Collect column refs across the whole statement (SELECT list, WHERE, etc.),
|
|
283
|
+
// skipping the FROM clause so the ref() argument string is not counted.
|
|
284
|
+
const usage = new Map();
|
|
285
|
+
const ensure = (block) => {
|
|
286
|
+
let set = usage.get(block);
|
|
287
|
+
if (!set) {
|
|
288
|
+
set = new Set();
|
|
289
|
+
usage.set(block, set);
|
|
290
|
+
}
|
|
291
|
+
return set;
|
|
292
|
+
};
|
|
293
|
+
const visit = (value, insideFrom) => {
|
|
294
|
+
if (!value || typeof value !== 'object')
|
|
295
|
+
return;
|
|
296
|
+
if (Array.isArray(value)) {
|
|
297
|
+
for (const item of value)
|
|
298
|
+
visit(item, insideFrom);
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const obj = value;
|
|
302
|
+
if (!insideFrom && obj.type === 'column_ref') {
|
|
303
|
+
const column = readColumnRefName(obj);
|
|
304
|
+
if (column && column !== '*') {
|
|
305
|
+
const tableAlias = obj.table ?? null;
|
|
306
|
+
if (tableAlias && aliasToBlock.has(tableAlias)) {
|
|
307
|
+
ensure(aliasToBlock.get(tableAlias)).add(column);
|
|
308
|
+
}
|
|
309
|
+
else if (!tableAlias && soleRefBlock) {
|
|
310
|
+
ensure(soleRefBlock).add(column);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
for (const [key, child] of Object.entries(obj)) {
|
|
316
|
+
visit(child, insideFrom || key === 'from');
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
visit(select, false);
|
|
320
|
+
return [...usage.entries()].map(([block, columns]) => ({
|
|
321
|
+
block,
|
|
322
|
+
columns: [...columns],
|
|
323
|
+
}));
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* If `expr` is a `ref('name')` / `ref("name")` function call in a FROM clause,
|
|
327
|
+
* return the referenced block name; otherwise undefined. node-sql-parser
|
|
328
|
+
* encodes the string argument either as a quoted-string literal or as a
|
|
329
|
+
* `column_ref` whose column expr holds the value.
|
|
330
|
+
*/
|
|
331
|
+
function readRefFunctionArg(expr) {
|
|
332
|
+
if (!expr || typeof expr !== 'object')
|
|
333
|
+
return undefined;
|
|
334
|
+
const e = expr;
|
|
335
|
+
if (e.type !== 'function')
|
|
336
|
+
return undefined;
|
|
337
|
+
if (readCallName(e.name).toLowerCase() !== 'ref')
|
|
338
|
+
return undefined;
|
|
339
|
+
const args = e.args;
|
|
340
|
+
const list = (args?.value ?? args);
|
|
341
|
+
const first = Array.isArray(list) ? list[0] : undefined;
|
|
342
|
+
if (!first)
|
|
343
|
+
return undefined;
|
|
344
|
+
// Quoted-string literal form: { type: 'single_quote_string', value: 'name' }
|
|
345
|
+
if (typeof first.value === 'string')
|
|
346
|
+
return first.value;
|
|
347
|
+
// column_ref form: { type: 'column_ref', column: { expr: { value: 'name' } } }
|
|
348
|
+
if (first.type === 'column_ref') {
|
|
349
|
+
const name = readColumnRefName(first);
|
|
350
|
+
if (name)
|
|
351
|
+
return name;
|
|
352
|
+
}
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Read a function/relation call name across node-sql-parser shapes. FROM-clause
|
|
357
|
+
* function relations wrap the name as `{ name: [{ value: 'ref' }] }` (an object
|
|
358
|
+
* around the array), distinct from the bare-string / bare-array forms handled
|
|
359
|
+
* by `readFunctionName`. Normalise all three to a plain string.
|
|
360
|
+
*/
|
|
361
|
+
function readCallName(name) {
|
|
362
|
+
if (typeof name === 'string')
|
|
363
|
+
return name;
|
|
364
|
+
if (Array.isArray(name))
|
|
365
|
+
return readFunctionName({ name });
|
|
366
|
+
if (name && typeof name === 'object') {
|
|
367
|
+
const inner = name.name;
|
|
368
|
+
if (Array.isArray(inner))
|
|
369
|
+
return readFunctionName({ name: inner });
|
|
370
|
+
if (typeof inner === 'string')
|
|
371
|
+
return inner;
|
|
372
|
+
}
|
|
373
|
+
return '';
|
|
374
|
+
}
|
|
228
375
|
function collectColumnRefs(node, aliasToTable, tables) {
|
|
229
376
|
const out = [];
|
|
230
377
|
const seen = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column-lineage.js","sourceRoot":"","sources":["../../src/lineage/column-lineage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"column-lineage.js","sourceRoot":"","sources":["../../src/lineage/column-lineage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Show your work" — consumer-facing derivation walk.
|
|
3
|
+
*
|
|
4
|
+
* A derivation walk is the plain-language story of how a single certified (or
|
|
5
|
+
* generated) answer was produced: the value, the governed block that owns it,
|
|
6
|
+
* the business terms and metrics/dimensions it draws on, the dbt model/source
|
|
7
|
+
* it ultimately reads from, and the freshness/owner/review state that makes it
|
|
8
|
+
* trustworthy.
|
|
9
|
+
*
|
|
10
|
+
* It is NOT the raw author lineage graph. It deliberately hides depth: a flat,
|
|
11
|
+
* ordered list of steps the UI can reveal one level at a time. The structured
|
|
12
|
+
* payload is assembled entirely from data that already exists —
|
|
13
|
+
* `queryBusiness360` (businessDefinition / businessComposition /
|
|
14
|
+
* technicalSources / consumers / gaps / evidence) plus the answer's source
|
|
15
|
+
* block governance fields — so no lineage is rebuilt and no schema changes.
|
|
16
|
+
*/
|
|
17
|
+
import type { Business360Result } from './query.js';
|
|
18
|
+
/** The kind of node a derivation step represents, ordered roughly value → source. */
|
|
19
|
+
export type DerivationStepKind = 'value' | 'block' | 'term' | 'metric' | 'dimension' | 'model' | 'source' | 'consumer';
|
|
20
|
+
/**
|
|
21
|
+
* One node in the derivation walk. Intentionally flat and plain-language: the
|
|
22
|
+
* UI reveals steps progressively rather than drawing edges.
|
|
23
|
+
*/
|
|
24
|
+
export interface DerivationStep {
|
|
25
|
+
kind: DerivationStepKind;
|
|
26
|
+
/** Human-readable label, e.g. the block name or term name. */
|
|
27
|
+
name: string;
|
|
28
|
+
/** Governing owner (person/team), when known. */
|
|
29
|
+
owner?: string;
|
|
30
|
+
/** Certification/review status, when known (e.g. certified, review, draft). */
|
|
31
|
+
status?: string;
|
|
32
|
+
/** Optional one-line plain-language detail for this step. */
|
|
33
|
+
detail?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The consumer-facing derivation payload. `trustLabel` and `freshness` are
|
|
37
|
+
* OPTIONAL: they are populated from whatever exists today and are designed to
|
|
38
|
+
* be filled in later by the trust-label / freshness-aware-trust features.
|
|
39
|
+
*/
|
|
40
|
+
export interface DerivationWalk {
|
|
41
|
+
/** The headline value the answer reported, when there is a single one. */
|
|
42
|
+
value?: string;
|
|
43
|
+
/** One-sentence plain-language summary of the derivation. */
|
|
44
|
+
summary: string;
|
|
45
|
+
/** Ordered walk: value → block → term/metric → dbt model/source. */
|
|
46
|
+
steps: DerivationStep[];
|
|
47
|
+
/** Canonical trust label, when available (optional; sibling feature fills this in). */
|
|
48
|
+
trustLabel?: string;
|
|
49
|
+
/** Freshness marker for the upstream data, when available (optional sibling feature). */
|
|
50
|
+
freshness?: string;
|
|
51
|
+
/** Interpretation caveats drawn from the block's `caveats`. */
|
|
52
|
+
caveats?: string[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Minimal governance descriptor for the answer's source block. Both
|
|
56
|
+
* `ManifestBlock` and the agent's `KGNode` are structurally compatible, so the
|
|
57
|
+
* builder can accept either without coupling to a specific package.
|
|
58
|
+
*/
|
|
59
|
+
export interface DerivationFocusBlock {
|
|
60
|
+
name: string;
|
|
61
|
+
owner?: string;
|
|
62
|
+
status?: string;
|
|
63
|
+
/** Review cadence, e.g. "monthly". Surfaced verbatim in the walk. */
|
|
64
|
+
reviewCadence?: string;
|
|
65
|
+
/** Interpretation caveats. Surfaced verbatim and as the walk's `caveats`. */
|
|
66
|
+
caveats?: string[];
|
|
67
|
+
/** Business term names this block implements. */
|
|
68
|
+
termRefs?: string[];
|
|
69
|
+
/** Semantic metric references. */
|
|
70
|
+
metricRefs?: string[];
|
|
71
|
+
/** Semantic dimension references. */
|
|
72
|
+
dimensionRefs?: string[];
|
|
73
|
+
/** Business outcome / decision the block supports. */
|
|
74
|
+
businessOutcome?: string;
|
|
75
|
+
decisionUse?: string;
|
|
76
|
+
/**
|
|
77
|
+
* Freshness-aware trust — effective data health rolled up from the block's
|
|
78
|
+
* transitive dbt upstreams (`ManifestBlock.dataState`). When present and not
|
|
79
|
+
* `fresh`, the walk's `freshness` marker is derived from it so "show your
|
|
80
|
+
* work" reflects stale/failed upstream data, not just certification.
|
|
81
|
+
*/
|
|
82
|
+
dataState?: 'fresh' | 'stale' | 'failed' | 'unknown';
|
|
83
|
+
/** Plain-language explanation of `dataState`. */
|
|
84
|
+
dataStateDetail?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface BuildDerivationWalkInput {
|
|
87
|
+
/** Business-360 payload for the focus block/term (from `queryBusiness360`). */
|
|
88
|
+
business360: Business360Result;
|
|
89
|
+
/** The answer's source block governance fields (caveats / reviewCadence / refs). */
|
|
90
|
+
block?: DerivationFocusBlock;
|
|
91
|
+
/** The headline value, when the answer reported a single number/string. */
|
|
92
|
+
value?: string;
|
|
93
|
+
/**
|
|
94
|
+
* Whether this answer is a generated (Tier-2) draft. When true the walk ends
|
|
95
|
+
* with the appropriate review-required state instead of a certified close.
|
|
96
|
+
*/
|
|
97
|
+
generated?: boolean;
|
|
98
|
+
/** Optional canonical trust label (optional sibling feature). */
|
|
99
|
+
trustLabel?: string;
|
|
100
|
+
/** Optional freshness marker (optional sibling feature). */
|
|
101
|
+
freshness?: string;
|
|
102
|
+
/** Max steps of any single kind to include (keeps the walk compact). Default 3. */
|
|
103
|
+
maxPerKind?: number;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Assemble a consumer-facing derivation walk from an already-computed
|
|
107
|
+
* `queryBusiness360` result plus the answer's source block. Pure and
|
|
108
|
+
* synchronous — safe to call from a browser bundle.
|
|
109
|
+
*/
|
|
110
|
+
export declare function buildDerivationWalk(input: BuildDerivationWalkInput): DerivationWalk;
|
|
111
|
+
//# sourceMappingURL=derivation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivation.d.ts","sourceRoot":"","sources":["../../src/lineage/derivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE,qFAAqF;AACrF,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,OAAO,GACP,MAAM,GACN,QAAQ,GACR,WAAW,GACX,OAAO,GACP,QAAQ,GACR,UAAU,CAAC;AAEf;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrD,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,+EAA+E;IAC/E,WAAW,EAAE,iBAAiB,CAAC;IAC/B,oFAAoF;IACpF,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,cAAc,CA0FnF"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Show your work" — consumer-facing derivation walk.
|
|
3
|
+
*
|
|
4
|
+
* A derivation walk is the plain-language story of how a single certified (or
|
|
5
|
+
* generated) answer was produced: the value, the governed block that owns it,
|
|
6
|
+
* the business terms and metrics/dimensions it draws on, the dbt model/source
|
|
7
|
+
* it ultimately reads from, and the freshness/owner/review state that makes it
|
|
8
|
+
* trustworthy.
|
|
9
|
+
*
|
|
10
|
+
* It is NOT the raw author lineage graph. It deliberately hides depth: a flat,
|
|
11
|
+
* ordered list of steps the UI can reveal one level at a time. The structured
|
|
12
|
+
* payload is assembled entirely from data that already exists —
|
|
13
|
+
* `queryBusiness360` (businessDefinition / businessComposition /
|
|
14
|
+
* technicalSources / consumers / gaps / evidence) plus the answer's source
|
|
15
|
+
* block governance fields — so no lineage is rebuilt and no schema changes.
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_MAX_PER_KIND = 3;
|
|
18
|
+
/**
|
|
19
|
+
* Assemble a consumer-facing derivation walk from an already-computed
|
|
20
|
+
* `queryBusiness360` result plus the answer's source block. Pure and
|
|
21
|
+
* synchronous — safe to call from a browser bundle.
|
|
22
|
+
*/
|
|
23
|
+
export function buildDerivationWalk(input) {
|
|
24
|
+
const { business360, block, value, generated = false } = input;
|
|
25
|
+
const maxPerKind = input.maxPerKind ?? DEFAULT_MAX_PER_KIND;
|
|
26
|
+
const focus = business360.focus;
|
|
27
|
+
const steps = [];
|
|
28
|
+
// 1) Value — the thing the consumer actually asked about.
|
|
29
|
+
if (value) {
|
|
30
|
+
steps.push({
|
|
31
|
+
kind: 'value',
|
|
32
|
+
name: value,
|
|
33
|
+
detail: focus.name ? `Reported by ${focus.name}.` : undefined,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// 2) Block / business asset that owns the answer.
|
|
37
|
+
const blockOwner = block?.owner ?? focus.owner;
|
|
38
|
+
const blockStatus = (block?.status ?? focus.status);
|
|
39
|
+
const reviewCadence = block?.reviewCadence ?? metadataString(focus.metadata, 'reviewCadence');
|
|
40
|
+
steps.push({
|
|
41
|
+
kind: 'block',
|
|
42
|
+
name: focus.name,
|
|
43
|
+
owner: blockOwner,
|
|
44
|
+
status: blockStatus,
|
|
45
|
+
detail: blockDetail({
|
|
46
|
+
reviewCadence,
|
|
47
|
+
businessOutcome: block?.businessOutcome ?? metadataString(focus.metadata, 'businessOutcome'),
|
|
48
|
+
decisionUse: block?.decisionUse,
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
// 3) Business terms that define the language of the answer.
|
|
52
|
+
const termAssets = uniqueByName([
|
|
53
|
+
...business360.businessDefinition.terms,
|
|
54
|
+
...business360.businessDefinition.definedByTerms,
|
|
55
|
+
]);
|
|
56
|
+
for (const term of termAssets.slice(0, maxPerKind)) {
|
|
57
|
+
if (term.id === focus.id)
|
|
58
|
+
continue;
|
|
59
|
+
steps.push({
|
|
60
|
+
kind: 'term',
|
|
61
|
+
name: term.name,
|
|
62
|
+
owner: term.owner,
|
|
63
|
+
detail: 'Business term this answer is defined in.',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// 4) Metrics / dimensions referenced by the block (semantic layer).
|
|
67
|
+
for (const metric of dedupeNames(block?.metricRefs).slice(0, maxPerKind)) {
|
|
68
|
+
steps.push({ kind: 'metric', name: metric, detail: 'Governed metric used in the calculation.' });
|
|
69
|
+
}
|
|
70
|
+
for (const dimension of dedupeNames(block?.dimensionRefs).slice(0, maxPerKind)) {
|
|
71
|
+
steps.push({ kind: 'dimension', name: dimension, detail: 'Dimension used to slice the value.' });
|
|
72
|
+
}
|
|
73
|
+
// 5) dbt models / sources — the technical floor of the trust chain.
|
|
74
|
+
for (const model of business360.technicalSources.dbtModels.slice(0, maxPerKind)) {
|
|
75
|
+
steps.push({
|
|
76
|
+
kind: 'model',
|
|
77
|
+
name: model.name,
|
|
78
|
+
detail: 'dbt model the certified SQL builds on.',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const sourceAssets = uniqueByName([
|
|
82
|
+
...business360.technicalSources.dbtSources,
|
|
83
|
+
...business360.technicalSources.sourceTables,
|
|
84
|
+
]);
|
|
85
|
+
for (const source of sourceAssets.slice(0, maxPerKind)) {
|
|
86
|
+
steps.push({
|
|
87
|
+
kind: 'source',
|
|
88
|
+
name: source.name,
|
|
89
|
+
detail: 'Raw source table the data originates from.',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const caveats = dedupeNames(block?.caveats ?? metadataStringArray(focus.metadata, 'caveats'));
|
|
93
|
+
return {
|
|
94
|
+
value,
|
|
95
|
+
summary: buildSummary({ focus, blockOwner, reviewCadence, generated, sourceAssets }),
|
|
96
|
+
steps,
|
|
97
|
+
trustLabel: input.trustLabel ?? (generated ? 'review_required' : undefined),
|
|
98
|
+
// Explicit `freshness` input wins; otherwise derive a marker from the
|
|
99
|
+
// block's upstream data health, then fall back to any focus metadata.
|
|
100
|
+
freshness: input.freshness ??
|
|
101
|
+
freshnessFromDataState(block?.dataState, block?.dataStateDetail) ??
|
|
102
|
+
metadataString(focus.metadata, 'freshness'),
|
|
103
|
+
caveats: caveats.length > 0 ? caveats : undefined,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Render a derivation-walk freshness marker from a block's `dataState`. Returns
|
|
108
|
+
* `undefined` for `fresh`/`unknown`/missing so a healthy or un-instrumented
|
|
109
|
+
* block shows no freshness downgrade.
|
|
110
|
+
*/
|
|
111
|
+
function freshnessFromDataState(dataState, detail) {
|
|
112
|
+
switch (dataState) {
|
|
113
|
+
case 'failed':
|
|
114
|
+
return detail ? `upstream failed — ${detail}` : 'upstream failed';
|
|
115
|
+
case 'stale':
|
|
116
|
+
return detail ? `stale data — ${detail}` : 'stale data';
|
|
117
|
+
default:
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function blockDetail(input) {
|
|
122
|
+
const parts = [];
|
|
123
|
+
if (input.businessOutcome)
|
|
124
|
+
parts.push(input.businessOutcome);
|
|
125
|
+
else if (input.decisionUse)
|
|
126
|
+
parts.push(`Supports: ${input.decisionUse}.`);
|
|
127
|
+
if (input.reviewCadence)
|
|
128
|
+
parts.push(`Reviewed ${input.reviewCadence}.`);
|
|
129
|
+
return parts.length > 0 ? parts.join(' ') : undefined;
|
|
130
|
+
}
|
|
131
|
+
function buildSummary(input) {
|
|
132
|
+
const ownerPhrase = input.blockOwner ? ` owned by ${input.blockOwner}` : '';
|
|
133
|
+
const sourcePhrase = input.sourceAssets.length > 0
|
|
134
|
+
? ` It traces back to ${input.sourceAssets[0].name}.`
|
|
135
|
+
: '';
|
|
136
|
+
if (input.generated) {
|
|
137
|
+
return `This value was generated from ${input.focus.name}${ownerPhrase} and still needs analyst review before it can be certified.${sourcePhrase}`;
|
|
138
|
+
}
|
|
139
|
+
const cadencePhrase = input.reviewCadence ? `, reviewed ${input.reviewCadence}` : '';
|
|
140
|
+
return `This value comes from the certified ${input.focus.name}${ownerPhrase}${cadencePhrase}.${sourcePhrase}`;
|
|
141
|
+
}
|
|
142
|
+
function metadataString(metadata, key) {
|
|
143
|
+
const value = metadata?.[key];
|
|
144
|
+
return typeof value === 'string' && value.trim().length > 0 ? value : undefined;
|
|
145
|
+
}
|
|
146
|
+
function metadataStringArray(metadata, key) {
|
|
147
|
+
const value = metadata?.[key];
|
|
148
|
+
return Array.isArray(value)
|
|
149
|
+
? value.filter((item) => typeof item === 'string' && item.trim().length > 0)
|
|
150
|
+
: [];
|
|
151
|
+
}
|
|
152
|
+
function dedupeNames(values) {
|
|
153
|
+
if (!values)
|
|
154
|
+
return [];
|
|
155
|
+
const seen = new Set();
|
|
156
|
+
const out = [];
|
|
157
|
+
for (const value of values) {
|
|
158
|
+
const trimmed = typeof value === 'string' ? value.trim() : '';
|
|
159
|
+
if (!trimmed || seen.has(trimmed.toLowerCase()))
|
|
160
|
+
continue;
|
|
161
|
+
seen.add(trimmed.toLowerCase());
|
|
162
|
+
out.push(trimmed);
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
function uniqueByName(assets) {
|
|
167
|
+
const seen = new Set();
|
|
168
|
+
const out = [];
|
|
169
|
+
for (const asset of assets) {
|
|
170
|
+
if (seen.has(asset.id))
|
|
171
|
+
continue;
|
|
172
|
+
seen.add(asset.id);
|
|
173
|
+
out.push(asset);
|
|
174
|
+
}
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=derivation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivation.js","sourceRoot":"","sources":["../../src/lineage/derivation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Impact analysis + re-certification gating for DQL's answer layer.
|
|
3
|
+
*
|
|
4
|
+
* DQL composition is unbounded freeform `ref()`. The safety net: when a block
|
|
5
|
+
* changes, you must know what downstream *certified* work it invalidates.
|
|
6
|
+
*
|
|
7
|
+
* Given changed block name(s) — from `dql diff` or explicit input — this module:
|
|
8
|
+
* 1. walks the dependency DAG **downstream** to the full transitive set,
|
|
9
|
+
* 2. flags the cross-domain edges that get invalidated,
|
|
10
|
+
* 3. computes the resulting `domainTrust` delta,
|
|
11
|
+
* 4. produces a **required re-cert** list (certified downstream depending on
|
|
12
|
+
* a changed block's semantics).
|
|
13
|
+
*
|
|
14
|
+
* It also classifies whether a given block change is *semantic* (affects what
|
|
15
|
+
* the block computes) or purely cosmetic (description/owner/tag/viz only).
|
|
16
|
+
* The classification is **conservative**: when unsure, treat the change as
|
|
17
|
+
* semantic so re-cert is required rather than silently skipped.
|
|
18
|
+
*
|
|
19
|
+
* This is the LOCAL engine. It does not manage org-wide workflow, approvals,
|
|
20
|
+
* audit, or auto-re-certification — that is the cloud product.
|
|
21
|
+
*/
|
|
22
|
+
import type { LineageGraph } from './lineage-graph.js';
|
|
23
|
+
import type { DiffChange } from '../format/diff.js';
|
|
24
|
+
/** Reason a changed block was (or was not) classified as a semantic change. */
|
|
25
|
+
export type SemanticVerdict = 'semantic' | 'non-semantic';
|
|
26
|
+
export interface ChangedBlock {
|
|
27
|
+
/** Block name (matches `block:<name>` in the lineage graph). */
|
|
28
|
+
name: string;
|
|
29
|
+
/** Whether the change affects what the block computes. */
|
|
30
|
+
verdict: SemanticVerdict;
|
|
31
|
+
/** Field paths that changed (for block-changed diffs). */
|
|
32
|
+
changedFields: string[];
|
|
33
|
+
/** True when the block was added or removed (always semantic). */
|
|
34
|
+
structural: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Classify a single block-level `DiffChange` as semantic or non-semantic.
|
|
38
|
+
*
|
|
39
|
+
* - Added/removed blocks are always semantic (structural).
|
|
40
|
+
* - A changed block is non-semantic only when **every** changed field is in
|
|
41
|
+
* {@link NON_SEMANTIC_BLOCK_FIELDS}. A single unrecognized or semantic field
|
|
42
|
+
* makes the whole change semantic (conservative default).
|
|
43
|
+
*/
|
|
44
|
+
export declare function classifyBlockChange(change: DiffChange): ChangedBlock | null;
|
|
45
|
+
/**
|
|
46
|
+
* Extract the set of changed blocks from a diff report's changes, classifying
|
|
47
|
+
* each as semantic or non-semantic. Non-block changes (dashboards, workbooks,
|
|
48
|
+
* cells, notebooks) are ignored here — impact is keyed off block identity.
|
|
49
|
+
*/
|
|
50
|
+
export declare function changedBlocksFromDiff(changes: DiffChange[]): ChangedBlock[];
|
|
51
|
+
export interface ImpactedNode {
|
|
52
|
+
id: string;
|
|
53
|
+
type: string;
|
|
54
|
+
name: string;
|
|
55
|
+
domain?: string;
|
|
56
|
+
status?: string;
|
|
57
|
+
owner?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface CrossDomainImpact {
|
|
60
|
+
from: string;
|
|
61
|
+
to: string;
|
|
62
|
+
/** Invalidated boundary edges: source feeds a target in another domain. */
|
|
63
|
+
edges: Array<{
|
|
64
|
+
source: string;
|
|
65
|
+
target: string;
|
|
66
|
+
}>;
|
|
67
|
+
}
|
|
68
|
+
export interface DomainTrustDelta {
|
|
69
|
+
domain: string;
|
|
70
|
+
/** Certified count before vs. after re-cert demotions. */
|
|
71
|
+
certifiedBefore: number;
|
|
72
|
+
certifiedAfter: number;
|
|
73
|
+
total: number;
|
|
74
|
+
trustBefore: number;
|
|
75
|
+
trustAfter: number;
|
|
76
|
+
/** trustAfter - trustBefore (≤ 0). */
|
|
77
|
+
delta: number;
|
|
78
|
+
}
|
|
79
|
+
export interface RecertItem {
|
|
80
|
+
id: string;
|
|
81
|
+
name: string;
|
|
82
|
+
domain?: string;
|
|
83
|
+
owner?: string;
|
|
84
|
+
/** The changed block(s) whose semantics this artifact transitively depends on. */
|
|
85
|
+
invalidatedBy: string[];
|
|
86
|
+
}
|
|
87
|
+
export interface ImpactReport {
|
|
88
|
+
/** Changed blocks that were analyzed (semantic + non-semantic). */
|
|
89
|
+
changedBlocks: ChangedBlock[];
|
|
90
|
+
/** Changed blocks with a semantic verdict — only these propagate impact. */
|
|
91
|
+
semanticChanges: string[];
|
|
92
|
+
/** Full transitive downstream set across all semantic changes (excludes domain nodes). */
|
|
93
|
+
downstream: ImpactedNode[];
|
|
94
|
+
/** Cross-domain edges inside the invalidated zone, grouped by from→to. */
|
|
95
|
+
crossDomainImpacts: CrossDomainImpact[];
|
|
96
|
+
/** Certified artifacts that must be re-certified. */
|
|
97
|
+
requiresRecert: RecertItem[];
|
|
98
|
+
/** Per-domain trust delta caused by demoting the re-cert set. */
|
|
99
|
+
domainTrustDelta: DomainTrustDelta[];
|
|
100
|
+
/** True when certified downstream is invalidated and not already pending re-cert. */
|
|
101
|
+
hasCertifiedInvalidation: boolean;
|
|
102
|
+
}
|
|
103
|
+
export interface ComputeImpactOptions {
|
|
104
|
+
/**
|
|
105
|
+
* When true (default), a re-cert is only required for downstream nodes still
|
|
106
|
+
* marked `certified`. Nodes already `pending_recertification` are reported in
|
|
107
|
+
* the downstream set but do not, on their own, trip the gate — they are
|
|
108
|
+
* already flagged. Set false to also count `pending_recertification`.
|
|
109
|
+
*/
|
|
110
|
+
ignoreAlreadyPending?: boolean;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Compute the impact of a set of changed blocks against a lineage graph.
|
|
114
|
+
*
|
|
115
|
+
* Only blocks with a **semantic** verdict propagate downstream impact; a purely
|
|
116
|
+
* cosmetic change (description/owner/tag only) produces an empty downstream set
|
|
117
|
+
* and never trips the re-cert gate.
|
|
118
|
+
*/
|
|
119
|
+
export declare function computeImpact(graph: LineageGraph, changedBlocks: ChangedBlock[], options?: ComputeImpactOptions): ImpactReport;
|
|
120
|
+
/**
|
|
121
|
+
* One-shot helper: classify a diff's block changes and compute the impact
|
|
122
|
+
* report in a single call.
|
|
123
|
+
*/
|
|
124
|
+
export declare function computeImpactFromDiff(graph: LineageGraph, changes: DiffChange[], options?: ComputeImpactOptions): ImpactReport;
|
|
125
|
+
/** Render an impact report as human-readable text for the CLI. */
|
|
126
|
+
export declare function renderImpactText(report: ImpactReport): string;
|
|
127
|
+
//# sourceMappingURL=impact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../../src/lineage/impact.ts"],"names":[],"mappings":"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"}
|