truthound-dashboard 1.4.4__py3-none-any.whl → 1.5.1__py3-none-any.whl

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.
Files changed (205) hide show
  1. truthound_dashboard/api/alerts.py +75 -86
  2. truthound_dashboard/api/anomaly.py +7 -13
  3. truthound_dashboard/api/cross_alerts.py +38 -52
  4. truthound_dashboard/api/drift.py +49 -59
  5. truthound_dashboard/api/drift_monitor.py +234 -79
  6. truthound_dashboard/api/enterprise_sampling.py +498 -0
  7. truthound_dashboard/api/history.py +57 -5
  8. truthound_dashboard/api/lineage.py +3 -48
  9. truthound_dashboard/api/maintenance.py +104 -49
  10. truthound_dashboard/api/mask.py +1 -2
  11. truthound_dashboard/api/middleware.py +2 -1
  12. truthound_dashboard/api/model_monitoring.py +435 -311
  13. truthound_dashboard/api/notifications.py +227 -191
  14. truthound_dashboard/api/notifications_advanced.py +21 -20
  15. truthound_dashboard/api/observability.py +586 -0
  16. truthound_dashboard/api/plugins.py +2 -433
  17. truthound_dashboard/api/profile.py +199 -37
  18. truthound_dashboard/api/quality_reporter.py +701 -0
  19. truthound_dashboard/api/reports.py +7 -16
  20. truthound_dashboard/api/router.py +66 -0
  21. truthound_dashboard/api/rule_suggestions.py +5 -5
  22. truthound_dashboard/api/scan.py +17 -19
  23. truthound_dashboard/api/schedules.py +85 -50
  24. truthound_dashboard/api/schema_evolution.py +6 -6
  25. truthound_dashboard/api/schema_watcher.py +667 -0
  26. truthound_dashboard/api/sources.py +98 -27
  27. truthound_dashboard/api/tiering.py +1323 -0
  28. truthound_dashboard/api/triggers.py +14 -11
  29. truthound_dashboard/api/validations.py +12 -11
  30. truthound_dashboard/api/versioning.py +1 -6
  31. truthound_dashboard/core/__init__.py +129 -3
  32. truthound_dashboard/core/actions/__init__.py +62 -0
  33. truthound_dashboard/core/actions/custom.py +426 -0
  34. truthound_dashboard/core/actions/notifications.py +910 -0
  35. truthound_dashboard/core/actions/storage.py +472 -0
  36. truthound_dashboard/core/actions/webhook.py +281 -0
  37. truthound_dashboard/core/anomaly.py +262 -67
  38. truthound_dashboard/core/anomaly_explainer.py +4 -3
  39. truthound_dashboard/core/backends/__init__.py +67 -0
  40. truthound_dashboard/core/backends/base.py +299 -0
  41. truthound_dashboard/core/backends/errors.py +191 -0
  42. truthound_dashboard/core/backends/factory.py +423 -0
  43. truthound_dashboard/core/backends/mock_backend.py +451 -0
  44. truthound_dashboard/core/backends/truthound_backend.py +718 -0
  45. truthound_dashboard/core/checkpoint/__init__.py +87 -0
  46. truthound_dashboard/core/checkpoint/adapters.py +814 -0
  47. truthound_dashboard/core/checkpoint/checkpoint.py +491 -0
  48. truthound_dashboard/core/checkpoint/runner.py +270 -0
  49. truthound_dashboard/core/connections.py +645 -23
  50. truthound_dashboard/core/converters/__init__.py +14 -0
  51. truthound_dashboard/core/converters/truthound.py +620 -0
  52. truthound_dashboard/core/cross_alerts.py +540 -320
  53. truthound_dashboard/core/datasource_factory.py +1672 -0
  54. truthound_dashboard/core/drift_monitor.py +216 -20
  55. truthound_dashboard/core/enterprise_sampling.py +1291 -0
  56. truthound_dashboard/core/interfaces/__init__.py +225 -0
  57. truthound_dashboard/core/interfaces/actions.py +652 -0
  58. truthound_dashboard/core/interfaces/base.py +247 -0
  59. truthound_dashboard/core/interfaces/checkpoint.py +676 -0
  60. truthound_dashboard/core/interfaces/protocols.py +664 -0
  61. truthound_dashboard/core/interfaces/reporters.py +650 -0
  62. truthound_dashboard/core/interfaces/routing.py +646 -0
  63. truthound_dashboard/core/interfaces/triggers.py +619 -0
  64. truthound_dashboard/core/lineage.py +407 -71
  65. truthound_dashboard/core/model_monitoring.py +431 -3
  66. truthound_dashboard/core/notifications/base.py +4 -0
  67. truthound_dashboard/core/notifications/channels.py +501 -1203
  68. truthound_dashboard/core/notifications/deduplication/__init__.py +81 -115
  69. truthound_dashboard/core/notifications/deduplication/service.py +131 -348
  70. truthound_dashboard/core/notifications/dispatcher.py +202 -11
  71. truthound_dashboard/core/notifications/escalation/__init__.py +119 -106
  72. truthound_dashboard/core/notifications/escalation/engine.py +168 -358
  73. truthound_dashboard/core/notifications/routing/__init__.py +88 -128
  74. truthound_dashboard/core/notifications/routing/engine.py +90 -317
  75. truthound_dashboard/core/notifications/stats_aggregator.py +246 -1
  76. truthound_dashboard/core/notifications/throttling/__init__.py +67 -50
  77. truthound_dashboard/core/notifications/throttling/builder.py +117 -255
  78. truthound_dashboard/core/notifications/truthound_adapter.py +842 -0
  79. truthound_dashboard/core/phase5/collaboration.py +1 -1
  80. truthound_dashboard/core/plugins/lifecycle/__init__.py +0 -13
  81. truthound_dashboard/core/quality_reporter.py +1359 -0
  82. truthound_dashboard/core/report_history.py +0 -6
  83. truthound_dashboard/core/reporters/__init__.py +175 -14
  84. truthound_dashboard/core/reporters/adapters.py +943 -0
  85. truthound_dashboard/core/reporters/base.py +0 -3
  86. truthound_dashboard/core/reporters/builtin/__init__.py +18 -0
  87. truthound_dashboard/core/reporters/builtin/csv_reporter.py +111 -0
  88. truthound_dashboard/core/reporters/builtin/html_reporter.py +270 -0
  89. truthound_dashboard/core/reporters/builtin/json_reporter.py +127 -0
  90. truthound_dashboard/core/reporters/compat.py +266 -0
  91. truthound_dashboard/core/reporters/csv_reporter.py +2 -35
  92. truthound_dashboard/core/reporters/factory.py +526 -0
  93. truthound_dashboard/core/reporters/interfaces.py +745 -0
  94. truthound_dashboard/core/reporters/registry.py +1 -10
  95. truthound_dashboard/core/scheduler.py +165 -0
  96. truthound_dashboard/core/schema_evolution.py +3 -3
  97. truthound_dashboard/core/schema_watcher.py +1528 -0
  98. truthound_dashboard/core/services.py +595 -76
  99. truthound_dashboard/core/store_manager.py +810 -0
  100. truthound_dashboard/core/streaming_anomaly.py +169 -4
  101. truthound_dashboard/core/tiering.py +1309 -0
  102. truthound_dashboard/core/triggers/evaluators.py +178 -8
  103. truthound_dashboard/core/truthound_adapter.py +2620 -197
  104. truthound_dashboard/core/unified_alerts.py +23 -20
  105. truthound_dashboard/db/__init__.py +8 -0
  106. truthound_dashboard/db/database.py +8 -2
  107. truthound_dashboard/db/models.py +944 -25
  108. truthound_dashboard/db/repository.py +2 -0
  109. truthound_dashboard/main.py +15 -0
  110. truthound_dashboard/schemas/__init__.py +177 -16
  111. truthound_dashboard/schemas/base.py +44 -23
  112. truthound_dashboard/schemas/collaboration.py +19 -6
  113. truthound_dashboard/schemas/cross_alerts.py +19 -3
  114. truthound_dashboard/schemas/drift.py +61 -55
  115. truthound_dashboard/schemas/drift_monitor.py +67 -23
  116. truthound_dashboard/schemas/enterprise_sampling.py +653 -0
  117. truthound_dashboard/schemas/lineage.py +0 -33
  118. truthound_dashboard/schemas/mask.py +10 -8
  119. truthound_dashboard/schemas/model_monitoring.py +89 -10
  120. truthound_dashboard/schemas/notifications_advanced.py +13 -0
  121. truthound_dashboard/schemas/observability.py +453 -0
  122. truthound_dashboard/schemas/plugins.py +0 -280
  123. truthound_dashboard/schemas/profile.py +154 -247
  124. truthound_dashboard/schemas/quality_reporter.py +403 -0
  125. truthound_dashboard/schemas/reports.py +2 -2
  126. truthound_dashboard/schemas/rule_suggestion.py +8 -1
  127. truthound_dashboard/schemas/scan.py +4 -24
  128. truthound_dashboard/schemas/schedule.py +11 -3
  129. truthound_dashboard/schemas/schema_watcher.py +727 -0
  130. truthound_dashboard/schemas/source.py +17 -2
  131. truthound_dashboard/schemas/tiering.py +822 -0
  132. truthound_dashboard/schemas/triggers.py +16 -0
  133. truthound_dashboard/schemas/unified_alerts.py +7 -0
  134. truthound_dashboard/schemas/validation.py +0 -13
  135. truthound_dashboard/schemas/validators/base.py +41 -21
  136. truthound_dashboard/schemas/validators/business_rule_validators.py +244 -0
  137. truthound_dashboard/schemas/validators/localization_validators.py +273 -0
  138. truthound_dashboard/schemas/validators/ml_feature_validators.py +308 -0
  139. truthound_dashboard/schemas/validators/profiling_validators.py +275 -0
  140. truthound_dashboard/schemas/validators/referential_validators.py +312 -0
  141. truthound_dashboard/schemas/validators/registry.py +93 -8
  142. truthound_dashboard/schemas/validators/timeseries_validators.py +389 -0
  143. truthound_dashboard/schemas/versioning.py +1 -6
  144. truthound_dashboard/static/index.html +2 -2
  145. truthound_dashboard-1.5.1.dist-info/METADATA +312 -0
  146. {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/RECORD +149 -148
  147. truthound_dashboard/core/plugins/hooks/__init__.py +0 -63
  148. truthound_dashboard/core/plugins/hooks/decorators.py +0 -367
  149. truthound_dashboard/core/plugins/hooks/manager.py +0 -403
  150. truthound_dashboard/core/plugins/hooks/protocols.py +0 -265
  151. truthound_dashboard/core/plugins/lifecycle/hot_reload.py +0 -584
  152. truthound_dashboard/core/reporters/junit_reporter.py +0 -233
  153. truthound_dashboard/core/reporters/markdown_reporter.py +0 -207
  154. truthound_dashboard/core/reporters/pdf_reporter.py +0 -209
  155. truthound_dashboard/static/assets/_baseUniq-BcrSP13d.js +0 -1
  156. truthound_dashboard/static/assets/arc-DlYjKwIL.js +0 -1
  157. truthound_dashboard/static/assets/architectureDiagram-VXUJARFQ-Bb2drbQM.js +0 -36
  158. truthound_dashboard/static/assets/blockDiagram-VD42YOAC-BlsPG1CH.js +0 -122
  159. truthound_dashboard/static/assets/c4Diagram-YG6GDRKO-B9JdUoaC.js +0 -10
  160. truthound_dashboard/static/assets/channel-Q6mHF1Hd.js +0 -1
  161. truthound_dashboard/static/assets/chunk-4BX2VUAB-DmyoPVuJ.js +0 -1
  162. truthound_dashboard/static/assets/chunk-55IACEB6-Bcz6Siv8.js +0 -1
  163. truthound_dashboard/static/assets/chunk-B4BG7PRW-Br3G5Rum.js +0 -165
  164. truthound_dashboard/static/assets/chunk-DI55MBZ5-DuM9c23u.js +0 -220
  165. truthound_dashboard/static/assets/chunk-FMBD7UC4-DNU-5mvT.js +0 -15
  166. truthound_dashboard/static/assets/chunk-QN33PNHL-Im2yNcmS.js +0 -1
  167. truthound_dashboard/static/assets/chunk-QZHKN3VN-kZr8XFm1.js +0 -1
  168. truthound_dashboard/static/assets/chunk-TZMSLE5B-Q__360q_.js +0 -1
  169. truthound_dashboard/static/assets/classDiagram-2ON5EDUG-vtixxUyK.js +0 -1
  170. truthound_dashboard/static/assets/classDiagram-v2-WZHVMYZB-vtixxUyK.js +0 -1
  171. truthound_dashboard/static/assets/clone-BOt2LwD0.js +0 -1
  172. truthound_dashboard/static/assets/cose-bilkent-S5V4N54A-CBDw6iac.js +0 -1
  173. truthound_dashboard/static/assets/dagre-6UL2VRFP-XdKqmmY9.js +0 -4
  174. truthound_dashboard/static/assets/diagram-PSM6KHXK-DAZ8nx9V.js +0 -24
  175. truthound_dashboard/static/assets/diagram-QEK2KX5R-BRvDTbGD.js +0 -43
  176. truthound_dashboard/static/assets/diagram-S2PKOQOG-bQcczUkl.js +0 -24
  177. truthound_dashboard/static/assets/erDiagram-Q2GNP2WA-DPje7VMN.js +0 -60
  178. truthound_dashboard/static/assets/flowDiagram-NV44I4VS-B7BVtFVS.js +0 -162
  179. truthound_dashboard/static/assets/ganttDiagram-JELNMOA3-D6WKSS7U.js +0 -267
  180. truthound_dashboard/static/assets/gitGraphDiagram-NY62KEGX-D3vtVd3y.js +0 -65
  181. truthound_dashboard/static/assets/graph-BKgNKZVp.js +0 -1
  182. truthound_dashboard/static/assets/index-C6JSrkHo.css +0 -1
  183. truthound_dashboard/static/assets/index-DkU82VsU.js +0 -1800
  184. truthound_dashboard/static/assets/infoDiagram-WHAUD3N6-DnNCT429.js +0 -2
  185. truthound_dashboard/static/assets/journeyDiagram-XKPGCS4Q-DGiMozqS.js +0 -139
  186. truthound_dashboard/static/assets/kanban-definition-3W4ZIXB7-BV2gUgli.js +0 -89
  187. truthound_dashboard/static/assets/katex-Cu_Erd72.js +0 -261
  188. truthound_dashboard/static/assets/layout-DI2MfQ5G.js +0 -1
  189. truthound_dashboard/static/assets/min-DYdgXVcT.js +0 -1
  190. truthound_dashboard/static/assets/mindmap-definition-VGOIOE7T-C7x4ruxz.js +0 -68
  191. truthound_dashboard/static/assets/pieDiagram-ADFJNKIX-CAJaAB9f.js +0 -30
  192. truthound_dashboard/static/assets/quadrantDiagram-AYHSOK5B-DeqwDI46.js +0 -7
  193. truthound_dashboard/static/assets/requirementDiagram-UZGBJVZJ-e3XDpZIM.js +0 -64
  194. truthound_dashboard/static/assets/sankeyDiagram-TZEHDZUN-CNnAv5Ux.js +0 -10
  195. truthound_dashboard/static/assets/sequenceDiagram-WL72ISMW-Dsne-Of3.js +0 -145
  196. truthound_dashboard/static/assets/stateDiagram-FKZM4ZOC-Ee0sQXyb.js +0 -1
  197. truthound_dashboard/static/assets/stateDiagram-v2-4FDKWEC3-B26KqW_W.js +0 -1
  198. truthound_dashboard/static/assets/timeline-definition-IT6M3QCI-DZYi2yl3.js +0 -61
  199. truthound_dashboard/static/assets/treemap-KMMF4GRG-CY3f8In2.js +0 -128
  200. truthound_dashboard/static/assets/unmerged_dictionaries-Dd7xcPWG.js +0 -1
  201. truthound_dashboard/static/assets/xychartDiagram-PRI3JC2R-CS7fydZZ.js +0 -7
  202. truthound_dashboard-1.4.4.dist-info/METADATA +0 -507
  203. {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/WHEEL +0 -0
  204. {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/entry_points.txt +0 -0
  205. {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,11 @@
1
1
  """Validator registry.
2
2
 
3
3
  Central registry combining all validator categories with metadata and lookup functions.
4
+
5
+ This module aggregates all 21 validator categories from truthound, providing:
6
+ - Complete validator definitions with parameters
7
+ - Category metadata for UI display
8
+ - Search and filter utilities
4
9
  """
5
10
 
6
11
  from __future__ import annotations
@@ -10,23 +15,44 @@ from typing import Literal
10
15
 
11
16
  from .base import ValidatorCategory, ValidatorDefinition
12
17
 
13
- # Import all validator category modules
18
+ # Import all validator category modules (21 categories)
19
+ # Core validators
14
20
  from .schema_validators import SCHEMA_VALIDATORS
15
21
  from .completeness_validators import COMPLETENESS_VALIDATORS
16
22
  from .uniqueness_validators import UNIQUENESS_VALIDATORS
17
23
  from .distribution_validators import DISTRIBUTION_VALIDATORS
24
+
25
+ # Format validators
18
26
  from .string_validators import STRING_VALIDATORS
19
27
  from .datetime_validators import DATETIME_VALIDATORS
28
+
29
+ # Statistical validators
20
30
  from .aggregate_validators import AGGREGATE_VALIDATORS
31
+ from .drift_validators import DRIFT_VALIDATORS
32
+ from .anomaly_validators import ANOMALY_VALIDATORS
33
+
34
+ # Relational validators
21
35
  from .cross_table_validators import CROSS_TABLE_VALIDATORS
22
36
  from .multi_column_validators import MULTI_COLUMN_VALIDATORS
23
37
  from .query_validators import QUERY_VALIDATORS
38
+
39
+ # Domain validators
24
40
  from .table_validators import TABLE_VALIDATORS
25
41
  from .geospatial_validators import GEOSPATIAL_VALIDATORS
26
- from .drift_validators import DRIFT_VALIDATORS
27
- from .anomaly_validators import ANOMALY_VALIDATORS
28
42
  from .privacy_validators import PRIVACY_VALIDATORS
29
43
 
44
+ # Business validators (new)
45
+ from .business_rule_validators import BUSINESS_RULE_VALIDATORS
46
+ from .profiling_validators import PROFILING_VALIDATORS
47
+ from .localization_validators import LOCALIZATION_VALIDATORS
48
+
49
+ # ML validators (new)
50
+ from .ml_feature_validators import ML_FEATURE_VALIDATORS
51
+
52
+ # Advanced validators (new)
53
+ from .timeseries_validators import TIMESERIES_VALIDATORS
54
+ from .referential_validators import REFERENTIAL_VALIDATORS
55
+
30
56
 
31
57
  @dataclass
32
58
  class CategoryInfo:
@@ -41,7 +67,7 @@ class CategoryInfo:
41
67
  validator_count: int = 0
42
68
 
43
69
 
44
- # Category metadata with UI information
70
+ # Category metadata with UI information (21 categories)
45
71
  CATEGORY_INFO: list[CategoryInfo] = [
46
72
  # Core validators (no extra dependencies)
47
73
  CategoryInfo(
@@ -151,31 +177,90 @@ CATEGORY_INFO: list[CategoryInfo] = [
151
177
  CategoryInfo(
152
178
  value="privacy",
153
179
  label="Privacy",
154
- description="PII detection and compliance (GDPR, CCPA)",
180
+ description="PII detection and compliance (GDPR, CCPA, LGPD)",
155
181
  icon="shield",
156
182
  color="#dc2626", # red-600
157
183
  ),
184
+ # Business validators (new in truthound 2.x)
185
+ CategoryInfo(
186
+ value="business_rule",
187
+ label="Business Rule",
188
+ description="Domain-specific rules: checksums, IBAN, VAT, credit cards",
189
+ icon="briefcase",
190
+ color="#7c3aed", # violet-600
191
+ ),
192
+ CategoryInfo(
193
+ value="profiling",
194
+ label="Profiling",
195
+ description="Cardinality, entropy, and value frequency analysis",
196
+ icon="activity",
197
+ color="#0891b2", # cyan-600
198
+ ),
199
+ CategoryInfo(
200
+ value="localization",
201
+ label="Localization",
202
+ description="Regional identifier formats (Korean, Japanese, Chinese)",
203
+ icon="globe",
204
+ color="#059669", # emerald-600
205
+ ),
206
+ # ML validators (new in truthound 2.x)
207
+ CategoryInfo(
208
+ value="ml_feature",
209
+ label="ML Feature",
210
+ description="Feature quality: null impact, scale, correlation, leakage",
211
+ icon="cpu",
212
+ color="#7c2d12", # orange-900
213
+ ),
214
+ # Advanced validators (new in truthound 2.x)
215
+ CategoryInfo(
216
+ value="timeseries",
217
+ label="Time Series",
218
+ description="Gap detection, monotonicity, seasonality, trend analysis",
219
+ icon="clock",
220
+ color="#4338ca", # indigo-700
221
+ ),
222
+ CategoryInfo(
223
+ value="referential",
224
+ label="Referential",
225
+ description="Foreign keys, orphan detection, hierarchy integrity",
226
+ icon="git-merge",
227
+ color="#be185d", # pink-700
228
+ ),
158
229
  ]
159
230
 
160
231
 
161
232
  def _build_registry() -> list[ValidatorDefinition]:
162
- """Build the complete validator registry from all categories."""
233
+ """Build the complete validator registry from all 21 categories."""
163
234
  return [
235
+ # Core validators
164
236
  *SCHEMA_VALIDATORS,
165
237
  *COMPLETENESS_VALIDATORS,
166
238
  *UNIQUENESS_VALIDATORS,
167
239
  *DISTRIBUTION_VALIDATORS,
240
+ # Format validators
168
241
  *STRING_VALIDATORS,
169
242
  *DATETIME_VALIDATORS,
243
+ # Statistical validators
170
244
  *AGGREGATE_VALIDATORS,
245
+ *DRIFT_VALIDATORS,
246
+ *ANOMALY_VALIDATORS,
247
+ # Relational validators
171
248
  *CROSS_TABLE_VALIDATORS,
172
249
  *MULTI_COLUMN_VALIDATORS,
173
250
  *QUERY_VALIDATORS,
251
+ # Domain validators
174
252
  *TABLE_VALIDATORS,
175
253
  *GEOSPATIAL_VALIDATORS,
176
- *DRIFT_VALIDATORS,
177
- *ANOMALY_VALIDATORS,
178
254
  *PRIVACY_VALIDATORS,
255
+ # Business validators (new)
256
+ *BUSINESS_RULE_VALIDATORS,
257
+ *PROFILING_VALIDATORS,
258
+ *LOCALIZATION_VALIDATORS,
259
+ # ML validators (new)
260
+ *ML_FEATURE_VALIDATORS,
261
+ # Advanced validators (new)
262
+ *TIMESERIES_VALIDATORS,
263
+ *REFERENTIAL_VALIDATORS,
179
264
  ]
180
265
 
181
266
 
@@ -0,0 +1,389 @@
1
+ """Time series validators.
2
+
3
+ Validators for time series data properties including gaps, monotonicity,
4
+ seasonality, and trend analysis.
5
+
6
+ Import path in truthound: `from truthound.validators.timeseries import *`
7
+ """
8
+
9
+ from .base import (
10
+ ParameterDefinition,
11
+ ParameterType,
12
+ ValidatorCategory,
13
+ ValidatorDefinition,
14
+ )
15
+
16
+ TIMESERIES_VALIDATORS: list[ValidatorDefinition] = [
17
+ ValidatorDefinition(
18
+ name="TimeSeriesGap",
19
+ display_name="Time Series Gap Detection",
20
+ category=ValidatorCategory.TIMESERIES,
21
+ description="Detects unexpected gaps in time series data.",
22
+ parameters=[
23
+ ParameterDefinition(
24
+ name="timestamp_column",
25
+ label="Timestamp Column",
26
+ type=ParameterType.COLUMN,
27
+ required=True,
28
+ description="Column containing timestamps",
29
+ ),
30
+ ParameterDefinition(
31
+ name="expected_interval",
32
+ label="Expected Interval",
33
+ type=ParameterType.STRING,
34
+ required=True,
35
+ description="Expected time interval (e.g., '1h', '1d', '5m')",
36
+ placeholder="1h",
37
+ ),
38
+ ParameterDefinition(
39
+ name="tolerance",
40
+ label="Tolerance",
41
+ type=ParameterType.FLOAT,
42
+ default=0.1,
43
+ min_value=0,
44
+ max_value=1,
45
+ description="Tolerance ratio for interval variation (0-1)",
46
+ ),
47
+ ],
48
+ tags=["timeseries", "gap", "missing", "interval"],
49
+ severity_default="high",
50
+ ),
51
+ ValidatorDefinition(
52
+ name="TimeSeriesInterval",
53
+ display_name="Time Series Interval Regularity",
54
+ category=ValidatorCategory.TIMESERIES,
55
+ description="Validates that time series has regular intervals.",
56
+ parameters=[
57
+ ParameterDefinition(
58
+ name="timestamp_column",
59
+ label="Timestamp Column",
60
+ type=ParameterType.COLUMN,
61
+ required=True,
62
+ description="Column containing timestamps",
63
+ ),
64
+ ParameterDefinition(
65
+ name="interval",
66
+ label="Expected Interval",
67
+ type=ParameterType.STRING,
68
+ required=True,
69
+ description="Expected time interval (e.g., '1h', '1d', '5m')",
70
+ ),
71
+ ParameterDefinition(
72
+ name="strict",
73
+ label="Strict Mode",
74
+ type=ParameterType.BOOLEAN,
75
+ default=False,
76
+ description="If true, all intervals must match exactly",
77
+ ),
78
+ ],
79
+ tags=["timeseries", "interval", "regularity", "frequency"],
80
+ severity_default="medium",
81
+ ),
82
+ ValidatorDefinition(
83
+ name="TimeSeriesDuplicate",
84
+ display_name="Time Series Duplicate Timestamp",
85
+ category=ValidatorCategory.TIMESERIES,
86
+ description="Detects duplicate timestamps in time series data.",
87
+ parameters=[
88
+ ParameterDefinition(
89
+ name="timestamp_column",
90
+ label="Timestamp Column",
91
+ type=ParameterType.COLUMN,
92
+ required=True,
93
+ description="Column containing timestamps",
94
+ ),
95
+ ParameterDefinition(
96
+ name="group_columns",
97
+ label="Group Columns",
98
+ type=ParameterType.COLUMN_LIST,
99
+ description="Additional columns to group by (for multi-series data)",
100
+ ),
101
+ ],
102
+ tags=["timeseries", "duplicate", "timestamp", "unique"],
103
+ severity_default="high",
104
+ ),
105
+ ValidatorDefinition(
106
+ name="TimeSeriesMonotonic",
107
+ display_name="Time Series Monotonicity",
108
+ category=ValidatorCategory.TIMESERIES,
109
+ description="Validates that timestamps are strictly monotonic (always increasing).",
110
+ parameters=[
111
+ ParameterDefinition(
112
+ name="timestamp_column",
113
+ label="Timestamp Column",
114
+ type=ParameterType.COLUMN,
115
+ required=True,
116
+ description="Column containing timestamps",
117
+ ),
118
+ ParameterDefinition(
119
+ name="direction",
120
+ label="Direction",
121
+ type=ParameterType.SELECT,
122
+ options=[
123
+ {"value": "increasing", "label": "Increasing"},
124
+ {"value": "decreasing", "label": "Decreasing"},
125
+ ],
126
+ default="increasing",
127
+ description="Expected monotonicity direction",
128
+ ),
129
+ ParameterDefinition(
130
+ name="strict",
131
+ label="Strictly Monotonic",
132
+ type=ParameterType.BOOLEAN,
133
+ default=True,
134
+ description="If true, no equal consecutive values allowed",
135
+ ),
136
+ ],
137
+ tags=["timeseries", "monotonic", "order", "sequence"],
138
+ severity_default="high",
139
+ ),
140
+ ValidatorDefinition(
141
+ name="TimeSeriesOrder",
142
+ display_name="Time Series Order",
143
+ category=ValidatorCategory.TIMESERIES,
144
+ description="Validates that timestamps are in chronological order.",
145
+ parameters=[
146
+ ParameterDefinition(
147
+ name="timestamp_column",
148
+ label="Timestamp Column",
149
+ type=ParameterType.COLUMN,
150
+ required=True,
151
+ description="Column containing timestamps",
152
+ ),
153
+ ParameterDefinition(
154
+ name="allow_equal",
155
+ label="Allow Equal Timestamps",
156
+ type=ParameterType.BOOLEAN,
157
+ default=False,
158
+ description="Whether equal consecutive timestamps are allowed",
159
+ ),
160
+ ],
161
+ tags=["timeseries", "order", "chronological", "sequence"],
162
+ severity_default="medium",
163
+ ),
164
+ ValidatorDefinition(
165
+ name="Seasonality",
166
+ display_name="Seasonality Validation",
167
+ category=ValidatorCategory.TIMESERIES,
168
+ description="Validates expected seasonal patterns in time series data.",
169
+ parameters=[
170
+ ParameterDefinition(
171
+ name="timestamp_column",
172
+ label="Timestamp Column",
173
+ type=ParameterType.COLUMN,
174
+ required=True,
175
+ description="Column containing timestamps",
176
+ ),
177
+ ParameterDefinition(
178
+ name="value_column",
179
+ label="Value Column",
180
+ type=ParameterType.COLUMN,
181
+ required=True,
182
+ description="Column containing the time series values",
183
+ ),
184
+ ParameterDefinition(
185
+ name="period",
186
+ label="Seasonal Period",
187
+ type=ParameterType.SELECT,
188
+ options=[
189
+ {"value": "daily", "label": "Daily (24h)"},
190
+ {"value": "weekly", "label": "Weekly (7d)"},
191
+ {"value": "monthly", "label": "Monthly"},
192
+ {"value": "quarterly", "label": "Quarterly"},
193
+ {"value": "yearly", "label": "Yearly"},
194
+ ],
195
+ required=True,
196
+ description="Expected seasonal period",
197
+ ),
198
+ ParameterDefinition(
199
+ name="min_strength",
200
+ label="Minimum Seasonality Strength",
201
+ type=ParameterType.FLOAT,
202
+ default=0.3,
203
+ min_value=0,
204
+ max_value=1,
205
+ description="Minimum acceptable seasonality strength (0-1)",
206
+ ),
207
+ ],
208
+ tags=["timeseries", "seasonality", "pattern", "periodic"],
209
+ severity_default="medium",
210
+ ),
211
+ ValidatorDefinition(
212
+ name="Trend",
213
+ display_name="Trend Validation",
214
+ category=ValidatorCategory.TIMESERIES,
215
+ description="Validates expected trend direction in time series data.",
216
+ parameters=[
217
+ ParameterDefinition(
218
+ name="timestamp_column",
219
+ label="Timestamp Column",
220
+ type=ParameterType.COLUMN,
221
+ required=True,
222
+ description="Column containing timestamps",
223
+ ),
224
+ ParameterDefinition(
225
+ name="value_column",
226
+ label="Value Column",
227
+ type=ParameterType.COLUMN,
228
+ required=True,
229
+ description="Column containing the time series values",
230
+ ),
231
+ ParameterDefinition(
232
+ name="expected_trend",
233
+ label="Expected Trend",
234
+ type=ParameterType.SELECT,
235
+ options=[
236
+ {"value": "increasing", "label": "Increasing"},
237
+ {"value": "decreasing", "label": "Decreasing"},
238
+ {"value": "stable", "label": "Stable"},
239
+ ],
240
+ required=True,
241
+ description="Expected trend direction",
242
+ ),
243
+ ParameterDefinition(
244
+ name="significance",
245
+ label="Significance Level",
246
+ type=ParameterType.FLOAT,
247
+ default=0.05,
248
+ min_value=0.001,
249
+ max_value=0.5,
250
+ description="Statistical significance level for trend detection",
251
+ ),
252
+ ],
253
+ tags=["timeseries", "trend", "direction", "growth"],
254
+ severity_default="medium",
255
+ ),
256
+ ValidatorDefinition(
257
+ name="TrendBreak",
258
+ display_name="Trend Break Detection",
259
+ category=ValidatorCategory.TIMESERIES,
260
+ description="Detects unexpected trend breaks or structural changes in time series.",
261
+ parameters=[
262
+ ParameterDefinition(
263
+ name="timestamp_column",
264
+ label="Timestamp Column",
265
+ type=ParameterType.COLUMN,
266
+ required=True,
267
+ description="Column containing timestamps",
268
+ ),
269
+ ParameterDefinition(
270
+ name="value_column",
271
+ label="Value Column",
272
+ type=ParameterType.COLUMN,
273
+ required=True,
274
+ description="Column containing the time series values",
275
+ ),
276
+ ParameterDefinition(
277
+ name="sensitivity",
278
+ label="Sensitivity",
279
+ type=ParameterType.FLOAT,
280
+ default=0.5,
281
+ min_value=0,
282
+ max_value=1,
283
+ description="Detection sensitivity (higher = more sensitive)",
284
+ ),
285
+ ],
286
+ tags=["timeseries", "trend", "break", "change_point"],
287
+ severity_default="medium",
288
+ ),
289
+ ValidatorDefinition(
290
+ name="TimeSeriesCompleteness",
291
+ display_name="Time Series Completeness",
292
+ category=ValidatorCategory.TIMESERIES,
293
+ description="Validates that time series covers the expected date range completely.",
294
+ parameters=[
295
+ ParameterDefinition(
296
+ name="timestamp_column",
297
+ label="Timestamp Column",
298
+ type=ParameterType.COLUMN,
299
+ required=True,
300
+ description="Column containing timestamps",
301
+ ),
302
+ ParameterDefinition(
303
+ name="start_date",
304
+ label="Expected Start Date",
305
+ type=ParameterType.DATE,
306
+ description="Expected start date of the series",
307
+ ),
308
+ ParameterDefinition(
309
+ name="end_date",
310
+ label="Expected End Date",
311
+ type=ParameterType.DATE,
312
+ description="Expected end date of the series",
313
+ ),
314
+ ParameterDefinition(
315
+ name="min_completeness",
316
+ label="Minimum Completeness",
317
+ type=ParameterType.FLOAT,
318
+ default=0.95,
319
+ min_value=0,
320
+ max_value=1,
321
+ description="Minimum required completeness ratio (0-1)",
322
+ ),
323
+ ],
324
+ tags=["timeseries", "completeness", "coverage", "range"],
325
+ severity_default="high",
326
+ ),
327
+ ValidatorDefinition(
328
+ name="TimeSeriesDateRange",
329
+ display_name="Time Series Date Range",
330
+ category=ValidatorCategory.TIMESERIES,
331
+ description="Validates that all timestamps fall within an expected date range.",
332
+ parameters=[
333
+ ParameterDefinition(
334
+ name="timestamp_column",
335
+ label="Timestamp Column",
336
+ type=ParameterType.COLUMN,
337
+ required=True,
338
+ description="Column containing timestamps",
339
+ ),
340
+ ParameterDefinition(
341
+ name="min_date",
342
+ label="Minimum Date",
343
+ type=ParameterType.DATE,
344
+ description="Earliest acceptable date",
345
+ ),
346
+ ParameterDefinition(
347
+ name="max_date",
348
+ label="Maximum Date",
349
+ type=ParameterType.DATE,
350
+ description="Latest acceptable date",
351
+ ),
352
+ ],
353
+ tags=["timeseries", "date_range", "bounds", "validation"],
354
+ severity_default="medium",
355
+ ),
356
+ ValidatorDefinition(
357
+ name="TimeSeriesValueCompleteness",
358
+ display_name="Time Series Value Completeness",
359
+ category=ValidatorCategory.TIMESERIES,
360
+ description="Validates that values are present for all expected time points.",
361
+ parameters=[
362
+ ParameterDefinition(
363
+ name="timestamp_column",
364
+ label="Timestamp Column",
365
+ type=ParameterType.COLUMN,
366
+ required=True,
367
+ description="Column containing timestamps",
368
+ ),
369
+ ParameterDefinition(
370
+ name="value_column",
371
+ label="Value Column",
372
+ type=ParameterType.COLUMN,
373
+ required=True,
374
+ description="Column containing the time series values",
375
+ ),
376
+ ParameterDefinition(
377
+ name="max_null_ratio",
378
+ label="Maximum Null Ratio",
379
+ type=ParameterType.FLOAT,
380
+ default=0.05,
381
+ min_value=0,
382
+ max_value=1,
383
+ description="Maximum acceptable ratio of null values",
384
+ ),
385
+ ],
386
+ tags=["timeseries", "completeness", "null", "missing"],
387
+ severity_default="medium",
388
+ ),
389
+ ]
@@ -34,7 +34,6 @@ class VersionInfoResponse(BaseSchema):
34
34
  class VersionListResponse(BaseSchema):
35
35
  """Response for listing versions."""
36
36
 
37
- success: bool = Field(default=True)
38
37
  data: list[VersionInfoResponse] = Field(..., description="List of versions")
39
38
  total: int = Field(..., description="Total number of versions")
40
39
  source_id: str = Field(..., description="Source ID for these versions")
@@ -81,7 +80,6 @@ class VersionCompareRequest(BaseSchema):
81
80
  class VersionHistoryResponse(BaseSchema):
82
81
  """Response for version history chain."""
83
82
 
84
- success: bool = Field(default=True)
85
83
  data: list[VersionInfoResponse] = Field(..., description="Version history chain")
86
84
  depth: int = Field(..., description="Depth of history returned")
87
85
 
@@ -101,8 +99,7 @@ class CreateVersionRequest(BaseSchema):
101
99
  class CreateVersionResponse(BaseSchema):
102
100
  """Response after creating a version."""
103
101
 
104
- success: bool = Field(default=True)
105
- data: VersionInfoResponse = Field(..., description="Created version info")
102
+ version: VersionInfoResponse = Field(..., description="Created version info")
106
103
  message: str = Field(..., description="Success message")
107
104
 
108
105
 
@@ -120,7 +117,6 @@ class RollbackRequest(BaseSchema):
120
117
  class RollbackResponse(BaseSchema):
121
118
  """Response after a rollback operation."""
122
119
 
123
- success: bool = Field(default=True)
124
120
  source_id: str = Field(..., description="Source ID that was rolled back")
125
121
  from_version: VersionInfoResponse | None = Field(
126
122
  None, description="Version rolled back from"
@@ -138,7 +134,6 @@ class RollbackResponse(BaseSchema):
138
134
  class RollbackAvailabilityResponse(BaseSchema):
139
135
  """Response for checking rollback availability."""
140
136
 
141
- success: bool = Field(default=True)
142
137
  can_rollback: bool = Field(..., description="Whether rollback is available")
143
138
  current_version_id: str | None = Field(
144
139
  None, description="Current active version ID"
@@ -6,8 +6,8 @@
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <meta name="description" content="Truthound Dashboard - Open-source data quality monitoring" />
8
8
  <title>Truthound Dashboard</title>
9
- <script type="module" crossorigin src="/assets/index-DkU82VsU.js"></script>
10
- <link rel="stylesheet" crossorigin href="/assets/index-C6JSrkHo.css">
9
+ <script type="module" crossorigin src="/assets/index-Ch94w21P.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-DDRuhd95.css">
11
11
  </head>
12
12
  <body>
13
13
  <div id="root"></div>