mostlyright-data 0.10.6__tar.gz → 0.10.8__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.
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/PKG-INFO +1 -1
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/pyproject.toml +1 -1
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_run_worker.py +165 -126
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/run_execution_v4.py +37 -13
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/v4_required_controls.py +35 -20
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/.gitignore +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/README.md +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/skills/mr-data-build/SKILL.md +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/skills/mr-data-build/agents/openai.yaml +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/acquisition/http.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/bounded_query.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/cli.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/crosswalks.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/declared_checks.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/capture.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/lane.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/ocr.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/pdf.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/registry.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/selections.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/tables.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/formats.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/hosted_worker.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/inprocess_acquisition.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/local_contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/local_search/service.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/pipeline.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/progress_events.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/budgets.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/himawari-hsd-b13-complete.zip +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/vector.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/recipe.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/repair/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/repair/adapters.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/repair/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/repair/errors.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/session_probes.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/skill_assets.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/adapters.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/dataset.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/fitness.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/stream_subscription_sealer.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/stream_subscription_worker.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/stream_venue.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/studio_boundary.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/studio_subscription_control.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/acquire.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/download.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/probe.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/propose.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/recipe.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/router.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/stream.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/transport.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/approve.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/attendance.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/clarification.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/diffing.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/headline.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/inventory.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/local_review.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/peek.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/preflight.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/remediation.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/render.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/ux/workload.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/v4_recipe.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/v4_transform.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/query.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mostlyright-data
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.8
|
|
4
4
|
Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
|
|
5
5
|
Project-URL: Homepage, https://mostlyright.md/
|
|
6
6
|
Project-URL: Documentation, https://mostlyright.md/docs/guides/cli/
|
|
@@ -18,8 +18,8 @@ takes it:
|
|
|
18
18
|
:func:`_raw_snapshot_tar`.
|
|
19
19
|
* **The ``cache`` field lives on the v4 ``receipt`` artifact, never on a sealed acquisition
|
|
20
20
|
receipt.** See :func:`_receipt_document`.
|
|
21
|
-
* **The
|
|
22
|
-
coordinate.** See :func:`
|
|
21
|
+
* **The authenticated predecessor receipt is the authority; the job's ``predecessor`` block is
|
|
22
|
+
only a coordinate.** See :func:`restore_predecessor_record`.
|
|
23
23
|
|
|
24
24
|
TWO SEAMS THIS REPOSITORY DOES NOT OWN, both named here so a reader does not go looking:
|
|
25
25
|
|
|
@@ -80,12 +80,10 @@ from mostlyright.data_harness.hosted_worker import (
|
|
|
80
80
|
ArtifactPayload,
|
|
81
81
|
HostedWorkerError,
|
|
82
82
|
_candidate_snapshot,
|
|
83
|
-
_decode_candidate_envelope,
|
|
84
83
|
_new_transfer_client,
|
|
85
84
|
_quiet_signed_transfer,
|
|
86
85
|
_read_fd_once,
|
|
87
86
|
_released_column_profile,
|
|
88
|
-
_restore_candidate_members,
|
|
89
87
|
_run_bounded_in_submit_order,
|
|
90
88
|
_seal_producer_artifact,
|
|
91
89
|
_strict_json,
|
|
@@ -106,7 +104,7 @@ from mostlyright.data_harness.inprocess_acquisition import (
|
|
|
106
104
|
inprocess_reader_policy_digest,
|
|
107
105
|
v4_parse_policy_digest,
|
|
108
106
|
)
|
|
109
|
-
from mostlyright.data_harness.recipe import RecipeError,
|
|
107
|
+
from mostlyright.data_harness.recipe import RecipeError, parse_recipe_execution
|
|
110
108
|
from mostlyright.data_harness.run_execution_v4 import (
|
|
111
109
|
FAILED_STAGES,
|
|
112
110
|
RunCallbacks,
|
|
@@ -150,7 +148,7 @@ from mostlyright.data_harness.v4_recipe import (
|
|
|
150
148
|
source_ceilings,
|
|
151
149
|
source_egress_origins,
|
|
152
150
|
)
|
|
153
|
-
from mostlyright.data_harness.v4_required_controls import run_required_controls
|
|
151
|
+
from mostlyright.data_harness.v4_required_controls import profile_shape, run_required_controls
|
|
154
152
|
from mostlyright.data_harness.v4_snapshot_artifact import SnapshotArtifactAdapter
|
|
155
153
|
from mostlyright.data_harness.v4_transform import (
|
|
156
154
|
SEALED_MEMBER_DIRECTORY,
|
|
@@ -675,8 +673,7 @@ def permitted_artifact_hosts(
|
|
|
675
673
|
required them to agree refused every refresh a hosted deployment dispatched.
|
|
676
674
|
|
|
677
675
|
This is defence in depth and it is not the authentication: the predecessor's bytes are still
|
|
678
|
-
authenticated end to end by ``candidate_digest``, checked
|
|
679
|
-
and again by ``pipeline.verify_candidate`` on the restored tree.
|
|
676
|
+
authenticated end to end by ``candidate_digest``, checked before the receipt is read.
|
|
680
677
|
"""
|
|
681
678
|
|
|
682
679
|
session = job.artifact_session
|
|
@@ -708,7 +705,7 @@ def _download_signed_bytes(
|
|
|
708
705
|
|
|
709
706
|
A v4 signed session carries no expected size and no expected digest: the digest that
|
|
710
707
|
authenticates these bytes is the block's ``candidate_digest``, checked by
|
|
711
|
-
|
|
708
|
+
:func:`restore_predecessor_record` before the receipt is read.
|
|
712
709
|
|
|
713
710
|
BOTH ADDRESS CHECKS RUN BEFORE THE STREAM OPENS, so a refused session costs no bytes.
|
|
714
711
|
"""
|
|
@@ -745,130 +742,169 @@ def _download_signed_bytes(
|
|
|
745
742
|
return b"".join(chunks)
|
|
746
743
|
|
|
747
744
|
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
745
|
+
@dataclass(frozen=True)
|
|
746
|
+
class PredecessorRecord:
|
|
747
|
+
"""What a refresh continues from: the predecessor's sealed receipt, read once and authenticated.
|
|
748
|
+
|
|
749
|
+
THE RECEIPT IS THE AUTHORITY AND THE BLOCK IS ONLY THE COORDINATE. Studio stamps the receipt's
|
|
750
|
+
own digest onto the run as ``candidate_digest`` (``docs/V4-WORKER-PROTOCOL.md``, *Callbacks*),
|
|
751
|
+
and the predecessor block carries that digest beside a signed session for those exact bytes.
|
|
752
|
+
So the bytes are authenticated end to end by the digest, and every fact below is read out of
|
|
753
|
+
them rather than out of the block: the table version the successor numbers itself after, the
|
|
754
|
+
sealed column shape the drift control compares against, and the committed state of every
|
|
755
|
+
source, which for a registered document is the digest of the bytes that were read.
|
|
756
|
+
|
|
757
|
+
A v4 run uploads five artifacts and never the sealed tree itself, so there is no tree to
|
|
758
|
+
restore and replay-verify here; ``candidate_digest`` on the record is the tree's digest as
|
|
759
|
+
the predecessor stated it, carried for the successor's own sealed execution.
|
|
760
|
+
"""
|
|
752
761
|
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
762
|
+
run_id: UUID
|
|
763
|
+
workspace_id: UUID
|
|
764
|
+
recipe_digest: str
|
|
765
|
+
candidate_digest: str
|
|
766
|
+
table_id: str
|
|
767
|
+
table_version_id: str
|
|
768
|
+
table_version_number: int
|
|
769
|
+
columns: tuple[tuple[str, str], ...]
|
|
770
|
+
row_count: int | None
|
|
771
|
+
source_states: Mapping[str, str]
|
|
758
772
|
|
|
759
|
-
THE RESTORED TREE IS THE AUTHORITY AND THE BLOCK IS ONLY THE COORDINATE. The block says where
|
|
760
|
-
to look; what is found there says what it is. A block whose ``candidate_digest`` disagrees with
|
|
761
|
-
the verified tree is a refusal and never a correction, and ``table_id`` and
|
|
762
|
-
``table_version_number`` are read from the tree's own sealed ``recipe-execution.json`` rather
|
|
763
|
-
than from the block -- which is what stops a spoofed block rebinding a run to a version it did
|
|
764
|
-
not come from (T-401-24).
|
|
765
773
|
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
not verify, and a digest that disagrees.
|
|
774
|
+
def _receipt_table_record(snapshot: Mapping[str, bytes]) -> dict[str, Any]:
|
|
775
|
+
"""The ``table`` member of a receipt: the sealed execution's version and the sealed shape.
|
|
769
776
|
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
document's author cannot move.
|
|
777
|
+
Both are read out of the sealed tree through the same door the artifacts are, so a receipt
|
|
778
|
+
states what was sealed and nothing the build happened to hold in memory.
|
|
773
779
|
"""
|
|
774
780
|
|
|
781
|
+
try:
|
|
782
|
+
execution = parse_recipe_execution(json.loads(snapshot["recipe-execution.json"]))
|
|
783
|
+
except (KeyError, RecipeError, ValueError) as error:
|
|
784
|
+
raise RunExecutionError(
|
|
785
|
+
"ARTIFACT_PERSIST_FAILED",
|
|
786
|
+
failure_detail("the sealed tree carries no readable execution to state in the receipt"),
|
|
787
|
+
stage="persist",
|
|
788
|
+
) from error
|
|
789
|
+
shape = profile_shape(snapshot, "this version")
|
|
790
|
+
return {
|
|
791
|
+
"table_id": execution.table_id,
|
|
792
|
+
"table_version_id": execution.table_version_id,
|
|
793
|
+
"table_version_number": execution.table_version_number,
|
|
794
|
+
"columns": [{"name": name, "logical_type": kind} for name, kind in shape.columns],
|
|
795
|
+
"row_count": shape.row_count,
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
def _decode_predecessor_receipt(raw: bytes, job: RunExecution) -> PredecessorRecord:
|
|
800
|
+
"""Read the authenticated receipt bytes into the record, or refuse by name."""
|
|
801
|
+
|
|
775
802
|
block = job.predecessor
|
|
776
|
-
|
|
777
|
-
raise _predecessor_refusal(f"a {job.mode} run carries no predecessor block")
|
|
778
|
-
raw = _download_signed_bytes(
|
|
779
|
-
transfer,
|
|
780
|
-
block.artifact_download_session,
|
|
781
|
-
maximum=MAX_CANDIDATE_ENVELOPE_BYTES,
|
|
782
|
-
permitted_hosts=permitted_artifact_hosts(job, studio_origin=studio_origin),
|
|
783
|
-
)
|
|
803
|
+
assert block is not None
|
|
784
804
|
try:
|
|
785
|
-
|
|
786
|
-
except
|
|
805
|
+
value = json.loads(raw.decode("utf-8"))
|
|
806
|
+
except (UnicodeDecodeError, ValueError) as error:
|
|
787
807
|
raise _predecessor_refusal(
|
|
788
|
-
|
|
808
|
+
"the predecessor receipt will not decode: not a JSON document"
|
|
789
809
|
) from error
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
810
|
+
if not isinstance(value, Mapping) or value.get("schema_version") != RECEIPT_DOCUMENT_SCHEMA:
|
|
811
|
+
raise _predecessor_refusal(
|
|
812
|
+
f"the predecessor receipt will not decode: not a {RECEIPT_DOCUMENT_SCHEMA} document"
|
|
813
|
+
)
|
|
814
|
+
if str(value.get("run_id")) != str(block.run_id):
|
|
815
|
+
raise _predecessor_refusal("the predecessor receipt names a different run than the block")
|
|
816
|
+
if str(value.get("workspace_id")) != str(job.workspace_id):
|
|
817
|
+
raise _predecessor_refusal("the predecessor receipt names a different workspace")
|
|
818
|
+
table = value.get("table")
|
|
819
|
+
if not isinstance(table, Mapping):
|
|
820
|
+
raise _predecessor_refusal(
|
|
821
|
+
"the predecessor receipt states no table version, so a successor cannot number "
|
|
822
|
+
"itself after it; rebuild the table with a full run on this worker first"
|
|
823
|
+
)
|
|
793
824
|
try:
|
|
794
|
-
|
|
795
|
-
|
|
825
|
+
table_id = str(table["table_id"])
|
|
826
|
+
table_version_id = str(table["table_version_id"])
|
|
827
|
+
table_version_number = int(table["table_version_number"])
|
|
828
|
+
columns = tuple(
|
|
829
|
+
(str(entry["name"]), str(entry["logical_type"])) for entry in table["columns"]
|
|
830
|
+
)
|
|
831
|
+
except (KeyError, TypeError, ValueError) as error:
|
|
796
832
|
raise _predecessor_refusal(
|
|
797
|
-
|
|
833
|
+
"the predecessor receipt's table member is not readable"
|
|
798
834
|
) from error
|
|
799
|
-
|
|
835
|
+
# THE ENGINE NAMES A VERSION BY THE RUN THAT SEALED IT (`synthesize_execution_lock` sets
|
|
836
|
+
# `table_version_id = run_id`), while the block's `table_version_id` is Studio's own derived
|
|
837
|
+
# coordinate for the same version. They live in different namespaces and never agree; the
|
|
838
|
+
# honest cross-check is the receipt's version against the block's run.
|
|
839
|
+
if table_version_id != str(block.run_id):
|
|
800
840
|
raise _predecessor_refusal(
|
|
801
|
-
"the
|
|
841
|
+
"the sealed receipt names a version of a different run than the predecessor block"
|
|
802
842
|
)
|
|
803
|
-
|
|
843
|
+
if table_version_number < 1:
|
|
844
|
+
raise _predecessor_refusal("the predecessor receipt states no positive table version")
|
|
845
|
+
row_count = table.get("row_count")
|
|
846
|
+
sources = value.get("sources")
|
|
847
|
+
states: dict[str, str] = {}
|
|
848
|
+
if isinstance(sources, list):
|
|
849
|
+
for item in sources:
|
|
850
|
+
if isinstance(item, Mapping):
|
|
851
|
+
source_id = item.get("source_id")
|
|
852
|
+
digest = item.get("digest")
|
|
853
|
+
if isinstance(source_id, str) and isinstance(digest, str):
|
|
854
|
+
states[source_id] = digest
|
|
855
|
+
candidate_digest = value.get("candidate_digest")
|
|
856
|
+
recipe_digest = value.get("recipe_digest")
|
|
857
|
+
if not isinstance(candidate_digest, str) or not isinstance(recipe_digest, str):
|
|
858
|
+
raise _predecessor_refusal("the predecessor receipt states no digests")
|
|
859
|
+
return PredecessorRecord(
|
|
860
|
+
run_id=block.run_id,
|
|
861
|
+
workspace_id=job.workspace_id,
|
|
862
|
+
recipe_digest=recipe_digest,
|
|
863
|
+
candidate_digest=candidate_digest,
|
|
864
|
+
table_id=table_id,
|
|
865
|
+
table_version_id=table_version_id,
|
|
866
|
+
table_version_number=table_version_number,
|
|
867
|
+
columns=columns,
|
|
868
|
+
row_count=row_count if isinstance(row_count, int) else None,
|
|
869
|
+
source_states=MappingProxyType(states),
|
|
870
|
+
)
|
|
804
871
|
|
|
805
872
|
|
|
806
|
-
def
|
|
807
|
-
|
|
873
|
+
def restore_predecessor_record(
|
|
874
|
+
job: RunExecution, *, transfer: Any, studio_origin: str = ""
|
|
875
|
+
) -> PredecessorRecord:
|
|
876
|
+
"""Download and authenticate the predecessor's sealed receipt, and read the record from it.
|
|
808
877
|
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
878
|
+
Studio's predecessor session names the predecessor's ``receipt`` artifact -- the
|
|
879
|
+
``candidate_evidence`` root a refresh resolves from -- and the block's ``candidate_digest`` is
|
|
880
|
+
that receipt's own digest. The bytes are authenticated by the digest BEFORE they are read, so
|
|
881
|
+
a block that disagrees with what the session serves is a refusal and never a correction, and a
|
|
882
|
+
spoofed block cannot rebind a run to a version it did not come from (T-401-24): the version
|
|
883
|
+
coordinates are read from the authenticated receipt and cross-checked against the block.
|
|
812
884
|
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
chain committed at -- and that member is where the chain is re-checked from. A tree built from
|
|
817
|
-
a registered document runs no versioned source and seals no such member; what it does seal, per
|
|
818
|
-
relation, is the digest of the exact member the relation was read from. That digest is the
|
|
819
|
-
honest answer to "what state was this source committed at", because for this lane the bytes ARE
|
|
820
|
-
the state: there is no cursor, no watermark and nothing else the predecessor advanced.
|
|
885
|
+
Six failure points, one code, and the detail names which one: an absent block, a session that
|
|
886
|
+
will not answer, a download over its bound, a digest that disagrees, a receipt that will not
|
|
887
|
+
decode, and a receipt naming another run, workspace or table version.
|
|
821
888
|
|
|
822
|
-
|
|
823
|
-
|
|
889
|
+
``studio_origin`` is the DEPLOYMENT's Studio origin, not anything the job document said, and it
|
|
890
|
+
is what lets :func:`permitted_artifact_hosts` judge the signed address against a policy the
|
|
891
|
+
document's author cannot move.
|
|
824
892
|
"""
|
|
825
893
|
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
894
|
+
block = job.predecessor
|
|
895
|
+
if block is None:
|
|
896
|
+
raise _predecessor_refusal(f"a {job.mode} run carries no predecessor block")
|
|
897
|
+
raw = _download_signed_bytes(
|
|
898
|
+
transfer,
|
|
899
|
+
block.artifact_download_session,
|
|
900
|
+
maximum=MAX_CANDIDATE_ENVELOPE_BYTES,
|
|
901
|
+
permitted_hosts=permitted_artifact_hosts(job, studio_origin=studio_origin),
|
|
902
|
+
)
|
|
903
|
+
if "sha256:" + hashlib.sha256(raw).hexdigest() != block.candidate_digest:
|
|
835
904
|
raise _predecessor_refusal(
|
|
836
|
-
"the
|
|
905
|
+
"the predecessor receipt's digest disagrees with the predecessor block"
|
|
837
906
|
)
|
|
838
|
-
return
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
#: Where one predecessor member records a source's committed state, and under which key. Written
|
|
842
|
-
#: as a table because there are exactly two sealed shapes and the difference between them is which
|
|
843
|
-
#: member exists, not how it is read.
|
|
844
|
-
_COMMITTED_STATE_MEMBERS: tuple[tuple[str, str], ...] = (
|
|
845
|
-
("evidence/recipe-acquisition.json", "committed_state_digest"),
|
|
846
|
-
("evidence/sources.json", "sha256"),
|
|
847
|
-
)
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
def _committed_source_states(snapshot: Mapping[str, bytes]) -> dict[str, str] | None:
|
|
851
|
-
"""The per-source committed state one restored tree records, or ``None`` if it records none."""
|
|
852
|
-
|
|
853
|
-
for member, key in _COMMITTED_STATE_MEMBERS:
|
|
854
|
-
raw = snapshot.get(member)
|
|
855
|
-
if raw is None:
|
|
856
|
-
continue
|
|
857
|
-
decoded = json.loads(raw)
|
|
858
|
-
sources = decoded.get("sources") if isinstance(decoded, Mapping) else decoded
|
|
859
|
-
if not isinstance(sources, list):
|
|
860
|
-
continue
|
|
861
|
-
states: dict[str, str] = {}
|
|
862
|
-
for item in sources:
|
|
863
|
-
if not isinstance(item, Mapping):
|
|
864
|
-
continue
|
|
865
|
-
source_id = item.get("source_id")
|
|
866
|
-
digest = item.get(key)
|
|
867
|
-
if isinstance(source_id, str) and isinstance(digest, str):
|
|
868
|
-
states[source_id] = digest
|
|
869
|
-
if states:
|
|
870
|
-
return states
|
|
871
|
-
return None
|
|
907
|
+
return _decode_predecessor_receipt(raw, job)
|
|
872
908
|
|
|
873
909
|
|
|
874
910
|
# ------------------------------------------------------------------------------------------------
|
|
@@ -981,6 +1017,7 @@ def _receipt_document(
|
|
|
981
1017
|
verified: pipeline.VerifiedCandidate,
|
|
982
1018
|
coverage: Sequence[V4AcquisitionCoverage],
|
|
983
1019
|
raw_members: Sequence[Mapping[str, Any]],
|
|
1020
|
+
snapshot: Mapping[str, bytes],
|
|
984
1021
|
) -> bytes:
|
|
985
1022
|
"""The composed v4 receipt: one entry per source, the coverage, and the raw tar's members.
|
|
986
1023
|
|
|
@@ -1031,6 +1068,10 @@ def _receipt_document(
|
|
|
1031
1068
|
"media_type": RAW_SNAPSHOT_MEDIA_TYPE,
|
|
1032
1069
|
"members": [dict(member) for member in raw_members],
|
|
1033
1070
|
},
|
|
1071
|
+
# THE VERSION AND THE SHAPE THIS RUN SEALED, so a later refresh can number itself
|
|
1072
|
+
# after this version and hold its columns against these, reading the authenticated
|
|
1073
|
+
# receipt alone: a v4 run uploads no sealed tree for a successor to restore.
|
|
1074
|
+
"table": _receipt_table_record(snapshot),
|
|
1034
1075
|
}
|
|
1035
1076
|
)
|
|
1036
1077
|
|
|
@@ -1040,7 +1081,7 @@ def v4_artifact_payloads(
|
|
|
1040
1081
|
candidate_run_dir: Path,
|
|
1041
1082
|
*,
|
|
1042
1083
|
coverage: Sequence[V4AcquisitionCoverage] = (),
|
|
1043
|
-
|
|
1084
|
+
predecessor: PredecessorRecord | None = None,
|
|
1044
1085
|
) -> tuple[pipeline.VerifiedCandidate, list[ArtifactPayload]]:
|
|
1045
1086
|
"""Derive all five v4 artifacts from the sealed candidate tree, in layout order.
|
|
1046
1087
|
|
|
@@ -1078,17 +1119,14 @@ def v4_artifact_payloads(
|
|
|
1078
1119
|
stage="persist",
|
|
1079
1120
|
)
|
|
1080
1121
|
verified, snapshot = _candidate_snapshot(candidate_run_dir)
|
|
1081
|
-
# The
|
|
1082
|
-
#
|
|
1083
|
-
predecessor_snapshot = (
|
|
1084
|
-
None if predecessor_run_dir is None else _candidate_snapshot(predecessor_run_dir)[1]
|
|
1085
|
-
)
|
|
1122
|
+
# The authenticated predecessor record, for the drift control a refresh is held to: the
|
|
1123
|
+
# sealed shape it states is what this version's sealed shape is compared with.
|
|
1086
1124
|
run_required_controls(
|
|
1087
1125
|
job,
|
|
1088
1126
|
verified=verified,
|
|
1089
1127
|
snapshot=snapshot,
|
|
1090
1128
|
coverage=coverage,
|
|
1091
|
-
|
|
1129
|
+
predecessor=predecessor,
|
|
1092
1130
|
)
|
|
1093
1131
|
candidate_digest = "sha256:" + verified.candidate_digest
|
|
1094
1132
|
# The tar is built BEFORE the receipt, because the receipt states the tar's members: the
|
|
@@ -1107,7 +1145,7 @@ def v4_artifact_payloads(
|
|
|
1107
1145
|
candidate_digest=candidate_digest,
|
|
1108
1146
|
),
|
|
1109
1147
|
"preview": _table_preview(snapshot["data/table.parquet"], candidate_digest),
|
|
1110
|
-
"receipt": _receipt_document(job, verified, coverage, raw_members),
|
|
1148
|
+
"receipt": _receipt_document(job, verified, coverage, raw_members, snapshot),
|
|
1111
1149
|
"raw_snapshot": _raw_snapshot_tar(snapshot, raw_paths),
|
|
1112
1150
|
}
|
|
1113
1151
|
return verified, [
|
|
@@ -2562,9 +2600,9 @@ def run_v4(
|
|
|
2562
2600
|
with ExitStack() as stack:
|
|
2563
2601
|
root = Path(stack.enter_context(tempfile.TemporaryDirectory(prefix="mr-v4-run-"))).resolve()
|
|
2564
2602
|
try:
|
|
2565
|
-
|
|
2566
|
-
predecessor_execution:
|
|
2567
|
-
source_states:
|
|
2603
|
+
predecessor: PredecessorRecord | None = None
|
|
2604
|
+
predecessor_execution: PredecessorRecord | None = None
|
|
2605
|
+
source_states: Mapping[str, str] | None = None
|
|
2568
2606
|
# THE DECLARED CHECKS ARE PARSED FIRST, BEFORE A BYTE IS FETCHED OR RESTORED.
|
|
2569
2607
|
# `parse_declared_checks` is entirely static -- it validates every check's kind, its
|
|
2570
2608
|
# exact parameter set, its domains and every column it names against the plan's own
|
|
@@ -2597,10 +2635,11 @@ def run_v4(
|
|
|
2597
2635
|
if job.mode in {"refresh", "backfill"}:
|
|
2598
2636
|
if transfer is None:
|
|
2599
2637
|
transfer = stack.enter_context(_closing(_new_transfer_client()))
|
|
2600
|
-
|
|
2601
|
-
job, transfer=transfer,
|
|
2638
|
+
predecessor = restore_predecessor_record(
|
|
2639
|
+
job, transfer=transfer, studio_origin=origin
|
|
2602
2640
|
)
|
|
2603
|
-
predecessor_execution
|
|
2641
|
+
predecessor_execution = predecessor
|
|
2642
|
+
source_states = predecessor.source_states
|
|
2604
2643
|
|
|
2605
2644
|
approval, execution = synthesize_execution_lock(
|
|
2606
2645
|
job,
|
|
@@ -2712,7 +2751,7 @@ def run_v4(
|
|
|
2712
2751
|
job,
|
|
2713
2752
|
output_dir,
|
|
2714
2753
|
coverage=coverage_log.entries(),
|
|
2715
|
-
|
|
2754
|
+
predecessor=predecessor,
|
|
2716
2755
|
)
|
|
2717
2756
|
_upload_all(
|
|
2718
2757
|
job,
|
|
@@ -3082,6 +3121,7 @@ __all__ = [
|
|
|
3082
3121
|
"RECEIPT_DOCUMENT_SCHEMA",
|
|
3083
3122
|
"V4_ARTIFACT_LAYOUT",
|
|
3084
3123
|
"ArtifactSealer",
|
|
3124
|
+
"PredecessorRecord",
|
|
3085
3125
|
"StudioArtifactSealer",
|
|
3086
3126
|
"StudioCredentialRedeemer",
|
|
3087
3127
|
"StudioRunCallbacks",
|
|
@@ -3089,9 +3129,8 @@ __all__ = [
|
|
|
3089
3129
|
"artifact_id_for",
|
|
3090
3130
|
"build_v4_candidate",
|
|
3091
3131
|
"permitted_artifact_hosts",
|
|
3092
|
-
"predecessor_lock_inputs",
|
|
3093
3132
|
"recipe_governance",
|
|
3094
|
-
"
|
|
3133
|
+
"restore_predecessor_record",
|
|
3095
3134
|
"run_v4",
|
|
3096
3135
|
"run_worker_main",
|
|
3097
3136
|
"seal_coordinate",
|
{mostlyright_data-0.10.6 → mostlyright_data-0.10.8}/src/mostlyright/data_harness/run_execution_v4.py
RENAMED
|
@@ -1407,10 +1407,28 @@ def _refuse_unbindable_watermark(job: RunExecution) -> None:
|
|
|
1407
1407
|
)
|
|
1408
1408
|
|
|
1409
1409
|
|
|
1410
|
+
class PredecessorExecution(Protocol):
|
|
1411
|
+
"""The three facts the lock reads off a predecessor: its table, its version, its number.
|
|
1412
|
+
|
|
1413
|
+
Satisfied by the engine's own ``RecipeExecution`` and by the worker's authenticated
|
|
1414
|
+
``PredecessorRecord`` alike, so the lock is indifferent to which sealed member they were read
|
|
1415
|
+
from.
|
|
1416
|
+
"""
|
|
1417
|
+
|
|
1418
|
+
@property
|
|
1419
|
+
def table_id(self) -> str: ...
|
|
1420
|
+
|
|
1421
|
+
@property
|
|
1422
|
+
def table_version_id(self) -> str: ...
|
|
1423
|
+
|
|
1424
|
+
@property
|
|
1425
|
+
def table_version_number(self) -> int: ...
|
|
1426
|
+
|
|
1427
|
+
|
|
1410
1428
|
def synthesize_execution_lock(
|
|
1411
1429
|
job: RunExecution,
|
|
1412
1430
|
*,
|
|
1413
|
-
predecessor_execution:
|
|
1431
|
+
predecessor_execution: PredecessorExecution | None = None,
|
|
1414
1432
|
predecessor_source_states: Mapping[str, str] | None = None,
|
|
1415
1433
|
trusted_clock: str | None = None,
|
|
1416
1434
|
) -> tuple[RecipeApproval, RecipeExecution]:
|
|
@@ -1422,18 +1440,22 @@ def synthesize_execution_lock(
|
|
|
1422
1440
|
keeps ``pipeline._RECIPE_STATIC_FILES`` intact and the synthesized documents are still sealed
|
|
1423
1441
|
into the candidate as honest evidence of what ran.
|
|
1424
1442
|
|
|
1425
|
-
``predecessor_execution`` is
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
and passes
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1443
|
+
``predecessor_execution`` is read out of the predecessor's AUTHENTICATED sealed receipt (the
|
|
1444
|
+
``table`` member it states), not out of the job document: the sealed member is the authority
|
|
1445
|
+
and the block is only the coordinate. The driver downloads the receipt, authenticates it by
|
|
1446
|
+
the block's digest and passes the record in. A non-``initial`` call without it refuses
|
|
1447
|
+
``PREDECESSOR_UNAVAILABLE`` rather
|
|
1448
|
+
than guessing a version number, and the sealed execution's ``table_version_id`` -- which the
|
|
1449
|
+
engine spells as the run that sealed it -- is cross-checked against the block's ``run_id``,
|
|
1450
|
+
so a spoofed block cannot rebind a run to a version it did not come from. (The block's own
|
|
1451
|
+
``table_version_id`` is Studio's derived coordinate for that version and is carried through
|
|
1452
|
+
as ``predecessor_table_version_id`` without comparison: the two spellings never agree.)
|
|
1453
|
+
(``candidate_digest`` has no counterpart on ``RecipeExecution``: the
|
|
1432
1454
|
``predecessor_candidate_digest`` member there names the predecessor's OWN predecessor, not
|
|
1433
1455
|
itself. Authenticating the digest against the restored tree is 401-04's, where the tree is.)
|
|
1434
1456
|
|
|
1435
|
-
``predecessor_source_states`` carries the per-source
|
|
1436
|
-
|
|
1457
|
+
``predecessor_source_states`` carries the per-source committed state read from the same
|
|
1458
|
+
receipt: for a registered document, the digest of the bytes each source was read as.
|
|
1437
1459
|
``_validate_recipe_execution`` requires one for every source of a non-``initial`` execution,
|
|
1438
1460
|
and the job document carries none, so 401-04 supplies them from the same restored tree.
|
|
1439
1461
|
|
|
@@ -1482,11 +1504,13 @@ def synthesize_execution_lock(
|
|
|
1482
1504
|
"name a version number",
|
|
1483
1505
|
stage=_SYNTHESIS_STAGE,
|
|
1484
1506
|
)
|
|
1485
|
-
|
|
1507
|
+
# The engine names a version by the run that sealed it (`table_version_id = run_id`,
|
|
1508
|
+
# below); the block's `table_version_id` is Studio's derived coordinate for the same
|
|
1509
|
+
# version and lives in another namespace. The cross-check is against the block's run.
|
|
1510
|
+
if predecessor_execution.table_version_id != str(job.predecessor.run_id):
|
|
1486
1511
|
raise _refuse(
|
|
1487
1512
|
"PREDECESSOR_UNAVAILABLE",
|
|
1488
|
-
"the predecessor block and the
|
|
1489
|
-
"versions",
|
|
1513
|
+
"the predecessor block and the sealed execution name different runs",
|
|
1490
1514
|
stage=_SYNTHESIS_STAGE,
|
|
1491
1515
|
)
|
|
1492
1516
|
if predecessor_source_states is None:
|
|
@@ -75,7 +75,7 @@ import json
|
|
|
75
75
|
from collections.abc import Mapping, Sequence
|
|
76
76
|
from dataclasses import dataclass
|
|
77
77
|
from types import MappingProxyType
|
|
78
|
-
from typing import Any
|
|
78
|
+
from typing import Any, Protocol
|
|
79
79
|
|
|
80
80
|
from mostlyright.data_harness import pipeline
|
|
81
81
|
from mostlyright.data_harness.canonical import sha256_bytes
|
|
@@ -210,28 +210,39 @@ def _exact_candidate_replay(
|
|
|
210
210
|
# ------------------------------------------------------------------------------------------------
|
|
211
211
|
|
|
212
212
|
|
|
213
|
+
class PredecessorShape(Protocol):
|
|
214
|
+
"""The sealed shape a predecessor stated; the authenticated receipt record reads it."""
|
|
215
|
+
|
|
216
|
+
@property
|
|
217
|
+
def columns(self) -> tuple[tuple[str, str], ...]: ...
|
|
218
|
+
|
|
219
|
+
@property
|
|
220
|
+
def row_count(self) -> int | None: ...
|
|
221
|
+
|
|
222
|
+
|
|
213
223
|
def _recipe_drift(
|
|
214
224
|
job: Any,
|
|
215
225
|
snapshot: Mapping[str, bytes],
|
|
216
|
-
predecessor:
|
|
226
|
+
predecessor: PredecessorShape | None,
|
|
217
227
|
) -> ControlOutcome:
|
|
218
|
-
"""NOT_APPLICABLE on a first version; APPLIED on a refresh, against the
|
|
228
|
+
"""NOT_APPLICABLE on a first version; APPLIED on a refresh, against the predecessor record.
|
|
219
229
|
|
|
220
230
|
Every finding the older engine's drift report can raise is a comparison against a PREDECESSOR
|
|
221
231
|
version -- a column set that lost a column, a column whose type moved, a row count outside the
|
|
222
232
|
envelope a refresh policy stated. A ``sample`` or ``full`` creates version one and has nothing
|
|
223
233
|
on the other side of any of the three, so the control does not apply and the outcome says why.
|
|
224
234
|
|
|
225
|
-
A ``refresh`` continues from a predecessor this worker
|
|
226
|
-
comparison it can honestly make is the one both sealed
|
|
227
|
-
the closed logical type of every column
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
envelope, so any bound applied here
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
+
A ``refresh`` continues from a predecessor whose sealed receipt this worker authenticated, and
|
|
236
|
+
the comparison it can honestly make is the one both sealed records state exactly: the column
|
|
237
|
+
set and the closed logical type of every column -- the receipt's ``table.columns`` on one side
|
|
238
|
+
and this tree's ``evidence/profile.json`` on the other. A column that disappeared, appeared or
|
|
239
|
+
changed type is drift and the version is refused. The row count is reported and NOT judged:
|
|
240
|
+
the registered document has no member for a row-count envelope, so any bound applied here
|
|
241
|
+
would be one nobody set.
|
|
242
|
+
|
|
243
|
+
**THE PRECONDITION IS CHECKED EVERY RUN.** A refresh that reaches the seal with no
|
|
244
|
+
authenticated predecessor in hand is a worker fault -- something moved and this control was
|
|
245
|
+
not handed the record -- and is refused rather than sealed as compared to nothing.
|
|
235
246
|
"""
|
|
236
247
|
|
|
237
248
|
mode = engine_execution_mode(job)
|
|
@@ -248,10 +259,10 @@ def _recipe_drift(
|
|
|
248
259
|
raise _void(
|
|
249
260
|
"RECIPE_DRIFT",
|
|
250
261
|
f"this run continues from a predecessor as a {job.mode}, and the seal was handed no "
|
|
251
|
-
"
|
|
262
|
+
"authenticated predecessor record to compare the successor with",
|
|
252
263
|
)
|
|
253
|
-
before =
|
|
254
|
-
after =
|
|
264
|
+
before = _ProfileShape(columns=tuple(predecessor.columns), row_count=predecessor.row_count)
|
|
265
|
+
after = profile_shape(snapshot, "this version")
|
|
255
266
|
if before.columns != after.columns:
|
|
256
267
|
lost = [name for name, _ in before.columns if name not in dict(after.columns)]
|
|
257
268
|
added = [name for name, _ in after.columns if name not in dict(before.columns)]
|
|
@@ -287,8 +298,12 @@ class _ProfileShape:
|
|
|
287
298
|
row_count: int | None
|
|
288
299
|
|
|
289
300
|
|
|
290
|
-
def
|
|
291
|
-
"""The sealed column set and row count a tree's ``evidence/profile.json`` states.
|
|
301
|
+
def profile_shape(snapshot: Mapping[str, bytes], label: str) -> _ProfileShape:
|
|
302
|
+
"""The sealed column set and row count a tree's ``evidence/profile.json`` states.
|
|
303
|
+
|
|
304
|
+
Public because the receipt states this shape for the version it seals, so a later refresh
|
|
305
|
+
can compare against it without a tree to read: one reader for both sides of the comparison.
|
|
306
|
+
"""
|
|
292
307
|
|
|
293
308
|
try:
|
|
294
309
|
profile = json.loads(snapshot["evidence/profile.json"])
|
|
@@ -574,7 +589,7 @@ def run_required_controls(
|
|
|
574
589
|
verified: pipeline.VerifiedCandidate,
|
|
575
590
|
snapshot: Mapping[str, bytes],
|
|
576
591
|
coverage: Sequence[Any],
|
|
577
|
-
|
|
592
|
+
predecessor: PredecessorShape | None = None,
|
|
578
593
|
) -> tuple[ControlOutcome, ...]:
|
|
579
594
|
"""Evaluate every required control's disposition for one sealed version, in inventory order.
|
|
580
595
|
|
|
@@ -592,7 +607,7 @@ def run_required_controls(
|
|
|
592
607
|
reader looks for them in.
|
|
593
608
|
"""
|
|
594
609
|
|
|
595
|
-
drift = _recipe_drift(job, snapshot,
|
|
610
|
+
drift = _recipe_drift(job, snapshot, predecessor)
|
|
596
611
|
temporal = _temporal_integrity(job)
|
|
597
612
|
outcomes = (
|
|
598
613
|
_exact_candidate_replay(verified, snapshot),
|