mostlyright-data 0.14.2__tar.gz → 0.15.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 (567) hide show
  1. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/PKG-INFO +1 -1
  2. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/pyproject.toml +1 -1
  3. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/skills/mr-data-build/SKILL.md +21 -12
  4. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/http.py +231 -1
  5. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/bounded_query.py +66 -20
  6. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/declared_checks.py +124 -1
  7. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler_fetch.py +98 -9
  8. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_run_worker.py +1525 -57
  9. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_session_worker.py +149 -12
  10. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_worker.py +271 -10
  11. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/inprocess_acquisition.py +87 -3
  12. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/pipeline.py +107 -0
  13. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/run_execution_v4.py +319 -30
  14. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_subscription_worker.py +64 -0
  15. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/studio_boundary.py +2 -2
  16. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/studio_subscription_control.py +28 -6
  17. mostlyright_data-0.15.0/src/mostlyright/data_harness/table_manifest.py +1050 -0
  18. mostlyright_data-0.15.0/src/mostlyright/data_harness/table_parts.py +743 -0
  19. mostlyright_data-0.15.0/src/mostlyright/data_harness/table_profile.py +332 -0
  20. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/activity.py +2 -2
  21. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/router.py +8 -1
  22. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4.py +53 -14
  23. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_artifacts.py +269 -16
  24. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_datasets.py +86 -5
  25. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_tables.py +185 -1
  26. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/vocabulary.py +12 -0
  27. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/headline.py +1 -0
  28. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/remediation.py +35 -1
  29. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/render.py +5 -0
  30. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_acquisition.py +32 -1
  31. mostlyright_data-0.15.0/src/mostlyright/data_harness/v4_closed_source.py +289 -0
  32. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_recipe.py +311 -1
  33. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_required_controls.py +16 -2
  34. mostlyright_data-0.15.0/src/mostlyright/data_harness/v4_window.py +717 -0
  35. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/.gitignore +0 -0
  36. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/README.md +0 -0
  37. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/scripts/hatch_build.py +0 -0
  38. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/skills/mr-data-build/agents/openai.yaml +0 -0
  39. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  40. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  41. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/__init__.py +0 -0
  42. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  43. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  44. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  45. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  46. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  47. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  48. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  49. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  50. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  51. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  52. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  53. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  54. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  55. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  56. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  57. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  58. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  59. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  60. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  61. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  62. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  63. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  64. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  65. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  66. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  67. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  68. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  69. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  70. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  71. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  72. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  73. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  74. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  75. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  76. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  77. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  78. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  79. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/__init__.py +0 -0
  80. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  81. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
  82. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  83. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  84. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  85. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  86. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  87. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  88. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  89. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  90. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  91. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  92. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  93. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  94. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/reference.py +0 -0
  95. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/registry.py +0 -0
  96. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  97. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/canonical.py +0 -0
  98. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/catalog_job.py +0 -0
  99. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/cli.py +0 -0
  100. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/contracts.py +0 -0
  101. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/coordinator.py +0 -0
  102. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/crosswalks.py +0 -0
  103. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/deploy.py +0 -0
  104. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/deploy_target.py +0 -0
  105. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  106. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  107. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  108. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
  109. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/capture.py +0 -0
  110. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  111. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/lane.py +0 -0
  112. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  113. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  114. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/registry.py +0 -0
  115. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  116. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/selections.py +0 -0
  117. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/tables.py +0 -0
  118. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  119. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/events.py +0 -0
  120. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  121. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/formats.py +0 -0
  122. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/governors.py +0 -0
  123. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  124. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  125. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  126. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  127. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  128. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  129. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  130. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  131. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  132. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  133. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  134. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
  135. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  136. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  137. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  138. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
  139. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
  140. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
  141. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  142. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  143. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  144. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  145. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  146. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  147. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/key_seam.py +0 -0
  148. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  149. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_contracts.py +0 -0
  150. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  151. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  152. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  153. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  154. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  155. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  156. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/service.py +0 -0
  157. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  158. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  159. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  160. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  161. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  162. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  163. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  164. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  165. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  166. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  167. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  168. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  169. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  170. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  171. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  172. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  173. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  174. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/notebook.py +0 -0
  175. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/offline.py +0 -0
  176. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/operation_registry.py +0 -0
  177. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/operator_setup.py +0 -0
  178. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/plan_graph.py +0 -0
  179. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  180. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  181. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  182. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  183. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  184. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  185. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  186. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/table.py +0 -0
  187. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  188. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/progress_events.py +0 -0
  189. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  190. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  191. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  192. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/containers.py +0 -0
  193. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  194. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  195. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  196. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  197. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  198. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  199. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  200. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  201. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  202. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  203. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  204. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  205. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  206. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  207. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  208. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  209. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  210. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  211. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  212. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  213. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  214. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  215. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  216. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  217. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  218. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  219. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  220. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  221. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  222. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/registry.py +0 -0
  223. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  224. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  225. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  226. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  227. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  228. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  229. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  230. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  231. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  232. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  233. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  234. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  235. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  236. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  237. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  238. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  239. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  240. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  241. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  242. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  243. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  244. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  245. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  246. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  247. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  248. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  249. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  250. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  251. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  252. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  253. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  254. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  255. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  256. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  257. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  258. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  259. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  260. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  261. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  262. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  263. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
  264. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  265. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  266. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  267. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  268. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  269. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  270. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
  271. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
  272. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  273. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  274. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  275. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  276. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  277. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
  278. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
  279. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  280. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  281. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
  282. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
  283. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
  284. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
  285. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
  286. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/himawari-hsd-b13-complete.zip +0 -0
  287. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
  288. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
  289. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
  290. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
  291. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
  292. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
  293. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  294. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  295. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  296. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  297. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  298. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  299. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
  300. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
  301. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
  302. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
  303. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  304. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
  305. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  306. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
  307. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  308. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  309. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  310. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  311. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  312. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  313. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  314. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  315. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  316. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  317. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  318. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  319. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  320. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  321. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  322. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
  323. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
  324. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  325. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  326. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  327. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  328. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  329. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  330. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  331. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  332. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  333. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  334. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples.py +0 -0
  335. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  336. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  337. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  338. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  339. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  340. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  341. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  342. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  343. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  344. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  345. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  346. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  347. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  348. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  349. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  350. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  351. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  352. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  353. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  354. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  355. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  356. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  357. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  358. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  359. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  360. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/vector.py +0 -0
  361. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  362. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  363. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  364. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/recipe.py +0 -0
  365. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  366. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  367. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  368. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  369. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/errors.py +0 -0
  370. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/review.py +0 -0
  371. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/rowset.py +0 -0
  372. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/session_probes.py +0 -0
  373. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/signing.py +0 -0
  374. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/skill_assets.py +0 -0
  375. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/source_discovery.py +0 -0
  376. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  377. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  378. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  379. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  380. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  381. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
  382. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  383. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  384. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  385. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  386. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  387. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  388. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  389. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  390. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  391. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  392. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  393. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  394. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  395. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
  396. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  397. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  398. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  399. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  400. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  401. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  402. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  403. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  404. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  405. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  406. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  407. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  408. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  409. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  410. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  411. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  412. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  413. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  414. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  415. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  416. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  417. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  418. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  419. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  420. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
  421. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  422. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  423. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  424. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  425. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/collections.py +0 -0
  426. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  427. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  428. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  429. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  430. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  431. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/governance.py +0 -0
  432. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  433. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/integration.py +0 -0
  434. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  435. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/registry.py +0 -0
  436. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  437. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  438. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/sports.py +0 -0
  439. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream.py +0 -0
  440. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  441. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  442. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
  443. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  444. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  445. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  446. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  447. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  448. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  449. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  450. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  451. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  452. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  453. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  454. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  455. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  456. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  457. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  458. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  459. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  460. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  461. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  462. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  463. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
  464. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  465. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  466. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  467. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
  468. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
  469. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_subscription_sealer.py +0 -0
  470. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_venue.py +0 -0
  471. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
  472. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  473. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  474. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  475. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  476. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/commands.py +0 -0
  477. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/download.py +0 -0
  478. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  479. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/parity.py +0 -0
  480. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/probe.py +0 -0
  481. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/propose.py +0 -0
  482. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/recipe.py +0 -0
  483. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/research.py +0 -0
  484. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/runs.py +0 -0
  485. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/session.py +0 -0
  486. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/stream.py +0 -0
  487. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  488. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/transport.py +0 -0
  489. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  490. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  491. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  492. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
  493. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
  494. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  495. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  496. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/workers.py +0 -0
  497. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  498. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  499. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/unit_flow.py +0 -0
  500. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/units.py +0 -0
  501. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  502. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/approve.py +0 -0
  503. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  504. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  505. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  506. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  507. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  508. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  509. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  510. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  511. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  512. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  513. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  514. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  515. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  516. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  517. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  518. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  519. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  520. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  521. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  522. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  523. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
  524. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  525. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  526. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  527. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  528. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  529. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  530. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  531. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  532. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  533. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  534. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  535. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  536. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  537. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  538. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  539. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  540. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  541. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
  542. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  543. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  544. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/login.py +0 -0
  545. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  546. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/peek.py +0 -0
  547. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  548. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  549. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  550. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/readers.py +0 -0
  551. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/workload.py +0 -0
  552. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  553. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  554. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  555. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  556. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
  557. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_transform.py +0 -0
  558. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  559. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  560. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  561. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  562. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  563. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  564. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  565. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  566. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  567. {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.14.2
3
+ Version: 0.15.0
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/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyright-data"
3
- version = "0.14.2"
3
+ version = "0.15.0"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -102,7 +102,7 @@ absence as a defect.
102
102
 
103
103
  ## Commands
104
104
 
105
- These twenty-eight are the whole surface, alongside `acquire-slices`, which names a capability
105
+ These thirty are the whole surface, alongside `acquire-slices`, which names a capability
106
106
  gap rather than doing anything, and `export-hosted-candidate`, which is a backend operator step.
107
107
 
108
108
  | Command | What it does |
@@ -124,7 +124,9 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
124
124
  | `mr-data receipt` | Print what one run recorded about how it was built: every source it fetched and what those bytes hashed to, the coverage it delivered, and the members of its raw snapshot. |
125
125
  | `mr-data checks` | Report how each check the recipe declared came out — the name, whether it passed, what it found. Exits non-zero when one did not pass. |
126
126
  | `mr-data note` | Write one cell of a run's decision record — a heading, a body, and the typed blocks that carry a source, a decision or a clarification onto the stage its phase names. The body comes from `--markdown-file FILE`, which is the form to use; standard input is read when no file is named and is refused when it is a terminal or empty. `--list` reads back what is written. |
127
- | `mr-data download` | Bring one run's artifacts back to this computer, each one's bytes checked against the digest Studio sealed them under. `--kind` selects out of `table_parquet`, `column_profile`, `preview`, `receipt` and `raw_snapshot`; without it, the table and the receipt. |
127
+ | `mr-data download` | Bring one run's artifacts back to this computer, each one's bytes checked against the digest Studio sealed them under. `--kind` selects out of `table_parquet`, `table_manifest`, `table_part`, `column_profile`, `preview`, `receipt` and `raw_snapshot`; without it, the table and the receipt — and for a run whose table is a manifest over parts, the manifest, its parts and the receipt, written as `table/manifest.json` beside `table/parts/<part_key>.parquet`. |
128
+ | `mr-data verify` | Hold one run's sealed table manifest against the parts it names, and report every disagreement. Without `--deep` it fetches the manifest alone; with `--deep` it fetches every part the run sealed and re-hashes it against the digest the manifest states. Exits non-zero when anything disagrees. |
129
+ | `mr-data parts` | List one table version's parts — the identifier, the row count, the byte size and the recorded bounds of each — so a training loader can shard them across workers and read a table no single file should hold. `--version` names a version rather than the live one, and `--from`/`--to` keep only the parts a value range cannot rule out. Nothing is downloaded by listing them; see [training loaders](../../docs/TRAINING-LOADERS.md) for the pattern. |
128
130
  | `mr-data diff` | Compare two runs and say what changed. |
129
131
  | `mr-data keys` | Enrol a source credential by name, list the names with their created and rotated times, and delete one. `keys set` reads the value from a file or from standard input and never from the command line; no command prints a value back. |
130
132
  | `mr-data stream` | Record a public `wss://` venue so a build can read it. `stream document register --file F` admits the connector document, `stream registry create --digest D` admits a set of them, `stream probe` listens briefly and seals nothing, `stream capture --seconds N` records a bounded window, `stream subscribe` keeps recording, `stream subscription {show|pause|resume|stop} ID` moves one, `stream status ID` reads a capture or a probe, and `stream recordings --document-digest D` names what a build could read and until when. `--seconds` is at most 600. `mr-data run` takes no duration: a build reads sealed batches and is bounded by them. |
@@ -137,8 +139,9 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
137
139
  | `mr-data demote` | Ask Studio to withdraw the pointer and any schedule it owns, for one table or for as many as you name: `demote TABLE [TABLE ...]` withdraws them one after another, attempts every one of them whatever the one before it answered, prints a line for each, and exits non-zero if any is still live. Pair it with `table archive` when you are retiring a set: a live table cannot be archived, so it is withdraw-then-archive, two commands rather than a loop. |
138
140
 
139
141
  `auth`, `login`, `whoami` and `clarify` are the same implementation in both profiles, and
140
- `clarify` alone reaches nothing at all. The other twenty-four answer from Studio. Eight only
141
- read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`, `download` and `diff`.
142
+ `clarify` alone reaches nothing at all. The other twenty-six answer from Studio. Ten only
143
+ read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`, `download`, `verify`, `parts` and
144
+ `diff`.
142
145
  Sixteen start or change something: `dataset`, `recipe`, `cover`, `run`, `query`, `probe`, `keys`,
143
146
  `stream`, `open`, `note`, `promote`, `reschedule`, `table`, `pin`, `unpin` and `demote`. The split
144
147
  is over names, not over invocations: `table TABLE` reads and `table rename` writes, and the name
@@ -248,8 +251,8 @@ every stage below writes to it as it goes rather than composing the page at the
248
251
  Authenticate first: run the Cloud authentication preflight above once, before the first cloud
249
252
  command of the session.
250
253
 
251
- **Then stage 1, and nothing before it.** `mr-data dataset create` and `mr-data open` are the first
252
- two commands of the session after the preflight. They come before the durable notes are read,
254
+ **Then stage 1, and nothing before it.** `mr-data dataset create --handoff` and opening its navigation URL are the first
255
+ two actions of the session after the preflight. They come before the durable notes are read,
253
256
  before `mr-data runs`, before a catalog is searched, before a provider's documentation is opened
254
257
  and before any URL is fetched. The lookups below are research, research is what fills the page, and
255
258
  a page created after the research has already happened is the assertion this stage exists to
@@ -291,14 +294,13 @@ message that contradicts you.
291
294
  Create the dataset from a working title and put it in front of whoever is watching, **before any
292
295
  source lookup**. These are the first two commands after the preflight — nothing reads a note,
293
296
  searches a catalog, opens a provider page or fetches a URL until they have both returned. It costs
294
- two commands and it is what turns a build into something a person can follow:
297
+ one command and one host navigation, and it is what turns a build into something a person can follow:
295
298
 
296
299
  ```sh
297
- mr-data dataset create --name "Kathmandu monsoon flooding" --json
298
- mr-data open /datasets/DATASET_ID
300
+ mr-data dataset create --name "Kathmandu monsoon flooding" --handoff --json
299
301
  ```
300
302
 
301
- Navigate the host's in-app browser to that address immediately, and keep that one tab for the whole
303
+ Consume the creation receipt’s `navigation.url` immediately in the host’s in-app browser. Creation has succeeded even if `navigation.status` says `handoff_unavailable`; open the fallback URL or retry only `mr-data open`, never create again. Navigate to that address immediately, and keep that one tab for the whole
302
304
  build. The working title is allowed to be provisional — stage 4 writes the title it settles on —
303
305
  and a title that never changes is fine too. Where the address cannot be minted, carry on with the
304
306
  plain dashboard address rather than blocking.
@@ -478,8 +480,7 @@ mr-data dataset set DATASET_ID --description-file DESCRIPTION.md --json
478
480
  Two calls rather than one, so the person watching sees the title land and then the text arrive.
479
481
  Each call reads the version first and writes under it, so a description you wrote against a page
480
482
  somebody else has since edited is retried once and then reported rather than silently overwriting
481
- them. Write the description COMPLETE the first time — it is documentation, not a placeholder — and
482
- do not send it in pieces.
483
+ them. While composing, send bounded snapshots with `mr-data dataset draft DATASET_ID --description-file DRAFT.md --expected-version VERSION --json`. Chain the returned version into the next snapshot, writing a meaningful paragraph at a time. These snapshots are temporary and do not replace the saved description. Commit the complete documentation with `mr-data dataset set DATASET_ID --description-file DESCRIPTION.md --expected-version VERSION --json`. If another edit moved that version, stop the draft and reconcile it with the user’s text; never retry by blindly advancing the version. Do not send fabricated partial text or delay completed text to simulate writing.
483
484
 
484
485
  **The dataset description is the documentation, and it is read by people and by search engines.**
485
486
  `dataset.description` is Markdown, rendered on the dataset page with headings and lists, and it
@@ -1700,3 +1701,11 @@ When comparing sources, use a compact `Source | Decision | Evidence` table, then
1700
1701
  source and its main limitation in one sentence each. Use field and quality tables for contracts.
1701
1702
  Give fields readable descriptions; do not rely on names such as `pm25_daily_mean` to explain
1702
1703
  themselves. Do not present a sequence of unlabeled paragraphs or default to a bullet dump.
1704
+
1705
+ ### Agent presence lifecycle
1706
+
1707
+ The floating pill represents only your active work. Start `dataset activity` immediately after creation, update the sentence when your task changes, and renew at least once a minute while you are actively working. The default lease is two minutes. Do not leave a detached heartbeat running after your turn ends. Worker ingestion progress has its own table surface and is not proof that you are working.
1708
+
1709
+ When recovering, report what you are trying now; an earlier failed attempt belongs in the record. Before every final handoff, cancellation, or exhausted stop, report `--phase done` with a truthful final sentence (for example, “Dataset ready to explore” or “Stopped before the build completed”). Do this even when tables are not enabled. Only use `waiting_on_you` when you have actually asked for an answer. Promotion does not finish your agent session.
1710
+
1711
+ The host opens the dataset before research begins and keeps the same tab. Enable its optional Follow agent control for a watch-along experience; manual scrolling pauses it and must never be overridden.
@@ -755,6 +755,138 @@ class ByteRange:
755
755
  _PRESENCE_PROBE_RANGE = ByteRange(first_byte=0, last_byte=0)
756
756
 
757
757
 
758
+ NOT_MODIFIED_STATUS = 304
759
+ # ``entity-tag = [ weak ] opaque-tag`` with ``etagc = %x21 / %x23-7E`` (RFC 9110 8.8.3). The
760
+ # obs-text range is excluded: a validator this boundary cannot spell back byte for byte is a
761
+ # validator it will not send. The length bound is the one the response-header reader already
762
+ # holds validators to elsewhere in this repository.
763
+ _ENTITY_TAG = re.compile(r'(?:W/)?"[\x21\x23-\x7e]{0,256}"')
764
+ # ``IMF-fixdate``, and only that. RFC 9110 5.6.7 requires a sender to use it and permits a
765
+ # recipient to parse the two obsolete forms; a recipient that RE-SENDS what it parsed is a
766
+ # sender, so the obsolete forms are refused here rather than normalized. A publisher whose
767
+ # ``Last-Modified`` is not an IMF-fixdate simply has no reusable date validator.
768
+ #
769
+ # The calendar is NOT checked -- a 31st of February matches -- and that is the right depth for
770
+ # what this pattern is for. The value is echoed back to the publisher that minted it, never
771
+ # interpreted as a moment, so what has to be guaranteed is the shape a request header may carry:
772
+ # a fixed length, a fixed field order, and no character that could end the header line.
773
+ _IMF_FIXDATE = re.compile(
774
+ r"(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), [0-3][0-9] "
775
+ r"(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) "
776
+ r"[0-9]{4} [0-2][0-9]:[0-5][0-9]:[0-6][0-9] GMT"
777
+ )
778
+
779
+
780
+ @dataclass(frozen=True)
781
+ class ConditionalValidators:
782
+ """What a publisher said about an edition, offered back to it as a precondition.
783
+
784
+ A conditional request is ordered through this typed value rather than through a caller
785
+ supplied header mapping, for the reason :class:`ByteRange` is: a general ``extra_headers``
786
+ argument would put a header-injection surface at the most security-sensitive seam in this
787
+ package. A validator validates itself against the grammar its own header field names and
788
+ renders to exactly the header values that grammar admits, so no caller composes a request
789
+ header character by character.
790
+
791
+ Both members are publisher-controlled text. Nothing here interprets them -- no comparison
792
+ is made against a later response, no edition is inferred -- because the only party that can
793
+ say whether an entity tag still names the current edition is the publisher that minted it.
794
+ They are carried, spelled back, and otherwise opaque.
795
+
796
+ A WEAK ENTITY TAG IS A VALID PRECONDITION HERE. ``If-None-Match`` uses the weak comparison
797
+ function (RFC 9110 8.8.3.2), so ``W/"..."`` is exactly as usable as a strong tag for asking
798
+ "has this changed"; it is only ``If-Match`` and ranged revalidation that need a strong one,
799
+ and neither is ordered through this type.
800
+ """
801
+
802
+ etag: str | None = None
803
+ last_modified: str | None = None
804
+
805
+ def __post_init__(self) -> None:
806
+ if self.etag is None and self.last_modified is None:
807
+ raise AcquisitionSecurityError(
808
+ "CONDITIONAL_VALIDATOR",
809
+ "a conditional request states at least one validator",
810
+ )
811
+ if self.etag is not None and (
812
+ not isinstance(self.etag, str) or _ENTITY_TAG.fullmatch(self.etag) is None
813
+ ):
814
+ raise AcquisitionSecurityError(
815
+ "CONDITIONAL_VALIDATOR",
816
+ "the entity tag is not an RFC 9110 entity-tag",
817
+ )
818
+ if self.last_modified is not None and (
819
+ not isinstance(self.last_modified, str)
820
+ or _IMF_FIXDATE.fullmatch(self.last_modified) is None
821
+ ):
822
+ raise AcquisitionSecurityError(
823
+ "CONDITIONAL_VALIDATOR",
824
+ "the modification date is not an IMF-fixdate",
825
+ )
826
+
827
+ @classmethod
828
+ def from_values(
829
+ cls, etag: str | None, last_modified: str | None
830
+ ) -> ConditionalValidators | None:
831
+ """The validators worth offering back, or ``None`` when neither is.
832
+
833
+ A publisher that stated something this boundary will not spell back -- an obsolete date
834
+ form, a tag with a character the grammar excludes -- gets a full request next time, which
835
+ is the outcome that already exists. Refusing the whole acquisition over it would turn a
836
+ saving into an outage.
837
+ """
838
+
839
+ tag = etag if isinstance(etag, str) and _ENTITY_TAG.fullmatch(etag) else None
840
+ date = (
841
+ last_modified
842
+ if isinstance(last_modified, str) and _IMF_FIXDATE.fullmatch(last_modified)
843
+ else None
844
+ )
845
+ if tag is None and date is None:
846
+ return None
847
+ return cls(etag=tag, last_modified=date)
848
+
849
+ def header_values(self) -> tuple[tuple[str, str], ...]:
850
+ """The exact request headers this precondition renders to.
851
+
852
+ The entity tag is preferred and the date accompanies it: a publisher evaluates
853
+ ``If-None-Match`` and ignores ``If-Modified-Since`` when both are present (RFC 9110
854
+ 13.2.2), so sending both costs nothing and leaves a date-only publisher answerable.
855
+ """
856
+
857
+ headers: list[tuple[str, str]] = []
858
+ if self.etag is not None:
859
+ headers.append(("If-None-Match", self.etag))
860
+ if self.last_modified is not None:
861
+ headers.append(("If-Modified-Since", self.last_modified))
862
+ return tuple(headers)
863
+
864
+
865
+ class NotModified(AcquisitionSecurityError):
866
+ """The publisher answered a precondition with 304: this edition is the one already held.
867
+
868
+ It carries the same measured hop evidence a retrieval carries, because a 304 exchange is a
869
+ real exchange -- a DNS epoch, a pinned connection, a response with headers -- and the bytes
870
+ it did not cost are as much a fact of the run as the bytes a 200 did. There is no content
871
+ and no media type: nothing was delivered, which is the point.
872
+
873
+ Raised rather than returned so the retriever's one success shape stays
874
+ :class:`RetrievedBytes`, and only a caller that asked a question by sending a precondition
875
+ can be answered with it.
876
+ """
877
+
878
+ def __init__(
879
+ self,
880
+ *,
881
+ hops: tuple[RetrievalHop, ...],
882
+ transport_evidence_digest: str,
883
+ ) -> None:
884
+ self.hops = hops
885
+ self.transport_evidence_digest = transport_evidence_digest
886
+ self.total_response_body_size_bytes = sum(hop.response_body_size_bytes for hop in hops)
887
+ super().__init__("NOT_MODIFIED", "source answered the precondition with 304")
888
+
889
+
758
890
  @dataclass(frozen=True)
759
891
  class RetrievalLimits:
760
892
  max_response_bytes: int = 16 * 1024 * 1024
@@ -1477,17 +1609,48 @@ class PinnedHttpsRetriever:
1477
1609
  clock=self._clock,
1478
1610
  )
1479
1611
 
1480
- def retrieve(self, url: str, *, byte_range: ByteRange | None = None) -> RetrievedBytes:
1612
+ def retrieve(
1613
+ self,
1614
+ url: str,
1615
+ *,
1616
+ byte_range: ByteRange | None = None,
1617
+ validators: ConditionalValidators | None = None,
1618
+ ) -> RetrievedBytes:
1619
+ """Retrieve one address, optionally conditioned on the edition already held.
1620
+
1621
+ ``validators`` makes this a conditional GET. A publisher that answers 304 has stated
1622
+ that the edition named by the precondition is still the current one, and that answer is
1623
+ raised as :class:`NotModified` rather than returned: nothing was delivered, so there are
1624
+ no bytes to hand back. Every other answer is retrieved exactly as an unconditional one
1625
+ would be, including a 200 whose entity tag has not moved -- what the bytes are is decided
1626
+ by the bytes.
1627
+ """
1628
+
1481
1629
  if byte_range is not None and not isinstance(byte_range, ByteRange):
1482
1630
  raise AcquisitionSecurityError(
1483
1631
  "BYTE_RANGE",
1484
1632
  "a slice is ordered only through a validated byte range",
1485
1633
  )
1634
+ if validators is not None and not isinstance(validators, ConditionalValidators):
1635
+ raise AcquisitionSecurityError(
1636
+ "CONDITIONAL_VALIDATOR",
1637
+ "a precondition is ordered only through validated conditional validators",
1638
+ )
1639
+ if validators is not None and byte_range is not None:
1640
+ # A conditional ranged request is two questions in one exchange and the answers do
1641
+ # not compose: 304 speaks about the whole representation while 206 speaks about the
1642
+ # span, and the delivery check below has nothing to hold a 304 against. Ranged
1643
+ # revalidation belongs to ``If-Range`` and is not ordered here.
1644
+ raise AcquisitionSecurityError(
1645
+ "CONDITIONAL_VALIDATOR",
1646
+ "a precondition and a slice are not ordered in one request",
1647
+ )
1486
1648
  return self._fetch(
1487
1649
  url,
1488
1650
  byte_range=byte_range,
1489
1651
  presence_probe=False,
1490
1652
  datagov_authorization=None,
1653
+ validators=validators,
1491
1654
  )
1492
1655
 
1493
1656
  def retrieve_datagov_v4(
@@ -1639,7 +1802,24 @@ class PinnedHttpsRetriever:
1639
1802
  frozen_headers: Mapping[str, str] | None = None,
1640
1803
  frozen_method: str = "GET",
1641
1804
  frozen_body: bytes | None = None,
1805
+ validators: ConditionalValidators | None = None,
1642
1806
  ) -> RetrievedBytes:
1807
+ if validators is not None and (
1808
+ presence_probe
1809
+ or byte_range is not None
1810
+ or datagov_authorization is not None
1811
+ or authenticated_authorization is not None
1812
+ or frozen_headers is not None
1813
+ ):
1814
+ # A precondition is offered on the plain public path and nowhere else. A probe keeps
1815
+ # nothing, so it has no edition to condition on; the credentialed paths compose their
1816
+ # request headers under an authorization that rejects echoes and pins its own exact
1817
+ # shape, and a second source of headers there would be a second thing to reason about
1818
+ # at the seam that most needs one.
1819
+ raise AcquisitionSecurityError(
1820
+ "CONDITIONAL_VALIDATOR",
1821
+ "a precondition is offered only on an unauthenticated whole-document retrieval",
1822
+ )
1643
1823
  started = float(self._clock())
1644
1824
  current_url = url
1645
1825
  hops: list[RetrievalHop] = []
@@ -1678,6 +1858,13 @@ class PinnedHttpsRetriever:
1678
1858
  }
1679
1859
  if frozen_headers is not None:
1680
1860
  headers.update(frozen_headers)
1861
+ if validators is not None:
1862
+ # Offered on every hop of the chain rather than on the first alone. A
1863
+ # precondition is a fact about the representation the address names, and an
1864
+ # address that redirects still names it; dropping the precondition at a redirect
1865
+ # would turn a revalidation into a full download at exactly the sources that
1866
+ # front their objects behind one.
1867
+ headers.update(validators.header_values())
1681
1868
  if datagov_authorization is not None:
1682
1869
  name, value = datagov_authorization.header_for(target.normalized_url)
1683
1870
  headers[name] = value
@@ -1925,6 +2112,49 @@ class PinnedHttpsRetriever:
1925
2112
  peer_attempts,
1926
2113
  hops,
1927
2114
  )
2115
+ # THE ANSWER TO A PRECONDITION, AND ONLY WHEN ONE WAS ASKED. A 304 to a request that
2116
+ # sent no validator is a publisher answering a question nobody put, so it falls
2117
+ # through to the generic status refusal below and stays a failure.
2118
+ #
2119
+ # IT IS SETTLED BEFORE THE REPRESENTATION CHECKS BECAUSE A 304 DESCRIBES A
2120
+ # REPRESENTATION IT DID NOT SEND. RFC 9110 9.3.1 lets a 304 carry the header fields
2121
+ # a 200 would have carried, so its ``Content-Length`` states the size of the object
2122
+ # that was NOT transferred and its ``Content-Encoding`` names how that object would
2123
+ # have been encoded. Held against the empty body those two are a mismatch and a
2124
+ # forbidden encoding, and the exchange that saved the whole download would be refused
2125
+ # as malformed. The body is checked against nothing else: a 304 carrying one is
2126
+ # refused outright.
2127
+ if validators is not None and response.status == NOT_MODIFIED_STATUS:
2128
+ if response.body:
2129
+ self._raise_peer_failure(
2130
+ "NOT_MODIFIED_BODY",
2131
+ "source answered 304 with a response body",
2132
+ peer_attempts,
2133
+ hops,
2134
+ )
2135
+ hops.append(
2136
+ RetrievalHop(
2137
+ url=target.normalized_url,
2138
+ resolution_digest=target.resolution_digest,
2139
+ connected_peer=peer,
2140
+ status=response.status,
2141
+ response_headers_digest=canonical_sha256(normalized_headers),
2142
+ response_body_size_bytes=0,
2143
+ response_body_sha256=sha256_bytes(b""),
2144
+ requested_range=None,
2145
+ observed_content_range=None,
2146
+ etag=self._response_header(response, "etag", peer_attempts, hops),
2147
+ last_modified=self._response_header(
2148
+ response, "last-modified", peer_attempts, hops
2149
+ ),
2150
+ peer_attempts=tuple(peer_attempts),
2151
+ approved_ips=target.approved_ips,
2152
+ )
2153
+ )
2154
+ raise NotModified(
2155
+ hops=tuple(hops),
2156
+ transport_evidence_digest=canonical_sha256([item.to_dict() for item in hops]),
2157
+ )
1928
2158
  content_length = self._response_header(response, "content-length", peer_attempts, hops)
1929
2159
  declared_length: int | None = None
1930
2160
  if content_length is not None:
@@ -32,12 +32,19 @@ enumerated here because a reader who wants to weaken one should have to argue wi
32
32
  named here rather than left for a reader to discover.
33
33
 
34
34
  3. **One view, over this run's own parquet, and no path is ever built from caller input.** The only
35
- file name this module composes is the local path it was HANDED -- the temporary file the claim
36
- loop downloaded ``table_session.signed_url`` into. ``allowed_paths`` is set to exactly that one
37
- file (plus, by DuckDB itself, the throwaway catalog it must read), which is what lets the bound
38
- view resolve while every other path on the same disk stays unreachable. The caller's ``sql`` is
39
- passed to the engine and to nothing else: it is never concatenated into a path, a setting, or a
40
- view definition.
35
+ file names this module composes are the local paths it was HANDED -- the temporary files the
36
+ claim loop downloaded this version's selected parts into. ``allowed_paths`` is set to exactly
37
+ those files (plus, by DuckDB itself, the throwaway catalog it must read), which is what lets the
38
+ bound view resolve while every other path on the same disk stays unreachable. The caller's
39
+ ``sql`` is passed to the engine and to nothing else: it is never concatenated into a path, a
40
+ setting, or a view definition.
41
+
42
+ **A table version is a list of parts, and the list is what is admitted.** A v1 version hands one
43
+ path and a partitioned one hands the parts Studio's ``prune`` block selected; the property is
44
+ unchanged either way, because the admitted set is still exactly the files this claim delivered
45
+ and is still composed from arguments rather than from ``sql``. :data:`MAX_QUERY_PARTS` bounds
46
+ how long that list may be, so a version with four thousand parts is a named refusal rather than
47
+ four thousand open file handles.
41
48
 
42
49
  4. **The caps.** Rows TRUNCATE at the ``max_rows`` Studio sent and the answer says ``truncated``;
43
50
  bytes and time REFUSE. The byte ceiling is a refusal and never a truncation, because "a short
@@ -107,6 +114,12 @@ QUERY_RESULT_MAX_BYTES = 262_144
107
114
  #: all. Property 4 says the boundary is the worker's; a cap the worker does not check is Studio's.
108
115
  MAX_QUERY_ROWS = 1_000_000
109
116
 
117
+ #: How many parts one bounded question may be bound over. A pruned one-day range on the format's
118
+ #: reference table selects one or two; an unpruned read of a billion-row table selects three
119
+ #: hundred and eighteen. The ceiling is where the list stops being a query and starts being an
120
+ #: export, and the refusal names ``prune`` as the fix rather than raising the ceiling.
121
+ MAX_QUERY_PARTS = 512
122
+
110
123
  #: How many rows are taken from the engine at a time. The running byte budget is checked BETWEEN
111
124
  #: chunks, so what a refused answer materializes on the Python side is bounded by ONE chunk rather
112
125
  #: than by the row cap -- ``fetchmany(max_rows + 1)`` took every cell of every row before anything
@@ -162,6 +175,10 @@ QUERY_RESULT_TOO_LARGE = "QUERY_RESULT_TOO_LARGE"
162
175
  #: The worker's own wall clock ran out, before the statement or during it.
163
176
  QUERY_TIMEOUT = "QUERY_TIMEOUT"
164
177
 
178
+ #: The claim named more parts than one bounded question binds. Its sentence names ``prune``,
179
+ #: because the fix is to ask for a slice of the table rather than for a larger engine.
180
+ QUERY_TOO_MANY_PARTS = "QUERY_TOO_MANY_PARTS"
181
+
165
182
  #: What an engine failure whose class name cannot be rendered as Studio's grammar reports as.
166
183
  #:
167
184
  #: NOT in ``WORKER_REFUSAL_CODES`` and not in the inventory's ``worker_refusals``, because it is
@@ -181,6 +198,7 @@ WORKER_REFUSAL_CODES: tuple[str, ...] = (
181
198
  QUERY_STATEMENT_NOT_SINGLE,
182
199
  QUERY_RESULT_TOO_LARGE,
183
200
  QUERY_TIMEOUT,
201
+ QUERY_TOO_MANY_PARTS,
184
202
  )
185
203
 
186
204
  #: Studio's grammar for a worker-reported ``failure_code``
@@ -277,7 +295,7 @@ def _import_engine() -> Any:
277
295
  return duckdb
278
296
 
279
297
 
280
- def _confine(connection: Any, *, table_path: Path, duckdb: Any) -> None:
298
+ def _confine(connection: Any, *, table_paths: Sequence[Path], duckdb: Any) -> None:
281
299
  """Establish the four properties plus the pinned clock, in the one order that makes them true.
282
300
 
283
301
  ``allowed_paths`` first, because it is what will let the bound view read the one file once the
@@ -298,9 +316,9 @@ def _confine(connection: Any, *, table_path: Path, duckdb: Any) -> None:
298
316
  five must not answer.
299
317
  """
300
318
 
301
- literal = str(table_path).replace("'", "''")
319
+ admitted = ", ".join(_path_literal(path) for path in table_paths)
302
320
  settings = (
303
- f"set allowed_paths = ['{literal}']",
321
+ f"set allowed_paths = [{admitted}]",
304
322
  "set enable_external_access = false",
305
323
  f"set memory_limit = '{MEMORY_LIMIT}'",
306
324
  "set TimeZone = 'UTC'",
@@ -316,6 +334,17 @@ def _confine(connection: Any, *, table_path: Path, duckdb: Any) -> None:
316
334
  ) from error
317
335
 
318
336
 
337
+ def _path_literal(path: Path) -> str:
338
+ """One local path as a single-quoted SQL literal, with its own quotes doubled.
339
+
340
+ The path never comes from ``sql`` -- property 3 -- so this is not an escaping defence against
341
+ the caller; it is what keeps a path a legal literal when the container's own scratch directory
342
+ contains an apostrophe.
343
+ """
344
+
345
+ return "'" + str(path).replace("'", "''") + "'"
346
+
347
+
319
348
  def _require_single_statement(connection: Any, sql: str, *, duckdb: Any) -> None:
320
349
  """Ask DuckDB's own parser how many statements this is.
321
350
 
@@ -342,18 +371,19 @@ def _require_single_statement(connection: Any, sql: str, *, duckdb: Any) -> None
342
371
  def execute_bounded_query(
343
372
  *,
344
373
  sql: str,
345
- table_path: Path,
374
+ table_paths: Sequence[Path],
346
375
  max_rows: int,
347
376
  deadline_seconds: float,
348
377
  max_result_bytes: int = QUERY_RESULT_MAX_BYTES,
349
378
  monotonic: Callable[[], float] = time.monotonic,
350
379
  timer_factory: Callable[[float, Callable[[], None]], Any] = threading.Timer,
351
380
  ) -> BoundedQueryResult:
352
- """Answer one bounded statement against one run's parquet, inside the four properties.
381
+ """Answer one bounded statement against one table version's parts, inside the four properties.
353
382
 
354
- ``table_path`` is the local file the claim loop downloaded this run's ``table_session`` into.
355
- It is the ONLY file name this function composes, and it is composed from this argument and
356
- never from ``sql``.
383
+ ``table_paths`` are the local files the claim loop downloaded this version's selected parts
384
+ into -- one for a v1 version, and whatever Studio's ``prune`` block selected for a partitioned
385
+ one. They are the ONLY file names this function composes, and they are composed from this
386
+ argument and never from ``sql``.
357
387
 
358
388
  ``timer_factory`` exists so the deadline can be asserted without spending one: it decides WHEN
359
389
  the engine is interrupted and can neither weaken nor widen anything the connection is confined
@@ -372,11 +402,25 @@ def execute_bounded_query(
372
402
  f"a bounded query runs under a row cap of 1..{MAX_QUERY_ROWS}; this one asked for "
373
403
  f"{max_rows}",
374
404
  )
375
- resolved = table_path.resolve()
376
- if not resolved.is_file():
405
+ if len(table_paths) > MAX_QUERY_PARTS:
406
+ raise HostedWorkerError(
407
+ "QUERY_TOO_MANY_PARTS",
408
+ f"this question binds {len(table_paths)} parts against a ceiling of "
409
+ f"{MAX_QUERY_PARTS}; narrow it with a prune block naming a field range or a partition",
410
+ )
411
+ if not table_paths:
412
+ raise HostedWorkerError(
413
+ "QUERY_TABLE_UNAVAILABLE",
414
+ "this question selected no part of the table; a prune block that matches nothing has "
415
+ "no rows to read and no schema to bind",
416
+ )
417
+ resolved = [path.resolve() for path in table_paths]
418
+ missing = [path for path in resolved if not path.is_file()]
419
+ if missing:
377
420
  raise HostedWorkerError(
378
421
  "QUERY_TABLE_UNAVAILABLE",
379
- "this run's table is not on local disk; the download did not produce a file",
422
+ f"{len(missing)} of this version's {len(resolved)} parts are not on local disk; the "
423
+ "download did not produce every file",
380
424
  )
381
425
  started = monotonic()
382
426
 
@@ -392,9 +436,9 @@ def execute_bounded_query(
392
436
  "QUERY_ENGINE_UNCONFINED", f"the engine would not start: {_sentence(error)}"
393
437
  ) from error
394
438
  try:
439
+ listed = ", ".join(_path_literal(path) for path in resolved)
395
440
  builder.execute(
396
- f"create view {BOUND_VIEW_NAME} as "
397
- f"select * from read_parquet('{str(resolved).replace(chr(39), chr(39) * 2)}')"
441
+ f"create view {BOUND_VIEW_NAME} as select * from read_parquet([{listed}])"
398
442
  )
399
443
  except duckdb.Error as error:
400
444
  raise HostedWorkerError(
@@ -412,7 +456,7 @@ def execute_bounded_query(
412
456
  f"the engine would not re-open read-only: {_sentence(error)}",
413
457
  ) from error
414
458
  try:
415
- _confine(connection, table_path=resolved, duckdb=duckdb)
459
+ _confine(connection, table_paths=resolved, duckdb=duckdb)
416
460
  _require_single_statement(connection, sql, duckdb=duckdb)
417
461
  remaining = deadline_seconds - (monotonic() - started)
418
462
  if remaining <= 0:
@@ -650,6 +694,7 @@ __all__ = [
650
694
  "FETCH_CHUNK_ROWS",
651
695
  "MATERIALIZATION_FACTOR",
652
696
  "MAX_FAILURE_DETAIL",
697
+ "MAX_QUERY_PARTS",
653
698
  "MAX_QUERY_ROWS",
654
699
  "MEMORY_LIMIT",
655
700
  "QUERY_ENGINE_REFUSED",
@@ -660,6 +705,7 @@ __all__ = [
660
705
  "QUERY_STATEMENT_NOT_SINGLE",
661
706
  "QUERY_TABLE_UNAVAILABLE",
662
707
  "QUERY_TIMEOUT",
708
+ "QUERY_TOO_MANY_PARTS",
663
709
  "WORKER_REFUSAL_CODES",
664
710
  "BoundedQueryError",
665
711
  "BoundedQueryResult",