mostlyright-data 0.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mostlyright_data-0.9.0/.gitignore +34 -0
- mostlyright_data-0.9.0/PKG-INFO +607 -0
- mostlyright_data-0.9.0/README.md +528 -0
- mostlyright_data-0.9.0/pyproject.toml +209 -0
- mostlyright_data-0.9.0/scripts/hatch_build.py +66 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/__init__.py +158 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/__init__.py +55 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/http.py +2773 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/parsing.py +809 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/ranges.py +495 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/result_download.py +360 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/retention_admission.py +248 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/sandbox.py +4888 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/url_policy.py +530 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/agent_runtime.py +2743 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/assets/logo-ink.svg +31 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/__init__.py +28 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/pandas_backend.py +350 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/polars_backend.py +366 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/protocol.py +124 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/reference.py +83 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/registry.py +55 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/restrictions.py +126 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/canonical.py +333 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/catalog_job.py +625 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/cli.py +5398 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/contracts.py +53 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/coordinator.py +1307 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/deploy.py +924 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/deploy_target.py +312 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/deployment_evidence.py +1067 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/event_presentation.py +576 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/events.py +2152 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/fast_delimited.py +239 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/fleet.py +237 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/formats.py +236 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/governors.py +1163 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_bootstrap.py +972 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler.py +1115 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +351 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler_fetch.py +423 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler_job.py +1277 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler_protocol.py +676 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_dataset.py +1500 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_deploy.py +3037 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_handoff.py +62 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_ingestion_contract.py +504 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_ingestion_job.py +356 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +40 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_session_container_smoke.py +194 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_session_worker.py +3554 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +46 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_worker.py +6784 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/__init__.py +56 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/contracts.py +461 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/faults.py +42 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/gcs_store.py +1162 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/spool.py +130 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/store.py +885 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/key_seam.py +434 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/linux_process_boundary.py +262 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/local_contracts.py +2880 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/__init__.py +5 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/build_index.py +1087 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/contracts.py +920 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/query_trace.py +266 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/retrieval.py +700 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/sealed.py +474 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/service.py +784 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/CONTRACT.md +212 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/__init__.py +12 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/chrome.py +359 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/code_body.py +266 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/document.py +407 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/frame.py +275 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/interactive.py +337 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/markdown_body.py +477 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/mr_components.py +134 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_data.py +595 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_rich.py +906 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_source.py +260 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_stage.py +176 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_text.py +400 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/parse.py +394 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/status.py +40 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/tokens.py +1295 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/notebook.py +1710 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/offline.py +2049 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/operation_registry.py +1007 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/operator_setup.py +239 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/pipeline.py +6428 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/plan_graph.py +2026 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/__init__.py +104 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/contracts.py +1017 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/engine.py +221 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/errors.py +14 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/gates.py +751 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/joins.py +574 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/profile.py +384 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/table.py +217 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/transforms.py +568 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/progress_events.py +534 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/__init__.py +46 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/containers.py +963 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/contracts.py +542 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/delimited.py +257 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/__init__.py +33 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/admission.py +722 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/decode.py +1009 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/geometry.py +1133 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/portable_math.py +501 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/json_tabular.py +485 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/registry.py +514 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/README.md +110 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +24 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +24 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +24 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +24 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +25 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +25 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +25 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +3 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +23 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +5 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +25 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +30 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +5 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +44 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +1 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +48 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +4 -0
- mostlyright_data-0.9.0/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.0/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +24 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +27 -0
- mostlyright_data-0.9.0/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.0/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +27 -0
- mostlyright_data-0.9.0/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.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +20 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +55 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +54 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +54 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +54 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples.py +582 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/spreadsheet.py +803 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/tabular.py +510 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/recipe.py +5321 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/__init__.py +78 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/adapters.py +274 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/contracts.py +872 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/coordinator.py +1099 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/errors.py +16 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/review.py +2533 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/rowset.py +283 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/serving.py +1975 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/serving_edge.py +590 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/serving_http.py +1031 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/session_probes.py +759 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/signing.py +101 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/source_discovery.py +898 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/__init__.py +209 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/_adapter_steps.py +213 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/adapters.py +1214 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/cadence.py +1428 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/cadence_emission.py +453 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/cadence_history.py +546 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/__init__.py +17 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/admission.py +477 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/authoring.py +1701 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +701 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +1217 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/bounded_io.py +231 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/channel.py +523 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/channel_client.py +296 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/contracts.py +825 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/coverage.py +137 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/delta.py +1340 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/embedding.py +532 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/entry_v2.py +1182 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/fill.py +3889 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +459 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/fill_staging.py +1105 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/gating.py +374 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +1607 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +7 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +384 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +798 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +964 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +445 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +384 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/health.py +447 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +105 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/identity_history.py +1549 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/neural.py +1618 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +2345 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +1517 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/packed_writer.py +2802 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/query_trace.py +1037 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/recommend.py +171 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/retrieval.py +230 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +995 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +254 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/sealed.py +560 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/search.py +230 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +1097 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/update.py +891 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/collections.py +815 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/contracts.py +2223 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/deletion.py +761 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/fitness.py +162 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/governance.py +163 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/hosted.py +173 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/integration.py +218 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/range_reader.py +418 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/registry.py +514 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/rights_rule.py +59 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +1 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/sports.py +521 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/stream.py +524 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/stream_connector.py +418 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/stream_recorder.py +1404 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/studio_boundary.py +2019 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/__init__.py +37 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/acquire.py +1137 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/acquire_cancel.py +579 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/approvals.py +617 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/commands.py +406 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/download.py +194 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/narrative.py +589 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/parity.py +1070 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/propose.py +2759 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/research.py +1663 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/router.py +924 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/runs.py +519 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/session.py +281 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/stream.py +501 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/transport.py +187 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/vocabulary.py +368 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/workers.py +164 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ucum/TABLE-PIN.json +40 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +632 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/unit_flow.py +927 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/units.py +572 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/__init__.py +9 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/approve.py +485 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/author_yaml.py +597 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/cloud_auth.py +447 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/__init__.py +260 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/approve.py +136 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/auth.py +744 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/author.py +79 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_author.py +403 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_fill.py +523 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +545 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_publish.py +1838 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_search.py +71 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_update.py +437 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/deploy.py +134 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +98 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/deploy_plan.py +105 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/deploy_status.py +104 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/diff.py +74 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/index.py +84 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/inventory.py +47 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/list_builds.py +143 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/login.py +63 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/peek.py +236 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/plan_check.py +90 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/preflight.py +97 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/record.py +107 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/review_setup.py +47 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/search.py +440 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/show.py +61 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/whoami.py +37 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/credential_native.py +551 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/credential_store.py +1055 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/credentials.py +631 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/diffing.py +444 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/headline.py +671 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/hosted_acquisition.py +974 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/hosted_run_status.py +619 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/inventory.py +427 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/local_review.py +375 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/login.py +691 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/path_kind.py +147 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/peek.py +1000 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/plain_file.py +178 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/plan_check.py +311 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/preflight.py +918 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/readers.py +1124 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/remediation.py +2195 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/render.py +657 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/workload.py +1077 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/viewer.py +3713 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/__init__.py +83 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/authoring.py +235 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/contracts.py +673 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/materialize.py +486 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/observations.py +874 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/query.py +259 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/reducer.py +280 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/sdk.py +892 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/store.py +584 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/transport.py +239 -0
- mostlyright_data-0.9.0/src/mostlyright/data_harness/watch.py +2999 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
__pycache__/
|
|
3
|
+
.pytest_cache/
|
|
4
|
+
.ruff_cache/
|
|
5
|
+
*.py[cod]
|
|
6
|
+
dist/
|
|
7
|
+
build/
|
|
8
|
+
*.egg-info/
|
|
9
|
+
.env
|
|
10
|
+
.DS_Store
|
|
11
|
+
.work/
|
|
12
|
+
|
|
13
|
+
# scripts/generate_registry_tables.py stages a rewrite beside the file it is replacing and moves
|
|
14
|
+
# it into place. Nothing should survive that move; if an interruption leaves one behind, it is
|
|
15
|
+
# not a source file somebody should be offered the chance to commit.
|
|
16
|
+
*.generated
|
|
17
|
+
|
|
18
|
+
# Vendored third-party source is content, not build output. The `build/` rule above is meant for
|
|
19
|
+
# Python build artifacts and would otherwise swallow vendor/grib-rs/build/, which is the crate's
|
|
20
|
+
# own build script and is part of what the recorded tree digest covers.
|
|
21
|
+
!vendor/grib-rs/build/
|
|
22
|
+
!vendor/grib-rs/build/**
|
|
23
|
+
|
|
24
|
+
# The performance suite builds its fixture inside the repository root rather than in a temporary
|
|
25
|
+
# directory, so an interrupted or parallel run leaves one of these behind. Nothing in one is a
|
|
26
|
+
# source file: it is a generated build folder holding a hundred thousand rows of synthetic data,
|
|
27
|
+
# under directories the build seals read-only, and `git add -A` in that window commits the lot.
|
|
28
|
+
# Recorded as issue #311; ignored here so the window cannot cost anybody a rewritten branch in
|
|
29
|
+
# the meantime.
|
|
30
|
+
.mostlyright-performance-*/
|
|
31
|
+
|
|
32
|
+
# Cargo build output for the vendored decoder binding. The wheels it produces are committed
|
|
33
|
+
# under vendor/wheels/; the intermediate object tree that produced them is not.
|
|
34
|
+
/vendor/mostlyright-grib/target/
|
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mostlyright-data
|
|
3
|
+
Version: 0.9.0
|
|
4
|
+
Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
|
|
5
|
+
Requires-Python: <3.14,>=3.13
|
|
6
|
+
Provides-Extra: build
|
|
7
|
+
Requires-Dist: hatchling==1.28.0; extra == 'build'
|
|
8
|
+
Requires-Dist: uv-build==0.9.26; extra == 'build'
|
|
9
|
+
Provides-Extra: dev
|
|
10
|
+
Requires-Dist: cmarkgfm>=2025.10.22; extra == 'dev'
|
|
11
|
+
Requires-Dist: croniter==6.2.4; extra == 'dev'
|
|
12
|
+
Requires-Dist: cryptography<51,>=50.0.0; extra == 'dev'
|
|
13
|
+
Requires-Dist: et-xmlfile==2.0.0; extra == 'dev'
|
|
14
|
+
Requires-Dist: idna<4,>=3.10; extra == 'dev'
|
|
15
|
+
Requires-Dist: jsonschema[format]<5,>=4.23; extra == 'dev'
|
|
16
|
+
Requires-Dist: numpy==2.5.1; extra == 'dev'
|
|
17
|
+
Requires-Dist: openpyxl==3.1.5; extra == 'dev'
|
|
18
|
+
Requires-Dist: packaging<27,>=24; extra == 'dev'
|
|
19
|
+
Requires-Dist: pandas==3.0.3; extra == 'dev'
|
|
20
|
+
Requires-Dist: polars-runtime-32==1.42.1; extra == 'dev'
|
|
21
|
+
Requires-Dist: polars==1.42.1; extra == 'dev'
|
|
22
|
+
Requires-Dist: pyarrow==23.0.1; extra == 'dev'
|
|
23
|
+
Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
|
|
24
|
+
Requires-Dist: pytest>=8.3; extra == 'dev'
|
|
25
|
+
Requires-Dist: referencing<1,>=0.35; extra == 'dev'
|
|
26
|
+
Requires-Dist: ruff>=0.9; extra == 'dev'
|
|
27
|
+
Provides-Extra: hosted
|
|
28
|
+
Requires-Dist: mostlyright-studio-client-v3==3.0.0; extra == 'hosted'
|
|
29
|
+
Provides-Extra: local
|
|
30
|
+
Requires-Dist: croniter==6.2.4; extra == 'local'
|
|
31
|
+
Requires-Dist: cryptography<51,>=50.0.0; extra == 'local'
|
|
32
|
+
Requires-Dist: et-xmlfile==2.0.0; extra == 'local'
|
|
33
|
+
Requires-Dist: idna<4,>=3.10; extra == 'local'
|
|
34
|
+
Requires-Dist: numpy==2.5.1; extra == 'local'
|
|
35
|
+
Requires-Dist: openpyxl==3.1.5; extra == 'local'
|
|
36
|
+
Requires-Dist: packaging<27,>=24; extra == 'local'
|
|
37
|
+
Requires-Dist: pandas==3.0.3; extra == 'local'
|
|
38
|
+
Requires-Dist: polars-runtime-32==1.42.1; extra == 'local'
|
|
39
|
+
Requires-Dist: polars==1.42.1; extra == 'local'
|
|
40
|
+
Requires-Dist: pyarrow==23.0.1; extra == 'local'
|
|
41
|
+
Provides-Extra: local-search-neural
|
|
42
|
+
Requires-Dist: anyio==4.14.2; extra == 'local-search-neural'
|
|
43
|
+
Requires-Dist: certifi==2026.7.22; extra == 'local-search-neural'
|
|
44
|
+
Requires-Dist: click==8.4.2; extra == 'local-search-neural'
|
|
45
|
+
Requires-Dist: filelock==3.32.2; extra == 'local-search-neural'
|
|
46
|
+
Requires-Dist: flatbuffers==25.12.19; extra == 'local-search-neural'
|
|
47
|
+
Requires-Dist: fsspec==2026.7.0; extra == 'local-search-neural'
|
|
48
|
+
Requires-Dist: h11==0.16.0; extra == 'local-search-neural'
|
|
49
|
+
Requires-Dist: hf-xet==1.6.0; extra == 'local-search-neural'
|
|
50
|
+
Requires-Dist: httpcore==1.0.9; extra == 'local-search-neural'
|
|
51
|
+
Requires-Dist: httpx==0.28.1; extra == 'local-search-neural'
|
|
52
|
+
Requires-Dist: huggingface-hub==1.27.0; extra == 'local-search-neural'
|
|
53
|
+
Requires-Dist: idna==3.18; extra == 'local-search-neural'
|
|
54
|
+
Requires-Dist: numpy==2.5.1; extra == 'local-search-neural'
|
|
55
|
+
Requires-Dist: onnxruntime==1.28.0; extra == 'local-search-neural'
|
|
56
|
+
Requires-Dist: packaging==26.3; extra == 'local-search-neural'
|
|
57
|
+
Requires-Dist: protobuf==7.35.1; extra == 'local-search-neural'
|
|
58
|
+
Requires-Dist: pyyaml==6.0.3; extra == 'local-search-neural'
|
|
59
|
+
Requires-Dist: tokenizers==0.23.1; extra == 'local-search-neural'
|
|
60
|
+
Requires-Dist: tqdm==4.70.0; extra == 'local-search-neural'
|
|
61
|
+
Requires-Dist: typing-extensions==4.16.0; extra == 'local-search-neural'
|
|
62
|
+
Provides-Extra: release
|
|
63
|
+
Requires-Dist: croniter==6.2.4; extra == 'release'
|
|
64
|
+
Requires-Dist: cryptography<51,>=50.0.0; extra == 'release'
|
|
65
|
+
Requires-Dist: et-xmlfile==2.0.0; extra == 'release'
|
|
66
|
+
Requires-Dist: idna<4,>=3.10; extra == 'release'
|
|
67
|
+
Requires-Dist: jsonschema[format]<5,>=4.23; extra == 'release'
|
|
68
|
+
Requires-Dist: numpy==2.5.1; extra == 'release'
|
|
69
|
+
Requires-Dist: openpyxl==3.1.5; extra == 'release'
|
|
70
|
+
Requires-Dist: packaging<27,>=24; extra == 'release'
|
|
71
|
+
Requires-Dist: pandas==3.0.3; extra == 'release'
|
|
72
|
+
Requires-Dist: polars-runtime-32==1.42.1; extra == 'release'
|
|
73
|
+
Requires-Dist: polars==1.42.1; extra == 'release'
|
|
74
|
+
Requires-Dist: pyarrow==23.0.1; extra == 'release'
|
|
75
|
+
Provides-Extra: viewer
|
|
76
|
+
Requires-Dist: nbconvert==7.17.1; extra == 'viewer'
|
|
77
|
+
Requires-Dist: nbformat==5.10.4; extra == 'viewer'
|
|
78
|
+
Description-Content-Type: text/markdown
|
|
79
|
+
|
|
80
|
+
# mostlyright-data
|
|
81
|
+
|
|
82
|
+
`mostlyright-data` converts a question and selected sources into a reproducible Parquet
|
|
83
|
+
dataset. An external agent may select sources and author a declarative recipe. A human approves the
|
|
84
|
+
exact recipe digest. Deterministic workers acquire bytes, transform data, run checks, and seal an
|
|
85
|
+
immutable Build.
|
|
86
|
+
|
|
87
|
+
For question-to-dataset work, the external host agent owns orchestration through delivery of a
|
|
88
|
+
verified Build and its table notebook. Exact proposed-contract or Recipe-digest approval is the
|
|
89
|
+
only user pause: typed refusals and failed checks drive bounded retry, supported substitution, or
|
|
90
|
+
a replacement Recipe. Workers remain fail-closed, changed Recipe digests require new approval,
|
|
91
|
+
and Studio alone owns release. If every registered lawful alternative is unsupported, the agent
|
|
92
|
+
reports that typed impossibility instead of bypassing a refusal or fabricating a dataset.
|
|
93
|
+
|
|
94
|
+
Source discovery is a host-owned, multi-lane search. `network_search_bundled: false` is a truthful
|
|
95
|
+
capability disclosure: the credential-isolated Harness does not contain or execute a browser. It is
|
|
96
|
+
not a switch that disables the host's public-web tools. For question-to-dataset work, the host must
|
|
97
|
+
search every available lane—registered Harness acquisition adapters, a configured sealed catalog,
|
|
98
|
+
public web search, official provider catalogs or APIs, and user-supplied sources—with no preferred
|
|
99
|
+
lane. It then merges and deduplicates source options, inspects them through registered boundaries, and
|
|
100
|
+
compares them on the canonical `harness-source-fitness.v1` dimensions. Every lane cites an immutable
|
|
101
|
+
host capability receipt, every query cites a host-tool receipt, and every comparison cites source
|
|
102
|
+
or receipt evidence. A host receipt is a strict JSON object whose SHA-256 is calculated over its
|
|
103
|
+
canonical UTF-8 JSON bytes; preserve those bytes in `research.ipynb` or record the exact durable
|
|
104
|
+
host-result reference beside the digest. Those receipts and the report remain untrusted host input: `mr-data
|
|
105
|
+
source-audit` checks their structure and internal bindings, but does not claim a browser ran. It
|
|
106
|
+
still performs no search, fetch, approval, or acquisition itself.
|
|
107
|
+
|
|
108
|
+
Selected and eligible sources also record the exact promoted inspection coordinate—locator kind,
|
|
109
|
+
credential-free locator, certified Reader identity plus decode-options digest (or `null` for native
|
|
110
|
+
CSV handling), format, and host platform—and its immutable inspection-receipt digest. Typed
|
|
111
|
+
acquisition refusals are not fitness failures. Non-final retries remain rejected; recovery and
|
|
112
|
+
lawful exhaustion are terminal, and an unsupported decision requires every typed-refusal route to
|
|
113
|
+
be lawfully exhausted.
|
|
114
|
+
|
|
115
|
+
The repository includes a complete report example and the canonical host-receipt objects whose
|
|
116
|
+
digests it cites. Audit the report with:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
uv run --extra dev mr-data source-audit \
|
|
120
|
+
--question examples/city-temperature/question.json \
|
|
121
|
+
--requirements examples/city-temperature/requirements.json \
|
|
122
|
+
--source-proposals examples/city-temperature/source-proposals.json \
|
|
123
|
+
--discovery-report examples/city-temperature/source-discovery-report.json \
|
|
124
|
+
--json
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The package version is `0.9.0` and requires Python `>=3.13,<3.14`.
|
|
128
|
+
|
|
129
|
+
## Two install profiles
|
|
130
|
+
|
|
131
|
+
`mr-data` is one binary with two install profiles, and the command names are the same in both.
|
|
132
|
+
|
|
133
|
+
| Profile | Install | Where it runs | What it is |
|
|
134
|
+
| --- | --- | --- | --- |
|
|
135
|
+
| Hosted (the default) | `pip install mostlyright-data` | Any operating system with CPython 3.13 -- Linux, macOS and Windows alike | Pure Python. One `py3-none-any` wheel, no compiled extension in the install closure and, today, no third-party package at all. It signs in, submits work to the Mostly Right backend, streams a run's live progress, downloads the dataset it produced, and shows the receipts. |
|
|
136
|
+
| Local | `pip install "mostlyright-data[local]"` | Linux; installable on macOS, untested there | Everything above plus the engines, the certified Readers, the Clean room, and every build command below. Not a product surface: ADR 0021 makes every lane hosted, and this extra is operator and developer tooling for the machines that build the workers. |
|
|
137
|
+
|
|
138
|
+
One wheel serves every platform, and that is checked rather than asserted: `thin-client-smoke`
|
|
139
|
+
builds exactly one artifact and installs **that same file** on ubuntu, macOS and Windows before
|
|
140
|
+
running the hosted command surface on each.
|
|
141
|
+
|
|
142
|
+
Windows gets the hosted profile and not the local one, and the reason is not that nobody has
|
|
143
|
+
ported it: the local lane runs every acquisition and every Reader behind a kernel boundary built
|
|
144
|
+
from POSIX process control -- `fork` and cgroups v2 -- and Windows has neither. Since ADR 0021
|
|
145
|
+
that is also true of macOS: Seatbelt was the second boundary implementation, it existed so a
|
|
146
|
+
person's Mac could run a lane, and it left with the product surface that needed it. Note that
|
|
147
|
+
`pip install "mostlyright-data[local]"` *succeeds* there, because
|
|
148
|
+
the engines all publish Windows wheels, so what you installed is not what decides it. `mr-data`
|
|
149
|
+
asks the machine, and every local command refuses **by name** with that reason rather than
|
|
150
|
+
running into a traceback later. One consequence is recorded rather than hidden: the credential
|
|
151
|
+
`mr-data login` stores is written at mode `0600` on Linux and macOS, and on Windows is protected
|
|
152
|
+
by the ACL your user profile directory already carries, which is a weaker statement.
|
|
153
|
+
|
|
154
|
+
`mr-data` chooses the lane by what is installed. With `[local]` present every invocation behaves
|
|
155
|
+
exactly as it always has; `--hosted` on `build`, `run`, `watch`, `status` or `deploy-dataset`
|
|
156
|
+
selects the backend instead. Without `[local]`, the hosted lane is the only lane, and a command
|
|
157
|
+
that runs on this machine refuses **by name** and says what to install rather than failing on a
|
|
158
|
+
missing import.
|
|
159
|
+
|
|
160
|
+
Where a hosted command runs is not a variance a person has to track: a submission prints the
|
|
161
|
+
dashboard address for the run it queued, and `mr-data watch <run-id>` follows that run's event
|
|
162
|
+
log live, resuming from its last cursor when the connection is cut rather than replaying it.
|
|
163
|
+
|
|
164
|
+
## Supported platforms
|
|
165
|
+
|
|
166
|
+
| Platform | Installed capability |
|
|
167
|
+
| --- | --- |
|
|
168
|
+
| Anything CPython 3.13 runs on -- Linux, macOS, Windows | The hosted profile, complete: `login`, `whoami`, and every hosted command. This is the product, and it is the row that matters. |
|
|
169
|
+
| Ubuntu 24.04 x86_64, CPython 3.13.14 | Additionally the `[local]` extra: every certified Reader over local files and public HTTPS, including bounded archives, workbooks, and optional GRIB. The Clean room uses a private network namespace and an operator-bounded cgroup root. This is the platform the hosted workers are, which is why it is the one that is tested. |
|
|
170
|
+
| macOS 14 arm64 | The hosted profile, and `[local]` installs. Nothing under `[local]` is tested there any more: ADR 0021 retired `parity-macos`, `sandbox-macos`, and the macOS legs of the `local-*` workflows along with the local lane. Clean-room execution refuses -- `SANDBOX_MEMORY_BOUNDARY` for a Reader, `SANDBOX_OS_BOUNDARY` for anything else -- because the Seatbelt boundary that used to admit it is gone. A logged-in single-address credential-free public HTTPS acquisition still runs in Studio's reviewed Linux/amd64 hosted Clean room. Bounded collections require both local attestations, so they need a host that can produce them. Catalogue authoring, which is local by design, still works. |
|
|
171
|
+
| Windows | The hosted profile. `pip install "mostlyright-data[local]"` succeeds, because the engines all publish Windows wheels, so what you installed is not what decides it: every local command refuses **by name** and says why. |
|
|
172
|
+
|
|
173
|
+
The GRIB Reader is optional. If a compatible `mostlyright-grib` binding is unavailable, first use
|
|
174
|
+
fails with `READER_DEPENDENCY_UNAVAILABLE`. It accepts one extracted GRIB2 record and rejects a
|
|
175
|
+
multi-record GFS or HRRR file.
|
|
176
|
+
|
|
177
|
+
## Install from a checkout
|
|
178
|
+
|
|
179
|
+
Update the persistent uv tool and install the complete matching skill for both Codex and Claude
|
|
180
|
+
Code with one command from the checkout:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
uv run --no-project --python 3.13 python scripts/install_checkout.py
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
The installer resolves the checkout from its own path, reinstalls `mr-data` from that exact
|
|
187
|
+
directory and installs the exact pinned generated-client wheel alongside it, copies the complete `skills/mr-data-build` tree to both
|
|
188
|
+
personal skill directories, and then verifies `mr-data --version`, exact source-to-installed
|
|
189
|
+
package bytes, and exact source-to-installed skill-tree parity. The separately owned generated
|
|
190
|
+
Studio client is also exposed as the published distribution's `hosted` extra. The base Harness wheel remains client-free for
|
|
191
|
+
credential-free Courier images. It also binds every installed launcher to the
|
|
192
|
+
`[project.scripts]` entry point it declares.
|
|
193
|
+
|
|
194
|
+
`PATH` is checked last, after the verified generation is committed, because `PATH` belongs to your
|
|
195
|
+
shell rather than to the installation and an ambient shell problem must never restore the code the
|
|
196
|
+
install just replaced. If the uv tool bin directory is not on `PATH` at all, which is the ordinary
|
|
197
|
+
first-install case, the installer keeps the install, exits 0, and tells you to run
|
|
198
|
+
`uv tool update-shell` and open a new shell. If a different `mr-data` is found earlier on `PATH`,
|
|
199
|
+
the installer keeps the install and exits 2 with a warning naming both paths: typing `mr-data`
|
|
200
|
+
would otherwise still run the stale program. Put the uv tool bin directory earlier on `PATH`, or
|
|
201
|
+
remove the other one.
|
|
202
|
+
|
|
203
|
+
So read the exit code rather than testing it for zero: `0` and `2` both mean the new generation is
|
|
204
|
+
installed and verified, and only `1` means the install was refused and the prior generation
|
|
205
|
+
restored. Rerunning on `2` produces the same `2` until `PATH` changes.
|
|
206
|
+
|
|
207
|
+
It preflights both skill targets before changing the uv tool. If an installed skill differs, it
|
|
208
|
+
refuses with no mutation; inspect the named path and rerun with `--force` only when replacement is
|
|
209
|
+
intended. The installer retains private backups of the exact prior uv tool environment, all
|
|
210
|
+
Harness launchers, and both prior skill trees until final parity succeeds. Any failure restores
|
|
211
|
+
that whole prior generation, or removes every new artifact when no prior generation existed. A
|
|
212
|
+
single per-user lock serializes this entire operation with direct skill installs. Once exact final
|
|
213
|
+
parity is verified, the new generation is successful; failed best-effort backup cleanup emits a
|
|
214
|
+
warning and leaves the named private backup for manual recovery instead of undoing that generation.
|
|
215
|
+
|
|
216
|
+
For an isolated wheel smoke test instead of a persistent global tool update:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
artifact_dir="$(mktemp -d)"
|
|
220
|
+
uv build --wheel --out-dir "$artifact_dir"
|
|
221
|
+
set -- "$artifact_dir"/mostlyright_data-*.whl
|
|
222
|
+
test "$#" -eq 1 && test -f "$1"
|
|
223
|
+
wheel="$1"
|
|
224
|
+
uv venv .work/harness-install --python 3.13
|
|
225
|
+
uv pip install --python .work/harness-install/bin/python "${wheel}[local]"
|
|
226
|
+
.work/harness-install/bin/mr-data --version
|
|
227
|
+
.work/harness-install/bin/mr-data inventory --json
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Run ordinary CSV with the installed binary
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
mkdir -p .work
|
|
234
|
+
.work/harness-install/bin/mr-data init .work/installed-city-temperature \
|
|
235
|
+
--run-id installed-city-temperature \
|
|
236
|
+
--input-root examples/city-temperature \
|
|
237
|
+
--question examples/city-temperature/question.json \
|
|
238
|
+
--requirements examples/city-temperature/requirements.json \
|
|
239
|
+
--source-proposals examples/city-temperature/source-proposals.json \
|
|
240
|
+
--plan examples/city-temperature/question-plan.json \
|
|
241
|
+
--semantics examples/city-temperature/semantics.json \
|
|
242
|
+
--json
|
|
243
|
+
.work/harness-install/bin/mr-data plan .work/installed-city-temperature --json
|
|
244
|
+
.work/harness-install/bin/mr-data run .work/installed-city-temperature --json
|
|
245
|
+
.work/harness-install/bin/mr-data verify .work/installed-city-temperature --json
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
The workspace must not exist before `init`. `run` seals the Build under `<workspace>/result` and
|
|
249
|
+
writes `table.ipynb` beside it.
|
|
250
|
+
|
|
251
|
+
Create a research directory, then start the local notebook viewer in a second terminal before
|
|
252
|
+
`init`. Keep the future workspace absent:
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
mkdir -p .work/installed-city-temperature-research
|
|
256
|
+
.work/harness-install/bin/mr-data view \
|
|
257
|
+
--workspace .work/installed-city-temperature \
|
|
258
|
+
--research-dir .work/installed-city-temperature-research \
|
|
259
|
+
--json
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
The receipt names `url`, `research_notebook`, and `table_notebook`. Codex and Claude Code agents
|
|
263
|
+
always open `url` in their in-app browser and never pass `--open`; a host that is genuinely
|
|
264
|
+
terminal-only and is not Codex or Claude Code may use `--open`. For a direct Build, use
|
|
265
|
+
`mr-data view --run-dir PATH --research-dir RESEARCH_DIR`. `view` stays on loopback and starts
|
|
266
|
+
before source selection or Recipe approval. It streams atomic `research.ipynb` updates and adds
|
|
267
|
+
`table.ipynb` when the Build finishes. Keep an in-app viewer tab across approval turns. If a
|
|
268
|
+
successful Build reports an unavailable sidecar, run `mr-data notebook RUN_DIR --json`; the viewer
|
|
269
|
+
writes `table.ipynb` only when there is none and never replaces one that is there.
|
|
270
|
+
`mr-data watch` remains an opt-in operational diagnostic.
|
|
271
|
+
|
|
272
|
+
### Test the packaged Reader boundary
|
|
273
|
+
|
|
274
|
+
On Ubuntu 24.04 with cgroup v2, this command runs the installed Reader in the required memory and
|
|
275
|
+
network boundaries:
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
uv sync --locked --extra dev
|
|
279
|
+
sudo sh -eu -c '
|
|
280
|
+
echo "+memory +pids" > /sys/fs/cgroup/cgroup.subtree_control
|
|
281
|
+
mkdir /sys/fs/cgroup/mostlyright-stock-reader-test
|
|
282
|
+
echo 536870912 > /sys/fs/cgroup/mostlyright-stock-reader-test/memory.max
|
|
283
|
+
echo 0 > /sys/fs/cgroup/mostlyright-stock-reader-test/memory.swap.max
|
|
284
|
+
echo 64 > /sys/fs/cgroup/mostlyright-stock-reader-test/pids.max
|
|
285
|
+
echo 1 > /sys/fs/cgroup/mostlyright-stock-reader-test/cgroup.max.depth
|
|
286
|
+
echo 2 > /sys/fs/cgroup/mostlyright-stock-reader-test/cgroup.max.descendants
|
|
287
|
+
echo "+memory +pids" > \
|
|
288
|
+
/sys/fs/cgroup/mostlyright-stock-reader-test/cgroup.subtree_control
|
|
289
|
+
mkdir /sys/fs/cgroup/mostlyright-stock-reader-test/coordinator
|
|
290
|
+
'
|
|
291
|
+
sudo chown "$(id -u):$(id -g)" \
|
|
292
|
+
/sys/fs/cgroup/mostlyright-stock-reader-test \
|
|
293
|
+
/sys/fs/cgroup/mostlyright-stock-reader-test/cgroup.procs
|
|
294
|
+
test ! -w /sys/fs/cgroup/mostlyright-stock-reader-test/memory.max
|
|
295
|
+
test ! -w /sys/fs/cgroup/mostlyright-stock-reader-test/coordinator/cgroup.procs
|
|
296
|
+
test ! -w /sys/fs/cgroup/cgroup.procs
|
|
297
|
+
runner_uid="$(id -u)"
|
|
298
|
+
runner_gid="$(id -g)"
|
|
299
|
+
sudo env \
|
|
300
|
+
GITHUB_WORKSPACE="$PWD" \
|
|
301
|
+
RUNNER_UID="$runner_uid" \
|
|
302
|
+
RUNNER_GID="$runner_gid" \
|
|
303
|
+
bash <<'STOCK_READER'
|
|
304
|
+
set -eu
|
|
305
|
+
cd "${GITHUB_WORKSPACE}"
|
|
306
|
+
echo "$$" > /sys/fs/cgroup/mostlyright-stock-reader-test/coordinator/cgroup.procs
|
|
307
|
+
exec 3</sys/fs/cgroup/mostlyright-stock-reader-test
|
|
308
|
+
exec 4</proc/self/ns/net
|
|
309
|
+
exec unshare --net -- setpriv \
|
|
310
|
+
--reuid="${RUNNER_UID}" \
|
|
311
|
+
--regid="${RUNNER_GID}" \
|
|
312
|
+
--init-groups \
|
|
313
|
+
.venv/bin/python -m pytest -q tests/test_stock_reader_workflow.py
|
|
314
|
+
STOCK_READER
|
|
315
|
+
find /sys/fs/cgroup/mostlyright-stock-reader-test -mindepth 1 -maxdepth 1 \
|
|
316
|
+
-type d -name 'mostlyright-sandbox-*' -exec sudo rmdir {} +
|
|
317
|
+
test -z "$(find /sys/fs/cgroup/mostlyright-stock-reader-test -mindepth 1 -maxdepth 1 \
|
|
318
|
+
-type d -name 'mostlyright-sandbox-*' -print -quit)"
|
|
319
|
+
sudo rmdir /sys/fs/cgroup/mostlyright-stock-reader-test/coordinator
|
|
320
|
+
test ! -e /sys/fs/cgroup/mostlyright-stock-reader-test/coordinator
|
|
321
|
+
sudo rmdir /sys/fs/cgroup/mostlyright-stock-reader-test
|
|
322
|
+
test ! -e /sys/fs/cgroup/mostlyright-stock-reader-test
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
For development, run the same workflow from the checkout:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
uv sync --locked --extra dev
|
|
329
|
+
mkdir -p .work
|
|
330
|
+
uv run --extra dev mr-data init .work/city-temperature \
|
|
331
|
+
--run-id golden-city-temperature \
|
|
332
|
+
--input-root examples/city-temperature \
|
|
333
|
+
--question examples/city-temperature/question.json \
|
|
334
|
+
--requirements examples/city-temperature/requirements.json \
|
|
335
|
+
--source-proposals examples/city-temperature/source-proposals.json \
|
|
336
|
+
--plan examples/city-temperature/question-plan.json \
|
|
337
|
+
--semantics examples/city-temperature/semantics.json
|
|
338
|
+
uv run --extra dev mr-data plan .work/city-temperature
|
|
339
|
+
uv run --extra dev mr-data run .work/city-temperature
|
|
340
|
+
uv run --extra dev mr-data verify .work/city-temperature
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Add `--json` for one JSON object on success or failure. Failures exit nonzero. The command result is
|
|
344
|
+
the receipt; paths named by a receipt remain mutable after the command returns.
|
|
345
|
+
|
|
346
|
+
`--input-root` and `--output` may be relative paths. Relative paths are resolved from the current
|
|
347
|
+
working directory.
|
|
348
|
+
|
|
349
|
+
## Commands
|
|
350
|
+
|
|
351
|
+
| Command | Behavior |
|
|
352
|
+
| --- | --- |
|
|
353
|
+
| `mr-data catalog-search` | Search a sealed source catalog and return one entry with its query trace. |
|
|
354
|
+
| `mr-data catalog-fill` | Stage and publish one bounded credential-free CKAN, STAC, or SDMX catalog. |
|
|
355
|
+
| `mr-data catalog-harvest` | Stage a resumable Data.gov provider sweep, or verify its key boundary without making a request. |
|
|
356
|
+
| `mr-data catalog-author` | Convert one completed private harvest into bounded immutable authoring shards. |
|
|
357
|
+
| `mr-data catalog-publish` | Validate harvest and authoring receipts, then publish and independently read back one packed catalog generation. |
|
|
358
|
+
| `mr-data catalog-update` | Install one published catalog release after checking its exact archive digest, its store digest, and its descent from the generation already installed. |
|
|
359
|
+
| `mr-data index` | Rebuild the private local Build index under explicit discovery and byte limits. |
|
|
360
|
+
| `mr-data search` | Search exact public-catalog and private-Build snapshots under caller-supplied retrieval limits. |
|
|
361
|
+
| `mr-data source-audit` | Validate the host's multi-lane discovery report, source comparisons, proposals, and citations without searching or fetching. |
|
|
362
|
+
| `mr-data peek` | Report columns, types, and sample rows for a local file or public HTTPS resource, including an exact certified Reader selected with `--reader FAMILY@VERSION --reader-options JSON`. |
|
|
363
|
+
| `mr-data record` | Seal messages already recorded from a live source into bounded digest-named batches a build can read, writing down each dropped connection. It opens no connection and reaches no network. |
|
|
364
|
+
| `mr-data author` | Convert YAML into a Recipe. |
|
|
365
|
+
| `mr-data approve` | Bind approval to an exact Recipe digest. |
|
|
366
|
+
| `mr-data plan-check` | Execute a dataset plan in a temporary directory and report the result. |
|
|
367
|
+
| `mr-data show` | Inspect one Build. |
|
|
368
|
+
| `mr-data list` | List Builds under a root. |
|
|
369
|
+
| `mr-data diff` | Compare two Builds. |
|
|
370
|
+
| `mr-data review --local` | Run local checks without granting approval; exit 1 when a check fails. |
|
|
371
|
+
| `mr-data deploy-plan` | Validate a reviewed Build and write a deployment request without deploying it. |
|
|
372
|
+
| `mr-data deploy RUN_DIR` | Stage an exact verified Build, record and confirm its internal approval as the authenticated Editor, then activate and bind the Cloud Dataset. |
|
|
373
|
+
| `mr-data deploy-status RUN_DIR` | Report the state Studio holds for the run that deployment queued, optionally waiting for it with `--watch-seconds N`. It reads; it changes nothing Studio holds. |
|
|
374
|
+
| `mr-data deploy-dataset RUN_DIR` | Bring the Build that deployment's run released back into `RUN_DIR/hosted`, checked against the fingerprints the release sealed and checked again here, and write its dataset notebook. |
|
|
375
|
+
| `mr-data review-setup` | Generate review enrollment, keys, role tokens, and anchor input. |
|
|
376
|
+
| `mr-data notebook RUN_DIR` | Create or refresh `table.ipynb` for an existing Harness Build. |
|
|
377
|
+
| `mr-data view --workspace PATH` / `--run-dir PATH` | Serve the local notebook viewer, optionally pairing it with an explicit `--research-dir`. |
|
|
378
|
+
| `mr-data watch` | Serve the read-only event view. |
|
|
379
|
+
| `mr-data workflow` | Print the supported workflow stages and their authority boundaries. |
|
|
380
|
+
| `mr-data preflight` | Report build blockers for the host, for named options, or for a named workload measured against the engine's own ceilings. |
|
|
381
|
+
| `mr-data inventory` | Report installed capabilities. |
|
|
382
|
+
| `mr-data auth` | Validate the effective device credential with Cloud; manage metadata-only device revocation, remote-first logout, safe rotation, and explicit recovery; explain the ephemeral token boundary. |
|
|
383
|
+
| `mr-data login` | Sign in to the Mostly Right cloud with a device code and store a device credential. `login --force` is the compatibility alias for safe `auth rotate`, never an in-place truncate. |
|
|
384
|
+
| `mr-data whoami` | Compatibility alias for the remotely validated `mr-data auth status` answer. |
|
|
385
|
+
|
|
386
|
+
### The hosted lane
|
|
387
|
+
|
|
388
|
+
Twenty-five commands run on the Mostly Right backend. On a `[local]` install they take `--hosted`
|
|
389
|
+
to select that lane; on the hosted-only install they are what the command already does.
|
|
390
|
+
[Hosted parity](docs/HOSTED-PARITY.md) is the full ledger, generated from the classification the
|
|
391
|
+
software itself branches on; the table below is the submit-and-follow half of it, plus the
|
|
392
|
+
commands that write something other than a run.
|
|
393
|
+
|
|
394
|
+
| Command | Behavior |
|
|
395
|
+
| --- | --- |
|
|
396
|
+
| `mr-data build --hosted` / `mr-data run --hosted` | Queue one hosted initial build from an approved recipe proposal (`--recipe-proposal`, `--recipe-digest`, optionally `--resource-class standard\|large`) and print the dashboard address to watch it at. |
|
|
397
|
+
| `mr-data watch RUN_ID --hosted` | Stream that run's event log live, rendering the facts the worker measured. It resumes from its last cursor across a stream cut instead of replaying, and stops when the run reaches a state that appends nothing further. |
|
|
398
|
+
| `mr-data status RUN_ID --hosted` | Report the state Studio holds for one run, and with `--receipts` its execution summary and the sealed evidence for the Build it produced. |
|
|
399
|
+
| `mr-data deploy-dataset RUN_ID --hosted --output DIR` | Fetch that run's dataset through a short-lived signed URL, refuse it unless the bytes hash to the digest the release sealed, and write it once into `DIR`. |
|
|
400
|
+
| `mr-data acquire --hosted` | Fetch one public address in Studio's clean room and print the Receipt Studio bound, naming under `reader_binding` which party resolved the pinned Reader. A source that refused answers `status: "refused"` with its own sealed code and exits 1. |
|
|
401
|
+
| `mr-data acquire-cancel --workspace-id WORKSPACE_ID --crawler-session-id CRAWLER_SESSION_ID --hosted` | Cancel one still-active public acquisition using the coordinate `acquire` printed. By default it writes a private, per-coordinate receipt journal under the local mr-data state directory; a transport-loss retry reuses its idempotency key, and success prints Studio's exact cancellation receipt. Use `--journal FILE` only to override that location. |
|
|
402
|
+
| `mr-data approve --hosted` / `mr-data recipe-approve --hosted` | Record the decision you are asking for against one approval Studio holds, print the address where the person who must grant it does so, then wait and read the decision receipt back. The command never decides, and exits 2 unless a human recorded the decision that was asked for. |
|
|
403
|
+
| `mr-data note --run RUN_ID --hosted` | Append one cell of the operator-facing decision record to that run's own log, where the rendered notebook and the live view both read it: `--heading` is its one outcome-led line, the body arrives on standard input or from `--markdown-file`, and `--checkpoint` places it against the run-event it explains. Writing the same `--cell-id` again revises the cell in place. A cell is unsealed prose and is never attestation evidence. `--list` reads them all back. |
|
|
404
|
+
| `mr-data research-open --dataset DATASET_ID --question QUESTION_ID --source SOURCE_ID` | Open one research session and print each state as its worker warms up: `opening`, `warming`, `ready`. A workspace already holding its bound of live sessions is refused with the retry window Studio stated, never waited through. |
|
|
405
|
+
| `mr-data research-probe SESSION_ID --kind KIND --request JSON` | Ask the session's warm worker one question about a source, checked against the probe vocabulary before it is sent, follow the session run's stream until the probe settles, and print the answer read from the probe record. Exits 0 only for an answered probe; a probe answer is exploration and never evidence. |
|
|
406
|
+
| `mr-data research-status (SESSION_ID \| --run RUN_ID) [--probe PROBE_ID]` | Report Studio's own reading of one session, and of one probe with its answer. `--run` resolves the owning session directly in Studio; it never scans sessions client-side. |
|
|
407
|
+
| `mr-data research-close (SESSION_ID \| --run RUN_ID)` | Close the session, cancelling any probe still queued, so its worker exits. `--run` asks Studio to resolve and close the owning session directly. |
|
|
408
|
+
|
|
409
|
+
## Current local workflow
|
|
410
|
+
|
|
411
|
+
The supported local workflow is:
|
|
412
|
+
|
|
413
|
+
```text
|
|
414
|
+
question and output grain
|
|
415
|
+
-> selected sources and rights evidence
|
|
416
|
+
-> declarative dataset plan
|
|
417
|
+
-> confined source snapshots
|
|
418
|
+
-> deterministic transform and validation
|
|
419
|
+
-> immutable Parquet Build
|
|
420
|
+
-> two assigned reviews
|
|
421
|
+
-> Checker-signed decision
|
|
422
|
+
-> reviewed_candidate | fixes_required
|
|
423
|
+
-> Studio source staging and immutable Recipe proposal
|
|
424
|
+
-> authenticated Editor confirmation of the internal approval record
|
|
425
|
+
-> Dataset activation Run and Cloud Current binding
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
For the controlled acceptance walkthrough that starts from a changing synthetic public CSV and,
|
|
429
|
+
after the hosted rollout is separately marked ready, ends at Cloud Current after a scheduled
|
|
430
|
+
Dataset Version, see [Local Build to Cloud refresh demo](docs/DEMO-REAL-REFRESH.md). Local authoring
|
|
431
|
+
does not require Docker; governed Linux execution remains in Studio.
|
|
432
|
+
|
|
433
|
+
The local engine supports string trimming, exact empty-string-to-null conversion, collision-safe
|
|
434
|
+
rename, closed-type casts, stable left equality joins, output selection, and deterministic quality
|
|
435
|
+
checks. `local-plan.v2` runs a wider closed set of ordered operations over the same shared
|
|
436
|
+
arithmetic: it adds exact decimal division, wide-to-long reshaping of columns the plan names, inner
|
|
437
|
+
and anti joins, and bounded text normalization for keys that will not otherwise match. Every one of
|
|
438
|
+
those is admitted by a written test that separates cleaning from modeling choices, and the same
|
|
439
|
+
test is what refuses a general window, a filled-in value, and the reverse of the reshape. See
|
|
440
|
+
[Transforms a plan may perform](docs/TRANSFORMS.md).
|
|
441
|
+
|
|
442
|
+
`local-plan.v2` also carries one retired operation, `prediction_label@1.0.0`. It named a value at a
|
|
443
|
+
future date, and the horizon it required is a modeling choice rather than a property of the
|
|
444
|
+
sources, so no newly authored plan may name it: authoring, plan checking, validation, export and
|
|
445
|
+
approval all refuse one that does. It remains readable so that a Build sealed with it still
|
|
446
|
+
verifies and a Recipe approved with it still runs. See
|
|
447
|
+
[Prediction labels](docs/PREDICTION-LABELS.md).
|
|
448
|
+
|
|
449
|
+
The installed stock source-to-Reader path supports certified Readers for local files,
|
|
450
|
+
credential-free public HTTPS sources, and bounded ordered public HTTPS collections. Each HTTPS
|
|
451
|
+
retrieval, Reader decode, and parse shares one attested clean-room operation; JSON and NDJSON
|
|
452
|
+
projection, ZIP, TAR, GZIP, XLSX, delimited text, and single-record GRIB2 are available under their
|
|
453
|
+
exact Reader settings and budgets. A collection can combine 1–16 explicit objects or a fixed
|
|
454
|
+
page-number range when every member uses the same Reader and normalized schema; see
|
|
455
|
+
[Deterministic source collections](docs/SOURCE-COLLECTIONS.md).
|
|
456
|
+
|
|
457
|
+
The review runtime handles initial Builds only. It records whether the Build passed review or needs
|
|
458
|
+
fixes, rejects nonzero failed-cycle counts, and does not verify repaired successors or derive a
|
|
459
|
+
human-direction status.
|
|
460
|
+
|
|
461
|
+
The package also contains a pure canonical empirical source-observation chain and deterministic
|
|
462
|
+
cadence inference with shared cross-system vectors. Both governed paths record that evidence
|
|
463
|
+
through one emitter: a hosted probe submits it to Studio, and `mr-data acquire --cadence-history`
|
|
464
|
+
records a local probe in an append-only folder. For one acquisition outcome the two produce the
|
|
465
|
+
same document byte for byte. It does not yet schedule probes or claim that a manually selected cron
|
|
466
|
+
was learned; Studio owns persistence and adaptive scheduling.
|
|
467
|
+
|
|
468
|
+
The weather Reader opens one extracted GRIB2 record. It refuses a full GFS or HRRR file containing
|
|
469
|
+
a collection of hundreds of records.
|
|
470
|
+
|
|
471
|
+
## Recipes
|
|
472
|
+
|
|
473
|
+
`frozen-recipe.v1` binds the question, requirements, selected source evidence, connector versions,
|
|
474
|
+
query templates, credential-reference names, transformation plan, validation policy, Bookmark
|
|
475
|
+
strategy, and engine versions. Its digest is lowercase SHA-256.
|
|
476
|
+
|
|
477
|
+
The checked-in example contains `recipe.json` and `recipe-execution.json`:
|
|
478
|
+
|
|
479
|
+
```bash
|
|
480
|
+
uv sync --locked --extra dev
|
|
481
|
+
mkdir -p .work/recipe
|
|
482
|
+
uv run --extra dev mr-data recipe-export \
|
|
483
|
+
--recipe examples/city-temperature/recipe.json \
|
|
484
|
+
--output .work/recipe/frozen-recipe.json
|
|
485
|
+
uv run --extra dev mr-data recipe-approve \
|
|
486
|
+
--recipe .work/recipe/frozen-recipe.json \
|
|
487
|
+
--approval-id approval-city-temperature-v1 \
|
|
488
|
+
--approved-by local-operator \
|
|
489
|
+
--approved-at 2026-07-19T12:00:00Z \
|
|
490
|
+
--approval-policy-digest 0000000000000000000000000000000000000000000000000000000000000000 \
|
|
491
|
+
--output .work/recipe/recipe-approval.json
|
|
492
|
+
uv run --extra dev mr-data recipe-run \
|
|
493
|
+
--recipe .work/recipe/frozen-recipe.json \
|
|
494
|
+
--approval .work/recipe/recipe-approval.json \
|
|
495
|
+
--execution examples/city-temperature/recipe-execution.json \
|
|
496
|
+
--input-root examples/city-temperature \
|
|
497
|
+
--output .work/recipe/version-1 \
|
|
498
|
+
--producer-principal local-recipe-producer \
|
|
499
|
+
--producer-attempt initial-v1
|
|
500
|
+
uv run --extra dev mr-data recipe-verify .work/recipe/version-1
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
The output parent must exist. Export, approval, and run commands do not overwrite existing output.
|
|
504
|
+
Refresh and backfill executions require `--previous-run-dir` and the exact predecessor Build.
|
|
505
|
+
|
|
506
|
+
## Authority and security
|
|
507
|
+
|
|
508
|
+
- External agents may interpret questions, propose sources, author declarative inputs, and report
|
|
509
|
+
findings. They do not calculate authoritative metrics or approve releases.
|
|
510
|
+
- The deterministic worker owns confinement, budgets, snapshots, transforms, checks, lineage,
|
|
511
|
+
hashes, and artifact sealing.
|
|
512
|
+
- The trusted coordinator owns roots, assignments, attempt identities, enrolled signing keys, and
|
|
513
|
+
immutable cycle lineage.
|
|
514
|
+
- The Harness owns deterministic public-catalog provider semantics, including Data.gov endpoint,
|
|
515
|
+
pagination, catalog identity, revisions, normalization, and provenance. Catalog discovery never
|
|
516
|
+
authorizes or acquires the underlying dataset resource.
|
|
517
|
+
- Studio owns hosted contracts, orchestration, persistence, scheduling, credentials, approval, and
|
|
518
|
+
release.
|
|
519
|
+
|
|
520
|
+
Source bytes and dataset plans are untrusted. The local-file worker accepts normalized relative
|
|
521
|
+
paths to regular, single-link CSV files below an approved input root. It rejects traversal,
|
|
522
|
+
absolute paths, symlinks, hardlinks, special files, input/output overlap, source mutation, and
|
|
523
|
+
budget violations.
|
|
524
|
+
|
|
525
|
+
Builds are content-addressed and non-overwritable. Canonical payloads exclude ambient clocks and
|
|
526
|
+
absolute filesystem paths. Model output and source content cannot grant human approval.
|
|
527
|
+
|
|
528
|
+
The package does not provide local publication authority, local release authority, modeling,
|
|
529
|
+
general feature engineering, prediction serving, authenticated source access, scheduling, or
|
|
530
|
+
arbitrary code execution from an agent response. The one narrow exception to general feature
|
|
531
|
+
engineering is deterministic, terminal-only prediction-label construction described above.
|
|
532
|
+
|
|
533
|
+
## Hosted workers
|
|
534
|
+
|
|
535
|
+
`mr-data export-hosted-candidate` verifies a local Build and writes the canonical hosted
|
|
536
|
+
Builder-input envelope:
|
|
537
|
+
|
|
538
|
+
```bash
|
|
539
|
+
mr-data export-hosted-candidate /absolute/path/to/run \
|
|
540
|
+
--output /absolute/path/to/new-candidate-input.json \
|
|
541
|
+
--json
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
The hosted executables are:
|
|
545
|
+
|
|
546
|
+
- `mr-data-bootstrap`: exchanges workload identity for one Studio job and starts the fixed role.
|
|
547
|
+
- `mr-data-producer`: reconstructs and verifies a Build, then uploads reservation-bound artifacts.
|
|
548
|
+
- `mr-data-verifier`: independently verifies artifacts and submits a signed report.
|
|
549
|
+
- `mr-data-crawler-job`: performs allowlisted public acquisition and passes bounded bytes to a
|
|
550
|
+
networkless Clean room.
|
|
551
|
+
- `mr-data-ingestion-job`: redeems one opaque workload-identity-bound ingestion dispatch and runs
|
|
552
|
+
only a reviewed bounded delivery processor; see [Hosted ingestion delivery](docs/INGESTION-DELIVERY.md).
|
|
553
|
+
|
|
554
|
+
These commands cannot select or release a Build, create a dataset version, advance `latest`, or
|
|
555
|
+
access Studio databases, queues, secrets, or storage metadata directly.
|
|
556
|
+
|
|
557
|
+
## Verification
|
|
558
|
+
|
|
559
|
+
For ordinary edit-loop feedback, run `make test-fast`. This is a non-authoritative test tier that
|
|
560
|
+
omits semantically expensive scale, isolated-install, and live-repository-scan coverage;
|
|
561
|
+
`make verify` is required before review or merge.
|
|
562
|
+
|
|
563
|
+
```bash
|
|
564
|
+
uv sync --extra dev
|
|
565
|
+
make verify-offline-slice
|
|
566
|
+
make verify-hosted-workers
|
|
567
|
+
make verify-viewer
|
|
568
|
+
make verify-viewer-browser
|
|
569
|
+
make verify
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
`verify-hosted-workers` requires a sibling `mostlyright-studio` checkout. Set
|
|
573
|
+
`STUDIO_ROOT=/absolute/path` when it is elsewhere.
|
|
574
|
+
|
|
575
|
+
`make verify-thin-client` proves the hosted profile the way a stranger meets it: it builds the
|
|
576
|
+
base wheel, installs it into a fresh environment from an empty cache, refuses any compiled
|
|
577
|
+
extension it finds there, and runs the hosted command surface. The same body runs in CI as the
|
|
578
|
+
reusable `thin-client-smoke` workflow, fanned out over GitHub-hosted ubuntu, macOS and Windows:
|
|
579
|
+
one `py3-none-any` wheel is built once and installed by all three legs, on every pull request and
|
|
580
|
+
nightly.
|
|
581
|
+
|
|
582
|
+
There is no documented known-failing set; every failing node is a verification failure.
|
|
583
|
+
|
|
584
|
+
## Documentation
|
|
585
|
+
|
|
586
|
+
- [Architecture](docs/ARCHITECTURE.md)
|
|
587
|
+
- [Offline Vertical Slice](docs/OFFLINE-VERTICAL-SLICE.md)
|
|
588
|
+
- [Recipes](docs/FROZEN-RECIPES.md)
|
|
589
|
+
- [Sources and Acquisition](docs/SOURCES-AND-ACQUISITION.md)
|
|
590
|
+
- [Empirical source cadence](docs/SOURCE-CADENCE.md)
|
|
591
|
+
- [Readers](docs/READERS.md)
|
|
592
|
+
- [Deterministic source collections](docs/SOURCE-COLLECTIONS.md)
|
|
593
|
+
- [Notebook View](docs/NOTEBOOK-VIEW.md)
|
|
594
|
+
- [Deployment request](docs/DEPLOYMENT.md)
|
|
595
|
+
- [Local Build to Cloud refresh demo](docs/DEMO-REAL-REFRESH.md)
|
|
596
|
+
- [Hosted parity](docs/HOSTED-PARITY.md)
|
|
597
|
+
- [Catalogue release channel](docs/CATALOG-CHANNEL.md)
|
|
598
|
+
- [Hosted workers](docs/HOSTED-WORKERS.md)
|
|
599
|
+
- [Hosted worker publication](docs/HOSTED-WORKER-PUBLICATION.md)
|
|
600
|
+
- [Research-session worker](docs/SESSION-WORKER.md)
|
|
601
|
+
- [Transforms a plan may perform](docs/TRANSFORMS.md)
|
|
602
|
+
- [Review policy](docs/REVIEW-LOOP.md)
|
|
603
|
+
- [Contract ownership](docs/CONTRACTS.md)
|
|
604
|
+
- [Engine governance](docs/ENGINE-GOVERNANCE.md)
|
|
605
|
+
|
|
606
|
+
`.planning/` contains repository work records. Its contents are not product contracts, merge
|
|
607
|
+
authorization, approval, or release evidence.
|