mostlyright-data 0.14.0__tar.gz → 0.14.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/PKG-INFO +1 -1
  2. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/pyproject.toml +1 -1
  3. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/skills/mr-data-build/SKILL.md +31 -2
  4. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +50 -21
  5. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/stream_subscription_sealer.py +14 -0
  6. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/stream_subscription_worker.py +35 -10
  7. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/studio_subscription_control.py +118 -3
  8. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/router.py +15 -6
  9. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_tables.py +515 -81
  10. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/render.py +30 -6
  11. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/v4_recipe.py +35 -11
  12. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/.gitignore +0 -0
  13. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/README.md +0 -0
  14. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/scripts/hatch_build.py +0 -0
  15. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/skills/mr-data-build/agents/openai.yaml +0 -0
  16. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  17. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  18. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/__init__.py +0 -0
  19. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  20. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  21. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  22. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  23. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  24. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  25. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  26. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  27. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  28. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  29. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  30. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  31. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  32. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  33. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  34. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  35. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  36. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  37. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  38. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  39. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  40. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  41. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  42. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  43. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  44. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  45. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  46. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  47. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  48. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  49. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  50. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  51. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  52. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  53. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  54. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  55. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  56. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/__init__.py +0 -0
  57. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  58. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
  59. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  60. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  61. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  62. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  63. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  64. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  65. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  66. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  67. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  68. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  69. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  70. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  71. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  72. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/backends/reference.py +0 -0
  73. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/backends/registry.py +0 -0
  74. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  75. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/bounded_query.py +0 -0
  76. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/canonical.py +0 -0
  77. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/catalog_job.py +0 -0
  78. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/cli.py +0 -0
  79. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/contracts.py +0 -0
  80. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/coordinator.py +0 -0
  81. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/crosswalks.py +0 -0
  82. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/declared_checks.py +0 -0
  83. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/deploy.py +0 -0
  84. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/deploy_target.py +0 -0
  85. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  86. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  87. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  88. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
  89. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/capture.py +0 -0
  90. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  91. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/lane.py +0 -0
  92. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  93. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  94. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/registry.py +0 -0
  95. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  96. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/selections.py +0 -0
  97. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/tables.py +0 -0
  98. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  99. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/events.py +0 -0
  100. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  101. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/formats.py +0 -0
  102. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/governors.py +0 -0
  103. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  104. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  105. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  106. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  107. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  108. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  109. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  110. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  111. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  112. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  113. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  114. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  115. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
  116. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_run_worker.py +0 -0
  117. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  118. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
  119. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  120. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  121. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
  122. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
  123. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/hosted_worker.py +0 -0
  124. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  125. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  126. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  127. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  128. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  129. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  130. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/inprocess_acquisition.py +0 -0
  131. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/key_seam.py +0 -0
  132. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  133. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/local_contracts.py +0 -0
  134. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  135. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  136. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  137. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  138. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  139. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  140. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/local_search/service.py +0 -0
  141. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  142. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  143. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  144. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  145. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  146. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  147. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  148. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  149. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  150. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  151. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  152. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  153. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  154. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  155. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  156. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  157. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  158. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/notebook.py +0 -0
  159. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/offline.py +0 -0
  160. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/operation_registry.py +0 -0
  161. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/operator_setup.py +0 -0
  162. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/pipeline.py +0 -0
  163. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/plan_graph.py +0 -0
  164. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  165. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  166. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  167. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  168. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  169. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  170. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  171. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/preparation/table.py +0 -0
  172. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  173. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/progress_events.py +0 -0
  174. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  175. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  176. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  177. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/containers.py +0 -0
  178. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  179. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  180. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  181. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  182. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  183. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  184. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  185. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  186. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  187. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  188. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  189. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  190. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  191. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  192. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  193. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  194. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  195. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  196. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  197. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  198. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  199. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  200. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  201. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  202. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  203. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  204. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  205. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  206. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  207. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/registry.py +0 -0
  208. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  209. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  210. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  211. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  212. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  213. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  214. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  215. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  216. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  217. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  218. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  219. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  220. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  221. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  222. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  223. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  224. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  225. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  226. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  227. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  228. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  229. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  230. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  231. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  232. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  233. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  234. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  235. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  236. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  237. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  238. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  239. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  240. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  241. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  242. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  243. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  244. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  245. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  246. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  247. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  248. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
  249. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  250. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  251. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  252. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  253. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  254. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  255. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
  256. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
  257. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  258. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  259. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  260. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  261. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  262. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
  263. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
  264. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  265. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  266. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
  267. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
  268. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
  269. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
  270. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
  271. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/himawari-hsd-b13-complete.zip +0 -0
  272. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
  273. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
  274. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
  275. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
  276. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
  277. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
  278. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  279. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  280. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  281. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  282. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  283. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  284. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
  285. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
  286. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
  287. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
  288. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  289. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
  290. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  291. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
  292. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  293. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  294. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  295. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  296. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  297. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  298. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  299. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  300. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  301. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  302. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  303. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  304. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  305. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  306. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  307. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
  308. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
  309. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  310. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  311. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  312. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  313. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  314. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  315. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  316. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  317. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  318. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  319. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/samples.py +0 -0
  320. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  321. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  322. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  323. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  324. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  325. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  326. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  327. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  328. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  329. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  330. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  331. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  332. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  333. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  334. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  335. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  336. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  337. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  338. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  339. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  340. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  341. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  342. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  343. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  344. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  345. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/vector.py +0 -0
  346. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  347. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  348. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  349. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/recipe.py +0 -0
  350. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  351. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  352. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  353. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  354. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/repair/errors.py +0 -0
  355. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/review.py +0 -0
  356. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/rowset.py +0 -0
  357. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/run_execution_v4.py +0 -0
  358. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/session_probes.py +0 -0
  359. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/signing.py +0 -0
  360. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/skill_assets.py +0 -0
  361. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/source_discovery.py +0 -0
  362. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  363. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  364. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  365. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  366. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  367. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
  368. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  369. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  370. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  371. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  372. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  373. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  374. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  375. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  376. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  377. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  378. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  379. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  380. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  381. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
  382. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  383. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  384. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  385. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  386. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  387. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  388. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  389. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  390. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  391. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  392. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  393. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  394. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  395. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  396. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  397. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  398. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  399. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  400. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  401. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  402. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  403. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  404. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  405. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  406. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
  407. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  408. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  409. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  410. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  411. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/collections.py +0 -0
  412. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  413. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  414. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  415. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  416. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  417. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/governance.py +0 -0
  418. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  419. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/integration.py +0 -0
  420. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  421. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/registry.py +0 -0
  422. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  423. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  424. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/sports.py +0 -0
  425. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream.py +0 -0
  426. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  427. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  428. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
  429. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  430. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  431. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  432. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  433. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  434. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  435. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  436. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  437. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  438. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  439. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  440. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  441. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  442. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  443. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  444. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  445. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  446. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  447. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  448. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  449. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
  450. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  451. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  452. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  453. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
  454. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
  455. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/stream_venue.py +0 -0
  456. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
  457. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/studio_boundary.py +0 -0
  458. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  459. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  460. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  461. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/activity.py +0 -0
  462. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  463. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/commands.py +0 -0
  464. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/download.py +0 -0
  465. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  466. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/parity.py +0 -0
  467. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/probe.py +0 -0
  468. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/propose.py +0 -0
  469. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/recipe.py +0 -0
  470. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/research.py +0 -0
  471. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/runs.py +0 -0
  472. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/session.py +0 -0
  473. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/stream.py +0 -0
  474. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  475. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/transport.py +0 -0
  476. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4.py +0 -0
  477. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
  478. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  479. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_datasets.py +0 -0
  480. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  481. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  482. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
  483. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
  484. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  485. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  486. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  487. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/thin/workers.py +0 -0
  488. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  489. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  490. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/unit_flow.py +0 -0
  491. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/units.py +0 -0
  492. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  493. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/approve.py +0 -0
  494. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  495. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  496. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  497. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  498. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  499. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  500. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  501. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  502. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  503. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  504. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  505. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  506. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  507. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  508. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  509. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  510. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  511. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  512. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  513. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  514. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
  515. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  516. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  517. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  518. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  519. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  520. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  521. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  522. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  523. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  524. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  525. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  526. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  527. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  528. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  529. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  530. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  531. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/headline.py +0 -0
  532. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  533. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
  534. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  535. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  536. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/login.py +0 -0
  537. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  538. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/peek.py +0 -0
  539. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  540. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  541. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  542. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/readers.py +0 -0
  543. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/remediation.py +0 -0
  544. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/ux/workload.py +0 -0
  545. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
  546. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  547. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  548. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  549. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/v4_required_controls.py +0 -0
  550. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  551. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
  552. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/v4_transform.py +0 -0
  553. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  554. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  555. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  556. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  557. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  558. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  559. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  560. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  561. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  562. {mostlyright_data-0.14.0 → mostlyright_data-0.14.2}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.14.0
3
+ Version: 0.14.2
4
4
  Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
5
5
  Project-URL: Homepage, https://mostlyright.md/
6
6
  Project-URL: Documentation, https://mostlyright.md/docs/guides/cli/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyright-data"
3
- version = "0.14.0"
3
+ version = "0.14.2"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -131,10 +131,10 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
131
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. |
132
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. |
133
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. |
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. |
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 one table you name by the name it is called, and frees that name; a live table is refused until you `demote` it, and nothing built is deleted. `table archive TABLE [TABLE ...] --confirm DELETE` retires as many tables as you name at once: `DELETE` is the literal word, typed exactly, and it confirms the identifiers you typed rather than a name, so each table is retired under the name Studio is holding for it. Every table is attempted whatever the one before it answered, one line is printed for each, and the command exits non-zero if any was not retired — so read the outcome of each rather than the exit code alone. `--confirm-name` is refused when you name more than one table. |
135
135
  | `mr-data pin` | Ask Studio to freeze one table pointer on an exact version, for a rollback or a hold. |
136
136
  | `mr-data unpin` | Ask Studio to resume pointer tracking; read the returned state before claiming it resumed. |
137
- | `mr-data demote` | Ask Studio to withdraw the pointer and any schedule it owns. |
137
+ | `mr-data demote` | Ask Studio to withdraw the pointer and any schedule it owns, for one table or for as many as you name: `demote TABLE [TABLE ...]` withdraws them one after another, attempts every one of them whatever the one before it answered, prints a line for each, and exits non-zero if any is still live. Pair it with `table archive` when you are retiring a set: a live table cannot be archived, so it is withdraw-then-archive, two commands rather than a loop. |
138
138
 
139
139
  `auth`, `login`, `whoami` and `clarify` are the same implementation in both profiles, and
140
140
  `clarify` alone reaches nothing at all. The other twenty-four answer from Studio. Eight only
@@ -525,6 +525,24 @@ which Studio fixes. Do it once per dataset, silently, and do not repeat it for a
525
525
  subject changed. A dataset presented without a cover is a defect, the same as a one-line
526
526
  description.
527
527
 
528
+ ### Say what each source is
529
+
530
+ Every entry in `sources` takes an optional `description`, and every one you write gets one. It is
531
+ a single sentence saying what that source **is** — `Daily climatological reports, the official
532
+ highs and lows.` — and the dataset page draws it beside the endpoint, under the publisher it came
533
+ from. That line is the only place a reader ever learns what a URL full of query parameters
534
+ actually returned, so it is written for somebody who has never seen the recipe.
535
+
536
+ Write it about the DATA, never about the run: `Hourly airport surface observations` and not `the
537
+ 2024 half of the window`, `fetched as CSV` or `unioned in step one`. Do not restate the address in
538
+ words, and do not repeat the publisher's product code where it says nothing a reader can use. Up
539
+ to 240 characters, which is one sentence rather than two. Where one window is split across several
540
+ sources on the same endpoint, all of them describe the same thing and get the same sentence — the
541
+ years are already in their names.
542
+
543
+ Leaving it out is a defect in the same way a one-line dataset description is: the source is then
544
+ drawn with its endpoint alone, and a reader is left to guess from a query string.
545
+
528
546
  ### Say what each column shows
529
547
 
530
548
  Decide, per column, what a reader should see, and write it on the column as `presentation`. This is
@@ -1241,6 +1259,17 @@ or a hold, `mr-data unpin TABLE_ID` resumes tracking, and `mr-data demote TABLE_
1241
1259
  schedule and withdraws the live pointer. Read the resulting table state, but do not infer a
1242
1260
  schedule, catch-up, or current bytes from the command name or from route acceptance.
1243
1261
 
1262
+ To retire several tables, do it in two commands rather than a loop: `mr-data demote TABLE_ID
1263
+ TABLE_ID ...` withdraws them, then `mr-data table archive TABLE_ID TABLE_ID ... --confirm DELETE`
1264
+ retires them. `DELETE` is the literal word and nothing else is accepted; it confirms the
1265
+ identifiers you typed, and each table is then retired under the name Studio is holding for it, so
1266
+ you do not have to look any name up. Neither command stops at the first refusal: both attempt every
1267
+ table, print one outcome line for each, and exit non-zero if any did not move. Read the per-table
1268
+ outcomes — `--json` carries them as an array with counts beside it — and report what happened to
1269
+ each table rather than what the exit code said about the set. A table that is live is refused by
1270
+ `archive` until it is withdrawn, and a table a run is still writing to is refused by both until the
1271
+ run has finished; neither refusal deletes anything, and neither ends the command.
1272
+
1244
1273
  ## Autonomous delivery
1245
1274
 
1246
1275
  Own the run until the requested outcome is delivered: a run that succeeded, its declared checks
@@ -17,6 +17,7 @@ its own.
17
17
  from __future__ import annotations
18
18
 
19
19
  import asyncio
20
+ import logging
20
21
  import os
21
22
  import shutil
22
23
  import stat
@@ -281,15 +282,7 @@ def _materialized_claim_connector(
281
282
  root = Path(tempfile.mkdtemp(prefix="stream-subscription-feed-", dir=work_root))
282
283
  try:
283
284
  os.chmod(root, 0o700)
284
- registry_root = root / "registry"
285
- registry_root.mkdir(mode=0o700)
286
- materialize_connector_registry(
287
- transport=objects,
288
- bucket=_claim_text(claim.stream_venue_bucket, "stream venue bucket"),
289
- registry_prefix=_claim_text(claim.connector_registry_prefix, "registry prefix"),
290
- registry_digest=_claim_text(claim.connector_registry_digest, "registry digest"),
291
- root=registry_root,
292
- )
285
+ registry_root = _materialized_registry_root(claim, objects, root)
293
286
  registry = load_stream_connector_registry(registry_root)
294
287
  entry = registry.resolve(
295
288
  _claim_text(claim.connector_id, "connector id"),
@@ -314,6 +307,33 @@ def _materialized_claim_connector(
314
307
  shutil.rmtree(root, ignore_errors=True)
315
308
 
316
309
 
310
+ def _materialized_registry_root(
311
+ claim: ClaimedSubscription, objects: GCSObjectTransport, root: Path
312
+ ) -> Path:
313
+ """Materialize the pinned registry under ``root`` and file its series documents.
314
+
315
+ ONE MATERIALIZATION SHAPE FOR BOTH LOADERS. A published registry is one flat name-to-digest
316
+ table; the connector loader reads the documents directly beneath the root and the series
317
+ loader reads the ``series`` directory under it. A subscription that follows a series is
318
+ pinned to a registry that carries both kinds by construction, so a root left unsorted is not
319
+ a connector registry at all and the feed is refused before it opens.
320
+ """
321
+
322
+ registry_root = root / "registry"
323
+ registry_root.mkdir(mode=0o700)
324
+ series_root = registry_root / SERIES_DIRECTORY_NAME
325
+ series_root.mkdir(mode=0o700)
326
+ materialize_connector_registry(
327
+ transport=objects,
328
+ bucket=_claim_text(claim.stream_venue_bucket, "stream venue bucket"),
329
+ registry_prefix=_claim_text(claim.connector_registry_prefix, "registry prefix"),
330
+ registry_digest=_claim_text(claim.connector_registry_digest, "registry digest"),
331
+ root=registry_root,
332
+ )
333
+ _sort_series_documents(registry_root, series_root)
334
+ return registry_root
335
+
336
+
317
337
  def _claim_text(value: str | None, label: str) -> str:
318
338
  if not isinstance(value, str) or not value:
319
339
  raise StreamSubscriptionError("STREAM_SUBSCRIPTION_CONNECTOR_INVALID", label)
@@ -385,18 +405,7 @@ def _materialized_claim_series(
385
405
  root = Path(tempfile.mkdtemp(prefix="stream-subscription-series-", dir=work_root))
386
406
  try:
387
407
  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)
408
+ registry_root = _materialized_registry_root(claim, objects, root)
400
409
  documents = load_stream_series_documents(registry_root)
401
410
  held = documents.get(series.series_id)
402
411
  if held is None:
@@ -625,6 +634,7 @@ async def run_subscription_worker(
625
634
  def stream_subscription_worker_main(argv: Sequence[str] | None = None) -> int:
626
635
  """Cloud Run Worker Pool executable; it intentionally accepts no mutable CLI authority."""
627
636
 
637
+ _configure_worker_logging()
628
638
  arguments = tuple(sys.argv[1:] if argv is None else argv)
629
639
  if arguments:
630
640
  raise HostedStreamSubscriptionWorkerError(
@@ -636,6 +646,25 @@ def stream_subscription_worker_main(argv: Sequence[str] | None = None) -> int:
636
646
  return 0
637
647
 
638
648
 
649
+ def _configure_worker_logging() -> None:
650
+ """Configure the root logger for the pool executable, on a stream its host collects.
651
+
652
+ A library module configures nothing; an executable must. Unconfigured, this process fell
653
+ through to the last-resort handler, which emits a bare message with no level and no logger
654
+ name, so the pool's own refusals arrived unattributable.
655
+
656
+ Plain text on either stream is collected at DEFAULT severity, so the level is carried in the
657
+ line rather than in the record -- which is why the format names it. Stdout is chosen over the
658
+ sibling executables' stderr for the same reason it is chosen anywhere: a stream that carries
659
+ ordinary progress as well as refusals is not the error stream. An already-configured root is
660
+ left alone, which is what lets a smoke or a test harness own it instead.
661
+ """
662
+
663
+ logging.basicConfig(
664
+ level=logging.INFO, stream=sys.stdout, format="%(levelname)s %(name)s %(message)s"
665
+ )
666
+
667
+
639
668
  def _studio_origin(value: str | None) -> str:
640
669
  if not isinstance(value, str) or not 1 <= len(value) <= 2048 or value.endswith("/"):
641
670
  raise HostedStreamSubscriptionWorkerError(
@@ -27,6 +27,7 @@ from mostlyright.data_harness.canonical import (
27
27
  parse_json,
28
28
  sha256_bytes,
29
29
  )
30
+ from mostlyright.data_harness.hosted_stream_recorder_job import _sort_series_documents
30
31
  from mostlyright.data_harness.ingestion.gcs_store import (
31
32
  GCSObjectTransport,
32
33
  GCSPreconditionFailed,
@@ -40,6 +41,7 @@ from mostlyright.data_harness.sources.stream_registry import (
40
41
  load_stream_connector_registry,
41
42
  )
42
43
  from mostlyright.data_harness.sources.stream_segment_recorder import StreamSegmentRecorder
44
+ from mostlyright.data_harness.sources.stream_series import SERIES_DIRECTORY_NAME
43
45
  from mostlyright.data_harness.stream_subscription_worker import (
44
46
  MAX_DISCOVERY_EVIDENCE_BYTES,
45
47
  CheckpointReservation,
@@ -435,6 +437,18 @@ def _materialize_registry(
435
437
  registry_digest=_required_claim_value(claim.connector_registry_digest, "registry digest"),
436
438
  root=registry_root,
437
439
  )
440
+ # THE REGISTRY A SERIES SUBSCRIPTION PINS HOLDS TWO GRAMMARS. A published registry is one
441
+ # flat name-to-digest table, and a subscription that follows a series pins a registry that
442
+ # carries the series document beside the connector it rotates. The connector loader reads
443
+ # every document directly beneath the root and refuses one written in the series grammar,
444
+ # so the series documents are filed under the series directory first -- exactly as the
445
+ # claim path (`hosted_stream_subscription_worker._materialized_claim_connector`) and the
446
+ # bounded recorder job already do. Without this, sealing died on the first checkpoint of
447
+ # every series-following subscription with STREAM_CONNECTOR_DOCUMENT, the lease was lost
448
+ # before any segment landed, and the subscription terminalized after five lost leases.
449
+ series_root = root / SERIES_DIRECTORY_NAME
450
+ series_root.mkdir(mode=0o700, exist_ok=True)
451
+ _sort_series_documents(root, series_root)
438
452
  return load_stream_connector_registry(root)
439
453
 
440
454
 
@@ -132,6 +132,22 @@ class _SubscriptionCancelled(RuntimeError):
132
132
  self.desired_state = desired_state
133
133
 
134
134
 
135
+ #: The largest ``volume_policy.max_bytes`` any worker in this pool can serve.
136
+ #:
137
+ #: A hot subscription gets two bounded buffers: one immutable segment may be sealing while its
138
+ #: successor is being read. Each is capped at half the per-claim budget so the queue does not
139
+ #: turn a 16 MiB promise into 32 MiB during a slow upload/CAS.
140
+ #:
141
+ #: It is exported because it is a PROTOCOL CONSTANT, not a private detail: the control plane
142
+ #: writes the policy a subscription starts with, so it needs the number to validate against at
143
+ #: start rather than discovering it one lease at a time.
144
+ MAX_VOLUME_POLICY_BYTES = MAX_BUFFERED_BYTES // 2
145
+
146
+ #: The largest ``volume_policy.max_duration_seconds`` any worker in this pool can serve, equal to
147
+ #: the longest a subscription may sit without data before its lease ends on its own.
148
+ MAX_VOLUME_POLICY_DURATION_SECONDS = DEFAULT_NO_DATA_TIMEOUT_SECONDS
149
+
150
+
135
151
  @dataclass(frozen=True)
136
152
  class VolumePolicy:
137
153
  """One subscription's bounded rotation policy, set by Studio rather than a worker flag."""
@@ -140,17 +156,21 @@ class VolumePolicy:
140
156
  max_duration_seconds: int
141
157
 
142
158
  def __post_init__(self) -> None:
143
- if (
144
- isinstance(self.max_bytes, bool)
145
- or isinstance(self.max_duration_seconds, bool)
146
- # A hot subscription gets two bounded buffers: one immutable segment may be sealing
147
- # while its successor is being read. Cap each at half the per-claim budget so the
148
- # queue does not turn a 16 MiB promise into 32 MiB during a slow upload/CAS.
149
- or not 1 <= self.max_bytes <= MAX_BUFFERED_BYTES // 2
150
- or not 1 <= self.max_duration_seconds <= DEFAULT_NO_DATA_TIMEOUT_SECONDS
159
+ # The refusal names the bound and the offered value, because the party that has to change
160
+ # the policy is the one that wrote it and it cannot act on "outside worker bounds".
161
+ if isinstance(self.max_bytes, bool) or not 1 <= self.max_bytes <= MAX_VOLUME_POLICY_BYTES:
162
+ raise StreamSubscriptionError(
163
+ "STREAM_SUBSCRIPTION_POLICY_INVALID",
164
+ f"volume policy max_bytes {self.max_bytes} is outside the worker bound "
165
+ f"1..{MAX_VOLUME_POLICY_BYTES}",
166
+ )
167
+ if isinstance(self.max_duration_seconds, bool) or not (
168
+ 1 <= self.max_duration_seconds <= MAX_VOLUME_POLICY_DURATION_SECONDS
151
169
  ):
152
170
  raise StreamSubscriptionError(
153
- "STREAM_SUBSCRIPTION_POLICY_INVALID", "volume policy is outside worker bounds"
171
+ "STREAM_SUBSCRIPTION_POLICY_INVALID",
172
+ f"volume policy max_duration_seconds {self.max_duration_seconds} is outside the "
173
+ f"worker bound 1..{MAX_VOLUME_POLICY_DURATION_SECONDS}",
154
174
  )
155
175
 
156
176
 
@@ -862,9 +882,12 @@ class RecoveryArtifact:
862
882
  )
863
883
 
864
884
  def to_dict(self) -> dict[str, object]:
885
+ # An object generation is a decimal STRING on the wire, the spelling the control plane's
886
+ # recovery-artifact schema contracts for. It stays an int in the dataclass because that
887
+ # is what compares and orders; only the serialized form is text.
865
888
  return {
866
889
  "object_name": self.object_name,
867
- "generation": self.generation,
890
+ "generation": str(self.generation),
868
891
  "sha256": self.sha256,
869
892
  "byte_length": self.byte_length,
870
893
  "media_type": self.media_type,
@@ -2083,6 +2106,8 @@ __all__ = [
2083
2106
  "MAX_DISCOVERY_EVIDENCE_BYTES",
2084
2107
  "MAX_ROSTER_MEMBERS",
2085
2108
  "MAX_SEGMENT_GAPS",
2109
+ "MAX_VOLUME_POLICY_BYTES",
2110
+ "MAX_VOLUME_POLICY_DURATION_SECONDS",
2086
2111
  "ROSTER_TICK_SECONDS",
2087
2112
  "ROTATION_SCHEMA_VERSION",
2088
2113
  "SEGMENT_ROTATION_SCHEMA_VERSION",
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import logging
6
+ import re
5
7
  from collections.abc import Callable, Mapping, Sequence
6
8
  from dataclasses import dataclass, replace
7
9
  from typing import Any
@@ -37,7 +39,15 @@ from mostlyright.data_harness.stream_subscription_worker import (
37
39
  )
38
40
  from mostlyright.data_harness.stream_venue_staging import MAX_EVIDENCE_BYTES
39
41
 
42
+ LOGGER = logging.getLogger(__name__)
43
+
40
44
  CLAIM_PATH = "/_internal/stream-subscriptions:claim"
45
+
46
+ #: The largest object generation either spelling may carry, from the control plane's own
47
+ #: nineteen-digit delivery grammar. A generation is a storage coordinate, not arithmetic, so a
48
+ #: number outside the grammar is a claim about an object no bucket issued.
49
+ MAX_OBJECT_GENERATION = 10**19 - 1
50
+ _OBJECT_GENERATION_TEXT = re.compile(r"[1-9][0-9]{0,18}")
41
51
  CREDENTIAL_RESOLUTION_SCHEMA_VERSION = "mostlyright-stream-subscription-credential-resolution.v1"
42
52
  _STAGING_ROLES = ("source_data", "acquisition_receipt", "source_observation")
43
53
  _STAGING_MEDIA_TYPES = {
@@ -72,6 +82,18 @@ class StudioSubscriptionControl:
72
82
  # The number was already parsed and checked here before it was carried; the only
73
83
  # change is that it now reaches the caller instead of being validated and dropped.
74
84
  return IdlePoll(poll_after_seconds=_integer(value, "poll_after_seconds", 1))
85
+ try:
86
+ return self._claimed(value)
87
+ except StreamSubscriptionError as error:
88
+ # A LEASE THIS WORKER CANNOT SERVE IS STILL A LEASE. Studio persists the lease before
89
+ # it answers, so a refusal that only raised would leave that lease to expire and be
90
+ # handed back on the next claim, forever, with nothing on the record saying why.
91
+ self._dispose_of_refused_claim(value, error)
92
+ raise
93
+
94
+ def _claimed(self, value: Mapping[str, Any]) -> ClaimedSubscription:
95
+ """The full claim, or a refusal naming the first member this worker cannot serve."""
96
+
75
97
  policy = _mapping(value, "volume_policy")
76
98
  claim_series = _series_claim(value.get("series"))
77
99
  claim = ClaimedSubscription(
@@ -120,6 +142,62 @@ class StudioSubscriptionControl:
120
142
  claim = replace(claim, resume_checkpoint=_resume_checkpoint(resume, claim))
121
143
  return claim
122
144
 
145
+ def _dispose_of_refused_claim(
146
+ self, value: Mapping[str, Any], error: StreamSubscriptionError
147
+ ) -> None:
148
+ """Dispose of a persisted lease this worker refused, on a best effort, and never raise.
149
+
150
+ TWO DISPOSITIONS, BECAUSE TWO DIFFERENT THINGS BOUND THEM.
151
+
152
+ A claim carrying no pending checkpoint is COMPLETED as failed. That charges the control
153
+ plane's failure budget, which spaces the retries and terminalizes the subscription once
154
+ the budget runs out, and it is the bound on a subscription this fleet cannot serve.
155
+
156
+ A claim carrying a ``resume_checkpoint`` is LEFT ALONE, and its lease runs out instead.
157
+ The control plane exempts a lease with a pending checkpoint from that budget -- a resume
158
+ is meant to survive a worker dying mid-segment -- and re-leases it as soon as it is free.
159
+ Completing one would therefore trade a lease expiry for an immediate reclaim, which is a
160
+ tighter loop than the one this method exists to end. Expiry is the slower of the two, so
161
+ expiry is what bounds this case.
162
+
163
+ The discriminator is the pending checkpoint rather than which member refused, because the
164
+ exemption is the control plane's and it is keyed on the same fact.
165
+ """
166
+
167
+ resuming = "resume_checkpoint" in value
168
+ LOGGER.warning(
169
+ "stream_subscription_claim_refused subscription_id=%s failure_code=%s disposition=%s",
170
+ _safe_subscription_id(value),
171
+ error.code,
172
+ "lease_expiry" if resuming else "completed_failed",
173
+ )
174
+ if resuming:
175
+ return
176
+ try:
177
+ url = _callback_url(value.get("complete_url"), origin=self.origin, label="complete")
178
+ body: dict[str, Any] = {
179
+ "schema_version": COMPLETE_SCHEMA_VERSION,
180
+ "lease_generation": _integer(value, "lease_generation", 1),
181
+ "terminal_reason": "failed",
182
+ }
183
+ self._post(url, body)
184
+ except SubscriptionFenceStale:
185
+ # The lease is already terminal, which is the outcome this was reaching for. A replay
186
+ # of a lost 5xx whose first attempt landed arrives here, so it is reported as done
187
+ # rather than as a completion that failed.
188
+ return
189
+ except Exception as unreported:
190
+ # Broad on purpose: whatever went wrong here, the refusal the caller is waiting on is
191
+ # the one that must reach it, so a second failure is logged and dropped rather than
192
+ # raised over the first.
193
+ LOGGER.warning(
194
+ "stream_subscription_claim_refusal_unreported subscription_id=%s failure_code=%s",
195
+ _safe_subscription_id(value),
196
+ unreported.code
197
+ if isinstance(unreported, StreamSubscriptionError)
198
+ else type(unreported).__name__,
199
+ )
200
+
123
201
  def resolve_credential(
124
202
  self, claim: ClaimedSubscription, *, credential_shape: str
125
203
  ) -> StreamCredential:
@@ -213,7 +291,8 @@ class StudioSubscriptionControl:
213
291
  "next_cursor": next_cursor,
214
292
  "segment_stream_id": capture.segment_stream_id,
215
293
  "manifest_object_name": capture.manifest_object_name,
216
- "manifest_generation": capture.manifest_generation,
294
+ # Every object generation on the wire is text; the number stays an int in the capture.
295
+ "manifest_generation": str(capture.manifest_generation),
217
296
  "manifest_sha256": capture.manifest_sha256,
218
297
  "byte_length": capture.byte_length,
219
298
  "capture_digest": capture.capture_digest,
@@ -412,6 +491,42 @@ class StudioSubscriptionControl:
412
491
  raise AssertionError("unreachable")
413
492
 
414
493
 
494
+ def _object_generation(value: Mapping[str, Any], name: str) -> int:
495
+ """One object generation, read from either spelling of the same bounded number.
496
+
497
+ EVERY OBJECT GENERATION ON THE WIRE IS TEXT, and an integer is admitted because a control
498
+ plane that echoes a stored coordinate back is not the place to relitigate a spelling.
499
+
500
+ The grammar is matched BEFORE the text is converted, and it is the control plane's own
501
+ nineteen-digit one. An unbounded digit string is a refusal here: converting one crosses the
502
+ interpreter's own conversion limit and raises an untyped error out of a parser whose whole
503
+ contract is that it refuses in one vocabulary.
504
+ """
505
+
506
+ item = value.get(name)
507
+ if isinstance(item, str):
508
+ if not _OBJECT_GENERATION_TEXT.fullmatch(item):
509
+ raise StreamSubscriptionError("STREAM_SUBSCRIPTION_CLAIM_INVALID", name)
510
+ return int(item)
511
+ generation = _integer(value, name, 1)
512
+ if generation > MAX_OBJECT_GENERATION:
513
+ raise StreamSubscriptionError("STREAM_SUBSCRIPTION_CLAIM_INVALID", name)
514
+ return generation
515
+
516
+
517
+ def _safe_subscription_id(value: Mapping[str, Any]) -> str:
518
+ """The claimed subscription id when it is a canonical UUID, and ``unknown`` otherwise.
519
+
520
+ A refusal log line must never repeat an unvalidated control-plane string, because the string
521
+ that failed to parse is exactly the one nothing has checked the shape of.
522
+ """
523
+
524
+ try:
525
+ return _uuid_text(value.get("stream_subscription_id"), "stream_subscription_id")
526
+ except StreamSubscriptionError:
527
+ return "unknown"
528
+
529
+
415
530
  def _code(raw: bytes) -> str | None:
416
531
  try:
417
532
  value = parse_json(raw)
@@ -541,7 +656,7 @@ def _resume_checkpoint(value: object, claim: ClaimedSubscription) -> ResumeCheck
541
656
  )
542
657
  capture = SealedCapture(
543
658
  manifest_object_name=_text(checkpoint, "manifest_object_name"),
544
- manifest_generation=_integer(checkpoint, "manifest_generation", 1),
659
+ manifest_generation=_object_generation(checkpoint, "manifest_generation"),
545
660
  manifest_sha256=_digest(checkpoint.get("manifest_sha256"), "manifest sha256"),
546
661
  byte_length=_integer(checkpoint, "byte_length", 0),
547
662
  capture_digest=capture_digest,
@@ -622,7 +737,7 @@ def _recovery_inventory(
622
737
  )
623
738
  artifacts[role] = RecoveryArtifact(
624
739
  object_name=expected,
625
- generation=_integer(artifact, "generation", 1),
740
+ generation=_object_generation(artifact, "generation"),
626
741
  sha256=_digest(artifact.get("sha256"), f"{role} sha256"),
627
742
  byte_length=_integer(artifact, "byte_length", 0),
628
743
  media_type=_text(artifact, "media_type"),
@@ -135,10 +135,10 @@ HOSTED_SUMMARY = dict(
135
135
  "ask Studio to publish one table and report only returned continuation evidence",
136
136
  ),
137
137
  ("reschedule", "change how often one table refreshes, without starting a run"),
138
- ("table", "report what one table is serving, rename it, or retire it"),
138
+ ("table", "report what one table is serving, rename it, or retire one or many"),
139
139
  ("pin", "ask Studio to pin the live pointer and report the returned state"),
140
140
  ("unpin", "ask Studio to remove a pin and report the returned pointer state"),
141
- ("demote", "ask Studio to withdraw the live pointer and report schedule state"),
141
+ ("demote", "ask Studio to withdraw the live pointer from one table or many"),
142
142
  ("watch", "stream one run's live progress, resuming across stream cuts"),
143
143
  ("download", "bring one run's artifacts back here, each one's digest checked"),
144
144
  ("receipt", "print the record one run sealed about how it was built"),
@@ -439,15 +439,22 @@ def _exit_codes() -> dict[str, Callable[[dict[str, Any]], int]]:
439
439
  ``ux.commands.CommandSpec`` gives: an exit code that can disagree with the printed answer is
440
440
  an exit code somebody will trust over the answer.
441
441
 
442
- Six entries, and all six are answers a script acts on rather than reports it reads: a run held
443
- at the spend gate has not started, a run that failed is not a build whichever surface it was
444
- learned from, a table whose declared checks did not all pass is not one to go on with, a
442
+ Eight entries, and all eight are answers a script acts on rather than reports it reads: a run
443
+ held at the spend gate has not started, a run that failed is not a build whichever surface it
444
+ was learned from, a table whose declared checks did not all pass is not one to go on with, a
445
445
  question this command stopped waiting on has not been answered, and a probe that settled
446
446
  without an answer is not a yes. Everything else in the lane reports.
447
+
448
+ ⚠ THE LAST TWO ARE MOUNTED FOR THE NAME AND NOT FOR THE ACT, which is why one function serves
449
+ both. ``mr-data table archive`` and ``mr-data demote`` each take a LIST and never stop at the
450
+ first refusal, so "did it work" is a question about the whole list and only the counts can
451
+ answer it. ``mr-data table TABLE`` and ``mr-data table rename`` reach the same entry, carry no
452
+ counts, and exit ``0``: a report is not a gate, and the derivation says so rather than the
453
+ router keeping a second table of which halves of a name are which.
447
454
  """
448
455
 
449
456
  from mostlyright.data_harness.thin import probe as probe_module
450
- from mostlyright.data_harness.thin import v4_artifacts, v4_query, v4_runs, v4_stream
457
+ from mostlyright.data_harness.thin import v4_artifacts, v4_query, v4_runs, v4_stream, v4_tables
451
458
 
452
459
  return {
453
460
  "run": v4_runs.run_exit_code,
@@ -456,6 +463,8 @@ def _exit_codes() -> dict[str, Callable[[dict[str, Any]], int]]:
456
463
  "checks": v4_artifacts.checks_exit_code,
457
464
  "query": v4_query.query_exit_code,
458
465
  "probe": probe_module.probe_exit_code,
466
+ "table": v4_tables.lifecycle_exit_code,
467
+ "demote": v4_tables.lifecycle_exit_code,
459
468
  }
460
469
 
461
470