mostlyright-data 0.10.1__tar.gz → 0.10.2__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 (551) hide show
  1. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/PKG-INFO +1 -1
  2. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/pyproject.toml +1 -1
  3. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/skills/mr-data-build/SKILL.md +18 -15
  4. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/sandbox.py +61 -80
  5. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/cli.py +4 -0
  6. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/formats.py +38 -23
  7. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_bootstrap.py +37 -2
  8. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler.py +32 -6
  9. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler_job.py +10 -2
  10. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_ingestion_job.py +22 -3
  11. mostlyright_data-0.10.2/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +123 -0
  12. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_run_worker.py +8 -77
  13. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_session_container_smoke.py +5 -3
  14. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_session_worker.py +21 -8
  15. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/inprocess_acquisition.py +33 -19
  16. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/pipeline.py +8 -1
  17. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/adapters.py +6 -1
  18. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sql_transform_engine.py +41 -8
  19. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/studio_boundary.py +1 -1
  20. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/router.py +11 -1
  21. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4.py +24 -0
  22. mostlyright_data-0.10.2/src/mostlyright/data_harness/thin/v4_dataset_covers.py +142 -0
  23. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_query.py +2 -2
  24. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_runs.py +11 -8
  25. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/vocabulary.py +9 -4
  26. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/remediation.py +1 -1
  27. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/render.py +1 -0
  28. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_acquisition.py +22 -48
  29. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/.gitignore +0 -0
  30. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/README.md +0 -0
  31. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/scripts/hatch_build.py +0 -0
  32. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/skills/mr-data-build/agents/openai.yaml +0 -0
  33. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  34. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  35. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/__init__.py +0 -0
  36. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  37. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  38. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  39. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  40. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  41. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  42. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  43. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  44. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  45. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  46. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  47. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  48. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  49. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  50. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  51. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  52. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  53. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  54. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  55. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  56. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  57. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  58. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  59. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  60. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  61. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  62. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  63. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  64. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  65. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  66. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  67. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  68. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  69. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  70. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  71. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  72. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  73. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/__init__.py +0 -0
  74. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  75. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  76. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  77. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  78. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  79. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  80. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  81. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  82. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  83. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  84. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  85. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  86. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  87. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/reference.py +0 -0
  88. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/registry.py +0 -0
  89. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  90. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/bounded_query.py +0 -0
  91. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/canonical.py +0 -0
  92. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/catalog_job.py +0 -0
  93. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/contracts.py +0 -0
  94. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/coordinator.py +0 -0
  95. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/crosswalks.py +0 -0
  96. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/declared_checks.py +0 -0
  97. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/deploy.py +0 -0
  98. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/deploy_target.py +0 -0
  99. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  100. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  101. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  102. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
  103. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/capture.py +0 -0
  104. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  105. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/lane.py +0 -0
  106. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  107. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  108. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/registry.py +0 -0
  109. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  110. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/selections.py +0 -0
  111. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/tables.py +0 -0
  112. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  113. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/event_presentation.py +0 -0
  114. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/events.py +0 -0
  115. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  116. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/fleet.py +0 -0
  117. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/governors.py +0 -0
  118. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  119. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  120. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  121. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  122. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  123. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  124. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  125. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  126. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  127. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  128. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
  129. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_worker.py +0 -0
  130. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  131. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  132. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  133. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  134. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  135. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  136. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/key_seam.py +0 -0
  137. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  138. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_contracts.py +0 -0
  139. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  140. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  141. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  142. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  143. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  144. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  145. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/service.py +0 -0
  146. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  147. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  148. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  149. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  150. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  151. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  152. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  153. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  154. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  155. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  156. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  157. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  158. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  159. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  160. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  161. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  162. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  163. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/notebook.py +0 -0
  164. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/offline.py +0 -0
  165. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/operation_registry.py +0 -0
  166. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/operator_setup.py +0 -0
  167. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/plan_graph.py +0 -0
  168. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  169. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  170. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  171. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  172. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  173. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  174. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  175. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/table.py +0 -0
  176. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  177. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/progress_events.py +0 -0
  178. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  179. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  180. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  181. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/containers.py +0 -0
  182. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  183. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  184. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  185. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  186. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  187. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  188. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  189. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  190. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  191. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  192. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  193. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  194. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  195. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  196. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  197. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  198. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  199. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  200. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  201. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  202. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  203. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  204. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  205. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  206. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  207. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  208. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  209. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  210. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  211. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/registry.py +0 -0
  212. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  213. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  214. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  215. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  216. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  217. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  218. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  219. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  220. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  221. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  222. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  223. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  224. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  225. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  226. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  227. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  228. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  229. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  230. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  231. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  232. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  233. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  234. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  235. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  236. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  237. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  238. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  239. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  240. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  241. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  242. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  243. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  244. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  245. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  246. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  247. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  248. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  249. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  250. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  251. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  252. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
  253. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  254. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  255. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  256. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  257. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  258. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  259. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
  260. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
  261. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  262. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  263. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  264. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  265. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  266. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
  267. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
  268. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  269. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  270. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
  271. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
  272. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
  273. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
  274. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
  275. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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
  276. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
  277. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
  278. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
  279. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
  280. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
  281. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
  282. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  283. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  284. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  285. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  286. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  287. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  288. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
  289. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
  290. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
  291. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
  292. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  293. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
  294. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  295. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
  296. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  297. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  298. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  299. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  300. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  301. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  302. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  303. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  304. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  305. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  306. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  307. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  308. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  309. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  310. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  311. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
  312. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
  313. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  314. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  315. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  316. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  317. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  318. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  319. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  320. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  321. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  322. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  323. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples.py +0 -0
  324. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  325. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  326. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  327. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  328. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  329. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  330. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  331. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  332. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  333. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  334. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  335. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  336. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  337. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  338. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  339. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  340. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  341. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  342. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  343. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  344. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  345. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  346. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  347. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  348. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  349. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/vector.py +0 -0
  350. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  351. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  352. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  353. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/recipe.py +0 -0
  354. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  355. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  356. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  357. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  358. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/errors.py +0 -0
  359. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/review.py +0 -0
  360. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/rowset.py +0 -0
  361. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/run_execution_v4.py +0 -0
  362. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/serving.py +0 -0
  363. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/serving_edge.py +0 -0
  364. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/serving_http.py +0 -0
  365. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/session_probes.py +0 -0
  366. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/signing.py +0 -0
  367. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/skill_assets.py +0 -0
  368. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/source_discovery.py +0 -0
  369. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  370. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  371. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  372. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  373. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  374. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  375. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  376. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  377. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  378. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  379. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  380. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  381. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  382. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  383. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  384. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  385. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  386. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
  387. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  388. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  389. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  390. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  391. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  392. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  393. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  394. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  395. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  396. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  397. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  398. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  399. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  400. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  401. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  402. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  403. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  404. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  405. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  406. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  407. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  408. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  409. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  410. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  411. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
  412. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  413. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  414. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  415. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  416. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/collections.py +0 -0
  417. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  418. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  419. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  420. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  421. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  422. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/governance.py +0 -0
  423. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  424. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/integration.py +0 -0
  425. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  426. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/registry.py +0 -0
  427. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  428. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  429. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/sports.py +0 -0
  430. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream.py +0 -0
  431. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  432. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  433. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  434. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  435. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  436. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  437. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  438. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  439. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  440. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  441. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  442. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  443. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  444. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  445. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  446. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  447. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  448. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  449. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  450. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  451. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  452. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  453. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  454. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  455. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  456. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/stream_venue.py +0 -0
  457. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
  458. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  459. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  460. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  461. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  462. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/commands.py +0 -0
  463. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/download.py +0 -0
  464. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  465. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/parity.py +0 -0
  466. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/probe.py +0 -0
  467. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/propose.py +0 -0
  468. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/recipe.py +0 -0
  469. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/research.py +0 -0
  470. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/runs.py +0 -0
  471. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/session.py +0 -0
  472. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/stream.py +0 -0
  473. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/transport.py +0 -0
  474. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
  475. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  476. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  477. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  478. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
  479. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/workers.py +0 -0
  480. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  481. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  482. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/unit_flow.py +0 -0
  483. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/units.py +0 -0
  484. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  485. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/approve.py +0 -0
  486. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  487. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  488. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  489. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  490. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  491. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  492. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  493. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  494. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  495. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  496. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  497. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  498. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  499. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  500. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  501. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  502. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  503. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
  504. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  505. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  506. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  507. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  508. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  509. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  510. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  511. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  512. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  513. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  514. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  515. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  516. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  517. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  518. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  519. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  520. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/headline.py +0 -0
  521. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  522. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
  523. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  524. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  525. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/login.py +0 -0
  526. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  527. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/peek.py +0 -0
  528. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  529. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  530. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  531. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/readers.py +0 -0
  532. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/workload.py +0 -0
  533. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  534. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  535. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  536. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_recipe.py +0 -0
  537. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_required_controls.py +0 -0
  538. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  539. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_transform.py +0 -0
  540. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/viewer.py +0 -0
  541. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  542. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  543. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  544. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  545. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  546. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  547. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  548. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  549. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  550. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
  551. {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/watch.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.10.1
3
+ Version: 0.10.2
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.10.1"
3
+ version = "0.10.2"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -92,7 +92,7 @@ here, then the ones that do not, grouped by why.
92
92
 
93
93
  ## Commands
94
94
 
95
- These twenty-one are the whole surface a hosted install runs. Every other name in
95
+ These twenty-two are the whole surface a hosted install runs. Every other name in
96
96
  [Hosted parity](../../docs/HOSTED-PARITY.md) refuses here.
97
97
 
98
98
  | Command | What it does |
@@ -102,9 +102,10 @@ These twenty-one are the whole surface a hosted install runs. Every other name i
102
102
  | `mr-data whoami` | Use the compatibility alias for the remotely validated `auth status` answer. |
103
103
  | `mr-data probe` | Ask one registered source one question and print the answer. **Currently unusable:** it reaches `/v3/sessions`, which Studio refuses, and it takes a question identifier that no v4 receipt returns. Do not plan a source inspection around it. |
104
104
  | `mr-data recipe` | Register one recipe document — dataset, question, table plan, sources, transform, checks and units — in one call, and print the identifiers the server derived. `mr-data recipe show ID` reads one back. |
105
- | `mr-data run` | Start one run against a registered recipe: `--sample`, `--full`, `--refresh` or `--backfill`, under `--max-rows`, `--max-source-bytes` and `--window`. A large run is held for a spend confirmation, which `--confirm` settles; `--cancel RUN` stops one. |
106
- | `mr-data status` | Report which of the six states one run is in, what it delivered and whether a ceiling cut it short, and — on a failure — what failed and where. Exits non-zero on a failed run. |
107
- | `mr-data runs` | Report this workspace's own runs: identifier, mode, state and creation time, plus the failure triple of any that failed. `--status` and `--mode` narrow it and are refused for a word outside the six or the four; `--limit` says how many, and pages are followed to reach it. |
105
+ | `mr-data cover` | Generate and attach one branded 1200×630 dataset cover. Give it the dataset ID and what the image should depict; Studio fixes the model, single-color style, curated random palette, dimensions and storage. |
106
+ | `mr-data run` | Start one run against a registered recipe: `--sample`, `--full`, `--refresh` or `--backfill`, under `--max-rows`, `--max-source-bytes` and `--window`. A large run is held for a spend confirmation, which `--confirm` settles; a sample-first held full requires Studio's interactive human approval instead. `--cancel RUN` stops one. |
107
+ | `mr-data status` | Report which of the seven states one run is in, what it delivered and whether a ceiling cut it short, and — on a failure — what failed and where. Exits non-zero on a failed run. |
108
+ | `mr-data runs` | Report this workspace's own runs: identifier, mode, state and creation time, plus the failure triple of any that failed. `--status` and `--mode` narrow it and are refused for a word outside the seven or the four; `--limit` says how many, and pages are followed to reach it. |
108
109
  | `mr-data watch` | Stream one run's live progress under the durable event type of each stage, resuming across stream cuts. Exits non-zero when the run failed. |
109
110
  | `mr-data query` | Run one bounded read-only SQL statement over a finished run's own table and print the rows. Bounded on rows, on answer bytes and on time, and refused by name when a bound is crossed. |
110
111
  | `mr-data peek` | Print the columns, types and first rows of one run's table. |
@@ -119,11 +120,10 @@ These twenty-one are the whole surface a hosted install runs. Every other name i
119
120
  | `mr-data unpin` | Resume tracking the latest passing version. |
120
121
  | `mr-data demote` | Detach the schedule and withdraw the live pointer. |
121
122
 
122
- `auth`, `login` and `whoami` are the same implementation in both profiles. The other eighteen
123
- answer from Studio, and ten of them only read: `status`, `runs`, `watch`, `peek`, `receipt`,
124
- `checks`, `download`, `diff`, and — after the state they report — `unpin` and `demote` do not.
125
- Eight of the eighteen change something: `recipe`, `run`, `query`, `probe`, `keys`, `promote`,
126
- `pin`, `unpin` and `demote`.
123
+ `auth`, `login` and `whoami` are the same implementation in both profiles. The other nineteen
124
+ answer from Studio. Eight only read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`,
125
+ `download` and `diff`. Eleven start or change something: `recipe`, `cover`, `run`, `query`,
126
+ `probe`, `keys`, `open`, `promote`, `pin`, `unpin` and `demote`.
127
127
 
128
128
  **Any successful run is readable straight away.** There is no approval, no admission and no release
129
129
  step between a run finishing and reading it: `download`, `receipt`, `checks`, `peek` and `query`
@@ -528,12 +528,15 @@ proved, and a run that emitted none produces the same build as a run that emitte
528
528
  Never turn a progress count into a percentage, never infer activity from elapsed time, and never
529
529
  cite a progress event where a receipt is what is being asked for.
530
530
 
531
- **Six states, one machine.** A run is `queued`, `running`, `awaiting_confirmation`, `succeeded`,
532
- `failed` or `cancelled`. Three of them are terminal and end a watch: `succeeded`, `failed` and
533
- `cancelled`. `awaiting_confirmation` is the spend gate and the one state that is waiting on a
534
- person: nothing has been executed, and `mr-data run --confirm RUN` releases it. Keep the raw state
535
- internal. Say what product decision is needed and give the person the single action that lets the
536
- build continue.
531
+ **Seven states, one machine.** A run is `queued`, `running`, `awaiting_confirmation`,
532
+ `awaiting_sample_approval`, `succeeded`, `failed` or `cancelled`. Three of them are terminal and
533
+ end a watch: `succeeded`, `failed` and `cancelled`. `awaiting_confirmation` is the ordinary spend
534
+ gate: nothing has been executed, and `mr-data run --confirm RUN` releases it.
535
+ `awaiting_sample_approval` is different: a bounded sample must seal a downloadable
536
+ `table_parquet`, then a person completes Studio's fresh operation-bound interactive approval before
537
+ the linked full run dispatches. Do not present `--confirm` as an alternative for that state. Keep
538
+ the raw state internal. Say what product decision is needed and give the person the single action
539
+ that lets the build continue.
537
540
 
538
541
  **A failed run always carries the same three members** — `failure_code`, `failure_detail` and
539
542
  `failed_stage` — and carries them on three surfaces: the run record, the terminal event on the
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import base64
6
6
  import contextlib
7
+ import errno
7
8
  import fcntl
8
9
  import ipaddress
9
10
  import json
@@ -74,7 +75,6 @@ from mostlyright.data_harness.formats import (
74
75
  )
75
76
  from mostlyright.data_harness.linux_process_boundary import (
76
77
  _close_landlock_runtime_roots,
77
- _disable_process_dumpability,
78
78
  _install_landlock_filesystem_confinement,
79
79
  _install_landlock_filesystem_confinement_from_coordinates,
80
80
  _install_networkless_seccomp,
@@ -566,38 +566,18 @@ class CrawlerSandbox:
566
566
  if external_network_policy_attestation is not None:
567
567
  _require_digest(external_network_policy_attestation, "external network policy")
568
568
  self._external_network_policy_attestation = external_network_policy_attestation
569
- if memory_cgroup_root_fd is not None and hosted_session_container_memory_bytes is not None:
569
+ if child_address_space_bytes is None:
570
+ child_address_space_bytes = READER_WORKER_MEMORY_BYTES
571
+ if (
572
+ type(child_address_space_bytes) is not int
573
+ or not MIN_CHILD_ADDRESS_SPACE_BYTES
574
+ <= child_address_space_bytes
575
+ <= MAX_CHILD_ADDRESS_SPACE_BYTES
576
+ ):
570
577
  raise AcquisitionSecurityError(
571
578
  "SANDBOX_MEMORY_BOUNDARY",
572
- "delegated and hosted-session memory boundaries are mutually exclusive",
579
+ "the child address-space ceiling is outside the reviewed range",
573
580
  )
574
- if memory_cgroup_root_fd is not None:
575
- _require_bounded_cgroup_root(memory_cgroup_root_fd)
576
- if hosted_session_container_memory_bytes is not None:
577
- try:
578
- _disable_process_dumpability()
579
- except OSError as error:
580
- raise AcquisitionSecurityError(
581
- "SANDBOX_OS_BOUNDARY",
582
- "hosted-session coordinator process hardening is unavailable",
583
- ) from error
584
- _require_hosted_session_container_boundary(hosted_session_container_memory_bytes)
585
- if child_address_space_bytes is not None:
586
- if memory_cgroup_root_fd is not None:
587
- raise AcquisitionSecurityError(
588
- "SANDBOX_MEMORY_BOUNDARY",
589
- "delegated and address-space memory boundaries are mutually exclusive",
590
- )
591
- if (
592
- type(child_address_space_bytes) is not int
593
- or not MIN_CHILD_ADDRESS_SPACE_BYTES
594
- <= child_address_space_bytes
595
- <= MAX_CHILD_ADDRESS_SPACE_BYTES
596
- ):
597
- raise AcquisitionSecurityError(
598
- "SANDBOX_MEMORY_BOUNDARY",
599
- "the child address-space ceiling is outside the reviewed range",
600
- )
601
581
  self._memory_cgroup_root_fd = memory_cgroup_root_fd
602
582
  self._hosted_session_container_memory_bytes = hosted_session_container_memory_bytes
603
583
  self._child_address_space_bytes = child_address_space_bytes
@@ -1163,18 +1143,6 @@ class CrawlerSandbox:
1163
1143
  # ceiling says a decode cannot take the coordinator down with it. Until an address-space
1164
1144
  # bound existed there was no way to state the second without a delegated cgroup, which is
1165
1145
  # why this arm could not be written before.
1166
- if (
1167
- self._external_network_policy_attestation is None
1168
- and self._hosted_session_container_memory_bytes is None
1169
- and self._child_address_space_bytes is None
1170
- ):
1171
- raise AcquisitionSecurityError(
1172
- "SANDBOX_OS_BOUNDARY",
1173
- (
1174
- "crawler execution requires an explicit externally enforced "
1175
- "deny-default network policy attestation"
1176
- ),
1177
- )
1178
1146
  return _WorkerLaunch(
1179
1147
  command=tuple(command),
1180
1148
  cwd=self._staging_root,
@@ -1185,18 +1153,20 @@ class CrawlerSandbox:
1185
1153
  def _operation_refusal(self, operation: str) -> AcquisitionSecurityError | None:
1186
1154
  """The refusals that depend on WHICH operation this confinement is asked for.
1187
1155
 
1188
- Both stand on the same fact and neither is a policy preference: an operation that runs a
1189
- certified Reader needs a per-child memory ceiling, and there are two confinements that
1190
- cannot give it one. Under the hosted-session container boundary ``_prepare_worker`` builds
1191
- no cgroup job at all, so the only ceiling is the container the coordinator itself lives in
1192
- and a decoder that overran it would take the coordinator and the run's own reporting with
1193
- it. Off Linux there is no cgroup to build a job from in the first place.
1156
+ Linux is the sole clean-room implementation. It is where a child gets both its
1157
+ ``RLIMIT_AS`` ceiling and seccomp boundary; every other launcher would be an ordinary
1158
+ subprocess, regardless of whether a caller supplied an egress attestation.
1194
1159
 
1195
1160
  Returned rather than raised so the same decision can be REPORTED without being taken --
1196
1161
  see :meth:`confinement_refusal`. A caller that has to know whether a decode is admissible
1197
1162
  before it spends a fetch cannot find out by attempting one.
1198
1163
  """
1199
1164
 
1165
+ if sys.platform != "linux":
1166
+ return AcquisitionSecurityError(
1167
+ "SANDBOX_OS_BOUNDARY",
1168
+ "clean-room execution requires the Linux RLIMIT_AS and seccomp boundaries",
1169
+ )
1200
1170
  # THE ADDRESS-SPACE CEILING ADMITS A DECODE; THE HOSTED-SESSION CONTAINER DOES NOT, and
1201
1171
  # the difference is which process dies. Under the container bound the child has no ceiling
1202
1172
  # of its own, so a runaway decode takes the coordinator with it and the run reports
@@ -1205,24 +1175,11 @@ class CrawlerSandbox:
1205
1175
  # reason a per-child bound is required for a Reader and a container limit is not enough.
1206
1176
  if (
1207
1177
  self._hosted_session_container_memory_bytes is not None
1208
- and self._child_address_space_bytes is None
1209
- and operation not in HOSTED_SESSION_CONTAINER_OPERATIONS
1178
+ and operation in NETWORK_PERFORMING_OPERATIONS
1210
1179
  ):
1211
1180
  return AcquisitionSecurityError(
1212
1181
  "SANDBOX_OS_BOUNDARY",
1213
- "the hosted-session container gives a child no memory ceiling of its own, so this "
1214
- "confinement admits no-network parsing and nothing else",
1215
- )
1216
- # Was darwin-only, and is now every host that is not Linux. The refusal never really
1217
- # was about macOS: it was about there being no cgroup to bound a Reader's memory with,
1218
- # which is true of every host without cgroups v2. Seatbelt used to make macOS the one
1219
- # non-Linux host that got this far with a boundary of its own; with it gone (ADR 0021
1220
- # ADR 0021) there is no reason to keep naming one platform. The typed code is unchanged,
1221
- # because ``SANDBOX_MEMORY_BOUNDARY`` is what callers and receipts already read.
1222
- if operation in READER_PERFORMING_OPERATIONS and sys.platform != "linux":
1223
- return AcquisitionSecurityError(
1224
- "SANDBOX_MEMORY_BOUNDARY",
1225
- "Clean room Reader execution has no enforceable memory boundary off Linux",
1182
+ "the hosted-session clean room is networkless and cannot perform retrieval",
1226
1183
  )
1227
1184
  return None
1228
1185
 
@@ -1241,16 +1198,6 @@ class CrawlerSandbox:
1241
1198
  def _memory_boundary_refusal(self) -> AcquisitionSecurityError | None:
1242
1199
  """Whether this confinement can bound a child's memory at all, for any operation."""
1243
1200
 
1244
- if (
1245
- sys.platform == "linux"
1246
- and self._memory_cgroup_root_fd is None
1247
- and self._hosted_session_container_memory_bytes is None
1248
- and self._child_address_space_bytes is None
1249
- ):
1250
- return AcquisitionSecurityError(
1251
- "SANDBOX_MEMORY_BOUNDARY",
1252
- "Linux Clean room execution requires a trusted bounded cgroup root",
1253
- )
1254
1201
  return None
1255
1202
 
1256
1203
  def confinement_refusal(self, operation: str) -> AcquisitionSecurityError | None:
@@ -1350,7 +1297,10 @@ class CrawlerSandbox:
1350
1297
  prepared,
1351
1298
  request_bytes=request_bytes,
1352
1299
  timeout_seconds=self._timeout_seconds,
1353
- terminate_process_group=(self._hosted_session_container_memory_bytes is not None),
1300
+ terminate_process_group=(
1301
+ self._hosted_session_container_memory_bytes is not None
1302
+ or self._child_is_networkless()
1303
+ ),
1354
1304
  )
1355
1305
  if returncode != 0:
1356
1306
  refusal = _bounded_worker_error(stderr, returncode=returncode)
@@ -1488,6 +1438,27 @@ def worker_main(*, prewarm: bool = False) -> int:
1488
1438
  except (AcquisitionSecurityError, ValueError, TypeError) as exc:
1489
1439
  code = getattr(exc, "code", "SANDBOX_REQUEST")
1490
1440
  return _worker_error(code, str(exc))
1441
+ # ``RLIMIT_AS`` is the production per-child memory boundary on Cloud Run: the
1442
+ # platform supplies no writable cgroup subtree for a batch parser. An
1443
+ # allocation refused by that boundary is an expected, safely actionable
1444
+ # terminal condition, not an unmapped implementation defect. Preserve no
1445
+ # exception text -- allocation errors can arise deep in a native decoder --
1446
+ # but give Studio the stable code it needs to report the failure truthfully.
1447
+ except MemoryError:
1448
+ return _worker_error(
1449
+ "SANDBOX_MEMORY_LIMIT",
1450
+ "the worker address-space limit refused an allocation",
1451
+ )
1452
+ except OSError as exc:
1453
+ if exc.errno == errno.ENOMEM:
1454
+ return _worker_error(
1455
+ "SANDBOX_MEMORY_LIMIT",
1456
+ "the worker address-space limit refused an allocation",
1457
+ )
1458
+ return _worker_error(
1459
+ "SANDBOX_UNEXPECTED",
1460
+ f"the worker raised {type(exc).__name__}, which no refusal maps",
1461
+ )
1491
1462
  except Exception as exc:
1492
1463
  return _worker_error(
1493
1464
  "SANDBOX_UNEXPECTED",
@@ -3469,7 +3440,15 @@ def _probe_network_denials(
3469
3440
  results: list[tuple[str, int]] = []
3470
3441
  for label, ip, port in targets:
3471
3442
  family = socket.AF_INET6 if ":" in ip else socket.AF_INET
3472
- probe = socket.socket(family, socket.SOCK_STREAM)
3443
+ # A networkless seccomp profile may reject the socket syscall itself rather than letting
3444
+ # it create a descriptor and rejecting connect(2). Both outcomes prove the same boundary;
3445
+ # socket construction therefore belongs in the typed denial path too. Leaving it outside
3446
+ # the try turned one valid kernel posture into SANDBOX_UNEXPECTED.
3447
+ try:
3448
+ probe = socket.socket(family, socket.SOCK_STREAM)
3449
+ except OSError as exc:
3450
+ results.append((label, exc.errno or 1))
3451
+ continue
3473
3452
  try:
3474
3453
  probe.settimeout(0.25)
3475
3454
  error = probe.connect_ex((ip, port))
@@ -3890,8 +3869,8 @@ def _drain_worker_ipc(
3890
3869
  "The Clean room process returned more data than this job allows",
3891
3870
  )
3892
3871
 
3893
- # Hosted-session children may fork bounded parser helpers, but no helper may outlive the
3894
- # one request. Signal the still-owned process group before reaping its leader: this covers
3872
+ # Networkless children may fork bounded parser helpers, but no helper may outlive the one
3873
+ # request. Signal the still-owned process group before reaping its leader: this covers
3895
3874
  # the success path, catches descendants that deliberately closed all inherited pipes, and
3896
3875
  # avoids signalling a numeric group id after the leader pid could have been reused.
3897
3876
  if terminate_process_group:
@@ -4920,10 +4899,10 @@ def _prepare_worker(
4920
4899
  raise error
4921
4900
  if isinstance(error, AcquisitionSecurityError):
4922
4901
  raise
4923
- if hosted_session_container_memory_bytes is not None:
4902
+ if hosted_session_container_memory_bytes is not None or networkless_child:
4924
4903
  raise AcquisitionSecurityError(
4925
4904
  "SANDBOX_OS_BOUNDARY",
4926
- "hosted-session networkless process boundary could not be established before exec",
4905
+ "networkless process boundary could not be established before exec",
4927
4906
  ) from error
4928
4907
  raise AcquisitionSecurityError(
4929
4908
  "SANDBOX_MEMORY_BOUNDARY",
@@ -5190,7 +5169,9 @@ def _run_worker_command(
5190
5169
  prepared,
5191
5170
  request_bytes=request_bytes,
5192
5171
  timeout_seconds=timeout_seconds,
5193
- terminate_process_group=hosted_session_container_memory_bytes is not None,
5172
+ terminate_process_group=(
5173
+ hosted_session_container_memory_bytes is not None or networkless_child
5174
+ ),
5194
5175
  )
5195
5176
 
5196
5177
 
@@ -2029,6 +2029,10 @@ def _parser(
2029
2029
 
2030
2030
  _recipe.declare_arguments(_add("recipe", help=_recipe.COMMAND_HELP))
2031
2031
 
2032
+ from mostlyright.data_harness.thin import v4_dataset_covers as _v4_dataset_covers
2033
+
2034
+ _v4_dataset_covers.declare_arguments(_add("cover", help=_v4_dataset_covers.COMMAND_HELP))
2035
+
2032
2036
  # The commands that read a run back once it has finished, declared the same way and for the
2033
2037
  # same reason: one declaration, two front doors, no argument that can differ between them.
2034
2038
  from mostlyright.data_harness.thin import v4_artifacts as _v4_artifacts
@@ -46,6 +46,7 @@ __all__ = [
46
46
  "SNAPSHOT_SUFFIXES",
47
47
  "SNAPSHOT_SUFFIX_PATTERN",
48
48
  "WEAK_TEXT_MEDIA_TYPES",
49
+ "resolve_direct_data_format",
49
50
  ]
50
51
 
51
52
  # The label of the Reader contract a recipe pins itself to. A Reader family is the code
@@ -153,32 +154,17 @@ DIRECT_FETCH_MEDIA_TYPES: Mapping[str, frozenset[str]] = MappingProxyType(
153
154
  }
154
155
  )
155
156
 
156
- # Which wire formats a FETCHED media type may be read back into, and why the set is this narrow.
157
- #
158
- # A registered acquisition document can say where bytes are without saying how they are encoded,
159
- # and every acquisition here requires an encoding. The honest answer is to read it back out of
160
- # what the response actually carried, through the inverse of the map above. That inverse is only
161
- # a function over the set below.
162
- #
163
- # ``text/plain`` is accepted for every text-shaped format, so an inverse taken over ``csv``,
164
- # ``json`` and ``ndjson`` at once would have to answer one weak label with three formats and pick
165
- # between them -- which is a guess wearing a table's clothes. Narrowing the domain is what makes
166
- # the inverse total and unambiguous instead of merely plausible.
167
- #
168
- # One member today, and that is three independent constraints rather than a preference: a
169
- # transform plan admits exactly one input encoding, the only bridge from any other encoding into
170
- # it is a Reader family, and the in-process acquisition path refuses a Reader-pinned source
171
- # outright. A second member becomes admissible only when all three of those move, and the
172
- # derivation below REFUSES rather than choosing if one is added while a label stays shared.
173
- INFERRED_DATA_FORMATS: frozenset[str] = frozenset({"csv"})
157
+ # Formats that direct, unpinned fetches can resolve after receiving their response. This is
158
+ # deliberately a literal closed set: adding a parser format is not enough to make it a native
159
+ # direct format; its fetch resolution and DuckDB dispatch must move with it.
160
+ INFERRED_DATA_FORMATS: frozenset[str] = frozenset({"csv", "json", "ndjson", "parquet"})
174
161
 
175
162
 
176
163
  def _inverted_media_types(data_formats: frozenset[str]) -> dict[str, str]:
177
- """Invert ``DIRECT_FETCH_MEDIA_TYPES`` over ``data_formats``, refusing a shared label.
164
+ """Invert the strong media-type table over ``data_formats``, refusing a shared label.
178
165
 
179
- DERIVED rather than re-typed, so a widening on one side cannot leave the other behind: a media
180
- type added to a format's accepted set becomes readable-back the same moment it becomes
181
- fetchable, and the two directions cannot come to disagree about one label.
166
+ ``text/plain`` is a weak label shared by text formats. It therefore cannot appear in this
167
+ table: it is resolved only from a bounded content prefix after fetch.
182
168
 
183
169
  Taking the set as an argument rather than reading the constant is what lets the shared-label
184
170
  refusal be exercised: it is unreachable while the domain has one member, and a guard nothing
@@ -187,7 +173,7 @@ def _inverted_media_types(data_formats: frozenset[str]) -> dict[str, str]:
187
173
 
188
174
  inverse: dict[str, str] = {}
189
175
  for data_format in sorted(data_formats):
190
- accepted = DIRECT_FETCH_MEDIA_TYPES.get(data_format)
176
+ accepted = FORMAT_MEDIA_TYPES.get(data_format)
191
177
  if accepted is None:
192
178
  raise ValueError(
193
179
  f"{data_format} has no accepted media types, so nothing can be read back into it"
@@ -212,6 +198,35 @@ MEDIA_TYPE_DATA_FORMATS: Mapping[str, str] = MappingProxyType(
212
198
  _inverted_media_types(INFERRED_DATA_FORMATS)
213
199
  )
214
200
 
201
+
202
+ def resolve_direct_data_format(media_type: str, content: bytes) -> str | None:
203
+ """Resolve an unpinned direct response without guessing from an ambiguous weak label."""
204
+
205
+ normalized = str(media_type).split(";", 1)[0].strip().lower()
206
+ for data_format, accepted in FORMAT_MEDIA_TYPES.items():
207
+ if normalized in accepted:
208
+ return data_format
209
+ if normalized not in WEAK_TEXT_MEDIA_TYPES:
210
+ return None
211
+
212
+ sample = content[: 64 * 1024].lstrip()
213
+ if sample.startswith(b"["):
214
+ return "json"
215
+ if sample.startswith(b"{"):
216
+ return "ndjson"
217
+ try:
218
+ lines = sample.decode("utf-8").splitlines()
219
+ except UnicodeDecodeError:
220
+ return None
221
+ nonempty = [line for line in lines if line.strip()]
222
+ if len(nonempty) < 2:
223
+ return None
224
+ header, first_row = nonempty[:2]
225
+ if header.count(",") > 0 and header.count(",") == first_row.count(","):
226
+ return "csv"
227
+ return None
228
+
229
+
215
230
  # Filename suffixes accepted for each wire format. A format may carry more than one.
216
231
  FORMAT_SUFFIXES: Mapping[str, frozenset[str]] = MappingProxyType(
217
232
  {
@@ -850,6 +850,24 @@ def _validate_v4_bootstrap_response(value: dict[str, Any]) -> tuple[dict[str, by
850
850
  if len(capability_raw) > MAX_CAPABILITY_BYTES:
851
851
  raise HostedWorkerError("BOOTSTRAP_TOO_LARGE", "capability exceeds its byte limit")
852
852
  parse_capability(capability_raw)
853
+ attempt_id = value["attempt_id"]
854
+ if not isinstance(attempt_id, str):
855
+ raise HostedWorkerError(
856
+ "BOOTSTRAP_RESPONSE_INVALID",
857
+ "v4 bootstrap attempt_id must be a canonical UUID",
858
+ )
859
+ try:
860
+ parsed_attempt_id = UUID(attempt_id)
861
+ except ValueError as error:
862
+ raise HostedWorkerError(
863
+ "BOOTSTRAP_RESPONSE_INVALID",
864
+ "v4 bootstrap attempt_id must be a canonical UUID",
865
+ ) from error
866
+ if str(parsed_attempt_id) != attempt_id:
867
+ raise HostedWorkerError(
868
+ "BOOTSTRAP_RESPONSE_INVALID",
869
+ "v4 bootstrap attempt_id must be a canonical UUID",
870
+ )
853
871
  job_raw = canonical_json_bytes(dict(job_wire))
854
872
  if len(job_raw) > MAX_DESCRIPTOR_BYTES:
855
873
  raise HostedWorkerError("BOOTSTRAP_TOO_LARGE", "worker job exceeds its byte limit")
@@ -866,7 +884,11 @@ def _validate_v4_bootstrap_response(value: dict[str, Any]) -> tuple[dict[str, by
866
884
  "BOOTSTRAP_RESPONSE_INVALID",
867
885
  "v4 job carries no canonical workspace id",
868
886
  )
869
- return {"job": job_raw, "capability": capability_raw}, _V4AdmissionJob(workspace_id)
887
+ return {
888
+ "job": job_raw,
889
+ "capability": capability_raw,
890
+ "attempt_id": attempt_id.encode("ascii"),
891
+ }, _V4AdmissionJob(workspace_id)
870
892
 
871
893
 
872
894
  def _anonymous_payload(raw: bytes, label: str) -> _AnonymousPayload:
@@ -988,6 +1010,8 @@ def _worker_argv(
988
1010
  "--capability-fd",
989
1011
  str(payloads["capability"].descriptor),
990
1012
  ]
1013
+ if "attempt_id" in payloads:
1014
+ arguments.extend(("--attempt-id-fd", str(payloads["attempt_id"].descriptor)))
991
1015
  return arguments
992
1016
 
993
1017
 
@@ -1357,7 +1381,18 @@ def main(argv: Sequence[str] | None = None) -> int:
1357
1381
  )
1358
1382
  )
1359
1383
  except HostedWorkerError as error:
1360
- print(f"{error.code}: {error.detail}", file=sys.stderr)
1384
+ sys.stderr.buffer.write(
1385
+ canonical_json_bytes(
1386
+ {
1387
+ "status": "failed",
1388
+ "code": error.code,
1389
+ "detail": error.detail,
1390
+ "stage": "bootstrap",
1391
+ }
1392
+ )
1393
+ + b"\n"
1394
+ )
1395
+ sys.stderr.flush()
1361
1396
  return 1
1362
1397
  return 0
1363
1398
 
@@ -34,7 +34,12 @@ from mostlyright.data_harness.canonical import (
34
34
  parse_canonical_json,
35
35
  sha256_bytes,
36
36
  )
37
- from mostlyright.data_harness.formats import DATA_FORMATS
37
+ from mostlyright.data_harness.formats import (
38
+ DATA_FORMATS,
39
+ DIRECT_FETCH_MEDIA_TYPES,
40
+ FORMAT_SUFFIXES,
41
+ resolve_direct_data_format,
42
+ )
38
43
  from mostlyright.data_harness.hosted_crawler_protocol import (
39
44
  CRAWLER_REQUEST_SCHEMA_V3,
40
45
  CRAWLER_RESULT_SCHEMA_V1,
@@ -480,7 +485,7 @@ def _public_https_query(value: Any) -> dict[str, Any]:
480
485
  _canonical_url_host(url)
481
486
  data_format = value["data_format"]
482
487
  filename = value["filename"]
483
- if data_format not in DATA_FORMATS:
488
+ if data_format not in DATA_FORMATS | {"auto"}:
484
489
  raise HostedCrawlerError("CRAWLER_QUERY_INVALID", "public HTTPS format is unsupported")
485
490
  if (
486
491
  not isinstance(filename, str)
@@ -519,6 +524,10 @@ def _public_https_query(value: Any) -> dict[str, Any]:
519
524
  "CRAWLER_QUERY_INVALID", "public HTTPS max_nesting_depth must be exactly 1"
520
525
  )
521
526
  if reader is not None:
527
+ if data_format == "auto":
528
+ raise HostedCrawlerError(
529
+ "CRAWLER_QUERY_INVALID", "a Reader pin must declare its output format"
530
+ )
522
531
  if not isinstance(reader, dict) or set(reader) != {
523
532
  "family_id",
524
533
  "family_version",
@@ -560,13 +569,25 @@ def _public_expected_media_types(query: dict[str, Any]) -> tuple[str, ...]:
560
569
  # admitted set from the pinned family, and a fetch with no pin has no recipe to
561
570
  # protect, so the weak text label a public agency serves for CSV or JSON is
562
571
  # admitted here or nowhere.
563
- from mostlyright.data_harness.formats import DIRECT_FETCH_MEDIA_TYPES
564
-
572
+ if query["data_format"] == "auto":
573
+ return tuple(sorted(set().union(*DIRECT_FETCH_MEDIA_TYPES.values())))
565
574
  return tuple(sorted(DIRECT_FETCH_MEDIA_TYPES[query["data_format"]]))
566
575
  family = TOOLBOX.resolve(reader["family_id"], reader["family_version"])
567
576
  return family.accepted_media_types
568
577
 
569
578
 
579
+ def _resolve_direct_public_format(media_type: str, content: bytes) -> str | None:
580
+ return resolve_direct_data_format(media_type, content)
581
+
582
+
583
+ def _normalized_filename(filename: str, data_format: str) -> str:
584
+ suffixes = FORMAT_SUFFIXES[data_format]
585
+ if filename.endswith(tuple(suffixes)):
586
+ return filename
587
+ stem = filename.rsplit(".", 1)[0] if "." in filename else filename
588
+ return f"{stem}{sorted(suffixes)[0]}"
589
+
590
+
570
591
  def _normalize_public_https_response(
571
592
  request: HostedCrawlerRequest,
572
593
  *,
@@ -593,9 +614,14 @@ def _normalize_public_https_response(
593
614
  reader = query["reader_pin"]
594
615
  if reader is None:
595
616
  normalized = raw
596
- normalized_format = query["data_format"]
617
+ normalized_format = _resolve_direct_public_format(media_type, raw)
618
+ if normalized_format is None:
619
+ raise HostedCrawlerError(
620
+ "CRAWLER_FORMAT_UNRESOLVED",
621
+ "public HTTPS response did not provide a deterministic tabular format",
622
+ )
597
623
  normalized_media_type = media_type
598
- normalized_filename = query["filename"]
624
+ normalized_filename = _normalized_filename(query["filename"], normalized_format)
599
625
  family_id = family_version = options_digest = None
600
626
  decode_flags: list[str] = []
601
627
  reader_budgets = None
@@ -1037,12 +1037,20 @@ def _validate_public_https_result(
1037
1037
  query = request.query
1038
1038
  reader = query.get("reader_pin")
1039
1039
  if reader is None:
1040
+ from mostlyright.data_harness.hosted_crawler import (
1041
+ _normalized_filename,
1042
+ _resolve_direct_public_format,
1043
+ )
1044
+
1040
1045
  reader_identity = (None, None, None)
1041
1046
  expected_resource_caps = None
1042
1047
  expected_reader_budgets = None
1048
+ resolved_format = _resolve_direct_public_format(retrieved.media_type, retrieved.content)
1049
+ if resolved_format is None:
1050
+ _fail("CRAWLER_CHILD_INVALID", "public HTTPS format could not be resolved")
1043
1051
  direct_identity = (
1044
- query.get("data_format"),
1045
- query.get("filename"),
1052
+ resolved_format,
1053
+ _normalized_filename(query.get("filename", ""), resolved_format),
1046
1054
  retrieved.media_type,
1047
1055
  )
1048
1056
  else:
@@ -322,7 +322,7 @@ def ingestion_job_main(argv: Sequence[str] | None = None) -> int:
322
322
  try:
323
323
  dispatch = parse_ingestion_dispatch(arguments)
324
324
  except HostedIngestionJobError as error:
325
- sys.stderr.write(f"{error.code}: {error.detail}\n")
325
+ _write_terminal_failure(error)
326
326
  return 2
327
327
  try:
328
328
  config = IngestionJobConfig.from_environment()
@@ -331,15 +331,34 @@ def ingestion_job_main(argv: Sequence[str] | None = None) -> int:
331
331
  except HostedIngestionJobError as error:
332
332
  if error.code in CONSUMED_INGESTION_DISPATCH_CODES:
333
333
  return 0
334
- sys.stderr.write(f"{error.code}: {error.detail}\n")
334
+ _write_terminal_failure(error)
335
335
  return 1
336
336
  # The deliberately closed dispatch contract has no source URL, generic callback endpoint or
337
337
  # credential. A later reviewed connector/callback slice must call run_hosted_ingestion_delivery
338
338
  # instead of making this entrypoint silently invent one of those authorities.
339
- sys.stderr.write("INGESTION_DELIVERY_PROCESSOR_UNWIRED: no reviewed connector is installed\n")
339
+ _write_terminal_failure(
340
+ HostedIngestionJobError(
341
+ "INGESTION_DELIVERY_PROCESSOR_UNWIRED", "no reviewed connector is installed"
342
+ )
343
+ )
340
344
  return 1
341
345
 
342
346
 
347
+ def _write_terminal_failure(error: HostedIngestionJobError) -> None:
348
+ sys.stderr.buffer.write(
349
+ canonical_json_bytes(
350
+ {
351
+ "status": "failed",
352
+ "code": error.code,
353
+ "detail": error.detail,
354
+ "stage": "ingestion",
355
+ }
356
+ )
357
+ + b"\n"
358
+ )
359
+ sys.stderr.flush()
360
+
361
+
343
362
  __all__ = [
344
363
  "CHECKPOINT_RESERVE_SECONDS",
345
364
  "CONSUMED_INGESTION_DISPATCH_CODES",