mostlyright-data 0.9.4__tar.gz → 0.9.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/PKG-INFO +12 -13
  2. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/README.md +11 -12
  3. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/pyproject.toml +1 -1
  4. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/url_policy.py +57 -28
  5. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/cli.py +90 -13
  6. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_job.py +54 -5
  7. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_worker.py +163 -18
  8. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_worker.py +945 -402
  9. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/pipeline.py +9 -0
  10. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/progress_events.py +75 -2
  11. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/recipe.py +44 -0
  12. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving.py +17 -4
  13. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/session_probes.py +26 -3
  14. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/__init__.py +12 -6
  15. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream.py +289 -33
  16. mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_capture_session.py +1347 -0
  17. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_connector.py +81 -51
  18. mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +39 -0
  19. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_recorder.py +291 -42
  20. mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_registry.py +565 -0
  21. mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_rotation.py +727 -0
  22. mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_series.py +1320 -0
  23. mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_transport.py +943 -0
  24. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/acquire.py +16 -6
  25. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/download.py +80 -11
  26. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/stream.py +6 -1
  27. mostlyright_data-0.9.6/src/mostlyright/data_harness/ux/commands/record.py +1039 -0
  28. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/headline.py +2 -0
  29. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/remediation.py +1 -1
  30. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/render.py +38 -0
  31. mostlyright_data-0.9.4/src/mostlyright/data_harness/ux/commands/record.py +0 -107
  32. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/.gitignore +0 -0
  33. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/scripts/hatch_build.py +0 -0
  34. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/__init__.py +0 -0
  35. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  36. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  37. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  38. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  39. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  40. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  41. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  42. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  43. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  44. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  45. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  46. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  47. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  48. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/reference.py +0 -0
  49. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/registry.py +0 -0
  50. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  51. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/canonical.py +0 -0
  52. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/catalog_job.py +0 -0
  53. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/contracts.py +0 -0
  54. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/coordinator.py +0 -0
  55. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deploy.py +0 -0
  56. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deploy_target.py +0 -0
  57. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  58. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/event_presentation.py +0 -0
  59. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/events.py +0 -0
  60. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  61. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/fleet.py +0 -0
  62. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/formats.py +0 -0
  63. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/governors.py +0 -0
  64. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  65. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  66. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  67. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  68. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  69. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  70. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  71. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  72. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  73. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  74. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  75. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  76. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  77. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  78. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  79. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  80. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  81. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  82. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  83. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/key_seam.py +0 -0
  84. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  85. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_contracts.py +0 -0
  86. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  87. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  88. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  89. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  90. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  91. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  92. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/service.py +0 -0
  93. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  94. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  95. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  96. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  97. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  98. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  99. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  100. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  101. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  102. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  103. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  104. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  105. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  106. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  107. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  108. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  109. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  110. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/notebook.py +0 -0
  111. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/offline.py +0 -0
  112. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/operation_registry.py +0 -0
  113. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/operator_setup.py +0 -0
  114. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/plan_graph.py +0 -0
  115. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  116. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  117. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  118. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  119. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  120. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  121. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  122. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/table.py +0 -0
  123. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  124. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  125. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/containers.py +0 -0
  126. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  127. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  128. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  129. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  130. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  131. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  132. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  133. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  134. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  135. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/registry.py +0 -0
  136. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  137. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  138. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  139. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  140. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  141. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  142. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  143. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  144. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  145. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  146. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  147. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  148. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  149. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  150. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  151. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  152. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  153. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  154. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  155. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  156. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  157. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  158. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  159. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  160. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  161. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  162. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  163. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  164. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  165. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  166. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  167. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  168. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  169. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  170. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  171. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  172. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  173. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  174. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  175. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  176. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  177. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  178. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples.py +0 -0
  179. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  180. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  181. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  182. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  183. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  184. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  185. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/errors.py +0 -0
  186. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/review.py +0 -0
  187. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/rowset.py +0 -0
  188. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving_edge.py +0 -0
  189. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving_http.py +0 -0
  190. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/signing.py +0 -0
  191. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/source_discovery.py +0 -0
  192. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  193. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  194. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  195. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  196. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  197. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  198. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  199. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  200. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  201. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  202. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  203. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  204. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  205. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  206. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  207. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  208. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  209. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
  210. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  211. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  212. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  213. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  214. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  215. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  216. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  217. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  218. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  219. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  220. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  221. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  222. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  223. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  224. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  225. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  226. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  227. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  228. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  229. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  230. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  231. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  232. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  233. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  234. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
  235. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  236. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  237. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  238. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  239. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/collections.py +0 -0
  240. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  241. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  242. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  243. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/governance.py +0 -0
  244. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  245. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/integration.py +0 -0
  246. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  247. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/registry.py +0 -0
  248. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  249. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  250. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/sports.py +0 -0
  251. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/studio_boundary.py +0 -0
  252. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  253. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  254. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  255. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/commands.py +0 -0
  256. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  257. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/parity.py +0 -0
  258. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/propose.py +0 -0
  259. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/research.py +0 -0
  260. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/router.py +0 -0
  261. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/runs.py +0 -0
  262. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/session.py +0 -0
  263. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/transport.py +0 -0
  264. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  265. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/workers.py +0 -0
  266. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  267. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  268. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/unit_flow.py +0 -0
  269. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/units.py +0 -0
  270. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  271. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/approve.py +0 -0
  272. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  273. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  274. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  275. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  276. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  277. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  278. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  279. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  280. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  281. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  282. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  283. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  284. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  285. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  286. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  287. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  288. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  289. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  290. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  291. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  292. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  293. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  294. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  295. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  296. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  297. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  298. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  299. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  300. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  301. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  302. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  303. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  304. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  305. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
  306. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  307. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  308. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/login.py +0 -0
  309. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  310. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/peek.py +0 -0
  311. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  312. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  313. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  314. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/readers.py +0 -0
  315. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/workload.py +0 -0
  316. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/viewer.py +0 -0
  317. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  318. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  319. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  320. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  321. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  322. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  323. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  324. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  325. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  326. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
  327. {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/watch.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.9.4
3
+ Version: 0.9.6
4
4
  Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
5
5
  Project-URL: Homepage, https://mostlyright.md/
6
6
  Project-URL: Documentation, https://mostlyright.md/docs/guides/cli/
@@ -81,12 +81,11 @@ Description-Content-Type: text/markdown
81
81
 
82
82
  # mostlyright-data
83
83
 
84
- Mostly Right turns historical and live public data—weather, economic releases, financial reports,
85
- and satellite data—into consistent datasets for analysis and prediction. Each dataset includes
86
- source links, timestamps, and check results.
84
+ Browse datasets built by our community or create your own with agents that find the sources and
85
+ configure the pipeline. Mostly Right keeps the dataset live.
87
86
 
88
- `mostlyright-data` is the command-line client. It starts hosted research and build work, follows
89
- run status, and downloads completed Parquet datasets.
87
+ `mostlyright-data` is the command-line client. It opens hosted research sessions, starts and
88
+ follows hosted dataset runs, and downloads verified datasets after they finish.
90
89
 
91
90
  ## Requirements
92
91
 
@@ -119,20 +118,20 @@ mr-data --help
119
118
  Use `mr-data research-open`, `mr-data research-status`, and `mr-data research-close` for hosted
120
119
  research sessions. `research-status` shows the current state.
121
120
 
122
- ## Local tools
121
+ ## Local execution
123
122
 
124
- The optional local tools require Linux:
123
+ The local execution lane runs only on Linux:
125
124
 
126
125
  ```bash
127
126
  python -m pip install "mostlyright-data[local]"
128
127
  ```
129
128
 
130
- They build and check worker inputs. They are not required for the hosted client.
129
+ It builds and checks worker inputs. It is not required for the hosted client.
131
130
 
132
131
  ## Documentation
133
132
 
134
133
  - [CLI guide](https://mostlyright.md/docs/guides/cli/)
135
- - [Research sessions](https://mostlyright.md/docs/guides/research/)
134
+ - [Hosted research sessions](https://mostlyright.md/docs/guides/hosted-research/)
136
135
  - [Credentials](https://mostlyright.md/docs/guides/credentials/)
137
136
  - [Public datasets](https://mostlyright.md/docs/guides/use-public-datasets/)
138
137
 
@@ -141,11 +140,11 @@ Use `mr-data --help` for the full command list and options. Commands that suppor
141
140
 
142
141
  For local builds, `--input-root` and `--output` may use relative paths.
143
142
 
144
- ## Limits and behavior
143
+ ## Behavior and limits
145
144
 
146
145
  - `mr-data review --local RUN_DIR` exits 1 when a check fails.
147
- - The weather Reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
148
- - Hosted credential-free acquisition is limited to one single-address public HTTPS object. Bounded collections require both local attestations.
146
+ - The weather reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
147
+ - Hosted credential-free acquisition supports one single-address public HTTPS object. Bounded collections require both local attestations.
149
148
 
150
149
  ## Verification
151
150
 
@@ -1,11 +1,10 @@
1
1
  # mostlyright-data
2
2
 
3
- Mostly Right turns historical and live public data—weather, economic releases, financial reports,
4
- and satellite data—into consistent datasets for analysis and prediction. Each dataset includes
5
- source links, timestamps, and check results.
3
+ Browse datasets built by our community or create your own with agents that find the sources and
4
+ configure the pipeline. Mostly Right keeps the dataset live.
6
5
 
7
- `mostlyright-data` is the command-line client. It starts hosted research and build work, follows
8
- run status, and downloads completed Parquet datasets.
6
+ `mostlyright-data` is the command-line client. It opens hosted research sessions, starts and
7
+ follows hosted dataset runs, and downloads verified datasets after they finish.
9
8
 
10
9
  ## Requirements
11
10
 
@@ -38,20 +37,20 @@ mr-data --help
38
37
  Use `mr-data research-open`, `mr-data research-status`, and `mr-data research-close` for hosted
39
38
  research sessions. `research-status` shows the current state.
40
39
 
41
- ## Local tools
40
+ ## Local execution
42
41
 
43
- The optional local tools require Linux:
42
+ The local execution lane runs only on Linux:
44
43
 
45
44
  ```bash
46
45
  python -m pip install "mostlyright-data[local]"
47
46
  ```
48
47
 
49
- They build and check worker inputs. They are not required for the hosted client.
48
+ It builds and checks worker inputs. It is not required for the hosted client.
50
49
 
51
50
  ## Documentation
52
51
 
53
52
  - [CLI guide](https://mostlyright.md/docs/guides/cli/)
54
- - [Research sessions](https://mostlyright.md/docs/guides/research/)
53
+ - [Hosted research sessions](https://mostlyright.md/docs/guides/hosted-research/)
55
54
  - [Credentials](https://mostlyright.md/docs/guides/credentials/)
56
55
  - [Public datasets](https://mostlyright.md/docs/guides/use-public-datasets/)
57
56
 
@@ -60,11 +59,11 @@ Use `mr-data --help` for the full command list and options. Commands that suppor
60
59
 
61
60
  For local builds, `--input-root` and `--output` may use relative paths.
62
61
 
63
- ## Limits and behavior
62
+ ## Behavior and limits
64
63
 
65
64
  - `mr-data review --local RUN_DIR` exits 1 when a check fails.
66
- - The weather Reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
67
- - Hosted credential-free acquisition is limited to one single-address public HTTPS object. Bounded collections require both local attestations.
65
+ - The weather reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
66
+ - Hosted credential-free acquisition supports one single-address public HTTPS object. Bounded collections require both local attestations.
68
67
 
69
68
  ## Verification
70
69
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyright-data"
3
- version = "0.9.4"
3
+ version = "0.9.6"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -188,6 +188,62 @@ class ValidatedTarget:
188
188
  return urlunsplit(("", "", parsed.path or "/", parsed.query, ""))
189
189
 
190
190
 
191
+ def approved_public_addresses(
192
+ hostname: str,
193
+ port: int,
194
+ *,
195
+ resolver: Resolver | None = None,
196
+ ) -> tuple[str, ...]:
197
+ """Return every address a hostname answers with, once each has been proved publicly routable.
198
+
199
+ The part of :func:`validate_public_https_url` that is about *where a name leads* rather than
200
+ about a URL or an allowlist, so that a transport which is not fetching a URL can hold the same
201
+ rule without holding a second copy of it. A client that hands a hostname to the operating
202
+ system and lets it connect has delegated the decision to DNS: a document naming
203
+ ``stream.example.test`` reaches whatever that name resolves to, and inside a network that is
204
+ an internal service that never expected a stranger.
205
+
206
+ Every answer is checked, and one bad answer refuses the whole resolution. Approving the public
207
+ members of a mixed set would be deciding *after* a resolver has already demonstrated that it
208
+ can put an address of its choosing in front of the caller.
209
+
210
+ A caller that connects to one of these addresses -- rather than handing the name back to the
211
+ operating system, which would resolve it a second time and need not agree -- has the answer it
212
+ checked.
213
+ """
214
+
215
+ if _looks_like_obfuscated_ip(hostname):
216
+ raise AcquisitionSecurityError(
217
+ "OBFUSCATED_IP",
218
+ "non-canonical numeric IP hostnames are denied",
219
+ )
220
+ literal = _parse_ip_literal(hostname)
221
+ if literal is not None:
222
+ addresses: tuple[str, ...] = (literal.compressed,)
223
+ else:
224
+ addresses = (SystemResolver() if resolver is None else resolver).resolve(hostname, port)
225
+ approved: list[str] = []
226
+ for raw in addresses:
227
+ try:
228
+ address = ipaddress.ip_address(raw)
229
+ except ValueError:
230
+ raise AcquisitionSecurityError(
231
+ "DNS_ADDRESS",
232
+ "resolver returned a non-IP address",
233
+ ) from None
234
+ _require_globally_routable(address)
235
+ approved.append(address.compressed)
236
+ approved_ips = tuple(sorted(dict.fromkeys(approved)))
237
+ if not approved_ips:
238
+ raise AcquisitionSecurityError("DNS_EMPTY", "target has no approved public addresses")
239
+ if len(approved_ips) > MAX_DNS_ANSWERS:
240
+ raise AcquisitionSecurityError(
241
+ "DNS_ANSWER_LIMIT",
242
+ f"target has more than {MAX_DNS_ANSWERS} approved addresses",
243
+ )
244
+ return approved_ips
245
+
246
+
191
247
  def validate_public_https_url(
192
248
  url: str,
193
249
  *,
@@ -222,34 +278,7 @@ def validate_public_https_url(
222
278
  raise AcquisitionSecurityError("METADATA_DESTINATION", "metadata/internal hosts are denied")
223
279
 
224
280
  literal = _parse_ip_literal(hostname)
225
- if literal is not None:
226
- addresses = (literal.compressed,)
227
- else:
228
- if _looks_like_obfuscated_ip(hostname):
229
- raise AcquisitionSecurityError(
230
- "OBFUSCATED_IP",
231
- "non-canonical numeric IP hostnames are denied",
232
- )
233
- addresses = resolver.resolve(hostname, effective_port)
234
- approved: list[str] = []
235
- for raw in addresses:
236
- try:
237
- address = ipaddress.ip_address(raw)
238
- except ValueError:
239
- raise AcquisitionSecurityError(
240
- "DNS_ADDRESS",
241
- "resolver returned a non-IP address",
242
- ) from None
243
- _require_globally_routable(address)
244
- approved.append(address.compressed)
245
- approved_ips = tuple(sorted(dict.fromkeys(approved)))
246
- if not approved_ips:
247
- raise AcquisitionSecurityError("DNS_EMPTY", "target has no approved public addresses")
248
- if len(approved_ips) > MAX_DNS_ANSWERS:
249
- raise AcquisitionSecurityError(
250
- "DNS_ANSWER_LIMIT",
251
- f"target has more than {MAX_DNS_ANSWERS} approved addresses",
252
- )
281
+ approved_ips = approved_public_addresses(hostname, effective_port, resolver=resolver)
253
282
 
254
283
  netloc = hostname
255
284
  if ":" in hostname and literal is not None:
@@ -23,7 +23,7 @@ import sys
23
23
  import tempfile
24
24
  import time
25
25
  from collections.abc import Callable, Iterator, Mapping, Sequence
26
- from dataclasses import dataclass
26
+ from dataclasses import dataclass, replace
27
27
  from datetime import datetime
28
28
  from pathlib import Path
29
29
  from typing import Any
@@ -96,7 +96,6 @@ from mostlyright.data_harness.offline import (
96
96
  )
97
97
  from mostlyright.data_harness.pipeline import (
98
98
  _VERIFY_ALLOWLISTED_ENGINES,
99
- MAX_ROWS,
100
99
  SOURCE_PROPOSAL_SET_VERSION,
101
100
  BuildError,
102
101
  ResourceLimits,
@@ -106,7 +105,10 @@ from mostlyright.data_harness.pipeline import (
106
105
  verify_candidate, # noqa: F401 - retained for compatibility/security-route monkeypatch tests
107
106
  )
108
107
  from mostlyright.data_harness.plan_graph import (
108
+ HARD_MAX_INTERMEDIATE_ROWS,
109
+ HARD_MAX_OUTPUT_ROWS,
109
110
  HARD_MAX_RETAINED_BYTES,
111
+ HARD_MAX_SOURCE_ROWS,
110
112
  GraphResourcePolicy,
111
113
  )
112
114
  from mostlyright.data_harness.readers.contracts import ReaderError
@@ -209,6 +211,9 @@ from mostlyright.data_harness.sources.stream_recorder import (
209
211
  from mostlyright.data_harness.sources.stream_recorder import (
210
212
  ledger_root as stream_ledger_root,
211
213
  )
214
+ from mostlyright.data_harness.sources.stream_registry import (
215
+ load_stream_connector_registry,
216
+ )
212
217
  from mostlyright.data_harness.ux.commands import discovered_commands
213
218
  from mostlyright.data_harness.ux.credentials import LoginError, resolve_cloud_credentials
214
219
  from mostlyright.data_harness.ux.headline import (
@@ -390,17 +395,44 @@ def _selected_graph_limits(
390
395
  max_intermediate_rows: int | None,
391
396
  max_retained_bytes: int | None,
392
397
  ) -> ResourceLimits | None:
393
- """Select only explicitly raised graph dimensions; keep every other row cap at 100k."""
398
+ """Narrow the trusted graph policy by exactly the dimensions the operator named.
399
+
400
+ These flags are a NARROWING instrument and nothing else. The baseline is what a build with no
401
+ flags at all already runs under -- ``GraphResourcePolicy()``, whose defaults are the engine's
402
+ own hard ceilings -- so an unnamed dimension keeps that ceiling and a named one lowers only
403
+ itself. The invariant is worth stating because it is what makes the flags safe to reach for:
404
+ for every dimension, the policy this returns is at most the no-flag default, and equals it
405
+ unless the flag naming that dimension was supplied.
406
+
407
+ It used to default every row dimension to ``pipeline.MAX_ROWS`` instead. That is the v1 plan's
408
+ row policy, not the graph engine's, and it is 1/100th of ``HARD_MAX_SOURCE_ROWS``: naming a
409
+ byte budget alone silently cut a v2 build's row ceiling to 100k, which is the opposite of what
410
+ an operator raising a budget is asking for. ``build`` only reaches this function for a v2 plan
411
+ -- a graph flag on a v1 plan is refused as ``GRAPH_POLICY_V1`` before the build starts -- so
412
+ there is no v1 caller whose 100k cap this could be speaking for.
413
+
414
+ ``--graph-max-rows`` sets the source AND output ceilings, as its help says: one number for
415
+ "how many rows this build may read and release". The intermediate ceiling is separate because
416
+ the engine's own contract separates them (``HARD_MAX_INTERMEDIATE_ROWS`` is four times
417
+ ``HARD_MAX_SOURCE_ROWS``, sized for a union of several year-scale sources), so an operator who
418
+ wants a narrower working set says so with the flag that means it.
419
+ """
394
420
 
395
421
  if max_rows is None and max_intermediate_rows is None and max_retained_bytes is None:
396
422
  return None
397
- selected_rows = max_rows or MAX_ROWS
423
+ selected_rows = max_rows or HARD_MAX_SOURCE_ROWS
398
424
  return ResourceLimits(
425
+ # The v1 field, carried for a v2 build so `_replay_graph_derivations` streams sources under
426
+ # the policy rather than under the 100k default. It re-derives the same value from
427
+ # `graph_policy` anyway; agreeing here keeps the two from reading differently.
399
428
  max_rows=selected_rows,
400
429
  graph_policy=GraphResourcePolicy(
401
430
  max_source_rows=selected_rows,
402
- max_intermediate_rows=max_intermediate_rows or selected_rows,
403
- max_output_rows=selected_rows,
431
+ max_intermediate_rows=max_intermediate_rows or HARD_MAX_INTERMEDIATE_ROWS,
432
+ # `min` because the two ceilings are equal today and are not the same contract: a
433
+ # source ceiling that ever rose above the output one must not raise the output one
434
+ # with it.
435
+ max_output_rows=min(selected_rows, HARD_MAX_OUTPUT_ROWS),
404
436
  max_retained_bytes=max_retained_bytes or HARD_MAX_RETAINED_BYTES,
405
437
  ),
406
438
  )
@@ -1014,6 +1046,7 @@ def _dispatch(
1014
1046
  producer_principal=args.producer_principal,
1015
1047
  producer_attempt=args.producer_attempt,
1016
1048
  previous_run_dir=args.previous_run_dir,
1049
+ connector_registry=args.connector_registry,
1017
1050
  visual_store=visual_store,
1018
1051
  )
1019
1052
  payload = result.to_dict()
@@ -1830,22 +1863,29 @@ def _parser(
1830
1863
  build.add_argument("--producer-principal", required=True, help=_BUILT_BY)
1831
1864
  build.add_argument("--producer-attempt", required=True, help=_BUILD_ATTEMPT)
1832
1865
  build.add_argument("--research-dir", type=Path, help="existing visual research directory")
1866
+ # ⚠ THE ARGPARSE MAXIMA ARE THE ENGINE'S OWN HARD CEILINGS, and deliberately not a second,
1867
+ # smaller policy. `GraphResourcePolicy.__post_init__` is the single enforcement point -- it
1868
+ # refuses anything above a ceiling whatever route the value arrived by -- so a smaller number
1869
+ # here would not be a safety property, only a cap the CLI applies and the library does not.
1870
+ # The previous maxima (1M rows, 2M intermediate, 256 MiB retained) were 1/10th, 1/20th and
1871
+ # 1/64th of the ceilings they front, with nothing written down deriving them, and they made
1872
+ # the year-scale capacity the graph engine documents unreachable from the command line.
1833
1873
  build.add_argument(
1834
1874
  "--graph-max-rows",
1835
- type=_integer_between(1, 1_000_000),
1836
- metavar="1..1000000",
1875
+ type=_integer_between(1, HARD_MAX_SOURCE_ROWS),
1876
+ metavar=f"1..{HARD_MAX_SOURCE_ROWS}",
1837
1877
  help="trusted graph source/output row ceiling (v2 plans only)",
1838
1878
  )
1839
1879
  build.add_argument(
1840
1880
  "--graph-max-intermediate-rows",
1841
- type=_integer_between(1, 2_000_000),
1881
+ type=_integer_between(1, HARD_MAX_INTERMEDIATE_ROWS),
1842
1882
  default=None,
1843
- metavar="1..2000000",
1883
+ metavar=f"1..{HARD_MAX_INTERMEDIATE_ROWS}",
1844
1884
  help="trusted graph intermediate row ceiling",
1845
1885
  )
1846
1886
  build.add_argument(
1847
1887
  "--graph-max-retained-bytes",
1848
- type=_integer_between(1, 256 * 1024 * 1024),
1888
+ type=_integer_between(1, HARD_MAX_RETAINED_BYTES),
1849
1889
  default=None,
1850
1890
  metavar="BYTES",
1851
1891
  help="trusted graph retained-byte ceiling",
@@ -1979,6 +2019,14 @@ def _parser(
1979
2019
  help="the run settings: which recipe fingerprint and engine versions this run is pinned to",
1980
2020
  )
1981
2021
  recipe_run.add_argument("--input-root", type=Path, required=True, help=_INPUT_ROOT)
2022
+ recipe_run.add_argument(
2023
+ "--connector-registry",
2024
+ type=Path,
2025
+ help=(
2026
+ "the folder of stream source documents the captures under the input folder were "
2027
+ "recorded under; without it, only the ones this build ships are held"
2028
+ ),
2029
+ )
1982
2030
  recipe_run.add_argument("--output", type=Path, required=True, help=_OUTPUT_NEW)
1983
2031
  recipe_run.add_argument("--previous-run-dir", type=Path, help=_PREVIOUS_BUILD)
1984
2032
  recipe_run.add_argument("--producer-principal", required=True, help=_BUILT_BY)
@@ -3058,6 +3106,7 @@ def _local_recipe_registry(
3058
3106
  sandbox: CrawlerSandbox,
3059
3107
  stock_sources: tuple[Any, ...],
3060
3108
  stream_sources: tuple[Any, ...],
3109
+ connector_registry: Path | None = None,
3061
3110
  ) -> AdapterRegistry:
3062
3111
  """Build the exact allowlist this local run is permitted to use.
3063
3112
 
@@ -3069,6 +3118,14 @@ def _local_recipe_registry(
3069
3118
  host allowlist against the address in the query and the other hands the fetch to Studio's
3070
3119
  hosted clean room. A recorded capture has no address and no hosted home yet, so an adapter
3071
3120
  registered in either of those would claim a capability it cannot honestly provide.
3121
+
3122
+ ``connector_registry`` is the folder of source documents an operator wrote, the same one they
3123
+ recorded the capture under. ``None`` means the versions this build ships. It has to be
3124
+ sayable here: a sealed capture pins the digest of the source document it was recorded under,
3125
+ and a build that could only look in the documents it ships would refuse every capture taken
3126
+ from a source somebody wrote -- which is every live capture, because the one source this build
3127
+ ships may not be captured live at all. It is not a way to reinterpret a capture: the manifest
3128
+ still names its own digest, and this only says where that version may be looked up.
3072
3129
  """
3073
3130
 
3074
3131
  adapters: list[Any] = []
@@ -3082,19 +3139,37 @@ def _local_recipe_registry(
3082
3139
  )
3083
3140
  if stream_sources:
3084
3141
  captures_root = input_root / _CAPTURES_DIRECTORY_NAME
3085
- gateway = RecordedStreamGateway(
3142
+ # Read once, here, before any Build work: a folder that is not there, or is a link to
3143
+ # one, is refused with STREAM_CONNECTOR_REGISTRY_ROOT at the start of the run rather
3144
+ # than found missing halfway through it. With no folder named, this is the registry of
3145
+ # documents the build ships, which is what every run did before the folder could be said.
3146
+ held = load_stream_connector_registry(
3147
+ None if connector_registry is None else connector_registry.absolute()
3148
+ )
3149
+ reader = RecordedStreamGateway(
3086
3150
  captures_root=captures_root,
3087
3151
  # Coordinator times, not capture times. The adapter checks the batch it gets back
3088
3152
  # against the observation evidence recorded here, and a gateway that answered with
3089
3153
  # times it read out of a file would make that check a tautology.
3090
3154
  observed_at=execution.requested_at,
3091
3155
  available_at=execution.requested_at,
3156
+ registry=held,
3092
3157
  )
3158
+ governance = _recorded_stream_governance(execution, stream_sources, reader)
3159
+ # The same gateway, stamping a batch with the availability this coordinator just wrote
3160
+ # down rather than with the moment the run started. The two are not the same fact: a
3161
+ # capture stops being extended when its Recorder stops, and the observation above says
3162
+ # so deliberately, so a gateway still stamping "now" would hand the adapter a batch its
3163
+ # own evidence contradicts and every build over a capture older than an instant would
3164
+ # be refused with STREAM_TEMPORAL_BINDING. This is still a coordinator input -- the
3165
+ # value is read once, into the evidence, and handed on -- and not the gateway reading a
3166
+ # time out of the file it is serving.
3167
+ gateway = replace(reader, available_at=governance.observation.available_at)
3093
3168
  adapters.append(
3094
3169
  StreamBatchAdapter(
3095
3170
  gateway=gateway,
3096
3171
  sandbox=sandbox,
3097
- governance=_recorded_stream_governance(execution, stream_sources, gateway),
3172
+ governance=governance,
3098
3173
  watermark_store=StreamWatermarkStore(stream_ledger_root(captures_root)),
3099
3174
  )
3100
3175
  )
@@ -3111,6 +3186,7 @@ def _execute_public_recipe_run(
3111
3186
  producer_principal: str,
3112
3187
  producer_attempt: str,
3113
3188
  previous_run_dir: Path | None,
3189
+ connector_registry: Path | None = None,
3114
3190
  visual_store: VisualRunStore | None = None,
3115
3191
  ) -> Any:
3116
3192
  stock_sources = _stock_local_reader_sources(recipe, execution)
@@ -3147,6 +3223,7 @@ def _execute_public_recipe_run(
3147
3223
  sandbox=sandbox,
3148
3224
  stock_sources=stock_sources,
3149
3225
  stream_sources=stream_sources,
3226
+ connector_registry=connector_registry,
3150
3227
  )
3151
3228
 
3152
3229
  def _context(source: Any, operation: str) -> AcquisitionContext:
@@ -35,6 +35,7 @@ from mostlyright.data_harness.canonical import (
35
35
  from mostlyright.data_harness.hosted_crawler import (
36
36
  CRAWLER_EGRESS_POLICY_ENV,
37
37
  WARM_UP_RESULT_SCHEMA,
38
+ HostedCrawlerError,
38
39
  encode_normalization_input,
39
40
  )
40
41
  from mostlyright.data_harness.hosted_crawler_fetch import fetch_crawler_source
@@ -80,6 +81,24 @@ PRE_BOOTSTRAP_FAILURE_CODES = frozenset(
80
81
  "CRAWLER_BOOTSTRAP_RESPONSE_TOO_LARGE",
81
82
  }
82
83
  )
84
+ # Wrapper deaths after bootstrap: the fetch may have succeeded, so these must
85
+ # never become sealed refusals (a refusal is the source's answer, and the
86
+ # source never answered "no"). Without a control-plane report the session
87
+ # dangles until the producer's poll deadline expires and the run dies blind
88
+ # (harness#400). Keep this closed in lock-step with Studio's
89
+ # ``WRAPPER_FAILURE_CODES``; a Studio that predates that set refuses the
90
+ # report with 400 and the job still exits non-zero, so deploy order is free.
91
+ WRAPPER_FAILURE_CODES = frozenset(
92
+ {
93
+ "CRAWLER_CHILD_FAILED",
94
+ "CRAWLER_CHILD_INVALID",
95
+ "CRAWLER_EXECUTABLE_UNAVAILABLE",
96
+ "CRAWLER_JOB_FAILED",
97
+ "CRAWLER_RESULTS_BUCKET_REQUIRED",
98
+ "CRAWLER_UPLOAD_FAILED",
99
+ "CRAWLER_WORKLOAD_IDENTITY_UNAVAILABLE",
100
+ }
101
+ )
83
102
  # Sized for an EPA-scale year: the streamed decode, the streamed verification pass, and
84
103
  # the chunked result encode are each one pure-Python walk over ~200M cells, which a live
85
104
  # run spends 12-15 minutes on. The old 600 was calibrated to decode alone and killed a
@@ -474,7 +493,7 @@ def _report_crawler_bootstrap_failure(
474
493
  can cross back into the crawler through this path.
475
494
  """
476
495
 
477
- if failure_code not in PRE_BOOTSTRAP_FAILURE_CODES:
496
+ if failure_code not in PRE_BOOTSTRAP_FAILURE_CODES | WRAPPER_FAILURE_CODES:
478
497
  return False
479
498
  token: bytearray | None = None
480
499
  response: bytearray | None = None
@@ -1028,19 +1047,23 @@ def _validate_public_https_result(
1028
1047
  from mostlyright.data_harness.readers.contracts import ReaderPin
1029
1048
 
1030
1049
  try:
1050
+ from mostlyright.data_harness.readers.registry import TOOLBOX
1051
+
1052
+ family = TOOLBOX.resolve(reader["family_id"], reader["family_version"])
1053
+ # The child digests the ADMITTED options -- ``validate_options``
1054
+ # fills family defaults -- so the expected identity must digest the
1055
+ # same bytes. Digesting the sealed pin raw made every recipe that
1056
+ # omitted a defaulted key fail ``reader_identity`` on every crawl.
1031
1057
  pin = ReaderPin(
1032
1058
  reader["family_id"],
1033
1059
  reader["family_version"],
1034
- reader["decode_options"],
1060
+ dict(family.validate_options(reader["decode_options"])),
1035
1061
  )
1036
1062
  except (KeyError, TypeError, ValueError):
1037
1063
  _fail("CRAWLER_CHILD_INVALID", "public HTTPS Reader identity is invalid")
1038
1064
  reader_identity = (pin.family_id, pin.family_version, pin.options_digest)
1039
1065
  resource_caps = query.get("resource_caps")
1040
1066
  try:
1041
- from mostlyright.data_harness.readers.registry import TOOLBOX
1042
-
1043
- family = TOOLBOX.resolve(pin.family_id, pin.family_version)
1044
1067
  expected_reader_budgets = asdict(
1045
1068
  family.default_budgets.narrowed_by(
1046
1069
  {
@@ -1324,6 +1347,10 @@ def crawler_job_main(argv: list[str] | None = None) -> int:
1324
1347
  return 0
1325
1348
  except (
1326
1349
  CanonicalJSONError,
1350
+ # HostedCrawlerError is a RuntimeError, not a ValueError; leaving it out
1351
+ # let every request/normalization refusal escape as a raw traceback with
1352
+ # no sealed failure and no session report (harness#400).
1353
+ HostedCrawlerError,
1327
1354
  HostedCrawlerJobError,
1328
1355
  HostedCrawlerProtocolError,
1329
1356
  TypeError,
@@ -1366,6 +1393,28 @@ def crawler_job_main(argv: list[str] | None = None) -> int:
1366
1393
  )
1367
1394
  sys.stderr.write("\n")
1368
1395
  return 0
1396
+ if code in WRAPPER_FAILURE_CODES:
1397
+ # A post-bootstrap wrapper death has no sealed-refusal lane (the
1398
+ # source never refused), so terminalize the session through the
1399
+ # ``:fail`` control-plane route instead of leaving it to dangle
1400
+ # into the producer's poll deadline. Best-effort: the job exits
1401
+ # non-zero either way, and an older Studio refuses the code.
1402
+ reported = _report_crawler_bootstrap_failure(
1403
+ crawler_session_id=crawler_session_id,
1404
+ failure_code=code,
1405
+ )
1406
+ sys.stderr.write(
1407
+ canonical_json_bytes(
1408
+ {
1409
+ "status": "failed",
1410
+ "code": code,
1411
+ "detail": detail,
1412
+ "session_failure_reported": reported,
1413
+ }
1414
+ ).decode()
1415
+ )
1416
+ sys.stderr.write("\n")
1417
+ return 1
1369
1418
  sys.stderr.write(
1370
1419
  canonical_json_bytes({"status": "failed", "code": code, "detail": detail}).decode()
1371
1420
  )