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.
Files changed (315) hide show
  1. mostlyright_data-0.9.0/.gitignore +34 -0
  2. mostlyright_data-0.9.0/PKG-INFO +607 -0
  3. mostlyright_data-0.9.0/README.md +528 -0
  4. mostlyright_data-0.9.0/pyproject.toml +209 -0
  5. mostlyright_data-0.9.0/scripts/hatch_build.py +66 -0
  6. mostlyright_data-0.9.0/src/mostlyright/data_harness/__init__.py +158 -0
  7. mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/__init__.py +55 -0
  8. mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/http.py +2773 -0
  9. mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/parsing.py +809 -0
  10. mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/ranges.py +495 -0
  11. mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/result_download.py +360 -0
  12. mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/retention_admission.py +248 -0
  13. mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/sandbox.py +4888 -0
  14. mostlyright_data-0.9.0/src/mostlyright/data_harness/acquisition/url_policy.py +530 -0
  15. mostlyright_data-0.9.0/src/mostlyright/data_harness/agent_runtime.py +2743 -0
  16. mostlyright_data-0.9.0/src/mostlyright/data_harness/assets/logo-ink.svg +31 -0
  17. mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/__init__.py +28 -0
  18. mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/pandas_backend.py +350 -0
  19. mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/polars_backend.py +366 -0
  20. mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/protocol.py +124 -0
  21. mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/reference.py +83 -0
  22. mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/registry.py +55 -0
  23. mostlyright_data-0.9.0/src/mostlyright/data_harness/backends/restrictions.py +126 -0
  24. mostlyright_data-0.9.0/src/mostlyright/data_harness/canonical.py +333 -0
  25. mostlyright_data-0.9.0/src/mostlyright/data_harness/catalog_job.py +625 -0
  26. mostlyright_data-0.9.0/src/mostlyright/data_harness/cli.py +5398 -0
  27. mostlyright_data-0.9.0/src/mostlyright/data_harness/contracts.py +53 -0
  28. mostlyright_data-0.9.0/src/mostlyright/data_harness/coordinator.py +1307 -0
  29. mostlyright_data-0.9.0/src/mostlyright/data_harness/deploy.py +924 -0
  30. mostlyright_data-0.9.0/src/mostlyright/data_harness/deploy_target.py +312 -0
  31. mostlyright_data-0.9.0/src/mostlyright/data_harness/deployment_evidence.py +1067 -0
  32. mostlyright_data-0.9.0/src/mostlyright/data_harness/event_presentation.py +576 -0
  33. mostlyright_data-0.9.0/src/mostlyright/data_harness/events.py +2152 -0
  34. mostlyright_data-0.9.0/src/mostlyright/data_harness/fast_delimited.py +239 -0
  35. mostlyright_data-0.9.0/src/mostlyright/data_harness/fleet.py +237 -0
  36. mostlyright_data-0.9.0/src/mostlyright/data_harness/formats.py +236 -0
  37. mostlyright_data-0.9.0/src/mostlyright/data_harness/governors.py +1163 -0
  38. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_bootstrap.py +972 -0
  39. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler.py +1115 -0
  40. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +351 -0
  41. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler_fetch.py +423 -0
  42. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler_job.py +1277 -0
  43. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_crawler_protocol.py +676 -0
  44. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_dataset.py +1500 -0
  45. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_deploy.py +3037 -0
  46. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_handoff.py +62 -0
  47. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_ingestion_contract.py +504 -0
  48. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_ingestion_job.py +356 -0
  49. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +40 -0
  50. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_session_container_smoke.py +194 -0
  51. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_session_worker.py +3554 -0
  52. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +46 -0
  53. mostlyright_data-0.9.0/src/mostlyright/data_harness/hosted_worker.py +6784 -0
  54. mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/__init__.py +56 -0
  55. mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/contracts.py +461 -0
  56. mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/faults.py +42 -0
  57. mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/gcs_store.py +1162 -0
  58. mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/spool.py +130 -0
  59. mostlyright_data-0.9.0/src/mostlyright/data_harness/ingestion/store.py +885 -0
  60. mostlyright_data-0.9.0/src/mostlyright/data_harness/key_seam.py +434 -0
  61. mostlyright_data-0.9.0/src/mostlyright/data_harness/linux_process_boundary.py +262 -0
  62. mostlyright_data-0.9.0/src/mostlyright/data_harness/local_contracts.py +2880 -0
  63. mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/__init__.py +5 -0
  64. mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/build_index.py +1087 -0
  65. mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/contracts.py +920 -0
  66. mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/query_trace.py +266 -0
  67. mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/retrieval.py +700 -0
  68. mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/sealed.py +474 -0
  69. mostlyright_data-0.9.0/src/mostlyright/data_harness/local_search/service.py +784 -0
  70. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/CONTRACT.md +212 -0
  71. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/__init__.py +12 -0
  72. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/chrome.py +359 -0
  73. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/code_body.py +266 -0
  74. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/document.py +407 -0
  75. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/frame.py +275 -0
  76. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/interactive.py +337 -0
  77. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/markdown_body.py +477 -0
  78. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/mr_components.py +134 -0
  79. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_data.py +595 -0
  80. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_rich.py +906 -0
  81. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_source.py +260 -0
  82. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_stage.py +176 -0
  83. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/outputs_text.py +400 -0
  84. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/parse.py +394 -0
  85. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/status.py +40 -0
  86. mostlyright_data-0.9.0/src/mostlyright/data_harness/nbrender/tokens.py +1295 -0
  87. mostlyright_data-0.9.0/src/mostlyright/data_harness/notebook.py +1710 -0
  88. mostlyright_data-0.9.0/src/mostlyright/data_harness/offline.py +2049 -0
  89. mostlyright_data-0.9.0/src/mostlyright/data_harness/operation_registry.py +1007 -0
  90. mostlyright_data-0.9.0/src/mostlyright/data_harness/operator_setup.py +239 -0
  91. mostlyright_data-0.9.0/src/mostlyright/data_harness/pipeline.py +6428 -0
  92. mostlyright_data-0.9.0/src/mostlyright/data_harness/plan_graph.py +2026 -0
  93. mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/__init__.py +104 -0
  94. mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/contracts.py +1017 -0
  95. mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/engine.py +221 -0
  96. mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/errors.py +14 -0
  97. mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/gates.py +751 -0
  98. mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/joins.py +574 -0
  99. mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/profile.py +384 -0
  100. mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/table.py +217 -0
  101. mostlyright_data-0.9.0/src/mostlyright/data_harness/preparation/transforms.py +568 -0
  102. mostlyright_data-0.9.0/src/mostlyright/data_harness/progress_events.py +534 -0
  103. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/__init__.py +46 -0
  104. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/containers.py +963 -0
  105. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/contracts.py +542 -0
  106. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/delimited.py +257 -0
  107. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/__init__.py +33 -0
  108. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/admission.py +722 -0
  109. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/decode.py +1009 -0
  110. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/geometry.py +1133 -0
  111. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/grib2/portable_math.py +501 -0
  112. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/json_tabular.py +485 -0
  113. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/registry.py +514 -0
  114. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/README.md +110 -0
  115. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  116. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +24 -0
  117. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  118. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +24 -0
  119. 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
  120. 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
  121. 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
  122. 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
  123. 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
  124. 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
  125. 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
  126. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +25 -0
  127. 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
  128. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +25 -0
  129. 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
  130. 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
  131. 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
  132. 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
  133. 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
  134. 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
  135. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +44 -0
  136. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +1 -0
  137. 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
  138. 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
  139. 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
  140. 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
  141. 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
  142. 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
  143. 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
  144. 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
  145. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +20 -0
  146. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +55 -0
  147. 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
  148. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +54 -0
  149. 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
  150. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +54 -0
  151. 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
  152. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +54 -0
  153. 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
  154. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/samples.py +582 -0
  155. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/spreadsheet.py +803 -0
  156. mostlyright_data-0.9.0/src/mostlyright/data_harness/readers/tabular.py +510 -0
  157. mostlyright_data-0.9.0/src/mostlyright/data_harness/recipe.py +5321 -0
  158. mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/__init__.py +78 -0
  159. mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/adapters.py +274 -0
  160. mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/contracts.py +872 -0
  161. mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/coordinator.py +1099 -0
  162. mostlyright_data-0.9.0/src/mostlyright/data_harness/repair/errors.py +16 -0
  163. mostlyright_data-0.9.0/src/mostlyright/data_harness/review.py +2533 -0
  164. mostlyright_data-0.9.0/src/mostlyright/data_harness/rowset.py +283 -0
  165. mostlyright_data-0.9.0/src/mostlyright/data_harness/serving.py +1975 -0
  166. mostlyright_data-0.9.0/src/mostlyright/data_harness/serving_edge.py +590 -0
  167. mostlyright_data-0.9.0/src/mostlyright/data_harness/serving_http.py +1031 -0
  168. mostlyright_data-0.9.0/src/mostlyright/data_harness/session_probes.py +759 -0
  169. mostlyright_data-0.9.0/src/mostlyright/data_harness/signing.py +101 -0
  170. mostlyright_data-0.9.0/src/mostlyright/data_harness/source_discovery.py +898 -0
  171. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/__init__.py +209 -0
  172. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/_adapter_steps.py +213 -0
  173. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/adapters.py +1214 -0
  174. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/cadence.py +1428 -0
  175. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/cadence_emission.py +453 -0
  176. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/cadence_history.py +546 -0
  177. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/__init__.py +17 -0
  178. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/admission.py +477 -0
  179. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/authoring.py +1701 -0
  180. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +701 -0
  181. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +1217 -0
  182. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/bounded_io.py +231 -0
  183. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/channel.py +523 -0
  184. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/channel_client.py +296 -0
  185. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/contracts.py +825 -0
  186. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/coverage.py +137 -0
  187. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/delta.py +1340 -0
  188. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/embedding.py +532 -0
  189. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/entry_v2.py +1182 -0
  190. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/fill.py +3889 -0
  191. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +459 -0
  192. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/fill_staging.py +1105 -0
  193. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/gating.py +374 -0
  194. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +1607 -0
  195. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +7 -0
  196. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +384 -0
  197. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +798 -0
  198. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +964 -0
  199. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +445 -0
  200. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +384 -0
  201. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/health.py +447 -0
  202. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +105 -0
  203. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/identity_history.py +1549 -0
  204. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/neural.py +1618 -0
  205. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +2345 -0
  206. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +1517 -0
  207. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/packed_writer.py +2802 -0
  208. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/query_trace.py +1037 -0
  209. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/recommend.py +171 -0
  210. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/retrieval.py +230 -0
  211. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +995 -0
  212. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +254 -0
  213. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/sealed.py +560 -0
  214. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/search.py +230 -0
  215. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +1097 -0
  216. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/catalog/update.py +891 -0
  217. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/collections.py +815 -0
  218. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/contracts.py +2223 -0
  219. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/deletion.py +761 -0
  220. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/fitness.py +162 -0
  221. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/governance.py +163 -0
  222. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/hosted.py +173 -0
  223. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/integration.py +218 -0
  224. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/range_reader.py +418 -0
  225. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/registry.py +514 -0
  226. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/rights_rule.py +59 -0
  227. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +1 -0
  228. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/sports.py +521 -0
  229. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/stream.py +524 -0
  230. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/stream_connector.py +418 -0
  231. mostlyright_data-0.9.0/src/mostlyright/data_harness/sources/stream_recorder.py +1404 -0
  232. mostlyright_data-0.9.0/src/mostlyright/data_harness/studio_boundary.py +2019 -0
  233. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/__init__.py +37 -0
  234. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/acquire.py +1137 -0
  235. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/acquire_cancel.py +579 -0
  236. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/approvals.py +617 -0
  237. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/commands.py +406 -0
  238. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/download.py +194 -0
  239. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/narrative.py +589 -0
  240. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/parity.py +1070 -0
  241. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/propose.py +2759 -0
  242. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/research.py +1663 -0
  243. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/router.py +924 -0
  244. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/runs.py +519 -0
  245. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/session.py +281 -0
  246. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/stream.py +501 -0
  247. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/transport.py +187 -0
  248. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/vocabulary.py +368 -0
  249. mostlyright_data-0.9.0/src/mostlyright/data_harness/thin/workers.py +164 -0
  250. mostlyright_data-0.9.0/src/mostlyright/data_harness/ucum/TABLE-PIN.json +40 -0
  251. mostlyright_data-0.9.0/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +632 -0
  252. mostlyright_data-0.9.0/src/mostlyright/data_harness/unit_flow.py +927 -0
  253. mostlyright_data-0.9.0/src/mostlyright/data_harness/units.py +572 -0
  254. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/__init__.py +9 -0
  255. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/approve.py +485 -0
  256. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/author_yaml.py +597 -0
  257. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/cloud_auth.py +447 -0
  258. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/__init__.py +260 -0
  259. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/approve.py +136 -0
  260. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/auth.py +744 -0
  261. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/author.py +79 -0
  262. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_author.py +403 -0
  263. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_fill.py +523 -0
  264. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +545 -0
  265. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_publish.py +1838 -0
  266. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_search.py +71 -0
  267. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/catalog_update.py +437 -0
  268. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/deploy.py +134 -0
  269. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +98 -0
  270. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/deploy_plan.py +105 -0
  271. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/deploy_status.py +104 -0
  272. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/diff.py +74 -0
  273. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/index.py +84 -0
  274. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/inventory.py +47 -0
  275. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/list_builds.py +143 -0
  276. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/login.py +63 -0
  277. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/peek.py +236 -0
  278. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/plan_check.py +90 -0
  279. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/preflight.py +97 -0
  280. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/record.py +107 -0
  281. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/review_setup.py +47 -0
  282. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/search.py +440 -0
  283. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/show.py +61 -0
  284. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/commands/whoami.py +37 -0
  285. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/credential_native.py +551 -0
  286. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/credential_store.py +1055 -0
  287. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/credentials.py +631 -0
  288. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/diffing.py +444 -0
  289. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/headline.py +671 -0
  290. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/hosted_acquisition.py +974 -0
  291. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/hosted_run_status.py +619 -0
  292. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/inventory.py +427 -0
  293. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/local_review.py +375 -0
  294. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/login.py +691 -0
  295. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/path_kind.py +147 -0
  296. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/peek.py +1000 -0
  297. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/plain_file.py +178 -0
  298. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/plan_check.py +311 -0
  299. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/preflight.py +918 -0
  300. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/readers.py +1124 -0
  301. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/remediation.py +2195 -0
  302. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/render.py +657 -0
  303. mostlyright_data-0.9.0/src/mostlyright/data_harness/ux/workload.py +1077 -0
  304. mostlyright_data-0.9.0/src/mostlyright/data_harness/viewer.py +3713 -0
  305. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/__init__.py +83 -0
  306. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/authoring.py +235 -0
  307. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/contracts.py +673 -0
  308. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/materialize.py +486 -0
  309. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/observations.py +874 -0
  310. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/query.py +259 -0
  311. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/reducer.py +280 -0
  312. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/sdk.py +892 -0
  313. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/store.py +584 -0
  314. mostlyright_data-0.9.0/src/mostlyright/data_harness/visual_run/transport.py +239 -0
  315. 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.