dsh-data-quality 0.1.3 → 0.2.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/CHANGELOG.md +26 -0
- package/README.es.md +7 -1
- package/README.hi.md +7 -1
- package/README.md +22 -9
- package/README.pt.md +7 -1
- package/README.zh.md +7 -1
- package/cordis.patch.yml +11 -0
- package/lib/index.js +1405 -140
- package/lib/types/config.d.ts +12 -0
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/config.js +35 -0
- package/lib/types/config.js.map +1 -1
- package/lib/types/contract.d.ts +83 -0
- package/lib/types/contract.d.ts.map +1 -0
- package/lib/types/contract.js +144 -0
- package/lib/types/contract.js.map +1 -0
- package/lib/types/dataset.d.ts +50 -3
- package/lib/types/dataset.d.ts.map +1 -1
- package/lib/types/dataset.js +76 -21
- package/lib/types/dataset.js.map +1 -1
- package/lib/types/events.d.ts +2 -0
- package/lib/types/events.d.ts.map +1 -1
- package/lib/types/events.js.map +1 -1
- package/lib/types/index.d.ts +11 -8
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +15 -6
- package/lib/types/index.js.map +1 -1
- package/lib/types/presets.d.ts +28 -0
- package/lib/types/presets.d.ts.map +1 -0
- package/lib/types/presets.js +134 -0
- package/lib/types/presets.js.map +1 -0
- package/lib/types/profile.d.ts +38 -1
- package/lib/types/profile.d.ts.map +1 -1
- package/lib/types/profile.js +64 -10
- package/lib/types/profile.js.map +1 -1
- package/lib/types/provider-local.d.ts +7 -1
- package/lib/types/provider-local.d.ts.map +1 -1
- package/lib/types/provider-local.js +72 -2
- package/lib/types/provider-local.js.map +1 -1
- package/lib/types/scorecard.d.ts +50 -0
- package/lib/types/scorecard.d.ts.map +1 -0
- package/lib/types/scorecard.js +186 -0
- package/lib/types/scorecard.js.map +1 -0
- package/lib/types/service.d.ts +32 -2
- package/lib/types/service.d.ts.map +1 -1
- package/lib/types/service.js.map +1 -1
- package/lib/types/store.d.ts +21 -1
- package/lib/types/store.d.ts.map +1 -1
- package/lib/types/store.js +13 -1
- package/lib/types/store.js.map +1 -1
- package/lib/types/tools/clean.d.ts.map +1 -1
- package/lib/types/tools/clean.js +76 -1
- package/lib/types/tools/clean.js.map +1 -1
- package/lib/types/tools/profile-report-schema.d.ts +315 -0
- package/lib/types/tools/profile-report-schema.d.ts.map +1 -0
- package/lib/types/tools/profile-report-schema.js +95 -0
- package/lib/types/tools/profile-report-schema.js.map +1 -0
- package/lib/types/tools/profile.d.ts.map +1 -1
- package/lib/types/tools/profile.js +6 -53
- package/lib/types/tools/profile.js.map +1 -1
- package/lib/types/tools/report.d.ts +14 -0
- package/lib/types/tools/report.d.ts.map +1 -0
- package/lib/types/tools/report.js +86 -0
- package/lib/types/tools/report.js.map +1 -0
- package/lib/types/tools/shared.d.ts.map +1 -1
- package/lib/types/tools/shared.js +22 -2
- package/lib/types/tools/shared.js.map +1 -1
- package/lib/types/tools/verify.d.ts.map +1 -1
- package/lib/types/tools/verify.js +36 -1
- package/lib/types/tools/verify.js.map +1 -1
- package/lib/types/verify.d.ts +49 -3
- package/lib/types/verify.d.ts.map +1 -1
- package/lib/types/verify.js +111 -4
- package/lib/types/verify.js.map +1 -1
- package/lib/types/version.d.ts +1 -1
- package/lib/types/version.js +1 -1
- package/package.json +1 -1
- package/src/config.ts +52 -0
- package/src/contract.ts +190 -0
- package/src/dataset.ts +101 -21
- package/src/events.ts +2 -0
- package/src/index.ts +25 -8
- package/src/presets.ts +146 -0
- package/src/profile.ts +101 -11
- package/src/provider-local.ts +77 -3
- package/src/scorecard.ts +244 -0
- package/src/service.ts +34 -2
- package/src/store.ts +28 -2
- package/src/tools/clean.ts +76 -1
- package/src/tools/profile-report-schema.ts +97 -0
- package/src/tools/profile.ts +8 -56
- package/src/tools/report.ts +108 -0
- package/src/tools/shared.ts +21 -2
- package/src/tools/verify.ts +40 -2
- package/src/verify.ts +151 -5
- package/src/version.ts +1 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared JSON-Schema spec for the profile report's canonical value, reused by
|
|
3
|
+
* `data_profile` (its output) and `data_clean` (the `diffPreview` before/after
|
|
4
|
+
* snapshots). One source of truth so the two tools never drift.
|
|
5
|
+
* @module dsh-data-quality/tools-profile-report-schema
|
|
6
|
+
*/
|
|
7
|
+
const SCORECARD_DIMENSION_NAMES = ['completeness', 'uniqueness', 'validity', 'consistency', 'timeliness', 'accuracy'];
|
|
8
|
+
/** One column card's schema. */
|
|
9
|
+
export const COLUMN_PROFILE_SCHEMA = {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
name: { type: 'string', required: true },
|
|
13
|
+
inferredType: { type: 'string', enum: ['number', 'date', 'boolean', 'string', 'empty', 'mixed'], required: true },
|
|
14
|
+
missing: { type: 'number', required: true },
|
|
15
|
+
missingRate: { type: 'number', required: true },
|
|
16
|
+
unique: { type: 'number', required: true },
|
|
17
|
+
numeric: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
count: { type: 'number', required: true },
|
|
21
|
+
distinct: { type: 'number', required: true },
|
|
22
|
+
min: { type: 'number', required: true },
|
|
23
|
+
max: { type: 'number', required: true },
|
|
24
|
+
mean: { type: 'number', required: true },
|
|
25
|
+
median: { type: 'number', required: true },
|
|
26
|
+
p25: { type: 'number', required: true },
|
|
27
|
+
p75: { type: 'number', required: true },
|
|
28
|
+
outliers: { type: 'number', required: true },
|
|
29
|
+
},
|
|
30
|
+
additionalProperties: false,
|
|
31
|
+
},
|
|
32
|
+
topValues: {
|
|
33
|
+
type: 'array',
|
|
34
|
+
items: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
value: { type: 'string', required: true },
|
|
38
|
+
count: { type: 'number', required: true },
|
|
39
|
+
},
|
|
40
|
+
additionalProperties: false,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
notes: { type: 'array', items: { type: 'string' }, required: true },
|
|
44
|
+
},
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
};
|
|
47
|
+
/** The full profile report's schema. */
|
|
48
|
+
export const PROFILE_REPORT_SCHEMA = {
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties: {
|
|
51
|
+
dataset: { type: 'string', required: true },
|
|
52
|
+
rowCount: { type: 'number', required: true },
|
|
53
|
+
sampled: { type: 'boolean', required: true },
|
|
54
|
+
profiledRows: { type: 'number', required: true },
|
|
55
|
+
columnCount: { type: 'number', required: true },
|
|
56
|
+
duplicateRows: { type: 'number', required: true },
|
|
57
|
+
duplicateRate: { type: 'number', required: true },
|
|
58
|
+
duplicateSampleRowIndexes: { type: 'array', items: { type: 'number' }, required: true },
|
|
59
|
+
scorecard: {
|
|
60
|
+
type: 'object',
|
|
61
|
+
properties: {
|
|
62
|
+
overall: { oneOf: [{ type: 'number' }, { type: 'null' }], required: true },
|
|
63
|
+
weightedOverall: { oneOf: [{ type: 'number' }, { type: 'null' }], required: true },
|
|
64
|
+
dimensions: {
|
|
65
|
+
type: 'array',
|
|
66
|
+
items: {
|
|
67
|
+
type: 'object',
|
|
68
|
+
properties: {
|
|
69
|
+
name: { type: 'string', enum: [...SCORECARD_DIMENSION_NAMES], required: true },
|
|
70
|
+
score: { oneOf: [{ type: 'number' }, { type: 'null' }], required: true },
|
|
71
|
+
note: { type: 'string', required: true },
|
|
72
|
+
},
|
|
73
|
+
additionalProperties: false,
|
|
74
|
+
},
|
|
75
|
+
required: true,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
additionalProperties: false,
|
|
79
|
+
required: true,
|
|
80
|
+
},
|
|
81
|
+
encoding: {
|
|
82
|
+
type: 'object',
|
|
83
|
+
properties: {
|
|
84
|
+
bom: { oneOf: [{ type: 'string' }, { type: 'null' }], required: true },
|
|
85
|
+
validUtf8: { type: 'boolean', required: true },
|
|
86
|
+
},
|
|
87
|
+
additionalProperties: false,
|
|
88
|
+
},
|
|
89
|
+
generatedAt: { type: 'number', required: true },
|
|
90
|
+
reportKey: { type: 'string' },
|
|
91
|
+
columns: { type: 'array', items: COLUMN_PROFILE_SCHEMA, required: true },
|
|
92
|
+
},
|
|
93
|
+
additionalProperties: false,
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=profile-report-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-report-schema.js","sourceRoot":"","sources":["../../../src/tools/profile-report-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/tools/profile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/tools/profile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAKvD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,mDA4B5D"}
|
|
@@ -5,43 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
7
7
|
import { renderProfileText } from "../profile.js";
|
|
8
|
+
import { PROFILE_REPORT_SCHEMA } from "./profile-report-schema.js";
|
|
8
9
|
import { workspaceOf } from "./shared.js";
|
|
9
|
-
const COLUMN_PROFILE_SCHEMA = {
|
|
10
|
-
type: 'object',
|
|
11
|
-
properties: {
|
|
12
|
-
name: { type: 'string', required: true },
|
|
13
|
-
inferredType: { type: 'string', enum: ['number', 'date', 'boolean', 'string', 'empty', 'mixed'], required: true },
|
|
14
|
-
missing: { type: 'number', required: true },
|
|
15
|
-
missingRate: { type: 'number', required: true },
|
|
16
|
-
unique: { type: 'number', required: true },
|
|
17
|
-
numeric: {
|
|
18
|
-
type: 'object',
|
|
19
|
-
properties: {
|
|
20
|
-
min: { type: 'number', required: true },
|
|
21
|
-
max: { type: 'number', required: true },
|
|
22
|
-
mean: { type: 'number', required: true },
|
|
23
|
-
median: { type: 'number', required: true },
|
|
24
|
-
p25: { type: 'number', required: true },
|
|
25
|
-
p75: { type: 'number', required: true },
|
|
26
|
-
outliers: { type: 'number', required: true },
|
|
27
|
-
},
|
|
28
|
-
additionalProperties: false,
|
|
29
|
-
},
|
|
30
|
-
topValues: {
|
|
31
|
-
type: 'array',
|
|
32
|
-
items: {
|
|
33
|
-
type: 'object',
|
|
34
|
-
properties: {
|
|
35
|
-
value: { type: 'string', required: true },
|
|
36
|
-
count: { type: 'number', required: true },
|
|
37
|
-
},
|
|
38
|
-
additionalProperties: false,
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
notes: { type: 'array', items: { type: 'string' }, required: true },
|
|
42
|
-
},
|
|
43
|
-
additionalProperties: false,
|
|
44
|
-
};
|
|
45
10
|
/**
|
|
46
11
|
* Build the `data_profile` tool definition against a mounted service.
|
|
47
12
|
* @param service - the mounted ctx.dataQuality implementation.
|
|
@@ -52,35 +17,23 @@ export function defineProfileTool(service) {
|
|
|
52
17
|
name: 'data_profile',
|
|
53
18
|
description: [
|
|
54
19
|
'Profile a workspace CSV/TSV/JSON/JSONL dataset with deterministic TypeScript computation (no mental math).',
|
|
55
|
-
'Returns row/column counts, inferred column types, missing rates, unique counts, numeric distributions (min/max/mean/median/p25/p75), IQR outlier counts, mixed-type suspicion notes,
|
|
56
|
-
'Column cards cover every row by default; pass sample for a deterministic systematic sample on large files. Datasets above the configured row/size caps are rejected — use sample or raise the caps. The full report persists to the data_quality storage domain (reportKey in the result).',
|
|
20
|
+
'Returns row/column counts, inferred column types, missing rates, unique counts, numeric distributions (count/distinct/min/max/mean/median/p25/p75), IQR outlier counts, mixed-type suspicion notes, sha256 duplicate-row detection (rate + sample indexes), file encoding (BOM/UTF-8 validity), and a weighted DAMA six-dimension scorecard.',
|
|
21
|
+
'Pass industryPreset (retail/saas/fund/real-estate/e-commerce/healthcare/logistics/manufacturing/energy) to compare the dataset against that industry\'s expected columns, making the scorecard accuracy dimension determinable. Column cards cover every row by default; pass sample for a deterministic systematic sample on large files. Datasets above the configured row/size caps are rejected — use sample or raise the caps. The full report persists to the data_quality storage domain (reportKey in the result).',
|
|
57
22
|
].join('\n'),
|
|
58
23
|
parameters: {
|
|
59
24
|
path: { type: 'string', required: true, description: 'Workspace-relative dataset path (.csv/.tsv/.json/.jsonl). JSON datasets must be an array of flat objects.' },
|
|
60
25
|
sample: { type: 'number', description: 'Optional systematic sample size (every ceil(N/sample)-th row) for the column cards; row counts stay exact.' },
|
|
26
|
+
industryPreset: { type: 'string', enum: ['retail', 'saas', 'fund', 'real-estate', 'e-commerce', 'healthcare', 'logistics', 'manufacturing', 'energy'], description: 'Optional industry preset id; its expected columns feed the scorecard accuracy dimension.' },
|
|
61
27
|
},
|
|
62
28
|
output: {
|
|
63
|
-
schema:
|
|
64
|
-
type: 'object',
|
|
65
|
-
properties: {
|
|
66
|
-
dataset: { type: 'string', required: true },
|
|
67
|
-
rowCount: { type: 'number', required: true },
|
|
68
|
-
sampled: { type: 'boolean', required: true },
|
|
69
|
-
profiledRows: { type: 'number', required: true },
|
|
70
|
-
columnCount: { type: 'number', required: true },
|
|
71
|
-
duplicateRows: { type: 'number', required: true },
|
|
72
|
-
generatedAt: { type: 'number', required: true },
|
|
73
|
-
reportKey: { type: 'string' },
|
|
74
|
-
columns: { type: 'array', items: COLUMN_PROFILE_SCHEMA, required: true },
|
|
75
|
-
},
|
|
76
|
-
additionalProperties: false,
|
|
77
|
-
},
|
|
29
|
+
schema: PROFILE_REPORT_SCHEMA,
|
|
78
30
|
render: (_args, value) => [{ type: 'text', text: renderProfileText(value) }],
|
|
79
31
|
},
|
|
80
32
|
async execute(args, exec) {
|
|
81
33
|
return service.profileDataset({
|
|
82
34
|
dataset: args.path,
|
|
83
35
|
sample: args.sample,
|
|
36
|
+
...(args.industryPreset !== undefined ? { industryPreset: args.industryPreset } : {}),
|
|
84
37
|
workspace: workspaceOf(exec),
|
|
85
38
|
session: exec.agent?.session,
|
|
86
39
|
signal: exec.signal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/tools/profile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEnD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/tools/profile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEnD,OAAO,EAAE,iBAAiB,EAAsB,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC3D,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE;YACX,4GAA4G;YAC5G,8UAA8U;YAC9U,4fAA4f;SAC7f,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,2GAA2G,EAAE;YAClK,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4GAA4G,EAAE;YACrJ,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,0FAA0F,EAAE;SACjQ;QACD,MAAM,EAAE;YACN,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,KAAiC,CAAC,EAAE,CAAC;SACzG;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI;YACtB,OAAO,OAAO,CAAC,cAAc,CAAC;gBAC5B,OAAO,EAAE,IAAI,CAAC,IAAI;gBAClB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrF,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;gBAC5B,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;gBAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `data_report` model tool: read persisted profile/clean-diff reports
|
|
3
|
+
* back from the `data_quality` storage domain, by exact `reportKey` or by
|
|
4
|
+
* `kind`. Deterministic read-only consumption — no model arithmetic.
|
|
5
|
+
* @module dsh-data-quality/tools/report
|
|
6
|
+
*/
|
|
7
|
+
import type { DataQualityService } from '../service.js';
|
|
8
|
+
/**
|
|
9
|
+
* Build the `data_report` tool definition against a mounted service.
|
|
10
|
+
* @param service - the mounted ctx.dataQuality implementation.
|
|
11
|
+
* @returns the tool definition to register.
|
|
12
|
+
*/
|
|
13
|
+
export declare function defineReportTool(service: DataQualityService): import("@deepseek-ai/dsh-tools").ToolDefinition;
|
|
14
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/tools/report.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAyCvD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,mDAoD3D"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `data_report` model tool: read persisted profile/clean-diff reports
|
|
3
|
+
* back from the `data_quality` storage domain, by exact `reportKey` or by
|
|
4
|
+
* `kind`. Deterministic read-only consumption — no model arithmetic.
|
|
5
|
+
* @module dsh-data-quality/tools/report
|
|
6
|
+
*/
|
|
7
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
8
|
+
/** The report kinds a caller may query. */
|
|
9
|
+
const REPORT_KINDS = ['profile', 'clean', 'clean-diff', 'verify', 'citations'];
|
|
10
|
+
/** Project a stored report into the canonical value (the stored report is already lossless JSON). */
|
|
11
|
+
function toView(record) {
|
|
12
|
+
return { key: record.key, kind: record.kind, at: record.at, dataset: record.dataset, report: record.report };
|
|
13
|
+
}
|
|
14
|
+
/** Human-readable report summary for the tool's Native render. */
|
|
15
|
+
function renderReportText(value) {
|
|
16
|
+
const lines = [];
|
|
17
|
+
if (value.key !== undefined) {
|
|
18
|
+
lines.push(value.records.length === 0 ? `No report for ${value.key}` : `Report ${value.key}`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
lines.push(`Reports of kind ${value.kind ?? ''} (${value.records.length})`);
|
|
22
|
+
}
|
|
23
|
+
for (const record of value.records) {
|
|
24
|
+
lines.push(`- ${record.key} [${record.kind}] ${record.dataset} @ ${new Date(record.at).toISOString()}`);
|
|
25
|
+
}
|
|
26
|
+
return lines.join('\n');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Build the `data_report` tool definition against a mounted service.
|
|
30
|
+
* @param service - the mounted ctx.dataQuality implementation.
|
|
31
|
+
* @returns the tool definition to register.
|
|
32
|
+
*/
|
|
33
|
+
export function defineReportTool(service) {
|
|
34
|
+
return defineTool({
|
|
35
|
+
name: 'data_report',
|
|
36
|
+
description: [
|
|
37
|
+
'Read persisted data-quality reports back from the data_quality storage domain (deterministic, read-only).',
|
|
38
|
+
'Pass key (the exact reportKey a prior run returned) to fetch one report, or kind to list every persisted report of that kind, ordered chronologically. Exactly one of key/kind.',
|
|
39
|
+
'Returns the report envelope(s): kind, dataset, timestamp, and the full stored report (profile/clean/clean-diff/verify/citations). Missing keys and unknown kinds fail loudly.',
|
|
40
|
+
].join('\n'),
|
|
41
|
+
parameters: {
|
|
42
|
+
key: { type: 'string', description: 'Exact storage reportKey (e.g. 20260819000000000-profile-1a2b3c4d); fetches that one report.' },
|
|
43
|
+
kind: { type: 'string', enum: [...REPORT_KINDS], description: 'Report kind to list (profile/clean/clean-diff/verify/citations).' },
|
|
44
|
+
},
|
|
45
|
+
output: {
|
|
46
|
+
schema: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
key: { type: 'string' },
|
|
50
|
+
kind: { type: 'string', enum: [...REPORT_KINDS] },
|
|
51
|
+
records: {
|
|
52
|
+
type: 'array',
|
|
53
|
+
items: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
key: { type: 'string', required: true },
|
|
57
|
+
kind: { type: 'string', enum: [...REPORT_KINDS], required: true },
|
|
58
|
+
at: { type: 'number', required: true },
|
|
59
|
+
dataset: { type: 'string', required: true },
|
|
60
|
+
report: { type: 'json', required: true },
|
|
61
|
+
},
|
|
62
|
+
additionalProperties: false,
|
|
63
|
+
},
|
|
64
|
+
required: true,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
additionalProperties: false,
|
|
68
|
+
},
|
|
69
|
+
render: (_args, value) => [{ type: 'text', text: renderReportText(value) }],
|
|
70
|
+
},
|
|
71
|
+
async execute(args, _exec) {
|
|
72
|
+
const hasKey = args.key !== undefined;
|
|
73
|
+
const hasKind = args.kind !== undefined;
|
|
74
|
+
if (hasKey === hasKind) {
|
|
75
|
+
throw new Error('data_report needs exactly one of key/kind');
|
|
76
|
+
}
|
|
77
|
+
if (hasKey) {
|
|
78
|
+
const record = await service.getReport(args.key);
|
|
79
|
+
return { key: args.key, records: [toView(record)] };
|
|
80
|
+
}
|
|
81
|
+
const records = await service.listReports(args.kind);
|
|
82
|
+
return { kind: args.kind, records: records.map(toView) };
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/tools/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAMvD;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAMvD;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAsC9D"}
|
|
@@ -22,11 +22,31 @@ export function workspaceOf(exec) {
|
|
|
22
22
|
/** Human-readable cleaning summary for the tool's Native render. */
|
|
23
23
|
export function renderCleanText(report) {
|
|
24
24
|
const lines = [];
|
|
25
|
-
|
|
25
|
+
const mode = report.dryRun ? 'Dry-run plan for' : 'Cleaned';
|
|
26
|
+
lines.push(`${mode} ${report.dataset}: ${report.inputRows} -> ${report.outputRows} rows over ${report.logs.length} rule(s)`);
|
|
26
27
|
for (const log of report.logs) {
|
|
27
28
|
lines.push(`- rule ${log.ruleIndex} (${log.rule}): ${log.affectedRows} row(s) affected; ${log.detail}`);
|
|
28
29
|
}
|
|
29
|
-
|
|
30
|
+
const contract = report.contract;
|
|
31
|
+
const keyLabel = contract.dedupeColumns === null ? 'full rows' : `[${contract.dedupeColumns.join(', ')}]`;
|
|
32
|
+
lines.push(`Contract: ${contract.inputRows} -> ${contract.outputRows} rows (${contract.removedRows} removed); uniqueness ${contract.uniqueKeys ? 'OK' : 'VIOLATED'} over ${keyLabel}${contract.remainingDuplicateRows > 0 ? ` (${contract.remainingDuplicateRows} duplicate row(s) remain)` : ''}`);
|
|
33
|
+
for (const entry of contract.remainingMissing) {
|
|
34
|
+
lines.push(`- non-null regression: ${entry.column} still has ${entry.count} missing cell(s)`);
|
|
35
|
+
}
|
|
36
|
+
for (const entry of contract.typeConformance) {
|
|
37
|
+
lines.push(`- type regression: ${entry.column} (${entry.to}) has ${entry.invalidCount} non-conforming cell(s)`);
|
|
38
|
+
}
|
|
39
|
+
for (const entry of contract.columnDecisions) {
|
|
40
|
+
const decisions = entry.decisions.map((decision) => `${decision.strategy} (${decision.affectedRows} row(s))`).join(', ');
|
|
41
|
+
lines.push(`- column ${entry.column}: ${decisions}`);
|
|
42
|
+
}
|
|
43
|
+
if (report.diffPreview !== undefined) {
|
|
44
|
+
lines.push(`Diff preview: ${report.diffPreview.before.rowCount} -> ${report.diffPreview.after.rowCount} rows; duplicates ${report.diffPreview.before.duplicateRows} -> ${report.diffPreview.after.duplicateRows}`);
|
|
45
|
+
}
|
|
46
|
+
if (report.dryRun) {
|
|
47
|
+
lines.push('Dry run: no output file written and no report persisted; plan/preview above.');
|
|
48
|
+
}
|
|
49
|
+
else if (report.outputPath !== undefined) {
|
|
30
50
|
lines.push(`Wrote cleaned dataset to ${report.outputPath}`);
|
|
31
51
|
}
|
|
32
52
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,IAAmB;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAA;IAC1C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/tools/verify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/tools/verify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAiC,MAAM,eAAe,CAAA;AAwHtF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,mDAmE3D"}
|
|
@@ -7,6 +7,37 @@
|
|
|
7
7
|
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
8
8
|
import { renderVerifyText } from "../verify.js";
|
|
9
9
|
import { workspaceOf } from "./shared.js";
|
|
10
|
+
const EXPECTATION_METRICS = ['rowCount', 'columnSum', 'columnMean', 'uniqueCount', 'nullCount'];
|
|
11
|
+
const EXPECTATION_SCHEMA = {
|
|
12
|
+
type: 'array',
|
|
13
|
+
items: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
metric: { type: 'string', enum: [...EXPECTATION_METRICS], required: true, description: 'Metric to reconcile: rowCount/columnSum/columnMean/uniqueCount/nullCount.' },
|
|
17
|
+
column: { type: 'string', description: 'Required for every metric except rowCount.' },
|
|
18
|
+
expected: { type: 'number', required: true, description: 'The expected value to reconcile against.' },
|
|
19
|
+
tolerance: { type: 'number', description: 'Optional relative tolerance in [0, 1]; defaults to defaultTolerance.' },
|
|
20
|
+
},
|
|
21
|
+
additionalProperties: false,
|
|
22
|
+
description: 'Reconcile a deterministic computed metric against an expected value with relative tolerance.',
|
|
23
|
+
},
|
|
24
|
+
description: 'Optional metric expectations; each yields passed true or passed false with actual/expected/tolerance detail.',
|
|
25
|
+
};
|
|
26
|
+
const EXPECTATION_RESULT_SCHEMA = {
|
|
27
|
+
type: 'array',
|
|
28
|
+
items: {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {
|
|
31
|
+
metric: { type: 'string', enum: [...EXPECTATION_METRICS], required: true },
|
|
32
|
+
column: { type: 'string' },
|
|
33
|
+
expected: { type: 'number', required: true },
|
|
34
|
+
actual: { type: 'number', required: true },
|
|
35
|
+
tolerance: { type: 'number', required: true },
|
|
36
|
+
passed: { type: 'boolean', required: true },
|
|
37
|
+
},
|
|
38
|
+
additionalProperties: false,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
10
41
|
const VERIFY_RULE_SCHEMA = {
|
|
11
42
|
type: 'array',
|
|
12
43
|
items: {
|
|
@@ -99,11 +130,13 @@ export function defineVerifyTool(service) {
|
|
|
99
130
|
description: [
|
|
100
131
|
'Verify a workspace CSV/TSV/JSON/JSONL dataset against declarative quality rules with deterministic TypeScript computation (no mental math).',
|
|
101
132
|
'Rules: not-null, unique (column group), range (numeric bounds), regex, enum, cross-column (e.g. startDate < endDate), freshness (date column within N days of asOf). A missing cell fails every rule that reads it.',
|
|
102
|
-
'
|
|
133
|
+
'Optional expectations reconcile deterministic metrics (rowCount/columnSum/columnMean/uniqueCount/nullCount) against expected values with relative tolerance; a mismatch is a normal passed: false with actual/expected/tolerance detail, never a tool error.',
|
|
134
|
+
'Returns per-rule pass/fail with capped failing-row evidence plus the expectation outcomes. Overall failure is a NORMAL result with passed: false — not a tool error. The full report persists to the data_quality storage domain (reportKey).',
|
|
103
135
|
].join('\n'),
|
|
104
136
|
parameters: {
|
|
105
137
|
path: { type: 'string', required: true, description: 'Workspace-relative dataset path (.csv/.tsv/.json/.jsonl).' },
|
|
106
138
|
rules: { ...VERIFY_RULE_SCHEMA, required: true },
|
|
139
|
+
expectations: { ...EXPECTATION_SCHEMA, description: 'Optional metric expectations to reconcile (rowCount/columnSum/columnMean/uniqueCount/nullCount).' },
|
|
107
140
|
},
|
|
108
141
|
output: {
|
|
109
142
|
schema: {
|
|
@@ -141,6 +174,7 @@ export function defineVerifyTool(service) {
|
|
|
141
174
|
},
|
|
142
175
|
required: true,
|
|
143
176
|
},
|
|
177
|
+
expectations: { ...EXPECTATION_RESULT_SCHEMA, required: true },
|
|
144
178
|
},
|
|
145
179
|
additionalProperties: false,
|
|
146
180
|
},
|
|
@@ -150,6 +184,7 @@ export function defineVerifyTool(service) {
|
|
|
150
184
|
return service.verifyDataset({
|
|
151
185
|
dataset: args.path,
|
|
152
186
|
rules: args.rules,
|
|
187
|
+
...(args.expectations !== undefined ? { expectations: args.expectations } : {}),
|
|
153
188
|
workspace: workspaceOf(exec),
|
|
154
189
|
session: exec.agent?.session,
|
|
155
190
|
signal: exec.signal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/tools/verify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEnD,OAAO,EAAE,gBAAgB,EAAqB,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,kBAAkB,GAAG;IACzB,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACL,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC3D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;iBAC3C;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,WAAW,EAAE,gEAAgE;aAC9E;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;oBACzD,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iDAAiD,EAAE;iBACtI;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,WAAW,EAAE,gEAAgE;aAC9E;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;oBACxD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC1C,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACvB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBACxB;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,WAAW,EAAE,2HAA2H;aACzI;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;oBACxD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC1C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC3C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;iBAC7E;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,WAAW,EAAE,8FAA8F;aAC5G;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;oBACvD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;iBACrE;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,WAAW,EAAE,yEAAyE;aACvF;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE;oBAC1E,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAChF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;oBAC/E,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE;iBACxI;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,WAAW,EAAE,mJAAmJ;aACjK;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC5D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wDAAwD,EAAE;oBACjH,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gEAAgE,EAAE;oBAC7H,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;iBACvF;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,WAAW,EAAE,0FAA0F;aACxG;SACF;KACF;IACD,WAAW,EAAE,oEAAoE;CACzE,CAAA;AAEV;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC1D,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE;YACX,6IAA6I;YAC7I,qNAAqN;YACrN,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/tools/verify.ts"],"names":[],"mappings":"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"}
|
package/lib/types/verify.d.ts
CHANGED
|
@@ -50,6 +50,36 @@ export declare class VerifyRuleError extends Error {
|
|
|
50
50
|
*/
|
|
51
51
|
constructor(ruleIndex: number, message: string);
|
|
52
52
|
}
|
|
53
|
+
/** The metrics a verification expectation can reconcile. */
|
|
54
|
+
export type VerifyMetric = 'rowCount' | 'columnSum' | 'columnMean' | 'uniqueCount' | 'nullCount';
|
|
55
|
+
/** One metric expectation: an expected value plus an optional relative tolerance. */
|
|
56
|
+
export interface VerifyExpectation {
|
|
57
|
+
readonly metric: VerifyMetric;
|
|
58
|
+
/** Required for every metric except `rowCount`. */
|
|
59
|
+
readonly column?: string;
|
|
60
|
+
readonly expected: number;
|
|
61
|
+
/** Optional relative tolerance in [0, 1]; falls back to the configured `defaultTolerance`. */
|
|
62
|
+
readonly tolerance?: number;
|
|
63
|
+
}
|
|
64
|
+
/** One expectation's reconciliation outcome. */
|
|
65
|
+
export interface VerifyExpectationResult {
|
|
66
|
+
readonly metric: VerifyMetric;
|
|
67
|
+
/** Absent for `rowCount`. */
|
|
68
|
+
readonly column?: string;
|
|
69
|
+
readonly expected: number;
|
|
70
|
+
readonly actual: number;
|
|
71
|
+
readonly tolerance: number;
|
|
72
|
+
readonly passed: boolean;
|
|
73
|
+
}
|
|
74
|
+
/** Raised for invalid expectations; `message` names the expectation index and reason. */
|
|
75
|
+
export declare class VerifyExpectationError extends Error {
|
|
76
|
+
readonly expectationIndex: number;
|
|
77
|
+
/**
|
|
78
|
+
* @param expectationIndex - index of the offending expectation in the request array.
|
|
79
|
+
* @param message - actionable human-readable detail.
|
|
80
|
+
*/
|
|
81
|
+
constructor(expectationIndex: number, message: string);
|
|
82
|
+
}
|
|
53
83
|
/** One failing row's evidence (capped per rule by `evidenceRowLimit`). */
|
|
54
84
|
export interface VerifyEvidenceRow {
|
|
55
85
|
/** 0-based data row index. */
|
|
@@ -75,24 +105,40 @@ export interface VerifyReport {
|
|
|
75
105
|
readonly passed: boolean;
|
|
76
106
|
readonly rowCount: number;
|
|
77
107
|
readonly rules: VerifyRuleResult[];
|
|
108
|
+
/** Metric-reconciliation outcomes (empty when no expectations were given). */
|
|
109
|
+
readonly expectations: VerifyExpectationResult[];
|
|
78
110
|
/** Storage-domain key of the persisted report, when persistence is on (set by the provider). */
|
|
79
111
|
readonly reportKey?: string;
|
|
80
112
|
/** Injected generation timestamp (epoch ms). */
|
|
81
113
|
readonly generatedAt: number;
|
|
82
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Reconcile each expectation against its deterministic actual value. A
|
|
117
|
+
* mismatch is a normal `passed: false` result, never a thrown error; invalid
|
|
118
|
+
* metrics, columns, and tolerances fail loud.
|
|
119
|
+
* @param table - the parsed dataset.
|
|
120
|
+
* @param expectations - the expectations to reconcile.
|
|
121
|
+
* @param defaultTolerance - configured fallback relative tolerance.
|
|
122
|
+
* @param signal - optional abort signal.
|
|
123
|
+
* @returns one outcome per expectation.
|
|
124
|
+
*/
|
|
125
|
+
export declare function verifyExpectations(table: Table, expectations: readonly VerifyExpectation[], defaultTolerance: number, signal?: AbortSignal): VerifyExpectationResult[];
|
|
83
126
|
/**
|
|
84
127
|
* Apply verification rules over a parsed table. A missing cell fails every
|
|
85
|
-
* rule that reads it. The overall `passed` is the conjunction of rule passes
|
|
86
|
-
* a failing dataset is a normal result, never a
|
|
128
|
+
* rule that reads it. The overall `passed` is the conjunction of rule passes
|
|
129
|
+
* and expectation passes; a failing dataset is a normal result, never a
|
|
130
|
+
* thrown error.
|
|
87
131
|
* @param table - the parsed dataset.
|
|
88
132
|
* @param rules - non-empty rule list.
|
|
89
|
-
* @param options - evidence cap, injected clock for `freshness`, abort signal.
|
|
133
|
+
* @param options - evidence cap, injected clock for `freshness`, optional expectations, default tolerance, abort signal.
|
|
90
134
|
* @returns the verify report (without the dataset label; the caller adds it).
|
|
91
135
|
*/
|
|
92
136
|
export declare function verifyTable(table: Table, rules: readonly VerifyRule[], options: {
|
|
93
137
|
evidenceRowLimit: number;
|
|
94
138
|
now: () => number;
|
|
95
139
|
signal?: AbortSignal | undefined;
|
|
140
|
+
expectations?: readonly VerifyExpectation[] | undefined;
|
|
141
|
+
defaultTolerance?: number | undefined;
|
|
96
142
|
}): Omit<VerifyReport, 'dataset'>;
|
|
97
143
|
/** Human-readable verify summary for the tool's Native render. */
|
|
98
144
|
export declare function renderVerifyText(report: VerifyReport): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/verify.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAsD,KAAK,IAAI,EAAE,KAAK,YAAY,EAAY,KAAK,KAAK,EAAE,MAAM,cAAc,CAAA;AACrI,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAE7E,mEAAmE;AACnE,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACjG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACtG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACtF;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAA;IAClD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACjC,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhH,2EAA2E;AAC3E,qBAAa,eAAgB,SAAQ,KAAK;IAMtC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAL5B;;;OAGG;gBAEQ,SAAS,EAAE,MAAM,EAC1B,OAAO,EAAE,MAAM;CAKlB;AAED,4DAA4D;AAC5D,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,CAAA;AAEhG,qFAAqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,8FAA8F;IAC9F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,gDAAgD;AAChD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB;AAED,yFAAyF;AACzF,qBAAa,sBAAuB,SAAQ,KAAK;IAM7C,QAAQ,CAAC,gBAAgB,EAAE,MAAM;IALnC;;;OAGG;gBAEQ,gBAAgB,EAAE,MAAM,EACjC,OAAO,EAAE,MAAM;CAKlB;AAED,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;CACtC;AAED,0BAA0B;AAC1B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,mCAAmC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,mCAAmC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CACvC;AAED,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAA;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,uBAAuB,EAAE,CAAA;IAChD,gGAAgG;IAChG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AA8GD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,SAAS,iBAAiB,EAAE,EAC1C,gBAAgB,EAAE,MAAM,EACxB,MAAM,CAAC,EAAE,WAAW,GACnB,uBAAuB,EAAE,CAgB3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,EAAE;IACP,gBAAgB,EAAE,MAAM,CAAA;IACxB,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;IAChC,YAAY,CAAC,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,CAAA;IACvD,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACtC,GACA,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CA4M/B;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAkB7D;AAED,6EAA6E;AAC7E,UAAU,cAAc;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAY9D;AAoCD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAC5C,gBAAgB,EAAE,MAAM,GACvB,mBAAmB,CA6DrB"}
|