mostlyright-data 0.9.5__tar.gz → 0.9.6__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.5 → mostlyright_data-0.9.6}/PKG-INFO +12 -13
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/README.md +11 -12
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/pyproject.toml +1 -1
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/cli.py +46 -10
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_worker.py +163 -18
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_worker.py +145 -23
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/pipeline.py +9 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/progress_events.py +75 -2
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving.py +17 -4
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/session_probes.py +26 -3
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/acquire.py +16 -6
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/download.py +80 -11
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/stream.py +6 -1
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/.gitignore +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/http.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/event_presentation.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/fleet.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/formats.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/service.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/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.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/recipe.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/adapters.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/errors.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving_edge.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving_http.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/adapters.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/fitness.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/studio_boundary.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/propose.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/router.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/transport.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/approve.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/diffing.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/headline.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/inventory.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/local_review.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/peek.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/preflight.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/remediation.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/render.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/workload.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/viewer.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/query.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
- {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/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.6
|
|
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/
|
|
@@ -81,12 +81,11 @@ Description-Content-Type: text/markdown
|
|
|
81
81
|
|
|
82
82
|
# mostlyright-data
|
|
83
83
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
source links, timestamps, and check results.
|
|
84
|
+
Browse datasets built by our community or create your own with agents that find the sources and
|
|
85
|
+
configure the pipeline. Mostly Right keeps the dataset live.
|
|
87
86
|
|
|
88
|
-
`mostlyright-data` is the command-line client. It
|
|
89
|
-
|
|
87
|
+
`mostlyright-data` is the command-line client. It opens hosted research sessions, starts and
|
|
88
|
+
follows hosted dataset runs, and downloads verified datasets after they finish.
|
|
90
89
|
|
|
91
90
|
## Requirements
|
|
92
91
|
|
|
@@ -119,20 +118,20 @@ mr-data --help
|
|
|
119
118
|
Use `mr-data research-open`, `mr-data research-status`, and `mr-data research-close` for hosted
|
|
120
119
|
research sessions. `research-status` shows the current state.
|
|
121
120
|
|
|
122
|
-
## Local
|
|
121
|
+
## Local execution
|
|
123
122
|
|
|
124
|
-
The
|
|
123
|
+
The local execution lane runs only on Linux:
|
|
125
124
|
|
|
126
125
|
```bash
|
|
127
126
|
python -m pip install "mostlyright-data[local]"
|
|
128
127
|
```
|
|
129
128
|
|
|
130
|
-
|
|
129
|
+
It builds and checks worker inputs. It is not required for the hosted client.
|
|
131
130
|
|
|
132
131
|
## Documentation
|
|
133
132
|
|
|
134
133
|
- [CLI guide](https://mostlyright.md/docs/guides/cli/)
|
|
135
|
-
- [
|
|
134
|
+
- [Hosted research sessions](https://mostlyright.md/docs/guides/hosted-research/)
|
|
136
135
|
- [Credentials](https://mostlyright.md/docs/guides/credentials/)
|
|
137
136
|
- [Public datasets](https://mostlyright.md/docs/guides/use-public-datasets/)
|
|
138
137
|
|
|
@@ -141,11 +140,11 @@ Use `mr-data --help` for the full command list and options. Commands that suppor
|
|
|
141
140
|
|
|
142
141
|
For local builds, `--input-root` and `--output` may use relative paths.
|
|
143
142
|
|
|
144
|
-
##
|
|
143
|
+
## Behavior and limits
|
|
145
144
|
|
|
146
145
|
- `mr-data review --local RUN_DIR` exits 1 when a check fails.
|
|
147
|
-
- The weather
|
|
148
|
-
- Hosted credential-free acquisition
|
|
146
|
+
- The weather reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
|
|
147
|
+
- Hosted credential-free acquisition supports one single-address public HTTPS object. Bounded collections require both local attestations.
|
|
149
148
|
|
|
150
149
|
## Verification
|
|
151
150
|
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
# mostlyright-data
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
source links, timestamps, and check results.
|
|
3
|
+
Browse datasets built by our community or create your own with agents that find the sources and
|
|
4
|
+
configure the pipeline. Mostly Right keeps the dataset live.
|
|
6
5
|
|
|
7
|
-
`mostlyright-data` is the command-line client. It
|
|
8
|
-
|
|
6
|
+
`mostlyright-data` is the command-line client. It opens hosted research sessions, starts and
|
|
7
|
+
follows hosted dataset runs, and downloads verified datasets after they finish.
|
|
9
8
|
|
|
10
9
|
## Requirements
|
|
11
10
|
|
|
@@ -38,20 +37,20 @@ mr-data --help
|
|
|
38
37
|
Use `mr-data research-open`, `mr-data research-status`, and `mr-data research-close` for hosted
|
|
39
38
|
research sessions. `research-status` shows the current state.
|
|
40
39
|
|
|
41
|
-
## Local
|
|
40
|
+
## Local execution
|
|
42
41
|
|
|
43
|
-
The
|
|
42
|
+
The local execution lane runs only on Linux:
|
|
44
43
|
|
|
45
44
|
```bash
|
|
46
45
|
python -m pip install "mostlyright-data[local]"
|
|
47
46
|
```
|
|
48
47
|
|
|
49
|
-
|
|
48
|
+
It builds and checks worker inputs. It is not required for the hosted client.
|
|
50
49
|
|
|
51
50
|
## Documentation
|
|
52
51
|
|
|
53
52
|
- [CLI guide](https://mostlyright.md/docs/guides/cli/)
|
|
54
|
-
- [
|
|
53
|
+
- [Hosted research sessions](https://mostlyright.md/docs/guides/hosted-research/)
|
|
55
54
|
- [Credentials](https://mostlyright.md/docs/guides/credentials/)
|
|
56
55
|
- [Public datasets](https://mostlyright.md/docs/guides/use-public-datasets/)
|
|
57
56
|
|
|
@@ -60,11 +59,11 @@ Use `mr-data --help` for the full command list and options. Commands that suppor
|
|
|
60
59
|
|
|
61
60
|
For local builds, `--input-root` and `--output` may use relative paths.
|
|
62
61
|
|
|
63
|
-
##
|
|
62
|
+
## Behavior and limits
|
|
64
63
|
|
|
65
64
|
- `mr-data review --local RUN_DIR` exits 1 when a check fails.
|
|
66
|
-
- The weather
|
|
67
|
-
- Hosted credential-free acquisition
|
|
65
|
+
- The weather reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
|
|
66
|
+
- Hosted credential-free acquisition supports one single-address public HTTPS object. Bounded collections require both local attestations.
|
|
68
67
|
|
|
69
68
|
## Verification
|
|
70
69
|
|
|
@@ -96,7 +96,6 @@ from mostlyright.data_harness.offline import (
|
|
|
96
96
|
)
|
|
97
97
|
from mostlyright.data_harness.pipeline import (
|
|
98
98
|
_VERIFY_ALLOWLISTED_ENGINES,
|
|
99
|
-
MAX_ROWS,
|
|
100
99
|
SOURCE_PROPOSAL_SET_VERSION,
|
|
101
100
|
BuildError,
|
|
102
101
|
ResourceLimits,
|
|
@@ -106,7 +105,10 @@ from mostlyright.data_harness.pipeline import (
|
|
|
106
105
|
verify_candidate, # noqa: F401 - retained for compatibility/security-route monkeypatch tests
|
|
107
106
|
)
|
|
108
107
|
from mostlyright.data_harness.plan_graph import (
|
|
108
|
+
HARD_MAX_INTERMEDIATE_ROWS,
|
|
109
|
+
HARD_MAX_OUTPUT_ROWS,
|
|
109
110
|
HARD_MAX_RETAINED_BYTES,
|
|
111
|
+
HARD_MAX_SOURCE_ROWS,
|
|
110
112
|
GraphResourcePolicy,
|
|
111
113
|
)
|
|
112
114
|
from mostlyright.data_harness.readers.contracts import ReaderError
|
|
@@ -393,17 +395,44 @@ def _selected_graph_limits(
|
|
|
393
395
|
max_intermediate_rows: int | None,
|
|
394
396
|
max_retained_bytes: int | None,
|
|
395
397
|
) -> ResourceLimits | None:
|
|
396
|
-
"""
|
|
398
|
+
"""Narrow the trusted graph policy by exactly the dimensions the operator named.
|
|
399
|
+
|
|
400
|
+
These flags are a NARROWING instrument and nothing else. The baseline is what a build with no
|
|
401
|
+
flags at all already runs under -- ``GraphResourcePolicy()``, whose defaults are the engine's
|
|
402
|
+
own hard ceilings -- so an unnamed dimension keeps that ceiling and a named one lowers only
|
|
403
|
+
itself. The invariant is worth stating because it is what makes the flags safe to reach for:
|
|
404
|
+
for every dimension, the policy this returns is at most the no-flag default, and equals it
|
|
405
|
+
unless the flag naming that dimension was supplied.
|
|
406
|
+
|
|
407
|
+
It used to default every row dimension to ``pipeline.MAX_ROWS`` instead. That is the v1 plan's
|
|
408
|
+
row policy, not the graph engine's, and it is 1/100th of ``HARD_MAX_SOURCE_ROWS``: naming a
|
|
409
|
+
byte budget alone silently cut a v2 build's row ceiling to 100k, which is the opposite of what
|
|
410
|
+
an operator raising a budget is asking for. ``build`` only reaches this function for a v2 plan
|
|
411
|
+
-- a graph flag on a v1 plan is refused as ``GRAPH_POLICY_V1`` before the build starts -- so
|
|
412
|
+
there is no v1 caller whose 100k cap this could be speaking for.
|
|
413
|
+
|
|
414
|
+
``--graph-max-rows`` sets the source AND output ceilings, as its help says: one number for
|
|
415
|
+
"how many rows this build may read and release". The intermediate ceiling is separate because
|
|
416
|
+
the engine's own contract separates them (``HARD_MAX_INTERMEDIATE_ROWS`` is four times
|
|
417
|
+
``HARD_MAX_SOURCE_ROWS``, sized for a union of several year-scale sources), so an operator who
|
|
418
|
+
wants a narrower working set says so with the flag that means it.
|
|
419
|
+
"""
|
|
397
420
|
|
|
398
421
|
if max_rows is None and max_intermediate_rows is None and max_retained_bytes is None:
|
|
399
422
|
return None
|
|
400
|
-
selected_rows = max_rows or
|
|
423
|
+
selected_rows = max_rows or HARD_MAX_SOURCE_ROWS
|
|
401
424
|
return ResourceLimits(
|
|
425
|
+
# The v1 field, carried for a v2 build so `_replay_graph_derivations` streams sources under
|
|
426
|
+
# the policy rather than under the 100k default. It re-derives the same value from
|
|
427
|
+
# `graph_policy` anyway; agreeing here keeps the two from reading differently.
|
|
402
428
|
max_rows=selected_rows,
|
|
403
429
|
graph_policy=GraphResourcePolicy(
|
|
404
430
|
max_source_rows=selected_rows,
|
|
405
|
-
max_intermediate_rows=max_intermediate_rows or
|
|
406
|
-
|
|
431
|
+
max_intermediate_rows=max_intermediate_rows or HARD_MAX_INTERMEDIATE_ROWS,
|
|
432
|
+
# `min` because the two ceilings are equal today and are not the same contract: a
|
|
433
|
+
# source ceiling that ever rose above the output one must not raise the output one
|
|
434
|
+
# with it.
|
|
435
|
+
max_output_rows=min(selected_rows, HARD_MAX_OUTPUT_ROWS),
|
|
407
436
|
max_retained_bytes=max_retained_bytes or HARD_MAX_RETAINED_BYTES,
|
|
408
437
|
),
|
|
409
438
|
)
|
|
@@ -1834,22 +1863,29 @@ def _parser(
|
|
|
1834
1863
|
build.add_argument("--producer-principal", required=True, help=_BUILT_BY)
|
|
1835
1864
|
build.add_argument("--producer-attempt", required=True, help=_BUILD_ATTEMPT)
|
|
1836
1865
|
build.add_argument("--research-dir", type=Path, help="existing visual research directory")
|
|
1866
|
+
# ⚠ THE ARGPARSE MAXIMA ARE THE ENGINE'S OWN HARD CEILINGS, and deliberately not a second,
|
|
1867
|
+
# smaller policy. `GraphResourcePolicy.__post_init__` is the single enforcement point -- it
|
|
1868
|
+
# refuses anything above a ceiling whatever route the value arrived by -- so a smaller number
|
|
1869
|
+
# here would not be a safety property, only a cap the CLI applies and the library does not.
|
|
1870
|
+
# The previous maxima (1M rows, 2M intermediate, 256 MiB retained) were 1/10th, 1/20th and
|
|
1871
|
+
# 1/64th of the ceilings they front, with nothing written down deriving them, and they made
|
|
1872
|
+
# the year-scale capacity the graph engine documents unreachable from the command line.
|
|
1837
1873
|
build.add_argument(
|
|
1838
1874
|
"--graph-max-rows",
|
|
1839
|
-
type=_integer_between(1,
|
|
1840
|
-
metavar="1..
|
|
1875
|
+
type=_integer_between(1, HARD_MAX_SOURCE_ROWS),
|
|
1876
|
+
metavar=f"1..{HARD_MAX_SOURCE_ROWS}",
|
|
1841
1877
|
help="trusted graph source/output row ceiling (v2 plans only)",
|
|
1842
1878
|
)
|
|
1843
1879
|
build.add_argument(
|
|
1844
1880
|
"--graph-max-intermediate-rows",
|
|
1845
|
-
type=_integer_between(1,
|
|
1881
|
+
type=_integer_between(1, HARD_MAX_INTERMEDIATE_ROWS),
|
|
1846
1882
|
default=None,
|
|
1847
|
-
metavar="1..
|
|
1883
|
+
metavar=f"1..{HARD_MAX_INTERMEDIATE_ROWS}",
|
|
1848
1884
|
help="trusted graph intermediate row ceiling",
|
|
1849
1885
|
)
|
|
1850
1886
|
build.add_argument(
|
|
1851
1887
|
"--graph-max-retained-bytes",
|
|
1852
|
-
type=_integer_between(1,
|
|
1888
|
+
type=_integer_between(1, HARD_MAX_RETAINED_BYTES),
|
|
1853
1889
|
default=None,
|
|
1854
1890
|
metavar="BYTES",
|
|
1855
1891
|
help="trusted graph retained-byte ceiling",
|
|
@@ -233,6 +233,50 @@ MAX_SESSION_CAPABILITY_REMAINING_SECONDS = 30 * 60
|
|
|
233
233
|
#: parent-side parser a fixed-memory boundary if a child is compromised.
|
|
234
234
|
MAX_SESSION_SUPERVISOR_MESSAGE_BYTES = 128 * 1024
|
|
235
235
|
|
|
236
|
+
# **THE SESSION'S OWN PROGRESS BUDGET, and why it is not the producer's.**
|
|
237
|
+
#
|
|
238
|
+
# ``progress_events.MAX_PROGRESS_EVENTS_PER_ATTEMPT = 512`` bounds a stream whose shape a RECIPE
|
|
239
|
+
# fixes: one record per source, per artifact and per stage. A correct producer cannot approach it,
|
|
240
|
+
# so reaching it means a caller is looping -- which is exactly what that paragraph says, and none
|
|
241
|
+
# of it is edited here.
|
|
242
|
+
#
|
|
243
|
+
# A session has no such shape. Its stream is TWO records per probe (`source_probe_started` and
|
|
244
|
+
# `source_probe_settled`) over a conversation whose length nobody knows when it opens, so the
|
|
245
|
+
# producer's number bought 255 probes and then went dark -- silently, and taking `attempt_finished`
|
|
246
|
+
# with it, which left every watcher holding a start that never ends (#334). Both halves of that are
|
|
247
|
+
# fixed below: the budget is derived from what actually bounds a session, and the terminal record
|
|
248
|
+
# is not spendable by probe traffic.
|
|
249
|
+
#
|
|
250
|
+
# The derivation. ``MAX_SESSION_CAPABILITY_REMAINING_SECONDS`` is the hard ceiling on how long a
|
|
251
|
+
# session may run at all, and the interactive follow-up budget a warm sandbox pool exists to meet
|
|
252
|
+
# is 100 ms at its fastest (see ``DEFAULT_WARM_POOL_SIZE``). Half an hour of back-to-back probes at
|
|
253
|
+
# that floor is the most probes a session can physically raise; a session that emits more records
|
|
254
|
+
# than that is looping, and costs Studio nothing when it does.
|
|
255
|
+
MIN_PROBE_ROUND_TRIP_SECONDS = 0.1
|
|
256
|
+
MAX_SESSION_PROBES = int(MAX_SESSION_CAPABILITY_REMAINING_SECONDS / MIN_PROBE_ROUND_TRIP_SECONDS)
|
|
257
|
+
#: Never spent by probe traffic: the terminal `attempt_finished` a watcher pairs with
|
|
258
|
+
#: `attempt_started`, and the one `attempt_failed` diagnostic that reports how many records the
|
|
259
|
+
#: budget dropped. Reserving them is what makes "the stream always ends, and says why it thinned"
|
|
260
|
+
#: a property of the emitter rather than of the session being short enough.
|
|
261
|
+
RESERVED_SESSION_PROGRESS_EVENTS = 2
|
|
262
|
+
#: Two records per probe, plus the opening `attempt_started`, plus the two reserved above.
|
|
263
|
+
MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT = (
|
|
264
|
+
2 * MAX_SESSION_PROBES + 1 + RESERVED_SESSION_PROGRESS_EVENTS
|
|
265
|
+
)
|
|
266
|
+
#: The names the reserved slots are for. Both are terminal narration and neither is emitted by the
|
|
267
|
+
#: probe loop, so no amount of probe traffic can consume the slot the other one needs.
|
|
268
|
+
TERMINAL_SESSION_PROGRESS_EVENTS = frozenset({"attempt_finished", "attempt_failed"})
|
|
269
|
+
#: THE PAIR, which the budget spends as one thing. A watcher's whole use for this stream is that a
|
|
270
|
+
#: start it sees will be followed by an end -- `_answer_probe` already emits both halves under one
|
|
271
|
+
#: condition for that reason -- so a budget that could admit a start and then refuse its settlement
|
|
272
|
+
#: would reintroduce the dangling start by the back door. A start therefore costs TWO slots, its own
|
|
273
|
+
#: and the settlement it promises, and a settlement whose start was admitted is never refused.
|
|
274
|
+
PROBE_PROGRESS_STARTED = "source_probe_started"
|
|
275
|
+
PROBE_PROGRESS_SETTLED = "source_probe_settled"
|
|
276
|
+
#: The code the disarm diagnostic settles under. A token, because it reaches a timeline as a
|
|
277
|
+
#: progress fact and `progress_events` drops a record whose fact is prose.
|
|
278
|
+
PROGRESS_BUDGET_EXHAUSTED_CODE = "SESSION_PROGRESS_BUDGET_EXHAUSTED"
|
|
279
|
+
|
|
236
280
|
_UTC_TIMESTAMP = re.compile(
|
|
237
281
|
r"^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.[0-9]{1,6})?Z$"
|
|
238
282
|
)
|
|
@@ -1407,7 +1451,9 @@ class StudioSessionAcquisitionReader:
|
|
|
1407
1451
|
filename=filename,
|
|
1408
1452
|
# The bytes are whole or they are refused. Studio clamps the source to the session
|
|
1409
1453
|
# ceiling before it crawls, and a truncated table would make every count a probe
|
|
1410
|
-
# reports quietly wrong, so there is no partial answer to flag here.
|
|
1454
|
+
# reports quietly wrong, so there is no partial answer to flag here. This is the
|
|
1455
|
+
# STARTING value of the probe envelope's `truncated`, not the whole of it: an answer
|
|
1456
|
+
# that drops columns or rows of its own raises the flag where it drops them.
|
|
1411
1457
|
truncated=False,
|
|
1412
1458
|
origin="studio.session-acquisition",
|
|
1413
1459
|
)
|
|
@@ -1540,6 +1586,12 @@ class ProbeExecutor:
|
|
|
1540
1586
|
"content_bytes": len(source.content),
|
|
1541
1587
|
"data_format": parsed.data_format,
|
|
1542
1588
|
"sandbox_policy_digest": result.policy_digest,
|
|
1589
|
+
# The parse's own width, before any answer narrows it. Set here rather than in each
|
|
1590
|
+
# per-kind answer so it is the SOURCE's number in every one of them, and so an answer
|
|
1591
|
+
# that returns fewer columns has its denominator beside it rather than nowhere.
|
|
1592
|
+
"column_count": len(parsed.columns),
|
|
1593
|
+
# The source's own flag is the starting value and not the final one: the per-kind
|
|
1594
|
+
# answers below raise it when they drop columns or rows of their own.
|
|
1543
1595
|
"truncated": bool(source.truncated),
|
|
1544
1596
|
}
|
|
1545
1597
|
body = self._answer(probe_kind, normalized, parsed, envelope)
|
|
@@ -1576,6 +1628,12 @@ class ProbeExecutor:
|
|
|
1576
1628
|
# Deliberately no cell values. `source_inspect` answers "what shape is this", and a client
|
|
1577
1629
|
# that wants values asks `sample_rows` -- which is a separate probe, separately visible on
|
|
1578
1630
|
# the session's event stream, so "who looked at the data" stays answerable.
|
|
1631
|
+
described = columns[: session_probes.MAX_PROFILE_COLUMNS]
|
|
1632
|
+
# The probe whose ONE job is to report a source's shape must not misreport it. A source
|
|
1633
|
+
# wider than `MAX_PROFILE_COLUMNS` is still answered -- the first 256 columns are the useful
|
|
1634
|
+
# answer -- but `truncated` says the list is a prefix and `column_count` says of what.
|
|
1635
|
+
if len(described) < len(columns):
|
|
1636
|
+
envelope["truncated"] = True
|
|
1579
1637
|
return {
|
|
1580
1638
|
**envelope,
|
|
1581
1639
|
"schema_digest": parsed.schema_digest,
|
|
@@ -1584,7 +1642,7 @@ class ProbeExecutor:
|
|
|
1584
1642
|
"name": name,
|
|
1585
1643
|
"inferred_type": session_probes.inferred_type([row[index] for row in scanned]),
|
|
1586
1644
|
}
|
|
1587
|
-
for index, name in enumerate(
|
|
1645
|
+
for index, name in enumerate(described)
|
|
1588
1646
|
],
|
|
1589
1647
|
}
|
|
1590
1648
|
|
|
@@ -1595,7 +1653,9 @@ class ProbeExecutor:
|
|
|
1595
1653
|
rows: Sequence[Sequence[Any]],
|
|
1596
1654
|
envelope: dict[str, Any],
|
|
1597
1655
|
) -> dict[str, Any]:
|
|
1598
|
-
selected = self._selected_columns(request, columns)
|
|
1656
|
+
selected, columns_dropped = self._selected_columns(request, columns)
|
|
1657
|
+
if columns_dropped:
|
|
1658
|
+
envelope["truncated"] = True
|
|
1599
1659
|
indices = [columns.index(name) for name in selected]
|
|
1600
1660
|
window = rows[request["offset"] : request["offset"] + request["limit"]]
|
|
1601
1661
|
envelope["rows_scanned"] = request["offset"] + len(window)
|
|
@@ -1617,9 +1677,10 @@ class ProbeExecutor:
|
|
|
1617
1677
|
# monotone predicate, and the search returns the same maximal prefix the popping loop
|
|
1618
1678
|
# walked down to. Two details of the old loop are semantics rather than mechanics, and are
|
|
1619
1679
|
# preserved exactly: a body that fits whole is returned with `truncated` UNTOUCHED (the
|
|
1620
|
-
# envelope's own value
|
|
1621
|
-
#
|
|
1622
|
-
# the
|
|
1680
|
+
# envelope's own value -- the source's flag, and now also the projection's, raised above
|
|
1681
|
+
# when it dropped columns), and the flag is set BEFORE the fitting is measured, because
|
|
1682
|
+
# `true` and `false` are not the same width and the byte count has to be the one the answer
|
|
1683
|
+
# will actually be sent as.
|
|
1623
1684
|
rows = body["rows"]
|
|
1624
1685
|
if not rows or len(canonical_json_bytes(body)) <= session_probes.PROBE_RESULT_MAX_BYTES:
|
|
1625
1686
|
return body
|
|
@@ -1642,7 +1703,9 @@ class ProbeExecutor:
|
|
|
1642
1703
|
scanned: Sequence[Sequence[Any]],
|
|
1643
1704
|
envelope: dict[str, Any],
|
|
1644
1705
|
) -> dict[str, Any]:
|
|
1645
|
-
selected = self._selected_columns(request, columns)
|
|
1706
|
+
selected, columns_dropped = self._selected_columns(request, columns)
|
|
1707
|
+
if columns_dropped:
|
|
1708
|
+
envelope["truncated"] = True
|
|
1646
1709
|
profiles: list[dict[str, Any]] = []
|
|
1647
1710
|
for name in selected:
|
|
1648
1711
|
index = columns.index(name)
|
|
@@ -1733,16 +1796,27 @@ class ProbeExecutor:
|
|
|
1733
1796
|
|
|
1734
1797
|
def _selected_columns(
|
|
1735
1798
|
self, request: Mapping[str, Any], columns: Sequence[str]
|
|
1736
|
-
) -> tuple[str, ...]:
|
|
1799
|
+
) -> tuple[tuple[str, ...], bool]:
|
|
1800
|
+
"""Return the projection and whether choosing it DROPPED columns from the source.
|
|
1801
|
+
|
|
1802
|
+
A caller who names columns gets exactly those and nothing was dropped: that is a
|
|
1803
|
+
projection, and reporting it as truncation would make `truncated` mean "you did not ask
|
|
1804
|
+
for every column", which is true of almost every probe and tells nobody anything. A caller
|
|
1805
|
+
who names none is offered the source's columns and gets at most `MAX_PROFILE_COLUMNS` of
|
|
1806
|
+
them -- and that IS a drop, because the answer is a prefix of what was offered and used to
|
|
1807
|
+
say `truncated: false` while being one.
|
|
1808
|
+
"""
|
|
1809
|
+
|
|
1737
1810
|
requested = request.get("columns")
|
|
1738
1811
|
if requested is None:
|
|
1739
|
-
|
|
1812
|
+
selected = tuple(columns[: session_probes.MAX_PROFILE_COLUMNS])
|
|
1813
|
+
return selected, len(selected) < len(columns)
|
|
1740
1814
|
unknown = [name for name in requested if name not in columns]
|
|
1741
1815
|
if unknown:
|
|
1742
1816
|
raise SessionWorkerError(
|
|
1743
1817
|
"PROBE_COLUMN_UNKNOWN", f"source has no column named {unknown[0]!r}"
|
|
1744
1818
|
)
|
|
1745
|
-
return tuple(requested)
|
|
1819
|
+
return tuple(requested), False
|
|
1746
1820
|
|
|
1747
1821
|
|
|
1748
1822
|
def _probe_failure_code(error: BaseException) -> str:
|
|
@@ -2648,11 +2722,7 @@ class SessionSupervisor:
|
|
|
2648
2722
|
self._claim_loop(authority, models, lease, executor, progress, deadline)
|
|
2649
2723
|
finally:
|
|
2650
2724
|
self._stop.set()
|
|
2651
|
-
progress.
|
|
2652
|
-
"attempt_finished",
|
|
2653
|
-
{"outcome": self.outcome.terminal_state or "stopped"},
|
|
2654
|
-
)
|
|
2655
|
-
progress.close()
|
|
2725
|
+
progress.finish(self.outcome.terminal_state or "stopped")
|
|
2656
2726
|
try:
|
|
2657
2727
|
sandbox.close_warm_pool()
|
|
2658
2728
|
except Exception:
|
|
@@ -2947,6 +3017,13 @@ class _SessionProgress:
|
|
|
2947
3017
|
append was refused has lost the thing it exists for. Records go out one at a time rather than
|
|
2948
3018
|
batched, because a session's whole product claim is that a probe is visible immediately, and a
|
|
2949
3019
|
250 ms coalescing window is a quarter of the follow-up budget.
|
|
3020
|
+
|
|
3021
|
+
THE BUDGET IS THE SESSION'S OWN (``MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT``), and running out
|
|
3022
|
+
of it thins the stream rather than ending it: ordinary records past the budget are counted and
|
|
3023
|
+
dropped, the probe pair is dropped whole rather than half, and the two reserved slots still
|
|
3024
|
+
carry the terminal `attempt_finished` and one `attempt_failed` diagnostic naming the exact
|
|
3025
|
+
number dropped. Silently disarming the whole sink at the producer's 512 was the shape this
|
|
3026
|
+
replaces, and it took the terminal record with it. See :meth:`_claim_budget`.
|
|
2950
3027
|
"""
|
|
2951
3028
|
|
|
2952
3029
|
def __init__(
|
|
@@ -2965,21 +3042,61 @@ class _SessionProgress:
|
|
|
2965
3042
|
self._batch = 0
|
|
2966
3043
|
self._pending: list[Any] = []
|
|
2967
3044
|
self._armed = True
|
|
3045
|
+
self._dropped = 0
|
|
3046
|
+
self._unsettled_starts = 0
|
|
2968
3047
|
|
|
2969
3048
|
@property
|
|
2970
3049
|
def armed(self) -> bool:
|
|
2971
3050
|
return self._armed
|
|
2972
3051
|
|
|
3052
|
+
@property
|
|
3053
|
+
def dropped(self) -> int:
|
|
3054
|
+
"""How many records the budget refused. Reported on the timeline by :meth:`finish`."""
|
|
3055
|
+
|
|
3056
|
+
return self._dropped
|
|
3057
|
+
|
|
3058
|
+
def _claim_budget(self, name: str) -> bool:
|
|
3059
|
+
"""Decide whether one record fits, SPENDING its slots when it does.
|
|
3060
|
+
|
|
3061
|
+
Three rules, in the order they are read:
|
|
3062
|
+
|
|
3063
|
+
* Terminal narration draws on the whole budget, so a probe loop can never spend the record
|
|
3064
|
+
that ends the stream or the one that explains why it thinned.
|
|
3065
|
+
* A settlement whose start was admitted is never refused. The pair is what a watcher reads
|
|
3066
|
+
this stream for; a start with no end is indistinguishable from a probe still running,
|
|
3067
|
+
forever, which is precisely the failure the budget must not reintroduce.
|
|
3068
|
+
* Everything else stops short of the reserved slots -- and a probe START costs two of them,
|
|
3069
|
+
its own and the settlement it has just promised, so the pair is admitted whole or not at
|
|
3070
|
+
all.
|
|
3071
|
+
"""
|
|
3072
|
+
|
|
3073
|
+
if name in TERMINAL_SESSION_PROGRESS_EVENTS:
|
|
3074
|
+
return self._sequence < MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT
|
|
3075
|
+
if name == PROBE_PROGRESS_SETTLED:
|
|
3076
|
+
if self._unsettled_starts <= 0:
|
|
3077
|
+
return False
|
|
3078
|
+
self._unsettled_starts -= 1
|
|
3079
|
+
return True
|
|
3080
|
+
ordinary = MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT - RESERVED_SESSION_PROGRESS_EVENTS
|
|
3081
|
+
cost = 2 if name == PROBE_PROGRESS_STARTED else 1
|
|
3082
|
+
if self._sequence + cost > ordinary:
|
|
3083
|
+
return False
|
|
3084
|
+
if name == PROBE_PROGRESS_STARTED:
|
|
3085
|
+
self._unsettled_starts += 1
|
|
3086
|
+
return True
|
|
3087
|
+
|
|
2973
3088
|
def emit(self, name: str, facts: Mapping[str, Any]) -> None:
|
|
2974
3089
|
if self._deadline is not None and self._deadline.expired():
|
|
3090
|
+
# A different reason from the budget, and it really is a disarm: the lease is gone, so
|
|
3091
|
+
# an append would be refused rather than merely unwanted, and there is no terminal
|
|
3092
|
+
# record left to reserve a slot for.
|
|
2975
3093
|
self._armed = False
|
|
2976
3094
|
self._pending.clear()
|
|
2977
3095
|
return
|
|
2978
3096
|
if not self._armed:
|
|
2979
3097
|
return
|
|
2980
|
-
if self.
|
|
2981
|
-
self.
|
|
2982
|
-
self._pending.clear()
|
|
3098
|
+
if not self._claim_budget(name):
|
|
3099
|
+
self._dropped += 1
|
|
2983
3100
|
return
|
|
2984
3101
|
try:
|
|
2985
3102
|
self._sequence += 1
|
|
@@ -3035,6 +3152,34 @@ class _SessionProgress:
|
|
|
3035
3152
|
except Exception:
|
|
3036
3153
|
LOGGER.debug("session progress append failed", exc_info=True)
|
|
3037
3154
|
|
|
3155
|
+
def finish(self, outcome: str) -> None:
|
|
3156
|
+
"""Spend the reserved slots, in the one order that reads correctly, and close.
|
|
3157
|
+
|
|
3158
|
+
The drop diagnostic goes out BEFORE `attempt_finished` so the terminal record stays the
|
|
3159
|
+
last thing on the timeline, and it is emitted here rather than at the moment the budget ran
|
|
3160
|
+
out because only here is the number final: a diagnostic sent on the first refusal could
|
|
3161
|
+
only have said "one".
|
|
3162
|
+
|
|
3163
|
+
It travels as `attempt_failed` -> `diagnostic_emitted`, which is the vocabulary's narration
|
|
3164
|
+
ABOUT a failure and not a claim that the session failed -- the session's own outcome is the
|
|
3165
|
+
`attempt_finished` record immediately after it, unchanged.
|
|
3166
|
+
"""
|
|
3167
|
+
|
|
3168
|
+
if self._dropped:
|
|
3169
|
+
self.emit(
|
|
3170
|
+
"attempt_failed",
|
|
3171
|
+
{
|
|
3172
|
+
"code": PROGRESS_BUDGET_EXHAUSTED_CODE,
|
|
3173
|
+
"detail": (
|
|
3174
|
+
f"{self._dropped} progress records were dropped after this session "
|
|
3175
|
+
f"reached its budget of {MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT} "
|
|
3176
|
+
"records; every probe was still answered and reported"
|
|
3177
|
+
),
|
|
3178
|
+
},
|
|
3179
|
+
)
|
|
3180
|
+
self.emit("attempt_finished", {"outcome": outcome})
|
|
3181
|
+
self.close()
|
|
3182
|
+
|
|
3038
3183
|
def close(self) -> None:
|
|
3039
3184
|
try:
|
|
3040
3185
|
self.flush()
|