datadoom 0.1.0.dev0__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.
- datadoom-0.1.0.dev0/.claude/settings.local.json +212 -0
- datadoom-0.1.0.dev0/.dockerignore +29 -0
- datadoom-0.1.0.dev0/.github/PULL_REQUEST_TEMPLATE.md +12 -0
- datadoom-0.1.0.dev0/.github/workflows/ci.yml +82 -0
- datadoom-0.1.0.dev0/.github/workflows/docs.yml +50 -0
- datadoom-0.1.0.dev0/.github/workflows/release.yml +144 -0
- datadoom-0.1.0.dev0/.github/workflows/repro-matrix.yml +68 -0
- datadoom-0.1.0.dev0/.gitignore +44 -0
- datadoom-0.1.0.dev0/.pre-commit-config.yaml +25 -0
- datadoom-0.1.0.dev0/.tmp_pdir.txt +1 -0
- datadoom-0.1.0.dev0/CHANGELOG.md +76 -0
- datadoom-0.1.0.dev0/CLAUDE.md +149 -0
- datadoom-0.1.0.dev0/CODE_OF_CONDUCT.md +40 -0
- datadoom-0.1.0.dev0/CONTRIBUTING.md +61 -0
- datadoom-0.1.0.dev0/Dockerfile +49 -0
- datadoom-0.1.0.dev0/Docs/Advanced_System_Documents.md +363 -0
- datadoom-0.1.0.dev0/Docs/Cost_Estimation_Model.md +357 -0
- datadoom-0.1.0.dev0/Docs/DB_Schema&Indexing.md +395 -0
- datadoom-0.1.0.dev0/Docs/DataDoom_Critical_Analysis_and_Recommended_Architecture.md +205 -0
- datadoom-0.1.0.dev0/Docs/DataDoom_PRD_v2_OpenSource.md +281 -0
- datadoom-0.1.0.dev0/Docs/Engineering_Roadmap.md +379 -0
- datadoom-0.1.0.dev0/Docs/File_Structure.md +682 -0
- datadoom-0.1.0.dev0/Docs/HackForge AI User Flow Guide.md +175 -0
- datadoom-0.1.0.dev0/Docs/HackForge AI_ AI-Accelerated Engineering Playbook.md +89 -0
- datadoom-0.1.0.dev0/Docs/Implementation_Guide.md +373 -0
- datadoom-0.1.0.dev0/Docs/Infrastructure_Summary.md +388 -0
- datadoom-0.1.0.dev0/Docs/Internal_Data_Models.md +341 -0
- datadoom-0.1.0.dev0/Docs/Kafka_Event_Contract.md +368 -0
- datadoom-0.1.0.dev0/Docs/Language_Specification.md +309 -0
- datadoom-0.1.0.dev0/Docs/Learning_Guide.md +354 -0
- datadoom-0.1.0.dev0/Docs/Mathematical_Algorithm_Definitions.md +347 -0
- datadoom-0.1.0.dev0/Docs/Microservices_API_Contract.md +336 -0
- datadoom-0.1.0.dev0/Docs/Mulit_Tenant_Isolation.md +340 -0
- datadoom-0.1.0.dev0/Docs/Open_API_Scheme.md +362 -0
- datadoom-0.1.0.dev0/Docs/PRD.md +226 -0
- datadoom-0.1.0.dev0/Docs/Portobuff_Definitions.md +419 -0
- datadoom-0.1.0.dev0/Docs/SLA_SLO_RateLimiting.md +349 -0
- datadoom-0.1.0.dev0/Docs/Security_Compliance.md +403 -0
- datadoom-0.1.0.dev0/Docs/Techincal_Architecture.md +370 -0
- datadoom-0.1.0.dev0/GOVERNANCE.md +31 -0
- datadoom-0.1.0.dev0/LICENSE +202 -0
- datadoom-0.1.0.dev0/PKG-INFO +143 -0
- datadoom-0.1.0.dev0/README.md +80 -0
- datadoom-0.1.0.dev0/SECURITY.md +22 -0
- datadoom-0.1.0.dev0/design/UI_Design_Prompts.md +702 -0
- datadoom-0.1.0.dev0/docs_site/architecture.md +63 -0
- datadoom-0.1.0.dev0/docs_site/authoring.md +9 -0
- datadoom-0.1.0.dev0/docs_site/examples.md +62 -0
- datadoom-0.1.0.dev0/docs_site/index.md +79 -0
- datadoom-0.1.0.dev0/docs_site/llm-reference.md +16 -0
- datadoom-0.1.0.dev0/docs_site/plugins.md +49 -0
- datadoom-0.1.0.dev0/docs_site/spec-reference.md +48 -0
- datadoom-0.1.0.dev0/docs_v2/00_README_Index.md +113 -0
- datadoom-0.1.0.dev0/docs_v2/01_PRD.md +189 -0
- datadoom-0.1.0.dev0/docs_v2/02_User_Flow_Guide.md +191 -0
- datadoom-0.1.0.dev0/docs_v2/03_Technical_Architecture.md +181 -0
- datadoom-0.1.0.dev0/docs_v2/04_DataDoom_Spec_Reference.md +338 -0
- datadoom-0.1.0.dev0/docs_v2/05_Mathematical_Algorithm_Definitions.md +191 -0
- datadoom-0.1.0.dev0/docs_v2/06_Internal_Data_Models.md +240 -0
- datadoom-0.1.0.dev0/docs_v2/07_Database_Schema.md +174 -0
- datadoom-0.1.0.dev0/docs_v2/08_API_Contract.md +212 -0
- datadoom-0.1.0.dev0/docs_v2/09_Plugin_System.md +162 -0
- datadoom-0.1.0.dev0/docs_v2/10_File_Structure.md +168 -0
- datadoom-0.1.0.dev0/docs_v2/11_Language_Technology_Specification.md +132 -0
- datadoom-0.1.0.dev0/docs_v2/12_Resource_Estimation_Model.md +134 -0
- datadoom-0.1.0.dev0/docs_v2/13_Testing_and_Reproducibility_Strategy.md +114 -0
- datadoom-0.1.0.dev0/docs_v2/14_Security_and_Privacy.md +101 -0
- datadoom-0.1.0.dev0/docs_v2/15_Open_Source_Governance.md +114 -0
- datadoom-0.1.0.dev0/docs_v2/16_Engineering_Roadmap.md +139 -0
- datadoom-0.1.0.dev0/docs_v2/17_Implementation_Guide.md +161 -0
- datadoom-0.1.0.dev0/docs_v2/18_AI_Accelerated_Engineering_Playbook.md +111 -0
- datadoom-0.1.0.dev0/docs_v2/19_Learning_Guide.md +144 -0
- datadoom-0.1.0.dev0/docs_v2/20_YAML_Authoring_Guide.md +718 -0
- datadoom-0.1.0.dev0/docs_v2/21_LLM_Spec_Authoring_Reference.md +365 -0
- datadoom-0.1.0.dev0/docs_v2/22_Release_and_Publishing_Runbook.md +177 -0
- datadoom-0.1.0.dev0/examples/causal-fraud.datadoom.yaml +41 -0
- datadoom-0.1.0.dev0/examples/difficulty-credit.datadoom.yaml +62 -0
- datadoom-0.1.0.dev0/examples/failure-fraud.datadoom.yaml +65 -0
- datadoom-0.1.0.dev0/examples/people-realistic.datadoom.yaml +49 -0
- datadoom-0.1.0.dev0/examples/tabular-basic.datadoom.yaml +44 -0
- datadoom-0.1.0.dev0/examples/timeseries-sensor.datadoom.yaml +37 -0
- datadoom-0.1.0.dev0/frontend/index.html +14 -0
- datadoom-0.1.0.dev0/frontend/package-lock.json +3375 -0
- datadoom-0.1.0.dev0/frontend/package.json +34 -0
- datadoom-0.1.0.dev0/frontend/postcss.config.js +6 -0
- datadoom-0.1.0.dev0/frontend/src/App.tsx +36 -0
- datadoom-0.1.0.dev0/frontend/src/components/CausalGraphEditor.tsx +363 -0
- datadoom-0.1.0.dev0/frontend/src/components/CausalGraphView.tsx +197 -0
- datadoom-0.1.0.dev0/frontend/src/components/CausalInspector.tsx +391 -0
- datadoom-0.1.0.dev0/frontend/src/components/ColumnGuideView.tsx +235 -0
- datadoom-0.1.0.dev0/frontend/src/components/ComparisonView.tsx +474 -0
- datadoom-0.1.0.dev0/frontend/src/components/ConfirmHost.tsx +49 -0
- datadoom-0.1.0.dev0/frontend/src/components/DifficultyConfigurator.tsx +251 -0
- datadoom-0.1.0.dev0/frontend/src/components/DifficultyView.tsx +204 -0
- datadoom-0.1.0.dev0/frontend/src/components/ErrorBoundary.tsx +63 -0
- datadoom-0.1.0.dev0/frontend/src/components/ExportModal.tsx +109 -0
- datadoom-0.1.0.dev0/frontend/src/components/FailureBadges.tsx +68 -0
- datadoom-0.1.0.dev0/frontend/src/components/FailureConfigurator.tsx +286 -0
- datadoom-0.1.0.dev0/frontend/src/components/FailureInspector.tsx +393 -0
- datadoom-0.1.0.dev0/frontend/src/components/GenerationsPanel.tsx +273 -0
- datadoom-0.1.0.dev0/frontend/src/components/Histogram.tsx +37 -0
- datadoom-0.1.0.dev0/frontend/src/components/Inspector.tsx +659 -0
- datadoom-0.1.0.dev0/frontend/src/components/Layout.tsx +204 -0
- datadoom-0.1.0.dev0/frontend/src/components/Modal.tsx +134 -0
- datadoom-0.1.0.dev0/frontend/src/components/OverviewView.tsx +235 -0
- datadoom-0.1.0.dev0/frontend/src/components/SpecDrawer.tsx +63 -0
- datadoom-0.1.0.dev0/frontend/src/components/StageStepper.tsx +62 -0
- datadoom-0.1.0.dev0/frontend/src/components/TableCanvas.tsx +473 -0
- datadoom-0.1.0.dev0/frontend/src/components/Toaster.tsx +43 -0
- datadoom-0.1.0.dev0/frontend/src/components/ui.tsx +362 -0
- datadoom-0.1.0.dev0/frontend/src/lib/api.ts +115 -0
- datadoom-0.1.0.dev0/frontend/src/lib/audit.ts +134 -0
- datadoom-0.1.0.dev0/frontend/src/lib/causal.ts +127 -0
- datadoom-0.1.0.dev0/frontend/src/lib/clsx.ts +6 -0
- datadoom-0.1.0.dev0/frontend/src/lib/difficulty.ts +103 -0
- datadoom-0.1.0.dev0/frontend/src/lib/failures.ts +437 -0
- datadoom-0.1.0.dev0/frontend/src/lib/runSocket.ts +61 -0
- datadoom-0.1.0.dev0/frontend/src/lib/sampling.ts +79 -0
- datadoom-0.1.0.dev0/frontend/src/lib/schemaForm.tsx +103 -0
- datadoom-0.1.0.dev0/frontend/src/lib/specDefaults.ts +36 -0
- datadoom-0.1.0.dev0/frontend/src/lib/summary.ts +167 -0
- datadoom-0.1.0.dev0/frontend/src/lib/types.ts +512 -0
- datadoom-0.1.0.dev0/frontend/src/lib/useHistory.ts +123 -0
- datadoom-0.1.0.dev0/frontend/src/lib/viewLayout.ts +25 -0
- datadoom-0.1.0.dev0/frontend/src/main.tsx +24 -0
- datadoom-0.1.0.dev0/frontend/src/pages/Canvas.tsx +735 -0
- datadoom-0.1.0.dev0/frontend/src/pages/Dashboard.tsx +520 -0
- datadoom-0.1.0.dev0/frontend/src/pages/Placeholder.tsx +27 -0
- datadoom-0.1.0.dev0/frontend/src/pages/Plugins.tsx +161 -0
- datadoom-0.1.0.dev0/frontend/src/pages/Results.tsx +545 -0
- datadoom-0.1.0.dev0/frontend/src/pages/Templates.tsx +141 -0
- datadoom-0.1.0.dev0/frontend/src/pages/Tracker.tsx +160 -0
- datadoom-0.1.0.dev0/frontend/src/store/chrome.ts +18 -0
- datadoom-0.1.0.dev0/frontend/src/store/confirm.ts +48 -0
- datadoom-0.1.0.dev0/frontend/src/store/toast.ts +28 -0
- datadoom-0.1.0.dev0/frontend/src/store/ui.ts +30 -0
- datadoom-0.1.0.dev0/frontend/src/styles.css +160 -0
- datadoom-0.1.0.dev0/frontend/tailwind.config.js +63 -0
- datadoom-0.1.0.dev0/frontend/tsconfig.json +23 -0
- datadoom-0.1.0.dev0/frontend/tsconfig.node.json +12 -0
- datadoom-0.1.0.dev0/frontend/tsconfig.node.tsbuildinfo +1 -0
- datadoom-0.1.0.dev0/frontend/tsconfig.tsbuildinfo +1 -0
- datadoom-0.1.0.dev0/frontend/vite.config.d.ts +2 -0
- datadoom-0.1.0.dev0/frontend/vite.config.js +25 -0
- datadoom-0.1.0.dev0/frontend/vite.config.ts +26 -0
- datadoom-0.1.0.dev0/mkdocs.yml +68 -0
- datadoom-0.1.0.dev0/pyproject.toml +225 -0
- datadoom-0.1.0.dev0/src/datadoom/__init__.py +23 -0
- datadoom-0.1.0.dev0/src/datadoom/adapters/__init__.py +29 -0
- datadoom-0.1.0.dev0/src/datadoom/adapters/frameworks.py +94 -0
- datadoom-0.1.0.dev0/src/datadoom/adapters/loaders.py +72 -0
- datadoom-0.1.0.dev0/src/datadoom/api/__init__.py +11 -0
- datadoom-0.1.0.dev0/src/datadoom/api/app.py +109 -0
- datadoom-0.1.0.dev0/src/datadoom/api/deps.py +30 -0
- datadoom-0.1.0.dev0/src/datadoom/api/errors.py +89 -0
- datadoom-0.1.0.dev0/src/datadoom/api/estimate.py +82 -0
- datadoom-0.1.0.dev0/src/datadoom/api/routes/__init__.py +7 -0
- datadoom-0.1.0.dev0/src/datadoom/api/routes/artifacts.py +147 -0
- datadoom-0.1.0.dev0/src/datadoom/api/routes/datasets.py +180 -0
- datadoom-0.1.0.dev0/src/datadoom/api/routes/meta.py +45 -0
- datadoom-0.1.0.dev0/src/datadoom/api/routes/plugins.py +22 -0
- datadoom-0.1.0.dev0/src/datadoom/api/routes/runs.py +144 -0
- datadoom-0.1.0.dev0/src/datadoom/api/routes/specs.py +73 -0
- datadoom-0.1.0.dev0/src/datadoom/api/routes/templates.py +30 -0
- datadoom-0.1.0.dev0/src/datadoom/api/schemas.py +230 -0
- datadoom-0.1.0.dev0/src/datadoom/api/serializers.py +143 -0
- datadoom-0.1.0.dev0/src/datadoom/api/state.py +24 -0
- datadoom-0.1.0.dev0/src/datadoom/api/store_helpers.py +56 -0
- datadoom-0.1.0.dev0/src/datadoom/api/ws.py +72 -0
- datadoom-0.1.0.dev0/src/datadoom/cli/__init__.py +1 -0
- datadoom-0.1.0.dev0/src/datadoom/cli/main.py +313 -0
- datadoom-0.1.0.dev0/src/datadoom/config.py +108 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/__init__.py +38 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/advice.py +289 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/audit.py +290 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/causal/__init__.py +15 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/causal/execute.py +116 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/causal/functions.py +116 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/causal/graph.py +54 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/difficulty/__init__.py +36 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/difficulty/calibrate.py +235 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/difficulty/knobs.py +171 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/difficulty/probes.py +181 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/dist/__init__.py +35 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/dist/base.py +46 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/dist/builtins.py +172 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/dist/compliance.py +344 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/dist/providers.py +117 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/errors.py +32 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/export/__init__.py +27 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/export/base.py +49 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/export/checksums.py +18 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/export/csv_exporter.py +34 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/export/json_exporter.py +67 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/export/metadata.py +58 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/export/parquet_exporter.py +45 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/failure/__init__.py +18 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/failure/apply.py +37 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/failure/base.py +116 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/failure/modes.py +442 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/pipeline.py +418 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/profile.py +327 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/progress.py +14 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/reference.py +338 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/reports.py +206 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/rng.py +79 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/spec/__init__.py +45 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/spec/hashing.py +57 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/spec/models.py +238 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/spec/validate.py +345 -0
- datadoom-0.1.0.dev0/src/datadoom/engine/timeseries.py +88 -0
- datadoom-0.1.0.dev0/src/datadoom/jobs/__init__.py +14 -0
- datadoom-0.1.0.dev0/src/datadoom/jobs/progress.py +155 -0
- datadoom-0.1.0.dev0/src/datadoom/jobs/worker.py +162 -0
- datadoom-0.1.0.dev0/src/datadoom/plugin.py +35 -0
- datadoom-0.1.0.dev0/src/datadoom/plugins/__init__.py +47 -0
- datadoom-0.1.0.dev0/src/datadoom/plugins/contracts.py +72 -0
- datadoom-0.1.0.dev0/src/datadoom/plugins/loader.py +125 -0
- datadoom-0.1.0.dev0/src/datadoom/plugins/registry.py +214 -0
- datadoom-0.1.0.dev0/src/datadoom/plugins/scaffold.py +434 -0
- datadoom-0.1.0.dev0/src/datadoom/store/__init__.py +47 -0
- datadoom-0.1.0.dev0/src/datadoom/store/artifacts.py +67 -0
- datadoom-0.1.0.dev0/src/datadoom/store/db.py +104 -0
- datadoom-0.1.0.dev0/src/datadoom/store/migrations/__init__.py +0 -0
- datadoom-0.1.0.dev0/src/datadoom/store/migrations/env.py +53 -0
- datadoom-0.1.0.dev0/src/datadoom/store/migrations/script.py.mako +24 -0
- datadoom-0.1.0.dev0/src/datadoom/store/migrations/versions/0001_init.py +149 -0
- datadoom-0.1.0.dev0/src/datadoom/store/migrations/versions/0002_report_mutual_information.py +23 -0
- datadoom-0.1.0.dev0/src/datadoom/store/migrations/versions/0003_run_name.py +23 -0
- datadoom-0.1.0.dev0/src/datadoom/store/migrations/versions/0004_report_profile.py +24 -0
- datadoom-0.1.0.dev0/src/datadoom/store/models.py +170 -0
- datadoom-0.1.0.dev0/src/datadoom/store/repositories.py +279 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/__init__.py +239 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/ab_test.datadoom.yaml +46 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/clinical_deterioration.datadoom.yaml +124 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/credit_default_challenge.datadoom.yaml +147 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/customer_churn.datadoom.yaml +60 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/ecommerce_orders.datadoom.yaml +46 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/fraud_detection.datadoom.yaml +57 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/hospital_readmission.datadoom.yaml +61 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/insurance_claims.datadoom.yaml +43 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/iot_sensors.datadoom.yaml +44 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/people_directory.datadoom.yaml +56 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/predictive_maintenance.datadoom.yaml +107 -0
- datadoom-0.1.0.dev0/src/datadoom/templates/telecom_churn_challenge.datadoom.yaml +125 -0
- datadoom-0.1.0.dev0/src/datadoom/version.py +3 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/index-V8VAuTJG.js +445 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/index-doRjyG5s.css +1 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/space-grotesk-latin-ext-wght-normal-D9tNdqV9.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/space-grotesk-latin-wght-normal-BhU9QXUp.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/assets/space-grotesk-vietnamese-wght-normal-D0rl6rjA.woff2 +0 -0
- datadoom-0.1.0.dev0/src/datadoom/webdist/index.html +15 -0
- datadoom-0.1.0.dev0/status.md +564 -0
- datadoom-0.1.0.dev0/testing_guide.md +1514 -0
- datadoom-0.1.0.dev0/tests/api/conftest.py +46 -0
- datadoom-0.1.0.dev0/tests/api/test_api.py +274 -0
- datadoom-0.1.0.dev0/tests/determinism/test_determinism.py +108 -0
- datadoom-0.1.0.dev0/tests/golden/checksums.json +3 -0
- datadoom-0.1.0.dev0/tests/golden/fraud_numeric.datadoom.yaml +27 -0
- datadoom-0.1.0.dev0/tests/perf/test_perf_budget.py +47 -0
- datadoom-0.1.0.dev0/tests/plugin_contract/test_plugins.py +257 -0
- datadoom-0.1.0.dev0/tests/unit/test_adapters.py +97 -0
- datadoom-0.1.0.dev0/tests/unit/test_audit.py +83 -0
- datadoom-0.1.0.dev0/tests/unit/test_causal.py +313 -0
- datadoom-0.1.0.dev0/tests/unit/test_dataset_audit.py +170 -0
- datadoom-0.1.0.dev0/tests/unit/test_difficulty.py +267 -0
- datadoom-0.1.0.dev0/tests/unit/test_difficulty_audit.py +92 -0
- datadoom-0.1.0.dev0/tests/unit/test_dist.py +128 -0
- datadoom-0.1.0.dev0/tests/unit/test_dist_correctness.py +165 -0
- datadoom-0.1.0.dev0/tests/unit/test_export.py +34 -0
- datadoom-0.1.0.dev0/tests/unit/test_export_formats.py +121 -0
- datadoom-0.1.0.dev0/tests/unit/test_failure.py +228 -0
- datadoom-0.1.0.dev0/tests/unit/test_failure_audit.py +245 -0
- datadoom-0.1.0.dev0/tests/unit/test_hashing.py +62 -0
- datadoom-0.1.0.dev0/tests/unit/test_latent.py +138 -0
- datadoom-0.1.0.dev0/tests/unit/test_metadata.py +58 -0
- datadoom-0.1.0.dev0/tests/unit/test_pipeline.py +115 -0
- datadoom-0.1.0.dev0/tests/unit/test_profile.py +201 -0
- datadoom-0.1.0.dev0/tests/unit/test_providers.py +88 -0
- datadoom-0.1.0.dev0/tests/unit/test_reference.py +79 -0
- datadoom-0.1.0.dev0/tests/unit/test_rng.py +45 -0
- datadoom-0.1.0.dev0/tests/unit/test_spec_validate.py +151 -0
- datadoom-0.1.0.dev0/tests/unit/test_store.py +106 -0
- datadoom-0.1.0.dev0/tests/unit/test_templates.py +50 -0
- datadoom-0.1.0.dev0/tests/unit/test_timeseries.py +121 -0
- datadoom-0.1.0.dev0/tests/unit/test_version.py +15 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(curl -s -o /dev/null -w \"%{http_code}\\\\n\" https://pypi.org/pypi/datadoom/json)",
|
|
5
|
+
"Bash(curl -s -o /dev/null -w \"%{http_code}\\\\n\" https://pypi.org/pypi/data-doom/json)",
|
|
6
|
+
"Bash(curl -s -o /dev/null -w \"%{http_code}\\\\n\" https://github.com/datadoom)",
|
|
7
|
+
"Bash(curl -s \"https://api.github.com/search/repositories?q=datadoom\" -H \"Accept: application/vnd.github+json\")",
|
|
8
|
+
"Bash(curl -s \"https://api.github.com/users/datadoom\")",
|
|
9
|
+
"Bash(curl -s -o /dev/null -w \"%{http_code}\\\\n\" https://test.pypi.org/pypi/datadoom/json)",
|
|
10
|
+
"Bash(git remote *)",
|
|
11
|
+
"Bash(git branch *)",
|
|
12
|
+
"Bash(git -C 'd:/Hack Forge' remote -v)",
|
|
13
|
+
"Bash(git -C 'd:/Hack Forge' branch --show-current)",
|
|
14
|
+
"Bash(git -C 'd:/Hack Forge' status -s)",
|
|
15
|
+
"Bash(git config *)",
|
|
16
|
+
"Bash(py -3.12 --version)",
|
|
17
|
+
"Bash(py -3.11 --version)",
|
|
18
|
+
"Bash(python -m pip --version)",
|
|
19
|
+
"Bash(py -3.12 -m pip --version)",
|
|
20
|
+
"Bash(py -3.12 -c \"import venv; print\\('venv ok'\\)\")",
|
|
21
|
+
"Bash(curl -sL https://www.apache.org/licenses/LICENSE-2.0.txt -o LICENSE)",
|
|
22
|
+
"Bash(pip install *)",
|
|
23
|
+
"Bash(python -c \"import datadoom; print\\('version', datadoom.__version__\\)\")",
|
|
24
|
+
"Bash(datadoom validate *)",
|
|
25
|
+
"Bash(datadoom run *)",
|
|
26
|
+
"Bash(datadoom verify *)",
|
|
27
|
+
"Bash(python -c \"import sys; print\\(sys.executable\\)\")",
|
|
28
|
+
"Bash(pip show *)",
|
|
29
|
+
"Bash(python -c \"import datadoom\")",
|
|
30
|
+
"Bash(python -m pip install -e \".[dev]\" import-linter)",
|
|
31
|
+
"Read(//c/Users/santh/AppData/Local/Python/pythoncore-3.14-64/**)",
|
|
32
|
+
"Bash(\"C:\\\\Users\\\\santh\\\\AppData\\\\Local\\\\Python\\\\pythoncore-3.14-64\\\\python.exe\" --version)",
|
|
33
|
+
"Bash(\"C:\\\\Users\\\\santh\\\\AppData\\\\Local\\\\Python\\\\pythoncore-3.14-64\\\\python.exe\" -c \"import datadoom, numpy, scipy, pandas; print\\('datadoom', datadoom.__version__, '| numpy', numpy.__version__, '| pandas', pandas.__version__\\)\")",
|
|
34
|
+
"Bash(.venv/Scripts/python.exe -m pip install --upgrade pip -q)",
|
|
35
|
+
"Bash(.venv/Scripts/python.exe -m pip install -e \".[dev]\")",
|
|
36
|
+
"Bash(.venv/Scripts/datadoom.exe version *)",
|
|
37
|
+
"Bash(.venv/Scripts/lint-imports.exe)",
|
|
38
|
+
"Bash(echo \"lint-imports exit=$?\")",
|
|
39
|
+
"WebSearch",
|
|
40
|
+
"PowerShell(& \".\\\\.venv\\\\Scripts\\\\python.exe\" -m pytest tests/unit/test_dist_correctness.py tests/unit/test_hashing.py tests/unit/test_spec_validate.py tests/unit/test_metadata.py -q)",
|
|
41
|
+
"PowerShell(& \".\\\\.venv\\\\Scripts\\\\python.exe\" -m pytest -q 2>&1)",
|
|
42
|
+
"Bash(.venv/Scripts/python.exe -m pip install -e \".[dev]\" --quiet)",
|
|
43
|
+
"Bash(.venv/Scripts/python.exe -c \"import fastapi, sqlalchemy, alembic, uvicorn, httpx; print\\('ok', fastapi.__version__, sqlalchemy.__version__\\)\")",
|
|
44
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_pipeline.py tests/determinism -q)",
|
|
45
|
+
"Bash(.venv/Scripts/python.exe -c ' *)",
|
|
46
|
+
"Bash(.venv/Scripts/ruff.exe check *)",
|
|
47
|
+
"Bash(.venv/Scripts/mypy.exe)",
|
|
48
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/api tests/unit/test_store.py -q)",
|
|
49
|
+
"Bash(.venv/Scripts/python.exe -m pytest -q)",
|
|
50
|
+
"Bash(.venv/Scripts/python.exe -m pytest)",
|
|
51
|
+
"Bash(npm --version)",
|
|
52
|
+
"Bash(npm install *)",
|
|
53
|
+
"Bash(npm run *)",
|
|
54
|
+
"Bash(.venv/Scripts/python.exe -m datadoom.cli.main --help)",
|
|
55
|
+
"Bash(.venv/Scripts/python.exe -c \"import networkx; print\\('networkx', networkx.__version__\\)\")",
|
|
56
|
+
"Bash(echo \"exit:$?\")",
|
|
57
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_causal.py tests/unit/test_pipeline.py tests/determinism -q)",
|
|
58
|
+
"Bash(.venv/Scripts/datadoom.exe run *)",
|
|
59
|
+
"Bash(.venv/Scripts/datadoom.exe verify *)",
|
|
60
|
+
"Bash(.venv/Scripts/python.exe -c \"import pandas as pd; df=pd.read_csv\\('.tmp_causal/data.csv'\\); print\\(df.head\\(\\)\\); print\\('is_fraud rate', df['is_fraud'].mean\\(\\)\\); print\\('corr age-income', df['age'].corr\\(df['income']\\)\\)\")",
|
|
61
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/determinism tests/unit/test_causal.py tests/api -q)",
|
|
62
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_causal.py -q)",
|
|
63
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_causal.py)",
|
|
64
|
+
"Bash(.venv/Scripts/python.exe .tmp_analyze.py)",
|
|
65
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_dist.py tests/unit/test_dist_correctness.py tests/unit/test_pipeline.py tests/unit/test_metadata.py tests/api -q)",
|
|
66
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_causal.py tests/unit/test_dist.py)",
|
|
67
|
+
"Bash(.venv/Scripts/python.exe -c \"import json; d=json.load\\(open\\('.tmp_run/metadata.json'\\)\\); c=d['compliance']; print\\('score', round\\(c['compliance_score'],3\\), '| applicable', c['applicable_features'], 'of', c['assessed_features']\\); [print\\(' ', f['feature'], f['dist'], 'p=%.3f'%f['p_value'], \\('applicable, '+\\('pass' if f['passed'] else 'FAIL'\\)\\) if f['applicable'] else 'n/a', 'clamped=%.2f'%f['clamped_fraction']\\) for f in c['features']]\")",
|
|
68
|
+
"Bash(rm -rf .tmp_run)",
|
|
69
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_dataset_audit.py -q)",
|
|
70
|
+
"Bash(.venv/Scripts/python.exe -c \"from datadoom.engine import load_spec, generate; import numpy as np, pandas as pd; r=generate\\(load_spec\\('examples/tabular-basic.datadoom.yaml'\\), seed=42\\); d=r.frame; print\\('age mean=%.2f std=%.2f min=%d max=%d int=%s'%\\(d['age'].mean\\(\\), d['age'].std\\(\\), d['age'].min\\(\\), d['age'].max\\(\\), str\\(d['age'].dtype\\)\\)\\); print\\('income median=%.0f \\(target %.0f\\) mean=%.0f \\(target %.0f\\)'%\\(d['income'].median\\(\\), np.exp\\(10.5\\), d['income'].mean\\(\\), np.exp\\(10.5+0.4**2/2\\)\\)\\); print\\('visits mean=%.2f var=%.2f \\(lam=3\\)'%\\(d['visits'].mean\\(\\), d['visits'].var\\(\\)\\)\\); print\\('edu '+str\\({c: round\\(\\(d['education']==c\\).mean\\(\\),3\\) for c in ['hs','college','grad']}\\)\\); print\\('member rate=%.3f'%d['is_member'].mean\\(\\)\\); print\\('note tokens %d..%d'%\\(d['note'].map\\(lambda s: len\\(s.split\\(\\)\\)\\).min\\(\\), d['note'].map\\(lambda s: len\\(s.split\\(\\)\\)\\).max\\(\\)\\)\\); print\\('compliance %.3f applicable=%d of %d'%\\(r.compliance.score, r.compliance.to_dict\\(\\)['applicable_features'], r.compliance.to_dict\\(\\)['assessed_features']\\)\\)\")",
|
|
71
|
+
"Bash(.venv/Scripts/python.exe -c \"from datadoom.engine import load_spec, generate; import numpy as np; r=generate\\(load_spec\\('examples/causal-fraud.datadoom.yaml'\\), seed=42\\); d=r.frame; age=d['age'].to_numpy\\(float\\); edu=d['education'].map\\({'hs':0.,'college':15000.,'grad':40000.}\\).to_numpy\\(\\); inc=d['income'].to_numpy\\(\\); X=np.column_stack\\([np.ones\\(len\\(d\\)\\),age,edu]\\); b,aw,ew=np.linalg.lstsq\\(X,inc,rcond=None\\)[0]; print\\('OLS age_w=%.1f bias=%.0f edu_w=%.3f'%\\(aw,b,ew\\)\\); print\\('noise std=%.0f'%\\(inc-\\(10000+800*age+edu\\)\\).std\\(\\)\\); fr=d['is_fraud'].to_numpy\\(float\\); p=1/\\(1+np.exp\\(-\\(-0.00002*inc+1.0\\)\\)\\); print\\('fraud rate=%.3f theory=%.3f corr=%.3f'%\\(fr.mean\\(\\),p.mean\\(\\),np.corrcoef\\(inc,fr\\)[0,1]\\)\\)\")",
|
|
72
|
+
"Bash(node -e \"console.log\\('reactflow', require\\('reactflow/package.json'\\).version\\)\")",
|
|
73
|
+
"Bash(npx tsc *)",
|
|
74
|
+
"Bash(echo \"tsc-exit:$?\")",
|
|
75
|
+
"Bash(rm -f src/store/theme.ts src/components/ThemeToggle.tsx)",
|
|
76
|
+
"Bash(rmdir src/store)",
|
|
77
|
+
"Bash(npx vite *)",
|
|
78
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests -q -k \"run or migrat or dataset or api\")",
|
|
79
|
+
"Bash(DATADOOM_DB_URL=sqlite:///./.tmp_migtest.db .venv/Scripts/python.exe -c ' *)",
|
|
80
|
+
"Bash(git check-ignore *)",
|
|
81
|
+
"Bash(ls .venv/Scripts/python.exe)",
|
|
82
|
+
"Bash(.venv/Scripts/python.exe -c \"import datadoom, networkx, scipy; print\\('ok', datadoom.__version__\\)\")",
|
|
83
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_failure.py -q)",
|
|
84
|
+
"Bash(.venv/Scripts/python.exe -c \"from datadoom.engine import load_spec, generate; r=generate\\(load_spec\\('examples/failure-fraud.datadoom.yaml'\\), seed=42\\); c,i=r.frame,r.injected; print\\('clean NaN total =', int\\(c.isna\\(\\).sum\\(\\).sum\\(\\)\\)\\); print\\('injected income NaN = %.3f'%i['income'].isna\\(\\).mean\\(\\)\\); print\\('injected age NaN = %.3f'%i['age'].isna\\(\\).mean\\(\\)\\); print\\('is_fraud flipped = %.3f'%\\(c['is_fraud'].to_numpy\\(\\)!=i['is_fraud'].to_numpy\\(\\)\\).mean\\(\\)\\); print\\('leakage corr = %.3f'%__import__\\('numpy'\\).corrcoef\\(i['fraud_score'], c['is_fraud'].to_numpy\\(float\\)\\)[0,1]\\); [print\\(' diff:', m['type'], {k:v for k,v in m.items\\(\\) if k in \\('realized_rate','flipped_fraction','realized_noise_std','total_shift','realized_correlation'\\)}\\) for m in r.report.failures['modes']]\")",
|
|
85
|
+
"Bash(.venv/Scripts/python.exe -c 'from datadoom.engine import parse_spec, generate *)",
|
|
86
|
+
"Bash(.venv/Scripts/python.exe -c 'from datadoom.engine import parse_spec *)",
|
|
87
|
+
"Bash(.venv/Scripts/python.exe -c \"import sklearn; print\\('sklearn', sklearn.__version__\\)\")",
|
|
88
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe .tmp_eval.py)",
|
|
89
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_failure_audit.py -v)",
|
|
90
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_failure_audit.py --no-header -q)",
|
|
91
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_failure_audit.py --collect-only -q)",
|
|
92
|
+
"Bash(xargs grep -ln \"preview\")",
|
|
93
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -c ' *)",
|
|
94
|
+
"Bash(.venv/Scripts/python.exe -c \"import mimesis; print\\(mimesis.__version__\\)\")",
|
|
95
|
+
"Bash(.venv/Scripts/python.exe -m pip install \"mimesis\")",
|
|
96
|
+
"Bash(.venv/Scripts/python.exe -m pip install -e \".[dev]\" -q)",
|
|
97
|
+
"Bash(.venv/Scripts/python.exe -c \"import datadoom, importlib.metadata as m; print\\('import ok'\\); print\\('dist:', m.version\\('datadoom'\\)\\)\")",
|
|
98
|
+
"PowerShell(Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'datadoom|uvicorn|datadoom.exe' } | Select-Object ProcessId, Name, CommandLine | Format-List)",
|
|
99
|
+
"PowerShell(Stop-Process -Id 31788,29824,29312 -Force -ErrorAction SilentlyContinue)",
|
|
100
|
+
"PowerShell(\"stopped\")",
|
|
101
|
+
"Bash(.venv/Scripts/python.exe -c \"import datadoom, importlib.metadata as m; print\\('import ok', m.version\\('datadoom'\\)\\)\")",
|
|
102
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_providers.py tests/determinism/ -q)",
|
|
103
|
+
"Bash(.venv/Scripts/python.exe -c \"import csv; rows=list\\(csv.reader\\(open\\('.tmp_people/data.csv',encoding='utf-8'\\)\\)\\); [print\\(r\\) for r in rows[:4]]\")",
|
|
104
|
+
"PowerShell(\"cleaned\")",
|
|
105
|
+
"Bash(.venv/Scripts/datadoom.exe serve *)",
|
|
106
|
+
"Bash(.venv/Scripts/python.exe -c \"print\\(open\\('status.md',encoding='utf-8'\\).read\\(\\)[-1200:]\\)\")",
|
|
107
|
+
"Bash(curl -s -o /dev/null -w \"%{http_code}\" http://127.0.0.1:8000/)",
|
|
108
|
+
"Bash(node -e \"console.log\\(require\\('./package.json'\\).scripts.build\\)\")",
|
|
109
|
+
"Bash(.venv/Scripts/python.exe -m pip install \"scikit-learn>=1.4,<2\")",
|
|
110
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_difficulty.py -q)",
|
|
111
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_difficulty_audit.py tests/determinism/test_determinism.py -q)",
|
|
112
|
+
"Bash(.venv/Scripts/python.exe -)",
|
|
113
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_failure_audit.py -q)",
|
|
114
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_failure_audit.py -q -W error::FutureWarning)",
|
|
115
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/api/test_api.py::test_difficulty_report_round_trips -q)",
|
|
116
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_latent.py tests/unit/test_hashing.py tests/determinism/ -q)",
|
|
117
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/api/test_api.py -q)",
|
|
118
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/api/test_api.py)",
|
|
119
|
+
"Bash(xargs grep -ln \"plugin\")",
|
|
120
|
+
"Bash(sed -n '1,60p' src/datadoom/engine/export/base.py)",
|
|
121
|
+
"Bash(sed -n '1,108p' src/datadoom/engine/failure/base.py)",
|
|
122
|
+
"Bash(ls tests/*.py)",
|
|
123
|
+
"Bash(find tests *)",
|
|
124
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/plugin_contract/ -q)",
|
|
125
|
+
"Bash(.venv/Scripts/datadoom.exe plugin *)",
|
|
126
|
+
"Bash(.venv/Scripts/python.exe -c \"import tempfile,os; print\\(tempfile.mkdtemp\\(\\)\\)\")",
|
|
127
|
+
"Bash(set /p PDIR=)",
|
|
128
|
+
"Bash(mktemp -d)",
|
|
129
|
+
"Bash(DATADOOM_HOME=__CMDSUB_OUTPUT__ .venv/Scripts/python.exe -c ' *)",
|
|
130
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/plugin_contract tests/api -q)",
|
|
131
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/plugin_contract tests/api)",
|
|
132
|
+
"Bash(.venv/Scripts/python.exe -c \"import importlib.util as u; print\\('pyarrow:', bool\\(u.find_spec\\('pyarrow'\\)\\)\\)\")",
|
|
133
|
+
"Bash(.venv/Scripts/python.exe -m pip install \"pyarrow>=15,<19\" -q)",
|
|
134
|
+
"Bash(.venv/Scripts/python.exe -c \"import pyarrow; print\\('pyarrow', pyarrow.__version__\\)\")",
|
|
135
|
+
"Bash(sed -n '/interface Spec\\\\b/,/^}/p' frontend/src/lib/types.ts)",
|
|
136
|
+
"Bash(sed -n '40,90p' frontend/src/components/ExportModal.tsx)",
|
|
137
|
+
"Bash(grep -n \"useSpecHistory\\\\|const {\\\\|present\\\\|set\\(\\\\|mutate\\\\|=> set\\\\|commit\\\\|pushSpec\\\\|spec,\" frontend/src/pages/Canvas.tsx)",
|
|
138
|
+
"Bash(sed -n '1,30p')",
|
|
139
|
+
"Bash(sed -n '1,40p' frontend/src/lib/useHistory.ts)",
|
|
140
|
+
"Bash(.venv/Scripts/datadoom.exe template *)",
|
|
141
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/determinism tests/golden tests/unit/test_export_formats.py tests/unit/test_templates.py)",
|
|
142
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_templates.py tests/api/test_api.py -q)",
|
|
143
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/unit/test_templates.py tests/api/test_api.py)",
|
|
144
|
+
"Bash(ls src/datadoom/templates/builtin/)",
|
|
145
|
+
"Bash(find src/datadoom/templates -name \"*.yaml\")",
|
|
146
|
+
"Bash(.venv/Scripts/datadoom.exe validate *)",
|
|
147
|
+
"Bash(.venv/Scripts/python.exe -m pytest tests/ -q -k \"template or api\")",
|
|
148
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m pytest tests/unit/test_profile.py -q)",
|
|
149
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m ruff check src tests)",
|
|
150
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/lint-imports.exe)",
|
|
151
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m mypy)",
|
|
152
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m pytest -q)",
|
|
153
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m pytest)",
|
|
154
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -c \"print\\(open\\('status.md',encoding='utf-8'\\).read\\(\\)[:3500]\\)\")",
|
|
155
|
+
"Bash(echo \"ruff: $?\")",
|
|
156
|
+
"Bash(echo \"lint-imports: $?\")",
|
|
157
|
+
"Bash(echo \"mypy: $?\")",
|
|
158
|
+
"Bash(echo \"pytest: $?\")",
|
|
159
|
+
"Read(//tmp/**)",
|
|
160
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m pytest tests/api tests/determinism tests/unit/test_metadata.py tests/unit/test_export_formats.py tests/unit/test_store.py -q)",
|
|
161
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m pytest tests/api/test_api.py::test_resolved_spec_is_locked_and_downloadable -q)",
|
|
162
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m pytest tests/api/test_api.py::test_resolved_spec_is_locked_and_downloadable)",
|
|
163
|
+
"Bash(echo \"ruff:$?\")",
|
|
164
|
+
"Bash(echo \"lint-imports:$?\")",
|
|
165
|
+
"Bash(echo \"mypy:$?\")",
|
|
166
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m pytest tests/api tests/determinism tests/unit/test_metadata.py tests/unit/test_export_formats.py -q)",
|
|
167
|
+
"Bash(PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m pytest tests/unit/test_audit.py -q)",
|
|
168
|
+
"Bash(./.venv/Scripts/python.exe -m pytest -q)",
|
|
169
|
+
"Bash(./.venv/Scripts/ruff.exe check *)",
|
|
170
|
+
"Bash(./.venv/Scripts/lint-imports.exe)",
|
|
171
|
+
"Bash(./.venv/Scripts/python.exe -m pytest)",
|
|
172
|
+
"Bash(ls README.md CHANGELOG.md CONTRIBUTING.md)",
|
|
173
|
+
"Bash(head -20 README.md)",
|
|
174
|
+
"Bash(./.venv/Scripts/python.exe -c \"from datadoom.templates import CATALOG; [print\\(t.id, '|', t.level, '|', t.domain, '|', t.title\\) for t in CATALOG]\")",
|
|
175
|
+
"Bash(./.venv/Scripts/python.exe -c \"from datadoom.templates import CATALOG; t=CATALOG[0]; print\\([f for f in t.__dict__]\\); print\\('---'\\); [print\\(f'{x.id} | {getattr\\(x,\\\\\"level\\\\\",\\\\\"?\\\\\"\\)} | {x.domain} | {x.name}'\\) for x in CATALOG]\")",
|
|
176
|
+
"Bash(./.venv/Scripts/python.exe -m pip install -e \".[docs]\")",
|
|
177
|
+
"Bash(./.venv/Scripts/python.exe -c \"import datadoom; print\\('datadoom OK', datadoom.__version__\\)\")",
|
|
178
|
+
"Bash(./.venv/Scripts/python.exe -c \"import mkdocs, material; print\\('mkdocs OK'\\)\")",
|
|
179
|
+
"Bash(./.venv/Scripts/python.exe -m mkdocs build --strict)",
|
|
180
|
+
"Bash(echo \"exit=$?\")",
|
|
181
|
+
"Bash(./.venv/Scripts/python.exe -m pip install -e . --no-deps)",
|
|
182
|
+
"Bash(grep -nE \"^/?site|^site/|webdist|\\\\.tmp\" .gitignore)",
|
|
183
|
+
"Bash(echo \"---exit $?---\")",
|
|
184
|
+
"Bash(./.venv/Scripts/python.exe -m ruff check src tests)",
|
|
185
|
+
"Bash(./.venv/Scripts/python.exe -m importlinter.cli lint)",
|
|
186
|
+
"Bash(./.venv/Scripts/datadoom.exe version *)",
|
|
187
|
+
"Bash(ls -d .venv/Lib/site-packages/~*)",
|
|
188
|
+
"Bash(rm -rf .venv/Lib/site-packages/~*)",
|
|
189
|
+
"Bash(./.venv/Scripts/python.exe -c \"import datadoom; print\\('import OK', datadoom.__version__\\)\")",
|
|
190
|
+
"Bash(./.venv/Scripts/python.exe -c \"import build; print\\('build', build.__version__\\)\")",
|
|
191
|
+
"Bash(./.venv/Scripts/python.exe -m pip install -q build)",
|
|
192
|
+
"Bash(./.venv/Scripts/python.exe -m build)",
|
|
193
|
+
"Bash(./.venv/Scripts/python.exe -c \"import zipfile; z=zipfile.ZipFile\\([f for f in __import__\\('glob'\\).glob\\('dist/*.whl'\\)][0]\\); n=z.namelist\\(\\); print\\('webdist/index.html:', any\\(x.endswith\\('webdist/index.html'\\) for x in n\\)\\); print\\('templates yaml count:', sum\\(1 for x in n if x.endswith\\('.yaml'\\) and 'templates' in x\\)\\); print\\('total files:', len\\(n\\)\\)\")",
|
|
194
|
+
"Bash(./.venv/Scripts/python.exe -m pip install -q twine)",
|
|
195
|
+
"Bash(./.venv/Scripts/python.exe -m twine check dist/*)",
|
|
196
|
+
"Bash(./.venv/Scripts/python.exe -c \"import zipfile,glob; z=zipfile.ZipFile\\(glob.glob\\('dist/*.whl'\\)[0]\\); n=z.namelist\\(\\); print\\('webdist/index.html in wheel:', any\\(x.endswith\\('webdist/index.html'\\) for x in n\\)\\); print\\('webdist asset files:', sum\\(1 for x in n if 'webdist/assets/' in x\\)\\); import tarfile; t=tarfile.open\\(glob.glob\\('dist/*.tar.gz'\\)[0]\\); tn=t.getnames\\(\\); print\\('webdist/index.html in sdist:', any\\(x.endswith\\('webdist/index.html'\\) for x in tn\\)\\)\")",
|
|
197
|
+
"Bash(./.tmp_smoke/Scripts/datadoom.exe version *)",
|
|
198
|
+
"Bash(./.tmp_smoke/Scripts/datadoom.exe run *)",
|
|
199
|
+
"Bash(./.tmp_smoke/Scripts/python.exe -c \"import importlib.resources as r; print\\('web Canvas bundled OK' if \\(r.files\\('datadoom'\\)/'webdist'/'index.html'\\).is_file\\(\\) else 'MISSING'\\)\")",
|
|
200
|
+
"Bash(rm -rf .tmp_smoke .tmp_smoke_run)",
|
|
201
|
+
"Bash(docker --version)",
|
|
202
|
+
"Bash(docker build *)",
|
|
203
|
+
"Bash(./.venv/Scripts/mypy.exe)",
|
|
204
|
+
"Bash(./.venv/Scripts/python.exe -c \"import platform, numpy as np; print\\(f'{platform.system\\(\\)}-{platform.machine\\(\\)}-numpy-{np.__version__}'\\)\")",
|
|
205
|
+
"Bash(./.venv/Scripts/python.exe -c \"from datadoom.engine import generate, load_spec; import tempfile; r=generate\\(load_spec\\('tests/golden/fraud_numeric.datadoom.yaml'\\), seed=12345, out_dir=tempfile.mkdtemp\\(\\)\\); print\\(r.artifacts[0].checksum_sha256\\)\")",
|
|
206
|
+
"Bash(./.venv/Scripts/python.exe -m pytest tests/determinism -q)",
|
|
207
|
+
"Bash(./.venv/Scripts/python.exe -m pytest tests/perf -q)",
|
|
208
|
+
"Bash(./.venv/Scripts/python.exe -m pytest -m perf -q)",
|
|
209
|
+
"Bash(./.venv/Scripts/python.exe -m pytest -m perf)"
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Keep the build context small and the image clean.
|
|
2
|
+
.git
|
|
3
|
+
.gitignore
|
|
4
|
+
.github
|
|
5
|
+
.venv
|
|
6
|
+
**/__pycache__
|
|
7
|
+
**/*.pyc
|
|
8
|
+
*.egg-info
|
|
9
|
+
src/*.egg-info
|
|
10
|
+
|
|
11
|
+
# Frontend build inputs/outputs are produced fresh in the Node stage.
|
|
12
|
+
frontend/node_modules
|
|
13
|
+
frontend/dist
|
|
14
|
+
src/datadoom/webdist
|
|
15
|
+
|
|
16
|
+
# Docs site build output + legacy doc sets (not needed at runtime).
|
|
17
|
+
site
|
|
18
|
+
docs
|
|
19
|
+
Docs
|
|
20
|
+
|
|
21
|
+
# Tests and scratch/run output.
|
|
22
|
+
tests
|
|
23
|
+
.tmp_run
|
|
24
|
+
.tmp_*
|
|
25
|
+
out
|
|
26
|
+
tmp
|
|
27
|
+
dist
|
|
28
|
+
build
|
|
29
|
+
*.local.yaml
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## What & why
|
|
2
|
+
|
|
3
|
+
<!-- A short description of the change and the motivation. Link the issue/DDEP. -->
|
|
4
|
+
|
|
5
|
+
## Checklist
|
|
6
|
+
|
|
7
|
+
- [ ] Tests added/updated (unit, and determinism tests for any stochastic code)
|
|
8
|
+
- [ ] Docs updated if user-facing (`docs_v2/` and/or `CHANGELOG.md`)
|
|
9
|
+
- [ ] Local gates pass: `ruff check`, `mypy`, `lint-imports`, `pytest`
|
|
10
|
+
- [ ] Architecture upheld: `engine/` stays framework-free; all randomness via `engine.rng`
|
|
11
|
+
- [ ] Spec changes are additive within `datadoom_version: 1`
|
|
12
|
+
- [ ] Commits are DCO **signed off** (`git commit -s`)
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: ci-${{ github.ref }}
|
|
10
|
+
cancel-in-progress: true
|
|
11
|
+
|
|
12
|
+
env:
|
|
13
|
+
# Pin BLAS to a single thread so the determinism guarantee holds on CI.
|
|
14
|
+
OMP_NUM_THREADS: "1"
|
|
15
|
+
OPENBLAS_NUM_THREADS: "1"
|
|
16
|
+
MKL_NUM_THREADS: "1"
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
quality:
|
|
20
|
+
name: lint + type + import-lint (${{ matrix.os }}, py${{ matrix.python }})
|
|
21
|
+
runs-on: ${{ matrix.os }}
|
|
22
|
+
strategy:
|
|
23
|
+
fail-fast: false
|
|
24
|
+
matrix:
|
|
25
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
26
|
+
python: ["3.11", "3.12"]
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v4
|
|
29
|
+
- uses: actions/setup-python@v5
|
|
30
|
+
with:
|
|
31
|
+
python-version: ${{ matrix.python }}
|
|
32
|
+
- name: Install
|
|
33
|
+
run: |
|
|
34
|
+
python -m pip install --upgrade pip
|
|
35
|
+
python -m pip install -e ".[dev]"
|
|
36
|
+
- name: Ruff (lint)
|
|
37
|
+
run: ruff check src tests
|
|
38
|
+
- name: Mypy (type-check engine strict)
|
|
39
|
+
run: mypy
|
|
40
|
+
- name: Import boundaries
|
|
41
|
+
run: lint-imports
|
|
42
|
+
- name: Tests
|
|
43
|
+
run: pytest
|
|
44
|
+
|
|
45
|
+
perf:
|
|
46
|
+
name: perf budget
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
# Non-gating: wall-clock budgets are informational and must not block a merge
|
|
49
|
+
# on runner jitter, but a real regression (e.g. an O(n^2) hot path) shows red.
|
|
50
|
+
continue-on-error: true
|
|
51
|
+
steps:
|
|
52
|
+
- uses: actions/checkout@v4
|
|
53
|
+
- uses: actions/setup-python@v5
|
|
54
|
+
with:
|
|
55
|
+
python-version: "3.12"
|
|
56
|
+
- name: Install
|
|
57
|
+
run: |
|
|
58
|
+
python -m pip install --upgrade pip
|
|
59
|
+
python -m pip install -e ".[dev]"
|
|
60
|
+
- name: Perf budget
|
|
61
|
+
run: pytest -m perf -v
|
|
62
|
+
|
|
63
|
+
docker:
|
|
64
|
+
name: docker image build + smoke
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
# Non-gating: a Docker/registry hiccup must not block a code merge, but a
|
|
67
|
+
# broken Dockerfile still shows up red on the PR.
|
|
68
|
+
continue-on-error: true
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@v4
|
|
71
|
+
- uses: docker/setup-buildx-action@v3
|
|
72
|
+
- name: Build image
|
|
73
|
+
uses: docker/build-push-action@v6
|
|
74
|
+
with:
|
|
75
|
+
context: .
|
|
76
|
+
push: false
|
|
77
|
+
load: true
|
|
78
|
+
tags: datadoom:ci
|
|
79
|
+
- name: Smoke (CLI + bundled web Canvas)
|
|
80
|
+
run: |
|
|
81
|
+
docker run --rm datadoom:ci datadoom version
|
|
82
|
+
docker run --rm datadoom:ci python -c "import importlib.resources as r; assert (r.files('datadoom') / 'webdist' / 'index.html').is_file(); print('web Canvas bundled OK')"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
# Builds the mkdocs-material site. On pull requests it only *builds* (a broken
|
|
4
|
+
# build fails the check); on a push to main it builds and publishes to GitHub
|
|
5
|
+
# Pages via the gh-pages branch. Enable Pages once (Settings → Pages → Deploy
|
|
6
|
+
# from branch: gh-pages) — see docs_v2/22_Release_and_Publishing_Runbook.md.
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
push:
|
|
10
|
+
branches: [main]
|
|
11
|
+
paths:
|
|
12
|
+
- "docs_site/**"
|
|
13
|
+
- "docs_v2/**"
|
|
14
|
+
- "mkdocs.yml"
|
|
15
|
+
- ".github/workflows/docs.yml"
|
|
16
|
+
pull_request:
|
|
17
|
+
paths:
|
|
18
|
+
- "docs_site/**"
|
|
19
|
+
- "docs_v2/**"
|
|
20
|
+
- "mkdocs.yml"
|
|
21
|
+
- ".github/workflows/docs.yml"
|
|
22
|
+
workflow_dispatch:
|
|
23
|
+
|
|
24
|
+
permissions:
|
|
25
|
+
contents: write
|
|
26
|
+
|
|
27
|
+
concurrency:
|
|
28
|
+
group: docs-${{ github.ref }}
|
|
29
|
+
cancel-in-progress: true
|
|
30
|
+
|
|
31
|
+
jobs:
|
|
32
|
+
build:
|
|
33
|
+
name: build site
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v4
|
|
37
|
+
with:
|
|
38
|
+
fetch-depth: 0
|
|
39
|
+
- uses: actions/setup-python@v5
|
|
40
|
+
with:
|
|
41
|
+
python-version: "3.12"
|
|
42
|
+
- name: Install docs tooling
|
|
43
|
+
run: |
|
|
44
|
+
python -m pip install --upgrade pip
|
|
45
|
+
python -m pip install -e ".[docs]"
|
|
46
|
+
- name: Build (verify)
|
|
47
|
+
run: mkdocs build --strict
|
|
48
|
+
- name: Deploy to GitHub Pages
|
|
49
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
50
|
+
run: mkdocs gh-deploy --force
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Tag-driven, tokenless release. Cutting a release is just:
|
|
4
|
+
# git tag -s vX.Y.Z && git push origin main --tags
|
|
5
|
+
# See docs_v2/22_Release_and_Publishing_Runbook.md for the one-time PyPI Trusted
|
|
6
|
+
# Publisher + GitHub Environment setup. There are NO long-lived secrets — PyPI
|
|
7
|
+
# upload and provenance signing both use short-lived GitHub OIDC tokens.
|
|
8
|
+
|
|
9
|
+
on:
|
|
10
|
+
push:
|
|
11
|
+
tags: ["v*"]
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
env:
|
|
18
|
+
OMP_NUM_THREADS: "1"
|
|
19
|
+
OPENBLAS_NUM_THREADS: "1"
|
|
20
|
+
MKL_NUM_THREADS: "1"
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
build:
|
|
24
|
+
name: build sdist + wheel (with web Canvas) + smoke
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
|
|
29
|
+
# The web Canvas is compiled into src/datadoom/webdist/ and shipped inside
|
|
30
|
+
# the wheel (gitignored in source), so the release build must build it first.
|
|
31
|
+
- uses: actions/setup-node@v4
|
|
32
|
+
with:
|
|
33
|
+
node-version: "20"
|
|
34
|
+
cache: npm
|
|
35
|
+
cache-dependency-path: frontend/package-lock.json
|
|
36
|
+
- name: Build web Canvas -> webdist
|
|
37
|
+
working-directory: frontend
|
|
38
|
+
run: |
|
|
39
|
+
npm ci
|
|
40
|
+
npm run build
|
|
41
|
+
|
|
42
|
+
- uses: actions/setup-python@v5
|
|
43
|
+
with:
|
|
44
|
+
python-version: "3.12"
|
|
45
|
+
- name: Build distributions
|
|
46
|
+
run: |
|
|
47
|
+
python -m pip install --upgrade pip build twine
|
|
48
|
+
python -m build
|
|
49
|
+
python -m twine check dist/*
|
|
50
|
+
|
|
51
|
+
- name: Smoke-test the built wheel in a clean venv
|
|
52
|
+
run: |
|
|
53
|
+
python -m venv /tmp/smoke
|
|
54
|
+
/tmp/smoke/bin/python -m pip install --upgrade pip
|
|
55
|
+
/tmp/smoke/bin/python -m pip install dist/*.whl
|
|
56
|
+
/tmp/smoke/bin/datadoom version
|
|
57
|
+
# The shipped wheel must regenerate deterministically and include the SPA.
|
|
58
|
+
/tmp/smoke/bin/datadoom run examples/tabular-basic.datadoom.yaml --seed 7 --out /tmp/smoke_run
|
|
59
|
+
/tmp/smoke/bin/python -c "import datadoom, importlib.resources as r; assert (r.files('datadoom') / 'webdist' / 'index.html').is_file(), 'webdist missing from wheel'; print('web Canvas bundled OK')"
|
|
60
|
+
|
|
61
|
+
- uses: actions/upload-artifact@v4
|
|
62
|
+
with:
|
|
63
|
+
name: dist
|
|
64
|
+
path: dist/
|
|
65
|
+
|
|
66
|
+
provenance:
|
|
67
|
+
name: sign build provenance (keyless)
|
|
68
|
+
needs: build
|
|
69
|
+
runs-on: ubuntu-latest
|
|
70
|
+
permissions:
|
|
71
|
+
id-token: write # mint the OIDC token Sigstore signs with
|
|
72
|
+
attestations: write # write the attestation to the repo
|
|
73
|
+
contents: read
|
|
74
|
+
steps:
|
|
75
|
+
- uses: actions/download-artifact@v4
|
|
76
|
+
with:
|
|
77
|
+
name: dist
|
|
78
|
+
path: dist
|
|
79
|
+
- uses: actions/attest-build-provenance@v1
|
|
80
|
+
with:
|
|
81
|
+
subject-path: "dist/*"
|
|
82
|
+
|
|
83
|
+
github-release:
|
|
84
|
+
name: GitHub Release
|
|
85
|
+
needs: build
|
|
86
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
87
|
+
runs-on: ubuntu-latest
|
|
88
|
+
permissions:
|
|
89
|
+
contents: write
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/download-artifact@v4
|
|
92
|
+
with:
|
|
93
|
+
name: dist
|
|
94
|
+
path: dist
|
|
95
|
+
- uses: softprops/action-gh-release@v2
|
|
96
|
+
with:
|
|
97
|
+
files: dist/*
|
|
98
|
+
generate_release_notes: true
|
|
99
|
+
|
|
100
|
+
pypi:
|
|
101
|
+
name: publish to PyPI (OIDC trusted publishing)
|
|
102
|
+
needs: build
|
|
103
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
104
|
+
runs-on: ubuntu-latest
|
|
105
|
+
environment: pypi # register this env + the trusted publisher on PyPI
|
|
106
|
+
permissions:
|
|
107
|
+
id-token: write # tokenless upload via OIDC
|
|
108
|
+
steps:
|
|
109
|
+
- uses: actions/download-artifact@v4
|
|
110
|
+
with:
|
|
111
|
+
name: dist
|
|
112
|
+
path: dist
|
|
113
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
114
|
+
|
|
115
|
+
docker:
|
|
116
|
+
name: build + push image (GHCR)
|
|
117
|
+
needs: build
|
|
118
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
119
|
+
runs-on: ubuntu-latest
|
|
120
|
+
permissions:
|
|
121
|
+
contents: read
|
|
122
|
+
packages: write
|
|
123
|
+
steps:
|
|
124
|
+
- uses: actions/checkout@v4
|
|
125
|
+
- uses: docker/setup-buildx-action@v3
|
|
126
|
+
- uses: docker/login-action@v3
|
|
127
|
+
with:
|
|
128
|
+
registry: ghcr.io
|
|
129
|
+
username: ${{ github.actor }}
|
|
130
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
131
|
+
- id: meta
|
|
132
|
+
uses: docker/metadata-action@v5
|
|
133
|
+
with:
|
|
134
|
+
images: ghcr.io/${{ github.repository }}
|
|
135
|
+
tags: |
|
|
136
|
+
type=semver,pattern={{version}}
|
|
137
|
+
type=semver,pattern={{major}}.{{minor}}
|
|
138
|
+
type=raw,value=latest
|
|
139
|
+
- uses: docker/build-push-action@v6
|
|
140
|
+
with:
|
|
141
|
+
context: .
|
|
142
|
+
push: true
|
|
143
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
144
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
name: Reproducibility Matrix
|
|
2
|
+
|
|
3
|
+
# Proves the headline guarantee: on the pinned path, the same (spec_hash, seed)
|
|
4
|
+
# yields a bitwise-identical artifact. Runs the determinism gate across OSes and
|
|
5
|
+
# Python versions. See docs_v2/13_Testing_and_Reproducibility_Strategy.md.
|
|
6
|
+
#
|
|
7
|
+
# Scope (per doc 13): the BITWISE guarantee holds within a single OS/arch on the
|
|
8
|
+
# pinned dependency set; across OS/arch we claim statistical (not bitwise)
|
|
9
|
+
# equivalence. So numpy is pinned to the version the golden checksum was recorded
|
|
10
|
+
# against, and the golden checksum is keyed per platform. Cells whose platform is
|
|
11
|
+
# not yet recorded SKIP and print the value to record (see the job summary).
|
|
12
|
+
|
|
13
|
+
on:
|
|
14
|
+
push:
|
|
15
|
+
branches: [main]
|
|
16
|
+
pull_request:
|
|
17
|
+
workflow_dispatch:
|
|
18
|
+
|
|
19
|
+
env:
|
|
20
|
+
OMP_NUM_THREADS: "1"
|
|
21
|
+
OPENBLAS_NUM_THREADS: "1"
|
|
22
|
+
MKL_NUM_THREADS: "1"
|
|
23
|
+
# Pin numpy to the version the golden checksums are recorded against so the
|
|
24
|
+
# golden gate asserts (rather than skipping on version drift). numpy's random
|
|
25
|
+
# streams are the determinism-critical dependency for the numeric golden spec.
|
|
26
|
+
DATADOOM_PINNED_NUMPY: "2.4.6"
|
|
27
|
+
|
|
28
|
+
jobs:
|
|
29
|
+
repro:
|
|
30
|
+
name: determinism (${{ matrix.os }}, py${{ matrix.python }})
|
|
31
|
+
runs-on: ${{ matrix.os }}
|
|
32
|
+
strategy:
|
|
33
|
+
fail-fast: false
|
|
34
|
+
matrix:
|
|
35
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
36
|
+
python: ["3.11", "3.12"]
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v4
|
|
39
|
+
- uses: actions/setup-python@v5
|
|
40
|
+
with:
|
|
41
|
+
python-version: ${{ matrix.python }}
|
|
42
|
+
- name: Install (pinned numpy)
|
|
43
|
+
run: |
|
|
44
|
+
python -m pip install --upgrade pip
|
|
45
|
+
python -m pip install -e ".[dev]" "numpy==${{ env.DATADOOM_PINNED_NUMPY }}"
|
|
46
|
+
- name: Determinism gate
|
|
47
|
+
run: pytest tests/determinism -v
|
|
48
|
+
- name: CLI verify round-trip
|
|
49
|
+
run: |
|
|
50
|
+
datadoom run examples/tabular-basic.datadoom.yaml --seed 7 --out _run
|
|
51
|
+
datadoom verify examples/tabular-basic.datadoom.yaml --seed 7 --against _run
|
|
52
|
+
- name: Report golden checksum for this cell
|
|
53
|
+
if: always()
|
|
54
|
+
shell: bash
|
|
55
|
+
run: |
|
|
56
|
+
python - <<'PY' | tee -a "$GITHUB_STEP_SUMMARY"
|
|
57
|
+
import platform, tempfile
|
|
58
|
+
import numpy as np
|
|
59
|
+
from datadoom.engine import generate, load_spec
|
|
60
|
+
r = generate(load_spec("tests/golden/fraud_numeric.datadoom.yaml"),
|
|
61
|
+
seed=12345, out_dir=tempfile.mkdtemp())
|
|
62
|
+
key = f"{platform.system()}-{platform.machine()}-numpy-{np.__version__}"
|
|
63
|
+
print(f"### Golden checksum")
|
|
64
|
+
print(f'`"{key}": "{r.artifacts[0].checksum_sha256}"`')
|
|
65
|
+
print("")
|
|
66
|
+
print("Add the line above to `tests/golden/checksums.json` to turn this "
|
|
67
|
+
"cell's golden test from a skip into a bitwise assertion.")
|
|
68
|
+
PY
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
# Anchor build-output dirs to the repo root so they don't swallow source
|
|
7
|
+
# packages like src/datadoom/engine/dist/.
|
|
8
|
+
/build/
|
|
9
|
+
/dist/
|
|
10
|
+
.venv/
|
|
11
|
+
venv/
|
|
12
|
+
env/
|
|
13
|
+
.import_linter_cache/
|
|
14
|
+
|
|
15
|
+
# Tooling
|
|
16
|
+
.pytest_cache/
|
|
17
|
+
.mypy_cache/
|
|
18
|
+
.ruff_cache/
|
|
19
|
+
.coverage
|
|
20
|
+
htmlcov/
|
|
21
|
+
coverage.xml
|
|
22
|
+
|
|
23
|
+
# DataDoom local data / generated artifacts
|
|
24
|
+
.datadoom/
|
|
25
|
+
/out/
|
|
26
|
+
/tmp/
|
|
27
|
+
.tmp_run/
|
|
28
|
+
*.local.yaml
|
|
29
|
+
|
|
30
|
+
# Frontend (added in a later phase)
|
|
31
|
+
frontend/node_modules/
|
|
32
|
+
frontend/dist/
|
|
33
|
+
src/datadoom/webdist/
|
|
34
|
+
|
|
35
|
+
# Docs site build output (mkdocs)
|
|
36
|
+
/site/
|
|
37
|
+
|
|
38
|
+
# OS / editor
|
|
39
|
+
.DS_Store
|
|
40
|
+
Thumbs.db
|
|
41
|
+
.idea/
|
|
42
|
+
.vscode/
|
|
43
|
+
|
|
44
|
+
t.py
|