mostlyright-data 0.9.8__tar.gz → 0.9.10__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.9.8 → mostlyright_data-0.9.10}/PKG-INFO +1 -1
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/pyproject.toml +1 -1
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_contracts.py +2 -9
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/pipeline.py +18 -19
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/delta.py +25 -58
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +5 -8
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/fill.py +9 -25
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/gating.py +19 -30
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +6 -5
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/contracts.py +9 -41
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/fitness.py +11 -14
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/rights_rule.py +11 -5
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_capture_session.py +6 -14
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_rotation.py +6 -5
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/download.py +74 -1
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/propose.py +144 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/approve.py +5 -5
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/local_review.py +8 -11
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/remediation.py +1 -1
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/.gitignore +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/README.md +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/http.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/cli.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/event_presentation.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/fleet.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/formats.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_worker.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/service.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/progress_events.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/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.9.8 → mostlyright_data-0.9.10}/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.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/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.9.8 → mostlyright_data-0.9.10}/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.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/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.9.8 → mostlyright_data-0.9.10}/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.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/recipe.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/adapters.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/contracts.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/errors.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/serving.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/serving_edge.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/serving_http.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/session_probes.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/adapters.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/studio_boundary.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/acquire.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/router.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/stream.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/transport.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/diffing.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/headline.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/inventory.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/peek.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/preflight.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/render.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/workload.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/viewer.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/query.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
- {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/watch.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mostlyright-data
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.10
|
|
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/
|
{mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_contracts.py
RENAMED
|
@@ -730,15 +730,8 @@ class SourceProposal(_CanonicalContract):
|
|
|
730
730
|
(item.uri, item.observed_at, item.content_sha256) for item in self.evidence
|
|
731
731
|
)
|
|
732
732
|
_require_unique(evidence_keys, "source_proposal.evidence")
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
"conditional",
|
|
736
|
-
}:
|
|
737
|
-
raise ContractError(
|
|
738
|
-
"source_proposal.rights_status",
|
|
739
|
-
"RIGHTS_NOT_SELECTABLE",
|
|
740
|
-
"selected proposals require approved or conditional rights",
|
|
741
|
-
)
|
|
733
|
+
# Any rights status may be selected: the status is recorded on the proposal for the
|
|
734
|
+
# dataset's consumer to judge, never used to refuse the selection itself.
|
|
742
735
|
if self.fitness_decision == "selected" and self.live_endpoint in {"dead", "delayed"}:
|
|
743
736
|
raise ContractError(
|
|
744
737
|
"source_proposal.live_endpoint",
|
|
@@ -1231,6 +1231,11 @@ def classify_plan_sources_before_persistence(
|
|
|
1231
1231
|
"project_owned": "internal",
|
|
1232
1232
|
"authorized_internal": "restricted",
|
|
1233
1233
|
"user_authorized": "restricted",
|
|
1234
|
+
# Rights are recorded, never a gate: an unknown or prohibited rights basis still
|
|
1235
|
+
# builds, classified restricted -- the cautious end of the classification axis --
|
|
1236
|
+
# with the status itself carried on the governance record for its consumer to judge.
|
|
1237
|
+
"unknown": "restricted",
|
|
1238
|
+
"prohibited": "restricted",
|
|
1234
1239
|
}
|
|
1235
1240
|
evidence: dict[str, dict[str, str]] = {}
|
|
1236
1241
|
for source in sorted(plan.sources, key=lambda item: item.source_id):
|
|
@@ -2021,10 +2026,9 @@ def _visual_source_summary(
|
|
|
2021
2026
|
parse produced.
|
|
2022
2027
|
"""
|
|
2023
2028
|
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
)
|
|
2029
|
+
# Value display keys off data classification alone; the licence is recorded on the source
|
|
2030
|
+
# for its consumer to judge, never used to withhold the user's own data from them.
|
|
2031
|
+
public_values = governance["classification"] == "public"
|
|
2028
2032
|
null_counts = {column: null_counts[column] for column in columns}
|
|
2029
2033
|
sample = []
|
|
2030
2034
|
if public_values:
|
|
@@ -2198,8 +2202,7 @@ def _replay_graph_derivations(
|
|
|
2198
2202
|
display = (
|
|
2199
2203
|
"full"
|
|
2200
2204
|
if all(
|
|
2201
|
-
source.
|
|
2202
|
-
and exact_governance[source.source_id]["classification"] == "public"
|
|
2205
|
+
exact_governance[source.source_id]["classification"] == "public"
|
|
2203
2206
|
for source in plan.sources
|
|
2204
2207
|
)
|
|
2205
2208
|
else "schema_only"
|
|
@@ -2563,8 +2566,7 @@ def _replay_candidate_derivations(
|
|
|
2563
2566
|
visual_display = (
|
|
2564
2567
|
"full"
|
|
2565
2568
|
if all(
|
|
2566
|
-
source.
|
|
2567
|
-
and exact_governance[source.source_id]["classification"] == "public"
|
|
2569
|
+
exact_governance[source.source_id]["classification"] == "public"
|
|
2568
2570
|
for source in plan.sources
|
|
2569
2571
|
)
|
|
2570
2572
|
else "schema_only"
|
|
@@ -4323,17 +4325,14 @@ def _require_stable_candidate_observation(
|
|
|
4323
4325
|
|
|
4324
4326
|
|
|
4325
4327
|
def _validate_rights(plan: TablePlan) -> None:
|
|
4326
|
-
for
|
|
4327
|
-
|
|
4328
|
-
|
|
4329
|
-
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
"RIGHTS_PERMISSION_MISSING",
|
|
4335
|
-
f"source {source.source_id!r} does not permit {plan.output_intent!r}",
|
|
4336
|
-
)
|
|
4328
|
+
"""Formerly the build-time rights gate; now a recording point kept for its call sites.
|
|
4329
|
+
|
|
4330
|
+
Licensing is recorded, never enforced: every source's rights status and permissions are
|
|
4331
|
+
already carried on the plan and into the build's governance record, and the consumer of
|
|
4332
|
+
the output judges them. Unknown, prohibited, and intent-mismatched rights all build.
|
|
4333
|
+
"""
|
|
4334
|
+
|
|
4335
|
+
del plan
|
|
4337
4336
|
|
|
4338
4337
|
|
|
4339
4338
|
def _validate_root_separation(input_root: Path, output: Path) -> None:
|
|
@@ -262,17 +262,18 @@ def classify_catalog_delta(
|
|
|
262
262
|
rights_decisions: Mapping[str, RightsDecision] | None = None,
|
|
263
263
|
rights_decisions_sha256: str | None = None,
|
|
264
264
|
) -> CatalogDeltaClassification:
|
|
265
|
-
"""Partition a complete fill into unchanged, changed, new,
|
|
265
|
+
"""Partition a complete fill into unchanged, changed, new, and absent facts.
|
|
266
266
|
|
|
267
|
-
``candidates_by_record_id`` contains authored, unsealed entries for every
|
|
268
|
-
|
|
267
|
+
``candidates_by_record_id`` contains authored, unsealed entries for every provider record.
|
|
268
|
+
``predecessor_record_ids`` preserves the explicit provider-to-Harness identity chosen
|
|
269
269
|
when the predecessor was authored. Neither map is inferred from publisher text.
|
|
270
270
|
|
|
271
|
-
``rights_decisions``
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
271
|
+
``rights_decisions`` enriches the record it names: each decision must name a record this
|
|
272
|
+
fill observed and bind the exact bytes the person decided against, and the candidate for
|
|
273
|
+
that record must carry exactly the decided rights. Rights never hold a record out of
|
|
274
|
+
admission -- the decided status, whatever it says, is recorded on the admitted entry for
|
|
275
|
+
the dataset's consumer to judge. The ``flagged`` partition is always empty for a new
|
|
276
|
+
classification and survives only so older published generations still parse.
|
|
276
277
|
"""
|
|
277
278
|
|
|
278
279
|
previous_by_id, chains = _validate_predecessor(
|
|
@@ -285,7 +286,6 @@ def classify_catalog_delta(
|
|
|
285
286
|
decisions = dict(rights_decisions or {})
|
|
286
287
|
if decisions:
|
|
287
288
|
_validate_mapping(decisions, "rights_decisions")
|
|
288
|
-
prohibited_ids: set[str] = set()
|
|
289
289
|
for record_id in sorted(decisions):
|
|
290
290
|
decision = decisions[record_id]
|
|
291
291
|
if not isinstance(decision, RightsDecision):
|
|
@@ -314,68 +314,35 @@ def classify_catalog_delta(
|
|
|
314
314
|
"decision is about one spelling of the facts, so a person must decide "
|
|
315
315
|
"again against the current facts",
|
|
316
316
|
)
|
|
317
|
-
staged = staged_flagged.get(record_id)
|
|
318
|
-
if decision.cleared:
|
|
319
|
-
if staged is None:
|
|
320
|
-
raise CatalogDeltaError(
|
|
321
|
-
"CATALOG_RIGHTS_DECISION_TARGET",
|
|
322
|
-
f"delta.rights_decisions.{record_id}",
|
|
323
|
-
"names a record the rights queue does not hold; the provider states "
|
|
324
|
-
"its own licence, so there is nothing left for a clearance to clear",
|
|
325
|
-
)
|
|
326
|
-
if staged.rights_status == "prohibited":
|
|
327
|
-
raise CatalogDeltaError(
|
|
328
|
-
"CATALOG_RIGHTS_DECISION_OVERRULE",
|
|
329
|
-
f"delta.rights_decisions.{record_id}",
|
|
330
|
-
"the provider's own licence prohibits reuse; a decision may clear "
|
|
331
|
-
"silence, never overrule a provider's explicit no",
|
|
332
|
-
)
|
|
333
|
-
else:
|
|
334
|
-
# A person's no outranks a provider's yes, so a prohibiting decision holds
|
|
335
|
-
# whether or not the provider's own licence would have admitted the record.
|
|
336
|
-
prohibited_ids.add(record_id)
|
|
337
|
-
cleared_ids = {record_id for record_id, item in decisions.items() if item.cleared}
|
|
338
|
-
|
|
339
317
|
_validate_mapping(candidates_by_record_id, "candidates_by_record_id")
|
|
340
318
|
candidate_keys = set(candidates_by_record_id)
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
)
|
|
344
|
-
|
|
319
|
+
# Rights never hold a record out of admission any more. New fills flag nothing, so every
|
|
320
|
+
# record demands a candidate. An older fill's staged queue is honoured transitionally: its
|
|
321
|
+
# records do not *require* a candidate (their authoring documents never held one), but a
|
|
322
|
+
# candidate MAY now be authored for them, and authoring one admits the record and retires
|
|
323
|
+
# it from the queue. A decision only replaces the rights the candidate carries.
|
|
324
|
+
required_candidate_keys = set(records_by_id) - set(staged_flagged)
|
|
325
|
+
if not (required_candidate_keys <= candidate_keys <= set(records_by_id)):
|
|
345
326
|
raise CatalogDeltaError(
|
|
346
327
|
"CATALOG_DELTA_CANDIDATE_MAPPING",
|
|
347
328
|
"delta.candidates_by_record_id",
|
|
348
|
-
"must name
|
|
349
|
-
"
|
|
350
|
-
"prohibits; "
|
|
329
|
+
"must name every current provider record outside the staged queue, and may name "
|
|
330
|
+
"records inside it; "
|
|
351
331
|
f"missing={sorted(required_candidate_keys - candidate_keys)}, "
|
|
352
|
-
f"extra={sorted(candidate_keys -
|
|
332
|
+
f"extra={sorted(candidate_keys - set(records_by_id))}",
|
|
353
333
|
)
|
|
354
334
|
|
|
355
335
|
unchanged: list[CatalogEntry] = []
|
|
356
336
|
changed: list[CatalogEntry] = []
|
|
357
337
|
new: list[CatalogEntry] = []
|
|
358
|
-
flagged: dict[str, CatalogFlaggedRecord] =
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
record = records_by_id[record_id]
|
|
364
|
-
flagged[record_id] = CatalogFlaggedRecord(
|
|
365
|
-
protocol=record.protocol,
|
|
366
|
-
record_id=record.record_id,
|
|
367
|
-
record_sha256=record.digest,
|
|
368
|
-
license_id=record.license_id,
|
|
369
|
-
license_uri=record.license_uri,
|
|
370
|
-
rights_status=decision.rights.status,
|
|
371
|
-
authority="human_decision",
|
|
372
|
-
entry_id=None,
|
|
373
|
-
human_decision_reference=decision.human_decision_reference,
|
|
374
|
-
decided_at=decision.decided_at,
|
|
375
|
-
)
|
|
338
|
+
flagged: dict[str, CatalogFlaggedRecord] = {
|
|
339
|
+
record_id: item
|
|
340
|
+
for record_id, item in staged_flagged.items()
|
|
341
|
+
if record_id not in candidate_keys
|
|
342
|
+
}
|
|
376
343
|
resulting_chains: list[tuple[CatalogEntry, ...]] = []
|
|
377
344
|
|
|
378
|
-
for record_id in sorted(
|
|
345
|
+
for record_id in sorted(candidate_keys):
|
|
379
346
|
record = records_by_id[record_id]
|
|
380
347
|
decision = decisions.get(record_id)
|
|
381
348
|
candidate = _validated_candidate(
|
|
@@ -821,14 +821,11 @@ def evaluate_catalog_entry_v2(
|
|
|
821
821
|
|
|
822
822
|
|
|
823
823
|
def _v2_rights_disposition(rights: CatalogFact) -> str:
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
return "refused"
|
|
830
|
-
# ``conditional`` lacks a v2 obligation fact, and ``unclear`` explicitly requires escalation.
|
|
831
|
-
return "flagged"
|
|
824
|
+
# Rights are recorded, never adjudicated: every entry is admitted regardless of its
|
|
825
|
+
# licence, and the rights fact itself travels on the entry for the consumer to judge.
|
|
826
|
+
# The "flagged"/"refused" values remain in the vocabulary so stored decisions still parse.
|
|
827
|
+
del rights
|
|
828
|
+
return "admitted"
|
|
832
829
|
|
|
833
830
|
|
|
834
831
|
def catalog_entry_v2_from_dict(data: Mapping[str, Any]) -> CatalogEntryV2:
|
|
@@ -43,7 +43,6 @@ from mostlyright.data_harness.sources.catalog.fill_staging import (
|
|
|
43
43
|
from mostlyright.data_harness.sources.catalog.harvest.ckan import (
|
|
44
44
|
CKAN_LIMITS,
|
|
45
45
|
CkanHarvester,
|
|
46
|
-
ckan_licence_rights,
|
|
47
46
|
)
|
|
48
47
|
from mostlyright.data_harness.sources.catalog.harvest.datagov_v4 import (
|
|
49
48
|
DATAGOV_V4_ENDPOINT,
|
|
@@ -68,7 +67,6 @@ from mostlyright.data_harness.sources.catalog.harvest.sdmx import SDMX_LIMITS, S
|
|
|
68
67
|
from mostlyright.data_harness.sources.catalog.harvest.stac import (
|
|
69
68
|
STAC_LIMITS,
|
|
70
69
|
StacHarvester,
|
|
71
|
-
stac_licence_rights,
|
|
72
70
|
)
|
|
73
71
|
from mostlyright.data_harness.sources.contracts import EvidenceReference
|
|
74
72
|
|
|
@@ -3637,29 +3635,15 @@ def _pass_processed_count(staging: FillStaging, state: dict[str, Any]) -> int:
|
|
|
3637
3635
|
|
|
3638
3636
|
|
|
3639
3637
|
def _flagged_records(records: tuple[HarvestedRecord, ...]) -> list[dict[str, Any]]:
|
|
3640
|
-
|
|
3641
|
-
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
|
|
3647
|
-
|
|
3648
|
-
|
|
3649
|
-
status = "unclear"
|
|
3650
|
-
if status in {"unclear", "prohibited"}:
|
|
3651
|
-
flagged.append(
|
|
3652
|
-
{
|
|
3653
|
-
"protocol": record.protocol,
|
|
3654
|
-
"record_id": record.record_id,
|
|
3655
|
-
"record_sha256": record.digest,
|
|
3656
|
-
"license_id": getattr(record, "license_id", None),
|
|
3657
|
-
"license_uri": getattr(record, "license_uri", None),
|
|
3658
|
-
"rights_status": status,
|
|
3659
|
-
"authority": "human_review_required",
|
|
3660
|
-
}
|
|
3661
|
-
)
|
|
3662
|
-
return sorted(flagged, key=lambda item: (item["protocol"], item["record_id"]))
|
|
3638
|
+
"""Always empty: rights never hold a record out of admission any more.
|
|
3639
|
+
|
|
3640
|
+
The licence facts a harvest observes (licence id, URI, and the status it maps to) are
|
|
3641
|
+
carried on the authored entry instead, for the dataset's consumer to judge. The function
|
|
3642
|
+
and the receipt fields it feeds survive so older fills' staged queues still reconcile.
|
|
3643
|
+
"""
|
|
3644
|
+
|
|
3645
|
+
del records
|
|
3646
|
+
return []
|
|
3663
3647
|
|
|
3664
3648
|
|
|
3665
3649
|
def _preflight_limit(state: dict[str, Any], limits: CatalogFillLimits) -> str | None:
|
|
@@ -217,34 +217,24 @@ def _gate_one(entry: CatalogEntry, requirement: CatalogRequirement) -> CatalogGa
|
|
|
217
217
|
disposition_of_rights = rights_disposition(entry.rights.status)
|
|
218
218
|
outcomes: dict[str, tuple[bool, str]] = {}
|
|
219
219
|
|
|
220
|
+
# Rights and obligations are recorded facts, not admission criteria: both checks always
|
|
221
|
+
# pass, and the detail line carries what a consumer of the dataset needs to judge the
|
|
222
|
+
# licence for themselves.
|
|
220
223
|
outcomes["rights"] = (
|
|
221
|
-
|
|
222
|
-
f"rights status {entry.rights.status!r} is
|
|
224
|
+
True,
|
|
225
|
+
f"rights status {entry.rights.status!r} is recorded for the consumer to judge",
|
|
223
226
|
)
|
|
224
227
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
False,
|
|
236
|
-
f"licence obligations are not satisfied: {error.detail}"[:MAX_DETAIL],
|
|
237
|
-
)
|
|
238
|
-
else:
|
|
239
|
-
outcomes["obligations"] = (
|
|
240
|
-
True,
|
|
241
|
-
f"{len(applicable)} licence obligation(s) apply and are satisfied",
|
|
242
|
-
)
|
|
243
|
-
else:
|
|
244
|
-
outcomes["obligations"] = (
|
|
245
|
-
True,
|
|
246
|
-
"not evaluated: the rights check already decided this entry",
|
|
247
|
-
)
|
|
228
|
+
applicable = evaluate_obligations(
|
|
229
|
+
rights=entry.rights,
|
|
230
|
+
lifecycle=requirement.lifecycle,
|
|
231
|
+
intended_use=requirement.intended_use,
|
|
232
|
+
attached_artifact_digests=requirement.attached_license_artifact_digests,
|
|
233
|
+
)
|
|
234
|
+
outcomes["obligations"] = (
|
|
235
|
+
True,
|
|
236
|
+
f"{len(applicable)} licence obligation(s) apply and are recorded",
|
|
237
|
+
)
|
|
248
238
|
|
|
249
239
|
needs_login = requirement.require_open_access and entry.authentication_required
|
|
250
240
|
outcomes["authentication"] = (
|
|
@@ -285,11 +275,10 @@ def _gate_one(entry: CatalogEntry, requirement: CatalogRequirement) -> CatalogGa
|
|
|
285
275
|
)
|
|
286
276
|
failed = [item.check for item in checks if item.outcome != "pass"]
|
|
287
277
|
|
|
288
|
-
# Precedence mirrors the fitness adjudicator exactly
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
elif failed:
|
|
278
|
+
# Precedence mirrors the fitness adjudicator exactly. Rights never escalate any more;
|
|
279
|
+
# the branch is kept as an import-time truth via rights_disposition rather than re-decided.
|
|
280
|
+
assert disposition_of_rights == "admit"
|
|
281
|
+
if failed:
|
|
293
282
|
disposition = "refused"
|
|
294
283
|
reason = f"failed checks: {', '.join(failed)}"
|
|
295
284
|
else:
|
|
@@ -99,15 +99,16 @@ class RightsDecision:
|
|
|
99
99
|
"rights_decision.rights",
|
|
100
100
|
"must be a complete RightsEvidence",
|
|
101
101
|
)
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
# Statuses are judged by name here, not through rights_disposition: every status
|
|
103
|
+
# admits now, but a decision document still has its own grammar to keep.
|
|
104
|
+
if self.rights.status == "unclear":
|
|
104
105
|
raise SourceContractError(
|
|
105
106
|
"RIGHTS_DECISION_UNDECIDED",
|
|
106
107
|
"rights_decision.rights.status",
|
|
107
|
-
"a decision that says unclear decides nothing; the
|
|
108
|
-
"that state without a document",
|
|
108
|
+
"a decision that says unclear decides nothing; the harvested record already "
|
|
109
|
+
"records that state without a document",
|
|
109
110
|
)
|
|
110
|
-
if
|
|
111
|
+
if self.rights.status != "prohibited":
|
|
111
112
|
# An admitting claim carries the approval authority inside the rights, exactly as
|
|
112
113
|
# the entry it will become must carry it, and the two spellings must be one.
|
|
113
114
|
if self.rights.human_decision_reference != self.human_decision_reference:
|
{mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/contracts.py
RENAMED
|
@@ -1766,51 +1766,19 @@ def evaluate_obligations(
|
|
|
1766
1766
|
intended_use: str,
|
|
1767
1767
|
attached_artifact_digests: tuple[str, ...],
|
|
1768
1768
|
) -> tuple[LicenseObligation, ...]:
|
|
1769
|
-
"""Return
|
|
1769
|
+
"""Return the obligations that apply at this lifecycle stage, for the record.
|
|
1770
|
+
|
|
1771
|
+
Licensing is recorded, never enforced: an obligation whose use is prohibited or ambiguous,
|
|
1772
|
+
or whose required artifacts are missing, is still *applicable* and still travels with the
|
|
1773
|
+
dataset so its consumer can judge it. The only refusals left here are input-shape ones.
|
|
1774
|
+
"""
|
|
1770
1775
|
|
|
1771
1776
|
_choice(lifecycle, OBLIGATION_LIFECYCLES, "lifecycle")
|
|
1772
1777
|
_text(intended_use, "intended_use", maximum=200)
|
|
1773
1778
|
_digests(attached_artifact_digests, "attached_artifact_digests", maximum=128)
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
"rights.status",
|
|
1778
|
-
"unclear or prohibited rights require escalation and cannot advance",
|
|
1779
|
-
)
|
|
1780
|
-
if intended_use not in rights.allowed_uses:
|
|
1781
|
-
raise SourceContractError(
|
|
1782
|
-
"USE_NOT_ALLOWED",
|
|
1783
|
-
"intended_use",
|
|
1784
|
-
"the intended use is not covered by the rights evidence",
|
|
1785
|
-
)
|
|
1786
|
-
attached = set(attached_artifact_digests)
|
|
1787
|
-
applicable: list[LicenseObligation] = []
|
|
1788
|
-
for obligation in rights.obligations:
|
|
1789
|
-
if lifecycle not in obligation.applies_at:
|
|
1790
|
-
continue
|
|
1791
|
-
if intended_use in obligation.prohibited_uses:
|
|
1792
|
-
raise SourceContractError(
|
|
1793
|
-
"USE_PROHIBITED",
|
|
1794
|
-
f"obligation.{obligation.obligation_id}",
|
|
1795
|
-
"the intended use is explicitly prohibited",
|
|
1796
|
-
)
|
|
1797
|
-
if obligation.permitted_uses and intended_use not in obligation.permitted_uses:
|
|
1798
|
-
if obligation.escalation_when_ambiguous:
|
|
1799
|
-
raise SourceContractError(
|
|
1800
|
-
"RIGHTS_ESCALATION_REQUIRED",
|
|
1801
|
-
f"obligation.{obligation.obligation_id}",
|
|
1802
|
-
"obligation applicability is ambiguous for this intended use",
|
|
1803
|
-
)
|
|
1804
|
-
continue
|
|
1805
|
-
missing = sorted(set(obligation.required_artifact_digests) - attached)
|
|
1806
|
-
if missing:
|
|
1807
|
-
raise SourceContractError(
|
|
1808
|
-
"LICENSE_ARTIFACT_MISSING",
|
|
1809
|
-
f"obligation.{obligation.obligation_id}.required_artifact_digests",
|
|
1810
|
-
f"missing required attached artifacts: {missing}",
|
|
1811
|
-
)
|
|
1812
|
-
applicable.append(obligation)
|
|
1813
|
-
return tuple(applicable)
|
|
1779
|
+
return tuple(
|
|
1780
|
+
obligation for obligation in rights.obligations if lifecycle in obligation.applies_at
|
|
1781
|
+
)
|
|
1814
1782
|
|
|
1815
1783
|
|
|
1816
1784
|
def _object(value: Any, path: str) -> dict[str, Any]:
|
{mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/fitness.py
RENAMED
|
@@ -88,20 +88,20 @@ def build_fitness_report(
|
|
|
88
88
|
"max_publication_delay_seconds",
|
|
89
89
|
"must not be negative",
|
|
90
90
|
)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
# Rights always admit; the status and its obligations are recorded on the report rather
|
|
92
|
+
# than adjudicated. ``rights_disposition`` is still consulted so this module keeps reading
|
|
93
|
+
# the one authority instead of growing an opinion of its own.
|
|
94
|
+
assert rights_disposition(rights.status) == "admit"
|
|
95
|
+
evaluate_obligations(
|
|
96
|
+
rights=rights,
|
|
97
|
+
lifecycle="candidate",
|
|
98
|
+
intended_use=intended_use,
|
|
99
|
+
attached_artifact_digests=attached_license_artifact_digests,
|
|
100
|
+
)
|
|
98
101
|
|
|
99
102
|
outcomes = signals.outcome_map()
|
|
100
103
|
summaries = signals.summary_map()
|
|
101
104
|
cited_digests = tuple(item.content_sha256 for item in signals.evidence)
|
|
102
|
-
if rights_disposition(rights.status) != "admit":
|
|
103
|
-
outcomes["rights"] = False
|
|
104
|
-
summaries["rights"] = f"rights status {rights.status} blocks source selection"
|
|
105
105
|
if require_timely and (
|
|
106
106
|
observation.live_status != "live"
|
|
107
107
|
or observation.publication_delay_seconds > max_publication_delay_seconds
|
|
@@ -126,10 +126,7 @@ def build_fitness_report(
|
|
|
126
126
|
for dimension in sorted(FITNESS_DIMENSIONS)
|
|
127
127
|
)
|
|
128
128
|
failed = [item.dimension for item in dimensions if item.outcome != "pass"]
|
|
129
|
-
if
|
|
130
|
-
decision = "human_escalation_required"
|
|
131
|
-
reason = "rights are unclear and require human legal/product escalation"
|
|
132
|
-
elif failed:
|
|
129
|
+
if failed:
|
|
133
130
|
decision = "rejected"
|
|
134
131
|
reason = f"failed fitness dimensions: {', '.join(failed)}"
|
|
135
132
|
else:
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
"""The single repository-wide rights-status disposition authority.
|
|
2
2
|
|
|
3
|
-
One rule decides what a rights status *means
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
One rule decides what a rights status *means*. Since the 2026-08 licensing-policy change the
|
|
4
|
+
answer is always ``admit``: a rights status is provenance the platform records and delivers with
|
|
5
|
+
the dataset, never a gate that stops work. Responsibility for honouring a source's licence sits
|
|
6
|
+
with the consumer of the dataset, who receives the status, the reason, and any attached licence
|
|
7
|
+
artifacts to make that call. The ``escalate`` and ``refuse`` dispositions remain in the
|
|
8
|
+
vocabulary so historical documents still parse, but no status maps to them any more.
|
|
9
|
+
|
|
10
|
+
The fitness adjudicator (:mod:`mostlyright.data_harness.sources.fitness`) and the source-catalog
|
|
11
|
+
gate both read this module, so the two cannot drift into disagreeing adjudicators.
|
|
6
12
|
|
|
7
13
|
This module deliberately imports almost nothing. It depends on ``SourceContractError`` and
|
|
8
14
|
``RIGHTS_STATUSES`` from :mod:`mostlyright.data_harness.sources.contracts` and on nothing else --
|
|
@@ -22,8 +28,8 @@ RIGHTS_DISPOSITIONS: frozenset[str] = frozenset({"admit", "escalate", "refuse"})
|
|
|
22
28
|
_DISPOSITION_BY_STATUS: dict[str, str] = {
|
|
23
29
|
"approved": "admit",
|
|
24
30
|
"conditional": "admit",
|
|
25
|
-
"unclear": "
|
|
26
|
-
"prohibited": "
|
|
31
|
+
"unclear": "admit",
|
|
32
|
+
"prohibited": "admit",
|
|
27
33
|
}
|
|
28
34
|
|
|
29
35
|
if set(_DISPOSITION_BY_STATUS) != set(RIGHTS_STATUSES): # pragma: no cover - import-time guard
|
|
@@ -1078,23 +1078,15 @@ class _CaptureRun:
|
|
|
1078
1078
|
|
|
1079
1079
|
|
|
1080
1080
|
def require_live_capture_permitted(entry: StreamConnectorEntry) -> None:
|
|
1081
|
-
"""
|
|
1081
|
+
"""Formerly the CON-LIC-1 fence; now a no-op kept for its call sites.
|
|
1082
1082
|
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
Public so that a driver capturing many members of one series can refuse a forbidden connector
|
|
1088
|
-
once, before it plans a schedule nobody may run. Every member's session checks it again at the
|
|
1089
|
-
point of use: one implementation of the rule, checked wherever a capture could begin.
|
|
1083
|
+
Licensing is recorded, never enforced: ``live_capture`` and its reason travel with the
|
|
1084
|
+
registry entry into capture evidence, and the consumer of the dataset judges them. The
|
|
1085
|
+
function remains so every place a capture could begin still reads the policy field --
|
|
1086
|
+
deleting the call sites would silently drop the recording path too.
|
|
1090
1087
|
"""
|
|
1091
1088
|
|
|
1092
|
-
|
|
1093
|
-
raise _refuse(
|
|
1094
|
-
"STREAM_LIVE_FORBIDDEN",
|
|
1095
|
-
"connector.live_capture",
|
|
1096
|
-
entry.live_capture_reason or f"connector {entry.connector_id} may not be captured live",
|
|
1097
|
-
)
|
|
1089
|
+
del entry
|
|
1098
1090
|
|
|
1099
1091
|
|
|
1100
1092
|
def _require_limits(config: StreamConnectorConfig, limits: CaptureLimits) -> None:
|
|
@@ -102,11 +102,12 @@ MAX_ROTATION_WINDOWS = 512
|
|
|
102
102
|
#: carries a dot, so this name can never collide with a member's capture directory.
|
|
103
103
|
ROTATION_RECORD_SUFFIX = "-rotation.json"
|
|
104
104
|
|
|
105
|
-
# The refusals that end a whole rotation rather than one member of it. ``STREAM_LIVE_FORBIDDEN``
|
|
106
|
-
#
|
|
107
|
-
#
|
|
108
|
-
#
|
|
109
|
-
# occupied capture directory --
|
|
105
|
+
# The refusals that end a whole rotation rather than one member of it. ``STREAM_LIVE_FORBIDDEN``
|
|
106
|
+
# stopped being raisable when licensing became record-only, but a rotation replaying an older
|
|
107
|
+
# record may still read the code, so it stays classified. The rotation family is this module's
|
|
108
|
+
# own schedule refusals, which are facts about the plan and not about the venue. Everything
|
|
109
|
+
# else -- a dropped socket, a recording that would not seal, an occupied capture directory --
|
|
110
|
+
# belongs to one member.
|
|
110
111
|
_ROTATION_STOPPING_CODES = frozenset({"STREAM_LIVE_FORBIDDEN"})
|
|
111
112
|
_ROTATION_CODE_PREFIX = "STREAM_ROTATION"
|
|
112
113
|
|