mostlyright-data 0.12.0__tar.gz → 0.13.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 (562) hide show
  1. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/PKG-INFO +1 -1
  2. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/pyproject.toml +1 -1
  3. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/skills/mr-data-build/SKILL.md +133 -35
  4. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/cli.py +15 -2
  5. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +2 -2
  6. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +178 -0
  7. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/run_execution_v4.py +76 -5
  8. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_rotation.py +27 -7
  9. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_series.py +1261 -105
  10. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_subscription_sealer.py +51 -1
  11. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_subscription_worker.py +811 -15
  12. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_venue.py +9 -1
  13. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/studio_boundary.py +2 -2
  14. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/studio_subscription_control.py +109 -5
  15. mostlyright_data-0.13.0/src/mostlyright/data_harness/thin/activity.py +902 -0
  16. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/recipe.py +99 -1
  17. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/router.py +27 -2
  18. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/stream_venue.py +338 -33
  19. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/transport.py +25 -4
  20. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4.py +95 -4
  21. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_artifacts.py +14 -4
  22. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_datasets.py +267 -38
  23. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_runs.py +4 -0
  24. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_tables.py +395 -17
  25. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/vocabulary.py +5 -2
  26. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/clarify.py +49 -2
  27. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/remediation.py +1 -1
  28. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/render.py +19 -2
  29. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/.gitignore +0 -0
  30. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/README.md +0 -0
  31. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/scripts/hatch_build.py +0 -0
  32. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/skills/mr-data-build/agents/openai.yaml +0 -0
  33. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  34. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  35. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/__init__.py +0 -0
  36. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  37. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  38. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  39. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  40. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  41. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  42. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  43. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  44. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  45. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  46. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  47. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  48. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  49. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  50. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  51. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  52. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  53. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  54. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  55. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  56. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  57. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  58. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  59. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  60. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  61. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  62. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  63. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  64. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  65. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  66. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  67. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  68. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  69. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  70. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  71. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  72. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  73. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/__init__.py +0 -0
  74. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  75. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
  76. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  77. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  78. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  79. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  80. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  81. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  82. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  83. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  84. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  85. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  86. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  87. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  88. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  89. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/reference.py +0 -0
  90. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/registry.py +0 -0
  91. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  92. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/bounded_query.py +0 -0
  93. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/canonical.py +0 -0
  94. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/catalog_job.py +0 -0
  95. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/contracts.py +0 -0
  96. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/coordinator.py +0 -0
  97. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/crosswalks.py +0 -0
  98. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/declared_checks.py +0 -0
  99. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/deploy.py +0 -0
  100. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/deploy_target.py +0 -0
  101. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  102. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  103. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  104. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
  105. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/capture.py +0 -0
  106. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  107. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/lane.py +0 -0
  108. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  109. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  110. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/registry.py +0 -0
  111. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  112. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/selections.py +0 -0
  113. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/tables.py +0 -0
  114. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  115. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/events.py +0 -0
  116. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  117. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/formats.py +0 -0
  118. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/governors.py +0 -0
  119. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  120. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  121. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  122. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  123. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  124. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  125. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  126. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  127. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  128. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  129. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  130. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  131. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
  132. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_run_worker.py +0 -0
  133. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  134. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
  135. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  136. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  137. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
  138. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_worker.py +0 -0
  139. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  140. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  141. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  142. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  143. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  144. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  145. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/inprocess_acquisition.py +0 -0
  146. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/key_seam.py +0 -0
  147. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  148. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_contracts.py +0 -0
  149. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  150. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  151. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  152. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  153. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  154. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  155. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/service.py +0 -0
  156. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  157. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  158. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  159. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  160. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  161. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  162. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  163. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  164. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  165. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  166. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  167. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  168. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  169. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  170. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  171. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  172. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  173. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/notebook.py +0 -0
  174. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/offline.py +0 -0
  175. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/operation_registry.py +0 -0
  176. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/operator_setup.py +0 -0
  177. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/pipeline.py +0 -0
  178. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/plan_graph.py +0 -0
  179. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  180. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  181. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  182. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  183. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  184. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  185. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  186. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/table.py +0 -0
  187. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  188. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/progress_events.py +0 -0
  189. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  190. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  191. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  192. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/containers.py +0 -0
  193. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  194. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  195. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  196. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  197. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  198. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  199. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  200. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  201. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  202. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  203. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  204. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  205. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  206. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  207. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  208. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  209. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  210. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  211. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  212. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  213. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  214. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  215. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  216. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  217. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  218. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  219. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  220. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  221. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  222. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/registry.py +0 -0
  223. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  224. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  225. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  226. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  227. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  228. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  229. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  230. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  231. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  232. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  233. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  234. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  235. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  236. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  237. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  238. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  239. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  240. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  241. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  242. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  243. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  244. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  245. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  246. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  247. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  248. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  249. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  250. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  251. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  252. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  253. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  254. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  255. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  256. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  257. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  258. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  259. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  260. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  261. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  262. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  263. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
  264. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  265. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  266. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  267. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  268. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  269. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  270. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
  271. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
  272. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  273. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  274. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  275. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  276. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  277. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
  278. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
  279. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  280. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  281. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
  282. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
  283. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
  284. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
  285. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
  286. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/himawari-hsd-b13-complete.zip +0 -0
  287. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
  288. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
  289. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
  290. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
  291. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
  292. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
  293. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  294. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  295. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  296. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  297. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  298. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  299. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
  300. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
  301. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
  302. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
  303. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  304. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
  305. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  306. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
  307. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  308. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  309. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  310. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  311. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  312. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  313. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  314. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  315. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  316. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  317. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  318. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  319. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  320. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  321. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  322. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
  323. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
  324. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  325. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  326. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  327. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  328. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  329. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  330. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  331. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  332. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  333. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  334. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples.py +0 -0
  335. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  336. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  337. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  338. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  339. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  340. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  341. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  342. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  343. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  344. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  345. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  346. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  347. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  348. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  349. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  350. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  351. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  352. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  353. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  354. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  355. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  356. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  357. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  358. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  359. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  360. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/vector.py +0 -0
  361. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  362. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  363. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  364. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/recipe.py +0 -0
  365. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  366. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  367. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  368. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  369. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/errors.py +0 -0
  370. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/review.py +0 -0
  371. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/rowset.py +0 -0
  372. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/session_probes.py +0 -0
  373. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/signing.py +0 -0
  374. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/skill_assets.py +0 -0
  375. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/source_discovery.py +0 -0
  376. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  377. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  378. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  379. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  380. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  381. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
  382. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  383. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  384. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  385. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  386. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  387. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  388. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  389. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  390. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  391. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  392. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  393. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  394. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  395. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
  396. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  397. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  398. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  399. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  400. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  401. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  402. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  403. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  404. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  405. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  406. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  407. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  408. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  409. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  410. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  411. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  412. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  413. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  414. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  415. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  416. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  417. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  418. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  419. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  420. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
  421. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  422. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  423. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  424. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  425. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/collections.py +0 -0
  426. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  427. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  428. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  429. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  430. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  431. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/governance.py +0 -0
  432. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  433. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/integration.py +0 -0
  434. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  435. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/registry.py +0 -0
  436. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  437. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  438. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/sports.py +0 -0
  439. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream.py +0 -0
  440. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  441. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  442. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
  443. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  444. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  445. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  446. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  447. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  448. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  449. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  450. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  451. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  452. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  453. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  454. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  455. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  456. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  457. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  458. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  459. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  460. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  461. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  462. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
  463. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  464. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  465. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
  466. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
  467. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
  468. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  469. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  470. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  471. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  472. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/commands.py +0 -0
  473. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/download.py +0 -0
  474. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  475. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/parity.py +0 -0
  476. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/probe.py +0 -0
  477. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/propose.py +0 -0
  478. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/research.py +0 -0
  479. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/runs.py +0 -0
  480. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/session.py +0 -0
  481. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/stream.py +0 -0
  482. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  483. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  484. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  485. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
  486. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  487. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  488. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/workers.py +0 -0
  489. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  490. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  491. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/unit_flow.py +0 -0
  492. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/units.py +0 -0
  493. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  494. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/approve.py +0 -0
  495. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  496. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  497. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  498. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  499. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  500. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  501. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  502. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  503. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  504. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  505. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  506. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  507. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  508. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  509. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  510. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  511. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  512. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  513. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  514. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
  515. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  516. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  517. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  518. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  519. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  520. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  521. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  522. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  523. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  524. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  525. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  526. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  527. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  528. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  529. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  530. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  531. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/headline.py +0 -0
  532. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  533. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
  534. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  535. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  536. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/login.py +0 -0
  537. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  538. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/peek.py +0 -0
  539. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  540. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  541. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  542. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/readers.py +0 -0
  543. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/workload.py +0 -0
  544. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
  545. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  546. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  547. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  548. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_recipe.py +0 -0
  549. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_required_controls.py +0 -0
  550. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  551. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
  552. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_transform.py +0 -0
  553. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  554. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  555. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  556. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  557. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  558. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  559. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  560. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  561. {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  562. {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0
3
+ Version: 0.13.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.12.0"
3
+ version = "0.13.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"
@@ -59,6 +59,13 @@ not the other: silent work stays silent in both, and a message that is not worth
59
59
  not worth sending. This is a rule about the messages this contract already allows — it does not
60
60
  license one extra update.
61
61
 
62
+ **Activity is not narration.** Setting the dataset's activity is a routine, silent act like any
63
+ other command: it never produces a chat message and never a cell. The rule above governs what is
64
+ said; activity governs what is happening. They answer different questions and never stand in for
65
+ each other — a phase is not a message, and a message is not a substitute for the phase. So
66
+ `mr-data dataset activity` is written wherever the stages below say to write it, in silence, under
67
+ the same rule that keeps authentication checks and receipt parsing silent.
68
+
62
69
  For hosted work, register the Dataset first and open its canonical page immediately in the host's
63
70
  in-app browser: `mr-data open /datasets/DATASET_ID` mints a single-use address for it, and
64
71
  when that address cannot be minted, carry on without it rather than blocking.
@@ -105,7 +112,7 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
105
112
  | `mr-data whoami` | Use the compatibility alias for the remotely validated `auth status` answer. |
106
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. |
107
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. |
108
- | `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. |
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. |
109
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. |
110
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. |
111
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 re-acquires the declared addresses over the previous version and claims no window); `--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. |
@@ -124,16 +131,18 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
124
131
  | `mr-data open` | Mint a single-use, short-lived address that continues this session in a browser at one dashboard path, and print it. `--open` hands it to the platform opener. The credential decides who mints: a device credential — what `mr-data login` stores — mints at Cloud, and a personal access token mints at Studio. |
125
132
  | `mr-data promote` | Ask Studio to publish one table after a person's decision. The Harness worker does not perform the catch-up or scheduled refresh; report those only when another deployed component returns durable evidence that it did. |
126
133
  | `mr-data reschedule` | Change how often one live table refreshes, without the demote and promote that would reset its bookkeeping and buy a catch-up run. `--cadence` takes a cron expression or an interval such as `every 6h`; `--why` records the reasoning. It starts no run. `--lock` freezes the schedule so Studio stops adjusting it; `--unlock` lets it follow the source again. |
127
- | `mr-data table` | Report what one table is serving and how its refresh schedule is going: the state in plain words, the schedule in force, the next refresh, the schedule that was asked for and the reason given for it, and — once Studio has settled on one — the interval it measured and how many source updates that rests on. |
134
+ | `mr-data table` | Report what one table is serving and how its refresh schedule is going: the state in plain words, the schedule in force, the next refresh, the schedule that was asked for and the reason given for it, and — once Studio has settled on one — the interval it measured and how many source updates that rests on. `table rename TABLE --name NAME` writes a new name, lowercase snake_case and unique within its dataset, fenced on that dataset's version and retried once if somebody else wrote first; nothing is rebuilt, because every run, version and schedule hangs off the identifier, which does not move. `table archive TABLE --confirm-name NAME` retires the table and frees its name; a live table is refused until you `demote` it, and nothing built is deleted. |
128
135
  | `mr-data pin` | Ask Studio to freeze one table pointer on an exact version, for a rollback or a hold. |
129
136
  | `mr-data unpin` | Ask Studio to resume pointer tracking; read the returned state before claiming it resumed. |
130
137
  | `mr-data demote` | Ask Studio to withdraw the pointer and any schedule it owns. |
131
138
 
132
139
  `auth`, `login`, `whoami` and `clarify` are the same implementation in both profiles, and
133
- `clarify` alone reaches nothing at all. The other twenty-four answer from Studio. Nine only
134
- read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`, `download`, `diff` and `table`.
135
- Fifteen start or change something: `dataset`, `recipe`, `cover`, `run`, `query`, `probe`, `keys`,
136
- `stream`, `open`, `note`, `promote`, `reschedule`, `pin`, `unpin` and `demote`.
140
+ `clarify` alone reaches nothing at all. The other twenty-four answer from Studio. Eight only
141
+ read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`, `download` and `diff`.
142
+ Sixteen start or change something: `dataset`, `recipe`, `cover`, `run`, `query`, `probe`, `keys`,
143
+ `stream`, `open`, `note`, `promote`, `reschedule`, `table`, `pin`, `unpin` and `demote`. The split
144
+ is over names, not over invocations: `table TABLE` reads and `table rename` writes, and the name
145
+ sits on the side of whichever half changes something.
137
146
 
138
147
  **Any successful run is readable straight away.** There is no approval, no admission and no release
139
148
  step between a run finishing and reading it: `download`, `receipt`, `checks`, `peek` and `query`
@@ -221,7 +230,10 @@ live data key is refused with `THIN_AUTHENTICATION_FAILED` rather than failing t
221
230
  There is one loop, and it is short: open the page before you have anything to put on it, probe the
222
231
  sources, say out loud what you chose and what you refused, draft one recipe document, build a
223
232
  sample, interrogate what came back, fix the document, build again. Then present only what you
224
- inspected, with its caveats. Nothing between a run finishing and reading it is held for a person,
233
+ inspected, with its caveats. The last two steps are conditional and `truncated` is what decides
234
+ them: a sample that came back complete IS the table a full run would have sealed, so there is
235
+ nothing to build again and nothing to ask about — only a TRUNCATED sample sends you round the
236
+ loop. Nothing between a run finishing and reading it is held for a person,
225
237
  so there is no approval to seek, no separate body of evidence to read back, and no state to wait
226
238
  for; the only human gate in the product is [Promote](#promote), which comes after the loop has
227
239
  produced a table worth making live.
@@ -296,6 +308,30 @@ Hold the `dataset_id` for the rest of the session: stage 3 writes the decision r
296
308
 
297
309
  ### 2. Probe — read a source before committing to it
298
310
 
311
+ **Say what is happening, three times, silently.** The dataset's activity is the state the page's
312
+ own indicator reads. It is not a message and not a cell: write it and say nothing, exactly as you
313
+ run every other command. Write it as the search starts, again once the shortlist is in hand, and
314
+ again when the document is being written:
315
+
316
+ ```sh
317
+ mr-data dataset activity DATASET_ID --phase researching \
318
+ --message "Looking for feeds that carry hourly stage for the Bagmati" --json
319
+ mr-data dataset activity DATASET_ID --phase comparing \
320
+ --message "Comparing four candidate gauges against the question" \
321
+ --fact candidates=4 --fact sources_probed=2 --json
322
+ mr-data dataset activity DATASET_ID --phase drafting \
323
+ --message "Writing the recipe: three gauges, one hourly table" --json
324
+ ```
325
+
326
+ The message is one plain line about what you are doing right now, and the facts are counts you
327
+ already hold — how many sources the discovery lanes shortlisted, how many of them you actually
328
+ opened. Do not invent either; a fact you have not counted is a fact to leave out.
329
+
330
+ **Then stop writing it by hand.** Every later phase comes from the commands themselves:
331
+ registering a recipe, starting a run, reading a finished one, asking the user a question and
332
+ promoting a table each move the page on their own. Stage 2 is the one stretch of the build where
333
+ nothing has been submitted yet, which is why it is the one stretch that has to say so.
334
+
299
335
  **Judge the sources.** This stays with the external agent and is the substance of the task. Search
300
336
  every available discovery lane with no lane priority: a configured sealed catalog, host public-web
301
337
  search, official provider catalogs/APIs/download indexes/documentation, and user-supplied sources.
@@ -558,6 +594,11 @@ window into any source request, so any stated `--window` is refused before acqui
558
594
  mr-data run --recipe RECIPE_ID --digest RECIPE_DIGEST --sample --max-rows 2000 --json
559
595
  ```
560
596
 
597
+ Two thousand is the number to use before you have measured anything: it exercises every column,
598
+ every cast and every declared check, and it comes back while the person who asked is still
599
+ watching. Once stage 2 has measured the sources, raise it above the largest of them — the
600
+ paragraphs below say why a ceiling under the real size costs more than the run it saved.
601
+
561
602
  **Both flags are required and neither is a positional.** `mr-data run RECIPE_ID` is refused:
562
603
  `--recipe` names the registered recipe and `--digest` states which bytes of it you mean to run,
563
604
  as the bare lowercase hex `recipe_digest` the registration receipt printed — no `sha256:` prefix.
@@ -566,16 +607,40 @@ a revision nobody read, which is why the client will not derive it for you. Hold
566
607
  from the registration receipt: every run of that recipe needs the pair.
567
608
 
568
609
  **`--max-rows` is a per-source ceiling, not a table size.** Each acquired source is truncated at
569
- that many rows, so a recipe with eight sources delivers up to eight times the number you asked for
570
- — 2,000 becomes 16,000. Read the delivered size off the run's `coverage` and say the number the run
571
- reports, never the number you passed.
572
-
573
- **Two thousand rows, and the first run is always this one.** A sample is for establishing shape,
574
- and a usable one has to arrive within minutes: two thousand rows a source exercises every column,
575
- every cast and every declared check, and it comes back while the person who asked is still watching
576
- the page. A larger first sample buys nothing the checks do not already report and costs the one
577
- thing the page cannot get back, which is the first few minutes. The full run comes later, in stage
578
- 8, and only when the user says so.
610
+ that many rows on its own, so a recipe with eight sources delivers up to eight times the number you
611
+ asked for — 2,000 becomes 16,000. Read the delivered size off the run's `coverage` and say the
612
+ number the run reports, never the number you passed.
613
+
614
+ **And because it is per source, a low ceiling breaks a multi-source recipe's own checks.** Eight
615
+ sources each cut at 2,000 rows are eight partial spans stitched into one table, and the seams are
616
+ gaps that exist nowhere in the data: a continuity or completeness check that would pass over the
617
+ whole thing fails over the sample, and it fails for a reason that has nothing to do with the
618
+ recipe. Debugging that costs more than the run it saved. The ceiling is there to stop a source you
619
+ have not measured from running away with the afternoon, not to make a small table.
620
+
621
+ **So: when you have measured the sources, set the ceiling above the largest one.** Stage 2 opened
622
+ these feeds and knows roughly how many rows each carries. Pick a number comfortably above the
623
+ biggest of them and the sample acquires every source whole — no artificial seams, every declared
624
+ check meaningful, and `coverage` untruncated on every entry, which is what makes the sample
625
+ finished work rather than a shape test. Where a source was never opened, and its size is therefore
626
+ a guess, two thousand rows a source is the fallback: it exercises every column, every cast and
627
+ every declared check, and it comes back while the person who asked is still watching the page.
628
+
629
+ **One Reader holds about 3 MiB of one source at a time, and that bounds what a source DELIVERS.**
630
+ It is the largest single source rather than the total — one Reader opens one source at a time — and
631
+ a source that really delivers more than that dies mid-run with `SANDBOX_MEMORY_LIMIT`. This is
632
+ yours to apply to the sizes stage 2 measured, not something the command decides for you:
633
+ `limits.max_source_bytes` states where fetching STOPS rather than how big the source is, so
634
+ `mr-data recipe` does not refuse a large one. It registers the document and puts one sentence on
635
+ the receipt under `warnings`, naming the source and both numbers. Read that as "go and check this
636
+ one", not as a failure: a document declaring 8 MiB over a feed that answers 40 KB is fine.
637
+
638
+ **If a source really does deliver more than the Reader holds, do not answer it by lowering the
639
+ ceiling on that source:** that does not fetch less data, it truncates the sample or refuses the
640
+ full run. Split the window across several sources — one per month, per region, or per whatever the
641
+ publisher paginates on — and union them in a first transform step. A recipe names up to 64 sources,
642
+ which is a great many windows. [The recipe document](../../docs/RECIPE-DOCUMENT.md) carries the
643
+ measured numbers behind the ceiling.
579
644
 
580
645
  **The dataset's record is the primary one; a run's own record is for what happened inside that
581
646
  run.** The sources, the decisions and the questions went onto the dataset in stage 3, where they
@@ -692,38 +757,71 @@ the checks and the coverage say what you need them to say.
692
757
  ### 8. Present — only what survived inspection, with caveats
693
758
 
694
759
  Report what you inspected, and nothing you did not. Nothing else checks this run: `verified` is not
695
- a word some other worker said about it, it is what you established by reading it. So the honest
696
- sentence names the reading, and it says the word **sample** out loud:
697
-
698
- > Inspected 2,000 rows from the acquired source snapshot — a sample. All four declared checks
699
- > passed. Coverage was truncated at the row ceiling, and no run window was applied, so this is not
700
- > evidence for a stated calendar interval.
701
-
702
- Three facts carry that sentence and all three are on the run: how many rows you actually looked at,
703
- what the declared checks reported, and whether `coverage.truncated` was true. A null coverage
760
+ a word some other worker said about it, it is what you established by reading it. Three facts carry
761
+ whatever you say and all three are on the run: how many rows you actually looked at, what the
762
+ declared checks reported, and whether `coverage.truncated` was true on any entry. A null coverage
704
763
  window means the acquisition was unwindowed, not that it covered all time. Never present a sampled
705
764
  row as a whole-population value, never call a run verified because it succeeded, and never report
706
765
  coverage you did not read off `coverage`.
707
766
 
708
- **Offer the sample's own bytes.** The sample is a sealed table like any other and its Parquet is
709
- downloadable — `mr-data download RUN --output DIR --json` — so somebody who wants to look at it
710
- before agreeing to a full run can. Say so.
767
+ **Read `truncated` first, because it decides which of two endings this is.** Every coverage entry
768
+ carries it. When it is false on every source, nothing was cut: each source was acquired whole, and
769
+ the table this run sealed is the table a full run would have sealed. When it is true anywhere,
770
+ something was cut, and what you have is a shape rather than an answer.
771
+
772
+ **A complete sample is the build. Present it as one.** The mode a run was started in is not what
773
+ makes a table finished — untruncated coverage is — and calling a complete table "a sample" tells
774
+ somebody their dataset does not exist yet when it does. Say what was built and offer the decision
775
+ that is actually in front of them, which is whether to make it live:
711
776
 
712
- **Then stop, and ask whether to run the full build.** This is a pause, and it is the second one
713
- this document allows alongside the promote decision. A full run over a real window costs real time
714
- and real money, and it is a decision about the user's data rather than about the recipe, so it is
715
- theirs and not yours. State what the sample established, what the full run would cover, and ask.
716
- Only when they say so:
777
+ > Built 43,812 rows from four sources, every source acquired whole and nothing truncated. All four
778
+ > declared checks passed. This is the table, not a sample of it.
779
+
780
+ Then offer to enable it, and enable it when they say so — `mr-data promote TABLE_ID --cadence
781
+ "every 6h" --why "..."`, which is [Promote](#promote), the one human gate. Do not run the whole
782
+ thing again to produce a table you already have.
783
+
784
+ **A truncated sample is not the build, and this is where the pause is.** State what the sample
785
+ established, name what was cut and on which sources, say what a full run would cover, and ask. This
786
+ pause is the second one this document allows alongside the promote decision, and it exists only
787
+ here: a full run over a real window costs real time and real money, and it is a decision about the
788
+ user's data rather than about the recipe, so it is theirs and not yours. Only when they say so:
717
789
 
718
790
  ```sh
719
791
  mr-data run --recipe RECIPE_ID --digest RECIPE_DIGEST --full --json
720
792
  ```
721
793
 
794
+ **The same decision is a button on the dataset page.** A truncated sample puts "Run the full
795
+ build" on the agent pill, and pressing it starts the full run through the same spend gate the
796
+ command does, bare — the exact coordinate the command above names — so the answer to this pause
797
+ can arrive as words here or as a run you did not start. Ask, then give the turn back; do not hold
798
+ a stream open waiting for either. Before acting on this recipe again — on their answer, or on your
799
+ next turn — read `mr-data runs --json --mode full` and, for any run newer than the sample that you
800
+ did not start, `mr-data status RUN_ID --json` to see whether it names this recipe and digest. One
801
+ that does, with empty `clamps` and the default `resource_class`, is the pill's run, and its state
802
+ says what to do. `queued`, `running` or `succeeded` is the full run, so adopt it as if the command
803
+ above had started it — write its stage 5 cell, `mr-data watch RUN_ID --json` if it has not ended,
804
+ then stage 6. `awaiting_confirmation` is the spend gate, which they settle from the page or by
805
+ telling you to run the command again with `--confirm`. `awaiting_sample_approval` means Studio is
806
+ sampling first: read its `sample_run_id` off that status and treat that sample as another stage 6
807
+ while the full waits on their approval on the page, and if the sample is itself
808
+ `awaiting_confirmation` that is the spend gate above, on the sample. `failed` is the full run too:
809
+ read its triple as stage 6 says and report it, and do not start another, because a bare run of
810
+ this coordinate replays that failure and a new attempt is a revision (stage 7). `cancelled` means
811
+ they withdrew the decision, so say so and ask nothing further unless they raise it. Start a full
812
+ run yourself only when they said so here and that list shows none, and start it bare — no
813
+ ceiling, no resource class — because one coordinate is one run and a clamp is what would make a
814
+ second.
815
+
722
816
  Then interrogate that run as stage 6 says, and present it with the sample's caveats removed and
723
817
  its own read off `coverage`. Do not start a full run because the sample looked good, because the
724
818
  checks passed, or because the user asked for the dataset in the first place — the request was for a
725
819
  dataset, and the decision in front of them is whether THIS is the recipe to spend a full run on.
726
820
 
821
+ **Either way, offer the bytes.** A sealed table is downloadable whatever mode produced it —
822
+ `mr-data download RUN --output DIR --json` — so somebody who wants to look before agreeing to
823
+ anything can. Say so.
824
+
727
825
  ## Live run
728
826
 
729
827
  `mr-data run` answers with the run identifier and Studio's own run record. These are machine-facing
@@ -1102,7 +1200,7 @@ Own the run until the requested outcome is delivered: a run that succeeded, its
1102
1200
  read, its coverage inspected, and a publication request made when the user asked for it. Promotion
1103
1201
  is complete only when Studio returns the resulting live state; catch-up and continuing freshness
1104
1202
  require separate durable evidence from the deployed component that owns them. The allowed user pauses
1105
- are the promote decision, the decision to start a full run after the sample, and a spend
1203
+ are the promote decision, the decision to start a full run after a TRUNCATED sample, and a spend
1106
1204
  confirmation on a run over the threshold. Do not ask the user to choose sources, Readers, engines,
1107
1205
  formats, workspaces, retry tactics, cleaning operations, or validation repairs. Make those
1108
1206
  operational decisions from the question, observed evidence, registered capabilities, and
@@ -1371,6 +1371,11 @@ def _parser(
1371
1371
  parser.add_argument("--version", action="version", version=f"%(prog)s {package_version()}")
1372
1372
  subparsers = parser.add_subparsers(dest="command", required=True)
1373
1373
 
1374
+ # ⚠ IMPORTED HERE RATHER THAN AT MODULE SCOPE, the rule every thin-lane import in this file
1375
+ # follows: `cli` is the local front door and the hosted lane is loaded when a parser is built,
1376
+ # not when this module is.
1377
+ from mostlyright.data_harness.thin import activity as _thin_activity
1378
+
1374
1379
  # `--json` lives on the subcommands, never on the top-level parser: one dest declared at both
1375
1380
  # levels lets the subparser default silently overwrite a value the caller gave up front.
1376
1381
  json_parent = argparse.ArgumentParser(add_help=False)
@@ -1381,9 +1386,17 @@ def _parser(
1381
1386
  )
1382
1387
 
1383
1388
  def _add(*args: Any, **kwargs: Any) -> argparse.ArgumentParser:
1384
- """Add one subcommand. Every subcommand takes `--json`; that is not optional."""
1389
+ """Add one subcommand. Every subcommand takes `--json`; that is not optional.
1390
+
1391
+ And the commands that tell the dataset page what they are doing take `--no-activity`,
1392
+ through the same function `thin.router` calls: every gate in the suite holds the two front
1393
+ doors' argument surfaces equal command for command, so a flag one of them grows is a flag
1394
+ the other grows in the same commit or not at all.
1395
+ """
1385
1396
 
1386
- return subparsers.add_parser(*args, parents=[json_parent], **kwargs)
1397
+ added = subparsers.add_parser(*args, parents=[json_parent], **kwargs)
1398
+ _thin_activity.declare_opt_out(str(args[0]) if args else "", added)
1399
+ return added
1387
1400
 
1388
1401
  # The arguments several commands share, written once. `--help` is the first thing anyone reads
1389
1402
  # and often the only thing, so an argument that says nothing is an argument someone has to go
@@ -137,7 +137,7 @@ from mostlyright.data_harness.sources.stream_registry import (
137
137
  )
138
138
  from mostlyright.data_harness.sources.stream_rotation import run_series_rotation
139
139
  from mostlyright.data_harness.sources.stream_series import (
140
- STREAM_SERIES_VERSION,
140
+ STREAM_SERIES_VERSIONS,
141
141
  load_stream_series,
142
142
  series_gap_report,
143
143
  series_windows,
@@ -1354,7 +1354,7 @@ def _sort_series_documents(registry_root: Path, series_root: Path) -> None:
1354
1354
  document = parse_json(path.read_bytes())
1355
1355
  except (CanonicalJSONError, OSError, TypeError, ValueError):
1356
1356
  continue
1357
- if isinstance(document, dict) and document.get("schema_version") == STREAM_SERIES_VERSION:
1357
+ if isinstance(document, dict) and document.get("schema_version") in STREAM_SERIES_VERSIONS:
1358
1358
  os.rename(path, series_root / name)
1359
1359
 
1360
1360
 
@@ -29,6 +29,12 @@ from pathlib import Path
29
29
  from typing import Any, Protocol
30
30
  from urllib.parse import urlsplit
31
31
 
32
+ from mostlyright.data_harness.acquisition.http import (
33
+ PinnedHttpsRetriever,
34
+ RetrievalLimits,
35
+ StdlibPinnedTransport,
36
+ )
37
+ from mostlyright.data_harness.acquisition.url_policy import EgressPolicy, SystemResolver
32
38
  from mostlyright.data_harness.canonical import sha256_bytes
33
39
  from mostlyright.data_harness.hosted_bootstrap import (
34
40
  BootstrapTransport,
@@ -38,6 +44,9 @@ from mostlyright.data_harness.hosted_bootstrap import (
38
44
  from mostlyright.data_harness.hosted_stream_recorder_job import (
39
45
  _production_prelude_transport as _recorder_prelude_transport,
40
46
  )
47
+ from mostlyright.data_harness.hosted_stream_recorder_job import (
48
+ _sort_series_documents,
49
+ )
41
50
  from mostlyright.data_harness.ingestion.gcs_store import (
42
51
  GCSObjectTransport,
43
52
  GoogleCloudStorageJSONTransport,
@@ -55,6 +64,12 @@ from mostlyright.data_harness.sources.stream_registry import (
55
64
  StreamConnectorEntry,
56
65
  load_stream_connector_registry,
57
66
  )
67
+ from mostlyright.data_harness.sources.stream_series import (
68
+ MAX_DISCOVERY_RESPONSE_BYTES,
69
+ SERIES_DIRECTORY_NAME,
70
+ StreamSeriesConfig,
71
+ load_stream_series_documents,
72
+ )
58
73
  from mostlyright.data_harness.stream_subscription_feed import (
59
74
  ConnectorFrameDecoder,
60
75
  ThreadedConnectorFeed,
@@ -64,9 +79,12 @@ from mostlyright.data_harness.stream_subscription_worker import (
64
79
  MAX_ACTIVE_SUBSCRIPTIONS,
65
80
  ClaimedSubscription,
66
81
  ContinuousSubscriptionWorker,
82
+ DiscoveryTransport,
83
+ RosterPlanner,
67
84
  StreamSubscriptionError,
68
85
  SubscriptionFeed,
69
86
  install_shutdown_handlers,
87
+ utc_now,
70
88
  )
71
89
  from mostlyright.data_harness.stream_venue import StreamVenueError, materialize_connector_registry
72
90
  from mostlyright.data_harness.studio_subscription_control import StudioSubscriptionControl
@@ -302,6 +320,154 @@ def _claim_text(value: str | None, label: str) -> str:
302
320
  return value
303
321
 
304
322
 
323
+ class SubscriptionRosterResolver(Protocol):
324
+ """Build the roster planner one series-following claim needs."""
325
+
326
+ def create(self, claim: ClaimedSubscription) -> RosterPlanner: ...
327
+
328
+
329
+ class ProductionSubscriptionRosterResolver:
330
+ """Resolve a claim's pinned series document into the planner that walks its roster.
331
+
332
+ The series arrives the way the connector does: as bytes inside the registry the claim pinned,
333
+ materialized into one private temporary directory, checked against the digest the claim named,
334
+ and parsed by the harness grammar that owns it. Nothing about what a series SAYS is decided
335
+ here, and no second document reader exists: the recorder Job and this worker sort a flat
336
+ registry into its two loaders by the same rule.
337
+
338
+ The discovery leg is a pinned-egress HTTPS retriever narrowed to the one host the document
339
+ names, no redirects, JSON only, one bounded answer per page. It is built per claim so a
340
+ series can never reach a host its own document did not write down.
341
+ """
342
+
343
+ def __init__(
344
+ self,
345
+ *,
346
+ work_root: Path,
347
+ objects: GCSObjectTransport | None = None,
348
+ discovery_transport: Callable[[StreamSeriesConfig], DiscoveryTransport] | None = None,
349
+ utc_clock: Callable[[], str] | None = None,
350
+ ) -> None:
351
+ self.work_root = work_root
352
+ self.objects = GoogleCloudStorageJSONTransport() if objects is None else objects
353
+ self.discovery_transport = (
354
+ _production_discovery_transport if discovery_transport is None else discovery_transport
355
+ )
356
+ self.utc_clock = utc_now if utc_clock is None else utc_clock
357
+
358
+ def create(self, claim: ClaimedSubscription) -> RosterPlanner:
359
+ series = claim.series
360
+ if series is None:
361
+ raise StreamSubscriptionError(
362
+ "STREAM_SUBSCRIPTION_SERIES_INVALID", "claim follows no series"
363
+ )
364
+ config = _materialized_claim_series(claim, self.objects, self.work_root)
365
+ if series.selection_rule is not None and config.selection_rule != series.selection_rule:
366
+ # Checked only where the claim states it: the document is the authority for the rule,
367
+ # and a claim that restates it and disagrees is a claim about another document.
368
+ raise StreamSubscriptionError(
369
+ "STREAM_SUBSCRIPTION_SERIES_INVALID", "materialized series selection rule"
370
+ )
371
+ return RosterPlanner(
372
+ config=config,
373
+ now=self.utc_clock,
374
+ discover=self.discovery_transport(config) if config.discovered else None,
375
+ )
376
+
377
+
378
+ def _materialized_claim_series(
379
+ claim: ClaimedSubscription, objects: GCSObjectTransport, work_root: Path
380
+ ) -> StreamSeriesConfig:
381
+ """Materialize and verify precisely the series document this lease was granted for."""
382
+
383
+ series = claim.series
384
+ assert series is not None # the caller refuses a claim that follows none
385
+ root = Path(tempfile.mkdtemp(prefix="stream-subscription-series-", dir=work_root))
386
+ try:
387
+ os.chmod(root, 0o700)
388
+ registry_root = root / "registry"
389
+ registry_root.mkdir(mode=0o700)
390
+ series_root = registry_root / SERIES_DIRECTORY_NAME
391
+ series_root.mkdir(mode=0o700)
392
+ materialize_connector_registry(
393
+ transport=objects,
394
+ bucket=_claim_text(claim.stream_venue_bucket, "stream venue bucket"),
395
+ registry_prefix=_claim_text(claim.connector_registry_prefix, "registry prefix"),
396
+ registry_digest=_claim_text(claim.connector_registry_digest, "registry digest"),
397
+ root=registry_root,
398
+ )
399
+ _sort_series_documents(registry_root, series_root)
400
+ documents = load_stream_series_documents(registry_root)
401
+ held = documents.get(series.series_id)
402
+ if held is None:
403
+ raise StreamSubscriptionError(
404
+ "STREAM_SUBSCRIPTION_SERIES_INVALID", "series is not in the pinned registry"
405
+ )
406
+ if held.document_digest != series.series_document_digest:
407
+ raise StreamSubscriptionError(
408
+ "STREAM_SUBSCRIPTION_SERIES_INVALID", "materialized series document digest"
409
+ )
410
+ if held.config.connector_id != claim.connector_id:
411
+ raise StreamSubscriptionError(
412
+ "STREAM_SUBSCRIPTION_SERIES_INVALID", "series rotates another connector"
413
+ )
414
+ return held.config
415
+ except StreamSubscriptionError:
416
+ raise
417
+ except (OSError, SourceContractError, StreamVenueError) as error:
418
+ raise StreamSubscriptionError(
419
+ "STREAM_SUBSCRIPTION_SERIES_INVALID", type(error).__name__
420
+ ) from error
421
+ finally:
422
+ shutil.rmtree(root, ignore_errors=True)
423
+
424
+
425
+ def _production_discovery_transport(config: StreamSeriesConfig) -> DiscoveryTransport:
426
+ """The pinned HTTPS leg one discovered series reads its listing over.
427
+
428
+ This worker builds no HTTP client of its own: the retriever is the same pinned-egress one the
429
+ keyed acquisition lane uses, narrowed here to the one host the series document names, port
430
+ 443, no redirects, JSON only, and one bounded answer per request. A roster is read from a
431
+ literal address a reviewer approved, or it is not read.
432
+ """
433
+
434
+ discovery = config.discovery
435
+ if discovery is None: # pragma: no cover - only a discovered series reaches this
436
+ raise StreamSubscriptionError(
437
+ "STREAM_SUBSCRIPTION_SERIES_INVALID", "series declares no discovery"
438
+ )
439
+ hostname = urlsplit(discovery.url).hostname
440
+ if not hostname:
441
+ raise StreamSubscriptionError(
442
+ "STREAM_SUBSCRIPTION_DISCOVERY_INVALID", "discovery address names no host"
443
+ )
444
+ retriever = PinnedHttpsRetriever(
445
+ resolver=SystemResolver(),
446
+ egress_policy=EgressPolicy(allowed_hostnames=(hostname,), allowed_ports=frozenset({443})),
447
+ transport=StdlibPinnedTransport(),
448
+ limits=RetrievalLimits(
449
+ max_response_bytes=MAX_DISCOVERY_RESPONSE_BYTES,
450
+ max_aggregate_response_bytes=MAX_DISCOVERY_RESPONSE_BYTES,
451
+ max_redirects=0,
452
+ # More than one request per page so a host answering on several addresses can be
453
+ # reached at all: the budget is spent walking the approved peer set, not following
454
+ # redirects, and a single-attempt budget dies on the first unroutable address.
455
+ max_requests=4,
456
+ max_ranges=1,
457
+ connect_timeout_seconds=5.0,
458
+ read_timeout_seconds=30.0,
459
+ total_timeout_seconds=45.0,
460
+ max_concurrency=1,
461
+ allowed_media_types=("application/json",),
462
+ ),
463
+ )
464
+
465
+ def fetch(url: str) -> bytes:
466
+ return retriever.retrieve(url).content
467
+
468
+ return fetch
469
+
470
+
305
471
  @dataclass(frozen=True)
306
472
  class SubscriptionWorkerRuntimeConfig:
307
473
  """Bounded deployment inputs; provider policy remains in the claimed subscription."""
@@ -381,6 +547,7 @@ def build_worker(
381
547
  sealer: GCSSubscriptionSealer | None = None,
382
548
  feed_resolver: SubscriptionFeedResolver | None = None,
383
549
  credential_resolver: SubscriptionCredentialResolver | None = None,
550
+ roster_resolver: SubscriptionRosterResolver | None = None,
384
551
  object_transport: GCSObjectTransport | None = None,
385
552
  stream_connect: StreamConnect | None = None,
386
553
  prelude_transport: Callable[[StreamConnectorEntry], PreludeTransport | None] | None = None,
@@ -420,12 +587,21 @@ def build_worker(
420
587
  if feed_resolver is None
421
588
  else feed_resolver
422
589
  )
590
+ active_rosters = (
591
+ ProductionSubscriptionRosterResolver(
592
+ work_root=config.work_root,
593
+ objects=active_objects,
594
+ )
595
+ if roster_resolver is None
596
+ else roster_resolver
597
+ )
423
598
  return ContinuousSubscriptionWorker(
424
599
  control=active_control,
425
600
  sealer=active_sealer,
426
601
  feed_factory=lambda claim: active_feeds.create(
427
602
  claim, credential_resolver=active_credentials
428
603
  ),
604
+ roster_factory=active_rosters.create,
429
605
  max_active_subscriptions=config.max_active_subscriptions,
430
606
  heartbeat_seconds=config.heartbeat_seconds,
431
607
  idle_poll_seconds=config.idle_poll_seconds,
@@ -540,8 +716,10 @@ def _bounded_float(
540
716
  __all__ = [
541
717
  "DEFAULT_WORK_ROOT",
542
718
  "HostedStreamSubscriptionWorkerError",
719
+ "ProductionSubscriptionRosterResolver",
543
720
  "SubscriptionCredentialResolver",
544
721
  "SubscriptionFeedResolver",
722
+ "SubscriptionRosterResolver",
545
723
  "SubscriptionWorkerRuntimeConfig",
546
724
  "build_control",
547
725
  "build_worker",