data-sentinel-forge 0.5.0__tar.gz

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 (455) hide show
  1. data_sentinel_forge-0.5.0/.gitignore +38 -0
  2. data_sentinel_forge-0.5.0/CHANGELOG.md +149 -0
  3. data_sentinel_forge-0.5.0/LICENSE +182 -0
  4. data_sentinel_forge-0.5.0/PKG-INFO +236 -0
  5. data_sentinel_forge-0.5.0/README.md +195 -0
  6. data_sentinel_forge-0.5.0/examples/README.md +54 -0
  7. data_sentinel_forge-0.5.0/frontend/README.md +75 -0
  8. data_sentinel_forge-0.5.0/frontend/src/app/app.component.css +188 -0
  9. data_sentinel_forge-0.5.0/frontend/src/app/app.component.html +108 -0
  10. data_sentinel_forge-0.5.0/frontend/src/app/app.component.spec.ts +51 -0
  11. data_sentinel_forge-0.5.0/frontend/src/app/app.component.ts +118 -0
  12. data_sentinel_forge-0.5.0/frontend/src/app/app.config.ts +32 -0
  13. data_sentinel_forge-0.5.0/frontend/src/app/app.routes.ts +173 -0
  14. data_sentinel_forge-0.5.0/frontend/src/app/core/api-error.store.ts +22 -0
  15. data_sentinel_forge-0.5.0/frontend/src/app/core/api.models.ts +594 -0
  16. data_sentinel_forge-0.5.0/frontend/src/app/core/api.service.spec.ts +253 -0
  17. data_sentinel_forge-0.5.0/frontend/src/app/core/api.service.ts +290 -0
  18. data_sentinel_forge-0.5.0/frontend/src/app/core/http-error.interceptor.ts +63 -0
  19. data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/i18n.service.spec.ts +29 -0
  20. data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/i18n.service.ts +62 -0
  21. data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/localized-title.strategy.ts +28 -0
  22. data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/translate.pipe.ts +16 -0
  23. data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/translations.ts +1542 -0
  24. data_sentinel_forge-0.5.0/frontend/src/app/core/nav-icon.component.ts +82 -0
  25. data_sentinel_forge-0.5.0/frontend/src/app/core/session/auth.guard.spec.ts +67 -0
  26. data_sentinel_forge-0.5.0/frontend/src/app/core/session/auth.guard.ts +34 -0
  27. data_sentinel_forge-0.5.0/frontend/src/app/core/session/auth.interceptor.spec.ts +99 -0
  28. data_sentinel_forge-0.5.0/frontend/src/app/core/session/auth.interceptor.ts +58 -0
  29. data_sentinel_forge-0.5.0/frontend/src/app/core/session/session-tokens.ts +16 -0
  30. data_sentinel_forge-0.5.0/frontend/src/app/core/session/session.service.spec.ts +119 -0
  31. data_sentinel_forge-0.5.0/frontend/src/app/core/session/session.service.ts +147 -0
  32. data_sentinel_forge-0.5.0/frontend/src/app/core/session/sse-fetch.spec.ts +125 -0
  33. data_sentinel_forge-0.5.0/frontend/src/app/core/session/sse-fetch.ts +106 -0
  34. data_sentinel_forge-0.5.0/frontend/src/app/core/theme.service.ts +49 -0
  35. data_sentinel_forge-0.5.0/frontend/src/app/features/agents/agents.component.css +193 -0
  36. data_sentinel_forge-0.5.0/frontend/src/app/features/agents/agents.component.html +211 -0
  37. data_sentinel_forge-0.5.0/frontend/src/app/features/agents/agents.component.spec.ts +140 -0
  38. data_sentinel_forge-0.5.0/frontend/src/app/features/agents/agents.component.ts +108 -0
  39. data_sentinel_forge-0.5.0/frontend/src/app/features/dashboard/dashboard.component.css +112 -0
  40. data_sentinel_forge-0.5.0/frontend/src/app/features/dashboard/dashboard.component.html +90 -0
  41. data_sentinel_forge-0.5.0/frontend/src/app/features/dashboard/dashboard.component.ts +63 -0
  42. data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.component.css +186 -0
  43. data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.component.html +311 -0
  44. data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.component.spec.ts +131 -0
  45. data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.component.ts +157 -0
  46. data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.model.spec.ts +176 -0
  47. data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.model.ts +362 -0
  48. data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/graph-canvas.component.ts +459 -0
  49. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-detail.component.css +299 -0
  50. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-detail.component.html +581 -0
  51. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-detail.component.spec.ts +147 -0
  52. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-detail.component.ts +250 -0
  53. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-new.component.css +146 -0
  54. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-new.component.html +146 -0
  55. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-new.component.spec.ts +134 -0
  56. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-new.component.ts +159 -0
  57. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-stream.service.spec.ts +147 -0
  58. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-stream.service.ts +105 -0
  59. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigations.component.css +160 -0
  60. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigations.component.html +194 -0
  61. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigations.component.spec.ts +72 -0
  62. data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigations.component.ts +187 -0
  63. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/compare-result.component.ts +310 -0
  64. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/operations-dashboard.component.css +88 -0
  65. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/operations-dashboard.component.html +141 -0
  66. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/operations-dashboard.component.ts +138 -0
  67. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/ops-nav.component.ts +91 -0
  68. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/regression-explorer.component.css +95 -0
  69. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/regression-explorer.component.html +170 -0
  70. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/regression-explorer.component.ts +224 -0
  71. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/regression-findings.component.ts +156 -0
  72. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/remediation-workspace.component.css +266 -0
  73. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/remediation-workspace.component.html +740 -0
  74. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/remediation-workspace.component.spec.ts +267 -0
  75. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/remediation-workspace.component.ts +484 -0
  76. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/watch-center.component.css +182 -0
  77. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/watch-center.component.html +409 -0
  78. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/watch-center.component.spec.ts +173 -0
  79. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/watch-center.component.ts +332 -0
  80. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/workload-timeline.component.css +160 -0
  81. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/workload-timeline.component.html +237 -0
  82. data_sentinel_forge-0.5.0/frontend/src/app/features/operations/workload-timeline.component.ts +232 -0
  83. data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.component.css +257 -0
  84. data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.component.html +429 -0
  85. data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.component.spec.ts +199 -0
  86. data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.component.ts +239 -0
  87. data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.model.ts +133 -0
  88. data_sentinel_forge-0.5.0/frontend/src/app/features/reports/reports.component.css +187 -0
  89. data_sentinel_forge-0.5.0/frontend/src/app/features/reports/reports.component.html +268 -0
  90. data_sentinel_forge-0.5.0/frontend/src/app/features/reports/reports.component.spec.ts +167 -0
  91. data_sentinel_forge-0.5.0/frontend/src/app/features/reports/reports.component.ts +265 -0
  92. data_sentinel_forge-0.5.0/frontend/src/app/features/session-gate/session-gate.component.css +92 -0
  93. data_sentinel_forge-0.5.0/frontend/src/app/features/session-gate/session-gate.component.html +42 -0
  94. data_sentinel_forge-0.5.0/frontend/src/app/features/session-gate/session-gate.component.spec.ts +118 -0
  95. data_sentinel_forge-0.5.0/frontend/src/app/features/session-gate/session-gate.component.ts +61 -0
  96. data_sentinel_forge-0.5.0/frontend/src/app/features/spark-plans/spark-plans.component.css +138 -0
  97. data_sentinel_forge-0.5.0/frontend/src/app/features/spark-plans/spark-plans.component.html +139 -0
  98. data_sentinel_forge-0.5.0/frontend/src/app/features/spark-plans/spark-plans.component.spec.ts +245 -0
  99. data_sentinel_forge-0.5.0/frontend/src/app/features/spark-plans/spark-plans.component.ts +251 -0
  100. data_sentinel_forge-0.5.0/frontend/src/app/features/workloads/workloads.component.css +206 -0
  101. data_sentinel_forge-0.5.0/frontend/src/app/features/workloads/workloads.component.html +229 -0
  102. data_sentinel_forge-0.5.0/frontend/src/app/features/workloads/workloads.component.spec.ts +221 -0
  103. data_sentinel_forge-0.5.0/frontend/src/app/features/workloads/workloads.component.ts +284 -0
  104. data_sentinel_forge-0.5.0/frontend/src/app/shared/analysis-result/analysis-result.component.ts +321 -0
  105. data_sentinel_forge-0.5.0/frontend/src/app/shared/analysis-result.ts +121 -0
  106. data_sentinel_forge-0.5.0/frontend/src/app/shared/page-shell/page-shell.component.ts +93 -0
  107. data_sentinel_forge-0.5.0/frontend/src/app/shared/status-class.ts +70 -0
  108. data_sentinel_forge-0.5.0/frontend/src/app/shared/tool-manifest.ts +71 -0
  109. data_sentinel_forge-0.5.0/frontend/src/environments/environment.development.ts +5 -0
  110. data_sentinel_forge-0.5.0/frontend/src/environments/environment.ts +5 -0
  111. data_sentinel_forge-0.5.0/frontend/src/index.html +14 -0
  112. data_sentinel_forge-0.5.0/frontend/src/main.ts +6 -0
  113. data_sentinel_forge-0.5.0/frontend/src/styles/tokens.css +347 -0
  114. data_sentinel_forge-0.5.0/frontend/src/styles.css +248 -0
  115. data_sentinel_forge-0.5.0/frontend/src/test-setup.ts +159 -0
  116. data_sentinel_forge-0.5.0/pyproject.toml +125 -0
  117. data_sentinel_forge-0.5.0/schemas/AccessContext.schema.json +73 -0
  118. data_sentinel_forge-0.5.0/schemas/AccessMetadata.schema.json +33 -0
  119. data_sentinel_forge-0.5.0/schemas/AgentDescriptor.schema.json +120 -0
  120. data_sentinel_forge-0.5.0/schemas/AgentExecution.schema.json +99 -0
  121. data_sentinel_forge-0.5.0/schemas/AgentTask.schema.json +45 -0
  122. data_sentinel_forge-0.5.0/schemas/ArtifactReference.schema.json +29 -0
  123. data_sentinel_forge-0.5.0/schemas/CapabilityDescriptor.schema.json +54 -0
  124. data_sentinel_forge-0.5.0/schemas/CapabilityManifest.schema.json +72 -0
  125. data_sentinel_forge-0.5.0/schemas/CompatibilityAssessment.schema.json +185 -0
  126. data_sentinel_forge-0.5.0/schemas/DataQualityContract.schema.json +229 -0
  127. data_sentinel_forge-0.5.0/schemas/DatasetReference.schema.json +52 -0
  128. data_sentinel_forge-0.5.0/schemas/DiagnosticReport.schema.json +311 -0
  129. data_sentinel_forge-0.5.0/schemas/DiagnosticRequest.schema.json +271 -0
  130. data_sentinel_forge-0.5.0/schemas/EMRExecutionContext.schema.json +235 -0
  131. data_sentinel_forge-0.5.0/schemas/EMRResourceObservation.schema.json +88 -0
  132. data_sentinel_forge-0.5.0/schemas/Environment.schema.json +36 -0
  133. data_sentinel_forge-0.5.0/schemas/Evidence.schema.json +110 -0
  134. data_sentinel_forge-0.5.0/schemas/ExecutionContext.schema.json +88 -0
  135. data_sentinel_forge-0.5.0/schemas/ExecutionMetadata.schema.json +173 -0
  136. data_sentinel_forge-0.5.0/schemas/ExternalDiagnosticBundle.schema.json +981 -0
  137. data_sentinel_forge-0.5.0/schemas/Finding.schema.json +108 -0
  138. data_sentinel_forge-0.5.0/schemas/Hypothesis.schema.json +63 -0
  139. data_sentinel_forge-0.5.0/schemas/IcebergSnapshotSummary.schema.json +79 -0
  140. data_sentinel_forge-0.5.0/schemas/IcebergTableMetadata.schema.json +103 -0
  141. data_sentinel_forge-0.5.0/schemas/ImpactAssessment.schema.json +118 -0
  142. data_sentinel_forge-0.5.0/schemas/InvestigationBudget.schema.json +63 -0
  143. data_sentinel_forge-0.5.0/schemas/InvestigationPlan.schema.json +154 -0
  144. data_sentinel_forge-0.5.0/schemas/InvestigationReport.schema.json +472 -0
  145. data_sentinel_forge-0.5.0/schemas/InvestigationState.schema.json +602 -0
  146. data_sentinel_forge-0.5.0/schemas/LakehouseOperation.schema.json +59 -0
  147. data_sentinel_forge-0.5.0/schemas/LineageEvent.schema.json +122 -0
  148. data_sentinel_forge-0.5.0/schemas/OptimizationRecommendation.schema.json +88 -0
  149. data_sentinel_forge-0.5.0/schemas/QualityAssessment.schema.json +420 -0
  150. data_sentinel_forge-0.5.0/schemas/QualityObservation.schema.json +153 -0
  151. data_sentinel_forge-0.5.0/schemas/QualityRule.schema.json +86 -0
  152. data_sentinel_forge-0.5.0/schemas/RequestConstraints.schema.json +42 -0
  153. data_sentinel_forge-0.5.0/schemas/ResourceContext.schema.json +54 -0
  154. data_sentinel_forge-0.5.0/schemas/ToolDescriptor.schema.json +91 -0
  155. data_sentinel_forge-0.5.0/schemas/ToolInvocation.schema.json +45 -0
  156. data_sentinel_forge-0.5.0/schemas/ToolResult.schema.json +59 -0
  157. data_sentinel_forge-0.5.0/src/data_sentinel/__init__.py +3 -0
  158. data_sentinel_forge-0.5.0/src/data_sentinel/__main__.py +6 -0
  159. data_sentinel_forge-0.5.0/src/data_sentinel/_installkit.py +1825 -0
  160. data_sentinel_forge-0.5.0/src/data_sentinel/adapters/__init__.py +7 -0
  161. data_sentinel_forge-0.5.0/src/data_sentinel/adapters/doctor/__init__.py +30 -0
  162. data_sentinel_forge-0.5.0/src/data_sentinel/adapters/doctor/adapter.py +278 -0
  163. data_sentinel_forge-0.5.0/src/data_sentinel/adapters/doctor/exporter.py +98 -0
  164. data_sentinel_forge-0.5.0/src/data_sentinel/agents/__init__.py +29 -0
  165. data_sentinel_forge-0.5.0/src/data_sentinel/agents/guardrails.py +75 -0
  166. data_sentinel_forge-0.5.0/src/data_sentinel/agents/investigator.py +102 -0
  167. data_sentinel_forge-0.5.0/src/data_sentinel/agents/memory.py +129 -0
  168. data_sentinel_forge-0.5.0/src/data_sentinel/agents/operations.py +179 -0
  169. data_sentinel_forge-0.5.0/src/data_sentinel/agents/providers.py +119 -0
  170. data_sentinel_forge-0.5.0/src/data_sentinel/agents/runtime.py +147 -0
  171. data_sentinel_forge-0.5.0/src/data_sentinel/agents/specialists.py +132 -0
  172. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/__init__.py +49 -0
  173. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/cloudwatch/__init__.py +7 -0
  174. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/cloudwatch/analyzer.py +131 -0
  175. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/cloudwatch/log_parser.py +109 -0
  176. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/cost/__init__.py +2 -0
  177. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/crossaccount/__init__.py +19 -0
  178. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/crossaccount/analyzer.py +359 -0
  179. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/crossaccount/graph.py +75 -0
  180. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/__init__.py +9 -0
  181. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/compare.py +87 -0
  182. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/cost.py +239 -0
  183. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/ec2.py +266 -0
  184. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/eks.py +309 -0
  185. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/metrics.py +89 -0
  186. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/parser.py +80 -0
  187. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/serverless.py +259 -0
  188. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/glue/__init__.py +2 -0
  189. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iam/__init__.py +19 -0
  190. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iam/analyzer.py +346 -0
  191. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iam/policy.py +146 -0
  192. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iceberg/__init__.py +15 -0
  193. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iceberg/analyzer.py +382 -0
  194. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iceberg/metadata.py +240 -0
  195. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/lakeformation/__init__.py +2 -0
  196. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/operations/__init__.py +5 -0
  197. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/operations/analyzer.py +377 -0
  198. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/protocol.py +99 -0
  199. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/quality/__init__.py +2 -0
  200. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/registry.py +50 -0
  201. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/__init__.py +6 -0
  202. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/config/__init__.py +6 -0
  203. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/config/advisor.py +438 -0
  204. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/config/matrix.py +86 -0
  205. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/config/parser.py +61 -0
  206. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/joins/__init__.py +17 -0
  207. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/joins/analyzer.py +557 -0
  208. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/joins/extractor.py +210 -0
  209. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/joins/models.py +104 -0
  210. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/log_analyzer.py +164 -0
  211. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/patterns.py +317 -0
  212. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/plans/__init__.py +7 -0
  213. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/plans/analyzer.py +445 -0
  214. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/plans/models.py +72 -0
  215. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/plans/parser.py +190 -0
  216. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/sql/__init__.py +5 -0
  217. data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/sql/sql_analyzer.py +670 -0
  218. data_sentinel_forge-0.5.0/src/data_sentinel/api/__init__.py +9 -0
  219. data_sentinel_forge-0.5.0/src/data_sentinel/api/app.py +1016 -0
  220. data_sentinel_forge-0.5.0/src/data_sentinel/api/contracts.py +72 -0
  221. data_sentinel_forge-0.5.0/src/data_sentinel/cli/__init__.py +1415 -0
  222. data_sentinel_forge-0.5.0/src/data_sentinel/cli/install.py +342 -0
  223. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/__init__.py +2 -0
  224. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/__init__.py +21 -0
  225. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/cloudwatch_logs.py +145 -0
  226. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/cloudwatch_metrics.py +90 -0
  227. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/emr.py +93 -0
  228. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/errors.py +99 -0
  229. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/glue.py +212 -0
  230. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/models.py +80 -0
  231. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/sessions.py +83 -0
  232. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/databricks/__init__.py +2 -0
  233. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/local/__init__.py +2 -0
  234. data_sentinel_forge-0.5.0/src/data_sentinel/connectors/telemetry/__init__.py +2 -0
  235. data_sentinel_forge-0.5.0/src/data_sentinel/context/__init__.py +22 -0
  236. data_sentinel_forge-0.5.0/src/data_sentinel/context/budget.py +39 -0
  237. data_sentinel_forge-0.5.0/src/data_sentinel/context/cache.py +49 -0
  238. data_sentinel_forge-0.5.0/src/data_sentinel/context/layers.py +119 -0
  239. data_sentinel_forge-0.5.0/src/data_sentinel/core/__init__.py +2 -0
  240. data_sentinel_forge-0.5.0/src/data_sentinel/core/configuration/__init__.py +29 -0
  241. data_sentinel_forge-0.5.0/src/data_sentinel/core/configuration/loader.py +146 -0
  242. data_sentinel_forge-0.5.0/src/data_sentinel/core/configuration/models.py +129 -0
  243. data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/__init__.py +192 -0
  244. data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/agent.py +294 -0
  245. data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/emr.py +105 -0
  246. data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/entities.py +214 -0
  247. data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/enums.py +112 -0
  248. data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/interop.py +177 -0
  249. data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/lakehouse.py +97 -0
  250. data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/quality.py +157 -0
  251. data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/snapshot.py +56 -0
  252. data_sentinel_forge-0.5.0/src/data_sentinel/core/domain/__init__.py +2 -0
  253. data_sentinel_forge-0.5.0/src/data_sentinel/core/exceptions/__init__.py +50 -0
  254. data_sentinel_forge-0.5.0/src/data_sentinel/core/models/__init__.py +2 -0
  255. data_sentinel_forge-0.5.0/src/data_sentinel/core/security/__init__.py +24 -0
  256. data_sentinel_forge-0.5.0/src/data_sentinel/core/security/paths.py +126 -0
  257. data_sentinel_forge-0.5.0/src/data_sentinel/core/security/redact.py +85 -0
  258. data_sentinel_forge-0.5.0/src/data_sentinel/core/security/sanitize.py +36 -0
  259. data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/__init__.py +2 -0
  260. data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/capabilities.py +71 -0
  261. data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/correlation.py +104 -0
  262. data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/cross_correlation.py +266 -0
  263. data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/incident.py +257 -0
  264. data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/orchestrator.py +153 -0
  265. data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/timeline.py +151 -0
  266. data_sentinel_forge-0.5.0/src/data_sentinel/history/__init__.py +5 -0
  267. data_sentinel_forge-0.5.0/src/data_sentinel/history/compare.py +142 -0
  268. data_sentinel_forge-0.5.0/src/data_sentinel/history/regression.py +184 -0
  269. data_sentinel_forge-0.5.0/src/data_sentinel/installation/__init__.py +34 -0
  270. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/MANIFEST.sha256 +11 -0
  271. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/agents/sentinel-investigator.md +59 -0
  272. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/agents/sentinel-reviewer.md +47 -0
  273. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/agents/sentinel-spark-specialist.md +48 -0
  274. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/manifest/forge.json +23 -0
  275. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-investigate/SKILL.md +95 -0
  276. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-quality-drift/SKILL.md +37 -0
  277. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-report/SKILL.md +35 -0
  278. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-spark-plan/SKILL.md +64 -0
  279. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-sql-review/SKILL.md +37 -0
  280. data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets.py +128 -0
  281. data_sentinel_forge-0.5.0/src/data_sentinel/installation/contracts.py +198 -0
  282. data_sentinel_forge-0.5.0/src/data_sentinel/installation/hosts.py +534 -0
  283. data_sentinel_forge-0.5.0/src/data_sentinel/installation/ownership.py +103 -0
  284. data_sentinel_forge-0.5.0/src/data_sentinel/installation/planner.py +167 -0
  285. data_sentinel_forge-0.5.0/src/data_sentinel/installation/service.py +494 -0
  286. data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/__init__.py +2 -0
  287. data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/agents/__init__.py +2 -0
  288. data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/evaluation/__init__.py +2 -0
  289. data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/memory/__init__.py +2 -0
  290. data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/orchestration/__init__.py +2 -0
  291. data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/retrieval/__init__.py +2 -0
  292. data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/__init__.py +20 -0
  293. data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/compat.py +174 -0
  294. data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/engine.py +46 -0
  295. data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/rules/__init__.py +1 -0
  296. data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/rules/glue-fgac.yaml +104 -0
  297. data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/rules/glue-runtime-iceberg.yaml +99 -0
  298. data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/schema.py +155 -0
  299. data_sentinel_forge-0.5.0/src/data_sentinel/lakehouse/__init__.py +5 -0
  300. data_sentinel_forge-0.5.0/src/data_sentinel/lakehouse/resolver.py +86 -0
  301. data_sentinel_forge-0.5.0/src/data_sentinel/lineage/__init__.py +12 -0
  302. data_sentinel_forge-0.5.0/src/data_sentinel/lineage/graph.py +100 -0
  303. data_sentinel_forge-0.5.0/src/data_sentinel/lineage/openlineage.py +142 -0
  304. data_sentinel_forge-0.5.0/src/data_sentinel/mcp/__init__.py +2 -0
  305. data_sentinel_forge-0.5.0/src/data_sentinel/mcp_server.py +77 -0
  306. data_sentinel_forge-0.5.0/src/data_sentinel/observability/__init__.py +2 -0
  307. data_sentinel_forge-0.5.0/src/data_sentinel/persistence/__init__.py +15 -0
  308. data_sentinel_forge-0.5.0/src/data_sentinel/persistence/integrity.py +92 -0
  309. data_sentinel_forge-0.5.0/src/data_sentinel/persistence/investigations.py +234 -0
  310. data_sentinel_forge-0.5.0/src/data_sentinel/persistence/migrations/0001_init.sql +25 -0
  311. data_sentinel_forge-0.5.0/src/data_sentinel/persistence/migrations.py +51 -0
  312. data_sentinel_forge-0.5.0/src/data_sentinel/persistence/operations.py +401 -0
  313. data_sentinel_forge-0.5.0/src/data_sentinel/persistence/store.py +213 -0
  314. data_sentinel_forge-0.5.0/src/data_sentinel/quality/__init__.py +35 -0
  315. data_sentinel_forge-0.5.0/src/data_sentinel/quality/adapters.py +318 -0
  316. data_sentinel_forge-0.5.0/src/data_sentinel/quality/contract.py +206 -0
  317. data_sentinel_forge-0.5.0/src/data_sentinel/quality/drift.py +244 -0
  318. data_sentinel_forge-0.5.0/src/data_sentinel/quality/profile.py +115 -0
  319. data_sentinel_forge-0.5.0/src/data_sentinel/quality/versioning.py +46 -0
  320. data_sentinel_forge-0.5.0/src/data_sentinel/rag/__init__.py +10 -0
  321. data_sentinel_forge-0.5.0/src/data_sentinel/rag/memory.py +51 -0
  322. data_sentinel_forge-0.5.0/src/data_sentinel/rag/retriever.py +89 -0
  323. data_sentinel_forge-0.5.0/src/data_sentinel/reasoning/__init__.py +6 -0
  324. data_sentinel_forge-0.5.0/src/data_sentinel/reasoning/rca.py +87 -0
  325. data_sentinel_forge-0.5.0/src/data_sentinel/reasoning/validator.py +70 -0
  326. data_sentinel_forge-0.5.0/src/data_sentinel/remediation/__init__.py +34 -0
  327. data_sentinel_forge-0.5.0/src/data_sentinel/remediation/plans.py +280 -0
  328. data_sentinel_forge-0.5.0/src/data_sentinel/reporting/__init__.py +9 -0
  329. data_sentinel_forge-0.5.0/src/data_sentinel/reporting/render.py +153 -0
  330. data_sentinel_forge-0.5.0/src/data_sentinel/tools/__init__.py +19 -0
  331. data_sentinel_forge-0.5.0/src/data_sentinel/tools/registry.py +457 -0
  332. data_sentinel_forge-0.5.0/src/data_sentinel/ui/__init__.py +29 -0
  333. data_sentinel_forge-0.5.0/src/data_sentinel/ui/i18n.py +143 -0
  334. data_sentinel_forge-0.5.0/src/data_sentinel/ui/kit.py +689 -0
  335. data_sentinel_forge-0.5.0/src/data_sentinel/ui/wizard.py +317 -0
  336. data_sentinel_forge-0.5.0/src/data_sentinel/watch/__init__.py +8 -0
  337. data_sentinel_forge-0.5.0/src/data_sentinel/watch/engine.py +241 -0
  338. data_sentinel_forge-0.5.0/tests/__init__.py +0 -0
  339. data_sentinel_forge-0.5.0/tests/benchmarks/__init__.py +0 -0
  340. data_sentinel_forge-0.5.0/tests/benchmarks/test_benchmarks.py +153 -0
  341. data_sentinel_forge-0.5.0/tests/benchmarks/test_benchmarks_cycle3.py +107 -0
  342. data_sentinel_forge-0.5.0/tests/benchmarks/test_benchmarks_cycle4.py +80 -0
  343. data_sentinel_forge-0.5.0/tests/conftest.py +1 -0
  344. data_sentinel_forge-0.5.0/tests/contract/__init__.py +0 -0
  345. data_sentinel_forge-0.5.0/tests/contract/test_interop_contracts.py +129 -0
  346. data_sentinel_forge-0.5.0/tests/contract/test_json_schemas.py +57 -0
  347. data_sentinel_forge-0.5.0/tests/contract/test_quality_contracts.py +87 -0
  348. data_sentinel_forge-0.5.0/tests/contract/test_ts_contract_parity.py +70 -0
  349. data_sentinel_forge-0.5.0/tests/e2e/__init__.py +0 -0
  350. data_sentinel_forge-0.5.0/tests/e2e/test_control_center_e2e.py +104 -0
  351. data_sentinel_forge-0.5.0/tests/e2e/test_cycle5_1_emr.py +141 -0
  352. data_sentinel_forge-0.5.0/tests/e2e/test_cycle5_agentic.py +135 -0
  353. data_sentinel_forge-0.5.0/tests/e2e/test_cycle7_golden.py +213 -0
  354. data_sentinel_forge-0.5.0/tests/e2e/test_cycle7_ops.py +214 -0
  355. data_sentinel_forge-0.5.0/tests/e2e/test_e2e_interop.py +96 -0
  356. data_sentinel_forge-0.5.0/tests/e2e/test_install_golden.py +77 -0
  357. data_sentinel_forge-0.5.0/tests/e2e/test_install_matrix.py +448 -0
  358. data_sentinel_forge-0.5.0/tests/e2e/test_lakehouse_e2e.py +151 -0
  359. data_sentinel_forge-0.5.0/tests/e2e/test_quality_e2e.py +127 -0
  360. data_sentinel_forge-0.5.0/tests/e2e/test_scenarios.py +177 -0
  361. data_sentinel_forge-0.5.0/tests/e2e/test_sse_reliability.py +177 -0
  362. data_sentinel_forge-0.5.0/tests/evals/agentic_evals.json +17 -0
  363. data_sentinel_forge-0.5.0/tests/evals/emr_evals.json +13 -0
  364. data_sentinel_forge-0.5.0/tests/evals/test_evals.py +40 -0
  365. data_sentinel_forge-0.5.0/tests/evaluation/run_cycle8_eval.py +676 -0
  366. data_sentinel_forge-0.5.0/tests/evaluation/run_evaluation.py +360 -0
  367. data_sentinel_forge-0.5.0/tests/evaluation/test_cycle8_eval.py +38 -0
  368. data_sentinel_forge-0.5.0/tests/evaluation/test_evaluation_gate.py +29 -0
  369. data_sentinel_forge-0.5.0/tests/fixtures/emr-ec2-failed-step.json +6 -0
  370. data_sentinel_forge-0.5.0/tests/fixtures/emr-eks-pods.yaml +27 -0
  371. data_sentinel_forge-0.5.0/tests/fixtures/emr-serverless-failed.json +7 -0
  372. data_sentinel_forge-0.5.0/tests/fixtures/installation/plan-matrix.json +1368 -0
  373. data_sentinel_forge-0.5.0/tests/fixtures/lineage/PROVENANCE.json +1 -0
  374. data_sentinel_forge-0.5.0/tests/fixtures/lineage/marquez-real.jsonl +4 -0
  375. data_sentinel_forge-0.5.0/tests/fixtures/quality/deequ_checks.json +10 -0
  376. data_sentinel_forge-0.5.0/tests/fixtures/quality/ge_result.json +14 -0
  377. data_sentinel_forge-0.5.0/tests/fixtures/quality/pydeequ_metrics.json +8 -0
  378. data_sentinel_forge-0.5.0/tests/fixtures/quality/sql_results.json +8 -0
  379. data_sentinel_forge-0.5.0/tests/golden/__init__.py +0 -0
  380. data_sentinel_forge-0.5.0/tests/golden/test_golden.py +68 -0
  381. data_sentinel_forge-0.5.0/tests/integration/__init__.py +0 -0
  382. data_sentinel_forge-0.5.0/tests/integration/test_cli.py +205 -0
  383. data_sentinel_forge-0.5.0/tests/integration/test_cli_groups.py +132 -0
  384. data_sentinel_forge-0.5.0/tests/integration/test_lakehouse_cli.py +54 -0
  385. data_sentinel_forge-0.5.0/tests/integration/test_mcp_stdio.py +88 -0
  386. data_sentinel_forge-0.5.0/tests/performance/__init__.py +0 -0
  387. data_sentinel_forge-0.5.0/tests/regression/__init__.py +0 -0
  388. data_sentinel_forge-0.5.0/tests/security/__init__.py +0 -0
  389. data_sentinel_forge-0.5.0/tests/security/test_api_security.py +324 -0
  390. data_sentinel_forge-0.5.0/tests/security/test_emr_security.py +53 -0
  391. data_sentinel_forge-0.5.0/tests/security/test_security.py +242 -0
  392. data_sentinel_forge-0.5.0/tests/security/test_security_cycle2.py +130 -0
  393. data_sentinel_forge-0.5.0/tests/security/test_security_cycle3.py +147 -0
  394. data_sentinel_forge-0.5.0/tests/security/test_security_cycle4.py +71 -0
  395. data_sentinel_forge-0.5.0/tests/unit/__init__.py +0 -0
  396. data_sentinel_forge-0.5.0/tests/unit/api/test_auth_hardening.py +89 -0
  397. data_sentinel_forge-0.5.0/tests/unit/api/test_control_api.py +206 -0
  398. data_sentinel_forge-0.5.0/tests/unit/api/test_ops_api.py +182 -0
  399. data_sentinel_forge-0.5.0/tests/unit/cost/test_glue_whatif.py +75 -0
  400. data_sentinel_forge-0.5.0/tests/unit/history/test_compare.py +95 -0
  401. data_sentinel_forge-0.5.0/tests/unit/history/test_regression.py +64 -0
  402. data_sentinel_forge-0.5.0/tests/unit/installation/test_assets.py +482 -0
  403. data_sentinel_forge-0.5.0/tests/unit/installation/test_cli.py +193 -0
  404. data_sentinel_forge-0.5.0/tests/unit/installation/test_contracts.py +183 -0
  405. data_sentinel_forge-0.5.0/tests/unit/persistence/test_investigations.py +154 -0
  406. data_sentinel_forge-0.5.0/tests/unit/persistence/test_operations.py +254 -0
  407. data_sentinel_forge-0.5.0/tests/unit/remediation/test_plans.py +133 -0
  408. data_sentinel_forge-0.5.0/tests/unit/test_agent_evidence_integrity.py +83 -0
  409. data_sentinel_forge-0.5.0/tests/unit/test_agent_runtime.py +109 -0
  410. data_sentinel_forge-0.5.0/tests/unit/test_bootstrap.py +23 -0
  411. data_sentinel_forge-0.5.0/tests/unit/test_capability_descriptors.py +37 -0
  412. data_sentinel_forge-0.5.0/tests/unit/test_cli_quality_lineage.py +70 -0
  413. data_sentinel_forge-0.5.0/tests/unit/test_cloudwatch.py +321 -0
  414. data_sentinel_forge-0.5.0/tests/unit/test_compat.py +85 -0
  415. data_sentinel_forge-0.5.0/tests/unit/test_config.py +153 -0
  416. data_sentinel_forge-0.5.0/tests/unit/test_confirmed_evidence_contract.py +128 -0
  417. data_sentinel_forge-0.5.0/tests/unit/test_context.py +74 -0
  418. data_sentinel_forge-0.5.0/tests/unit/test_contracts.py +227 -0
  419. data_sentinel_forge-0.5.0/tests/unit/test_crossaccount.py +84 -0
  420. data_sentinel_forge-0.5.0/tests/unit/test_doctor_adapter.py +151 -0
  421. data_sentinel_forge-0.5.0/tests/unit/test_doctor_correlation.py +373 -0
  422. data_sentinel_forge-0.5.0/tests/unit/test_doctor_export.py +67 -0
  423. data_sentinel_forge-0.5.0/tests/unit/test_emr_cli.py +59 -0
  424. data_sentinel_forge-0.5.0/tests/unit/test_emr_contracts.py +46 -0
  425. data_sentinel_forge-0.5.0/tests/unit/test_emr_cost.py +40 -0
  426. data_sentinel_forge-0.5.0/tests/unit/test_emr_ec2.py +60 -0
  427. data_sentinel_forge-0.5.0/tests/unit/test_emr_eks.py +41 -0
  428. data_sentinel_forge-0.5.0/tests/unit/test_emr_serverless.py +42 -0
  429. data_sentinel_forge-0.5.0/tests/unit/test_emr_shared.py +72 -0
  430. data_sentinel_forge-0.5.0/tests/unit/test_glue_connector.py +232 -0
  431. data_sentinel_forge-0.5.0/tests/unit/test_guardrails_investigate.py +77 -0
  432. data_sentinel_forge-0.5.0/tests/unit/test_iam.py +122 -0
  433. data_sentinel_forge-0.5.0/tests/unit/test_iceberg.py +154 -0
  434. data_sentinel_forge-0.5.0/tests/unit/test_incident.py +159 -0
  435. data_sentinel_forge-0.5.0/tests/unit/test_join_intelligence.py +217 -0
  436. data_sentinel_forge-0.5.0/tests/unit/test_knowledge.py +193 -0
  437. data_sentinel_forge-0.5.0/tests/unit/test_lakehouse_resolver.py +69 -0
  438. data_sentinel_forge-0.5.0/tests/unit/test_lineage_graph.py +68 -0
  439. data_sentinel_forge-0.5.0/tests/unit/test_lineage_openlineage.py +68 -0
  440. data_sentinel_forge-0.5.0/tests/unit/test_log_analyzer.py +153 -0
  441. data_sentinel_forge-0.5.0/tests/unit/test_operations.py +118 -0
  442. data_sentinel_forge-0.5.0/tests/unit/test_orchestrator.py +186 -0
  443. data_sentinel_forge-0.5.0/tests/unit/test_quality_adapters.py +84 -0
  444. data_sentinel_forge-0.5.0/tests/unit/test_quality_contract.py +122 -0
  445. data_sentinel_forge-0.5.0/tests/unit/test_quality_drift.py +96 -0
  446. data_sentinel_forge-0.5.0/tests/unit/test_rag.py +57 -0
  447. data_sentinel_forge-0.5.0/tests/unit/test_reasoning.py +64 -0
  448. data_sentinel_forge-0.5.0/tests/unit/test_spark_config.py +153 -0
  449. data_sentinel_forge-0.5.0/tests/unit/test_spark_plan.py +178 -0
  450. data_sentinel_forge-0.5.0/tests/unit/test_specialists.py +55 -0
  451. data_sentinel_forge-0.5.0/tests/unit/test_sql_analyzer.py +181 -0
  452. data_sentinel_forge-0.5.0/tests/unit/test_sql_evolution.py +159 -0
  453. data_sentinel_forge-0.5.0/tests/unit/test_store.py +186 -0
  454. data_sentinel_forge-0.5.0/tests/unit/test_tool_registry.py +129 -0
  455. data_sentinel_forge-0.5.0/tests/unit/watch/test_watch.py +80 -0
@@ -0,0 +1,38 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+
9
+ # Virtualenvs
10
+ .venv/
11
+ venv/
12
+
13
+ # Tool caches
14
+ .pytest_cache/
15
+ .mypy_cache/
16
+ .ruff_cache/
17
+ .coverage
18
+ coverage.xml
19
+ htmlcov/
20
+
21
+ # Data Sentinel local state
22
+ .data-sentinel/
23
+ data/sentinel.db
24
+
25
+ # Editors / OS
26
+ .idea/
27
+ .vscode/
28
+ .DS_Store
29
+
30
+ graphify-out/
31
+ prompt_evo*md
32
+ prompt_inicial.md
33
+
34
+ # Frontend (Angular)
35
+ node_modules/
36
+ frontend/dist/
37
+ frontend/.angular/
38
+ frontend/coverage/
@@ -0,0 +1,149 @@
1
+ # Changelog
2
+
3
+ All notable changes to Data Sentinel are documented here. The format
4
+ follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
+
6
+ ## [Unreleased]
7
+
8
+ ### Fixed
9
+ - `install` human render now surfaces per-file `note` (e.g. "user-owned,
10
+ not managed — skipped") and the `repaired`/`removed`/`kept`/`skipped`
11
+ lists emitted by repair and uninstall receipts — previously this data
12
+ only existed in `--json` output.
13
+ - `sqlglot` lower bound raised to `>=30` — `exp.Expr` (used across the
14
+ SQL analyzers) only exists in sqlglot 30.x; `>=25` let pip resolve
15
+ versions where `data_sentinel.analyzers.sql` fails at import.
16
+ - `forge.json` / `forge.agentic.json` regenerated — `version` drifted to
17
+ `0.4.0` after the 0.5.0 bump, failing the manifest drift test.
18
+
19
+ ## [0.5.0] - 2026-11-04
20
+
21
+ ### Added
22
+ - **Guided install lifecycle + wizard** — install planning, receipts and
23
+ host-aware guided flow on a real TTY; flags stay non-interactive.
24
+
25
+ ## [0.4.0] - 2026-10-26
26
+
27
+ ### Added
28
+
29
+ - `POST /api/v1/analyze/{id}` now accepts the full tool `inputSchema` —
30
+ multi-input tools (`quality.detect_drift`, `lineage.impact`,
31
+ `doctor.correlate`) and file-free tools (`emr.estimate_cost`) are
32
+ callable through the API. File-like keys resolve under allowed roots
33
+ with the extension allowlist; v1 `{"file": "..."}` stays valid.
34
+ - `sentinel.spark.analyze_plan` emits the parsed plan tree as a typed
35
+ output (`plan` key; `ExecutionPlan.to_dict()` wire shape). The Angular
36
+ plan explorer renders the operator tree.
37
+ - Operational schema v2: `ingestion_checkpoints` table with
38
+ save/get/delete — resumable cursors for streaming ingestion.
39
+ - `X-Request-Id` on every API response (inbound header honored);
40
+ `SentinelError` taxonomy mapped to `{detail, code, details,
41
+ request_id}` envelopes; redacted 500 catch-all.
42
+ - Contract test `test_ts_contract_parity.py` validates
43
+ `frontend/.../api.models.ts` field names against the Python wire
44
+ shapes (8 interfaces).
45
+
46
+ ### Changed
47
+
48
+ - **Distribution renamed to `data-sentinel-forge`** (PyPI name-policy;
49
+ module stays `data_sentinel`, CLI stays `data-sentinel`). Install:
50
+ `pip install data-sentinel-forge`.
51
+ - `PRAGMA busy_timeout=5000` on all SQLite stores (WAL concurrency).
52
+ - `ApiService.analyze` accepts a full inputs object; `AnalyzeRequest`
53
+ generalized to the tool inputSchema shape.
54
+ - Phase-0 baseline audit: `docs/audits/pre-cycle-09-baseline.md`;
55
+ cycle report: `docs/cycles/cycle-09-report.md`.
56
+
57
+ ## [0.3.0] - 2026-10-23
58
+
59
+ ### Fixed
60
+
61
+ - Changelog: PyPI publish for 0.2.2 recorded as blocked (approval-gated
62
+ `pypi` environment).
63
+
64
+ ## [0.2.2] - 2026-10-23
65
+
66
+ ### Security
67
+
68
+ - Vendored `_installkit` backported 1.0.0 -> 1.0.4: stale-lock ownership tokens
69
+ and reclaim race fix, credential redaction covering URL userinfo, unsafe-path
70
+ refusals (`FORGE-INSTALL-UNSAFE-PATH`) in plan/apply/repair/uninstall/prune,
71
+ atomic-write mode preservation, and unsafe ledger entries surfaced in
72
+ `status()`/`doctor` as non-repairable.
73
+
74
+ ## [0.2.1] - 2026-10-21
75
+
76
+ ### Fixed
77
+
78
+ - CLI stdout/stderr reconfigured to UTF-8 at startup — report glyphs (e.g. `⋈`)
79
+ no longer crash on Windows consoles defaulting to cp1252
80
+ (`UnicodeEncodeError` in release smoke).
81
+ - Release workflow: `test_version` reads `__version__` dynamically;
82
+ `install manifest` regenerated for 0.2.x; wheel test builds its own wheel
83
+ when `dist/` is absent (verify-before-build ordering).
84
+
85
+ ## [0.2.0] - 2026-10-21
86
+
87
+ ### Added
88
+
89
+ - Integrations cycle (lf-0030): deterministic doctor x sentinel cross-correlation — `data-sentinel import doctor-bundle --correlate` and `import correlate` merge doctor findings into sentinel diagnostics anchored on declared evidence only (no confidence promotion, no causality claims); `sentinel.doctor.correlate` registry tool.
90
+
91
+ ## [0.1.0] — 2026-10-21
92
+
93
+ First tagged release. Data Sentinel is an independent, offline-first,
94
+ deterministic diagnostics platform for data-engineering workloads —
95
+ Spark, AWS Glue, SQL, lakehouse and EMR — where every finding cites its
96
+ evidence and declares an honest confidence level.
97
+
98
+ ### Added
99
+
100
+ - **Diagnostic core**: `analyze`, `sql analyze`, `spark
101
+ explain|optimize`, `glue inspect|runs|diagnose`, `lakehouse
102
+ metadata|access|policy|operation|compat`, `emr analyze|compare|cost`,
103
+ `quality validate|import`, `lineage ingest|impact`, `investigate run`,
104
+ `capabilities`, `agents`, `tools`, `report show|export`.
105
+ - **Evidence contract**: findings carry `evidence_ids` and statuses
106
+ `CONFIRMED | PROBABLE | POSSIBLE | UNKNOWN`; missing evidence surfaces
107
+ in `limitations` rather than false "healthy" conclusions.
108
+ - **Portable installer** (`data-sentinel install`): interactive and
109
+ `--yes` flows; scopes project/workspace/user; profiles
110
+ minimal/recommended/full; host adapters for Claude, Devin, Codex and
111
+ Copilot (Cursor: partial, no catalog adapter); ownership-aware writes,
112
+ ledger, rollback, drift detection, `status|doctor|repair|uninstall`,
113
+ `install env` environment report.
114
+ - **Agentic surfaces**: 5 host skills (`data-sentinel-investigate`,
115
+ `-spark-plan`, `-sql-review`, `-quality-drift`, `-report`) and 3 agent
116
+ profiles (`sentinel-investigator`, `-reviewer`, `-spark-specialist`)
117
+ shipped in the wheel; `forge.json`/`forge.agentic.json` manifests for
118
+ Forge ecosystem discovery.
119
+ - **MCP server** (`mcp serve`): 20 tools over stdio, read-only roots,
120
+ real handshake validation by the installer.
121
+ - **Optional AWS path**: `glue *` verbs behind the `aws` extra and
122
+ credentials; read-only, with `--dry-run` collection preview.
123
+ - **Angular Control Center** (`frontend/`): investigations, reports,
124
+ evidence explorer and observability UI.
125
+ - **API surface** behind the `api` extra.
126
+
127
+ ### Security
128
+
129
+ - Asset integrity fail-closed via `MANIFEST.sha256` (LF-pinned for
130
+ cross-platform checkout).
131
+ - No remote script execution, no writes outside the authorized scope,
132
+ no silent overwrite of user-owned files, secrets redacted before
133
+ persistence, environment reports emit set/unset only.
134
+ - CI matrix: Linux, macOS, Windows × Python 3.11/3.12.
135
+
136
+ ### Known restrictions
137
+
138
+ - PyPI publication not yet performed; install from source or
139
+ `pip install git+https://github.com/EdgarSocrates98/data-sentinel-forge`.
140
+ - Cursor host is partially supported (no full catalog adapter).
141
+ - Codex does not read project-scope `.mcp.json`; MCP needs user scope
142
+ or `codex mcp add`.
143
+ - The Forge / forge-cli integration is manifest- and docs-level only.
144
+
145
+ [0.1.0]: https://github.com/EdgarSocrates98/data-sentinel-forge/releases/tag/v0.1.0
146
+
147
+ > **PyPI**: `v0.2.2` não publicado — workflow `Release` gated no
148
+ > environment `pypi` (trusted publisher + aprovação humana). Jobs de
149
+ > verify/smoke verdes; publish falhou por design até aprovação do dono.
@@ -0,0 +1,182 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work are terminated
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, provided that You
91
+ meet the following conditions:
92
+
93
+ (a) You must give any other recipients of the Work or Derivative
94
+ Works a copy of this License; and
95
+
96
+ (b) You must cause any modified files to carry prominent notices
97
+ stating that You changed the files; and
98
+
99
+ (c) You must retain, in the Source form of any Derivative Works that
100
+ You distribute, all copyright, patent, trademark, and
101
+ attribution notices from the Source form of the Work,
102
+ excluding those notices that are for attribution only; and
103
+
104
+ (d) If the Work includes a "NOTICE" text file as part of its
105
+ distribution, then any Derivative Works that You distribute must
106
+ include a readable copy of the attribution notices contained
107
+ within such NOTICE file, excluding those notices that are for
108
+ attribution only. You may place your notices with your own
109
+ Derivative Works that You distribute to identify the source of
110
+ the Derivative Works, provided that You do not include a copy of
111
+ the NOTICE itself within that Derivative Work.
112
+
113
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
114
+ any Contribution intentionally submitted for inclusion in the Work
115
+ by You to the Licensor shall be deemed to be a Contribution licensed
116
+ under the same terms and conditions as this License, notwithstanding
117
+ any provision in this section or section 9 that requires a separate
118
+ license agreement granting You additional permissions for the
119
+ Contributions.
120
+
121
+ 6. Trademarks. This License does not grant permission to use the trade
122
+ names, trademarks, service marks, or product names of the Licensor,
123
+ except as required for reasonable and customary use in describing the
124
+ origin of the Work and reproducing the Work.
125
+
126
+ 7. Disclaimer of Warranty. Unless required by applicable law or
127
+ agreed to in writing, Licensor provides the Work (and each
128
+ Contributor provides the Work) on an "AS IS" BASIS,
129
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
130
+ implied, including, without limitation, any warranties or conditions
131
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
132
+ PARTICULAR PURPOSE. You are solely responsible for determining the
133
+ appropriateness of using or redistributing the Work and assume any
134
+ risks associated with Your exercise of permissions under this License.
135
+
136
+ 8. Limitation of Liability. In no event and under no legal theory,
137
+ whether in tort (including negligence), contract, or otherwise,
138
+ unless required by applicable law (such as deliberate and grossly
139
+ negligent acts) or agreed to in writing, will You be liable to any
140
+ Contributor for damages, whether direct, indirect, incidental,
141
+ special, exemplary, or consequential damages (including, but not
142
+ limited to, attorneys' fees, costs of lost profits, or other
143
+ indirect damages) arising out of or relating to this License, even
144
+ if You are advised of the possibility of such damages.
145
+
146
+ 9. Accepting Warranty or Additional Liability. While redistributing
147
+ the Work or Derivative Works thereof, You may choose to offer,
148
+ and charge a fee for, acceptance of support, warranty, indemnity,
149
+ or other liability obligations. However, in accepting such
150
+ obligations, You may act only on Your own behalf and on Your sole
151
+ responsibility, not on behalf of any Contributor, not on behalf of
152
+ any Contributor's ability to enforce this License, and on Your own
153
+ choice of law. Any liability accepted by You under this License
154
+ shall be indicated at the beginning of any reproduction of this
155
+ License.
156
+
157
+ END OF TERMS AND CONDITIONS
158
+
159
+ APPENDIX: How to apply the Apache License to your work.
160
+
161
+ To apply the Apache License to your work, attach the following
162
+ boilerplate notice, with the fields enclosed by brackets "[]"
163
+ replaced with your own identifying information. (Don't include
164
+ the brackets!) The text should be enclosed in the appropriate
165
+ comment syntax for the file format. We also recommend that a
166
+ file or class name and description of purpose be included on the
167
+ same "printed page" as the copyright notice for easier
168
+ identification within third-party archives.
169
+
170
+ Copyright 2026 EdgarSocrates98
171
+
172
+ Licensed under the Apache License, Version 2.0 (the "License");
173
+ you may not use this file except in compliance with the License.
174
+ You may obtain a copy of the License at
175
+
176
+ http://www.apache.org/licenses/LICENSE-2.0
177
+
178
+ Unless required by applicable law or agreed to in writing, software
179
+ distributed under the License is distributed on an "AS IS" BASIS,
180
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
181
+ See the License for the specific language governing permissions and
182
+ limitations under the License.
@@ -0,0 +1,236 @@
1
+ Metadata-Version: 2.5
2
+ Name: data-sentinel-forge
3
+ Version: 0.5.0
4
+ Summary: Data Sentinel — Intelligent Data Engineering & Agentic Diagnostics Platform
5
+ Project-URL: Repository, https://github.com/EdgarSocrates98/data-sentinel-forge
6
+ Project-URL: Issues, https://github.com/EdgarSocrates98/data-sentinel-forge/issues
7
+ Author: EdgarSocrates98
8
+ License-Expression: Apache-2.0
9
+ License-File: LICENSE
10
+ Keywords: data-engineering,diagnostics,glue,spark,sql
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: Apache Software License
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Topic :: Database
18
+ Classifier: Topic :: Software Development :: Quality Assurance
19
+ Requires-Python: >=3.11
20
+ Requires-Dist: pydantic<3,>=2.7
21
+ Requires-Dist: pyyaml>=6.0
22
+ Requires-Dist: sqlglot>=30
23
+ Requires-Dist: typer>=0.12
24
+ Provides-Extra: api
25
+ Requires-Dist: fastapi>=0.110; extra == 'api'
26
+ Requires-Dist: uvicorn>=0.29; extra == 'api'
27
+ Provides-Extra: aws
28
+ Requires-Dist: boto3>=1.34; extra == 'aws'
29
+ Provides-Extra: dev
30
+ Requires-Dist: jsonschema>=4.21; extra == 'dev'
31
+ Requires-Dist: mypy>=1.10; extra == 'dev'
32
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
33
+ Requires-Dist: pytest>=8.0; extra == 'dev'
34
+ Requires-Dist: ruff>=0.5; extra == 'dev'
35
+ Provides-Extra: mcp
36
+ Requires-Dist: mcp>=1.9; extra == 'mcp'
37
+ Provides-Extra: stats
38
+ Requires-Dist: numpy>=1.26; extra == 'stats'
39
+ Requires-Dist: scipy>=1.11; extra == 'stats'
40
+ Description-Content-Type: text/markdown
41
+
42
+ # Data Sentinel
43
+
44
+ <p align="center">
45
+ <img src="docs/assets/logo.png" alt="Data Sentinel logo" width="420" />
46
+ </p>
47
+
48
+ **Intelligent Data Engineering & Agentic Diagnostics Platform.**
49
+
50
+ Ferramenta open source (Apache-2.0) para investigar, analisar e explicar
51
+ problemas em workloads de engenharia de dados — logs Spark/Glue, queries SQL,
52
+ jobs e ambientes lakehouse — com diagnósticos **apoiados em evidência
53
+ auditável**. Nada de causa-raiz inventada: todo achado cita a evidência que o
54
+ sustenta e declara seu nível de confiança.
55
+
56
+ ## O que é
57
+
58
+ - **Análise determinística primeiro**: analyzers executam regras curadas sobre
59
+ artefatos locais; resultados fracos ficam `PROBABLE`/`POSSIBLE`/`UNKNOWN` em
60
+ vez de virar diagnóstico fabricado.
61
+ - **Offline por padrão**: analisa logs e SQL locais sem nenhuma chamada de
62
+ rede ou credencial cloud.
63
+ - **Read-only**: nunca altera recursos de produção; guardas de caminho,
64
+ tamanho e sanitização protegem a entrada.
65
+ - **Auditoria built-in**: evidências são sanitizadas (segredos redigidos) e
66
+ persistidas em SQLite local junto ao relatório versionado.
67
+
68
+ ## Instalação
69
+
70
+ Requer Python ≥ 3.11.
71
+
72
+ ```bash
73
+ # via uv (recomendado para desenvolvimento)
74
+ uv sync
75
+ uv run data-sentinel --help
76
+
77
+ # via pip
78
+ pip install .
79
+ data-sentinel --help
80
+ ```
81
+
82
+ Detalhes: [docs/installation.md](docs/installation.md).
83
+
84
+ ### Instalação agentic
85
+
86
+ Publica skills, agents e o servidor MCP nos hosts suportados (Claude,
87
+ Devin, Codex, Copilot):
88
+
89
+ ```bash
90
+ data-sentinel install # interativo
91
+ data-sentinel install --yes --host all # não-interativo
92
+ data-sentinel install status|doctor|env # lifecycle
93
+ data-sentinel install uninstall # remove só arquivos gerenciados
94
+ ```
95
+
96
+ Guias por escopo/host/plataforma em [docs/installation/](docs/installation/).
97
+
98
+ ## Quickstart
99
+
100
+ ```bash
101
+ # Analisar um log de Glue/Spark (saída real abaixo)
102
+ data-sentinel analyze --file fixtures/logs/glue_oom.log
103
+
104
+ # Análise estática de SQL (AST SQLGlot, dialetos spark/trino)
105
+ data-sentinel sql analyze --file fixtures/joins/high_volume_4tables.sql --dialect spark
106
+
107
+ # Plano físico Spark (EXPLAIN) → árvore + estratégias + limitações
108
+ data-sentinel spark explain --file fixtures/plans/sort_merge_join.txt
109
+
110
+ # Pipeline composto: SQL + joins/cardinalidade + config advisor
111
+ data-sentinel spark optimize --sql query.sql --stats stats.json --config spark-defaults.conf
112
+
113
+ # AWS Glue read-only (requer [aws] + credenciais)
114
+ data-sentinel glue runs --job meu-job --limit 10 --region us-east-1
115
+ data-sentinel glue diagnose --job meu-job --run-id jr_abc --region us-east-1
116
+
117
+ # Saúde da instalação / capacidades / relatórios
118
+ data-sentinel doctor
119
+ data-sentinel capabilities [--descriptors]
120
+ data-sentinel import doctor-bundle -f <arquivo>
121
+ data-sentinel report show --id <report_id> --format markdown
122
+ ```
123
+
124
+ Saída real de `analyze` sobre `fixtures/logs/glue_oom.log`:
125
+
126
+ ```text
127
+ relatório 79e1efef4cd84f94882c76914aa9b760 (schema 1.0.0)
128
+ resumo: 1 achado(s): CONFIRMED=1
129
+
130
+ [HIGH/CONFIRMED] out_of_memory
131
+ Assinatura inequívoca de java.lang.OutOfMemoryError indica que driver ou
132
+ executor estourou o heap disponível. 2 ocorrência(s) no log analisado.
133
+ evidência: fixtures/logs/glue_oom.log:5
134
+ ... Lost task 0.1 ... : java.lang.OutOfMemoryError: Java heap space
135
+ recomendação: Aumentar spark.driver.memory ou spark.executor.memory
136
+ ...
137
+ ```
138
+
139
+ Mais exemplos: [examples/README.md](examples/README.md) e
140
+ [docs/evidence/](docs/evidence/) (saídas capturadas de comandos reais).
141
+
142
+ ## Control Center (Cycle 06)
143
+
144
+ Portal web real sobre o mesmo núcleo — API FastAPI (`data-sentinel serve`,
145
+ bind `127.0.0.1:8790`) + frontend Angular 20 (`frontend/`). Investigações
146
+ agênticas via `/api/v1/investigations`, stream SSE, grafo de evidências,
147
+ explorers de workloads/Spark/qualidade e registry de agentes — sem dado
148
+ simulado.
149
+
150
+ ```bash
151
+ uv run data-sentinel serve --port 8790 # API → /api/v1/*
152
+ cd frontend && npx ng serve --port 4200 # portal → localhost:4200
153
+ ```
154
+
155
+ ![Control Center — visão geral](docs/assets/cycle06/homologation-dashboard-dark.png)
156
+
157
+ Guia completo (endpoints, segurança, limitações):
158
+ [docs/guides/control-center.md](docs/guides/control-center.md).
159
+
160
+ ## Códigos de saída
161
+
162
+ `0` sucesso · `1` erro de domínio/usuário · `2` erro de uso · `3` erro interno.
163
+ Ver [ADR 0006](docs/adr/0006-exit-code-scheme.md).
164
+
165
+ ## Documentação
166
+
167
+ | Doc | Conteúdo |
168
+ |---|---|
169
+ | [docs/installation.md](docs/installation.md) | Instalação e requisitos |
170
+ | [docs/cli.md](docs/cli.md) | Referência dos comandos |
171
+ | [docs/configuration.md](docs/configuration.md) | Perfis, fontes, precedência |
172
+ | [docs/architecture.md](docs/architecture.md) | Arquitetura e módulos |
173
+ | [docs/security.md](docs/security.md) | Guardas, redação, postura read-only |
174
+ | [docs/development.md](docs/development.md) | Setup de dev, testes, lint |
175
+ | [docs/troubleshooting.md](docs/troubleshooting.md) | Erros comuns |
176
+ | [docs/roadmap.md](docs/roadmap.md) | Cycles 02–08 e backlog do Cycle 02 |
177
+ | [docs/validation-matrix.md](docs/validation-matrix.md) | Matriz de validação com evidências |
178
+ | [docs/cycle-01-report.md](docs/cycle-01-report.md) | Relatório final do Cycle 01 |
179
+ | [docs/cycles/cycle-02-final-report.md](docs/cycles/cycle-02-final-report.md) | Relatório final do Cycle 02 |
180
+ | [docs/guides/](docs/guides/) | Guias por funcionalidade (Glue, CloudWatch, plano, SQL, joins, config) |
181
+ | [docs/examples/](docs/examples/) | Exemplos executáveis com saídas reais |
182
+ | [docs/adr/](docs/adr/) | Decisões arquiteturais |
183
+
184
+ ## Estrutura
185
+
186
+ ```text
187
+ src/data_sentinel/
188
+ ├── core/ # contracts, configuration, security, exceptions
189
+ ├── analyzers/ # registry + spark/{log,plans,joins,config} + sql + cloudwatch
190
+ ├── connectors/ # aws/{glue,cloudwatch_logs} — extra [aws], read-only
191
+ ├── diagnostics/ # orchestrator + correlation + timeline
192
+ ├── reporting/ # renderers terminal/JSON/Markdown
193
+ ├── persistence/ # SQLite store + migrations (stdlib)
194
+ ├── api/ # FastAPI app (Cycle 06) — `data-sentinel serve`, /api/v1/*
195
+ ├── agents/ + tools/ + mcp/ # runtime agêntico + registry + MCP (Cycle 05)
196
+ └── cli/ # Typer app
197
+
198
+ frontend/ # Angular 20 Control Center (Cycle 06) — raiz do repo
199
+ ```
200
+
201
+ ## Estado do projeto
202
+
203
+ **Cycle 08.2 implementado** — installer portátil universal: CLI
204
+ `data-sentinel install` (interativo + `--yes`), adapters para
205
+ Claude/Devin/Codex/Copilot (Cursor declarado sem catálogo), 5 skills +
206
+ 3 agents versionados na wheel com `MANIFEST.sha256`, MCP lifecycle
207
+ (`mcp serve`, handshake real), `forge.json`/`forge.agentic.json` para
208
+ descoberta Forge CLI, lifecycle auditável (ledger sha256, receipts,
209
+ repair, uninstall preservando arquivos do usuário) e
210
+ `install env`/`status`/`doctor`. Evidência:
211
+ [docs/cycles/cycle-08-2-final-report.md](docs/cycles/cycle-08-2-final-report.md).
212
+ Cycle 06: Control Center Angular + API
213
+ ([cycle-06](docs/cycles/cycle-06-final-report.md)); ciclo anterior em
214
+ [cycle-08-1](docs/cycles/cycle-08-1-final-report.md).
215
+ **1025 testes Python + 96 specs Angular + ~145 Playwright, ruff+mypy
216
+ strict limpos.**
217
+ Ciclos anteriores: [cycle-05](docs/cycles/cycle-05-final-report.md),
218
+ [05.1](docs/cycles/cycle-05-1-final-report.md),
219
+ [04](docs/cycles/cycle-04-final-report.md).
220
+
221
+ ## Licença
222
+
223
+ Apache-2.0 — ver [LICENSE](LICENSE).
224
+
225
+ ## Cycle 03 — Lakehouse (Iceberg, Lake Formation, cross-account)
226
+
227
+ ```bash
228
+ data-sentinel lakehouse metadata -f metadata.json # Iceberg metadata
229
+ data-sentinel lakehouse access -f contexto.json # cross-account
230
+ data-sentinel lakehouse policy -f policy.json # IAM/S3/KMS offline
231
+ data-sentinel lakehouse operation -f merge.sql # MERGE/APPEND
232
+ data-sentinel lakehouse compat --runtime glue-5.1 --operation merge \
233
+ --access-mode fgac # compatibilidade
234
+ ```
235
+
236
+ Ver `docs/cycles/cycle-03-final-report.md` e guias em `docs/guides/`.