mostlyright-data 0.16.2__tar.gz → 0.17.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/PKG-INFO +1 -1
  2. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/pyproject.toml +1 -1
  3. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/skills/mr-data-build/SKILL.md +94 -14
  4. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/http.py +162 -2
  5. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/parsing.py +18 -9
  6. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/sandbox.py +79 -19
  7. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/bounded_query.py +15 -0
  8. mostlyright_data-0.17.0/src/mostlyright/data_harness/delta.py +353 -0
  9. mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_checks.py +465 -0
  10. mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_classifier.py +875 -0
  11. mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_persist.py +750 -0
  12. mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_recompute.py +348 -0
  13. mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_rows.py +626 -0
  14. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_bootstrap.py +1 -1
  15. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_run_worker.py +3478 -1033
  16. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_session_worker.py +0 -2
  17. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_worker.py +55 -8
  18. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/inprocess_acquisition.py +231 -18
  19. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/local_contracts.py +150 -1
  20. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/pipeline.py +15 -0
  21. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/run_execution_v4.py +472 -78
  22. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/run_phase_timing.py +8 -0
  23. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sql_transform_engine.py +96 -1
  24. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_subscription_sealer.py +41 -5
  25. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/studio_boundary.py +1 -1
  26. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/table_manifest.py +22 -2
  27. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/table_profile.py +57 -2
  28. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4.py +37 -10
  29. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_artifacts.py +1 -1
  30. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_datasets.py +119 -15
  31. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_tables.py +76 -9
  32. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/remediation.py +1 -1
  33. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_closed_source.py +40 -9
  34. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_required_controls.py +7 -4
  35. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_stream_recording.py +14 -9
  36. mostlyright_data-0.16.2/src/mostlyright/data_harness/source_collection_bundle.py +0 -154
  37. mostlyright_data-0.16.2/src/mostlyright/data_harness/source_collection_contract.py +0 -62
  38. mostlyright_data-0.16.2/src/mostlyright/data_harness/source_collection_inputs.py +0 -148
  39. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/.gitignore +0 -0
  40. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/README.md +0 -0
  41. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/scripts/hatch_build.py +0 -0
  42. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/skills/mr-data-build/agents/openai.yaml +0 -0
  43. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  44. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  45. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/__init__.py +0 -0
  46. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  47. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  48. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  49. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  50. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  51. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  52. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  53. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  54. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  55. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  56. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  57. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  58. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  59. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  60. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  61. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  62. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  63. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  64. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  65. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  66. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  67. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  68. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  69. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  70. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  71. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  72. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  73. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  74. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  75. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  76. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  77. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  78. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  79. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  80. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  81. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  82. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  83. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/__init__.py +0 -0
  84. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  85. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
  86. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  87. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  88. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  89. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/sandbox_bootstrap.py +0 -0
  90. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  91. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  92. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  93. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  94. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  95. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  96. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  97. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/reference.py +0 -0
  98. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/registry.py +0 -0
  99. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  100. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/bounded_scratch_sink.py +0 -0
  101. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/canonical.py +0 -0
  102. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/catalog_job.py +0 -0
  103. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/cli.py +0 -0
  104. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/compact_worker.py +0 -0
  105. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/contracts.py +0 -0
  106. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/coordinator.py +0 -0
  107. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/crosswalks.py +0 -0
  108. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/declared_checks.py +0 -0
  109. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/deploy.py +0 -0
  110. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/deploy_target.py +0 -0
  111. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  112. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  113. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  114. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/capture.py +0 -0
  115. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  116. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/lane.py +0 -0
  117. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  118. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  119. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/registry.py +0 -0
  120. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  121. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/selections.py +0 -0
  122. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/tables.py +0 -0
  123. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  124. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/events.py +0 -0
  125. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  126. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/formats.py +0 -0
  127. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/governors.py +0 -0
  128. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  129. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  130. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  131. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  132. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  133. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  134. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  135. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  136. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  137. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_ingestion_worker.py +0 -0
  138. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
  139. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  140. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  141. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  142. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
  143. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
  144. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
  145. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/incremental_slice_executor.py +0 -0
  146. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/incremental_worker.py +0 -0
  147. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  148. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  149. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  150. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  151. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  152. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  153. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/key_seam.py +0 -0
  154. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  155. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  156. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  157. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  158. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  159. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  160. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  161. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  162. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  163. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  164. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  165. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  166. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  167. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  168. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  169. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  170. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  171. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  172. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/notebook.py +0 -0
  173. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/offline.py +0 -0
  174. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/operation_registry.py +0 -0
  175. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/operator_setup.py +0 -0
  176. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/part_check_evidence.py +0 -0
  177. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/plan_graph.py +0 -0
  178. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  179. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  180. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  181. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  182. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  183. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  184. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  185. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/table.py +0 -0
  186. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  187. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/progress_events.py +0 -0
  188. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  189. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  190. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  191. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/containers.py +0 -0
  192. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  193. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  194. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  195. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  196. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  197. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  198. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  199. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  200. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  201. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  202. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  203. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  204. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  205. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  206. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  207. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  208. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  209. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  210. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  211. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  212. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  213. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  214. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  215. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  216. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  217. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  218. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  219. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  220. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  221. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/registry.py +0 -0
  222. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  223. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  224. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  225. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  226. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  227. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  228. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  229. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  230. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  231. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  232. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  233. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  234. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  235. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  236. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  237. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  238. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  239. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  240. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  241. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  242. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  243. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  244. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  245. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  246. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  247. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  248. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  249. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  250. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  251. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  252. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  253. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  254. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  255. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  256. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  257. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  258. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  259. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  260. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  261. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  262. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
  263. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  264. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  265. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  266. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  267. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  268. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  269. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
  270. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
  271. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  272. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  273. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  274. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  275. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  276. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
  277. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
  278. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  279. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  280. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
  281. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
  282. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
  283. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
  284. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
  285. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/himawari-hsd-b13-complete.zip +0 -0
  286. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
  287. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
  288. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
  289. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
  290. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
  291. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
  292. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  293. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  294. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  295. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  296. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  297. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  298. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
  299. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
  300. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
  301. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
  302. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  303. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
  304. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  305. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
  306. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  307. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  308. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  309. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  310. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  311. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  312. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  313. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  314. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  315. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  316. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  317. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  318. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  319. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  320. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  321. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
  322. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
  323. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  324. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  325. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  326. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  327. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  328. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  329. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  330. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  331. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  332. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  333. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples.py +0 -0
  334. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  335. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  336. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  337. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  338. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  339. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  340. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  341. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  342. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  343. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  344. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  345. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  346. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  347. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  348. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  349. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  350. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  351. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  352. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  353. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  354. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  355. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  356. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  357. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  358. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  359. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/vector.py +0 -0
  360. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  361. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  362. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  363. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/recipe.py +0 -0
  364. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/review.py +0 -0
  365. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/rowset.py +0 -0
  366. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/session_probes.py +0 -0
  367. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/signing.py +0 -0
  368. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/skill_assets.py +0 -0
  369. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_bootstrap.py +0 -0
  370. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_bundle_writer.py +0 -0
  371. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_discovery.py +0 -0
  372. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_history_candidate_child.py +0 -0
  373. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_history_transform_child.py +0 -0
  374. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_inventory.py +0 -0
  375. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_partition.py +0 -0
  376. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_raw_inventory.py +0 -0
  377. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_state_index.py +0 -0
  378. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  379. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  380. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  381. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  382. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  383. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
  384. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  385. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  386. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  387. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  388. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  389. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  390. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  391. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  392. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  393. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  394. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  395. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  396. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  397. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  398. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  399. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  400. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  401. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  402. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  403. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  404. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  405. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  406. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  407. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  408. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  409. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  410. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  411. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  412. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  413. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  414. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  415. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  416. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  417. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  418. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  419. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  420. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  421. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  422. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  423. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  424. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/collections.py +0 -0
  425. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  426. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  427. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  428. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  429. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  430. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/governance.py +0 -0
  431. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  432. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/integration.py +0 -0
  433. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  434. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/registry.py +0 -0
  435. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  436. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  437. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/sports.py +0 -0
  438. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream.py +0 -0
  439. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  440. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  441. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
  442. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  443. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  444. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  445. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  446. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  447. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  448. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  449. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  450. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  451. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  452. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  453. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  454. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  455. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  456. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  457. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  458. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  459. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  460. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  461. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  462. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
  463. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  464. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  465. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  466. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_order_vector.py +0 -0
  467. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_recovery_objects.py +0 -0
  468. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_segment_spill.py +0 -0
  469. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
  470. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_subscription_worker.py +0 -0
  471. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_venue.py +0 -0
  472. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
  473. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/studio_subscription_control.py +0 -0
  474. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/table_parts.py +0 -0
  475. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  476. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  477. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  478. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/activity.py +0 -0
  479. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  480. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/commands.py +0 -0
  481. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/download.py +0 -0
  482. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  483. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/parity.py +0 -0
  484. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/probe.py +0 -0
  485. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/propose.py +0 -0
  486. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/recipe.py +0 -0
  487. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/research.py +0 -0
  488. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/router.py +0 -0
  489. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/runs.py +0 -0
  490. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/session.py +0 -0
  491. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/stream.py +0 -0
  492. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  493. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/transport.py +0 -0
  494. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_connections.py +0 -0
  495. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  496. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  497. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  498. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
  499. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
  500. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  501. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  502. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  503. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/workers.py +0 -0
  504. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  505. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  506. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/unit_flow.py +0 -0
  507. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/units.py +0 -0
  508. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  509. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  510. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  511. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  512. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  513. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  514. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  515. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  516. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  517. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  518. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  519. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  520. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  521. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  522. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  523. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  524. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/headline.py +0 -0
  525. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  526. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  527. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/login.py +0 -0
  528. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  529. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  530. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/readers.py +0 -0
  531. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/render.py +0 -0
  532. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
  533. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  534. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  535. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  536. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_recipe.py +0 -0
  537. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  538. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_transform.py +0 -0
  539. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_window.py +0 -0
  540. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  541. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  542. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  543. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  544. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  545. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  546. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  547. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  548. {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.16.2
3
+ Version: 0.17.0
4
4
  Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
5
5
  Project-URL: Homepage, https://mostlyright.md/
6
6
  Project-URL: Documentation, https://mostlyright.md/docs/guides/cli/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyright-data"
3
- version = "0.16.2"
3
+ version = "0.17.0"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -112,7 +112,7 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
112
112
  | `mr-data whoami` | Use the compatibility alias for the remotely validated `auth status` answer. |
113
113
  | `mr-data clarify` | Say whether one clarifying question may be put to the user right now, and compose the record of their answer. It reaches nothing, asks nobody and waits for nothing. Exits non-zero when no person can answer or when a recipe is already registered. |
114
114
  | `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. |
115
- | `mr-data dataset` | Bring the dataset page into existence before there is anything on it, then fill it in while somebody watches. `dataset create --name TEXT` mints it and prints the `dataset_id`; `dataset show ID` reads it back; `dataset set ID --name TEXT --description-file F` writes the title and the description under the version it was read at, retrying once if somebody else wrote first; `dataset note ID --heading H --blocks-file B` writes one cell of the decision record that OUTLIVES every run, and `--list` reads it back; `dataset watch ID` follows the page's own event stream; `dataset activity ID --phase P --message TEXT` says what is happening right now, silently, and is never a chat message and never a cell; `dataset archive ID --confirm-name TITLE` retires the page and frees its title, deleting nothing. |
115
+ | `mr-data dataset` | Bring the dataset page into existence before there is anything on it, then fill it in while somebody watches. `dataset create --name TEXT` mints it and prints the `dataset_id`; `dataset show ID` reads it back; `dataset set ID --name TEXT --topics "a,b,c" --license ID --description-file F` writes the title, the categories, the SPDX licence and the description under the version it was read at, retrying once if somebody else wrote first, and an empty `--topics` or `--license` takes that value off the page; `dataset note ID --heading H --blocks-file B` writes one cell of the decision record that OUTLIVES every run, and `--list` reads it back; `dataset watch ID` follows the page's own event stream; `dataset activity ID --phase P --message TEXT` says what is happening right now, silently, and is never a chat message and never a cell; `dataset archive ID --confirm-name TITLE` retires the page and frees its title, deleting nothing. |
116
116
  | `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. |
117
117
  | `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. |
118
118
  | `mr-data run` | Start one run against a registered recipe, named as `--recipe RECIPE_ID --digest RECIPE_DIGEST` — both required, neither positional, and the digest is the bare hex the registration receipt printed. The command accepts `--sample`, `--full`, `--refresh`, `--backfill` and `--window`, and the worker executes `--sample`, `--full` and `--refresh`. A refresh narrows each source that declares a supported address window and merges its returned relation into retained source state; unwindowed sources are conditionally revalidated or re-acquired whole, then the full declared transform runs. `--backfill` and a `--window` on a sample or full are refused before acquisition. `--max-rows` and `--max-source-bytes` remain supported, and each bounds ONE SOURCE rather than the finished table. 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. |
@@ -307,7 +307,8 @@ and a title that never changes is fine too. Where the address cannot be minted,
307
307
  plain dashboard address rather than blocking.
308
308
 
309
309
  Hold the `dataset_id` for the rest of the session: stage 3 writes the decision record to it, stage
310
- 4 writes its title, description and cover, and the recipe binds to it by naming it as `dataset.id`.
310
+ 4 writes its title, topics, licence, description and cover, and the recipe binds to it by naming
311
+ it as `dataset.id`.
311
312
 
312
313
  ### 2. Probe — read a source before committing to it
313
314
 
@@ -470,18 +471,63 @@ and is settled once, at stage 4.
470
471
  Every grain, key, join and cutoff settled after stage 3 is a further `decision` block on the
471
472
  DATASET's record — `mr-data dataset note DATASET_ID` — because the fact outlives every run.
472
473
 
473
- **Write the title and the description before the first run, one call each.** The page has been
474
- open since stage 1 under a working title; this is where it settles:
474
+ **Write the title, the topics, the licence and the description before the first run.** The page has
475
+ been open since stage 1 under a working title. This is where it settles. One call carries the title,
476
+ the topics and the licence, so the title and the chips land together; the description arrives after
477
+ it, through the draft snapshots and the final commit. (The worked example below is a different
478
+ dataset from the Kathmandu one the earlier stages follow, chosen because its numbers are easy to
479
+ count.)
475
480
 
476
481
  ```sh
477
- mr-data dataset set DATASET_ID --name "Kathmandu monsoon flooding, 2015-2026" --json
478
- mr-data dataset set DATASET_ID --description-file DESCRIPTION.md --json
482
+ mr-data dataset set DATASET_ID --name "Hourly weather at Prague Airport (LKPR), 2000-2026" \
483
+ --topics "weather,prague,czech republic,metar,iowa environmental mesonet" \
484
+ --license "CC-BY-4.0" --json
479
485
  ```
480
486
 
481
- Two calls rather than one, so the person watching sees the title land and then the text arrive.
482
- Each call reads the version first and writes under it, so a description you wrote against a page
483
- somebody else has since edited is retried once and then reported rather than silently overwriting
484
- them. While composing, send bounded snapshots with `mr-data dataset draft DATASET_ID --description-file DRAFT.md --expected-version VERSION --json`. Chain the returned version into the next snapshot, writing a meaningful paragraph at a time. These snapshots are temporary and do not replace the saved description. Commit the complete documentation with `mr-data dataset set DATASET_ID --description-file DESCRIPTION.md --expected-version VERSION --json`. If another edit moved that version, stop the draft and reconcile it with the user’s text; never retry by blindly advancing the version. Do not send fabricated partial text or delay completed text to simulate writing.
487
+ The call reads the version first and writes under it, so a page somebody else has since edited is
488
+ retried once and then reported rather than silently overwritten. The licence is the SPDX identifier
489
+ of the rights basis the sources actually grant -- for example `CC-BY-4.0`, `ODbL-1.0`, `CC0-1.0`;
490
+ where the sources' terms are not an open licence, leave `--license` off and say so under "Source and
491
+ rights" instead. Never invent a licence.
492
+
493
+ While composing, send bounded snapshots with `mr-data dataset draft DATASET_ID --description-file DRAFT.md --expected-version VERSION --json`. Chain the returned version into the next snapshot, writing a meaningful paragraph at a time. These snapshots are temporary and do not replace the saved description. Commit the complete documentation with `mr-data dataset set DATASET_ID --description-file DESCRIPTION.md --expected-version VERSION --json`. If another edit moved that version, stop the draft and reconcile it with the user’s text; never retry by blindly advancing the version. Do not send fabricated partial text or delay completed text to simulate writing.
494
+
495
+ **What search engines and answer engines read.** These are the three fields search engines and
496
+ answer engines index. A search engine (Google, Bing) ranks the page by the words a person types.
497
+ An answer engine (ChatGPT, Perplexity, Claude, Google AI Overviews) quotes the page as a source
498
+ when a person asks a question. Making the page rank is called SEO. Making the page quotable is
499
+ called GEO. Both read the same three fields, and each field lands in fixed places with fixed
500
+ limits. The rules below are mechanical: apply them, then run the check at the end. Do not
501
+ interpret them.
502
+
503
+ | You write | Where it appears | Limit |
504
+ | --- | --- | --- |
505
+ | `--name` | browser tab title (`{name} \| Mostly Right`), the page heading, the JSON-LD `name` | at most 60 characters, or search results cut it |
506
+ | the opening paragraph of DESCRIPTION.md | the meta description, the social card, the JSON-LD `description`, the `Summary:` line answer engines fetch | search engines cut at 300 characters; answer engines cut at 240 |
507
+ | `--topics` | category chips and the category filter on the /datasets directory, JSON-LD `keywords`, the `Topics:` line answer engines fetch, the `topic` filter in the public API and MCP | 3 to 8 topics, each at most 40 characters |
508
+
509
+ **Title rules**
510
+ 1. Shape: subject, place, period. `Hourly weather at Prague Airport (LKPR), 2000-2026`.
511
+ 2. At most 60 characters. Count them.
512
+ 3. Use the words a person would type: the common place name, and the official identifier in
513
+ parentheses once if one exists (ICAO code, station id, ticker, constituency name).
514
+ 4. Never: a brand, the word "dataset" or "data", a colon, a pipe, an exclamation mark, a version
515
+ number, a run date.
516
+ 5. Sentence case. No trailing full stop.
517
+
518
+ **Topic rules**
519
+ 1. 3 to 8 topics, comma-separated, no duplicates.
520
+ 2. Topic one is the category, chosen from this list and no other:
521
+ `weather, climate, air quality, hydrology, energy, transport, aviation, public health,
522
+ economics, finance, elections, sports, prediction markets, demographics, geospatial,
523
+ agriculture`.
524
+ 3. Then, in this order, one each where it applies: the city or region, the country, the
525
+ phenomenon or instrument, the publisher or programme. After those, up to three more, each a
526
+ distinct thing a person would type that none of the earlier topics already names.
527
+ 4. Form: lowercase; ASCII letters, digits, spaces and hyphens only; one to three words; at most
528
+ 40 characters.
529
+ 5. Never: a column name, a unit, a bare year, a second word from the category list, a market or
530
+ venue name unless the dataset is about that market.
485
531
 
486
532
  **The dataset description is the documentation, and it is read by people and by search engines.**
487
533
  `dataset.description` is Markdown, rendered on the dataset page with headings and lists, and it
@@ -490,7 +536,7 @@ seconds -- not a paragraph, and not a report. Use exactly this shape, in this or
490
536
  section out only when there is genuinely nothing to say (shown indented here; the document
491
537
  itself carries the headings at column one):
492
538
 
493
- One or two plain sentences: what each row is, where it comes from, and the period it covers.
539
+ Two plain sentences: what each row is, where it comes from, and the period it covers.
494
540
 
495
541
  ## Coverage
496
542
  - **Window:** the exact dates and the time zone.
@@ -510,13 +556,47 @@ itself carries the headings at column one):
510
556
  ## Source and rights
511
557
  The publisher, the programme, and the rights basis, in one or two sentences.
512
558
 
559
+ That is six sections: the opening paragraph, and the five headings under it.
560
+
561
+ **Opening paragraph rules** (everything before the first `##` heading)
562
+ 1. Two sentences, 150 to 240 characters together. The first sentence ends before character 200
563
+ and is complete on its own.
564
+ 2. Sentence one says what each row is, for where, over what window, from which publisher:
565
+ `Each row is one hourly METAR observation at Prague Václav Havel Airport (LKPR), January 2000
566
+ to August 2026, from the Iowa Environmental Mesonet ASOS archive.`
567
+ 3. Sentence two gives the size and the measured quantities, as numbers and nouns:
568
+ `43,812 rows of temperature, dew point, wind, pressure and visibility.`
569
+ 4. Full names on first use with the abbreviation in parentheses once. Never "this dataset",
570
+ "we", "it", "here".
571
+ 5. No Markdown in the opening paragraph: no bold, no links, no bullets, no code.
572
+
573
+ **Body rules** (the five sections under the headings)
574
+ 1. Every sentence must stay true and complete when quoted alone, away from the page. Never
575
+ "as above", "see below", "it", "they", "the same".
576
+ 2. Numbers, not adjectives: `one row per hour, about 720 rows a month`, not `high-frequency`.
577
+ 3. Keep the five headings exactly as given, in that relative order, omitting only a section with
578
+ genuinely nothing to say. Answer engines match headings to questions: "what does it cover",
579
+ "what is it suitable for".
580
+ 4. Say what is absent as plainly as what is present: gaps, sentinels, the years the source did
581
+ not record.
582
+ 5. Everything in the paragraph below still applies.
583
+
513
584
  Rules that keep it readable: short sentences; no sentence over about twenty-five words; bullets
514
585
  rather than comma lists; no tables, no code blocks, no links to internal tools, no headings beyond
515
586
  the ones above. Spell out the names a reader would search for -- the place, the identifiers in
516
587
  every common form, the programme and the publisher -- once each, in the opening sentences and
517
- never as a keyword list. The opening sentences double as the summary cards and search engines
518
- show, so they must stand alone. A one-line description is a defect to fix in the revision, not a
519
- style choice. Give `table.description` the grain and the window.
588
+ never as a keyword list. A one-line description is a defect to fix in the revision, not a style
589
+ choice. Give `table.description` the grain and the window.
590
+
591
+ **Check before writing.** Fix and re-check until every line passes:
592
+ - title: at most 60 characters, contains the place, contains no colon, pipe or exclamation mark,
593
+ no brand, no "dataset" or "data", no version number, no run date
594
+ - opening paragraph: 150 to 240 characters, first full stop before character 200, no Markdown
595
+ - topics: 3 to 8, no duplicates, first one is on the category list, all lowercase, each at most
596
+ 40 characters, none is a column name, a unit, a year, a second word from the category list, or
597
+ a market or venue name unless the dataset is about that market
598
+ - licence: an SPDX identifier the sources actually grant, or `--license` left off
599
+ - every `##` heading in DESCRIPTION.md is one of the five, in that relative order, none repeated
520
600
 
521
601
  **Every dataset gets a cover before its first run is presented.** Once the description is
522
602
  written, generate one with
@@ -17,6 +17,7 @@ import threading
17
17
  import time
18
18
  from collections.abc import Callable, Iterator, Mapping
19
19
  from dataclasses import dataclass, replace
20
+ from datetime import UTC, datetime
20
21
  from pathlib import Path, PurePosixPath
21
22
  from typing import TYPE_CHECKING, Protocol
22
23
  from urllib.parse import unquote_to_bytes, urljoin, urlsplit
@@ -184,6 +185,71 @@ _CONTENT_RANGE = re.compile(rf"bytes ({_DECIMAL})-({_DECIMAL})/({_DECIMAL}|\*)")
184
185
  # written out again, so one edit moves both and the two headers cannot drift apart.
185
186
  _DECIMAL_ONLY = re.compile(_DECIMAL)
186
187
 
188
+ # The statuses on which ``Retry-After`` says anything a fetch may act on. RFC 9110 defines the
189
+ # field for 503 and for a 3xx; RFC 6585 gives 429 the same reading. A redirect is followed here
190
+ # rather than waited out, so the two that remain are these. Read on any other status the field
191
+ # would be either absent or about something this path does not do, and a 500 that carries one
192
+ # must not be able to talk a caller into a wait it never reviewed.
193
+ RETRY_AFTER_STATUSES: frozenset[int] = frozenset({429, 503})
194
+ # Long enough for either spelling a compliant origin may send -- an IMF-fixdate is 29 characters
195
+ # and a bounded delta-seconds is at most 16 -- and short enough that a value past it is refused
196
+ # as a value rather than parsed. A longer field is not truncated and re-read: it is dropped, and
197
+ # the caller falls back to the wait it reviewed for itself.
198
+ MAX_RETRY_AFTER_CHARS = 64
199
+ # ``delta-seconds`` is ``1*DIGIT`` (RFC 9110 5.6.7), which is NOT ``_DECIMAL`` above: that one
200
+ # refuses a leading zero, because the value it reads is sealed or compared and one span spelled
201
+ # two ways would be two spellings in the evidence. A wait is neither, so ``Retry-After: 07`` is a
202
+ # perfectly ordinary seven seconds and refusing it would only lose the origin's answer.
203
+ #
204
+ # The digit bound is defence in depth rather than the thing that keeps this bounded:
205
+ # ``MAX_RETRY_AFTER_CHARS`` already caps the string long before the grammar sees it, and a
206
+ # 17-digit wait would be refused by the caller's ceiling anyway. It is here so the bound does not
207
+ # depend on either of those staying true.
208
+ _RETRY_AFTER_DELTA = re.compile(r"[0-9]{1,16}")
209
+ # The one date spelling this parser admits: the same RFC 9110 IMF-fixdate FIELD that
210
+ # ``_IMF_FIXDATE`` below holds ``Last-Modified`` to, written separately because the two do
211
+ # different work with it. That one is a shape check on a value echoed back to the publisher
212
+ # unchanged, so it is stricter per character and deliberately admits a 31st of February; this
213
+ # one is turned into an instant a run will wait for, so it captures its fields and hands the
214
+ # calendar the job of refusing a day that does not exist.
215
+ #
216
+ # RFC 9110 5.6.7 requires a sender to use IMF-fixdate and permits a recipient to see two
217
+ # obsolete forms; those two are deliberately NOT parsed. The 850-style form carries a two-digit
218
+ # year, and a windowing rule for it is a guess about which century an origin meant -- a guess
219
+ # this module would then spend a run's seconds on. An unreadable value costs nothing, because
220
+ # every caller of ``parse_retry_after_seconds`` treats ``None`` as "the origin said nothing" and
221
+ # waits its own reviewed backoff instead.
222
+ #
223
+ # ``[0-9]`` rather than ``\d`` throughout, because ``\d`` also matches the digits of every other
224
+ # script Unicode has, and ``float`` reads those too: an origin could otherwise name its wait in
225
+ # Arabic-Indic digits and have it honoured. The parser table in ``tests/h3/test_http.py`` sends
226
+ # three alphabets' worth, which is what makes this a property rather than a preference.
227
+ #
228
+ # The month names are written once, in ``_RETRY_AFTER_MONTHS``, and the alternation is built from
229
+ # it. The tuple is also what turns a captured name into a month number, and the two are read one
230
+ # after the other on the same value: a name the pattern admitted but the tuple did not hold would
231
+ # raise inside the ``try`` below and read as "the origin said nothing", which is a silent way to
232
+ # lose a spelling. One source, so they cannot disagree.
233
+ _RETRY_AFTER_MONTHS = (
234
+ "Jan",
235
+ "Feb",
236
+ "Mar",
237
+ "Apr",
238
+ "May",
239
+ "Jun",
240
+ "Jul",
241
+ "Aug",
242
+ "Sep",
243
+ "Oct",
244
+ "Nov",
245
+ "Dec",
246
+ )
247
+ _RETRY_AFTER_DATE = re.compile(
248
+ r"(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), "
249
+ rf"([0-9]{{2}}) ({'|'.join(_RETRY_AFTER_MONTHS)}) ([0-9]{{4}}) "
250
+ r"([0-9]{2}):([0-9]{2}):([0-9]{2}) GMT"
251
+ )
252
+
187
253
 
188
254
  @dataclass(frozen=True)
189
255
  class DatagovRateObservation:
@@ -1219,7 +1285,21 @@ class PeerAttemptError(AcquisitionSecurityError):
1219
1285
  # everywhere else, so a caller that reads it fails closed rather than retrying a
1220
1286
  # refusal whose origin never answered.
1221
1287
  http_status: int | None = None,
1288
+ # The origin's own ``Retry-After``, exactly as it wrote it, and only from a status that
1289
+ # gives the field meaning (``RETRY_AFTER_STATUSES``). It rides here for the reason
1290
+ # ``http_status`` does: a caller deciding whether and when to ask again is answering a
1291
+ # question about this response, and the typed code cannot carry the answer. Absent
1292
+ # everywhere else, and never interpreted here -- ``parse_retry_after_seconds`` reads it,
1293
+ # and the caller that will spend the wait bounds it.
1294
+ retry_after: str | None = None,
1222
1295
  ) -> None:
1296
+ if retry_after is not None and (
1297
+ type(retry_after) is not str or len(retry_after) > MAX_RETRY_AFTER_CHARS
1298
+ ):
1299
+ raise AcquisitionSecurityError(
1300
+ "TRANSPORT_EVIDENCE",
1301
+ "peer-attempt Retry-After evidence is invalid",
1302
+ )
1223
1303
  if any(not isinstance(attempt, PeerAttempt) for attempt in peer_attempts):
1224
1304
  raise AcquisitionSecurityError(
1225
1305
  "TRANSPORT_EVIDENCE",
@@ -1233,6 +1313,7 @@ class PeerAttemptError(AcquisitionSecurityError):
1233
1313
  self.peer_attempts = peer_attempts
1234
1314
  self.hops = hops
1235
1315
  self.http_status = http_status
1316
+ self.retry_after = retry_after
1236
1317
  self.total_response_body_size_bytes = sum(
1237
1318
  attempt.response_body_size_bytes for attempt in peer_attempts
1238
1319
  )
@@ -1772,7 +1853,8 @@ class PinnedHttpsRetriever:
1772
1853
 
1773
1854
  Redirect bodies are discarded after their digest is measured. A peer retry starts a
1774
1855
  fresh request only after the failed attempt records its consumed bytes; the caller must
1775
- therefore use a fresh staging file per acquisition and discard it on any exception.
1856
+ therefore use a fresh staging file per acquisition, or truncate it through ``reset_sink``
1857
+ before re-attempting, and discard it on any exception it does not re-attempt.
1776
1858
  """
1777
1859
  if not callable(sink):
1778
1860
  raise AcquisitionSecurityError("STREAM_SINK", "stream sink must be callable")
@@ -1944,6 +2026,7 @@ class PinnedHttpsRetriever:
1944
2026
  tuple(attempts),
1945
2027
  hops=tuple(hops),
1946
2028
  http_status=response.status,
2029
+ retry_after=_retry_after_header(response),
1947
2030
  )
1948
2031
  media_type = _media_type(response.header("content-type"))
1949
2032
  if media_type not in self._limits.allowed_media_types:
@@ -2652,6 +2735,7 @@ class PinnedHttpsRetriever:
2652
2735
  peer_attempts,
2653
2736
  hops,
2654
2737
  http_status=response.status,
2738
+ retry_after=_retry_after_header(response),
2655
2739
  )
2656
2740
  content_type = self._response_header(response, "content-type", peer_attempts, hops)
2657
2741
  try:
@@ -2724,6 +2808,7 @@ class PinnedHttpsRetriever:
2724
2808
  hops: list[RetrievalHop],
2725
2809
  *,
2726
2810
  http_status: int | None = None,
2811
+ retry_after: str | None = None,
2727
2812
  ) -> None:
2728
2813
  latest = peer_attempts[-1]
2729
2814
  peer_attempts[-1] = PeerAttempt(
@@ -2733,7 +2818,12 @@ class PinnedHttpsRetriever:
2733
2818
  response_body_size_bytes=latest.response_body_size_bytes,
2734
2819
  )
2735
2820
  raise PeerAttemptError(
2736
- code, detail, tuple(peer_attempts), hops=tuple(hops), http_status=http_status
2821
+ code,
2822
+ detail,
2823
+ tuple(peer_attempts),
2824
+ hops=tuple(hops),
2825
+ http_status=http_status,
2826
+ retry_after=retry_after,
2737
2827
  )
2738
2828
 
2739
2829
  def _response_header(
@@ -3026,6 +3116,76 @@ def _remaining_socket_timeout(deadline: float, *, configured: float) -> float:
3026
3116
  return min(configured, remaining)
3027
3117
 
3028
3118
 
3119
+ def parse_retry_after_seconds(value: str | None, *, now: float) -> float | None:
3120
+ """Read one ``Retry-After`` field as a wait in seconds from ``now``, or decline to read it.
3121
+
3122
+ Both spellings RFC 9110 defines are admitted: delta-seconds, and an absolute IMF-fixdate,
3123
+ which is subtracted from ``now`` (a POSIX timestamp) to give the same kind of answer. A date
3124
+ already in the past is not a negative wait -- it is the origin saying "now", and it returns
3125
+ ``0.0``, which a caller floors at its own backoff.
3126
+
3127
+ ``None`` means only that this field was not readable as a wait: absent, empty, one of the two
3128
+ obsolete date spellings RFC 9110 lets a recipient see, a calendar date that does not exist, or
3129
+ anything else. It is never a verdict about the origin, and never a longer or shorter wait than
3130
+ the caller would have taken on its own.
3131
+
3132
+ The ``MAX_RETRY_AFTER_CHARS`` test below can never be the reason: the longest string either
3133
+ grammar admits is an IMF-fixdate's 29 characters, so a value past the cap is already refused
3134
+ as a value. It is kept because this function is public and its bound should not depend on a
3135
+ grammar someone widens later.
3136
+
3137
+ NOTHING HERE BOUNDS THE ANSWER: a readable field is reported as the origin wrote it, and how
3138
+ long a run may actually wait is the caller's ceiling to apply, because this function has no
3139
+ idea what budget it is spending.
3140
+ """
3141
+
3142
+ if value is None:
3143
+ return None
3144
+ candidate = value.strip()
3145
+ if not candidate or len(candidate) > MAX_RETRY_AFTER_CHARS:
3146
+ return None
3147
+ if _RETRY_AFTER_DELTA.fullmatch(candidate):
3148
+ return float(candidate)
3149
+ match = _RETRY_AFTER_DATE.fullmatch(candidate)
3150
+ if match is None:
3151
+ return None
3152
+ try:
3153
+ moment = datetime(
3154
+ int(match.group(3)),
3155
+ _RETRY_AFTER_MONTHS.index(match.group(2)) + 1,
3156
+ int(match.group(1)),
3157
+ int(match.group(4)),
3158
+ int(match.group(5)),
3159
+ int(match.group(6)),
3160
+ tzinfo=UTC,
3161
+ )
3162
+ except ValueError:
3163
+ # A day the month does not have, or a leap second: a spelling this parser cannot turn
3164
+ # into an instant is one it declines, exactly as an unparseable one.
3165
+ return None
3166
+ return max(0.0, moment.timestamp() - now)
3167
+
3168
+
3169
+ def _retry_after_header(response: TransportResponse | StreamedTransportResponse) -> str | None:
3170
+ """The response's ``Retry-After`` field when the status is one that gives it meaning.
3171
+
3172
+ Reading it must never change what a refusal IS. A hostile origin that repeats the field
3173
+ would otherwise turn a plain 429 into a ``RESPONSE_HEADER_DUPLICATE``, so a refusal to read
3174
+ the field is answered here with ``None`` -- the caller then waits its own reviewed backoff,
3175
+ which is exactly what it does for an origin that sent no field at all.
3176
+ """
3177
+
3178
+ if response.status not in RETRY_AFTER_STATUSES:
3179
+ return None
3180
+ try:
3181
+ value = response.header("retry-after")
3182
+ except AcquisitionSecurityError:
3183
+ return None
3184
+ if value is None or len(value) > MAX_RETRY_AFTER_CHARS:
3185
+ return None
3186
+ return value
3187
+
3188
+
3029
3189
  def _datagov_rate_observation(response: TransportResponse) -> DatagovRateObservation | None:
3030
3190
  """Parse only the bounded numeric Data.gov rate headers; retain no arbitrary headers."""
3031
3191
 
@@ -47,6 +47,7 @@ _FORBIDDEN_REFERENCE_KEYS = frozenset(
47
47
  _SAFE_COLUMN = re.compile(r"^[^\x00-\x1f\x7f]{1,256}$")
48
48
  _ISO_DATE = re.compile(r"\d{4}-\d{2}-\d{2}\Z")
49
49
  _ISO_TIMESTAMP = re.compile(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?Z\Z")
50
+ _ISO_SPACE_MINUTE_TIMESTAMP = re.compile(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}\Z")
50
51
  _MAX_REUSABLE_CSV_ROW_BYTES = 256 * 1024
51
52
  _STREAMING_ROW_HASH_BATCH_ROWS = 1_024
52
53
  # One input character can become a six-byte JSON escape; the per-row estimate also includes the
@@ -1084,17 +1085,25 @@ def _partition_key_and_date(value: str, *, encoding: str) -> tuple[str, datetime
1084
1085
  raise AcquisitionSecurityError(
1085
1086
  "WINDOW_STREAM_PARTITION", "partition value is not a canonical date"
1086
1087
  )
1087
- if encoding == "iso_date_prefix" and value != key and _ISO_TIMESTAMP.fullmatch(value) is None:
1088
- raise AcquisitionSecurityError(
1089
- "WINDOW_STREAM_PARTITION", "partition value is not canonical"
1090
- )
1091
1088
  if encoding == "iso_date_prefix" and value != key:
1092
- try:
1093
- datetime.datetime.fromisoformat(value)
1094
- except ValueError:
1089
+ if _ISO_TIMESTAMP.fullmatch(value) is not None:
1090
+ try:
1091
+ datetime.datetime.fromisoformat(value)
1092
+ except ValueError:
1093
+ raise AcquisitionSecurityError(
1094
+ "WINDOW_STREAM_PARTITION", "partition timestamp is not real"
1095
+ ) from None
1096
+ elif _ISO_SPACE_MINUTE_TIMESTAMP.fullmatch(value) is not None:
1097
+ try:
1098
+ datetime.datetime.strptime(value, "%Y-%m-%d %H:%M")
1099
+ except ValueError:
1100
+ raise AcquisitionSecurityError(
1101
+ "WINDOW_STREAM_PARTITION", "partition timestamp is not real"
1102
+ ) from None
1103
+ else:
1095
1104
  raise AcquisitionSecurityError(
1096
- "WINDOW_STREAM_PARTITION", "partition timestamp is not real"
1097
- ) from None
1105
+ "WINDOW_STREAM_PARTITION", "partition value is not canonical"
1106
+ )
1098
1107
  return (key, parsed_date)
1099
1108
 
1100
1109
 
@@ -769,6 +769,41 @@ class CrawlerSandbox:
769
769
  request would have been given. Retrieval therefore spawns cold.
770
770
  """
771
771
 
772
+ admitted = self._admitted_warm_pool(size)
773
+ if admitted is None:
774
+ return 0
775
+ pool, launch, admitted_size = admitted
776
+ return pool.fill(launch, size=admitted_size)
777
+
778
+ def top_up_warm_pool(self, *, limit: int) -> int:
779
+ """Add at most ONE idle child, never taking the pool past ``limit``. Answers what is ready.
780
+
781
+ The refill a long-lived owner wants between requests, and the reason it is not
782
+ ``start_warm_pool`` with a smaller number: a child handed out between the owner's count
783
+ and its call turns "one more" into "the whole pool", spawned under one hold of the pool's
784
+ lock, and every request that arrives during that hold waits for all of it. This decides
785
+ the increment inside the lock, so a call costs one spawn or none.
786
+
787
+ The boundary rules are ``start_warm_pool``'s, unchanged and applied here too: an invalid
788
+ ceiling is refused, a coordinator holding a bounded cgroup root gets zero and a ceiling of
789
+ zero closes the pool. Believe the count rather than the ceiling, for the same reason.
790
+ """
791
+
792
+ admitted = self._admitted_warm_pool(limit)
793
+ if admitted is None:
794
+ return 0
795
+ pool, launch, admitted_limit = admitted
796
+ return pool.add_one(launch, limit=admitted_limit)
797
+
798
+ def _admitted_warm_pool(self, size: int) -> tuple[_WarmSandboxPool, _WorkerLaunch, int] | None:
799
+ """Check the requested size against the boundary and open the pool it admits.
800
+
801
+ One place, because ``start_warm_pool`` and ``top_up_warm_pool`` must not be able to
802
+ disagree about what the boundary permits: the size validation, the bounded-cgroup clamp
803
+ and the zero-closes-the-pool rule are the pool's admission decision, not either caller's.
804
+ ``None`` means the boundary admits no pool at all and the caller answers zero.
805
+ """
806
+
772
807
  if type(size) is not int or not 0 <= size <= MAX_WARM_POOL_SIZE:
773
808
  raise AcquisitionSecurityError(
774
809
  "SANDBOX_WARM_POOL",
@@ -778,8 +813,7 @@ class CrawlerSandbox:
778
813
  size = min(size, BOUNDED_CGROUP_WARM_POOL_SIZE)
779
814
  if size == 0:
780
815
  self.close_warm_pool()
781
- return 0
782
- launch = self._worker_launch(prewarm=True)
816
+ return None
783
817
  if self._warm_pool is None:
784
818
  self._warm_pool = _WarmSandboxPool(
785
819
  timeout_seconds=self._timeout_seconds,
@@ -788,7 +822,7 @@ class CrawlerSandbox:
788
822
  child_address_space_bytes=self._child_address_space_bytes,
789
823
  networkless_child=self._child_is_networkless(),
790
824
  )
791
- return self._warm_pool.fill(launch, size=size)
825
+ return self._warm_pool, self._worker_launch(prewarm=True), size
792
826
 
793
827
  def warm_pool_ready_count(self) -> int:
794
828
  """How many pre-spawned children are idle and unbound right now."""
@@ -6713,23 +6747,49 @@ class _WarmSandboxPool:
6713
6747
 
6714
6748
  with self._lock:
6715
6749
  self._prune(launch)
6716
- deadline = time.monotonic() + WARM_POOL_FILL_TIMEOUT_SECONDS
6717
- while len(self._ready) < size:
6718
- self._ready.append(
6719
- _prepare_worker(
6720
- launch,
6721
- timeout_seconds=self._timeout_seconds,
6722
- memory_cgroup_root_fd=self._memory_cgroup_root_fd,
6723
- hosted_session_container_memory_bytes=(
6724
- self._hosted_session_container_memory_bytes
6725
- ),
6726
- child_address_space_bytes=self._child_address_space_bytes,
6727
- networkless_child=self._networkless_child,
6728
- track_deadline=False,
6729
- ready_timeout_seconds=max(deadline - time.monotonic(), 0.0),
6730
- )
6750
+ return self._fill_locked(launch, size=size)
6751
+
6752
+ def add_one(self, launch: _WorkerLaunch, *, limit: int) -> int:
6753
+ """Add at most one child, never taking the pool past ``limit``. Answers what is ready.
6754
+
6755
+ AN INCREMENT, NOT A TARGET, AND THE DIFFERENCE IS A LOCK HOLD. A caller that reads
6756
+ ``ready_count`` and then asks ``fill`` for "one more than that" is making two calls with
6757
+ a gap between them: a take landing in the gap empties the pool, and the fill then spawns
6758
+ the whole difference under a single hold of this lock -- which is the wait every taker
6759
+ queued behind it inherits, and the opposite of what topping up by one is for. Here the
6760
+ count and the spawn are one critical section, so a pass adds one child or none whatever
6761
+ else is running.
6762
+
6763
+ ``limit`` is a ceiling on the pool, not a number to reach. A pool already at or above it
6764
+ spawns nothing and reports what it holds.
6765
+ """
6766
+
6767
+ with self._lock:
6768
+ self._prune(launch)
6769
+ if len(self._ready) >= limit:
6770
+ return len(self._ready)
6771
+ return self._fill_locked(launch, size=len(self._ready) + 1)
6772
+
6773
+ def _fill_locked(self, launch: _WorkerLaunch, *, size: int) -> int:
6774
+ """Spawn until the pool holds ``size``. Callers hold ``_lock`` and have pruned."""
6775
+
6776
+ deadline = time.monotonic() + WARM_POOL_FILL_TIMEOUT_SECONDS
6777
+ while len(self._ready) < size:
6778
+ self._ready.append(
6779
+ _prepare_worker(
6780
+ launch,
6781
+ timeout_seconds=self._timeout_seconds,
6782
+ memory_cgroup_root_fd=self._memory_cgroup_root_fd,
6783
+ hosted_session_container_memory_bytes=(
6784
+ self._hosted_session_container_memory_bytes
6785
+ ),
6786
+ child_address_space_bytes=self._child_address_space_bytes,
6787
+ networkless_child=self._networkless_child,
6788
+ track_deadline=False,
6789
+ ready_timeout_seconds=max(deadline - time.monotonic(), 0.0),
6731
6790
  )
6732
- return len(self._ready)
6791
+ )
6792
+ return len(self._ready)
6733
6793
 
6734
6794
  def take(self, launch: _WorkerLaunch) -> _PreparedWorker | None:
6735
6795
  """Hand out one live child started from exactly ``launch``, or nothing.
@@ -118,6 +118,21 @@ MAX_QUERY_ROWS = 1_000_000
118
118
  #: reference table selects one or two; an unpruned read of a billion-row table selects three
119
119
  #: hundred and eighteen. The ceiling is where the list stops being a query and starts being an
120
120
  #: export, and the refusal names ``prune`` as the fix rather than raising the ceiling.
121
+ #:
122
+ #: ⚠ THIS IS THE REPOSITORY'S ONLY COPY OF THE NUMBER, AND IT IS THE ENFORCED ONE.
123
+ #: :func:`bind_parts` refuses over it and ``hosted_session_worker`` returns it as a claim's
124
+ #: ceiling, so a second declaration elsewhere could drift from the wall that actually refuses and
125
+ #: nothing would fail. ``hosted_run_worker`` imports THIS one to decide the severity of an
126
+ #: appending version's part-count report, and ``test_stream_refresh_append`` pins it to Studio's
127
+ #: own ``v4/table_parts.MAX_QUERY_PARTS`` under ``STUDIO_ROOT``.
128
+ #:
129
+ #: ⚠ AND IT IS ALSO STUDIO'S QUERY WALL, WHICH IS THE ONE PRODUCTION MEETS. A read Studio cannot
130
+ #: prune below this many parts is refused ``QUERY_TOO_MANY_PARTS`` -- and an UNPRUNED read prunes
131
+ #: nothing at all (``v4/table_parts.select_parts`` returns every part when the query states no
132
+ #: ``prune`` block), so a plain "show me this table" meets this number and not the format's own
133
+ #: 4,096. It is eight times lower than
134
+ #: :data:`~mostlyright.data_harness.table_manifest.MAX_PARTS_PER_VERSION`, which is why a writer
135
+ #: that watched only the format's ceiling would watch the wall nobody hits first.
121
136
  MAX_QUERY_PARTS = 512
122
137
 
123
138
  #: How many rows are taken from the engine at a time. The running byte budget is checked BETWEEN